Bulk
Bulk API — endpoints, requests, and responses.
For AI agents: https://bytekit.com/llms.txt — every docs page is available as markdown by appending .md
The Bulk API. 5 endpoints:
GET /v1/fetch/bulk/{id}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`.
GET /v1/bulkList bulk jobs
Returns the caller's bulk jobs, most recent first, one cursor-paginated page at a time. Optionally filter to a single status; when omitted, jobs of every status are returned. `status` narrows the set and the cursor addresses a position inside that already-ordered, already-filtered set, so the two can be combined in one request. Follow `next_cursor` while `has_more` is true.