Bulk jobs

POSThttps://api.crawl4ai.com/scrape/jobs

For big lists — up to 10,000 URLs — or when your code cannot hold a connection open for slow pages. Submit once, get a job id, then poll for results while it drains in the background. Every URL is charged the job's flat price; the status's usage shows unit_cost and cost (credits), and URLs that never got an answer are refunded at the end (credited).

10 000 URLs, per job500 results per page

You can read a job from any region: api.crawl4ai.com finds it wherever it runs.

Request

# 1. submit -> job id
JOB=$(curl -s https://api.crawl4ai.com/scrape/jobs \
  -H "Authorization: Bearer sk_live_..." -H "Content-Type: application/json" \
  -d '{"urls": ["https://a.com", "https://b.com"]}' | jq -r .job_id)

# 2. poll until done
until [ "$(curl -s https://api.crawl4ai.com/scrape/jobs/$JOB \
       -H "Authorization: Bearer sk_live_..." | jq -r .status)" = "done" ]; \
  do sleep 2; done

# 3. fetch results (NDJSON, one line per URL)
curl -s https://api.crawl4ai.com/scrape/jobs/$JOB/results \
  -H "Authorization: Bearer sk_live_..."

Endpoints

Route Does
POST /scrape/jobs Submit urls (max 10,000) + any /scrape field. Returns a job_id.
GET /scrape/jobs/{id} Status + counts (pending / done / error). Add ?full=1 for per-URL detail.
GET /scrape/jobs/{id}/results Streamed results, paged with ?after=N (500 per page).
POST /scrape/jobs/{id}/retry Re-run just the failed URLs.
Try it with your key

Run this call in the playground and see the real answer, the time and the units.

Open the playground

Next

Something unclear or wrong on this page? Tell us.