All Posts
Breaking ChangesAPI TestingCI/CD

Automated Breaking Change Detection for REST APIs: A Practical Guide

Kiran MayeeMarch 30, 202510 min read

A breaking change in your API is like a pothole on a highway — invisible to the person who made it, devastating to everyone who drives over it. And unlike a 500 error that screams for attention, breaking changes often fail silently: invalid data, missing fields, unexpected types that cascade through your application.

What Counts as a Breaking Change?

Not all API changes are breaking. Here's the definitive classification:

Breaking (Will Cause Client Failures)

  • Removing a field — clients that read response.user.avatar get undefined.
  • Renaming a fieldcreated_atcreatedAt breaks every consumer not updated simultaneously.
  • Changing a type"price": "19.99""price": 19.99 breaks string parsing logic.
  • Removing an enum value — a status field that no longer returns "pending" breaks switch statements.
  • Changing response structure — wrapping data in a new envelope ({ data: [ ... ] }{ results: { items: [ ... ] } }).
  • Removing an endpoint — 404 instead of the expected resource.
  • Changing HTTP status codes — 200 → 201 for creation, or 200 → 204 (empty body).

Non-Breaking (Safe for Existing Clients)

  • Adding a new field — existing clients ignore fields they don't know about.
  • Adding a new endpoint — doesn't affect existing consumers.
  • Adding a new enum value — safe if clients handle unknown values gracefully.
  • Loosening validation — making a required field optional. Existing clients still send it.

Why Manual Detection Fails

Teams try several manual approaches. All of them eventually fail:

  • Code review — reviewers miss schema implications of code changes. A renamed database column doesn't look like an API change in the PR diff.
  • Changelog discipline — requires every engineer to document API changes. One forgotten entry and consumers are blindsided.
  • Versioned specs — teams maintain OpenAPI specs but don't diff them between versions. Or the spec gets updated after deployment, creating a window of drift.
  • Consumer testing — contract tests (Pact) catch regressions, but only for the scenarios that are explicitly tested.

Automated Detection: The Three-Layer Approach

Reliable breaking change detection requires three complementary layers:

Layer 1: Schema-Level Comparison

Compare the JSON schema of your mock API response against the schema of the production response. This catches structural changes — missing fields, type changes, nesting differences.

// Schema comparison output
{
  "field": "$.order.items[0].discount",
  "mock_type": "string",
  "production_type": "number",
  "severity": "critical",
  "impact": "Clients parsing discount as string will get NaN"
}

Layer 2: AI-Powered Analysis

Pure schema comparison generates false positives. AI analysis adds context:

  • Is a "missing" field actually renamed? (The AI detects user_name → userName patterns.)
  • Is a type change intentional? ("1" → 1 might be a fix, not a break.)
  • What's the blast radius? (A change in a deeply nested field affects fewer consumers than a top-level change.)

Layer 3: Historical Trend Analysis

Track drift over time. A field that fluctuates between null and a value isn't a break — it's normal optionality. But a field that was present in 100 consecutive snapshots and then disappears? That's a removal.

Setting Up Automated Detection

Here's how to configure automated breaking change detection on moqapi.dev:

# Configure drift detection with CI/CD integration
curl -X POST https://moqapi.dev/api/apis/drift/configure \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "mockApiId": "order-api-mock",
    "productionUrl": "https://api.myapp.com",
    "schedule": "0 */4 * * *",
    "notifications": {
      "webhook": "https://hooks.slack.com/services/xxx",
      "onCritical": true,
      "onWarning": false
    },
    "suppressions": [
      { "path": "$.meta.request_id" },
      { "path": "$.data[*].updated_at" }
    ]
  }'

CI/CD Gate: Block Deploys on Breaking Changes

The highest-value integration is a CI gate that blocks deployment when breaking changes are detected:

# GitHub Actions example
- name: Check API Contract Drift
  run: |
    RESULT=$(curl -s -X POST https://moqapi.dev/api/apis/drift/run \
      -H "Authorization: Bearer YOUR_MOQAPI_TOKEN" \
      -d '{"mockApiId": "YOUR_MOCK_API_ID"}')
    
    CRITICAL=$(echo $RESULT | jq '.summary.critical')
    WARNING=$(echo $RESULT | jq '.summary.warning')
    
    echo "Critical: $CRITICAL, Warning: $WARNING"
    
    if [ "$CRITICAL" -gt "0" ]; then
      echo "ERROR: API contract has $CRITICAL breaking changes"
      echo "$RESULT" | jq '.events[] | select(.severity == "critical")'
      exit 1
    fi

Handling False Positives

Automated detection will sometimes flag intentional changes. Handle this with:

  • Suppression rules — permanently ignore specific paths (e.g., timestamps, request IDs).
  • Acknowledgement — mark a drift event as "expected" so it doesn't trigger again.
  • Spec update — update your mock API to match the new production schema, resetting the baseline.

Key Takeaways

  • Breaking changes are API modifications that cause client failures — removed fields, type changes, renamed properties.
  • Manual detection (code review, changelogs, versioned specs) misses changes consistently.
  • Automated detection layers schema comparison, AI analysis, and historical trends for reliable classification.
  • CI/CD integration turns drift detection into a deployment gate that catches breaks before production.
  • Suppression rules and acknowledgement workflows prevent alert fatigue from false positives.

Automate your API protection at moqapi.dev/signup.

Share this article:

About the Author

Kiran Mayee

Founder and sole developer of moqapi.dev. Full-stack engineer with deep experience in API platforms, serverless runtimes, and developer tooling. Built moqapi to solve the mock data and deployment friction she experienced firsthand building production APIs.

Ready to build?

Start deploying serverless functions in under a minute.

Get Started Free