POST /listings

Create or update one listing or an array of listings with the desired values. The response reports each item's result. An invalid item does not fail the rest of the batch.

Example

These examples send requests to the sandbox.

cURL request - Sandbox: One listing
curl --request POST \
  --url 'https://api-sandbox.snapcaster.ca/api/v1/marketplace/listings' \
  --header "Authorization: Bearer $MARKETPLACE_API_KEY" \
  --header 'Content-Type: application/json' \
  --data @- <<EOF
{
  "skuId": 14602,
  "productId": 86,
  "price": 2499,
  "quantity": 3,
  "externalRef": "platform-listing-1042",
  "asOf": "$(node -p 'new Date().toISOString()')"
}
EOF
cURL request - Sandbox: Multiple listings
curl --request POST \
  --url 'https://api-sandbox.snapcaster.ca/api/v1/marketplace/listings' \
  --header "Authorization: Bearer $MARKETPLACE_API_KEY" \
  --header 'Content-Type: application/json' \
  --data @- <<EOF
[
  {
    "skuId": 14602,
    "productId": 86,
    "price": 2499,
    "quantity": 3,
    "externalRef": "platform-listing-1042",
    "asOf": "$(node -p 'new Date().toISOString()')"
  },
  {
    "skuId": 363348,
    "productId": 86,
    "price": 2699,
    "quantity": 1,
    "externalRef": "platform-listing-1043",
    "asOf": "$(node -p 'new Date().toISOString()')"
  }
]
EOF

$(node -p 'new Date().toISOString()') sets asOf to the current UTC time in milliseconds, so two writes in the same second never share an asOf.

Response 200: Applied listing
{
  "success": true,
  "data": {
    "results": [
      {
        "skuId": 14602,
        "op": "upsert",
        "status": "applied",
        "externalRef": "platform-listing-1042"
      }
    ]
  }
}

Endpoint

EnvironmentURL
Sandboxhttps://api-sandbox.snapcaster.ca/api/v1/marketplace/listings
Productionhttps://api.snapcaster.ca/api/v1/marketplace/listings
Authentication
  • marketplaceApiKey - http bearer. Send the seller's marketplace API key as Authorization: Bearer mp_{sellerCode}_{hex}. The mp_{sellerCode}_ prefix identifies the seller; the trailing hex is the secret. The seller generates the key and supplies it to your platform.

Request

Headers

X-Snapcaster-Api-Version string

Override the platform pin for this request only. Webhook versions and the platform pin do not change.

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

This operation takes no Idempotency-Key. Retries says how to resend it safely.

Request body

skuId integer required

See Canonical catalog in Core concepts.

Constraints: exclusive minimum: 0 Example 14602

productId integer

The TCGplayer product of skuId. Required only while skuId is absent from the canonical catalog; otherwise Snapcaster takes the product from the catalog and rejects a different value with PRODUCT_MISMATCH.

Constraints: exclusive minimum: 0 Example 86

price integer required

The unit price in minor currency units.

Constraints: minimum: 0 Example 2499

quantity integer required

The number of units.

Example 3

externalRef string

See Listing in Core concepts.

Constraints: maximum length: 255 Example platform-listing-1042

asOf string required

See Send ordered listing snapshots in Core concepts.

Constraints: format: date-time Example 2026-09-04T18:30:00.000Z

The body can also be an array of up to 1,000 of these objects.

Response

200

Per-item multi-status results.

Response body: ListingWriteResponse

success boolean required

Whether the operation completed as requested.

Constraints: allowed values: true Example true

data object required

The operation or event payload.

Show child fieldsHide child fields
data.results ListingItemResult[] required

The outcome recorded for each submitted item.

Show child fieldsHide child fields
data.results[].skuId integer required

See Canonical catalog in Core concepts.

Example 14602

data.results[].op string required

The write operation to apply to this item.

Constraints: allowed values: upsert, delete Example upsert

data.results[].status string required

The result for this item. unmatched corresponds to UNMATCHED: Snapcaster stored the item, but its SKU is absent from the canonical catalog. rejected corresponds to REJECTED: validation failed and Snapcaster did not store the item. Check reason for details.

Constraints: allowed values: applied, unmatched, rejected, noop Example applied

data.results[].code string

The stable machine-readable code for this result.

Constraints: allowed values: INVALID_REQUEST, STALE_SNAPSHOT, SNAPSHOT_CONFLICT, PRODUCT_MISMATCH

data.results[].reason string

Why the item was rejected; present only when status is "rejected".

data.results[].externalRef string

The submitted listing reference, if supplied.

Example platform-listing-1042

Errors

Errors return a MarketplaceError body, except HTTP 413 (MarketplaceError or ApiError) and HTTP 500 (ApiError). Error codes explains both error bodies and lists every code.

  • 400 INVALID_REQUEST UNSUPPORTED_API_VERSION

    The request failed validation (INVALID_REQUEST). Unknown or retired API-version override (UNSUPPORTED_API_VERSION).

    Do this: Correct the fields named in the error details, then retry the request. For UNSUPPORTED_API_VERSION, choose a supported version from the API versioning guide.

  • 401 UNAUTHORIZED

    Missing or invalid marketplace API key (UNAUTHORIZED).

    Do this: Send the marketplace API key for this seller as a Bearer token, then retry.

  • 409 SELLER_SOURCE_EXCLUSIVE

    The seller's inventory source is not platform (SELLER_SOURCE_EXCLUSIVE). Only platform-source sellers can write listings through the integration API. A seller uses one inventory source at a time.

    Do this: Use the seller’s declared inventory source, or ask Snapcaster to move the seller to the platform source.

  • 413 BATCH_TOO_LARGE PAYLOAD_TOO_LARGE

    The request exceeds the 1,000-item limit (BATCH_TOO_LARGE). The body is larger than this route accepts (PAYLOAD_TOO_LARGE).

    Do this: Split the write into batches of at most 1,000 items and retry each batch. Send a smaller body and retry.

  • 429 RATE_LIMITED

    The per-seller item rate ceiling was exceeded (RATE_LIMITED).

    Do this: Wait the Retry-After duration in seconds, then retry with bounded retries and jitter.

  • 500 INTERNAL_ERROR

    An 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.

Per-item errors

A successful HTTP response can still reject items. Each rejected item carries one of these codes.

  • INVALID_REQUEST

    The item failed validation.

    Do this: Correct the fields named in reason before submitting this item again.

  • STALE_SNAPSHOT

    The snapshot is older than the retained listing or purge watermark.

    Do this: Discard the delayed snapshot. Measure current stock before sending a new snapshot; do not relabel stale stock with a newer timestamp.

  • SNAPSHOT_CONFLICT

    The same snapshot instant was used with different contents.

    Do this: Retry the original contents, or measure current stock and send it with its actual capture time.

  • PRODUCT_MISMATCH

    The productId names a different product than the canonical catalog holds for the skuId. Snapcaster stored nothing for the item and left any existing listing for the SKU unchanged.

    Do this: Send the productId that reason names, or omit productId so Snapcaster takes it from the catalog.