Skip to content

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

EndpointRefund
/extractNone. Extract is one unit. The call returns JOB_CANCELLED, no refund
/batchUnstarted URLs refunded. Completed URLs keep their results
/crawlAll 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

CodeHTTPWhen
JOB_NOT_FOUND404Unknown or already-completed job
JOB_FORBIDDEN403Job 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"

Released under the terms of Runo’s Terms of Use.