The Seller API is versioned at three layers:
- URL version:
/api/seller/v1/*is the canonical public route family for the current major contract (including finance under/api/seller/v1/finance/*). Every unversioned/api/seller/<segment>/*path redirects to its/v1/form — the URL a doc shows is the URL that responds. - Date contract header: every response includes
X-Avrix-Api-Versioncarrying the effective contract date for that request. The stamped default is2026-04-29;2026-09-01is also supported as an opt-in pin (see Supported contract dates). This is the authoritative version marker — the OpenAPIinfo.versioncarries the default. Partners may send the same header on requests; unsupported values return400 UNSUPPORTED_API_VERSION. - Legacy major marker (deprecated): every response also includes
X-Api-Version: 1. It is deprecated — still emitted for compatibility and never bumped; do not build logic on it. - Webhook event version: every webhook delivery includes
eventVersionin the JSON body andX-Avrix-Event-Versionin headers.
Precedence: URL family (/v1) scopes the route surface; X-Avrix-Api-Version (date
contract) governs field-level compatibility within that surface; X-Api-Version carries no
compatibility meaning. When markers appear to disagree, the date contract wins.
OAuth routes use /api/seller/oauth/* (no /v1/ segment) but still emit both version headers.
Partner-facing guide notes and contract announcements also appear in the Changelog (documentation waves and notable partner notes). Treat that file as complementary to this page — breaking field/route changes are still governed here.
Response version headers (both are intentional)#
| Header | Meaning | Pin? |
|---|---|---|
X-Api-Version | Deprecated legacy major marker (1) | No — informational only, never bumped |
X-Avrix-Api-Version | Date contract (e.g. 2026-04-29) | Yes — use this for compatibility and changelogs |
Do not treat X-Api-Version: 1 as a substitute for the date contract.
Request Header#
Partners may send:
X-Avrix-Api-Version: 2026-04-29
Unsupported future versions must not silently change behavior in production. Sandbox may support X-Avrix-Api-Version: next for dry-run warnings before a breaking migration.
Supported contract dates#
| Date | Status | Behavior differences |
|---|---|---|
2026-04-29 | Stamped default for unpinned requests before 2026-09-01 UTC | Launch contract. POST /orders/bulk with omitted strict allows partial success. |
2026-09-01 | Supported pin; stamped default from 2026-09-01 UTC (automatic cutover, no deploy) | POST /orders/bulk defaults omitted strict to true (whole-cart atomicity; send strict: false explicitly to opt back into partial success). No other behavior changes. |
next | Alias | Resolves to the newest supported date (currently 2026-09-01) for dry-running upcoming defaults. |
Responses echo the effective date in the X-Avrix-Api-Version header — and
POST /orders/bulk additionally echoes meta.contractDate + meta.strict in
the body — so a client can assert which behavior profile served each call.
From 2026-09-01 (UTC) unpinned requests are served the 2026-09-01
contract automatically; pin 2026-04-29 if you depend on partial-success bulk
carts.
Forward compatibility (required)#
Clients MUST:
- Ignore unknown JSON fields in responses and webhook payloads.
- Ignore unknown enum values they do not understand (do not fail closed solely because a new enum member appeared).
Avrix may add optional fields and new enum members without bumping the major URL family. Strict parsers that reject unknowns will break on additive releases.
Breaking Change Policy#
Avrix does not release any of the following without a versioned rollout, compatibility mode, or migration notice:
- New mandatory request fields.
- Removed or renamed response fields.
- Removed enum values or webhook event names.
- Changed webhook payload meaning.
- Stricter commercial metadata enforcement for existing production keys.
Recent breaking changes#
| Change | Effective | Migration |
|---|---|---|
POST /orders — orderReference is now required (non-empty, max 255). | Pre-GA (v1) | Send your store order id on every create-order call. Duplicate-order detection and replay scoping key off orderReference + allocation, so an order without one cannot be de-duplicated server-side. POST /orders/preview, POST /orders/reserve and POST /keys/pull are unchanged. Requests omitting it now return 422 VALIDATION_FAILED. |
POST /orders/bulk — omitted strict defaults to true on contract dates >= 2026-09-01. | Opt-in via X-Avrix-Api-Version: 2026-09-01 (or next); not yet the stamped default | Send strict explicitly (recommended: true) and the default never affects you. Clients that rely on partial-success carts must send strict: false when pinning 2026-09-01, or stay on 2026-04-29 until migrating. |
Deprecation Communication#
Avrix publishes changelog / guide entries before removing fields. The Active deprecations table lists a Sunset date when a removal is scheduled. There is no universal fixed-day SLA in product policy beyond that commitment.
Seller API responses do not emit Deprecation / Sunset headers by default.
The mechanism is in place for contract dates: when a pinned X-Avrix-Api-Version
value is scheduled for removal, the platform marks that contract date as
deprecated and publishes a sunset date, and responses pinned to that date carry
Deprecation: true, Sunset: <HTTP-date> and Link: <…/versioning>; rel="deprecation"
(all three are CORS-exposed). Requests on a current date never see them.
When a concrete sunset is scheduled for a field or route, we will:
- Document the change and sunset date on this page and in the Changelog / release notes.
- Start emitting
Deprecation: trueandSunset: <HTTP-date>on affected responses (and re-add those names toAccess-Control-Expose-Headers). - Keep
X-Avrix-Api-Versionas the stable version signal until then.
A public RSS/JSON deprecation feed remains a productized delivery surface for the developer hub.
Active deprecations#
| Surface | Deprecated | Replacement | First notice | Sunset |
|---|---|---|---|---|
GET /products, GET /catalog/snapshot, GET /products/{id} — product status field | Legacy 4-state lifecycle rollup (draft / active / discontinued / archived). Still emitted, now derived from the lifecycle dimensions (values unchanged). | launchPhase (draft / announced / pre_order / available), tradingState (open / paused / discontinued), isArchived (boolean) on the same responses | 2026-08-03 | Not scheduled — headers stay off per policy above |
GET /products/{id} — release status field | Legacy release status string. | Release-level launchPhase / tradingState (effective values: override inheritance + date auto-advance) | 2026-08-03 | Not scheduled |
GET /products — status query parameter | Filters on the derived legacy rollup; visible products always match active. | Client-side filtering on launchPhase / tradingState / isArchived | 2026-08-03 | Not scheduled |
Webhook product.updated / product.delisted — productStatus field | Legacy rollup in webhook payloads (derived; values unchanged). | launchPhase / tradingState / isArchived in the same payloads | 2026-08-03 | Not scheduled |
Compatibility Modes#
Per-key compatibility mode is the preferred migration control. Old keys can remain on a previous behavior profile while new keys default to strict commercial metadata and contract authority gates. Compatibility mode must never bypass:
- Authentication, scopes, environment matching, or IP allowlists.
- Contract authority final checks.
- Idempotency for commercial mutations.
- PII redaction.
- Returned-key quarantine.
Webhook Payloads#
Webhook handlers should store and dedupe by eventId. eventVersion tells handlers which payload schema they received. Webhook delivery is at-least-once and not globally ordered; process events idempotently and reconcile using API reads when a handler was down.
Catalog delta feed (GET /catalog/changes)#
Use since (ISO-8601) as the initial cursor: the server returns events with occurredAt
strictly after since (exclusive). Each row is added, updated, or removed
(tombstone) and carries changedFields[] so you refetch only changed facets. Page with limit
(default 500, max 5000) and follow meta.nextCursor until it is absent. Pair with
/catalog/snapshot and periodic /catalog/checksum; if checksum drifts or your cursor is older
than the published retention window, cold-start. See
Catalog and allocations.