I would like to find a way to mark an API as deprecated.
Here is a possible case: instead of REST API, GraphQL API is developed, but in order to smoothly decommission the old REST API, I would like to first mark it as deprecated. I would like to do this with the least amount of edits (without marking each operation as deprecated).
deprecated
is only officially supported at the operation
, parameter
or on schema
attributes
You can always use a custom x-deprecated
at the root of the OpenAPI file. Not sure many tools will support it. Otherwise, the deprecated should be defined at each operation.
Here's a sample of that and a recommended deprecation strategy for your services.
When you mark the api deprecated
, inform your consumers of this with headers. Continue returning 200 and give them the deprecation date, the sunset date of the service and a link to a replacement, if one exists.
After the deprecation date has passed, return a 410 on the service until the sunset date is reached and provide a link to the replacement.
openapi: 3.0.4
info:
title: a sample api deprecation
version: 1.0.0
x-deprecated: true
paths:
'/thing':
get:
summary: my old api
deprecated: true
responses:
'200':
description: OK
headers:
Deprecation:
$ref: '#/components/headers/Deprecation'
Sunset:
$ref: '#/components/headers/Sunset'
Link:
$ref: '#/components/headers/Link'
content:
'application/json':
schema: {}
'410':
description: Gone
headers:
Sunset:
$ref: '#/components/headers/Sunset'
Link:
$ref: '#/components/headers/Link'
content:
'application/json':
schema: {}
components:
headers:
Deprecation:
description: >-
Contains the version and/or datetime of a deprecated resource
related to the request URI. The date format is defined per [RFC9651 - Structed Field Values for HTTP](https://www.rfc-editor.org/rfc/rfc9651.html#name-dates)
required: false
schema:
type: string
examples:
deprecation:
value: '"deprecation": "version =v1;date = "@1659578233"'
Sunset:
description: >-
The Sunset header field contains a single timestamp that advertises
the point in time when the resource is expected to become
unresponsive. The Sunset value is an HTTP-date timestamp, as defined
in [RFC7231](https://datatracker.ietf.org/doc/html/rfc7231#section-7.1.1.1),
and SHOULD be a timestamp in the future.
Note - For historical reasons the datetime format differs from
the Deprecation datetime format.[Dalal et al. (2023)]'
required: false
schema:
type: string
examples:
sunset:
value: '"sunset": "Fri 8 Mar 2024 23:59:00 GMT"'
Link:
description: Expresses a typed relationship with another resource
required: false
schema:
type: string
format: uri