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.