/run traffic. A large batch never takes capacity from your interactive requests.
Requirements
- A queue-based Serverless endpoint. To create one, see the Serverless quickstart. Batch jobs aren’t available on load balancing endpoints.
- A Runpod API key, if you use the API.
When to use batch jobs instead of /run
The following table compares batch jobs with standard /run requests:
Use batch when your workload can tolerate multi-hour latency. Common examples include:
- Nightly dataset processing.
- Pre-computing embeddings.
- Running evaluations.
/run or /runsync for any request a user is waiting on.
Batch requests are billed at a discounted rate compared to on-demand Serverless pricing. There are separate discount tiers for consumer and enterprise GPUs. For discount rates, contact sales. To estimate cost, run a small test batch (for example, 100 requests) and extrapolate.
Batch lifecycle
A batch moves through the following API states:- DRAFT: The batch is a draft, and you can still change its requests. Batch workers haven’t started any work.
- FINALIZED: The batch is locked, and you can’t add or remove requests. Batch workers process the requests while the batch stays in this state. Track progress with the
requestTotal,requestInProgress,requestCompleted, andrequestFailedcounts. WhenrequestCompleted + requestFailedequalsrequestTotal, the batch moves toCOMPLETED. - COMPLETED: All requests in the batch have finished. Some individual requests might have failed, so check
requestFailed. - FAILED: The batch itself failed before or during execution. This is different from individual request failures in a batch whose other requests finished.
- CANCELLED: You cancelled the batch. For details, see Cancellation.
DRAFT batch never runs.
The console shows different status labels. For the mapping, see Console statuses.
API walkthrough
The following steps create a batch, finalize it, check its progress, and read the results. ReplaceENDPOINT_ID, API_KEY, and BATCH_ID with your own values.
Step 1: Create a batch
Create a batch with an initial list of requests:/run request: a JSON object with an input field. To create an empty batch and add requests later, send an empty array ([]).
The response includes the batch ID, which you use in the remaining steps:
Step 2: Add more requests (optional)
While the batch is a draft, you can append more requests:Step 3: Finalize the batch
Finalize the batch to lock its requests and make it eligible to run:FINALIZED. You can no longer add or remove requests.
Step 4: Check batch progress
Fetch the batch summary to check progress:FINALIZED while its requests are processing. When all requests have finished (requestCompleted + requestFailed equals requestTotal), the status changes to COMPLETED. To check whether a batch is done, use the status field. If the batch itself fails, the status is FAILED, and if you cancel it, the status is CANCELLED. The createdAt field is a Unix timestamp in milliseconds.
You can poll the batch summary at whatever interval suits your workflow, or use notifications instead.
Step 5: Retrieve results
Fetch the results for every request in the batch:delayTime (how long the request waited in the queue) and executionTime (how long it took to run), both in milliseconds.
Results are paginated. Use the offset and limit query parameters to page through them. When hasMore is true, more pages remain.
API reference
Use the following endpoints to manage batches:Monitor batches in the console
To see all batches for an endpoint, open the endpoint in the Runpod console and select the Bulk Requests tab. Each row shows the batch name, status, and progress counts. To create a batch in the console:1
Open the Bulk Requests tab
Open your endpoint and select the Bulk Requests tab.
2
Add your requests
Click Create batch, then enter a JSON request object or an array of request objects. You can edit the requests until you run the batch.
3
Run the batch
Click Run this batch to finalize the batch.
- The batch’s status and progress.
- A row for each request, with its status, timestamps, and an error message if it failed.
- Links to the full detail view for each request.
Console statuses
The console uses different status labels from the API:Notifications
When a batch reaches a terminal state, Runpod sends the following notifications. The terminal states areCOMPLETED, FAILED, and CANCELLED.
- Console Inbox notification: Includes the batch ID, endpoint name, terminal status, and request counts (completed, failed, and total).
- Webhook event: Sent if your account has a webhook subscription for batch events.
Cancellation
To cancel a batch:- Queued requests are cancelled immediately and aren’t billed.
- In-progress requests finish and are billed normally.
CANCELLED once all in-progress requests have finished.
If you cancel a batch before any requests start, it moves to CANCELLED immediately and nothing is billed.
Limits
The following limits apply to batch jobs:
Each endpoint can process up to 50,000 batch requests a day. For example, that’s 10 active batches with 5,000 requests each.
Need more? Contact support or sales to raise your limit, up to 3,000,000 requests a day.
Billing
Batch requests are billed at a discounted rate compared to on-demand Serverless pricing, with separate discount tiers for consumer and enterprise GPUs. For discount rates, contact sales. Billing is based on the compute time each request uses. If you cancel a batch, requests that were already in progress are still billed. For general Serverless pricing, see Pricing.Error handling
A failed request doesn’t fail the batch unless failures reach the request failure limit. Until then, the batch staysFINALIZED and keeps processing the remaining requests. To inspect failed requests, use the console or the GET /v2/ENDPOINT_ID/batch/BATCH_ID/requests endpoint. Each failed request includes the error message from your handler.
The request failure limit is 10 failed requests or 2% of the batch’s requests (rounded up), whichever is greater. For example:
If your handler returns an error in its output instead of raising an exception, Runpod marks the request
COMPLETED, not FAILED. These requests don’t count toward the failure limit. To catch them, check each request’s output for errors.
If the batch itself has the FAILED status, it stopped before finishing its requests. Check the failureCode and the request-level errors, and contact support if they don’t explain the failure.
A failed batch includes a failureCode that explains why it failed, and a failedAt timestamp. For example, a batch that reached the request failure limit returns:
The
failedAt field is a Unix timestamp in milliseconds.
Batch requests use the same queue as standard Serverless requests. If the queue fails, you might lose queued batch requests. This also applies to /run traffic.
Known limitations
- Batches use the GPU type configured on your endpoint. You can’t choose a different GPU per batch or per request.
- Requests within a batch run in no particular order, and you can’t schedule individual requests.
- Runpod doesn’t show a cost estimate before you finalize a batch. To estimate cost, run a small test batch and extrapolate.
- Runpod schedules batch workers based on global queue urgency and off-peak capacity, so start times aren’t guaranteed. Runpod attempts to run each batch within 24 hours on a best-effort basis.
Next steps
Send requests to an endpoint
Submit standard
/run and /runsync requests to a Serverless endpoint.Job states
Learn about the states a Serverless job moves through.
Serverless pricing
Review per-second pricing for Serverless workers.