Skip to content

API reference/account

Look up one request by its id

GET/api/v1/account/requests/{requestId}

authentication
Secret API key as a bearer token
billing
Free.

Every response carries an X-Request-Id header and repeats the same id in its meta or error block. This reads that id back: the endpoint that was called, the status and typed error_code it answered with, the credits it spent and how long it took. It is what a script that caught a failure can call to find out what happened, and what to quote to support.

The row carries no lookup input. The endpoint is named by its route, never by the path it was called on, so this can never read back the address, number or identifier a call was about. Rows are kept for meta.retention_days and then deleted; an id older than that, or belonging to another account, answers 404 NOT_FOUND.

Parameters

name in type description
requestIdrequiredpathstringThe id from the X-Request-Id header, e.g. req_01m1kgdm4xngzmbmff68g94w0c.

Example request

curl https://spaw.co/api/v1/account/requests/{requestId} \
  -H "Authorization: Bearer sk_live_…"
const response = await fetch('https://spaw.co/api/v1/account/requests/{requestId}', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer sk_live_…',
  },
});
const result = await response.json();
import requests

response = requests.get(
    'https://spaw.co/api/v1/account/requests/{requestId}',
    headers={'Authorization': 'Bearer sk_live_…'},
)
result = response.json()
$ch = curl_init('https://spaw.co/api/v1/account/requests/{requestId}');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer sk_live_…'],
]);
$result = json_decode(curl_exec($ch), true);
from spaw import Client

client = Client('sk_live_…')
result = client.request_log(request_id)
import Spaw from 'spaw';

const spaw = new Spaw({ apiKey: 'sk_live_…' });
const result = await spaw.requestLog(requestId);
use Spaw\Client;

$spaw = new Client('sk_live_…');
$result = $spaw->requestLog($requestId);

This endpoint has no console on its page. It answers with records from your own account, often by an id only you have, rather than about a value you can type here. The dashboard lists the same rows.

Responses

200The request as it was recorded.

{
    "success": true,
    "data": {
        "request_id": "req_01m1kgdm4xngzmbmff68g94w0c",
        "route": "api.v1.email",
        "method": "POST",
        "status": 402,
        "error_code": "INSUFFICIENT_CREDITS",
        "credits_used": 0,
        "duration_ms": 8,
        "via": "api · Production",
        "occurred_at": "2026-09-09T09:41:02+00:00"
    },
    "meta": {
        "retention_days": 30,
        "request_id": "req_01m22gaxhnj60f71ez5tjcdcvy"
    }
}

401The key is missing, malformed, or revoked.

{
    "success": false,
    "error": {
        "code": "UNAUTHENTICATED",
        "message": "Provide a valid API key as a bearer token.",
        "request_id": "req_01m1kgdm4xngzmbmff68g94w0c"
    }
}

404No such record on this account.

{
    "success": false,
    "error": {
        "code": "NOT_FOUND",
        "message": "No record with that id on this account.",
        "request_id": "req_01m1kgdm4xngzmbmff68g94w0c"
    }
}

429Over 5 requests per second for the key. Retry after the limit resets.

{
    "success": false,
    "error": {
        "code": "RATE_LIMITED",
        "message": "Too many requests. Retry after the limit resets.",
        "request_id": "req_01m1kgdm4xngzmbmff68g94w0c"
    }
}

Error codes

Failures answer { success: false, error: { code, message, request_id } }. Each code has its own page.

markdown version·openapi.json