Markdown Editor

Deprecation Notice Template (RFC 9745, RFC 8594)

Customer-facing deprecation and sunset notice: affected users, dates, replacement, migration steps, usage detection, Deprecation and Sunset headers, email and changelog variants

ドキュメント・サポートフルRFC 9745; RFC 8594; OpenAPI 3.2.1deprecationnotice

使い方: Use it when you retire an API version, endpoint, field or SDK and must tell customers. Fill the notice summary and timeline first, then derive the headers, email and changelog entry from them. The main pitfall is dates that differ between the page, the email and the Sunset header.

プレビュー

Deprecation Notice: [Feature, endpoint or API version]

Customer-facing announcement that a product capability, API version, endpoint, field or SDK is deprecated and will be retired on a stated sunset date. It tells readers what is changing, whether they are affected, the dates, the replacement, the migration steps and how to find their own usage, and it ships in three variants: a documentation page, an email and a changelog entry. The machine-readable signals follow RFC 9745 (The Deprecation HTTP Response Header Field, Standards Track, March 2025) and RFC 8594 (The Sunset HTTP Header Field, Informational, May 2019), with OpenAPI 3.2.1 and AsyncAPI 3.1.0 deprecation flags. Replace every [bracketed] value and every row marked Example.

Document control

FieldValue
Document ID[DEP-NNN]
Deprecated item[Orders API v1]
Replacement[Orders API v2]
Deprecation date[YYYY-MM-DD]
Sunset date[YYYY-MM-DD HH:MM UTC]
Policy applied[API Versioning and Deprecation Policy, version X.Y]
Version[1.0]
Status[Draft / Approved / Published / Extended / Sunset complete / Withdrawn]
Owner[@api-product-owner]
Approvers/reviewers[@engineering-lead], [@developer-relations], [@support-lead], [@legal-or-commercial]
Last updatedYYYY-MM-DD
ClassificationPublic
Canonical URL[https://developer.example.com/deprecations/orders-v1]
Internal tracking[Ticket or epic ID]

Approvals

RoleNameDecisionDate
API product owner[@name][Approve / Approve with conditions / Reject]YYYY-MM-DD
Engineering lead[@name][Decision]YYYY-MM-DD
Customer support lead[@name][Decision]YYYY-MM-DD
Commercial or legal reviewer (contract terms)[@name][Decision]YYYY-MM-DD

Revision history

VersionDateAuthorChange summary
0.1YYYY-MM-DD[@name]First draft
1.0YYYY-MM-DD[@name]Example: Published with deprecation date 2026-11-02 and sunset date 2027-11-17
1.1YYYY-MM-DD[@name]Example: Added brownout schedule and the usage report download

Contents

1. Notice summary

ItemValue
What is deprecatedExample: Orders API version 1 (all operations under /v1/orders)
Deprecation dateExample: 2026-11-02 (no new features; fixes for security and severe defects only)
Sunset dateExample: 2027-11-17 23:59:59 UTC, a Wednesday (requests fail after this time)
ReplacementExample: Orders API version 2 (/v2/orders)
Action requiredExample: Move every integration to /v2/orders and upgrade the official SDK to version 5.0.0 or later before the sunset date
Who must actExample: Any account that called /v1/orders in the last 90 days
Effort estimateExample: Most integrations need a change to two request fields and one response field; allow one to three days including testing
Migration guide[Link to the migration guide]
Where to get help[Support channel, forum or account manager]

Summary in one sentence (reuse in the email subject and the changelog title): Example: Orders API v1 is deprecated on 2 November 2026 and will stop working on 17 November 2027; move to Orders API v2 before then.

2. What is changing

State the scope in plain terms and then list every deprecated item. If only part of an API is deprecated, list what stays as well, because readers will otherwise assume the worst and migrate more than they need.

2.1 Deprecated items

IDTypeIdentifierReplacementNotes
DEP-ITEM-001 (Example)OperationGET /v1/orders (listOrders)GET /v2/orders (listOrdersV2)Cursor pagination replaces page numbers
DEP-ITEM-002 (Example)OperationPOST /v1/orders (createOrder)POST /v2/orders (createOrderV2)Idempotency-Key header becomes required
DEP-ITEM-003 (Example)Fieldorder.total (float)order.total_amount (object with value string and currency)Removes rounding errors on large amounts
DEP-ITEM-004 (Example)Eventorder.updated v1 payloadorder.updated v2 payloadDelivered to webhook endpoints that opt in to v2
DEP-ITEM-005 (Example)SDK methodclient.orders.list(page=...) in SDK 4.xclient.orders.list() iterator in SDK 5.xSDK 4.x reaches end of support on the sunset date
[DEP-ITEM-NNN][Type][Identifier][Replacement][Notes]

2.2 Not affected

ItemStatus
Example: Orders API v2, Payments API, Catalogue APIUnchanged
Example: Order data stored in your accountUnchanged; v2 reads the same orders, no data migration is needed
Example: Dashboard order screensUnchanged
[Item][Status]

2.3 Why we are making this change

Keep this to one short paragraph that names the customer benefit. Readers accept a deprecation more readily when they can see what they gain, but the reason must never be longer than the instructions.

Example: Version 2 represents money as an exact decimal string with a currency code, uses cursor pagination that stays consistent while orders are created, and makes order creation safe to retry. Running two versions side by side has slowed delivery of new order features, which will ship on version 2 only.

3. Who is affected

You are affected if any of the following is true. Section 7 explains how to check each one.

IDConditionHow to confirm
AFF-001 (Example)Your code or an integration you run calls any /v1/orders operationUsage report in section 7.1, or Deprecation header in your logs
AFF-002 (Example)You use an official SDK at version 4.x or earlierCheck your dependency lock file
AFF-003 (Example)Your webhook endpoint receives order.updated with "api_version": "1"Webhook delivery log in the dashboard
AFF-004 (Example)You use a third-party app or connector that reads ordersAsk the vendor; the partner list in section 10 shows who has already migrated
[AFF-NNN][Condition][Check]

You are not affected if you use only the dashboard, only Orders API v2, or an official SDK at version 5.0.0 or later with default settings.

If you build software that other people install (an app, a plug-in, a connector), you are responsible for updating it and for telling your own users which release they need. Section 11.2 has text you can adapt.

4. Timeline

MilestoneDate and time (UTC)What changes for you
AnnouncementExample: 2026-10-26This notice is published. Responses from /v1/orders start to carry Deprecation (with the future date 2026-11-02), Sunset and Link headers; behaviour does not change
DeprecationExample: 2026-11-02 00:00v1 receives security and severe defect fixes only. New-adopter freeze: accounts with no v1 traffic in the 90 days before this date can no longer start calling v1
Reminder (90 days)Example: 2027-08-19Email to every account that still has v1 traffic; last day to request an extension
First brownoutExample: 2027-09-28 14:00 to 14:15v1 returns 503 for 15 minutes so that hidden dependencies surface
Reminder (30 days)Example: 2027-10-18Email to accounts that still have v1 traffic
Second brownoutExample: 2027-10-26 14:00 to 15:00v1 returns 503 for 60 minutes
Final reminder (7 days)Example: 2027-11-10Email to every account that still has v1 traffic
SunsetExample: 2027-11-17 23:59:59v1 stops responding as described in section 9
Notice archivedExample: 2028-11-17This page moves to the deprecation archive

Example: The dates apply Corvid Commerce's API Versioning and Deprecation Policy defaults for public APIs: a public deprecation period of at least 12 months (2026-11-02 to 2027-11-17), no new consumers from the deprecation date, reminders 90, 30 and 7 days before the sunset, brownouts only in the last 8 weeks (from 2027-09-22), and extensions of at most 3 months. The sunset falls on a Wednesday that is not a public holiday in the United States or the United Kingdom and is clear of the late-November retail peak in the following week.

Brownouts are short, announced periods in which the deprecated item fails on purpose. They find integrations that nobody is watching, such as a nightly job on a forgotten server, while there is still time to fix them. Announce each brownout at least [7] days ahead on the status page and in the changelog, run it at a time of low traffic for most readers, and never run one during a declared incident.

If the timeline changes, publish a new version of this notice, add a revision history row, update the Sunset header value, and tell affected readers by email. Move dates later, never earlier, unless security requires it.

5. Replacement and feature mapping

Old capabilityNew capabilityDifference you must handle
Example: page and per_page query parameterscursor and limitStore the next_cursor value instead of incrementing a page number
Example: order.total as a JSON numberorder.total_amount.value as a decimal string, plus currencyParse the string as a decimal type, not a float
Example: Retries on POST /v1/orders could create duplicatesIdempotency-Key header, requiredGenerate one key per logical order and reuse it on retry
Example: status values new, paid, shippedAdds cancelled (and partially_shipped from API 2.4.0)Handle unknown values without failing
Example: Filter by customer_emailStill accepted in v2 but deprecated (DEP-002, sunset 2027-12-01); filter by customer_idLook up the customer ID first with the Customers API, so you migrate this filter only once
[Old][New][Difference]

Permissions and limits. Example: v2 uses the same API keys and scopes. The default rate limit is the same; burst limits are higher.

Pricing. Example: No change. Calls to v2 are billed the same way as calls to v1.

6. Migration steps

Follow these steps in order. Most readers can migrate one operation at a time, because v1 and v2 read and write the same orders.

  1. Find your usage. Use section 7 to list every place that calls /v1/orders or uses SDK 4.x. Record each one as a migration item.
  2. Upgrade the SDK (if you use one) to version 5.0.0 or later. Read the SDK release notes for other changes in the major version.
  3. Change list calls to cursor pagination. Replace page counters with the next_cursor loop shown in the migration guide.
  4. Change money handling. Read total_amount.value as a decimal and always store it with total_amount.currency.
  5. Add idempotency keys to every create call, generated once per logical order and reused on retry.
  6. Accept new status values. Make sure unknown values are logged, not treated as errors.
  7. Switch webhooks to v2 payloads in the dashboard under [Settings > Webhooks], one endpoint at a time.
  8. Test in the sandbox. The sandbox already behaves as production will after sunset: v1 calls there fail with the sunset response.
  9. Deploy and watch. After deploying, confirm that the Deprecation header no longer appears in your logs and that the usage report in section 7.1 shows zero v1 calls for at least 7 days.
  10. Remove old code paths once you see zero v1 traffic, so that nobody reintroduces them.
StepOwnerDueStatus
Example: Inventory v1 calls in the warehouse sync service[@integration-owner]2026-12-15Done
Example: Upgrade SDK to 5.x in the storefront[@frontend-lead]2027-03-31In progress
Example: Switch webhook endpoints to v2 payloads[@integration-owner]2027-06-30Not started
[Step][@owner]YYYY-MM-DD[Status]

Rolling back. Until the sunset date you can switch an integration back to v1 if v2 causes a problem; you will see the deprecation headers again. After the sunset date there is no rollback, so finish testing early.

7. How to detect usage

7.1 Usage report

Example: The dashboard page [Developers > Deprecations] lists, for each API key, the number of calls to deprecated operations in the last 90 days, the last call time, the user agent and the source IP range. The report is also available from the GET /v2/usage/deprecations operation so that you can add it to your own monitoring.

The report shows aggregated counts per key and operation. It does not include request bodies or personal data.

7.2 Response headers in your logs

From the announcement date, every response from a deprecated operation carries Deprecation, Sunset and Link headers; until the deprecation date the Deprecation value is a future date. Search your HTTP client logs or API gateway logs for these field names. Section 8 explains their values.

7.3 SDK warnings

Example: SDK 4.8 and later log a warning the first time per process that a deprecated method is called, with the method name, the sunset date and a link to this page. Set the log level to WARNING or lower to see it. The warning never contains request data.

7.4 Code search

Search your repositories for the identifiers in section 2.1. Useful patterns:

/v1/orders
orders.list(page=
order.total
"api_version": "1"
corvid-commerce==4.     (Python lock files)
"@corvid/commerce": "^4 (JavaScript lock files)

7.5 Contract tests

If you keep a copy of our OpenAPI description, the deprecated operations and parameters are marked deprecated: true. A linter rule that fails your build when you reference a deprecated operation catches new usage before it ships.

8. Machine-readable signals

8.1 Deprecation header (RFC 9745)

The Deprecation response header says that the resource is deprecated or will be deprecated. Its value is a structured-field Date as defined in RFC 9651: the @ character followed by the number of seconds since 1970-01-01T00:00:00Z. A date in the past means the resource is already deprecated; a date in the future announces when deprecation takes effect. The header does not change how the resource behaves.

Example: the deprecation date 2026-11-02T00:00:00Z is @1793577600. Corvid Commerce sends this value from the announcement on 2026-10-26, when it is still a future date, so that clients see the coming deprecation a week early.

8.2 Sunset header (RFC 8594)

The Sunset response header gives the time after which the resource is expected to become unresponsive. Its value is an HTTP-date (the IMF-fixdate format, always in GMT). RFC 9745 requires that the sunset time is not earlier than the deprecation time.

Example: the sunset time 2027-11-17T23:59:59Z is Wed, 17 Nov 2027 23:59:59 GMT.

8.3 Link relations

Two Link header relations point readers to documentation:

  • rel="deprecation" (RFC 9745) links to information about the deprecation, such as this notice or the migration guide.
  • rel="sunset" (RFC 8594) links to information about the sunset or the retirement policy.

8.4 Example response

A response from a deprecated Orders API v1 operation looks like this (Example):

HTTP/1.1 200 OK
Content-Type: application/json
Deprecation: @1793577600
Sunset: Wed, 17 Nov 2027 23:59:59 GMT
Link: <https://developer.example.com/deprecations/orders-v1>; rel="deprecation"; type="text/html"
Link: <https://developer.example.com/policies/api-deprecation>; rel="sunset"; type="text/html"

8.5 Scope

By default, both headers apply only to the resource that returned them. If you send them on a single entry point but mean the whole API version, say so here, because clients that do not read this page will assume the narrow scope. Example: Corvid Commerce sends both headers on every response under /v1/orders, so the scope is per resource and needs no extra explanation.

8.6 Description documents and schemas

FormatSignalExample
OpenAPI 3.2.1 (3.1.x also widely used)deprecated: true on the Operation, Parameter and Header Objects; deprecated: true in the Schema Object for propertieslistOrders operation marked deprecated
AsyncAPI 3.1.0deprecated: true in the Schema Object of the message payloadOrderUpdatedV1 payload schema marked deprecated
GraphQL@deprecated(reason: "...") on fields and enum valuesReason text names the sunset date and replacement
SDKsLanguage-native deprecation markers (annotations, decorators, doc tags)@deprecated JSDoc tag on orders.list(page)
# OpenAPI 3.2.1 fragment (Example)
paths:
  /v1/orders:
    get:
      operationId: listOrders
      deprecated: true
      description: >
        Deprecated on 2026-11-02, sunset 2027-11-17. Use listOrdersV2.

8.7 Client guidance

Treat both headers as hints, not guarantees. A deprecated resource keeps working until its sunset, but readers should not assume it will. Have your monitoring alert when either header first appears, and fetch linked documentation over HTTPS only.

9. What happens at sunset

AspectBehaviour after the sunset time
HTTP statusExample: 410 Gone for every /v1/orders operation
Error bodyExample: {"error": {"code": "api_version_sunset", "message": "Orders API v1 was retired on 2027-11-17. Use /v2/orders.", "doc_url": "https://developer.example.com/deprecations/orders-v1"}}
WebhooksExample: v1 payloads are no longer delivered; endpoints still on v1 are switched to v2 automatically and an email is sent
SDK 4.xExample: Calls fail with ApiVersionSunsetError; no new 4.x releases
Your dataExample: Unchanged and available through v2
Grace periodExample: None. Do not plan on one
Status pageExample: The sunset is listed as planned maintenance, not as an incident

Use a status code that matches the behaviour you choose: a permanent removal is usually signalled with 410 Gone, a redirect to the replacement with a 3xx code only when the request can be served unchanged by the new version. Keep the error body stable so that readers can match on its code.

10. Support and extensions

TopicDetails
Help with migrationExample: Developer forum tag orders-v2, support ticket category "API migration", office hours every Tuesday 15:00 UTC until the sunset date
Enterprise customersExample: Your account manager can arrange a migration review
Extension requestsExample: Submit through the support portal by 2027-08-19 with the integration name, call volume, blocking reason and planned completion date; extensions are granted only under the policy, to named API keys, and never beyond 2028-02-17 (3 months after the sunset)
Partner and marketplace appsExample: The partner directory marks apps that already use v2
Contract termsExample: Customers with contractual notice terms receive notice under those terms; this public notice does not change any agreement

Extensions, if granted, apply to named API keys only and are recorded in the internal deprecation register. The public sunset date does not move for anyone else.

11. Announcement variants

11.1 Documentation page

This document is the page variant. Publish it at the canonical URL in the Document control table, link it from the API reference for every deprecated operation, from the migration guide, from the changelog and from the Link header with rel="deprecation". Add a short banner at the top of each deprecated reference page:

Deprecated: Orders API v1 stops working on 17 November 2027 at 23:59:59 UTC.
Move to Orders API v2. See the deprecation notice for steps.

11.2 Email

Send the email to the technical contacts on each affected account (from the usage report), with a copy to the account owner. Use plain text or simple HTML, no tracking pixels, and the same dates as section 1.

Subject: Action required by 17 November 2027: move from Orders API v1 to v2

Hello [Contact name],

Your account [Account name] called Orders API v1 [N] times in the last
90 days. Orders API v1 is deprecated from 2 November 2026 and will stop
working on 17 November 2027 at 23:59:59 UTC.

What to do:
1. Move your integration to Orders API v2.
2. If you use our SDK, upgrade to version 5.0.0 or later.
3. Confirm in [Developers > Deprecations] that v1 calls have stopped.

Most integrations need one to three days of work including testing.
Migration guide: [URL]
Full notice: [URL]

Need help? Reply to this email or open a ticket in the category
"API migration".

[Team name]
You receive this message because you are a technical contact for an
account that uses Orders API v1. This is a service message about your
use of the product.

11.3 Changelog entry

Add the entry to the API Changelog (docs/api-changelog) under the date the headers and the deprecated: true flags reach production (Example: the announcement date, 2026-10-26), with the deprecation and sunset dates in the entry, classified as a deprecation that becomes breaking at sunset, and link it to this page.

### 2026-10-26: Orders API v1 deprecation announced (APICHG-015)

**Class:** Deprecation (breaking at sunset)
**Affects:** all operations under `/v1/orders`; SDK 4.x
**Deprecation:** 2026-11-02 (`Deprecation: @1793577600`)
**Sunset:** 2027-11-17 23:59:59 UTC (`Sunset: Wed, 17 Nov 2027 23:59:59 GMT`)
**Replacement:** Orders API v2; SDK 5.0.0 and later
**Read:** [Deprecation notice](URL), [Migration guide](URL)

11.4 Reminder schedule

WhenChannelAudience
Example: Announcement day (2026-10-26)Email, changelog, blog, dashboard banner; headers startAll accounts with v1 traffic in the last 90 days
Example: Deprecation day (2026-11-02)Changelog, dashboard banner; new-adopter freeze startsAll
Example: 90, 30 and 7 days before sunset (2027-08-19, 2027-10-18, 2027-11-10)EmailAccounts still sending v1 traffic
Example: 7 days before each brownoutStatus page, changelogAll
Example: Sunset dayStatus page, changelogAll
[When][Channel][Audience]

Stop emailing an account as soon as its v1 traffic reaches zero. Repeated reminders to readers who have already migrated teach them to ignore the next notice.

12. Frequently asked questions

Will my v1 integration stop working on the deprecation date? Example: No. It keeps working until the sunset date, apart from the two announced brownouts. The headers start at the announcement; the deprecation date ends new features for v1 and stops accounts that have never used v1 from starting.

Can I use v1 and v2 at the same time? Example: Yes. Both read and write the same orders, so you can migrate one operation at a time.

Do I need new API keys? Example: No. Existing keys and scopes work with v2.

What if a third-party app I use still calls v1? Example: Contact the app vendor. The partner directory shows which apps have migrated. The usage report shows the app's user agent so that you can tell which app is calling.

Can I get more time? Example: Only under the extension process in section 10, with a request by 2027-08-19. Extensions apply to named API keys and end by 2028-02-17 at the latest.

Where do I report a problem with v2? Example: Open a support ticket in the category "API migration". Check Known Issues (docs/known-issues) first for current workarounds.

13. Pre-publication checklist

IDCheckDone
CHK-001Dates in sections 1, 4, 8, 11 and the email match exactly[ ]
CHK-002Notice period meets the deprecation policy and contractual terms[ ]
CHK-003Sunset date is not earlier than deprecation date, not on a weekend, public holiday or known peak[ ]
CHK-004Deprecation value is a structured-field date (@ plus seconds) and decodes to the stated date[ ]
CHK-005Sunset value is an HTTP-date in GMT and decodes to the stated time[ ]
CHK-006Both Link relations resolve over HTTPS to live pages[ ]
CHK-007OpenAPI and AsyncAPI descriptions mark deprecated items and are published[ ]
CHK-008Usage report works and contains no personal data beyond what support already sees[ ]
CHK-009Migration guide is published and tested by someone outside the team[ ]
CHK-010Support has the FAQ, the extension process and a ticket category[ ]
CHK-011Sunset behaviour (status code, error body) is implemented in the sandbox[ ]
CHK-012Email reviewed for tone, dates and links; no tracking pixels[ ]
CHK-013Localised versions (if any) show the same dates and links[ ]

14. Glossary and references

14.1 Glossary

TermMeaning in this notice
DeprecationThe item still works but is no longer recommended and will be retired; no new features are added
SunsetThe time after which the item is expected to stop responding
BrownoutA short, announced, deliberate failure of a deprecated item to reveal hidden usage
ReplacementThe supported item that readers should move to
Structured-field DateAn HTTP field value type: @ followed by seconds since 1970-01-01T00:00:00Z (RFC 9651)
HTTP-dateThe fixed date format used in HTTP fields, for example Wed, 17 Nov 2027 23:59:59 GMT
Link relationA named relationship in a Link header, such as deprecation or sunset
New-adopter freezeThe point after which accounts that never used the item cannot start

14.2 References

ReferenceVersion or dateUse in this template
RFC 9745, The Deprecation HTTP Response Header Field (S. Dalal, E. Wilde), rfc-editor.orgStandards Track, March 2025Deprecation header syntax and semantics, deprecation link relation, scope, relation to Sunset
RFC 8594, The Sunset HTTP Header Field (E. Wilde), rfc-editor.orgInformational, May 2019Sunset header, sunset link relation, scope and past-date handling
RFC 9651, Structured Field Values for HTTP, rfc-editor.orgStandards Track, September 2024Date type used by Deprecation (section 3.3.7)
RFC 9110, HTTP Semantics, rfc-editor.orgStandards Track, June 2022HTTP-date format, 410 Gone
RFC 8288, Web Linking, rfc-editor.orgStandards Track, October 2017Link header syntax
OpenAPI Specification, spec.openapis.org3.2.1, 2026-09-10deprecated field on operations, parameters, headers and schemas
AsyncAPI Specification, asyncapi.com3.1.0, 2026-01-31deprecated field on schemas
Semantic Versioning, semver.org2.0.0Deprecation in a minor release, removal in a major release
[Internal API deprecation policy][Version]Notice periods and exception rules

Standard and licence note

Based on IETF RFC 9745 (The Deprecation HTTP Response Header Field, March 2025) and RFC 8594 (The Sunset HTTP Header Field, May 2019), with RFC 9651, RFC 9110 and RFC 8288 for field syntax, and on the deprecated fields of the OpenAPI Specification 3.2.1 and the AsyncAPI Specification 3.1.0 (both published under the Apache License 2.0 by the OpenAPI Initiative and the AsyncAPI Initiative). Header formats are described in original words and the example values were computed for this template; no RFC or specification text is reproduced. Corvid Commerce and every example value are fictional. This template is original text written for this collection. Check the current RFC status and specification versions before use. Template licence: MIT.

関連テンプレート