/v1/. Inside v1, one rule protects every integration:
Additive-only. From general availability on 27. 09. 2026, every change inside v1 is additive: new endpoints, new optional request fields, new response fields, new enum values in open sets, new webhook events. Removing or renaming a field, retyping it, repurposing what it means, or changing the status code or error code of an existing response is a breaking change. Breaking changes are announced in the Changelog before they ship.Because additions are the only planned change class, correct consumers are naturally forward-compatible. Three habits make that true on your side:
- Ignore unknown fields when parsing responses and webhook payloads (every mainstream JSON library does this by default).
- Treat documented-open sets as open:
Transaction.sourceand other extensible vocabularies say so in their descriptions. Closed sets (marked with a JSON Schemaenum) only grow with a documented changelog entry. - Branch on
error.code, never onerror.message. Error messages are text for people. We may reword them, for example to remove internal detail, and we note larger rewording in the changelog.
Additive vs. breaking, at a glance
Every change proposed inside v1 takes exactly one of these two paths - there is no third option, and which path it takes is decided by the rule above, not by how urgent or small the change feels.Additive changes ship the moment they're ready. Breaking changes are announced first and coexist with the old behavior for at least 12 months before anything is removed.
Additive - safe, ships anytime, no announcement needed
Additive - safe, ships anytime, no announcement needed
- A new endpoint
- A new optional request field
- A new response field
- A new value added to a documented open set (like
Transaction.source) - A new webhook event type
Breaking - announced first, never silent
Breaking - announced first, never silent
- Removing an endpoint, a field, or a webhook event
- Renaming a field
- Retyping a field
- Repurposing what an existing field means
- Changing the status code or error code of an existing response
- Adding a value to a closed set (marked with a JSON Schema
enum) outside a documented changelog entry
Webhooks are pinned per endpoint
Each webhook endpoint is pinned to the API version that is current when you create it (currently2026-07), so the payload shape delivered to that endpoint never changes underneath your consumer. You cannot choose the version yourself. When a newer version exists, you upgrade without downtime:
- Create a second endpoint. It is pinned to the newest version.
- Prove your receiver with
POST /v1/webhook_endpoints/{id}/test. - Cut your consumer over, delete the old endpoint.
Deprecation
If we ever need to retire something inside v1 (rare by design):- It is marked deprecated in the reference and the changelog, with the replacement named.
- It keeps working, unchanged, for at least 12 months from the deprecation notice.
- Removal only ships in a new major version (
/v2/), never inside v1.
v2, if it ever exists, runs side by side with v1; nothing forces a migration on a schedule you didn’t choose.