GraphQL was supposed to kill REST. It's 2026 and REST is still everywhere. Here's the real story.
REST (2000) — Roy Fielding's architectural style. Resources at URLs. HTTP verbs. Stateless. GraphQL (2015, Facebook) — Query language for APIs. Client specifies exactly what data it needs.
# Client asks for exactly what it needs
query {
user(id: "123") {
name
email
posts(last: 5) {
title
createdAt
}
}
}No over-fetching (getting too much data). No under-fetching (needing multiple requests).
POST /deploy is clear. GraphQL mutations for operations feel forced.For full-stack TypeScript teams:
// server
const userRouter = router({
getUser: publicProcedure
.input(z.string())
.query(({ input }) => getUserById(input)),
});
// client — fully typed, no schema generation
const user = await trpc.user.getUser.query("123");End-to-end type safety without GraphQL's complexity. This is eating GraphQL's lunch for TypeScript shops.
Public API consumed by strangers? → REST
Complex frontend, many data shapes? → GraphQL
Full-stack TypeScript monorepo? → tRPC
Simple CRUD, small team? → REST
There's no winner. There's the right tool for your context.