API reference · Sandbox
Have the sandbox buyer ask for a change
/sandbox/orders/{orderId}/change-requestsSandbox only: the production API does not serve this operation. Snapcaster's sandbox buyer asks the seller for a change to an order, exactly as a buyer does from their order page: an address_change to another address in the same province before the order ships (a test purchase ships to Vancouver, BC, so send another BC address), or a cancel_lines removal of some or all of its cards. It works only on an order from this seller's own test purchase; any other order returns 404 ORDER_NOT_FOUND. Snapcaster opens the order's support conversation if none is open, emails the seller and sends order.change_request.created, the same as for a real buyer. Answer it with POST /orders/{orderId}/change-requests/{requestId}/accept or /decline. A retry with the same Idempotency-Key and body replays the first response. Returns the pending request.
Example
These examples send requests to the sandbox.
Replace the example orderId in the URL with your own.
curl --request POST \
--url 'https://api-sandbox.snapcaster.ca/api/v1/marketplace/sandbox/orders/ord_sandbox_01K4A8Y6D4QJH2N3P5R7S9T0VW/change-requests' \
--header "Authorization: Bearer $MARKETPLACE_API_KEY" \
--header "Idempotency-Key: $(uuidgen)" \
--header 'Content-Type: application/json' \
--data '{
"kind": "address_change",
"payload": {
"address": {
"line1": "555 Granville St",
"line2": "Unit 4",
"city": "Vancouver",
"province": "BC",
"postal_code": "V6C 1T2",
"country": "CA"
}
}
}'$(uuidgen) makes a new Idempotency-Key each time you run the command. To retry a command after a lost response, send the key from the first attempt.
{
"success": true,
"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": "555 Granville St",
"line2": "Unit 4",
"city": "Vancouver",
"province": "BC",
"postal_code": "V6C 1T2",
"country": "CA"
},
"previous_address": {
"line1": "123 Test Street",
"line2": null,
"city": "Vancouver",
"province": "BC",
"postal_code": "V6B 1A1",
"country": "CA"
}
}
}Endpoint
| Environment | URL |
|---|---|
| Sandbox | https://api-sandbox.snapcaster.ca/api/v1/marketplace |
marketplaceApiKey-http bearer. Send the seller's marketplace API key asAuthorization: Bearer mp_{sellerCode}_{hex}. Themp_{sellerCode}_prefix identifies the seller; the trailing hex is the secret. The seller generates the key and supplies it to your platform.
Request
Path parameters
orderIdstring requiredThe opaque public order id (the webhook/poll
order_id).Constraints: minimum length: 1 Example
ord_sandbox_01K4A8Y6D4QJH2N3P5R7S9T0VW
Headers
Idempotency-Keystring requiredKeep this UUID when retrying the same order operation and body. Keys remain valid for the lifetime of the order. Changed contents return 409 IDEMPOTENCY_CONFLICT; a concurrent attempt returns 409 REQUEST_IN_PROGRESS with Retry-After.
Constraints: format: uuid Example
f04e4a96-3c99-44dc-abce-5b6862c589c9X-Snapcaster-Api-VersionstringOverride the platform pin for this request only. Webhook versions and the platform pin do not change.
Constraints: allowed values:
2026-10Example2026-10
Request body
Request body (application/json): Create
kindstring requiredConstraints: allowed values:
cancel_lines,address_changeExampleaddress_changepayloadobject requiredConstraints: additional properties are not allowed
Show child fieldsHide child fields
payload.array of object conditionallines Required when
kindiscancel_lines. The subset at the (order × SKU) grain the termination commands use;quantityomitted means the line’s whole remaining quantity, a smallerquantityremoves that many units. Every remaining unit at once is the full-order termination: the BUYER may ask for it (the seller still grants or declines), the SELLER may not - their full cancel is unilateral, so they run it directly.Constraints: minimum items: 1
Show child fieldsHide child fields
payload.stringlines[]. lineRef The purchase-line ref (
oln_…) of the order line this entry names, read from the order's own lines. Name a line bylineRefor byskuId;lineRefis needed only when the SKU is on more than one line the command can still act on.Constraints: pattern:
^oln_[0-9a-f]{32}$payload.integerlines[]. skuId The SKU of the order line this entry names. Name a line by
skuIdor bylineRef. When the SKU is on more than one line the command can still act on, the command answersORDER_LINE_AMBIGUOUSwith the candidatelineRefs; name the line by one of them. Supply exactly one oflineRefandskuId.Constraints: exclusive minimum: 0
payload.integerlines[]. quantity The number of units.
Constraints: exclusive minimum: 0
payload.object conditionaladdress Required when
kindisaddress_change.Constraints: additional properties are not allowed
Show child fieldsHide child fields
payload.string requiredaddress. line1 The street address.
Constraints: minimum length: 1; maximum length: 255 Example
555 Granville Stpayload.string or nulladdress. line2 The unit, suite, or second address line, if supplied.
Constraints: maximum length: 255 Example
Unit 4payload.string requiredaddress. city The city in the shipping address.
Constraints: minimum length: 1; maximum length: 255 Example
Vancouverpayload.string requiredaddress. province The Canadian province or territory in the delivery address.
Example
BCpayload.string requiredaddress. postal_code The Canadian postal code in the delivery address.
Example
V6C 1T2payload.string requiredaddress. country Constraints: allowed values:
CAExampleCA
messagestringAn optional note threaded on the ticket the request rides.
Constraints: minimum length: 1; maximum length: 10000
Response
201
The pending change request, proposed_by_party: buyer.
Response body: Change
successboolean requiredWhether the operation completed as requested.
Constraints: allowed values:
trueExampletruedataChangerequiredRequest The operation or event payload.
Show child fieldsHide child fields
data.integer requiredid The change request id, stable for the life of the request and the
{requestId}of its answers (STABLE).Constraints: exclusive minimum: 0 Example
381data.string requiredorder_id The order the request is about (STABLE).
Example
ord_sandbox_01K4A8Y6D4QJH2N3P5R7S9T0VWdata.string requiredkind address_change: the buyer asks to ship toaddressinstead ofprevious_address.cancel_lines: the buyer asks to removelines, or every remaining line to end the order.fulfillment_report: the seller reports thatlinescannot ship as sold, and the buyer answers it (STABLE).Constraints: allowed values:
cancel_lines,fulfillment_report,address_changeExampleaddress_changedata.string requiredstatus pendinguntil 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_insteadandorder_cancelledare the buyer answers to afulfillment_reportthat remove every affected line or end the order.expiredappears only on requests from before requests stopped lapsing (STABLE).Constraints: allowed values:
pending,accepted,removed_instead,order_cancelled,declined,withdrawn,voided,expiredExamplependingdata.string requiredproposed_by_party Who raised it. The seller answers a
buyerrequest by accepting or declining it; the buyer answers asellerrequest (STABLE).Constraints: allowed values:
buyer,seller,operator,systemExamplebuyerdata.string requiredcreated_at When the request was raised (STABLE).
Constraints: format: date-time Example
2026-09-04T19:01:12.000Zdata.string or null requiredresolved_at When the request left
pending; null while it is pending (STABLE).Constraints: format: date-time Example
nulldata.lines Changeor null requiredRequest Line[] The lines a
cancel_linesorfulfillment_reportrequest names; null on anaddress_change(STABLE).Show child fieldsHide child fields
data.string requiredlines[]. line_ref The purchase line the request names, the same
line_refthe order carries (STABLE).data.string requiredlines[]. name The line title, or
SKU <sku_id>when the catalog had none (STABLE).data.integer requiredlines[]. quantity How many units of the line the request covers (STABLE).
Constraints: exclusive minimum: 0
data.integer requiredlines[]. sku_id The SKU the line was sold as (STABLE).
data.integer or null requiredlines[]. product_id The product that SKU belongs to; null on a request recorded before it was kept (STABLE).
data.object requiredlines[]. ordered 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.string or null requiredlines[]. ordered. name The card title (STABLE).
data.string or null requiredlines[]. ordered. set The set the printing belongs to; null when it was never recorded (STABLE).
data.string or null requiredlines[]. ordered. language The printing language; null when it was never recorded (STABLE).
data.string or null requiredlines[]. ordered. finish The printing or finish, such as
Foil; null when never recorded (STABLE).data.string or null requiredlines[]. ordered. rarity The rarity; null when it was never recorded (STABLE).
data.string or null requiredlines[]. ordered. condition The condition grade; null when it was never recorded (STABLE).
data.string or null requiredlines[]. ordered. collector_number The collector number as the catalog states it, such as
161/302; null when never recorded (STABLE).
data.string requiredlines[]. action removeon everycancel_linesline and on a report line that removes units.substituteon a report line that ships a replacement named insubstituteat a per-unitcredit_cents.spliton a report line whose units go several ways, listed indispositions(STABLE).Constraints: allowed values:
remove,substitute,splitdata.lines[]. substitute Changeor null requiredRequest Substitute The replacement on a
substituteline; null on every other line (STABLE).Show child fieldsHide child fields
data.integer requiredlines[]. substitute. listing_id Snapcaster's id for the seller listing offered in place of the line (STABLE).
data.integer requiredlines[]. substitute. sku_id The SKU the line ships as once the report is accepted (STABLE).
data.integer requiredlines[]. substitute. product_id The product, the same one the replaced line belongs to (STABLE).
data.string or null requiredlines[]. substitute. external_ref Your platform's reference on that listing when the report was filed; null when none was sent (STABLE).
data.string or null requiredlines[]. substitute. name The card title (STABLE).
data.string or null requiredlines[]. substitute. set The set the printing belongs to; null when it was never recorded (STABLE).
data.string or null requiredlines[]. substitute. language The printing language; null when it was never recorded (STABLE).
data.string or null requiredlines[]. substitute. finish The printing or finish, such as
Foil; null when never recorded (STABLE).data.string or null requiredlines[]. substitute. rarity The rarity; null when it was never recorded (STABLE).
data.string or null requiredlines[]. substitute. condition The condition grade; null when it was never recorded (STABLE).
data.string or null requiredlines[]. substitute. collector_number The collector number as the catalog states it, such as
161/302; null when never recorded (STABLE).data.string or null requiredlines[]. substitute. printing The same fact as
finish, under the catalog name (STABLE).
data.integer or null requiredlines[]. credit_cents The credit per unit on a
substituteline, in cents; null on every other line (STABLE).data.array of object or null requiredlines[]. dispositions On a
splitline, each portion in the order the seller listed them; null on every other line (STABLE).Show child fieldsHide child fields
data.string requiredlines[]. dispositions[]. action What happens to this portion (STABLE).
Constraints: allowed values:
remove,substitutedata.integer requiredlines[]. dispositions[]. quantity How many of the line units go this way (STABLE).
Constraints: exclusive minimum: 0
data.lines[]. dispositions[]. substitute Changeor null requiredRequest Substitute The replacement on a
substituteline; null on every other line (STABLE).Show child fieldsHide child fields
data.integer requiredlines[]. dispositions[]. substitute. listing_id Snapcaster's id for the seller listing offered in place of the line (STABLE).
data.integer requiredlines[]. dispositions[]. substitute. sku_id The SKU the line ships as once the report is accepted (STABLE).
data.integer requiredlines[]. dispositions[]. substitute. product_id The product, the same one the replaced line belongs to (STABLE).
data.string or null requiredlines[]. dispositions[]. substitute. external_ref Your platform's reference on that listing when the report was filed; null when none was sent (STABLE).
data.string or null requiredlines[]. dispositions[]. substitute. name The card title (STABLE).
data.string or null requiredlines[]. dispositions[]. substitute. set The set the printing belongs to; null when it was never recorded (STABLE).
data.string or null requiredlines[]. dispositions[]. substitute. language The printing language; null when it was never recorded (STABLE).
data.string or null requiredlines[]. dispositions[]. substitute. finish The printing or finish, such as
Foil; null when never recorded (STABLE).data.string or null requiredlines[]. dispositions[]. substitute. rarity The rarity; null when it was never recorded (STABLE).
data.string or null requiredlines[]. dispositions[]. substitute. condition The condition grade; null when it was never recorded (STABLE).
data.string or null requiredlines[]. dispositions[]. substitute. collector_number The collector number as the catalog states it, such as
161/302; null when never recorded (STABLE).data.string or null requiredlines[]. dispositions[]. substitute. printing The same fact as
finish, under the catalog name (STABLE).
data.integer or null requiredlines[]. dispositions[]. credit_cents The credit per unit for a
substituteportion; null for a removal (STABLE).
data.integer or null requiredamount_cents The refund, tax included, that accepting a
cancel_linesrequest returns to the buyer, or the refund afulfillment_reportreturns when the buyer accepts it. Fixed when the request was raised. Null on anaddress_changeand on an order with no payment (STABLE).Example
nulldata.string or null requirednote The seller's note to the buyer on a
fulfillment_report; null when none was given and on every other kind (STABLE).Example
nulldata.object or null requiredcredits 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.integer requiredcredits. accept_cents The refund if the buyer accepts the report; repeats
amount_cents(STABLE).data.integer requiredcredits. remove_instead_cents The refund if the buyer has every affected line removed instead (STABLE).
data.integer requiredcredits. cancel_order_cents The refund if the buyer ends the whole order instead (STABLE).
data.address Orderor null requiredWebhook Shipping Address The shipping address an
address_changeasks for. Set only on anaddress_change; null on every other kind (STABLE).Show child fieldsHide child fields
data.string requiredaddress. line1 The street address.
Example
555 Granville Stdata.string or null requiredaddress. line2 The unit, suite, or second address line, if supplied.
Example
Unit 4data.string requiredaddress. city The city in the shipping address.
Example
Vancouverdata.string requiredaddress. province The Canadian province or territory in the delivery address.
Example
BCdata.string requiredaddress. postal_code The Canadian postal code in the delivery address.
Example
V6C 1T2data.string requiredaddress. country ISO 3166-1 alpha-2 country code.
Example
CA
data.previous_address Orderor null requiredWebhook Shipping Address The shipping address the order had when the
address_changewas raised. Set only on anaddress_change; null on every other kind (STABLE).Show child fieldsHide child fields
data.string requiredprevious_address. line1 The street address.
Example
123 Test Streetdata.string or null requiredprevious_address. line2 The unit, suite, or second address line, if supplied.
Example
nulldata.string requiredprevious_address. city The city in the shipping address.
Example
Vancouverdata.string requiredprevious_address. province The Canadian province or territory in the delivery address.
Example
BCdata.string requiredprevious_address. postal_code The Canadian postal code in the delivery address.
Example
V6B 1A1data.string requiredprevious_address. country ISO 3166-1 alpha-2 country code.
Example
CA
Errors
Errors return a Marketplace body, except HTTP 413, 500 (Api). Error codes explains both error bodies and lists every code.
400
INVALID_REQUESTIDEMPOTENCY_KEY_REQUIREDORDER_LINE_AMBIGUOUSUNSUPPORTED_API_VERSIONInvalid command body, missing/invalid UUID Idempotency-Key, or a
skuIdon more than one line the command can still act on (ORDER_LINE_AMBIGUOUS, with the candidatelineRefsindetails). Unknown or retired API-version override (UNSUPPORTED_API_VERSION).Do this: Correct the request fields and supply a UUID Idempotency-Key. For ORDER_LINE_AMBIGUOUS, name that line by one of the
lineRefvalues indetails. Keep the same key when retrying the same command. For UNSUPPORTED_API_VERSION, choose a supported version from the API versioning guide.401
UNAUTHORIZEDMissing or invalid marketplace API key (
UNAUTHORIZED).Do this: Send the marketplace API key for this seller as a Bearer token, then retry.
403
SUBSCRIPTION_EXCLUDES_ORDERSThe platform's subscription is
inventory, which does not include orders (SUBSCRIPTION_EXCLUDES_ORDERS). Onlyordersandbothsubscriptions read and act on orders.Do this: Do not retry. Ask Snapcaster to change the platform subscription to
ordersorbothif the platform should handle orders.404
ORDER_NOT_FOUNDNo order matches this id for the authenticated seller (
ORDER_NOT_FOUND). Another seller's order also returns 404, so the response does not reveal whether it exists. An order of this seller that no test purchase of this seller created also returns 404 (ORDER_NOT_FOUND): the sandbox buyer acts only on orders fromPOST /sandbox/test-purchases.Do this: Use an order_id from GET /sandbox/test-purchases/{ref} for this seller.
409
IDEMPOTENCY_CONFLICTREQUEST_IN_PROGRESSORDER_CHANGE_REQUEST_ALREADY_PENDINGSUPPORT_CASE_CLOSEDIDEMPOTENCY_CONFLICT or REQUEST_IN_PROGRESS. Retry an in-progress command with the same key after Retry-After seconds. ORDER_CHANGE_REQUEST_ALREADY_PENDING when the order already has a pending change request, from either party;
detailscarries its id. SUPPORT_CASE_CLOSED when Snapcaster closed the order's support conversation while the request was being opened.Do this: For REQUEST_IN_PROGRESS, wait Retry-After seconds and retry the same key and body. For IDEMPOTENCY_CONFLICT, reuse the original body or create a new UUID for a different operation. For ORDER_CHANGE_REQUEST_ALREADY_PENDING, answer or withdraw the pending request first. For SUPPORT_CASE_CLOSED, retry with a new key.
413
PAYLOAD_TOO_LARGEThe body is larger than this route accepts (
PAYLOAD_TOO_LARGE).Do this: Send a smaller body and retry.
422
ORDER_CHANGE_REQUEST_NOT_ALLOWEDINVALID_TRANSITIONSUPPORT_CASE_WINDOW_CLOSEDThe buyer could not ask for this change, with the codes the buyer gets.
ORDER_CHANGE_REQUEST_NOT_ALLOWED: the order is cancelled or refunded, or anaddress_changecame after it shipped.INVALID_TRANSITION: a line has nothing left to remove.SUPPORT_CASE_WINDOW_CLOSED: the order is too old for a support conversation.Do this: Do not retry the same body. Read the message, then change the request.
500
INTERNAL_ERRORAn unexpected failure (
INTERNAL_ERROR).Do this: Retry with bounded retries and jitter. If the failure persists, contact Snapcaster with the X-Correlation-ID response header.
503
TEST_PURCHASE_NOT_AVAILABLEThis deployment cannot act as the sandbox buyer right now (
TEST_PURCHASE_NOT_AVAILABLE): it is not the sandbox, its payments are not in test mode, or its sandbox buyer is missing.Do this: Call the sandbox API. If this persists there, contact Snapcaster with the X-Correlation-ID response header.