Bulk scrape URLs

Enqueues multiple URLs for scraping. Results delivered via webhook. 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/scrape/bulk/{id} whenever recovery_required is true.

Unknown keys. An unknown key on an items[] entry, or at the top level of the body, is rejected with 422 validation_error. An unknown key inside defaults is not: it is dropped without a warning and the request is accepted with 202. The exception is cookies and headers, on an item or in defaults: they answer 400 validation_error.

For AI agents: https://bytekit.com/llms.txt — every docs page is available as markdown by appending .md

POST
/v1/scrape/bulk

Authorization

AuthorizationRequiredBearer <token>

API key. Manage keys from the dashboard at app.bytekit.com.

In: header

Request Body

application/jsonRequired
urlsarray<string>

Simple URL list. Provide urls OR items, not both.

itemsarray<object>

Per-item configs. Provide urls OR items, not both.

defaultsobject
webhook_urlRequiredstring

Webhook endpoint URL (HTTPS only; http:// rejected with 400 invalid_url, reason scheme_unsupported)

Pattern: "^https://"Format: "uri"
webhook_secretstring

HMAC secret used to sign webhook deliveries. Each delivery carries X-Webhook-Timestamp and X-Webhook-Signature (sha256= + the hex HMAC-SHA256 of timestamp.body). See https://bytekit.com/docs/guides/webhooks for verification code.

metadataobject

Arbitrary key-value metadata. Max 4096 bytes when JSON-serialized.

customobject

Top-level user-supplied JSON payload, capped at 4096 UTF-8 bytes. Applied to every scrape-type entry that does not provide its own per-entry custom (the per-entry value wins). Echoed on each entry's success envelope in the bulk results response (the key is omitted when no custom was supplied at either level). Distinct from the system-owned metadata column and never used as a cache-key input.

curl -X POST https://api.bytekit.com/v1/scrape/bulk \
  -H "Authorization: Bearer sk_live_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
  "items": [
    {
      "url": "https://example.com",
      "formats": [
        "raw",
        "markdown"
      ],
      "custom": {
        "batch_id": 17
      }
    },
    {
      "url": "https://example.org",
      "formats": [
        "markdown"
      ]
    }
  ],
  "defaults": {
    "formats": [
      "raw"
    ],
    "country": "US"
  },
  "custom": {
    "campaign": "fall-2026"
  },
  "webhook_url": "https://hooks.example.com/bytekit"
}'

Bulk scrape job accepted.

{
  "id": "bulk_01j9abc123",
  "status": "processing",
  "total": 0,
  "completed": 0,
  "failed": 0,
  "created_at": "2019-08-24T14:15:22Z",
  "completed_at": "2019-08-24T14:15:22Z",
  "total_credits_charged": 0,
  "total_billed_bytes": 0,
  "estimated_credits": 0,
  "webhook_url": "string"
}