A Playbook for Sunsetting an API Without Breaking Your Customers
Deprecating an API version always feels lower priority than shipping the next feature, right up until the old version becomes a security liability or a maintenance burden nobody wants to own. The problem is that somewhere out there, a customer's integration is still calling it, possibly one that hasn't been actively maintained by anyone in years, and shutting it off without warning turns a routine cleanup into an incident.
Here's a playbook that gets an old API version fully retired without that outcome.
Vendors Covered in this Article
Disclosure: We may earn a commission if you buy through some links on this page. It doesn't change what we recommend.
Step One: Know Who's Actually Still Calling It
Before announcing anything, pull real usage data: which API keys, accounts, or IP ranges have called the deprecated version in the last thirty to ninety days. This changes the conversation from an abstract deprecation notice to a specific list of accounts you need to reach directly. If you can't answer this question from your logs today, add the logging first. Announcing a shutdown date without knowing who's affected means you'll find out who's affected when they file a support ticket during the outage.
Step Two: Give a Timeline Long Enough to Actually Be Useful
A deprecation notice with a two-week deadline is functionally the same as no notice for a customer whose integration was built by someone who left the company. A reasonable minimum for an external-facing API is ninety days, longer for anything with real migration complexity or enterprise customers with their own release cycles. Communicate the exact shutdown date, not a vague window, and repeat it in every notice so nobody has to go digging for it.
A common mistake is treating deprecation as an engineering-only task. Support and account teams are the ones who will field the replies, so give them the list of affected accounts, a short script for outreach, and clear authority on extensions before the first notice goes out. For example, decide in advance that a customer with a documented, in-progress migration can receive one short, specific extension, while anyone else gets the standard date. Deciding this up front prevents inconsistent promises and stops the shutdown date from drifting one favor at a time.
Step Three: Make the New Version Actually Easier to Adopt Than Staying
A migration only happens on schedule if moving to the new version is genuinely less work than customers assume. Publish a clear mapping between old and new endpoints or fields, ideally with a migration guide that shows the exact before-and-after for the most common calls. If the new version requires a meaningfully different authentication flow or data shape, that friction is exactly what will cause customers to delay migrating until the deadline forces their hand, so budget real support time for the weeks right before the cutoff.
Step Four: Add Safeguards Before You Actually Cut It Off
In the weeks leading up to the deprecation date, add a response header or a visible warning in the API response itself that fires on every call to the old version, so even an integration nobody at the calling company is actively watching gets a signal. Consider a short period of intentional, scheduled brownouts, returning errors for a few minutes at a time, before the permanent shutdown, since this surfaces integrations that would otherwise go unnoticed until the exact day they break for good. This is a more honest way to find remaining dependents than hoping your email notice was read.
Step Five: Keep the Old Endpoint's Failure Honest After Shutdown
Once the deprecation date arrives, don't let the old endpoint silently return empty or wrong data. Return a clear, structured error explaining the endpoint is retired and pointing to the migration guide and the new endpoint. A caller getting a clear error can fix their integration immediately. A caller getting silently wrong data can go undetected for weeks, which is a worse outcome for them and a support burden for you when they eventually notice something is off.
How Long to Keep the Retirement Error Running
Don't remove the old endpoint's code entirely the moment the deadline passes. Keep it returning the structured retirement error for at least another month or two before removing it from your codebase altogether, since that response is still doing useful work: it tells any straggling caller exactly what happened and where to go, instead of a generic connection failure that gives them nothing to act on. Track how often that error still fires. A count that drops to zero and stays there is your real signal that the retirement is complete, not the calendar date you originally announced.
The playbook in order:
- Pull real usage data to learn which keys, accounts, or IP ranges still call the deprecated version, and add logging first if you cannot.
- Announce an exact shutdown date with at least ninety days of notice for an external API, and repeat that date in every message.
- Publish an old-to-new mapping and a migration guide with before-and-after examples for the most common calls.
- Add warning headers on every call to the old version and schedule short brownouts to surface integrations nobody is watching.
- After the deadline, return a structured retirement error pointing to the new endpoint, and remove the code only once that error stops firing.
What Good Looks Like
A good deprecation process means every retiring endpoint has known callers identified from real usage data, a communicated date with enough lead time, a clear migration path, and honest errors once the cutoff arrives.
Building The Capability (5-Stage Skill Ladder)
How to Get Started
Disclosure: We may earn a commission if you buy through some links on this page. It doesn't change what we recommend.
Frequently Asked Questions
What's a reasonable minimum notice period for deprecating a public API?
Ninety days is a common minimum for a straightforward deprecation with a clear migration path. Give significantly more time, six months or more, if the migration requires meaningful integration work, or if you have enterprise customers whose own release cycles move slower than a typical startup's.
Should we ever grant an extension past the announced shutdown date?
It depends on who's asking and why. A large customer with a documented migration plan already in progress is a reasonable case for a short, specific extension. An open-ended extension for every request that comes in undermines the whole point of setting a firm date, since it teaches customers that deadlines aren't real.
How do we handle an integration we can't identify an owner for?
Reach out through every channel tied to the account, the account's registered contact email, in-app notifications if they log in for anything else, and a support ticket if you can open one on their behalf. If the account is genuinely unreachable and low volume, document the outreach attempts and proceed on schedule rather than letting one unreachable account indefinitely block a shutdown that affects your ability to maintain the platform securely.
About the numbers
This guide doesn't quote a sourced benchmark. Figures in it are estimates or general guidance, so check them against your own numbers.
Related Guides
Retiring an API Without Breaking Every Integration
A sunset date read as a suggestion breaks three partner integrations at once. A realistic timeline for retiring an API endpoint without the fallout.
A Playbook for Sunsetting an API Without Breaking Customers
A practical timeline and communication plan for deprecating an API version, including how to find out who's still calling it before shutdown.
How to Sunset an API Version Without Breaking Every Partner
A step-by-step playbook for retiring an old API version: usage auditing, notice periods, migration support, and the hard cutover most teams get wrong.
A Playbook for Deprecating an API Without Breaking Customers
A step-by-step playbook for deprecating an API version: how much notice to give, how to track who's still on it, and when it's safe to shut it off.
A Runbook for Sunsetting an API Without Breaking Every Client
A step-by-step runbook for deprecating an API endpoint or version, from measuring real usage to communicating the timeline to the clients who need it.
Retiring an API Without Breaking the Callers You Forgot About
A step-by-step runbook for sunsetting an API endpoint: Sunset headers, usage telemetry, direct outreach, and monitoring stragglers before the hard cutoff.