Import a TCGplayer export

Imports a TCGplayer seller CSV (the Mass Update / Pricing export) as-is. Send it as multipart/form-data with the file in the file field and mode as a plain form field.

Each row is matched to a CardNexus product by its game (Product Line), set (Set Name), and collector number (Number). The TCGplayer Id column is a SKU rather than a product id, so it is kept as the line's customId and not used for matching. The Foil suffix on the condition sets the finish, conditions map one-to-one, and the price is kept in USD.

The file's structure is checked right away: a file that can't be read as a TCGplayer export comes back with UNPROCESSABLE_FILE. Once accepted, the import runs in the background — this call returns a job, and you poll GET /v1/inventory/bulk/jobs/{jobId}. A row that matches no product, or matches more than one, fails with PRODUCT_NOT_FOUND in the error report; the rest still import.

Send an Idempotency-Key header to make retries safe. Requires the inventory:write scope.

Body
required
application/json
Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/inventory/bulk/import/tcgplayer
curl https://public-api.cardnexus.com/v1/inventory/bulk/import/tcgplayer \
  --request POST \
  --header 'Content-Type: multipart/form-data' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --form 'file=' \
  --form 'mode=upsert'
{
  "job": {
    "id": "6848a3f0c8d4e9f7a6b5c4e1",
    "kind": "import",
    "status": "pending",
    "format": "csv",
    "mode": "upsert",
    "counts": null,
    "progress": 0,
    "errorMessage": null,
    "downloadUrl": null,
    "errorReportUrl": null,
    "expiresAt": null,
    "createdAt": "2026-06-10T09:20:45.000Z"
  }
}