HOOK order.change_request.created

Snapcaster sends this event when a change request is raised on an order: a buyer asking to ship to another address (address_change), a buyer asking to remove lines or end the order (cancel_lines), or the seller reporting lines that cannot ship as sold (fulfillment_report). Answer a buyer request with POST /orders/{orderId}/change-requests/{requestId}/accept or .../decline; the buyer answers a seller request. An order has at most one pending change request at a time, and shipping the order voids it. data is the request as GET /orders/{orderId}/change-requests returns it, plus seller_id. If you miss an event, read that list: every change to a request also brings the order back into the GET /orders poll. The envelope, signing and retries match order.created; see https://developers.snapcaster.ca/guide/webhook-signing and https://developers.snapcaster.ca/guide/path-b#delivery-semantics. Subscriptions orders and both receive it; an inventory subscription never does. Deduplicate by event_id. Events can arrive out of order, so compare created_at.

Example

Delivery payload: Signed change request created payload
{
  "event_id": "evt_sandbox_01K4A9M2Q7T4X8B1D5F9H3J6KN",
  "type": "order.change_request.created",
  "created_at": "2026-09-04T19:01:12.000Z",
  "data": {
    "id": 381,
    "order_id": "ord_sandbox_01K4A8Y6D4QJH2N3P5R7S9T0VW",
    "kind": "address_change",
    "status": "pending",
    "proposed_by_party": "buyer",
    "created_at": "2026-09-04T19:01:12.000Z",
    "resolved_at": null,
    "lines": null,
    "amount_cents": null,
    "note": null,
    "credits": null,
    "address": {
      "line1": "99 Elm Ave",
      "line2": "Unit 4",
      "city": "Ottawa",
      "province": "ON",
      "postal_code": "K1P 5G4",
      "country": "CA"
    },
    "previous_address": {
      "line1": "123 Main St",
      "line2": null,
      "city": "Toronto",
      "province": "ON",
      "postal_code": "M5V 2T6",
      "country": "CA"
    },
    "seller_id": 42
  },
  "api_version": "2026-10"
}

Signature headers

Snapcaster sends a POST to your webhook endpoint with these headers. Webhook signing shows how to verify them.

X-Snapcaster-Timestamp string required

Unix seconds when the request was signed; reject if outside a ±5 minute window.

X-Snapcaster-Signature string required

sha256= + lowercase hex of HMAC_SHA256(signingSecret, timestamp ‖ raw request body).

Delivery payload

The signed order.change_request.created event.

Payload type: ChangeRequestCreatedEvent

Envelope fields

event_id string required

A globally unique event id that stays the same across retries. Use it to deduplicate deliveries (STABLE).

Example evt_sandbox_01K4A9M2Q7T4X8B1D5F9H3J6KN

type string required

The event type (STABLE).

Constraints: allowed values: order.change_request.created Example order.change_request.created

created_at string required

ISO-8601 UTC instant of the change the event reports; unchanged across retries (STABLE).

Example 2026-09-04T19:01:12.000Z

data ChangeRequestEventData required

The operation or event payload.

api_version string required

The dated API version used for this payload, frozen when Snapcaster queued the delivery. Changing the platform pin does not change queued events or retries; they keep the same version. See https://developers.snapcaster.ca/guide/api-versioning (STABLE).

Constraints: allowed values: 2026-10 Example 2026-10

Payload fields

data.id integer required

The change request id, stable for the life of the request and the {requestId} of its answers (STABLE).

Constraints: exclusive minimum: 0 Example 381

data.order_id string required

The order the request is about (STABLE).

Example ord_sandbox_01K4A8Y6D4QJH2N3P5R7S9T0VW

data.kind string required

address_change: the buyer asks to ship to address instead of previous_address. cancel_lines: the buyer asks to remove lines, or every remaining line to end the order. fulfillment_report: the seller reports that lines cannot ship as sold, and the buyer answers it (STABLE).

Constraints: allowed values: cancel_lines, fulfillment_report, address_change Example address_change

data.status string required

pending until it is answered; a request has no deadline. accepted: the change ran. declined: the answering party refused it and nothing changed. withdrawn: the party who raised it took it back. voided: the order shipped, was cancelled or refunded, its address was corrected, or Snapcaster closed the support conversation the request belonged to, before anyone answered. removed_instead and order_cancelled are the buyer answers to a fulfillment_report that remove every affected line or end the order. expired appears only on requests from before requests stopped lapsing (STABLE).

Constraints: allowed values: pending, accepted, removed_instead, order_cancelled, declined, withdrawn, voided, expired Example pending

data.proposed_by_party string required

Who raised it. The seller answers a buyer request by accepting or declining it; the buyer answers a seller request (STABLE).

Constraints: allowed values: buyer, seller, operator, system Example buyer

data.created_at string required

When the request was raised (STABLE).

Constraints: format: date-time Example 2026-09-04T19:01:12.000Z

data.resolved_at string or null required

When the request left pending; null while it is pending (STABLE).

Constraints: format: date-time Example null

data.lines ChangeRequestLine[] or null required

The lines a cancel_lines or fulfillment_report request names; null on an address_change (STABLE).

Show child fieldsHide child fields
data.lines[].line_ref string required

The purchase line the request names, the same line_ref the order carries (STABLE).

data.lines[].name string required

The line title, or SKU <sku_id> when the catalog had none (STABLE).

data.lines[].quantity integer required

How many units of the line the request covers (STABLE).

Constraints: exclusive minimum: 0

data.lines[].sku_id integer required

The SKU the line was sold as (STABLE).

data.lines[].product_id integer or null required

The product that SKU belongs to; null on a request recorded before it was kept (STABLE).

data.lines[].ordered object required

The card the buyer ordered, as the request recorded it. A fact the request never recorded is null (STABLE).

Show child fieldsHide child fields
data.lines[].ordered.name string or null required

The card title (STABLE).

data.lines[].ordered.set string or null required

The set the printing belongs to; null when it was never recorded (STABLE).

data.lines[].ordered.language string or null required

The printing language; null when it was never recorded (STABLE).

data.lines[].ordered.finish string or null required

The printing or finish, such as Foil; null when never recorded (STABLE).

data.lines[].ordered.rarity string or null required

The rarity; null when it was never recorded (STABLE).

data.lines[].ordered.condition string or null required

The condition grade; null when it was never recorded (STABLE).

data.lines[].ordered.collector_number string or null required

The collector number as the catalog states it, such as 161/302; null when never recorded (STABLE).

data.lines[].action string required

remove on every cancel_lines line and on a report line that removes units. substitute on a report line that ships a replacement named in substitute at a per-unit credit_cents. split on a report line whose units go several ways, listed in dispositions (STABLE).

Constraints: allowed values: remove, substitute, split

data.lines[].substitute ChangeRequestSubstitute or null required

The replacement on a substitute line; null on every other line (STABLE).

Show child fieldsHide child fields
data.lines[].substitute.listing_id integer required

Snapcaster's id for the seller listing offered in place of the line (STABLE).

data.lines[].substitute.sku_id integer required

The SKU the line ships as once the report is accepted (STABLE).

data.lines[].substitute.product_id integer required

The product, the same one the replaced line belongs to (STABLE).

data.lines[].substitute.external_ref string or null required

Your platform's reference on that listing when the report was filed; null when none was sent (STABLE).

data.lines[].substitute.name string or null required

The card title (STABLE).

data.lines[].substitute.set string or null required

The set the printing belongs to; null when it was never recorded (STABLE).

data.lines[].substitute.language string or null required

The printing language; null when it was never recorded (STABLE).

data.lines[].substitute.finish string or null required

The printing or finish, such as Foil; null when never recorded (STABLE).

data.lines[].substitute.rarity string or null required

The rarity; null when it was never recorded (STABLE).

data.lines[].substitute.condition string or null required

The condition grade; null when it was never recorded (STABLE).

data.lines[].substitute.collector_number string or null required

The collector number as the catalog states it, such as 161/302; null when never recorded (STABLE).

data.lines[].substitute.printing string or null required

The same fact as finish, under the catalog name (STABLE).

data.lines[].credit_cents integer or null required

The credit per unit on a substitute line, in cents; null on every other line (STABLE).

data.lines[].dispositions array of object or null required

On a split line, each portion in the order the seller listed them; null on every other line (STABLE).

Show child fieldsHide child fields
data.lines[].dispositions[].action string required

What happens to this portion (STABLE).

Constraints: allowed values: remove, substitute

data.lines[].dispositions[].quantity integer required

How many of the line units go this way (STABLE).

Constraints: exclusive minimum: 0

data.lines[].dispositions[].substitute ChangeRequestSubstitute or null required

The replacement on a substitute line; null on every other line (STABLE).

Show child fieldsHide child fields
data.lines[].dispositions[].substitute.listing_id integer required

Snapcaster's id for the seller listing offered in place of the line (STABLE).

data.lines[].dispositions[].substitute.sku_id integer required

The SKU the line ships as once the report is accepted (STABLE).

data.lines[].dispositions[].substitute.product_id integer required

The product, the same one the replaced line belongs to (STABLE).

data.lines[].dispositions[].substitute.external_ref string or null required

Your platform's reference on that listing when the report was filed; null when none was sent (STABLE).

data.lines[].dispositions[].substitute.name string or null required

The card title (STABLE).

data.lines[].dispositions[].substitute.set string or null required

The set the printing belongs to; null when it was never recorded (STABLE).

data.lines[].dispositions[].substitute.language string or null required

The printing language; null when it was never recorded (STABLE).

data.lines[].dispositions[].substitute.finish string or null required

The printing or finish, such as Foil; null when never recorded (STABLE).

data.lines[].dispositions[].substitute.rarity string or null required

The rarity; null when it was never recorded (STABLE).

data.lines[].dispositions[].substitute.condition string or null required

The condition grade; null when it was never recorded (STABLE).

data.lines[].dispositions[].substitute.collector_number string or null required

The collector number as the catalog states it, such as 161/302; null when never recorded (STABLE).

data.lines[].dispositions[].substitute.printing string or null required

The same fact as finish, under the catalog name (STABLE).

data.lines[].dispositions[].credit_cents integer or null required

The credit per unit for a substitute portion; null for a removal (STABLE).

data.amount_cents integer or null required

The refund, tax included, that accepting a cancel_lines request returns to the buyer, or the refund a fulfillment_report returns when the buyer accepts it. Fixed when the request was raised. Null on an address_change and on an order with no payment (STABLE).

Example null

data.note string or null required

The seller's note to the buyer on a fulfillment_report; null when none was given and on every other kind (STABLE).

Example null

data.credits object or null required

The refund behind each buyer answer to a fulfillment_report, fixed when it was raised; null on every other kind and on an order with no payment (STABLE).

Show child fieldsHide child fields
data.credits.accept_cents integer required

The refund if the buyer accepts the report; repeats amount_cents (STABLE).

data.credits.remove_instead_cents integer required

The refund if the buyer has every affected line removed instead (STABLE).

data.credits.cancel_order_cents integer required

The refund if the buyer ends the whole order instead (STABLE).

data.address OrderWebhookShippingAddress or null required

The shipping address an address_change asks for. Set only on an address_change; null on every other kind (STABLE).

Show child fieldsHide child fields
data.address.line1 string required

The street address.

Example 99 Elm Ave

data.address.line2 string or null required

The unit, suite, or second address line, if supplied.

Example Unit 4

data.address.city string required

The city in the shipping address.

Example Ottawa

data.address.province string required

The Canadian province or territory in the delivery address.

Example ON

data.address.postal_code string required

The Canadian postal code in the delivery address.

Example K1P 5G4

data.address.country string required

ISO 3166-1 alpha-2 country code.

Example CA

data.previous_address OrderWebhookShippingAddress or null required

The shipping address the order had when the address_change was raised. Set only on an address_change; null on every other kind (STABLE).

Show child fieldsHide child fields
data.previous_address.line1 string required

The street address.

Example 123 Main St

data.previous_address.line2 string or null required

The unit, suite, or second address line, if supplied.

Example null

data.previous_address.city string required

The city in the shipping address.

Example Toronto

data.previous_address.province string required

The Canadian province or territory in the delivery address.

Example ON

data.previous_address.postal_code string required

The Canadian postal code in the delivery address.

Example M5V 2T6

data.previous_address.country string required

ISO 3166-1 alpha-2 country code.

Example CA

data.seller_id integer required

The seller that owns the order. Use this id to route the event to the right store (STABLE).

Example 42

Receiver response

200 - Return any 2xx after verifying the event and durably accepting it. This event moves no stock, so its 2xx acknowledges no sale and leaves every stock hold as it was.