API contracts
Catch response drift in CI, not after deploy.
Your mobile app already encodes what it expects from GET /v2/inventory. Fieldnote reuses that as the consumer; your service runs against a provider stub and fails the build when the JSON no longer matches what ships in the OpenAPI commit.
- . Average run in our test org: 38 seconds on GitHub Actions (Ubuntu, cache warm).
- . Slack #api-releases only when a contract file changes on main, not on every commit noise.
consumer: checkout-app
provider: inventory-api
pact: v4
expects:
GET /v2/inventory?region=us-west
200:
body.items[].id: uuid
body.items[].qty: int min:0
# fails at commit a4b91c3 when
# "qty" became string — caught in CI
excerpt from a real smoke config (customer identifier removed)
When teams outgrow "we'll fix it in postman"
Tied to Git
Diffs live next to openapi.yaml. Reviewers see contract + schema together.
Not another dashboard
Green or red in CI. Optional hosted trace when you need the failing JSON side by side.
Stubs you already wrote
Wire your Express or Fastify mock; we don't invent a second server.
"We were shipping mobile twice a week and the backend every day. One nullable field in production cost us a whole afternoon. After Fieldnote, the first red build was a PR that touched pagination, and we reverted before merge. Worth it for a team of eight."
Rafael C., platform lead, payments startup (Series B)
Private beta, February cohort
We onboard five companies per month. You get a shared Slack with the maintainers and migration notes from Pact if you're coming from there.
We reply within two business days. No agency spam.