v1, and it
applies to both API surfaces:
- Chataigne API —
https://server.chataigne.ai/v1 - Admin API —
https://server.chataigne.ai/admin/v1
/v2, /v3, …). You upgrade by changing one segment of the URL — on your schedule,
not ours.
There is no
x-api-version header and no per-account “API version” pin. The version is the
path. The URL you call is the contract you get.The version is in the path
Every request targets an explicit major version. Pin it in your base URL and you are insulated from breaking changes for the life of that version.What’s additive (non-breaking)
Additive changes can land at any time withinv1 without notice. Your integration must tolerate
them. The following are non-breaking and will roll out continuously:
- Adding new endpoints, resources, or HTTP methods on existing resources.
- Adding new optional fields to a response object (e.g. a new property on a
location). - Adding new optional request parameters that default to today’s behavior when omitted.
- Adding new values to an existing field that is documented as open-ended (e.g. a new
currencyorcountrybecoming supported). - Adding new expandable fields for
expand[]. - Adding new error
codevalues within an existing errortype. - Adding new response headers, or new properties to the
errorobject such asdetails. - Making a previously required request parameter optional, or relaxing a validation rule.
Write forward-compatible clients. Ignore fields you don’t recognize, don’t fail on
unknown enum values, and don’t assume the set of keys in a response is fixed. A client that
follows these rules will never break on an additive change.
location response may gain fields over time. Today it returns
id, object, name, currency, country, timezone, default_language, address,
created_at, and updated_at — but your code should read the fields it needs and pass the rest
through untouched.
Example: a location response may grow over time
What’s breaking
A change is breaking if a correct, well-behaved client could stop working because of it. Breaking changes are never made in place withinv1. They are only introduced in a new
major version. These include:
- Removing or renaming an endpoint, resource, field, or
expand[]target. - Removing or repurposing an existing field’s meaning, type, or format.
- Adding a new required request parameter, or tightening validation on existing input.
- Changing default values or the default behavior of an endpoint.
- Changing pagination, filtering, or default ordering semantics (e.g. the
limitbounds of1..100, the default of10, or the default sort bycreated_at). - Changing the structure of the list envelope (
object,data,has_more,url). - Changing an error
type→ HTTP status mapping (e.g. moving a case from409to400). - Removing or repurposing a documented response header.
- Changing the authentication or authorization model of a surface — for example, which key
prefix (
ch_org_vs.ch_admin_) is accepted on which surface.
How breaking changes are rolled out
When we need to make a breaking change, we ship a new major version path and run both versions in parallel. The rollout is deliberate and predictable:1. Announce
The new version, its breaking changes, and a migration guide are published in the
Changelog before it becomes the recommended version.
2. Run in parallel
The previous version keeps working at its existing path.
v1 and v2 are served side by
side — no flag day, no forced cutover.3. Migrate on your schedule
You upgrade by changing the path segment in your base URL and adapting to the documented
breaking changes. Test against the new version while production stays on the old one.
4. Deprecate with notice
When an old version is eventually retired, we communicate the timeline well in advance via
the Changelog. Until then, the version you pinned keeps behaving exactly as it does today.
Building a version-resilient integration
A few habits keep your integration stable across the entire life of a major version:Hardcode
/v1 (ideally via a single constant). Never rely on a default or “latest” path.Parse the fields you use and ignore the rest. New optional fields will appear over time.
Treat fields like
currency, country, and error code as extensible. Handle the values
you know and degrade gracefully on the ones you don’t.Branch on the stable
error.type (e.g. rate_limit_error) rather than parsing
error.message, which is human-readable and may be reworded within a version.Capture
X-Request-Id (mirrored as error.request_id) so version-related issues are fast to
diagnose with support.Subscribe to the Changelog — it is the single source of truth for both additive
changes shipped to
v1 and any future major-version announcements.