Designing with APIs: A practical guide for beginners

Murphy Trueman
8 min readJan 8, 2025

--

How designers can embrace collaboration, flexibility, and real data when working with APIs

APIs are the digital lifelines of today’s software, seamlessly connecting services, data, and functionality. For designers, understanding APIs is not just a technical nicety — it’s an opportunity to craft experiences that feel smooth, responsive, and intuitive.

In a previous article — Simplifying APIs: A Designer’s Guide — I explained what APIs are and why they matter to designers. But knowing what APIs are is only half the equation; to truly unlock their potential, you need to understand how to design with APIs in mind — how to anticipate constraints, work with real and/or evolving data, and create experiences that adapt to change.

This article will discuss how collaboration, flexibility, and foresight can transform the design workflow, offering actionable insights and examples to bridge the gap between technical requirements and user-centric design.

Collaborate early and often

APIs often determine the limits of what’s possible in design; the earlier you collaborate with engineers, the sooner you’ll uncover key details about the API’s capabilities, quirks, and constraints — insights that can fundamentally shape your approach.

💭 Imagine you’re designing a healthcare dashboard for doctors, where the API provides patient vital signs updated every five minutes.

Knowing this constraint early on could lead to a design that includes visual indicators that show when the data was last refreshed, and am anual ‘refresh’ button for urgent cases. This setup ensures clarity, while also giving doctors control in critical situations.

Early discussions are crucial to understanding essential user needs, like managing expectations or enabling manual updates. Without them, these needs can be easily overlooked. To ensure these conversations are both actionable and productive, focus on uncovering key details by asking open-ended questions like:

  • What specific data endpoints are available, and how are they structured?
    Understanding the data structure can help align the design with how information will be retrieved and displayed in the interface.
  • What data can we pull in real-time, and what requires additional processing?
    Differentiating between real-time and processed data can help ensure the UI handles delays gracefully, and provides accurate user feedback.
  • Are there latency issues or rate limits we need to consider?
    Knowing potential performance constraints can help inform loading indicators, refresh rates, or fallback designs.
  • What edge cases, such as null values or unusual inputs, should we plan for?
    Accounting for edge cases can ensure the interface won’t break under unexpected conditions, improving reliability.
  • How might the API evolve in the future, and what changes can we anticipate?
    Designing with future updates in mind can prevent extensive rework as the API expands or changes.

In addition to these discussions, tools like Swagger or Postman, can help you visually explore API endpoints. Participating in API Showcases with engineers can also give you deeper insight into the data’s structure and behaviour.

These approaches can help bridge the gap between design and technical realities, ensuring your work is both visually compelling and practical.

Adapt when the API is still in development

In many projects, the designs and the API are developed simultaneously. This can sometimes create uncertainty, but it doesn’t have to slow you down. Designing with adaptability in mind can keep your work moving forward.

Use assumptions and placeholders

Align with engineers on key assumptions, like expected data formats or structure, and use placeholder data to simulate the API’s behaviour.

💭 Imagine you’re designing a travel booking platform that aggregates flight options from multiple providers. The API may provide flight details asynchronously, with some data arriving immediately while other information, like pricing or seat availability, is delayed.

Early collaboration with engineers could highlight this variability, allowing you to design placeholders for delayed data, such as skeleton states, or more specific messaging (like ‘Pricing information loading’ or ‘Seat availability pending).

This helps ensure that the interface remains functional and informative while users wait for the full details to populate.

Design for variability

Data often behaves unpredictably — some fields might be missing, formats may vary, or volumes could fluctuate.

💭 Consider a profile card that displays optional fields like “Location” or “Bio.” — if the API doesn’t supply these fields, the design should dynamically adjust, removing the empty fields without disrupting the layout.

Using modular components ensures that the design remains visually consistent and functional, while scalable patterns allow you to accommodate additional fields or changes to the API without significant redesign.

Maintain a feedback loop

Frequent check-ins with developers are essential, particularly when it comes to parallel development.

Regular updates help flag mismatches early and allow you to refine your designs as the API takes shape. Setting up automated tools to notify you of changes to API endpoints can also help keep designs aligned as development progresses, streamlining communication in cross-functional teams, reducing the risk of misaligned expectations and outdated designs. Tools like Postman and SwaggerHub are particlarly great for this.

Work with real data to uncover gaps

Once the API is stable or mock data is available, integrating it into your designs can reveal patterns and edge cases that might not be obvious from the outset.

💭 Consider a ride-hailing app. API data might show that driver locations are sometimes delayed or incomplete. By working with this data, you could design fallback states, such as showing a loading spinner or a placeholder message, to handle these situations gracefully.

Engaging with real data also helps you stress-test your designs for edge cases, such as:

  • Extremely long text fields or unexpected formatting
  • Empty states when data is unavailable
  • Unusual behaviour like null values

Tools like Figma Plugins, or mock API generators (such as Mockoon or Beeceptor), can help simulate these scenarios during the design process, ensuring your work is robust enough for real-world conditions. Postman also offers a mock server feature with a free tier, which can sometimes help explore and simulate API interactions directly.

These tools streamline the process of incorporating real or placeholder data into your designs, reducing dependencies on finalised APIs and speeding up development cycles.

Plan for change and scalability

APIs are rarely static. Features get added, endpoints evolve, and data structures shift. Designing with flexibility ensures your interface can grow alongside these changes.

💭 Imagine a weather app that initially supports hourly forecasts — if the API evolves to include 10-day forecasts, your design could accommodate this by using expandable or collapsible components that seamlessly add new sections for extended data.

💭 Similarly, a dynamic flight search results page could handle asynchronously provided API details like baggage policies or seat selection options. By initially showing core information — like price and duration — and enabling users to reveal more granular data only when needed, your interface remains adaptable and user-friendly.

This approach ensures that as the API evolves, the design evolves with it, without requiring a full overhaul.

To future-proof your work, consider the following framework for scalable UI patterns:

  1. Adopt an atomic design approach
    Break your UI into reusable building blocks that can be combined to create scalable designs. For example, a button and an image can combine to create a card. That same card can then be reused in a product listing, a user profile, or a feature highlight section.
  2. Use responsive layouts that adapt to varying data sizes
    Ensure that your design gracefully handles scenarios like a single item, an empty state, or hundreds of results by using dynamic grids, pagination, or infinite scrolling where appropriate.
  3. Ensure visual consistency across components, regardless of complexity
    Consistent typography, spacing, and colour can help maintain a cohesive look and feel, even when dealing with complex data visualisations or nested structures.
  4. Plan for fallback states and progressive enhancement
    Build designs that work well with minimal data, but can expand functionality or visual richness as more API features become available.

Create user-friendly and trustworthy error states

APIs aren’t perfect. Networks fail, data gets delayed, and servers go down. Designing for these moments is crucial to maintaining user trust and delivering a polished experience.

💭 Imagine an e-commerce app, where a failed API call might result in a message like: “Oops! We couldn’t load the product details. Please try again later.” You might want to consider pairing the message with a retry button, or cached fallback content to help keep users engaged, rathre than frustrated.

It’s important to differentiate between critical and non-critical errors to tailor the response appropriately. For example:

  • A payment failure might warrant a modal that outlines the issue that occurred, and provides actionable next steps.
  • A missing optional field may benefit from inline messaging that informs the user without interrupting their workflow

Thoughtful error states turn potentially negative moments into opportunities to reinforce confidence in your product.

Performance as a priority

A slow API can degrade the user experience, no matter how flawless the design. But thoughtful UI choices can help mitigate this, and make your product feel faster and more responsive.

💭 Consider how social media apps often use skeleton screens — grey placeholders that mimic the structure of real content — to give the impression of speed while content loads. This visual feedback reassures users, and reduces perceived waiting times.

💭Similarly, caching frequently accessed data can help improve performance by minimising API calls, particularly for content that doesn’t change often, such as user profiles or product listings.

When designing for performance, it’s important to balance frequent API calls with the user experience; strategies like polling intervals, preloading data, and providing offline modes can create a smoother and more enjoyable interaction.

Designing with APIs is about more than just aligning with technical specs — it’s about harnessing their potential to create experiences that are seamless, adaptable, and responsive. By collaborating closely with engineers, working with real data, and anticipating the unexpected, you’ll not only elevate your designs, but also ensure they stand the test of time.

Every API-driven project is an opportunity to deepen your understanding of how design and functionality intersect. By embracing this mindset, you’ll find new ways to innovate and push the boundaries of what’s possible.

This article originally appeared on Substack, where I share more of my thoughts and insights — no paywalls, no hassle. If you enjoyed this piece, feel free to subscribe there for exclusive content.

If you’re liking my writing here on Medium, consider following me to stay updated with new posts. You can also find me on X for quick takes or on LinkedIn for deeper conversations about design and digital products.

--

--

Murphy Trueman
Murphy Trueman

Written by Murphy Trueman

Design lead, specialising in design systems. 13+ years of driving digital transformation through data-driven, human-centred design & systems thinking.

No responses yet