Skip to content
snapcasterDevelopers

Changelog

Partner-observable changes to the Marketplace API, newest first.

The baseline dated version: the full partner surface exactly as documented on this page. Introducing versioning changed no wire bytes on the endpoints; the only wire change was additive.

Date
2026-07-07
API version
2026-07

Change

Established the baseline dated partner contract, added API-version metadata to every webhook, and aligned order and listing behaviour with the published contract.

Required action

No baseline migration is required. Parse the documented order, webhook, and listing responses.

Migration or testing

In the sandbox, test a request override with X-Snapcaster-Api-Version and verify webhook signature handling, order money parsing, ISO-8601 timestamps, and terminal listing-write errors.

Additive changes

  • `api_version` added to the webhook envelope for every event family (`order.created`, `order.cancelled`, `order.refunded`, `inventory.adjusted`), stating the dated version the payload was serialized at.
  • The order body now emits the documented STABLE money block — `totals` (subtotal, shipping, tax, grand_total) and `shipping` (method, cost) — on checkout-committed orders, identically on both transports (the `order.created` webhook and the `GET /orders` poll / `GET /orders/{orderId}` detail). Money-less operator orders still omit the blocks, per the tolerate-absence rule.
  • The order body now also emits the documented STABLE `tax` breakdown block — one `{ label, rate, amount }` line per applied tax — on taxed orders, alongside `totals.tax`. The whole block is absent exactly when there is no tax (absent if and only if `totals.tax` = 0), so an untaxed order is byte-for-byte unchanged. It appears on both transports (webhook and poll/detail) within the already-frozen §6.2 shape.
  • `created_at` now ships as the ISO-8601 UTC instant this page has always documented as STABLE (`2026-06-07T18:30:00.000Z`), on the `GET /orders` poll, the `GET /orders/{orderId}` detail, and both the envelope and `data` of every event family. It previously carried Postgres’ own rendering of the stored column (`2026-06-07 18:30:00+00`), which is not ISO-8601: `new Date(...)` parses it only by vendor extension in V8 and rejects it outright in Safari. Recorded as ADDITIVE rather than a version cut because the JSON type is unchanged and the published contract is unchanged - this is the bytes coming into line with the contract, not the contract moving (the conformance-fix carve-out on ADR-0028). A reader that parses the documented ISO-8601 form needs no action; one that pattern-matched the old rendering should parse the instant instead.
  • `SELLER_SOURCE_EXCLUSIVE` added to the error-code enum, returned as 409 from the four listing-write endpoints (single upsert, bulk write, delete, purge) when the authenticated Seller’s declared inventory source is not `platform`. Push writes are reserved for platform-source Sellers, so the refusal is terminal — surface it rather than retrying. Platform-source Sellers are unaffected, as are reads and API-key auth.

Links

Source commit: d308ef9f704f1fd1aaa60d5549d50c45714a8dbc