Overview

10 Designing user-friendly and interoperable operations flows

Operations flows are the sequences of API calls consumers perform to achieve a use case, and making them user-friendly and interoperable requires more than good individual operations. The chapter emphasizes treating flows as cohesive wholes that are concise, flexible, helpful, and consistent. Designers should minimize steps, avoid forcing a rigid call order, and prevent avoidable errors or heavy output-to-input data processing. Consistency and standardization across similar flows (and with widely used patterns such as HTTP uniform interface, predictable paths, and common security flows) make APIs guessable, reusable, and easier to integrate. Crucially, flow optimization comes after improving data and individual operations, ensuring the building blocks are already user-friendly and interoperable.

To optimize flows, the chapter recommends removing redundant calls, adding use-case-focused features or operations when they fit the subject matter, aggregating operations prudently, and including ready-to-use output data that reduces client-side computation and error risk. The money transfer example shows how moving from generic lists and trial-and-error validation to targeted operations and enriched responses (e.g., valid source–destination pairings and acceptable amount ranges) shortens the flow and reduces failure. It also stresses flexibility: enabling multiple valid entry points and avoiding UI constraints by, for instance, offering operations that let clients gather source, destination, and amount in any order—while guarding against over-aggregation or leaking provider-centric details into consumer-facing designs.

For data-saving flows, the chapter promotes partial, order-independent saving with minimal vital data captured early, allowing applications to build the UI that suits their context and to resume work reliably. It suggests consolidating updates around a central resource when it aligns with the domain, separating validation from completion, and embedding status and guidance (e.g., “complete” vs. “incomplete” plus messages) with each save so clients always know what’s missing without treating incompleteness as an error. Finally, it recommends supporting both one-shot and multi-step flows (via flags or distinct resources) and cleanly switching from partial to final resources using standard HTTP mechanisms. Together, these practices produce concise, error-limiting, and flexible flows that minimize friction for developers and deliver smoother end-user experiences.

We enhance the "Renting a car" operations flow by reducing the number of steps, avoiding constraining the order of operations, creating use case-focused operations, and preventing error and data processing.
CH10 F01 lauret3
We optimize operations flows after reworking data and operations to make them user-friendly and interoperable.
CH10 F02 lauret3
The money transfer use case or operations flow has some issues we can fix.
CH10 F03 lauret3
We can remove calls returning data already retrieved.
CH10 F04 lauret3
We add a transfer-related filter on List accounts to get only transfer-eligible accounts.
CH10 F05 lauret3
We add the "List destinations for source" use-case-specific operation to avoid processing data of the generic "List accounts" and "List beneficiaries" operations.
CH10 F06 lauret3
We add ready-to-use amount ranges when listing destinations to avoid consumers calculating them and limit the risk of an "Amount not in acceptable range" error when calling "Transfer money."
CH10 F07 lauret3
Optimized money transfer flow lacks flexibility, which can be fixed by adding new or aggregated operations.
CH10 F08 lauret3
The operations flow to open a current account comprises several data-saving steps constraining consumer flow. We can fix that.
CH10 F09 lauret3
By enabling partial creation and completing data with update operations for subscription, services, agency, card, and holder information, we allow consumers to build a UI flow matching their needs.
CH10 F10 lauret3
We merge all add/update operations of sub-elements (services, banking cards, holders) into the Update subscription operation.
CH10 F11 lauret3

FAQ

What is an operations flow, and why must it be user-friendly and interoperable?An operations flow is the sequence of API calls a consumer performs to achieve a use case. To deliver efficient development and great end-user experiences, flows should: leverage user-friendly data and operations, be designed as a whole (not just good individual steps), be concise, be flexible (allow different entry points and orders), meet needs within the flow’s context, minimize consumer processing and errors, and remain consistent and standardized across similar use cases.
When in the design process should I optimize operations flows?Optimize flows after you’ve reworked data and operations for user-friendliness and interoperability. This “second pass” avoids premature optimization during capability identification and relies on already-optimized inputs, outputs, and errors to refine end-to-end use cases.
How can I make a flow concise and flexible without constraining consumers?Reduce steps to the minimum, avoid enforcing a strict call order, and allow optional steps and multiple entry points. For example, simplify “Rent a car” to: search shops (optional), search cars (optionally across shops), and rent; consumers can skip searches if they already know the shop and car.
What signals indicate a flow needs optimization?Look for: repeated calls returning the same data; consumer-side processing of outputs to craft subsequent inputs; avoidable errors the API could prevent with better data or filters; rigid, order-dependent saving steps; and flows that force a specific UI sequence.
What techniques can I use to optimize a flow?Use a mix of: adding use-case-specific features (e.g., filters aligned to the use case), creating use-case-specific operations, aggregating operations where the aggregation aligns with the subject matter, and returning use-case-specific data that prevents client-side calculations and errors. Always preserve clarity, scope, consistency, and standardization.
How do I decide between adding a filter to a generic operation vs. creating a specific operation?If the feature fits the resource scope (e.g., filtering by account status), extending the generic operation can work—while hiding provider-centric internals. If it goes beyond scope (e.g., “transfer-eligible” accounts), create a use-case-specific operation such as GET /transfer-sources to avoid leaking use-case logic into generic endpoints.
How can I reduce errors and consumer processing in a money transfer flow?Provide operations and data that encode eligibility and constraints. Examples: GET /transfer-sources (eligible sources), GET /transfer-sources/{accountId}/destinations (valid destinations for a source), and include ready-to-use amount ranges in responses to avoid client-side calculations and “amount out of range” errors.
How do I avoid constraining UI flows while still guiding users to valid inputs?Offer operations that allow choosing inputs in any order and still ensure validity. For instance, an aggregated “List sources and destinations” can expose valid combinations so UIs can collect source, destination, and amount in any sequence without risking invalid pairs or requiring client loops.
How should I design flexible data-saving flows that support partial and one-shot saving?Collect minimal vital data up front (e.g., email), then allow adding/updating the rest in any order with POST/PUT/PATCH on the same resource (e.g., subscription). Support both: a one-shot option (e.g., POST /subscriptions?completion=true) that validates all data, and a multi-step option (e.g., completion=false or dedicated /partial-subscriptions) that accepts valid partial data and builds up over time.
How can I separate validation from completion and inform consumers about missing data?Return 2XX for partial saves and include metadata on the resource—e.g., a status (COMPLETE/INCOMPLETE) and messages detailing what’s missing—so consumers know what to fix without extra calls. For completion, provide a final validate/complete operation that either returns 201 Created with Location of the created resource or a 303 See Other redirect to it.

pro $24.99 per month

  • access to all Manning books, MEAPs, liveVideos, liveProjects, and audiobooks!
  • choose one free eBook per month to keep
  • exclusive 50% discount on all purchases
  • renews monthly, pause or cancel renewal anytime

lite $19.99 per month

  • access to all Manning books, including MEAPs!

team

5, 10 or 20 seats+ for your team - learn more


choose your plan

team

monthly
annual
$49.99
$499.99
only $41.67 per month
  • five seats for your team
  • access to all Manning books, MEAPs, liveVideos, liveProjects, and audiobooks!
  • choose another free product every time you renew
  • choose twelve free products per year
  • exclusive 50% discount on all purchases
  • renews monthly, pause or cancel renewal anytime
  • renews annually, pause or cancel renewal anytime
  • The Design of Web APIs, Second Edition ebook for free
choose your plan

team

monthly
annual
$49.99
$499.99
only $41.67 per month
  • five seats for your team
  • access to all Manning books, MEAPs, liveVideos, liveProjects, and audiobooks!
  • choose another free product every time you renew
  • choose twelve free products per year
  • exclusive 50% discount on all purchases
  • renews monthly, pause or cancel renewal anytime
  • renews annually, pause or cancel renewal anytime
  • The Design of Web APIs, Second Edition ebook for free
choose your plan

team

monthly
annual
$49.99
$499.99
only $41.67 per month
  • five seats for your team
  • access to all Manning books, MEAPs, liveVideos, liveProjects, and audiobooks!
  • choose another free product every time you renew
  • choose twelve free products per year
  • exclusive 50% discount on all purchases
  • renews monthly, pause or cancel renewal anytime
  • renews annually, pause or cancel renewal anytime
  • The Design of Web APIs, Second Edition ebook for free