POST
https://api.decisionnode.com /v1/batches/{id}/requestsAPI=https://api.decisionnode.com/v1
BATCH=batch_01J9ZB8Q3T
curl "$API/batches/$BATCH/requests" \
-H "Authorization: Bearer $DECISIONNODE_API_KEY" \
-H "Content-Type: application/x-ndjson" \
--data-binary @more.jsonlAuthentication#
AuthorizationheaderrequiredBearer dn_live_..., the same key as every call. A batch belongs to the key that created it: other keys, even in the same workspace, get404for it.Content-Typeheaderrequiredapplication/x-ndjsonorapplication/json, as on create.
Path parameters#
idstringrequired- The batch id that Create a batch returned, for example
batch_01J9ZB8Q3T.
Request body#
The same format as Create a batch: JSON Lines or a JSON array of requests, each with a custom_id unique across the whole batch, not only this call.
Response#
200 OK with the batch object, still a draft, its counters including the new lines.
{
"id": "batch_01J9ZB8Q3T",
"state": "draft",
"counters": {
"requests": 3,
"queued": 0,
"in_progress": 0,
"completed": 0,
"failed": 0,
"expired": 0,
"cancelled": 0
},
"created_at": "2026-10-06T09:12:04Z",
"finalized_at": null,
"expires_at": null,
"ended_at": null,
"results_url": null,
"results_expire_at": null,
"price_factor": 0.5,
"usage": { "input_tokens": 0, "output_tokens": 0 },
"error": null
}API=https://api.decisionnode.com/v1BATCH=batch_01J9ZB8Q3Tcurl "$API/batches/$BATCH/requests" \ -H "Authorization: Bearer $DECISIONNODE_API_KEY" \ -H "Content-Type: application/x-ndjson" \ --data-binary @more.jsonlErrors#
| Status | Type | When | What to do |
|---|---|---|---|
400 | api_usage_error | The body cannot be read; a custom_id is missing, too long or already in the batch; the batch would pass 10,000 requests | Fix the call and send it again. Nothing from it was added |
401 | authentication_error | The key is missing, unknown or revoked | Check the Authorization header |
404 | not_found_error | No batch with this id belongs to your key | Check the id and that you call with the key that created the batch |
409 | invalid_batch_state | The batch is no longer a draft: it was finalized or cancelled | Create a new batch for more requests |
413 | request_too_large_error | The call is over 10 MiB, or the batch would pass 256 MB | Send smaller calls, or start a second batch |
429 | batch_limit_exceeded | The call would put more than 100,000 requests in your key's active batches, drafts included | Wait for a batch to end, or cancel a draft you will not finalize. Nothing from the call was applied |
429 | rate_limit_error | Over your request rate: batch calls count against it | Wait Retry-After seconds, then send the same call again |
500 | api_error | A fault on our side | Retry with backoff and jitter. A 5xx can come after the call took effect: before you create again, cancel any draft the failed create left behind (see Batch errors) |
529 | overloaded_error | The API cannot take the call right now | Wait Retry-After seconds, then retry with backoff |
Every error body is {"detail": {"error_type": "...", "message": "..."}}. Retry 408, 429 (rate_limit_error), 529 and any 5xx, waiting at least what Retry-After says when it is set; fix the call for the other 4xx. A 429 batch_limit_exceeded clears only when a batch ends or you cancel one. All the bodies are on Errors.
Limits#
| Limit | Value |
|---|---|
| One call | 10 MiB |
| The batch | 10,000 requests and 256 MB in all |
| Requests in active batches per key | 100,000, drafts included, checked on this call |
Notes#
- A call is all or nothing: if it is refused, none of its lines were added, so you can resend it whole.
- If a call times out, retrieve the batch and compare
counters.requestswith what you sent before you resend: acustom_idalready in the batch is refused, which keeps a resent call from adding lines twice.