System Design Space
Knowledge graphSettings

Updated: May 10, 2026 at 9:20 AM

Customer-friendly API: convenient API for clients

medium

A talk summary on client-oriented API facades: how BFF, GraphQL, payload shape, request fan-out, and contract evolution make APIs easier for mobile and web clients.

A customer-friendly API does not begin with a pretty schema. It begins with respect for how clients live with the contract every day.

In real design work, the chapter shows how request fan-out, payload shape, stable contracts, and the choice between BFF, GraphQL, and REST make an API fit client tasks.

In interviews and engineering discussions, it helps discuss client-oriented facades without drifting into over-customization for one consumer.

Practical value of this chapter

Design in practice

Design APIs from client tasks: fewer request fan-outs, clear payloads, and stable contracts.

Decision quality

Choose BFF, GraphQL, or REST by consumer profile and interface change frequency.

Interview articulation

Show how client pain becomes concrete architecture decisions.

Failure framing

Control over-customization risk when API design drifts toward a single client.

Source

Customer-friendly API

Summary of a talk about client-oriented APIs.

Перейти на сайт

This article grew out of conversations around 2020, when I was explaining to server-side teams that a long list of separate API entry points does not make an API friendly. To assemble one screen, clients sometimes had to call many internal services, which hurt UX and slowed product development.

A customer-friendly API is a facade that returns scenario-ready data to the client instead of forcing the client to assemble a response from many services.

The point of this chapter is not the facade itself, but the API consumer's perspective: how client facades, BFF, payload shape, request fan-out, over-fetching, under-fetching, and contract evolution affect product speed.

Convenient for us ≠ convenient for clients

Server team's view

  • The server team sees a set of API entry points and services.
  • Clients are expected to fetch what they need and know too much about internals.
  • Client-side data composition is treated as normal.

Client's view

  • One screen is assembled from several APIs.
  • The client has to fan out calls and merge responses.
  • Business composition moves into the client application.
Diagram: how a server team sees clients around a single backend
How it looks from the server team's side: one backend with many clients around it.

Why mobile clients feel this first

Tight coupling

The app depends on the shape, number, and order of API entry points.

Duplicated logic

The same data aggregation is implemented separately for iOS and Android.

Non-core work

Client-side data composition distracts from UI/UX and client logic.

Slow change cycle

Any change in API aggregation requires an app release.

Diagram: how a mobile client sees many backend systems
How it looks from a mobile developer's side: one client and dozens of links to different backends.

Solution: a client-oriented facade

What the facade does

  • One network round trip instead of a fan-out of calls.
  • A contract for a screen or scenario, not a generic field set.
  • API aggregation moves closer to the server side.
  • Contract evolution without a mandatory client release.

Result

The client gets ready-to-use data in one request, while the server side remains the place where business composition and contract evolution live.

Clients

Web / Mobile

Facade

BFF / GraphQL

Services

Microservices

Two facade approaches

BFF (Backend for Frontend)

A server layer for a specific client type: it aggregates data, hides internal complexity, and returns a screen-oriented contract.

Contract controlPredictable latencyLocalized change

GraphQL

The client chooses the response shape within a schema and receives only the fields it needs, as long as the team controls query complexity.

UI flexibilityPrecise data selectionLess over- or under-fetching

Decision matrix

BFF

control
Contract control5/5
UI flexibility2/5
Latency predictability4/5
Experiment speed2/5
API governance effort3/5

GraphQL

flexibility
Contract control2/5
UI flexibility5/5
Latency predictability2/5
Experiment speed4/5
API governance effort5/5

Relative scores: BFF gives more control; GraphQL gives more client freedom.

Control vs freedom

BFF = server-side control

  • A contract for a specific interface.
  • Latency, caching, and response size are easier to control.
  • Less client freedom means fewer accidental risks.

GraphQL = client freedom

  • The client shapes requests for the screen.
  • Useful for complex interfaces and experimentation.
  • Requires query limits, monitoring, and API governance.

Hybrids in practice

  • GraphQL can act as a facade over services.
  • A BFF can use GraphQL for part of its data access.
  • API Gateway covers shared platform concerns; BFF covers client-specific behavior.

Mini checklists

The API is inconvenient for clients

  • One screen needs 5-15 requests.
  • The client merges responses from different services.
  • The data shape changes only through a client release.
  • Different clients repeat the same aggregation logic.
  • Temporary adapters and workarounds keep growing.

When BFF fits

  • Different clients need different payload shapes.
  • Mobile releases are expensive and infrequent.
  • Microservices create internal request fan-out.
  • The UI team needs autonomy and isolated change.

When GraphQL helps

  • The UI is complex and has many presentation variants.
  • The team wants a self-documenting schema and typed queries.
  • The team is ready to invest in query limits, monitoring, and controls.

Conclusion and recommendations

If you need a controlled baseline for making an API client-friendly, BFF often wins: it concentrates the contract, reduces call count, and simplifies client evolution.

Related topics: Web API Design and Learning GraphQL.

Related chapters

Enable tracking in Settings