Skip to main content
The Hard Parts.dev
TD-03 Architecture TD Tech Decisions
Severity if wrong · medium Freq · common

REST vs GraphQL

Usually a consumer-shape and schema-governance decision, not just an API fashion choice.

Severity if wrong
medium
Frequency
common
Audiences
frontend leads · backend architects · API platform teams
Reversibility
moderate
Confidence
medium-high
At a glanceTD-03
Really about
Consumer flexibility, schema discipline, backend aggregation complexity, and evolution cost.
Not actually about
Which API style is more modern.
Why it feels hard
REST feels familiar but sometimes rigid; GraphQL feels elegant but often shifts complexity inward.

The decision

Should this API surface be REST-based or GraphQL-based?

Usually a consumer-shape and schema-governance decision, not just an API fashion choice.

Default stance

Where to start before any evidence arrives.

Prefer REST unless consumer flexibility and aggregation pressure clearly justify GraphQL.

Options on the table

Two poles of the trade-off

Neither is the right answer by default. Each option's conditions, strengths, costs, hidden costs, and failure modes when misused are laid out in parallel so you can read across facets.

Option A

REST

Best when

Conditions where this option is a natural fit.

  • resource model is stable
  • consumer needs are relatively predictable
  • HTTP semantics matter
  • team wants simpler operational behavior

Real-world fits

Concrete environments where this option has worked.

  • CRUD-heavy business systems
  • public APIs with broad tooling compatibility needs
  • backend surfaces with relatively stable client shapes

Strengths

What this option does well on its own terms.

  • simplicity
  • cache friendliness
  • clear endpoint behavior
  • wide tooling familiarity

Costs

What you accept up front to get those strengths.

  • can overfetch or underfetch
  • backend aggregation often leaks to clients

Hidden costs

Costs that surface later than expected — the main thing novices miss.

  • endpoint sprawl can grow quietly
  • versioning pressure can become awkward

Failure modes when misused

How this option breaks when applied to the wrong context.

  • Creates fragmented APIs and client orchestration pain.

Option B

GraphQL

Best when

Conditions where this option is a natural fit.

  • consumer views vary substantially
  • frontend aggregation needs are complex
  • schema governance is strong
  • team can manage query behavior and performance

Real-world fits

Concrete environments where this option has worked.

  • multi-client products with different view shapes
  • frontend-heavy experiences with complex aggregation needs
  • platforms willing to treat schema governance as a first-class product concern

Strengths

What this option does well on its own terms.

  • client flexibility
  • single schema surface
  • strong introspection

Costs

What you accept up front to get those strengths.

  • resolver complexity
  • harder caching model
  • performance pitfalls

Hidden costs

Costs that surface later than expected — the main thing novices miss.

  • backend ownership can blur
  • schema becomes a product with governance overhead

Failure modes when misused

How this option breaks when applied to the wrong context.

  • Creates elegant client contracts over messy backend economics.

Cost, time, and reversibility

Who pays, how it ages, and what undoing it costs

Trade-offs are rarely zero-sum and rarely static. Someone pays, the payoff curve shifts with the horizon, and the decision has an undo cost.

Cost bearer

Option A · REST

Who absorbs the cost

  • Frontend teams
  • API maintainers

Option B · GraphQL

Who absorbs the cost

  • API platform team
  • Backend teams
  • Schema owners
Time horizon

Option A · REST

Often wins early and mid-stage through operational simplicity.

Option B · GraphQL

Wins when schema governance and consumer diversity persist long enough to justify the complexity.

Reversibility

What undoing costs

Moderate

What should force a re-look

Trigger conditions that mean the answer may have changed.

  • Client shapes diversify
  • Backend orchestration pain rises
  • Schema governance matures

How to decide

The work you still have to do

The reference can frame the trade-off; only you can weight the factors against your context.

Questions to ask

Open these in the room. Answering them is most of the decision.

  • How variable are our consumer data shapes in reality?
  • Are we solving API design pain or frontend orchestration pain?
  • Who owns query cost and resolver behavior?
  • Can we govern schema evolution as a real product surface?

Key factors

The variables that actually move the answer.

  • Consumer diversity
  • Schema governance maturity
  • Performance control
  • Team familiarity
  • Aggregation complexity

Evidence needed

What to gather before committing. Not after.

  • Client fetch-pattern analysis
  • Aggregation hotspot review
  • API performance data
  • Schema governance capability assessment

Signals from the ground

What's usually pushing the call, and what should

On the left, pressures to recognize and discount. On the right, signals that genuinely point toward one option or the other.

What's usually pushing the call

Pressures to recognize and discount.

Common bad reasons

Reasoning that feels convincing in the moment but doesn't hold up.

  • GraphQL is modern
  • REST is old
  • One endpoint sounds simpler

Anti-patterns

Shapes of reasoning to recognize and set aside.

  • Adding GraphQL as a fashion layer over unclear backend ownership
  • Forcing REST when every client reconstructs the same complex view

What should push the call

Concrete signals that genuinely point to one pole.

For · REST

Observations that genuinely point to Option A.

  • Predictable consumers
  • Stable resource model
  • Lower governance appetite

For · GraphQL

Observations that genuinely point to Option B.

  • Multiple variable clients
  • High aggregation complexity
  • Strong schema discipline

AI impact

How AI bends this decision

Where AI accelerates the call, where it introduces new distortions, and anything else worth knowing.

AI can help with

Where AI genuinely reduces the cost of making the call.

  • AI can help map repeated client fetch patterns and schema hotspots.

AI can make worse

Distortions AI introduces that didn't exist before.

  • AI can generate GraphQL layers quickly, increasing the chance of pretty schema over weak backend discipline.

Relationships

Connected decisions

Nearby decisions this is sometimes confused with, adjacent decisions that are often entangled with this one, related failure modes, red flags, and playbooks to reach for.

Easy to confuse with

Nearby decisions and how this one differs.

  • That decision is about coupling shape between services. This one is about the shape of a single service's public surface.

  • That decision is about how to evolve an API over time. This one is about which style you're evolving in the first place.

  • Adjacent concept A schema-definition-language choice

    Choosing OpenAPI vs SDL vs Protobuf is about how to specify contracts. This decision is about the query shape your consumers will actually use.