Migrating from 2025-10 to 2026-05
Start with the cross-cutting changes — they affect every call. Then work through the per-resource sections for the resources your integration uses.
Cross-cutting changes
These changes affect every endpoint regardless of resource.
Request and response envelope
The flat top-level JSON objects of 2026-05 replace the 2025-10 JSON:API
envelope (data.type / data.attributes). Request bodies now send Content-Type: application/json rather than the JSON:API application/vnd.api+json.
Version header
Update the required AndOpen-API-Version header from 2025-10 to 2026-05. In
2026-05 a missing or unrecognised version is rejected with 400 and an
unsupported_api_version error, before the token is checked. See
Versioning.
Pagination
2025-10 paginated lists with a JSON:API links object and an opaque next URL.
2026-05 replaces this with keyset cursors: a list returns a data array and a
boolean has_more, and you fetch the next page by passing the id of the last
item as the after query parameter. See Pagination
for the full model.
Errors
Both versions return an errors array, but the entries change shape. 2025-10
followed JSON:API: each entry carried status and detail, alongside a top-level
jsonapi object. 2026-05 drops the jsonapi object, and each entry now carries
type, code, message, and param. The shape is identical across every
resource. The full type/code taxonomy and its HTTP-status mapping lives on the
Errors page; this section covers only what changed.
Gift requests
Both gift-request endpoints — Create a gift request and Get a gift request — return the new response shape. Create additionally changes its request body.
Flat response object
2026-05 returns a gift request as a flat top-level JSON object — read each field
directly off the response. This replaces the 2025-10 JSON:API envelope, where
the resource sat under data across data.type, data.id, and
data.attributes.
// 2026-05
{ "id": "…", "status": "submitted", "redemption_url": "…", "recipient": { … } }
// 2025-10
{ "data": { "type": "gift_requests", "id": "…", "attributes": { "state": "submitted", "redemption_url": "…" } } }
Access fields directly: giftRequest.status in place of
giftRequest.data.attributes.state.
state is now status
The lifecycle field is status, a top-level field — previously state under
attributes. The values are unchanged: submitted, redeemed, dispatched,
delivered, cancelled.
New response fields: recipient, address, line items, campaign
The 2026-05 gift request response carries data that 2025-10 omitted entirely. A
2025-10 gift request returned only state (now status), redemption_url, and
timestamps — everything below is new.
2026-05 embeds the owned associations — recipient, shipping_address, and
line_items — directly as nested objects, so a single read returns the whole
gift request. Two are nullable, and the null carries meaning:
shipping_addressisnullfor choice-mode gift requests and populated for direct-send ones.line_itemsisnull(never[]) until the items are locked — at creation for direct-send, at redemption for choice-mode.
The campaign is referenced by a new campaign_id field (also absent in 2025-10).
Fetch the full campaign with Get a campaign.
Create request body
The create request flattens too, but watch the recipient. 2025-10 wrapped the
fields in a data.attributes envelope with the recipient's fields alongside
campaign_id; 2026-05 takes a flat body with campaign_id at the top level and
the recipient as a nested recipient object.
// 2026-05
{ "campaign_id": "…", "recipient": { "first_name": "…", "last_name": "…", "email": "…" } }
// 2025-10
{ "data": { "type": "gift_requests", "attributes": { "campaign_id": "…", "first_name": "…", "last_name": "…", "email": "…" } } }
See Create a gift request for the full request shape.
Campaigns
Both campaign endpoints — List campaigns and Get a campaign — change shape in 2026-05: a new response envelope, a different nested-catalogue representation, and a new pagination model on the list.
Flat object, no JSON:API envelope
In 2025-10 a campaign was a JSON:API resource: data.type ("campaigns"),
data.id, and the fields nested under data.attributes. In 2026-05 a campaign
is a flat top-level object — id, name, status, and the rest sit at the top
level, with no type or attributes wrapper.
state is now status
The state attribute is renamed to status. Its two public values are
unchanged — available and archived.
Catalogue is inline, not in included — and include is gone
This is the largest change. In 2025-10 the nested catalogue was returned through
JSON:API compound documents: the campaign held relationships with resource
identifiers, the actual product / variant / stock-level / warehouse records lived
in a sibling included array, and you opted into them with the
include=products.variants.variant_stock_levels.warehouse query parameter.
In 2026-05 the catalogue is always returned inline and fully nested, with no opt-in:
productsis an array directly on the campaign.- each product carries its
variantsinline, - each variant carries its
stock_levelsinline (renamed fromvariant_stock_levels), - and each stock level carries its
warehouseinline.
Two knock-on renames to watch for: the variant_stock_levels relationship is
now the stock_levels array, and a stock level's available count is now
quantity.
Because the tree is always inline, the include query parameter no longer
exists; remove it from your requests. Which products, variants, and stock levels
appear is instead governed by the campaign's fulfilment warehouse — when one is
set the catalogue is filtered to it (and each variant exposes a single,
warehouse-scoped stock level); campaigns without a warehouse return the
catalogue unfiltered. See Get a campaign for the detail.
List pagination
The campaign list moves to the cursor model described under Pagination
above. Two campaigns-specific points: the page is capped at 25 (limit default and
maximum 25, because each item carries its full nested catalogue), and the list gains
sort and status filter parameters. See List campaigns.
Webhooks
Webhook deliveries change shape the same way responses do, so update your handler before you point it at 2026-05.
- Payload. 2025-10 delivered a JSON:API document; 2026-05 delivers a flat JSON object in the same shape the API returns for that resource. Parse it like any other 2026-05 response.
- Content type. The delivery's
Content-Typeis nowapplication/json, notapplication/vnd.api+json. - New headers. 2026-05 adds
AndOpen-Webhook-Event-TypeandAndOpen-Webhook-API-Version, and exposes the event ID as anAndOpen-Webhook-Event-Idheader — in 2025-10 it was carried in the payload. The signature and replay-protection scheme is unchanged, so existing verification code keeps working.
See Webhooks for the full payload and verification details.