/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. Two narrow kinds of change ship with a dated changelog entry instead: bug fixes and stricter validation.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 one of these two paths. The rule above decides the path, not how urgent or small the change feels. Bug fixes and stricter validation are the only exceptions, and they have their own rule below.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
Bug fixes and stricter validation
These two kinds of change ship with a dated Changelog entry, without the 12-month window:- A bug fix. A field or a response did not do what this reference says, and now it does. Example: on 04. 11. 2026
team_member_idstarted to name the staff member who booked a manual transaction, as the reference says, instead of the account owner. - Stricter validation. A value outside the documented limits, or one the server used to repair without telling you, now answers
422with the field name infield_errors[]. Examples: the limits of 01. 11. 2026 and 02. 11. 2026.
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.