Crawl whole sites. In one job.
The /v1/crawl endpoint walks the link graph of a site, obeys robots.txt by default, unrolls the sitemap, and streams clean results back to your webhook when it is done. Depth, page-budget, and concurrency are all yours to set.
One family in the full 124-endpoint surface — see the scraping bundle for the endpoints that pair with it, or follow the full crawl recipe end to end.
Autonomous traversal with predictable resource caps.
Depth and budget caps
Every crawl carries a max_pages budget (default 500) and a link-depth ceiling (default 3). Raise both for large knowledge bases or lower them for a quick scoped pass. The crawler stops the moment either cap is hit, so a run can never silently balloon past what you asked for.
Robots-aware by default
respect_robots is true unless you turn it off, and you should only turn it off for sites you own or have permission to crawl. The walker reads the target robots.txt before it starts and stays polite — single-server sites are automatically slowed so a crawl never looks like an attack.
Sitemap unrolling
Pair the crawl with the sitemap and robots endpoints to discover every declared URL up front. Seed the run from the sitemap instead of blindly following links, so you crawl exactly the pages you mean to and skip the ones the site already told you to leave alone.
Webhook delivery
Pass a webhook_url and the job runs detached — your process is not holding a socket open for an hour. When the crawl finishes we POST the full result and the job id to your endpoint. Prefer polling? Hit the jobs endpoint with the returned job_id instead.
Examples that work today.
Start a crawl, then collect the result by webhook or by polling.
export OLLAGRAPH_API_KEY="osk_..."
curl -X POST https://api.ollagraph.com/v1/crawl \
-H "Authorization: Bearer $OLLAGRAPH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://docs.example.com",
"max_pages": 500,
"depth": 3,
"concurrency": 10,
"respect_robots": true,
"webhook_url": "https://yourapp.com/ollagraph-callback"
}'
# Returns: { "status": "queued", "job_id": "..." } export OLLAGRAPH_API_KEY="osk_..."
# No webhook? Poll the job by id until it is done.
curl https://api.ollagraph.com/v1/jobs/{job_id} \
-H "Authorization: Bearer $OLLAGRAPH_API_KEY"
# Response when ready:
# { "job_id": "...", "status": "completed",
# "result": { "pages_crawled": 487, "urls": [...] } } export OLLAGRAPH_API_KEY="osk_..."
# Read the sitemap and robots policy first, then seed the crawl
# only with the paths you actually want.
curl -X POST https://api.ollagraph.com/v1/intel/sitemap \
-H "Authorization: Bearer $OLLAGRAPH_API_KEY" \
-d '{"url": "https://docs.example.com"}'
curl -X POST https://api.ollagraph.com/v1/intel/robots \
-H "Authorization: Bearer $OLLAGRAPH_API_KEY" \
-d '{"url": "https://docs.example.com"}' Watching a crawl as it runs is part of the per-URL observability surface.
Crawler questions
1 What does /v1/crawl actually do?
What does /v1/crawl actually do?
2 How big can a crawl be?
How big can a crawl be?
3 Does the crawler respect robots.txt?
Does the crawler respect robots.txt?
4 How do I seed a crawl from a sitemap?
How do I seed a crawl from a sitemap?
5 How does webhook delivery work?
How does webhook delivery work?
6 What if I do not want to set up a webhook?
What if I do not want to set up a webhook?
7 How is a crawl billed?
How is a crawl billed?
Start your first crawl free.
1,000 free credits, one bearer token, failed calls auto-refund.