API-Design, das nicht eskaliert: REST, GraphQL, tRPC – wann welches?

API-Design, das nicht eskaliert: REST, GraphQL, tRPC

Du willst eine API, die sich erweitern lässt, ohne dass jedes neue Feature ein Architektur-Drama wird. Hier ist die ehrliche Entscheidungshilfe: REST, GraphQL oder tRPC.

API-Design eskaliert meistens nicht wegen Technik. Sondern wegen Scope: neue Clients, externe Integrationen, Performance-Druck, Security-Anforderungen, “kannst du mal schnell…?”. Und plötzlich ist dein “kleines Backend” ein Produkt.

Deshalb: Lass uns REST vs GraphQL vs tRPC nicht als Religionskrieg führen, sondern als Werkzeugwahl. Das Ziel ist nicht “modern”, sondern: stabil liefern, einfach betreiben, sauber erweitern.

Ich geb dir klare Use Cases, eine Vergleichstabelle, einen Umsetzungsplan und die typischen Fehler, die später richtig Zeit (und Nerven) kosten.

KI

KI-Zusammenfassung

Bitte wähle zuerst eine Zusammenfassungsart aus.

Erst Realität, dann Stil: 7 Fragen vor der Technik

  1. Wer konsumiert die API? Nur deine eigene App? Mehrere Frontends? Externe Partner?
  2. Wie viele Clients? Web, Mobile, Admin, Integrationen, Bots…?
  3. Wie ändern sich Datenbedürfnisse? ständig neue “Widgets”/Listen/Filter oder eher stabile Flows?
  4. Wie wichtig ist HTTP-Caching/CDN? Wenn du stark auf Caching setzt, hat REST Vorteile.
  5. Wie wichtig ist ein maschinenlesbarer Vertrag? SDKs, Doku, Tests, Tools, Security Reviews.
  6. Wie viel Governance hast du? Schema-Review, Deprecations, Breaking-Change-Prozess?
  7. Wie viel Security/Abuse-Risiko? Rate Limits, Query Abuse, BOLA/BFLA & Co (OWASP API Top 10).

REST: boring – und genau deshalb oft richtig

Wann REST glänzt

  • Public APIs & Integrationen: HTTP ist überall, Tooling ist riesig.
  • CDN/Caching: GET/Cache-Control/ETag & Co sind “Standard-Mechanik”.
  • Klare Ressourcen: wenn deine Domain gut in Ressourcen/Collections passt.
  • Verträge & Doku: OpenAPI ist de-facto Standard für HTTP APIs (und 2025/2026 relevant weiterentwickelt).

Wo REST nervt

  • Viele Clients, viele Varianten: du baust plötzlich 12 Endpoints “für Mobile”, “für Dashboard”, “für Export”.
  • Over/Underfetching: du holst zu viel oder musst mehrere Requests orchestrieren.
  • Versioning-Drama: wenn du Breaking Changes nicht im Griff hast und “v1/v2/v3” wild wächst.

GraphQL: stark bei vielen Clients – aber du brauchst Regeln

Wann GraphQL Sinn macht

  • Viele Frontends mit unterschiedlichen Daten: Web will “viel”, Mobile will “wenig”, Admin will “anders”.
  • Schnelle UI-Iterationen: neue Screens ohne ständig Backend-Endpunkte nachzuziehen.
  • Schema als Contract: GraphQL ist per Definition schema-first. Die Spezifikation ist offiziell versioniert (Latest Release z.B. September 2025; Working Drafts laufen weiter).

Was GraphQL nicht automatisch löst

  • Performance: N+1 ist real. DataLoader/Batching ist kein Nice-to-have.
  • Abuse: “Gib mir alles, tief verschachtelt” – du brauchst Depth/Complexity Limits oder Persisted Queries.
  • Caching: Du kannst cachen, aber es ist nicht so “native” wie REST-GET per CDN. Das muss man planen.

tRPC: TypeScript-Speedrun, aber nicht für jeden Markt

Was tRPC dir wirklich bringt

tRPC ist eine TypeScript-first API-Lösung: Du definierst Procedures/Router im Backend und bekommst im Client End-to-End Types, ohne extra Schema-Datei. Das ist brutal schnell für Produktentwicklung. tRPC ist aktuell in der v11-Linie dokumentiert und migrierbar von v10.

Wann tRPC richtig stark ist

  • Du bist 100% TypeScript (Backend + Frontend) und willst maximale DX.
  • Eine App, ein Team: du kontrollierst Client & Server.
  • Schnelles Iterieren: Feature bauen, Types kommen “mit”, weniger Boilerplate.

Wann tRPC dir Ärger macht

  • Public API / Partner: Externe wollen oft sprachagnostische Verträge/SDKs. tRPC ist dafür nicht der Default.
  • Langfristige Governance: Du brauchst trotzdem Deprecation, Versioning-Strategien und klare Ownership.
  • Observability & Edge Cases: Du musst Logging, Rate Limits, AuthZ, Input-Validation sauber machen – wie überall.

Vergleichstabelle: wann welches API-Design?

Kriterium REST GraphQL tRPC
Beste Stärke Interop, HTTP-Standards, Caching, Tooling Flexible Queries für viele Clients End-to-End Types & schnelle DX (TS)
Typischer Sweet Spot Public APIs, Integrationen, klassische CRUD Produkt mit mehreren Frontends, datengetriebene UIs Monorepo/TS-Stack, schnelles Produktteam
Risiko Endpoint-Sprawl, Versionswildwuchs Query-Abuse, N+1, Governance nötig Public API schwierig, TS-Kopplung
Versioning/Evolution über additive Changes + klare Deprecation, ggf. v2 Schema-Evolution + Deprecation statt harte Versionssprünge API-Änderungen wirken direkt in Types; braucht Disziplin
Security/Abuse Rate Limits pro Endpoint, klassische Patterns zusätzlich Depth/Complexity/Persisted Queries wie REST (Inputs, AuthZ, Rate Limits), plus “internal” schützt nicht automatisch
Beste Wahl, wenn… du externe Konsumenten erwartest du UI-Teams entkoppeln willst du Geschwindigkeit brauchst und TS durchziehst

So setzt du’s um

8-Schritte-Plan: API-Design ohne Eskalation

  1. Entscheide “Public vs Internal”: Public = Vertrag/Kompatibilität first. Internal = DX/Speed first.
  2. Definiere 3–5 Kern-Use-Cases: welche Datenflüsse sind die wichtigsten?
  3. Wähle 1 Default: z.B. REST für Public, tRPC/GraphQL als BFF. Nicht alles mischen “weil geht”.
  4. Lege Governance fest: Deprecation-Policy, Review-Prozess, Ownership.
  5. Security-Baseline: AuthN/AuthZ, Object-Level Checks (OWASP), Rate Limits, Logging, Audit.
  6. Performance-Guardrails: REST: pagination, caching. GraphQL: batching, depth/complexity, persisted queries.
  7. Observability: Request IDs, structured logs, metrics (p95, error rate), tracing wo nötig.
  8. Dokumentation/SDK: REST: OpenAPI. GraphQL: Schema + docs. tRPC: TS client + klare “public surface” Regeln.

Mini-Use-Cases (damit es real bleibt)

  • SaaS mit Partnern: REST + OpenAPI, intern optional GraphQL/tRPC als BFF.
  • Produkt mit Web + Mobile + Admin: GraphQL (wenn du Governance + Limits machst) oder REST mit BFF-Schicht.
  • Ein TS-Team, eine App: tRPC für Speed, später ggf. REST Layer für Integrationen.
// Entscheidung in einem Satz:
# Public = REST (mit OpenAPI)
# Multi-Client UI = GraphQL (mit Limits & Governance)
# TS Monorepo = tRPC (intern/BFF), Public später extra

Typische Fehler & wie du sie vermeidest

  • Fehler: “Wir nehmen GraphQL, dann brauchen wir keine Architektur mehr.” Fix: Query-Limits, Batching, Deprecation und Ownership sind Pflicht.
  • Fehler: tRPC als öffentliche Partner-API. Fix: tRPC intern nutzen; für extern REST/GraphQL mit Contract.
  • Fehler: REST ohne Contract/Versioning-Strategie. Fix: OpenAPI + additive Changes + klare Deprecation.
  • Fehler: “Internal ist sicher.” Fix: OWASP API Top 10 gilt auch intern: AuthZ auf Objekt-Ebene, Logging, Rate Limits.
  • Fehler: Zu viele Stile gleichzeitig. Fix: 1 Default + Ausnahmen nur mit Grund (und dokumentiert).

Fazit: die pragmatische Empfehlung

Wenn du nichts Spezielles brauchst: REST ist weiterhin der beste Default – vor allem für Public APIs und Integrationen.

Wenn deine UI ständig neue Datenkombis will: GraphQL kann massiv Stress rausnehmen, wenn du Limits, Batching und Governance ernst nimmst.

Wenn du TS durchziehst und schnell liefern willst: tRPC ist ein Top-Tool – aber behandle es als Produkt-intern/BFF, nicht automatisch als Partner-Schnittstelle.

Nächster Schritt: Schreib deinen Top-3 Use Case auf (z.B. “Dashboard”, “Mobile List”, “Partner Export”) und prüf: Ist das eher “Ressourcen & Caching” (REST), “flexible Datenkombis” (GraphQL) oder “TS-Speed” (tRPC)?

FAQ

Wenn du externe Integrationen erwartest, HTTP-Caching/CDN wichtig ist, und du klare Ressourcengrenzen willst. REST + OpenAPI ist dafür extrem robust.

Für Produkte mit mehreren Clients und dynamischen UIs, wo Over/Underfetching messbar nervt. Aber nur, wenn ihr Governance + Limits (Depth/Complexity/Persisted Queries) ernst nehmt.

Realistisch: ja, das ist sein Sweet Spot. tRPC ist TypeScript-first und glänzt, wenn Client und Server TS sind. Für sprachagnostische Partner-APIs ist REST/GraphQL meist einfacher.

Typisch ist Schema-Evolution: additive Felder/Typen hinzufügen, Altes deprecaten, Usage messen, dann entfernen. Das braucht Disziplin und Kommunikation, aber verhindert “v2/v3” Chaos.

Mit Guardrails: Depth/Complexity Limits, Batching, Timeouts, Rate Limits, ggf. Persisted Queries. Ohne das kann GraphQL bei Abuse sehr teuer werden.

Für REST: ja, meistens. Für GraphQL: du hast das Schema als Vertrag, OpenAPI ist optional. Für tRPC: wenn du externe Konsumenten willst oder Doku/SDK tooling brauchst, ist ein zusätzlicher “Public Contract” oft sinnvoll.

Ein BFF ist eine API-Schicht speziell für ein Frontend (oder eine App-Familie). Es hilft, wenn du interne Datenquellen bündeln willst, ohne deine Public API zu verbiegen. Typischer Move: Public REST, intern BFF via GraphQL oder tRPC.