Changelog
Every change that touches the public API surface is recorded here, newest first. Internal changes that don't affect integrators live in the intranet release notes instead.
This document deliberately collects many small commits so the Revisions view on this page has meaningful history to demonstrate — open the right-rail History panel.
2026-05-30 — Refunds API
POST /v1/orders/{id}/refunds now accepts a structured reason field. Allowed values:
requested_by_customer, duplicate, fraudulent. The previous free-text note field is
deprecated and will be removed in v2 (end of 2026); use metadata.note to carry context across.
2026-05-22 — Webhook delivery v2
Webhook deliveries now retry with exponential backoff up to 24 hours instead of the prior 4 hours.
The X-ZephyrCart-Delivery-Attempt header now starts at 1 (was 0) for clarity.
2026-05-15 — Tax zones in Sweden
Added tax_zone.se-* for Swedish counties to support the new VAT reporting requirements that took
effect on May 1.
2026-05-08 — Stripe Tax handoff
When payment_method.stripe.use_stripe_tax = true, tax calculation is delegated to Stripe Tax
instead of ZephyrCart's internal engine. The order's tax_calculation_source field reflects which
engine ran.
2026-04-30 — Customer merge
POST /v1/customers/{id}/merge now consolidates carts, orders, and stored payment methods from
the target into the source customer. Previously only the email and shipping address were merged.
2026-04-22 — Bulk cart fetch
GET /v1/carts?ids=... supports up to 100 IDs per request (was 25). Useful for storefronts that
want to reconcile carts after a partial outage.
2026-04-14 — Idempotency keys
All POST endpoints now accept the Idempotency-Key header. Retries within 24 hours with the same
key return the original response instead of creating a duplicate resource.