---
title: "Get one request record"
method: GET
path: "/v1/requests/{id}"
tags: ["Requests"]
---

# Get one request record

`GET /v1/requests/{id}`

## Request

- Base URL: `https://api.spicrawl.com`
- URL: `https://api.spicrawl.com/v1/requests/{id}`
- Auth: HTTP bearer

Returns one record by request id (the `X-Request-Id` / `request_id` you received). Scoped to the key's
organization: a record made in the key's own project needs no scope, and one made in another project
of the organization needs the `read` scope, the same rule as `all_projects=true` on the list (this
route takes no parameter for it). Expired, never-existed, another project's without `read`, and
unreadable records all answer 404 `ERR::REQUEST::NOT_FOUND`; a malformed id answers 400.

## Path parameters

- `id` string, required

## Response `200`

The record.

- RequestLogEntry: One API request as recorded in the ephemeral request log. Numeric fields with `omitempty` are absent when zero.
  - `id` string, required: Request id; the same value as the `X-Request-Id` header and problem `request_id`.
  - `created_at` string, date-time, required: When the request arrived, RFC 3339 with fractional seconds, UTC.
  - `project_id` string, required: Project whose API key made the request. Always present; tells rows apart in an `all_projects=true` list.
  - `engine` string: Rendering tier that served it (`fetch`, `js` or `browser`). Empty for requests refused before a tier was chosen.
  - `status` 'success' | 'failed' | 'timeout' | 'blocked' | 'rejected' | 'cancelled', required: Terminal outcome. Only `success` is ever charged.
  - `http_status` integer: Target's HTTP status. Absent when no response was received.
  - `error_code` string: Problem code returned to the caller, e.g. `ERR::UPSTREAM::CHALLENGE`. Absent on success.
  - `error_detail` string: The problem detail sentence the caller received (may be truncated). Read it for the specific cause.
  - `attempts` integer: Dispatch attempts including retries. Absent when zero.
  - `url` string, required: Target URL as requested.
  - `url_host` string: Target host. Absent when unknown.
  - `proxy` RequestLogProxy, required: What was requested versus what actually served. Never contains an exit IP or credentials. Every field is absent when unknown.
    - `source` 'pool' | 'custom' | 'direct': Where the exit came from: the managed pool, your own proxy, or no proxy.
    - `endpoint_id` string: Pool exit id, e.g. `dc-198.51.100.7-6646`. Not an exit IP. Absent for custom and direct.
    - `provider` string: Proxy provider name.
    - `requested_tier` string: Tier the request asked for, e.g. `datacenter`, `residential`.
    - `requested_country` string: Country the request asked for.
    - `country` string: Country the exit actually served from. Compare with `requested_country` to spot geo mismatches.
    - `sticky` boolean: True when the exit was pinned. Absent when false.
    - `reason` 'caller_proxy' | 'configured_direct' | 'no_pool_available' | 'session_proxy_unavailable': Why this source was chosen. `session_proxy_unavailable` is a request in a session that records a datacenter exit on a deployment with no proxy pool; it went direct. Absent means unknown (older records), not a default.
    - `endpoints` string[]: Every exit the request touched, in attempt order. Several entries mean retries moved exits.
  - `spans` RequestLogSpans, required: Latency breakdown in milliseconds. Every field is always present; null means the stage was not measured, which is different from 0. Spans are measured by different processes and do not sum to `total_ms`.
    - `admission_ms` integer, nullable, required: Ingress to dispatch: auth, rate limit, quota, concurrency. Null when the request never reached dispatch.
    - `dispatch_ms` integer, nullable, required: Worker round trip as timed by the API, including transport. `dispatch_ms - worker_ms` is transport overhead.
    - `worker_ms` integer, nullable, required: The worker's own handler time.
    - `queue_ms` integer, nullable, required: Wait for a slot inside the worker. High values mean capacity shortage, not a slow page.
    - `engine_ms` integer, nullable, required: Engine occupancy, the metered compute. Null on the fetch tier.
    - `upstream_ms` integer, nullable, required: Time talking to the target.
    - `extract_ms` integer, nullable, required: Extraction time; null when no extraction ran.
    - `total_ms` integer, nullable, required: What the caller experienced inside the handler, excluding writing the body.
  - `blocked` RequestLogBlock: Present only when a bot challenge was detected. Use `vendor` to pick a countermeasure (e.g. stealth rendering or residential exit).
    - `vendor` string: Anti-bot vendor, e.g. `akamai`, `cloudflare`.
    - `signal` string: Observable marker that triggered detection, so you can confirm it in the response.
    - `rule` string: Which detection path fired.
  - `bytes_in` integer: Bytes received from the target. Absent when zero.
  - `bytes_out` integer: Bytes sent to the target. Absent when zero.
  - `proxy_bytes` integer: Bytes carried through a proxy exit. Absent when zero.
  - `credits_micro` integer, required: Credits charged in micro-credits (1 credit = 1000000). Always 0 for non-success statuses.
  - `features` object: Features the request used, as recorded by the router. Free-form; absent when none.

## Other responses

- `400`: The request is invalid. Not retryable; fix the request using `code` and `diagnostics.hint`.
- `401`: Missing, invalid, revoked or expired key. Not retryable with the same key.
- `403`: The key lacks the scope this route requires (`ERR::AUTH::INSUFFICIENT_SCOPE`), or the action is not permitted.
- `404`: No such resource for this key's organization.

---

[API](https://skmtc.dev/spicrawl/apis/spicrawl-api.md) · [All operations](https://skmtc.dev/spicrawl/apis/spicrawl-api/llms.txt) · [OpenAPI document](https://skmtc.dev/spicrawl/apis/spicrawl-api/revisions/c4b4c6f97219?raw)
