Submit multiple URLs for concurrent extraction
Queue a list of URLs for concurrent extraction and return a `job_id` immediately — this endpoint is asynchronous and does not wait for the work to finish. Poll `GET /bulk/{job_id}` for progress and results, or supply `webhook_url` to be notified on completion instead of polling. The response includes `webhook_signing_secret` the first time you use a webhook; store it, as it is shown once. Individual URLs can fail without failing the job: each entry in `results` carries its own `status`, so a partial success is normal and is reported as a 200. The per-request URL cap depends on your plan. Send `Idempotency-Key` to make retries safe — the same key with the same body returns the original job rather than queuing a second one. Metered as one request per URL submitted.
Authorization
BearerAuth Your API key, sent as Authorization: Bearer wm_.... Keys are wm_ followed by 40 hex characters. Create one with POST /register (free, no auth) or POST /keys.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/bulk" \ -H "Content-Type: application/json" \ -d '{ "urls": [ "http://example.com" ] }'{ "completed": 0, "job_id": "453bd7d7-5355-4d6d-a38e-d9e7eb218c3f", "job_token": "string", "kind": "bulk", "results": [ { "blocks": [ { "level": 0, "text": "string", "type": "heading" } ], "chunks": [ { "end_token": 0, "start_token": 0, "text": "string" } ], "error": "string", "html": "string", "links": [ "string" ], "markdown": "string", "metadata": { "author": "string", "date": "string", "retrieved_at": "2019-08-24T14:15:22Z", "title": "string", "url": "string" }, "metrics": { "content_bytes": 0, "input_tokens": 0, "output_tokens": 0, "reduction_pct": 0, "tokens_saved": 0 }, "url": "string" } ], "status": "string", "total": 0, "webhook_signing_secret": "string"}Check your usage for the current billing period
Return the calling key's request count for the current billing period, the plan's included allowance, and when the counter resets. The period is anchored to your subscription date, not the calendar month, so `resets_at` is the authoritative value to schedule against. This endpoint is unmetered — checking your usage never consumes quota.
Poll the status of a bulk extraction job
Return the current state of a bulk job: `status`, how many URLs have `completed` out of `total`, and the `results` collected so far. Results stream in as they finish, so this is safe to poll while `status` is `processing`. Each result carries its own `status`, so check per item rather than assuming a finished job means every URL succeeded. Jobs are scoped to the key that created them; polling someone else's job returns 403. Unmetered.