spicrawlspicrawlDocs
Requests

List recent requests in the key's project, or in every project of its organization

Per-request records from the ephemeral request log, newest first, for the API key's project (every key in that project, not only this key).

Requires scope: none (any valid key)

GET
/v1/requests

Per-request records from the ephemeral request log, newest first, for the API key's project (every key in that project, not only this key). With all_projects=true and a key carrying the read scope, the records of every project in the key's organization (archived projects included), merged into one newest-first list under the same cursor. Every record carries project_id. Records expire after page.retention_hours; for durable billing totals use GET /v1/usage. Totals here will not match an invoice.

Pitfalls:

  • Page with BOTH before and before_id copied from page.next_before / page.next_before_id. before alone re-returns the boundary record and cannot break same-millisecond ties; before_id alone does not bound the page at all.
  • A cursor older than the retention window returns 410 ERR::REQUEST::BEYOND_RETENTION. Restart from the first page.
  • An empty data means "nothing in the last retention_hours", not "never". Check retained_since.
  • A page can be shorter than limit while has_more is true. Keep paging until has_more is false.
  • limit is clamped silently: missing, non-numeric or non-positive gives 50, above 200 gives 200.
  • all_projects=true without the read scope is 403 ERR::AUTH::INSUFFICIENT_SCOPE, naming read. The default list needs no scope beyond a valid key. The organization is always the key's own; no parameter names another.
  • Keep all_projects=true on every page of one walk: the cursor pages whichever list it came from.

Authorization

bearerAuth
AuthorizationBearer <token>

Authorization: Bearer <key>. Read the key from the SPICRAWL_API_KEY environment variable; never hard-code or log it. spicrawl_test_… keys can never spend live credits. Scopes: scrape, batch, sessions (granted by default), browser and read (granted deliberately). A missing scope is 403 ERR::AUTH::INSUFFICIENT_SCOPE naming the scope.

In: header

Query Parameters

all_projects?string

When true, lists every project in the key's organization instead of only the key's project. Requires the read scope (403 ERR::AUTH::INSUFFICIENT_SCOPE without it). Only true and false are accepted; any other value is 400.

Default"false"

Value in

  • "true"
  • "false"
limit?integer

Page size. Never refused; invalid values fall back to 50 and values above 200 become 200.

Range1 <= value <= 200
Default50
status?string

Only records with exactly this status. Not validated; an unknown value returns an empty page. Ignored when only_errors=true.

Value in

  • "success"
  • "failed"
  • "timeout"
  • "blocked"
  • "rejected"
  • "cancelled"
only_errors?string

When exactly true, returns every record whose status is not success. Any other value (including 1) is treated as false.

Default"false"

Value in

  • "true"
  • "false"
before?string

Cursor time, RFC 3339 with optional fractional seconds, copied from page.next_before. Must be sent together with before_id.

Formatdate-time
before_id?string

Cursor id, copied from page.next_before_id. Must be sent together with before.

Response Body

application/json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

curl -X GET "https://example.com/v1/requests"
{  "data": [    {      "id": "01M0FK1EP2E7FBMWAR7W10SMXW",      "created_at": "2026-09-22T12:41:22.183Z",      "project_id": "01M0FJZ8Q3W4B5T8J2V9K6X1RD",      "engine": "chromium",      "status": "blocked",      "http_status": 403,      "error_code": "ERR::UPSTREAM::CHALLENGE",      "error_detail": "The target served an Akamai challenge page.",      "attempts": 2,      "url": "https://shop.example.com/p/123",      "url_host": "shop.example.com",      "proxy": {        "source": "pool",        "endpoint_id": "dc-198.51.100.7-6646",        "requested_tier": "datacenter",        "requested_country": "de",        "country": "de",        "endpoints": [          "dc-198.51.100.9-6646",          "dc-198.51.100.7-6646"        ]      },      "spans": {        "admission_ms": 2,        "dispatch_ms": 4731,        "worker_ms": 4718,        "queue_ms": 0,        "engine_ms": 4706,        "upstream_ms": null,        "extract_ms": null,        "total_ms": 4735      },      "blocked": {        "vendor": "akamai",        "signal": "\"Access Denied\"",        "rule": "body_marker"      },      "bytes_in": 18231,      "credits_micro": 0    }  ],  "page": {    "retention_hours": 24,    "retained_since": "2026-09-21T12:45:00Z",    "has_more": true,    "next_before": "2026-09-22T12:41:22.183Z",    "next_before_id": "01M0FK1EP2E7FBMWAR7W10SMXW"  }}