API-first design: Hvad betyder det, og hvornår giver det mening?

API-first design: Hvad betyder det, og hvornår giver det mening?

Kort fortalt: Hvad er API-first design, og hvornår giver det mening?

API-first design betyder, at du designer og beskriver dit API som en kontrakt, før nogen skriver backend-kode, bygger UI eller laver integrationer. Det giver især mening, når flere teams eller systemer skal bruge det samme API, når du har flere platforme (web, app osv.), eller når API’et er en langsigtet kerne i forretningen.

Hvis du derimod bygger et lille internt værktøj, en kortlivet prototype eller noget, kun ét team rører ved, er en enklere code-first-tilgang ofte mere pragmatisk.

Hvad betyder API-first design i praksis?

API-first design betyder, at API’et bliver et centralt produkt i arkitekturen, ikke bare et lag du smider ovenpå databasen til sidst. Rækkefølgen bliver: forstå behovene, design API-kontrakten, få den reviewet og først derefter bygge backend, frontend og integrationer op omkring den.

Nøglen er API-kontrakten: et maskin- og menneskelæsbart dokument (ofte en OpenAPI-specifikation), der beskriver endpoints, felter, fejlformater, autentifikation osv. Kontrakten er “sandheden”, resten af koden skal rette sig efter den.

For et team betyder API-first typisk:

  • Frontend og backend kan udvikle parallelt mod en delt kontrakt, ofte med en mock-server.
  • Eksterne partnere kan integrere på et stabilt grundlag, uden du konstant ændrer formater og URLs.
  • API’et kan genbruges på tværs af web, mobil, interne systemer, integrationer og fremtidige projekter.

Det kræver til gengæld, at du investerer tid tidligt i forløbet på at få API’et tænkt ordentligt igennem, i stedet for at “finde ud af det hen ad vejen i koden”.

API-first, design-first og code-first: Hvad er forskellen?

API-first er den overordnede strategi: API’et ses som et centralt produkt, og mange beslutninger tages med API’et som omdrejningspunkt. Design-first er den konkrete arbejdsmetode, hvor du starter med at designe kontrakten, mens code-first er tilgangen, hvor du starter med implementeringen og “lader API’et opstå” ud fra koden.

Det bliver tydeligere, hvis vi kigger på, hvad der kommer først, og hvad der er “source of truth”:

Tilgang Hvad kommer først? Sandhedskilde Typisk brugt til
API-first (strategi) API’et planlægges før UI og interne systemer API-portefølje og standarder i organisationen Organisationer der ser API’er som kerneprodukt eller integrationsrygrad
Design-first (metode) API-kontrakten (fx OpenAPI) før kode Specifikationen i Git, ikke implementeringen Projekter med flere teams/klienter, behov for stabil kontrakt og parallel udvikling
Code-first (metode) Kode og database før API-kontrakt Kodebasen og evt. annotations Små interne projekter, POC’er, hvor fart trumfer struktur

Du kan godt arbejde API-first strategisk uden at være 100 % design-first i alle projekter, men i praksis hænger de to ofte tæt sammen: har du først besluttet, at API’et er centralt, bliver design-first hurtigt det mest logiske værktøj til at holde orden i det.

Hvornår giver API-first mening?

API-first giver mest værdi, når samme API skal bruges af flere teams, flere platforme eller eksterne partnere, og når du forventer, at API’et skal leve længe og udvikle sig. Her betaler den ekstra design- og governance-indsats sig typisk tilbage i mindre friktion og mindre dobbeltarbejde.

En praktisk måde at vurdere det på er at kigge på nogle få, konkrete kriterier.

Beslutningsmatrix: Er API-first et godt fit for dit projekt?

Kriterium Taler for API-first Taler imod / mindre gevinst
Antal teams Flere teams (fx frontend, backend, mobil, integration) der skal koordinere Ét lille team, der både ejer frontend og backend
Antal platforme Web, iOS, Android, måske også interne systemer eller partnersystemer Kun én UI-klient eller kun et internt script
Integrationsgrad API’et bliver en integrationsrygrad for andre systemer API’et bruges kun af ét internt værktøj
Levetid API’et forventes at leve i flere år og løbende udbygges Prototype, kampagne eller midlertidig løsning
Compliance og stabilitet Der er krav om audit, stabilitet og forudsigelige ændringer Lav risiko, ingen særlige krav, få brugere
Genbrugspotentiale Funktionalitet skal genbruges i flere produkter/kanaler Meget specifikt til ét nichebehov
Organisatorisk modenhed I har styr på Git, reviews, standarder og basis-dokumentation I kæmper stadig med helt grundlæggende samarbejdspraksis

Hvis du nikker ja til flere af kolonnerne “taler for API-first”, er der god sandsynlighed for, at en kontrakt-før-kode-tilgang vil spare jer for mange integrationssmerter senere.

Et klassisk eksempel: Du bygger en kerne-backend, som skal understøtte offentlig web, native apps og partnerintegrationer. Her vil en gennemarbejdet API-kontrakt, en mock-server og tydelige versioner ofte være forskellen på rolig parallel udvikling og et halvår med konstante brud på integrationer.

Hvornår bør du ikke vælge API-first?

API-first er ikke en universalløsning. Hvis projektet er lille, kortlivet eller kun bruges af ét team, kan du hurtigt ende med at overinvestere i design, reviews og governance, der aldrig rigtig når at betale sig.

Nogle typiske situationer, hvor en enklere code-first-tilgang er mere fornuftig:

  • Små interne værktøjer hvor én udvikler eller et lille team både ejer API og UI, og hvor ingen andre systemer integrerer ind.
  • Korte proof-of-concepts hvor målet er at afprøve en idé, ikke at bygge den langsigtede platform. Her er det ofte nok at strukturere endpoints nogenlunde fornuftigt og først tænke kontrakt og versionering, hvis POC’en bliver til et rigtigt produkt.
  • Engangs-integrationer der kun bruges til import eller migration, hvor API’et ikke skal vedligeholdes eller deles bredt.
  • Teams uden kapacitet til at vedligeholde specifikationer og reviews. Et halvt forældet OpenAPI-dokument er ofte værre end ingen dokumentation.

Du kan stadig bruge gode API-designprincipper i de her projekter, men du behøver ikke etablere fuld API-first-governance for at få værdi ud af dem.

Hvilken API-type passer til hvilke behov?

API-first handler ikke om ét bestemt teknologivalg. Du kan arbejde API-first med REST, GraphQL, gRPC eller event-drevne mønstre beskrevet med AsyncAPI. Valget afhænger af, om du primært eksponerer ressourcer, komplekse forespørgsler, høj-performance RPC-kald eller events.

Her er en praktisk sammenligning:

API-stil Bedst til Styrker Typiske udfordringer
REST Ressourcebaserede HTTP-API’er (brugere, ordrer, produkter) Enkel model, bred forståelse, godt understøttet af OpenAPI og værktøjer Kan blive mange endpoints og over/under-fetching af data
GraphQL Klienter med meget forskellige data-behov fra samme domæne Klienten vælger selv felter, færre roundtrips, stærk skemabaseret kontrakt Mere kompleks server, kræver disciplin omkring performance og sikkerhed
gRPC Høj-performance service-til-service-kald, ofte internt i systemet Binært format, hurtig og effektiv, god til microservices Mindre menneskelæsbar, kræver mere tooling og fælles sprog (protobuf)
AsyncAPI Event-drevne integrationer (fx beskedkøer, streams, webhooks) God til asynkrone flows, real-time og løs kobling mellem systemer Anderledes tænkemåde end request/response, sværere at teste og debugge

Med en API-first-tilgang vælger du først kontrakten og interaktionen, og derefter den stil, der passer bedst til problemet. Til rene HTTP-API’er vil REST ofte være det naturlige udgangspunkt, mens fx mange klientspecifikke data-behov kan pege på GraphQL. Vil du arbejde mere med event-drevne mønstre og webhooks, kan det give mening at kigge på mønstrene bag robuste webhook-endpoints.

Hvad er en API-kontrakt, og hvorfor er den vigtig?

API-kontrakten er den fælles aftale om, hvordan dit API ser ud og opfører sig: hvilke endpoints der findes, hvilke felter man kan sende og få tilbage, hvilke fejl der kan opstå, og hvordan man autentificerer sig. I API-first bliver kontrakten et konkret artefakt, ikke bare noget der “står i hovedet på backend-udvikleren”.

En god kontrakt beskriver typisk:

  • Endpoints og metoder (fx GET /users, POST /orders).
  • Request-skemaer: hvilke felter, typer og valideringsregler klienten skal overholde.
  • Response-struktur: hvordan succes-svar og paginerede lister ser ud (her hjælper det at kende mønstrene i fx god pagination).
  • HTTP-statuskoder og fejlformat: fx at fejl altid kommer med en konsistent code/message-struktur.
  • Autentifikation og autorisation: hvordan tokens sendes, og hvilke roller der må hvad.
  • Versionering: hvordan nye versioner introduceres, og hvordan gamle udfases.

Når kontrakten ligger i fx en OpenAPI-fil i Git, kan den reviewes af både frontend, backend og produktejer, før nogen skriver kode. Det mindsker risikoen for, at der pludselig dukker felter eller breaking changes op, som ingen har aftalt.

Hvordan kommer man i gang med API-first i praksis?

Den mest realistiske måde at komme i gang på er at vælge ét egnet projekt, beskrive API’et med en simpel OpenAPI-spec, få den reviewet og derefter lade implementering, mock og tests følge efter. Du behøver ikke indføre en kæmpe governance-model for hele organisationen fra dag ét.

En enkel roadmap i 8 trin

  1. Vælg et pilot-API
    Vælg noget med reel værdi, men begrænset scope: fx et “konto”-API der skal bruges af både web og mobil. Undgå både det allerstørste flagskibsprojekt og de helt små scripts.
  2. Forstå brugerrejserne
    Beskriv kort, hvilke flows API’et skal understøtte (oprette konto, hente profil, opdatere e-mail osv.). Det giver et fælles sprog, før du taler felter og statuskoder.
  3. Skriv en første API-kontrakt
    Lav en enkel OpenAPI-specifikation med de vigtigste endpoints, felter og svar. Her kan værktøjer som Swagger Editor eller Stoplight Studio hjælpe. Hold dig til få, velformulerede endpoints til at starte med.
  4. Lav et fælles review
    Saml frontend, backend og evt. produktejer til et review af specifikationen. Er endpoints intuitive? Mangler der felter? Skal fejlbeskederne være mere konsistente? Ret i specifikationen, ikke i koden.
  5. Sæt en mock-server op
    Brug en mock-server (fx Prism eller Mockoon) til at hoste API’et baseret på specifikationen. Så kan frontend-teamet begynde at integrere, selv om backend endnu ikke er klar.
  6. Implementér backend op mod kontrakten
    Backend-teamet bygger nu API’et, så det matcher specifikationen. Her er det oplagt at bruge kontrakttests og validering, så du hurtigt opdager afvigelser.
  7. Automatisér tests og validering
    Integrér værktøjer i CI/CD, der tjekker, at implementeringen overholder kontrakten, og at der ikke indføres breaking changes utilsigtet. Det er her, API-first for alvor begynder at spare tid.
  8. Etabler letvægts-governance
    Beslut, hvem der må ændre i specifikationen, hvordan reviews foregår, og hvordan versionering håndteres. Start småt: fx krav om PR-review på ændringer i OpenAPI-filer og simple retningslinjer for versionslabels.

Hvis du vil se et mere lavpraktisk eksempel på at bygge et API, kan du kombinere tankerne her med guiden til at bygge et lille Express API. Tænk kontrakten først, implementeringen bagefter.

Hvilke værktøjer og standarder bruger man typisk i API-first?

De fleste API-first setups bygger på nogle få grundelementer: en specifikationsstandard (ofte OpenAPI), en editor, en mock-server, et linting-værktøj og noget til kontrakttests. Du behøver ikke hele økosystemet fra dag ét, men det hjælper at kende byggestenene.

En “start her”-stack kan se sådan ud:

  • OpenAPI-specifikation til at beskrive HTTP-API’er. Det er typisk her, din API-kontrakt bor.
  • Editor som Swagger Editor eller Stoplight Studio til at skrive og validere specifikationen.
  • Mock-server som Prism eller Mockoon til at spinne et API op direkte fra specifikationen.
  • Linting som Spectral til at sikre, at alle API’er følger fælles standarder (navngivning, fejlformater osv.).
  • Kontrakttests med værktøjer som Schemathesis eller Dredd til at tjekke, at implementeringen stadig matcher specifikationen.
  • Klient-/servergenerering via OpenAPI Generator, som kan generere klient-SDK’er og skeletkode i mange forskellige sprog.

Oven på det bruger de fleste stadig klassiske værktøjer som Postman eller Insomnia til manuel test og debugging. Pointen i API-first er, at specifikationen ikke er noget, du kun skriver for Postmans skyld til sidst, men det dokument, alle de andre værktøjer udspringer af.

Drift, sikkerhed og stabilitet i et API-first setup

API-first virker kun i praksis, hvis sikkerhed, versionering og validering tænkes ind fra starten. Ellers ender du bare med et pænt dokument og et ustabilt API bagved.

Sikkerhed og kapacitetsstyring

Allerede i kontrakten bør du have overblik over:

  • Autentifikation (fx OAuth2, API-nøgler, JWT): hvordan klienter får adgang.
  • Autorisation: hvilke roller må gøre hvad, og hvordan det afspejler sig i endpoints.
  • Rate limiting: hvilke grænser der gælder for kald, så en enkelt klient ikke lægger det hele ned. Her er det værd at supplere med erfaringerne fra rate limiting i praksis.

Det hænger tæt sammen med, hvordan du håndterer tokens og API-nøgler i klienterne. Hvis du vil undgå klassiske fodfejl, er det værd at kigge på fx opbevaring af tokens og håndtering af API-nøgler.

Versionering og breaking changes

I et API-first miljø er versionering ikke noget, du kan skyde til hjørne. Når API-kontrakten er en delt sandhed for flere klienter, kan små ændringer få store konsekvenser.

Nogle enkle principper hjælper langt:

  • Markér tydeligt, hvilken version kontrakten beskriver.
  • Undgå breaking changes i eksisterende felter og endpoints, så vidt det er muligt. Tilføj hellere nye felter med fornuftige defaults.
  • Når en større ændring er nødvendig, introducer en ny version og planlæg udfasning, så gamle klienter har tid til at migrere.

Det kræver også godt samspil med databaseændringer, især i større systemer. Her kan det være en hjælp at have styr på fx database-migrationer i teams, så schema-ændringer og API-versioner ikke kolliderer.

Overvågning og drift

En stabil API-portefølje kræver, at du kan se, hvordan API’erne bruges i virkeligheden: hvilke endpoints der fejler, hvad der er langsomt, og hvilke klienter der rammer grænser. Her vinder logs og metrics stort over mavefornemmelser. Hvis du vil have et reality-check, er artiklen om observability et godt sted at hente inspiration.

Til sidst handler drift også om at beskytte dit API mod misbrug og overforbrug. Her spiller både rate limiting, god fejlrapportering og løbende tuning af infrastruktur ind, ligesom i enhver anden seriøs backend.

Hvilken forretningsværdi kan API-first give?

API-first skaber forretningsværdi, når det reducerer dobbeltarbejde, gør integrationer hurtigere og gør det nemmere at genbruge den samme funktionalitet på tværs af kanaler og teams. Det koster typisk lidt mere i design og koordinering i starten, men kan mindske friktion og fejl senere.

I praksis kan du kigge på nogle få indikatorer, før og efter du skifter til en mere API-first-orienteret tilgang:

  • Integrationstid: Hvor lang tid tager det for et nyt team eller en partner at bygge en integration til jeres API?
  • Genbrug: Hvor ofte kan et nyt projekt bygge oven på et eksisterende API i stedet for at lave specialløsninger?
  • Supportload: Hvor mange supporthenvendelser handler om uforståelige eller ustabile API’er?
  • Ændringshastighed: Hvor hurtigt kan I rulle nye felter eller features ud uden at knække eksisterende kunder?
  • Developer experience: Hvor let er det for nye udviklere at komme i gang med API-porteføljen, set fra både intern og ekstern side?

Hvis du efter en periode med API-first kan se, at integrationer går hurtigere, at færre bygger uden om jeres standard-API’er, og at supportspørgsmålene skifter fra “jeg forstår ikke API’et” til mere meningsfuld feedback, er du sandsynligvis på rette vej.

Næste skridt: Skal du vælge API-first til dit næste projekt?

Hvis du står foran et projekt, der skal bruges af flere teams, flere platforme eller eksterne partnere, er det værd at tage API-first seriøst: start med en enkel kontrakt, en mock-server og et lille review-flow. Hold øje med, om det faktisk gør jeres samarbejde nemmere.

Er dit projekt derimod en lille intern hjælpe-app eller en kort POC, er det helt fint at sige: “Her holder vi os til enkel code-first.” Det vigtigste er ikke at vælge det mest moderne ord, men den arbejdsform der giver mindst friktion for det konkrete problem, du prøver at løse.

Vil du arbejde videre med arkitektur og proces omkring dine projekter, kan du finde mere inspiration under projektstruktur og arkitektur og den bredere kategori softwareudvikling i praksis.

Brug en klar versioneringsstrategi - fx semantisk versionering i path eller via headers - og foretræk bagudkompatible, additive ændringer. Dokumenter deprecations tydeligt, tilbud en overgangsperiode med migration guides, og valider ændringer mod eksisterende consumer-kontrakter før udrulning.
Arbejd med en OpenAPI-editor eller Stoplight for design, brug Prism eller WireMock til mock-servers, og publicer dokumentation med Swagger UI eller Redoc. Til quality gates kan du anvende Spectral til linting og Pact til consumer-driven contract tests.
Inkluder automatisk validering af OpenAPI-specifikationen i pipeline, kør contract tests (fx Pact) for at sikre at både contracts og implementering stemmer overens, og stop builds ved spec-drift. Kør også end-to-end tests mod mock-servers for at fange integrationsfejl tidligt.
API-first passer fint til GraphQL ved at arbejde schema-first med GraphQL SDL som din kontrakt og bruge schema-registry og mocks til parallel udvikling. Valget mellem GraphQL og REST bør baseres på behov for fleksible queries og over-/underfetching, ikke på om du følger API-first-princippet.

Mikkel Schrøder er den dér stille type, der i årevis har siddet om aftenen med en kop kaffe og et åbent kodeprojekt, mens resten af huset er ved at falde til ro. Hans interesse for kodning startede, da han som teenager forsøgte at lave en simpel hjemmeside til sit favorit-fodboldhold og opdagede, at man kunne ændre alt ved at rode med HTML og CSS. Siden har han lært tingene ved at prøve sig frem, læse forumtråde og pille ved små projekter, indtil de gjorde det, han ville.

På Coding Class deler han ikke perfekte løsninger fra et glansbillede-univers, men de ting han faktisk selv har bokset med: mærkelige JavaScript-fejl, CSS der ikke opfører sig som forventet, og små Python-scripts, der starter i kaos og ender med at spare tid i hverdagen. Han kan godt lide at vise både den første, halvdårlige løsning og den forbedrede udgave, så du kan se forskellen og forstå tankegangen bag.

Mikkel brænder for at gøre programmering mindre skræmmende for dem, der ikke ser sig selv som "tech-typer". Derfor skriver han på helt almindeligt dansk, med små, konkrete kodeeksempler og fokus på, hvordan du selv kan komme fra teori til noget, der faktisk virker. På Coding Class forsøger han at bygge bro mellem manual-sproget og virkeligheden ved at vise, hvordan det føles at sidde med fejlen klokken 22.30 – og hvad der skulle til, før den forsvandt.

Send kommentar

You May Have Missed