API-First Development | Design Before Implementation Guide
Design API contracts before coding. Enable parallel frontend/backend work with OpenAPI specs, mock servers, and contract testing. Reduce integration surprises.
8 min read
API-first development starts with the contract. GitScrum helps teams coordinate API design and track implementation against agreed specifications.
API-First Approach
Design Before Build
API-FIRST WORKFLOW:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β TRADITIONAL (CODE-FIRST): β
β βββββββββββββββββββββββββ β
β β
β Backend builds β Frontend waits β Integration β Rework β
β β β β
β ββ API shape unknown βββββββββββββ β
β β
β PROBLEM: Frontend blocked, late integration issues β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β API-FIRST: β
β ββββββββββ β
β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
β β Design βββββ Contract βββββ Parallel βββββIntegrate β β
β β API β β Agreed β β Work β β & Test β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
β β β β
β β ββββββ΄βββββ β
β β β β β
β β Frontend Backend β
β β (with mock) (real) β
β β β β β
β β ββββββ¬βββββ β
β β β β
β ββββββββββββββββ β
β Same contract β
β β
β BENEFIT: Both teams work in parallel β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
API Design Process
API DESIGN WORKFLOW:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β STEP 1: IDENTIFY CONSUMERS β
β βββββββββββββββββββββββββ β
β β’ Who will use this API? β
β β’ Web frontend, mobile app, third parties? β
β β’ What do they need? β
β β
β STEP 2: DESIGN ENDPOINTS β
β ββββββββββββββββββββββββ β
β β’ Resources and operations β
β β’ Request/response shapes β
β β’ Error formats β
β β’ Authentication β
β β
β STEP 3: DOCUMENT IN SPEC β
β ββββββββββββββββββββββββ β
β β’ OpenAPI for REST β
β β’ GraphQL SDL β
β β’ Machine-readable format β
β β
β STEP 4: REVIEW WITH CONSUMERS β
β βββββββββββββββββββββββββββββ β
β β’ Share spec with frontend/consumers β
β β’ Gather feedback β
β β’ Iterate on design β
β β
β STEP 5: FINALIZE CONTRACT β
β βββββββββββββββββββββββββ β
β β’ Agreed spec becomes source of truth β
β β’ Generate mock server β
β β’ Both teams begin work β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β API DESIGN TASK: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β API-010: Design Order API ββ
β β ββ
β β CONSUMERS: ββ
β β β’ Web checkout (primary) ββ
β β β’ Mobile app ββ
β β β’ Admin dashboard ββ
β β ββ
β β ENDPOINTS PROPOSED: ββ
β β POST /orders Create order ββ
β β GET /orders/{id} Get order details ββ
β β PATCH /orders/{id} Update order ββ
β β GET /orders List user's orders ββ
β β ββ
β β STATUS: Review with frontend team ββ
β β REVIEW DATE: Jan 25 ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
OpenAPI Specification
Contract Definition
OPENAPI SPECIFICATION:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β EXAMPLE OPENAPI SPEC: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β openapi: 3.0.0 ββ
β β info: ββ
β β title: Orders API ββ
β β version: 1.0.0 ββ
β β ββ
β β paths: ββ
β β /orders: ββ
β β post: ββ
β β summary: Create a new order ββ
β β requestBody: ββ
β β content: ββ
β β application/json: ββ
β β schema: ββ
β β $ref: '#/components/schemas/CreateOrder' ββ
β β responses: ββ
β β 201: ββ
β β description: Order created ββ
β β content: ββ
β β application/json: ββ
β β schema: ββ
β β $ref: '#/components/schemas/Order' ββ
β β 400: ββ
β β description: Invalid request ββ
β β ββ
β β components: ββ
β β schemas: ββ
β β CreateOrder: ββ
β β type: object ββ
β β required: [items, shippingAddress] ββ
β β properties: ββ
β β items: ββ
β β type: array ββ
β β items: ββ
β β $ref: '#/components/schemas/OrderItem' ββ
β β shippingAddress: ββ
β β $ref: '#/components/schemas/Address' ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β SPEC BECOMES: β
β β’ Documentation (SwaggerUI) β
β β’ Mock server (for frontend) β
β β’ Client SDKs (generated) β
β β’ Contract tests (validation) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Parallel Development
Using Mock Servers
MOCK SERVER WORKFLOW:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β FROM SPEC TO MOCK: β
β ββββββββββββββββββ β
β β
β OpenAPI Spec β Mock Server Generator β Mock API β
β β
β TOOLS: β
β β’ Prism (Stoplight) β
β β’ Mockoon β
β β’ WireMock β
β β’ MSW (Mock Service Worker) β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β PARALLEL WORKFLOW: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β ββ
β β DAY 1: ββ
β β API spec agreed βββββ Mock server deployed ββ
β β ββ
β β DAY 2-10: ββ
β β ββββββββββββββββββ ββββββββββββββββββ ββ
β β β Frontend β β Backend β ββ
β β β β β β ββ
β β β Builds against β β Implements β ββ
β β β mock API β β real API β ββ
β β β β β β ββ
β β βββββββββ¬βββββββββ βββββββββ¬βββββββββ ββ
β β β β ββ
β β β Uses mock β Matches spec ββ
β β β β ββ
β β βΌ βΌ ββ
β β DAY 11: Integration ββ
β β ββ
β β Frontend ββββββββββββββ Real Backend ββ
β β (switch from mock) ββ
β β ββ
β β RESULT: Both complete, integration smooth ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β MOCK CONFIG: β
β βββββββββββ β
β Development: Use mock server β
β Staging: Use real backend β
β Production: Use real backend β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Contract Testing
Ensuring Compatibility
CONTRACT TESTING:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β THE PROBLEM: β
β ββββββββββββ β
β Backend changes API slightly β
β Frontend doesn't know β
β Production breaks β
β β
β THE SOLUTION: β
β βββββββββββββ β
β Contract tests verify both sides match the spec β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β CONTRACT TEST APPROACHES: β
β β
β PROVIDER TESTING: β
β Test that backend matches spec β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β test('POST /orders matches spec', () => { ββ
β β const response = api.post('/orders', validOrder); ββ
β β expect(response).toMatchOpenAPISpec('/orders'); ββ
β β }); ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β CONSUMER TESTING: β
β Test that frontend expectations match spec β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β test('checkout expects order response', () => { ββ
β β const expectations = checkout.getApiExpectations(); ββ
β β expect(expectations).toBeValidAgainstSpec(); ββ
β β }); ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β TOOLS: β
β β’ Pact (consumer-driven contracts) β
β β’ Dredd (test API against spec) β
β β’ Spectral (lint OpenAPI specs) β
β β
β IN CI: β
β βββββ β
β PR to backend β Contract tests run β Block if breaking β
β β
β Prevents accidental breaking changes β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Versioning APIs
Managing Changes
API VERSIONING:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β VERSIONING STRATEGIES: β
β ββββββββββββββββββββββ β
β β
β URL PATH: β
β /v1/orders β
β /v2/orders β
β Clear, explicit, easy to route β
β β
β HEADER: β
β X-API-Version: 2 β
β Accept: application/vnd.api.v2+json β
β Cleaner URLs, more complex β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β BREAKING VS NON-BREAKING: β
β β
β NON-BREAKING (no new version needed): β
β β
Adding new optional field β
β β
Adding new endpoint β
β β
Adding new optional query param β
β β
β BREAKING (needs new version): β
β β Removing field β
β β Changing field type β
β β Removing endpoint β
β β Changing required fields β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β DEPRECATION PROCESS: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β DEPRECATION: /v1/orders endpoint ββ
β β ββ
β β TIMELINE: ββ
β β Jan 1: v2 released, v1 deprecated ββ
β β Feb 1: Deprecation warnings in v1 responses ββ
β β Mar 1: v1 returns 410 Gone ββ
β β ββ
β β COMMUNICATION: ββ
β β β’ Changelog published ββ
β β β’ Migration guide provided ββ
β β β’ Consumers notified via email ββ
β β β’ Deprecation header in responses ββ
β β ββ
β β MIGRATION SUPPORT: ββ
β β β’ v1 β v2 mapping documented ββ
β β β’ SDKs updated ββ
β β β’ Test environment available ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ