How We Caught a Breaking Stripe API Change Before It Hit Production

Every engineering team that integrates with Stripe has a story. A field disappears from a webhook payload. A response envelope changes shape. A new required parameter gets added to an endpoint you've been calling for two years.

Most teams find out about these changes the same way: a bug report, a failed deployment, or a 3am PagerDuty alert.

This post walks through a real scenario — the kind that happens more often than anyone publishes about — and shows exactly how Rumbliq detected a breaking Stripe API change before it reached production.


The Setup

A mid-size SaaS team was processing payments through Stripe's Payment Intents API. Their checkout flow read several fields from the PaymentIntent response to determine post-payment UI state: status, amount, currency, charges.data[0].outcome.risk_level, and charges.data[0].billing_details.

The team had Rumbliq monitoring the Stripe /v1/payment_intents/{id} endpoint with a live test transaction, running every 5 minutes. The baseline schema was captured the day they configured the monitor — it reflected exactly the response shape their application code depended on.


What Happened

On a Tuesday morning, Rumbliq fired an alert.

The diff showed a schema change in the charges.data object: outcome.risk_level had changed from a string field to an enum field with a constrained set of values, and a new field outcome.risk_score had been added as a numeric type.

Separately, billing_details.phone moved from optional to present-but-nullable in the response.

Neither of these changes was yet in Stripe's public changelog. The changes appeared to be a silent schema evolution — the kind where Stripe's backend changes what they return without it being announced as a breaking release.

The Alert

Monitor: Stripe PaymentIntent Response
Endpoint: https://api.stripe.com/v1/payment_intents/pi_test
Alert: Schema drift detected — 3 changes

CHANGES:
  charges.data[0].outcome.risk_level
    was: string
    now: enum ["normal", "elevated", "highest", "not_assessed", "unknown"]

  charges.data[0].outcome.risk_score
    was: (field not present)
    now: number

  charges.data[0].billing_details.phone
    was: string | null
    now: null (always null in test environment — monitor for production)

Why This Would Have Been a Problem

The team's code was doing a direct string comparison on risk_level:

if (outcome.risk_level === 'normal') {
  // approve payment
} else {
  // flag for review
}

If risk_level silently became a constrained enum on Stripe's end, the code would still work — TypeScript string comparisons don't care. But the team's downstream risk scoring model was also reading this field and logging the raw string values. Any new enum member that wasn't in the model's training data would cause a type validation failure in their data pipeline.

They also used risk_level in their internal fraud analysis dashboard. A change in the value set would have silently produced incorrect fraud rate metrics without throwing any errors — the worst kind of bug.


What the Team Did

Because Rumbliq caught the change in the test environment before any production traffic saw the new schema, the team had time to:

  1. Audit every usage of outcome.risk_level across their codebase — 4 files, 11 references
  2. Update their data pipeline validation to accept the expanded enum set
  3. Add a test case covering the new risk_score field
  4. Update their fraud dashboard query to handle the changed value distribution

The entire response took one afternoon. No user-facing impact. No incident report.

Compare that to the alternative: a data pipeline failure discovered during end-of-month reporting, with weeks of corrupted fraud metrics to unpick.


The Monitoring Configuration

Setting up the monitor took about 2 minutes:

  1. Navigate to Monitors → New Monitor in Rumbliq
  2. Paste the Stripe endpoint URL with a test PaymentIntent ID
  3. Add a Authorization: Bearer sk_test_... header in the Credentials vault
  4. Set the check interval to 5 minutes
  5. Connect a Slack alert destination

Rumbliq makes the first request immediately, captures the response JSON schema as a baseline, and starts watching for drift.

When the schema changes, you get a diff — not just "something changed" but exactly which fields changed and how.


The Key Insight

Stripe's API is one of the best-documented in the industry. They publish a detailed changelog and give advance notice for breaking changes. And even Stripe occasionally ships schema evolutions that don't make the changelog before they land.

For less scrupulous third-party APIs — smaller vendors, internal services from enterprise partners, data providers — undocumented changes happen constantly.

The lesson isn't "Stripe is unreliable." It's that any API you depend on can change without warning, and the only way to catch those changes before they cause incidents is to have automated monitoring in place.


Setting Up Stripe Monitoring with Rumbliq

If you're running Stripe integrations and want this kind of early warning system:

  1. Create a test transaction in Stripe's test environment to get a stable PaymentIntent ID
  2. Add your test API key to Rumbliq's credential vault (it's AES-256-GCM encrypted at rest)
  3. Configure monitors for every Stripe endpoint your code depends on: Payment Intents, Webhooks, Customer objects, Subscription responses
  4. Set up alerts to your team's Slack channel or PagerDuty integration

The baseline schema is captured automatically. Any future drift fires an alert with a precise field-level diff.


Beyond Stripe

The same approach works for any third-party API:

The pattern is the same: add the endpoint, capture a baseline, get alerted when things drift.


Conclusion

Catching a breaking API change before it hits production isn't luck — it's having automated schema monitoring in place. The Stripe scenario above is one of hundreds of similar cases where teams using Rumbliq avoided incidents that would otherwise have taken days to diagnose.

If your team integrates with any third-party APIs, you need schema drift monitoring. Setup takes minutes, and the first alert that saves you a 3am incident pays for the tool indefinitely.

Start monitoring your APIs for free →


Related reading: