Skip to content
snapcasterDevelopers

Bulk upsert/delete listings

POST/listings/bulk

Apply a mixed batch of `upsert` and `delete` operations in one request. Each item is reported independently in the multi-status response; one malformed item does not fail the batch.

When to use

Use this operation to bulk upsert/delete listings.

Endpoint

POST /listings/bulk

EnvironmentBase URL
Sandboxhttps://api-sandbox.snapcaster.ca/api/v1/marketplace
Productionhttps://api.snapcaster.ca/api/v1/marketplace
Authentication
  • marketplaceApiKey - http bearer. Seller-scoped Marketplace API key, presented as `Authorization: Bearer mp_{sellerCode}_{hex}`. The `mp_{sellerCode}_` prefix identifies the Seller; the trailing hex is the secret. Generated by the Seller and pasted into its Platform.

Request

No parameters.

Request body (application/json)

FieldTypeConstraintsMeaningExample
itemsrequiredarray of objectmaximum items: 1000The records included in this page or batch.[ { "op": "upsert", "skuId": 1, "productId": 1, "price": 0, "quantity": 0 } ] (generated)
items[].oprequiredstringstring: allowed values: upsert; string: allowed values: deleteThe write operation to apply to this item.upsert (generated)
items[].skuIdrequiredintegerinteger: exclusive minimum: 0Sku Id for the surrounding items item record.1 (generated)
items[].productIdconditionalintegerexclusive minimum: 0Product Id for the surrounding items item record.1 (generated)
items[].priceconditionalintegerminimum: 0The unit price in minor currency units.0 (generated)
items[].quantityconditionalintegerNoneThe number of inventory units represented by this record.0 (generated)
items[].externalRefstringmaximum length: 255External Ref for the surrounding items item record.string (generated)
items[].asOfstringformat: date-timeAs Of for the surrounding items item record.2026-01-01T00:00:00.000Z (generated)

Example

Sandbox is the default. These requests use the contract's canonical field examples.

Generated cURL request - Sandbox: Generated request
curl --request POST \
--url 'https://api-sandbox.snapcaster.ca/api/v1/marketplace/listings/bulk' \
--header "Authorization: Bearer $MARKETPLACE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"items": [
{
"op": "upsert",
"skuId": 1,
"productId": 1,
"price": 0,
"quantity": 0
}
]
}'

Response

200

Per-item multi-status results.

Generated Response 200: Generated response 200
{
"success": true,
"data": {
"results": [
{
"skuId": 0,
"op": "upsert",
"status": "applied"
}
]
}
}
FieldTypeConstraintsMeaningExample
successrequiredbooleanallowed values: trueWhether the operation completed as requested.true (generated)
datarequiredobjectNoneThe operation or event payload.{ "results": [ { "skuId": 0, "op": "upsert", "status": "applied" } ] } (generated)
data.resultsrequiredarray of objectNoneThe outcome recorded for each submitted item.[ { "skuId": 0, "op": "upsert", "status": "applied" } ] (generated)
data.results[].skuIdrequiredintegerNoneSku Id for the surrounding results item record.0 (generated)
data.results[].oprequiredstringallowed values: upsert, deleteThe write operation to apply to this item.upsert (generated)
data.results[].statusrequiredstringallowed values: applied, unmatched, rejectedPer-item outcome. `unmatched` corresponds to the public per-item code `UNMATCHED` (persisted but not in the Canonical Catalog); `rejected` corresponds to `REJECTED` (failed validation, not persisted; see `reason`).applied (generated)
data.results[].reasonstringNoneWhy the item was rejected; present only when status is "rejected".string (generated)
data.results[].externalRefstringNoneEcho of the pushed external_ref, when one was supplied.string (generated)

Errors

StatusCodeMeaningDo this
400INVALID_REQUESTThe request failed validation (`INVALID_REQUEST`).Correct the fields named in the error details, then retry the request.
401UNAUTHORIZEDMissing or invalid Marketplace API key (`UNAUTHORIZED`).Send the Marketplace API key for this Seller as a Bearer token, then retry.
409SELLER_SOURCE_EXCLUSIVEThe authenticated Seller’s declared inventory source is not `platform` (`SELLER_SOURCE_EXCLUSIVE`). Listing writes through the integration API are reserved for platform-source Sellers; sources are exclusive and never mixed.Use the Seller’s declared inventory source, or ask Snapcaster to move the Seller to the platform source.
413BATCH_TOO_LARGEThe request carried more than the 1,000-item per-request cap (`BATCH_TOO_LARGE`).Split the write into batches of at most 1,000 items and retry each batch.

Operations

Concepts

Changelog

Schema

Full schema details (36 fields)

Parameters

None.

Request

FieldTypeConstraintsMeaningExample
itemsrequiredarray of objectmaximum items: 1000The records included in this page or batch.[ { "op": "upsert", "skuId": 1, "productId": 1, "price": 0, "quantity": 0 } ] (generated)
items[].oprequiredstringstring: allowed values: upsert; string: allowed values: deleteThe write operation to apply to this item.upsert (generated)
items[].skuIdrequiredintegerinteger: exclusive minimum: 0Sku Id for the surrounding items item record.1 (generated)
items[].productIdconditionalintegerexclusive minimum: 0Product Id for the surrounding items item record.1 (generated)
items[].priceconditionalintegerminimum: 0The unit price in minor currency units.0 (generated)
items[].quantityconditionalintegerNoneThe number of inventory units represented by this record.0 (generated)
items[].externalRefstringmaximum length: 255External Ref for the surrounding items item record.string (generated)
items[].asOfstringformat: date-timeAs Of for the surrounding items item record.2026-01-01T00:00:00.000Z (generated)

Response 200 (application/json)

FieldTypeConstraintsMeaningExample
successrequiredbooleanallowed values: trueWhether the operation completed as requested.true (generated)
datarequiredobjectNoneThe operation or event payload.{ "results": [ { "skuId": 0, "op": "upsert", "status": "applied" } ] } (generated)
data.resultsrequiredarray of objectNoneThe outcome recorded for each submitted item.[ { "skuId": 0, "op": "upsert", "status": "applied" } ] (generated)
data.results[].skuIdrequiredintegerNoneSku Id for the surrounding results item record.0 (generated)
data.results[].oprequiredstringallowed values: upsert, deleteThe write operation to apply to this item.upsert (generated)
data.results[].statusrequiredstringallowed values: applied, unmatched, rejectedPer-item outcome. `unmatched` corresponds to the public per-item code `UNMATCHED` (persisted but not in the Canonical Catalog); `rejected` corresponds to `REJECTED` (failed validation, not persisted; see `reason`).applied (generated)
data.results[].reasonstringNoneWhy the item was rejected; present only when status is "rejected".string (generated)
data.results[].externalRefstringNoneEcho of the pushed external_ref, when one was supplied.string (generated)

Error 400 (application/json)

FieldTypeConstraintsMeaningExample
successrequiredbooleanallowed values: falseWhether the operation completed as requested.false (generated)
errorrequiredobjectNoneStructured error information returned when the request cannot be completed.{ "code": "UNAUTHORIZED", "message": "string" } (generated)
error.coderequiredstringallowed values: UNAUTHORIZED, INVALID_REQUEST, UNSUPPORTED_API_VERSION, SELLER_SOURCE_EXCLUSIVE, BATCH_TOO_LARGE, RATE_LIMITED, ORDER_NOT_FOUND, SELLER_NOT_FOUND, INVALID_TRANSITION, CHECKOUT_IDEMPOTENCY_KEY_REUSED, CHECKOUT_MANUAL_SELLER_UNSUPPORTED, CHECKOUT_SELF_PURCHASE_NOT_ALLOWED, CHECKOUT_SELLER_UNAVAILABLE, CHECKOUT_NOT_FOUND, FEATURE_DISABLEDStable public error code the Platform can branch on.UNAUTHORIZED (generated)
error.messagerequiredstringNoneA human-readable explanation of the result.string (generated)
error.detailsunknownNoneAdditional structured context for diagnosing the result.{} (generated)

Error 401 (application/json)

FieldTypeConstraintsMeaningExample
successrequiredbooleanallowed values: falseWhether the operation completed as requested.false (generated)
errorrequiredobjectNoneStructured error information returned when the request cannot be completed.{ "code": "UNAUTHORIZED", "message": "string" } (generated)
error.coderequiredstringallowed values: UNAUTHORIZED, INVALID_REQUEST, UNSUPPORTED_API_VERSION, SELLER_SOURCE_EXCLUSIVE, BATCH_TOO_LARGE, RATE_LIMITED, ORDER_NOT_FOUND, SELLER_NOT_FOUND, INVALID_TRANSITION, CHECKOUT_IDEMPOTENCY_KEY_REUSED, CHECKOUT_MANUAL_SELLER_UNSUPPORTED, CHECKOUT_SELF_PURCHASE_NOT_ALLOWED, CHECKOUT_SELLER_UNAVAILABLE, CHECKOUT_NOT_FOUND, FEATURE_DISABLEDStable public error code the Platform can branch on.UNAUTHORIZED (generated)
error.messagerequiredstringNoneA human-readable explanation of the result.string (generated)
error.detailsunknownNoneAdditional structured context for diagnosing the result.{} (generated)

Error 409 (application/json)

FieldTypeConstraintsMeaningExample
successrequiredbooleanallowed values: falseWhether the operation completed as requested.false (generated)
errorrequiredobjectNoneStructured error information returned when the request cannot be completed.{ "code": "UNAUTHORIZED", "message": "string" } (generated)
error.coderequiredstringallowed values: UNAUTHORIZED, INVALID_REQUEST, UNSUPPORTED_API_VERSION, SELLER_SOURCE_EXCLUSIVE, BATCH_TOO_LARGE, RATE_LIMITED, ORDER_NOT_FOUND, SELLER_NOT_FOUND, INVALID_TRANSITION, CHECKOUT_IDEMPOTENCY_KEY_REUSED, CHECKOUT_MANUAL_SELLER_UNSUPPORTED, CHECKOUT_SELF_PURCHASE_NOT_ALLOWED, CHECKOUT_SELLER_UNAVAILABLE, CHECKOUT_NOT_FOUND, FEATURE_DISABLEDStable public error code the Platform can branch on.UNAUTHORIZED (generated)
error.messagerequiredstringNoneA human-readable explanation of the result.string (generated)
error.detailsunknownNoneAdditional structured context for diagnosing the result.{} (generated)

Error 413 (application/json)

FieldTypeConstraintsMeaningExample
successrequiredbooleanallowed values: falseWhether the operation completed as requested.false (generated)
errorrequiredobjectNoneStructured error information returned when the request cannot be completed.{ "code": "UNAUTHORIZED", "message": "string" } (generated)
error.coderequiredstringallowed values: UNAUTHORIZED, INVALID_REQUEST, UNSUPPORTED_API_VERSION, SELLER_SOURCE_EXCLUSIVE, BATCH_TOO_LARGE, RATE_LIMITED, ORDER_NOT_FOUND, SELLER_NOT_FOUND, INVALID_TRANSITION, CHECKOUT_IDEMPOTENCY_KEY_REUSED, CHECKOUT_MANUAL_SELLER_UNSUPPORTED, CHECKOUT_SELF_PURCHASE_NOT_ALLOWED, CHECKOUT_SELLER_UNAVAILABLE, CHECKOUT_NOT_FOUND, FEATURE_DISABLEDStable public error code the Platform can branch on.UNAUTHORIZED (generated)
error.messagerequiredstringNoneA human-readable explanation of the result.string (generated)
error.detailsunknownNoneAdditional structured context for diagnosing the result.{} (generated)