Poll any job (bulk or crawl) by id
Poll a bulk **or** crawl job without knowing which kind it is, and get the same superset shape either way. Prefer this over `/bulk/{job_id}` and `/crawl/{job_id}`. Read `kind` to branch: `crawl` populates `truncated`, `truncated_reason` and per-item `depth`; `bulk` leaves them at their zero values. A job id doesn't carry its kind, and the two older routes are gated on the `bulk` and `crawl` scopes — so guessing wrong cost a 403, and guessing right still cost an extra round trip just to read `kind`. This route requires **no scope** for that reason. That doesn't widen access: ownership is enforced exactly as on the other two, job ids are unguessable UUIDs, and the response is read-only. Unmetered.
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
Path Parameters
uuidResponse Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/jobs/497f6eca-6276-4993-bfeb-53cbbbba6f08"{ "completed": 0, "created_at": "2019-08-24T14:15:22Z", "finished_at": "2019-08-24T14:15:22Z", "job_id": "453bd7d7-5355-4d6d-a38e-d9e7eb218c3f", "kind": "crawl", "results": [ { "blocks": [ { "level": 0, "text": "string", "type": "heading" } ], "chunks": [ { "end_token": 0, "start_token": 0, "text": "string" } ], "depth": 0, "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, "truncated": false, "truncated_reason": "string"}Search the web and extract the results to Markdown
Run a web search and return the result pages already extracted to clean Markdown — a query in, extracted content out, in one round trip. This endpoint is **synchronous**: there is no job to poll. Results are partial rather than all-or-nothing — each item carries its own `status`, so a page that times out is reported alongside the ones that succeeded instead of failing the whole call. `num_results` is clamped by your plan and by the search provider's own ceiling. Metered as 1 for the query plus 1 per page returned, so a 5-result search costs 6 requests.
Self-register for a free, extract-only API key (no auth)
Mint a free API key from an email address. **Public — no existing key required.** This is the zero-friction entry point: an agent can go from nothing to a working key in one call. The key returned is scoped to `extract` only and carries the free plan's allowance. Broader scopes are created with `POST /keys` once you're authenticated. The raw key is shown **once, in this response** — it is stored hashed and cannot be retrieved again. Rate-limited per IP; a 429 carries `Retry-After`.