Every endpoint is under /api/v1/. When we need to make a breaking change,
a new /api/v2/ path ships alongside /api/v1/. Additive changes
(new endpoints, new optional fields, new enum values) land on v1
continuously and are non-breaking.
string → enum).code string./api/v1/.When v2 ships, v1 enters a 3-month read-only window: GETs keep
working; mutations return a deprecation banner header. At the end of the
window, v1 returns 410 GONE. All deprecations are announced via the
PSG status page and in the Deprecation response header on the soon-to-be-
retired endpoints.
Deprecation and Sunset response headers in monitoring — both
advertise upcoming retirement./api/v1/public/openapi.json) as the
machine-readable source of truth.