Engineering

GraphQL vs REST: What We Actually Use in Production

Share

The GraphQL vs REST debate has generated more hot takes than almost any other topic in backend engineering. After building and maintaining both in production across 200+ products, here’s our honest perspective.

When We Use REST

REST is our default for most projects. It’s simpler to cache, simpler to debug, easier for junior developers to understand, and has better tooling for documentation (OpenAPI/Swagger). For CRUD-heavy applications with well-defined resource boundaries, REST wins on maintainability every time.

When We Use GraphQL

We reach for GraphQL when we have multiple clients with significantly different data requirements (mobile app needs less data than the web dashboard), when we’re building a product with a public API consumed by third-party developers who need flexibility, or when we’re dealing with a highly connected data graph where REST would require N+1 queries or deeply nested endpoint structures.

The Honest Tradeoffs

GraphQL’s flexibility is also its curse. Without strict query depth limits, cost analysis, and persisted queries, you’ve built a denial-of-service vector into your API. N+1 problems that REST never had appear in GraphQL resolvers. Caching requires significantly more engineering effort.

Our recommendation: default to REST, choose GraphQL when you have specific data-fetching problems that REST solves badly. Don’t choose GraphQL because it’s exciting — choose it because it solves a concrete problem you have right now.

admin