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.
- application/json
- application/json
- application/json
- application/json
- application/json
- application/json
- application/json
- application/json
- application/json
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"
}
}