Appearance
Jobs
Every response carries an X-Job-ID header. You can list, and cancel, your running jobs.
GET /v1/jobs
List jobs you currently own.
bash
curl https://api.scrapewithruno.com/v1/jobs \
-H "X-API-Key: $RUNO_API_KEY"Response:
json
{
"jobs": [
{ "job_id": "job_a1b2c3", "endpoint": "/crawl", "started_at": "2026-05-08T10:14:21Z" },
{ "job_id": "job_d4e5f6", "endpoint": "/batch", "started_at": "2026-05-08T10:15:01Z" }
]
}DELETE /v1/jobs/
Cancel a running job. The job exits at the next safe checkpoint.
bash
curl -X DELETE https://api.scrapewithruno.com/v1/jobs/job_a1b2c3 \
-H "X-API-Key: $RUNO_API_KEY"Response:
json
{ "status": "cancelled", "job_id": "job_a1b2c3" }Refund Rules
| Endpoint | Refund |
|---|---|
/extract | None. Extract is one unit. The call returns JOB_CANCELLED, no refund |
/batch | Unstarted URLs refunded. Completed URLs keep their results |
/crawl | All units that didn't run are refunded to the monthly counter; Pro/Scale overage credits restored |
In the original call's response, units that didn't run appear as:
json
{ "url": "...", "status": "error", "error": { "code": "JOB_CANCELLED", "retryable": false } }The top-level cancelled: true flag is set on /batch and inside crawl_meta on /crawl.
Errors
| Code | HTTP | When |
|---|---|---|
JOB_NOT_FOUND | 404 | Unknown or already-completed job |
JOB_FORBIDDEN | 403 | Job belongs to another user |
Cancellation Across Workers
Cancellation works no matter which worker is processing your job. Every worker subscribes to a shared cancellation channel internally. If that infrastructure is briefly unavailable, cancellation falls back to single-worker behavior, which is still correct for any job that happens to live on the worker that received the DELETE.
End-to-End Example
bash
# Start a long crawl, capture job_id from headers
curl -isS -X POST https://api.scrapewithruno.com/v1/crawl \
-H "X-API-Key: $RUNO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"seed_url": "https://example.com",
"schema": [{ "field": "title", "type": "string", "example": "x" }],
"crawl": { "follow_pattern": "https://example.com/*", "max_pages": 100 }
}' | tee /tmp/crawl.out
# Cancel mid-flight
JOB=$(grep -i '^x-job-id:' /tmp/crawl.out | awk '{print $2}' | tr -d '\r')
curl -X DELETE "https://api.scrapewithruno.com/v1/jobs/$JOB" \
-H "X-API-Key: $RUNO_API_KEY"