GET /products/{productId}

Read the offers for one product, ordered by price from lowest to highest. Only browsable, in-stock offers appear. Filter by condition, language, or finish. This public buyer-facing endpoint shows how your listings appear to buyers; Snapcaster implements it.

Snapcaster implements this buyer-facing operation. Use the reference to see how your listings appear to buyers.

Example

These examples send requests to the sandbox.

Replace the example productId in the URL with your own.

Generated cURL request - Sandbox
curl --request GET \
  --url 'https://api-sandbox.snapcaster.ca/api/v1/marketplace/products/86'
Response 200: A browsable listing on its product page
{
  "success": true,
  "data": {
    "offers": [
      {
        "lane": "native",
        "productId": 86,
        "sellerId": 42,
        "storeSlug": null,
        "variantId": null,
        "skuId": 14602,
        "sellerName": "Sandbox Cards",
        "condition": "NM",
        "language": "EN",
        "finish": "Normal",
        "isSealed": false,
        "price": 24.99,
        "available": 3,
        "checkoutMode": "express",
        "salesCount": 18,
        "sellerCode": "sandbox-cards",
        "reviewScore": {
          "score": 4.93,
          "count": 15
        },
        "poBoxDelivery": {
          "status": "available"
        },
        "disclosures": {
          "imageSource": "catalog",
          "conditionSource": "seller_declared",
          "authenticitySource": "seller_attestation",
          "snapcasterInspected": false,
          "snapcasterGraded": false,
          "snapcasterAuthenticated": false,
          "gradingStandard": "snapcaster-magic-v1",
          "declaredGrade": "Near Mint",
          "buyerProtection": "magic-grade-and-authenticity"
        },
        "fulfillmentObligation": {
          "sku": "exact",
          "printing": "exact",
          "language": "exact",
          "finish": "exact",
          "condition": "declared-or-better"
        }
      }
    ],
    "product": {
      "productId": 86,
      "name": "Abyssal Nightstalker",
      "set": "Portal Second Age",
      "rarity": "U",
      "collectorNumber": null,
      "imageUrl": "https://tcgplayer-cdn.tcgplayer.com/product/86_200w.jpg",
      "details": [
        {
          "label": "Rarity",
          "value": "U",
          "runs": [
            {
              "type": "text",
              "text": "U",
              "emphasis": false
            }
          ]
        },
        {
          "label": "P",
          "value": "2",
          "runs": [
            {
              "type": "text",
              "text": "2",
              "emphasis": false
            }
          ]
        }
      ]
    }
  }
}

Endpoint

EnvironmentURL
Sandboxhttps://api-sandbox.snapcaster.ca/api/v1/marketplace/products/{productId}
Productionhttps://api.snapcaster.ca/api/v1/marketplace/products/{productId}
Authentication

None.

Request

Path parameters

productId integer required

See Canonical catalog in Core concepts.

Constraints: exclusive minimum: 0 Example 86

Query parameters

condition array of string or string

The normalized condition assigned to the card.

Constraints: string: minimum length: 1; string: maximum length: 255; array of string: minimum items: 1

language array of string or string

The language of the card printing.

Constraints: string: minimum length: 1; string: maximum length: 255; array of string: minimum items: 1

finish array of string or string

The physical finish or foil treatment of the card.

Constraints: string: minimum length: 1; string: maximum length: 255; array of string: minimum items: 1

limit integer

The maximum number of records requested for this page.

Constraints: exclusive minimum: 0; maximum: 100

offset integer or null

The zero-based position used for offset pagination.

Constraints: minimum: 0

Response

200

The product’s competing seller offers, cheapest first.

Response body: BrowseProductOffersResponse

success boolean required

Whether the operation completed as requested.

Constraints: allowed values: true Example true

degraded boolean

Present and true while the marketplace is in degraded mode: prices and availability on browse surfaces may be briefly out of date, and are confirmed before purchase. Absent when the platform is healthy.

Constraints: allowed values: true

data object required

The operation or event payload.

Show child fieldsHide child fields
data.offers BrowseProductOffer[] required

The product’s offers, cheapest first.

Show child fieldsHide child fields
data.offers[].lane string required

The source of the offer: native for a marketplace seller's listing, or handoff for a handoff store's synced single. Use this field to choose the cart-line identifiers and determine whether Snapcaster handles the sale.

Constraints: allowed values: native, handoff Example native

data.offers[].productId integer required

See Canonical catalog in Core concepts.

Example 86

data.offers[].sellerId integer or null required

The offering seller id. Combine it with skuId to identify a native cart line. Null for a handoff offer, which has no seller record.

Example 42

data.offers[].storeSlug string or null required

The handoff store’s slug - its stable identity across the cart, the quote and the permalink. null on a native offer.

Example null

data.offers[].variantId integer or null required

The Shopify variant this handoff offer is for; with storeSlug it is the handoff cart-line key. null on a native offer.

Example null

data.offers[].skuId integer required

The canonical TCGplayer SKU id. A native cart line uses sellerId and skuId; a handoff cart line uses storeSlug and variantId.

Example 14602

data.offers[].sellerName string or null required

The display name of the seller or handoff store. Use sellerCode or storeSlug for links and identifiers.

Example Sandbox Cards

data.offers[].condition string or null required

The normalized condition assigned to the card.

Example NM

data.offers[].language string or null required

The language of the card printing.

Example EN

data.offers[].finish string or null required

The physical finish or foil treatment of the card.

Example Normal

data.offers[].isSealed boolean required

True when the canonical SKU condition is Unopened; matches the product grid classification.

Example false

data.offers[].price number required

Offer price in dollars as a decimal amount.

Example 24.99

data.offers[].available integer required

Available stock: on-hand minus committed units.

Example 3

data.offers[].checkoutMode string or null required

Where the buyer checks out: express on Snapcaster, or manual on the seller's own site. Null for a legacy search record indexed before this field existed.

Constraints: allowed values: express, manual, null Example express

data.offers[].salesCount integer or null required

The number of paid orders for an express store, calculated for each request. Zero for a store with no sales. Null for a manual store, whose orders are created outside Snapcaster; omit the sales count from its display.

Example 18

data.offers[].sellerCode string or null required

The store's public handle for links to /marketplace/sellers/{sellerCode}. Read from the database on each request. Null if the store has no directory row; the offer is still returned.

Example sandbox-cards

data.offers[].reviewScore ReviewScore required

The review score and the number of ratings used to calculate it. Display both so readers can judge the sample size. Calculated for each request. A store with no reviews returns { score: null, count: 0 }, as does a manual store, which cannot receive reviews in v1. Used on the seller page and product offers.

Show child fieldsHide child fields
data.offers[].reviewScore.score number or null required

The mean of current, non-hidden ratings, rounded to two decimals. Null when the store has no reviews.

Example 4.93

data.offers[].reviewScore.count integer required

The number of current, non-hidden reviews included in the mean.

Example 15

data.offers[].poBoxDelivery PoBoxDelivery or null required

Whether the store can deliver to PO Boxes. Null for a handoff offer, where Snapcaster does not arrange shipping.

Show child fieldsHide child fields
data.offers[].poBoxDelivery.status string required

available: the store delivers to PO Boxes. seller_declines: the store does not. platform_suspended: PO Box delivery is suspended platform-wide (e.g. a Canada Post strike) and outranks the store’s own setting.

Constraints: allowed values: available, seller_declines, platform_suspended Example available

data.offers[].disclosures ListingDisclosures or null required

Provenance, grading, and authenticity statements shown to the buyer.

Show child fieldsHide child fields
data.offers[].disclosures.imageSource string required

Constraints: allowed values: catalog Example catalog

data.offers[].disclosures.conditionSource string required

Constraints: allowed values: seller_declared Example seller_declared

data.offers[].disclosures.authenticitySource string required

Constraints: allowed values: seller_attestation Example seller_attestation

data.offers[].disclosures.snapcasterInspected boolean required

Constraints: allowed values: false Example false

data.offers[].disclosures.snapcasterGraded boolean required

Constraints: allowed values: false Example false

data.offers[].disclosures.snapcasterAuthenticated boolean required

Constraints: allowed values: false Example false

data.offers[].disclosures.gradingStandard string required

Constraints: allowed values: snapcaster-magic-v1, seller-declared-no-specialist-promise Example snapcaster-magic-v1

data.offers[].disclosures.declaredGrade string or null required

Example Near Mint

data.offers[].disclosures.buyerProtection string required

Constraints: allowed values: magic-grade-and-authenticity, genuine-and-as-described Example magic-grade-and-authenticity

data.offers[].fulfillmentObligation ListingFulfillmentObligation or null required
Show child fieldsHide child fields
data.offers[].fulfillmentObligation.sku string required

The SKU that identifies the card variant.

Constraints: allowed values: exact Example exact

data.offers[].fulfillmentObligation.printing string required

The card printing the seller must supply.

Constraints: allowed values: exact Example exact

data.offers[].fulfillmentObligation.language string required

The language of the card printing.

Constraints: allowed values: exact Example exact

data.offers[].fulfillmentObligation.finish string required

The physical finish or foil treatment of the card.

Constraints: allowed values: exact Example exact

data.offers[].fulfillmentObligation.condition string required

The normalized condition assigned to the card.

Constraints: allowed values: declared-or-better Example declared-or-better

data.product BrowseProductMeta or null required

Card metadata; null when no catalog row exists.

Show child fieldsHide child fields
data.product.productId integer required

See Canonical catalog in Core concepts.

Example 86

data.product.name string or null required

Example Abyssal Nightstalker

data.product.set string or null required

The product group or set name.

Example Portal Second Age

data.product.rarity string or null required

Derived from the extended_data Rarity entry.

Example U

data.product.collectorNumber string or null required

Derived from the extended_data Number entry.

Example null

data.product.imageUrl string or null required

The catalog product image.

Example https://tcgplayer-cdn.tcgplayer.com/product/86_200w.jpg

data.product.details BrowseProductDetail[] required

Each extended_data entry as { label, value, runs }.

Show child fieldsHide child fields
data.product.details[].label string required

The entry's displayName, or its machine name if no display name exists.

Example Rarity

data.product.details[].value string required

Plain text with markup removed; each line break is a newline.

Example U

data.product.details[].runs BrowseProductDetailRun[] required

The value as text runs and line breaks, with emphasis marking text the catalog emphasized.

Show child fieldsHide child fields
data.product.details[].runs[].type string required

Constraints: allowed values: text, break Example text

data.product.details[].runs[].text string conditional

Required when type is text.

Example U

data.product.details[].runs[].emphasis boolean conditional

Required when type is text.

Example false

Errors

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

  • 400 INVALID_REQUEST

    The request failed validation (INVALID_REQUEST).

    Do this: Correct the fields named in the error details, then retry the request.

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