API Stability & Deprecation Policy
This page states what integrators can rely on when building against the TruePPM
REST API, how the API changes between releases, and how deprecations are
announced and retired. It applies to the versioned REST surface under
/api/v1/ and the WebSocket channels documented alongside it.
What the v1 surface covers
Section titled “What the v1 surface covers”The stable, integrator-facing surface is:
- Every path under
/api/v1/documented in the API reference and present in the published OpenAPI schema. - The request and response field names, types, and semantics described in that schema.
- HTTP status codes and error-body shape.
- Authentication flows (JWT, project-scoped API tokens) and the rate-limiting contract.
- The WebSocket channels and event envelopes in the real-time documentation.
- The Idempotency-Key protocol.
The following are explicitly not part of the stable surface and may change at any time without notice:
- The Django admin (
/admin/) and any internal management endpoints. - Undocumented query parameters, response fields, or endpoints not present in the published OpenAPI schema.
- The exact wording of human-readable
detailmessages (the machine-readable status code and errorcodeare stable; the prose is not). - Ordering of list results where no explicit ordering is documented.
- Internal header names beyond the documented ones.
Change classes
Section titled “Change classes”Every change to the API falls into one of three classes.
| Class | Examples | Compatibility |
|---|---|---|
| Additive | A new endpoint, a new optional request field, a new response field, a new enum value on a non-exhaustive field, a new WebSocket event type | Backward-compatible. Ships in any release. |
| Behavioral | A default value change, a validation tightening, a new required-only-on-new-resource constraint | Announced in the changelog. Ships in a minor release; avoided within a series where possible. |
| Breaking | Removing or renaming an endpoint or field, changing a field type, changing an existing status code, making an existing optional field required, removing an enum value | Requires a deprecation window (below) and, at GA, a new API version. |
Clients must tolerate additive change. A conforming client ignores response fields it does not recognize and does not break when a new enum value or a new event type appears. Building a client that rejects unknown fields will cause it to break on an additive change that this policy considers backward-compatible.
Deprecation window & notice
Section titled “Deprecation window & notice”When a breaking change to a stable element becomes necessary, it goes through a deprecation window rather than being removed outright:
- Announcement. The deprecation is called out in the
changelog
under a
ChangedorDeprecatedheading, and the affected endpoint or field is markeddeprecatedin the OpenAPI schema. - Runtime signal. Responses from a deprecated endpoint carry a
Deprecationheader (and, where a replacement exists, aLinkheader pointing at it), so a client can detect reliance on a deprecated surface without reading release notes. - Window. The deprecated element keeps working for at least one full minor release (one 3–4 week release cycle) after the announcement before it may be removed — and never less. Security-critical removals are the only exception and are documented as such.
- Removal. The element is removed only after the window elapses, in a minor release before GA or in the next major version at and after GA.
Versioning approach
Section titled “Versioning approach”- The API is versioned in the URL path (
/api/v1/). This is the version an integrator pins against. - Within
v1, changes follow the change-class rules above: additive changes ship freely; breaking changes go through the deprecation window. - A new URL version (
/api/v2/) is introduced only for breaking changes that cannot be made additively once the surface is frozen. Before that point, while TruePPM is pre-1.0, the deprecation window is the mechanism and nov2is planned. - TruePPM follows semantic versioning for the product as a whole; the API-path version tracks the compatibility of the API surface specifically.
Why this policy ships now
Section titled “Why this policy ships now”Two upcoming surfaces make an early, written contract worthwhile:
- The read-only MCP server shipping in 0.4 exposes the live schedule to MCP clients. Integrators wiring an agent to it need to know which fields and computed values they can depend on across releases.
- The MCP write surface arriving in 0.6 will let automation create and update work. A write client that pins against a moving target is fragile, so the deprecation guarantees above are in place before that surface lands.
Publishing the policy at beta — rather than waiting for the 0.9 freeze — means early integrators build against a known contract from the start. The 0.9 freeze will make the v1 surface permanent; this policy is the promise we hold in the interim.