Publish, delist, resync or retry up to 100 listings in one call
POST /rest/v1/listings/batch
One action on up to 100 (product, channel account) pairs. Mix products and accounts freely. Tracked as ONE operation (listing.batch_<action>) with one result per pair; subscribe to operation.completed instead of polling.
Every pair is decided on its own, with the same rules as the single endpoints. A bad pair never fails the batch:
-
publish:
skipped(already_listed) if a live or in-progress listing exists;failed(photo_required_for_channel) without images. On eBay, imported products whose eBay listing has ended are relisted. -
delist:
skipped(already_delisted);failedfor imported/linked listings (listing_not_delistable), listings still in progress (listing_operation_in_progress) or missing (listing_not_found). A delist asks for the two-step confirmation, counting only the listings that would really end; when none would, it answers the per-pair outcomes directly. -
resync: re-pushes the product to the channel (listed, imported or error listings).
-
retry: re-runs listings in
error; anything else isskipped(not_in_error). Target the exact failure withGET /listings?error_contains=...first.
Unknown products / accounts fail per pair (product_not_found, channel_not_connected). results come back in the order of items, each one repeating the product_id and channel_account_id you sent, unknown ones included. On a trial store, publish and retry pairs beyond the 10-listings-per-channel-account allowance fail with trial_publish_limit. A job the channel queue could not start fails with not_started instead of hanging. Only malformed requests (bad action, >100 items, duplicate pairs) are rejected with 422. Requires listings:write.
Authorization
apiKey Authorization: Bearer nbl_live_... (or nbl_test_... for test mode). Test-mode writes are validated and simulated but never persisted and never touch channels; simulated results are marked simulated.
In: header
Header Parameters
Unique client-generated key (max 255 chars), stored 24h.
length <= 255The one-time token from a 409 confirmation_required answer, to confirm an irreversible action (repeat the same request with it, within 10 minutes).
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/listings/batch" \ -H "Content-Type: application/json" \ -d '{ "action": "publish", "items": [ { "product_id": "prod_66a1f0", "channel_account_id": "chac_6aa12cab" }, { "product_id": "prod_66a1f1", "channel_account_id": "chac_6aa12cab" }, { "product_id": "prod_66a1f2", "channel_account_id": "chac_6aa12cab" } ] }'{ "id": "op_8fd2c1", "object": "operation", "type": "string", "status": "pending", "resource_type": "string", "resource_id": "string", "results": [ { "channel_account_id": "string", "product_id": "string", "listing_id": "string", "sku": "string", "variant_id": "string", "previous_price": "19.90", "price": "19.90", "status": "pending", "error": { "code": "string", "message": "string", "details": {} } } ], "import": { "source": "channel", "channel_account_id": "string", "filters": {}, "warnings": [ "string" ], "processed": 0, "total": 0, "created": 0, "updated": 0, "unchanged": 0, "linked": 0, "not_imported": 0, "requires_attention": 0, "error": "string", "undone_at": "2019-08-24T14:15:22Z", "undo": { "removed": 0, "unlinked": 0, "kept": { "live_on_a_channel": 0, "modified_after_import": 0 } } }, "created_at": "2019-08-24T14:15:22Z", "completed_at": "2019-08-24T14:15:22Z"}Last updated on October 16, 2026
Need help?
Email us and a human replies, usually within one business day.