Batch status and per-item results
GET/v1/products/batch/{batchId}
scope products.write
Failures are listed first, because that is what you opened this for. ?failed_only=1 returns just those.
Query parameters#
| Name | Example | |
|---|---|---|
failed_only | — | 1 to return only the failures |
Response#
| Field | Type | Description |
|---|---|---|
batch_id | string | The batch handle. |
status | string | Where the batch is. completed means every item was ATTEMPTED — not that every item succeeded, so always read failed.Accepts |
total | integer | How many products were in it. |
processed | integer | How many have been attempted so far. |
succeeded | integer | How many were written. |
failed | integer | How many were not. Non-zero on a completed batch is the normal way a partial failure looks. |
created_at | string|null | ISO-8601 UTC. |
completed_at | string|null | ISO-8601 UTC, or null while still running. |
error | string|null | Set only when the batch itself failed, as opposed to items within it. |
items_shown | integer | How many items are in items. Capped at 500 per response, so on a larger batch use ?status=failed to see the ones that need attention. |
items | array | Per-item results. |
items[]. | integer | Its index in the products array you sent — this is how you match a result back to your own record. |
items[]. | string|null | Your id for it, as sent. |
items[]. | string | What happened to this one. Accepts |
items[]. | integer|null | The product that was created or updated, or null if it failed. |
items[]. | object|null | Why it failed, or null. One bad item never stops the rest. |
items[]. | string | A machine-readable reason. |
items[]. | string | The same in words. |
Example
{
"batch_id": "batch_v4lfngtgb6sxqkzwagrqv8c2",
"status": "completed",
"total": 7,
"processed": 7,
"succeeded": 5,
"failed": 2,
"created_at": "2026-09-11T14:02:10Z",
"completed_at": "2026-09-11T14:02:38Z",
"error": null,
"items_shown": 2,
"items": [
{
"position": 0,
"external_id": "ERP-1001",
"status": "success",
"product_id": 237224,
"error": null
},
{
"position": 5,
"external_id": "BATCH-BAD",
"status": "failed",
"product_id": null,
"error": {
"code": "missing_required_attribute",
"message": "The attribute \"Brand\" is required for this category."
}
}
]
}