Get fetch bulk job status
Returns the job envelope plus its per-URL items.
Downloading item content. Each completed item's content_url is a
pre-signed URL, minted fresh on every read of this endpoint and valid
for 600 seconds (10 minutes) — the same signing lifetime as the
image_url returned by GET /v1/bulk/{id}/screenshots. The underlying
objects are private, so an unsigned URL returns 401: download the
content inside that window, or re-poll this endpoint for a fresh
signature. Items that are not completed, and completed items with no
stored object, or completed items whose object cannot be signed, carry
null; the latter report artifact_unavailable. The private unsigned
storage URL is never returned.
Cancelled by the platform. When the account can no longer spend (its bandwidth
balance is exhausted, or the account is deleted) while items are still pending, ByteKit
cancels the job itself. It then reads status: cancelled even though you never called
DELETE /v1/bulk/{id}, and the cancellation sends no webhook.
Job ids from other create routes. The job is looked up by account only, so the id
of a job created by POST /v1/scrape/bulk or POST /v1/bulk is found here too, not a
404, with the job envelope and items: []: only items fetched through
POST /v1/fetch/bulk are listed. An id from another account answers 404.
For AI agents: https://bytekit.com/llms.txt — every docs page is available as markdown by appending .md
Authorization
AuthorizationRequiredBearer <token>API key. Manage keys from the dashboard at app.bytekit.com.
In: header
Path Parameters
idRequiredstring"^bulk_"Query Parameters
cursorstringOpaque cursor returned by the preceding page. It is bound to this bulk id, this recovery route, and the exact status filter; cross-scope cursors return 422.
limitintegerMaximum result rows considered for this page; the 16-MiB response bound may stop sooner.
500Minimum: 1Maximum: 500statusstringOptional item-status filter. A cursor may be reused only with the same filter.
"pending" | "processing" | "completed" | "failed" | "cancelled"Successful response.
POST /v1/fetch/bulkBulk fetch URLs
Enqueues multiple URLs for HTTP fetching. Results delivered via webhook. Does not support options that require page rendering (wait_for_selector, etc.). Completion deliveries use `X-ByteKit-Event: bulk.completed` and the `BulkCompletedWebhook` contract: at most 500 complete items and 1 MiB, followed by cursor recovery through `GET /v1/fetch/bulk/{id}` whenever `recovery_required` is true. **Limits:** request bodies are guarded in a two-tier shape. A streamed body with no `Content-Length` header is capped at 2 MB before your API key is checked; a body that declares `Content-Length` is instead bounded there by a 20 MB fail-safe (not the real limit — see below), since that branch reads nothing until your key is verified. Once your key is verified, a second check re-gates the body against your account's own `max_bulk_size` (at this endpoint's per-item override budget), which reaches 16.8 MB for the largest documented account. A standard-plan account's effective ceiling is 2 MB; either tier's overrun returns a `400` with error code `request_too_large`.
Bulk
Bulk API — endpoints, requests, and responses.