API documentation · 4 of 9
Projects
A project is one website: the URL a crawl starts from, and the settings it crawls with. Every project response has the same shape, whichever call returned it.
GET/projectsread
Every project you own, each with its settings and its latest crawl.
curl http://localhost:9000/api/v1/projects -H "Authorization: Bearer $KEY"
{ "projects": [ { "id": 1, "url": "https://example.com", ... } ] }
POST/projectswrite
Adds a project. The body takes the project settings; only url is required, and every toggle is off unless you send it.
curl -X POST http://localhost:9000/api/v1/projects -H "Authorization: Bearer $KEY" \
-d '{"url": "https://example.com", "crawl_sitemap": true}'
Answers 201 Created with the project, and its address in the Location header:
{
"id": 1,
"url": "https://example.com",
"host": "example.com",
"created": "2026-09-29T12:33:15Z",
"user_agent": "Mozilla/5.0 (compatible; ...)",
"settings": {
"ignore_robots_txt": false,
"follow_nofollow": false,
"include_noindex": false,
"crawl_sitemap": true,
"allow_subdomains": false,
"check_external_links": false,
"archive": false,
"basic_auth": false,
"render_javascript": false
},
"last_crawl": null
}
last_crawl is null until the project is crawled. You cannot have two projects for the same URL: a second one answers 409 project_exists, with the existing project's address in Location.
GET/projects/{id}read
One project, in the same shape. This is the call to poll while a crawl runs: last_crawl.crawling turns false when it is done.
"last_crawl": {
"id": 3,
"start": "2026-09-29T12:33:15Z",
"end": "2026-09-29T12:35:02Z",
"crawling": false,
"total_urls": 87,
"total_issues": 41,
"critical_issues": 2,
"alert_issues": 12,
"warning_issues": 27
}
end is null while the crawl is still running.
PATCH/projects/{id}write
Changes settings. Send only the fields you want to change; the others stay as they are. Answers 200 with the updated project.
curl -X PATCH http://localhost:9000/api/v1/projects/1 -H "Authorization: Bearer $KEY" \
-d '{"check_external_links": true, "crawl_sitemap": true}'
- Changes apply from the next crawl. A crawl already running carries on with what it started with.
urlcan be changed too, for a site that moved; it must not be the URL of another of your projects (409 project_exists)."user_agent": ""goes back to the default user agent."archive": falsedeletes the archive already stored for the project.- If any field is refused, nothing is changed.