REST vs GraphQL
Usually a consumer-shape and schema-governance decision, not just an API fashion choice.
- 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.
Heuristic
Use REST by default; move toward GraphQL when consumer variability and aggregation pressure are real and ongoing.
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.
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
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.
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.
AI false confidence
Generated GraphQL schemas and REST specs look mature because the syntax is correct and tooling is rich - creating the illusion of well-governed API design when no decision has been made about consumer contracts, versioning, or backend discipline.
AI synthesis
Do not choose GraphQL because AI made it easy to scaffold.
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.