cd /news/developer-tools/the-complete-guide-to-api-design-in-… · home topics developer-tools article
[ARTICLE · art-13064] src=dev.to ↗ pub= topic=developer-tools verified=true sentiment=· neutral

The Complete Guide to API Design in 2026: REST, GraphQL, and tRPC in Production

The article summarizes the 2026 API design landscape, identifying three dominant patterns: REST for public APIs and microservices, GraphQL for complex data requirements, and tRPC for TypeScript-to-TypeScript full-stack applications. It emphasizes that teams should choose based on fit rather than hype, and provides specific guidance on when to use each technology, including best practices for error handling, versioning, and rate limiting. The article also includes a decision flowchart to help teams select the appropriate API approach based on their environment and needs.

read4 min views25 publishedMay 24, 2026

The API design landscape in 2026 settled into three clear patterns. REST for public APIs and microservices. GraphQL for complex data requirements. tRPC for TypeScript-to-TypeScript full-stack applications.

Each has a legitimate use case. The mistakes happen when teams choose based on hype rather than fit.

REST in 2026: Still the Default for a Reason #

REST APIs remain the dominant pattern for:

  • Public and partner APIs (ease of documentation and tooling)
  • Microservices that need simple, well-defined contracts
  • Teams without TypeScript full-stack expertise

The key REST improvements in 2026:

Better Error Responses

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Request validation failed",
    "details": [
      {
        "field": "email",
        "code": "INVALID_FORMAT",
        "message": "Must be a valid email address"
      }
    ],
    "requestId": "req_a1b2c3d4e5"
  }
}

The requestId

addition transformed our debugging. Every error now links to structured logs.

API Versioning

Still the most contentious topic. Our 2026 recommendation: URL versioning for major breaking changes only.

GET /v1/users     ← Major version, breaking changes
GET /users?since= ← Minor additions, no versioning

Rate Limiting Headers

Standardized rate limit headers finally emerged as a convention:

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1716560400
Retry-After: 3600

GraphQL: When It's Actually the Right Choice #

GraphQL shines when:

Complex, nested data requirements: A dashboard that pulls users, their orders, the products in those orders, and supplier data for those products. With REST, this requires 4+ requests or a massively overfetching endpoint.Multiple client types: Mobile (needs different data than desktop) and web clients with different requirements. GraphQL's flexible queries handle this cleanly.Rapid client evolution: When your mobile and web teams work independently, GraphQL's schema contract reduces coordination overhead.

When GraphQL Is Wrong

Simple CRUD: If you're mostly doing Create, Read, Update, Delete on single resources, REST is simpler and has better tooling for this pattern. - File uploads: Still awkward in GraphQL. Use REST for this. - Caching: REST with HTTP caching is simpler and more efficient for publicly cacheable data.

The Schema Design Discipline

GraphQL's superpower is the type system. But it requires discipline:

type User {
  id: ID!
  email: String!
  createdAt: DateTime!

  orders(first: Int, after: String): OrderConnection!
  totalOrderCount: Int! # Pre-computed, not derived
}

type OrderConnection {
  edges: [OrderEdge!]!
  pageInfo: PageInfo!
  totalCount: Int!
}

The totalCount

as a separate field (pre-computed) prevents COUNT(*) queries on every request.

tRPC: The TypeScript Revolution #

tRPC became the default for TypeScript monorepos in 2025-2026. The appeal is real: end-to-end type safety without code generation.

// Server: define the procedure
const userRouter = router({
  getById: publicProcedure
    .input(z.object({ id: z.string() }))
    .query(async ({ input }) => {
      return db.user.findUnique({ where: { id: input.id } });
    }),
});

// Client: fully typed, no code generation
const user = await trpc.user.getById.query({ id: userId });
// user is typed based on the server definition

The productivity gains are real for teams already in TypeScript. The tradeoff: you need a TypeScript monorepo, and the learning curve for Zod schemas is real.

When to Choose tRPC

Perfect for: Full-stack TypeScript teams, rapid development, internal tools, startups moving fast

Not for: Multi-language environments, public APIs, teams without TypeScript expertise

The Decision Framework #

Is your team TypeScript-first with a monorepo?
  → YES → tRPC for internal services, REST for public APIs
  → NO  → Continue below

Do clients need different data shapes for the same endpoint?
  → YES → GraphQL
  → NO  → Continue below

Is this a public/partner API?
  → YES → REST (better tooling, easier to document, broader client support)
  → NO  → REST is probably fine, GraphQL if the data model is complex

The Tooling That Matters in 2026 #

For REST:

Zod for input validation (replaced Joi and class-validator) - Hono orFastify for the framework (Express is showing its age) - scalar orredocly for API documentation

For GraphQL:

GraphQL Yoga 5(replaced Apollo Server as the default) - pothos ornexus for schema-first development - Studio for Explorer and monitoring

For tRPC:

tanstack-query as the client (works with tRPC natively) - Zod for input validation - Kysely for type-safe database queries

This article contains affiliate links. If you sign up through the links above, I may earn a commission at no additional cost to you.

Ready to Build Your Online Business? #

** Get started with Systeme.io for free** — All-in-one platform for building your online business with AI tools.

── more in #developer-tools 4 stories · sorted by recency
── more on @rest 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/the-complete-guide-t…] indexed:0 read:4min 2026-05-24 ·