Skip to main content
Glama

List recent requests

spicrawl_requests_list
Read-onlyIdempotent

Recent API calls in your key's project, newest first, each with project_id, status, engine, http_status, error_code/error_detail, attempts, URL, proxy used, latency spans (queue/engine/upstream/total ms), block detection and credits. Use it to find failing calls (only_errors=true) or to spot patterns across a target. all_projects=true lists every project in your organization instead (needs a key with the read scope; 403 ERR::AUTH::INSUFFICIENT_SCOPE otherwise). Records only exist within the retention window reported in page.retention_hours / page.retained_since; an empty page means nothing in that window. Paginate by passing page.next_before and page.next_before_id back as before and before_id while page.has_more is true, keeping all_projects the same. Not billing-grade: use spicrawl_usage for totals.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoRows per page, 1-200. Default 50.
beforeNoCursor: RFC 3339 timestamp, exactly as returned in page.next_before. Pass together with before_id.
statusNoOnly requests with this outcome.
before_idNoCursor: request id, exactly as returned in page.next_before_id.
only_errorsNoOnly requests whose status is anything other than 'success'.
all_projectsNoEvery project in your organization, not just the key's own. Needs the `read` scope. Keep it the same across pages.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
dataNoRequest records, newest first. Can be shorter than limit while page.has_more is true.
pageNoPaging cursor and the retention window.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": true,
      +  "properties": {
      +    "data": {
      +      "description": "Request records, newest first. Can be shorter than limit while page.has_more is true.",
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "attempts": {
      +            "description": "Dispatch attempts including retries.",
      +            "type": "number"
      +          },
      +          "blocked": {
      +            "additionalProperties": true,
      +            "description": "Present only when a bot challenge was detected.",
      +            "properties": {
      +              "rule": {
      +                "type": "string"
      +              },
      +              "signal": {
      +                "type": "string"
      +              },
      +              "vendor": {
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "bytes_in": {
      +            "type": "number"
      +          },
      +          "bytes_out": {
      +            "type": "number"
      +          },
      +          "created_at": {
      +            "description": "When the request arrived, RFC 3339 UTC.",
      +            "type": "string"
      +          },
      +          "credits_micro": {
      +            "description": "Credits charged in micro-credits (1 credit = 1000000); 0 unless success.",
      +            "type": "number"
      +          },
      +          "engine": {
      +            "description": "The rendering tier that served it: fetch, js or browser. Absent when refused before a tier was chosen.",
      +            "type": "string"
      +          },
      +          "error_code": {
      +            "description": "The problem code the caller got, e.g. ERR::UPSTREAM::CHALLENGE. Absent on success.",
      +            "type": "string"
      +          },
      +          "error_detail": {
      +            "type": "string"
      +          },
      +          "features": {
      +            "additionalProperties": {},
      +            "description": "Features the request used; free-form.",
      +            "type": "object"
      +          },
      +          "http_status": {
      +            "description": "The target's HTTP status; absent when no response was received.",
      +            "type": "number"
      +          },
      +          "id": {
      +            "description": "The request id (X-Request-Id).",
      +            "type": "string"
      +          },
      +          "project_id": {
      +            "type": "string"
      +          },
      +          "proxy": {
      +            "additionalProperties": true,
      +            "description": "What proxy was asked for versus what served. Never an exit IP or credentials.",
      +            "properties": {
      +              "country": {
      +                "description": "Where the exit actually served from; compare with requested_country.",
      +                "type": "string"
      +              },
      +              "endpoint_id": {
      +                "type": "string"
      +              },
      +              "endpoints": {
      +                "anyOf": [
      +                  {
      +                    "items": {
      +                      "type": "string"
      +                    },
      +                    "type": "array"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Every exit touched, in attempt order."
      +              },
      +              "provider": {
      +                "type": "string"
      +              },
      +              "reason": {
      +                "type": "string"
      +              },
      +              "requested_country": {
      +                "type": "string"
      +              },
      +              "requested_tier": {
      +                "type": "string"
      +              },
      +              "source": {
      +                "description": "pool, custom or direct.",
      +                "type": "string"
      +              },
      +              "sticky": {
      +                "type": "boolean"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "proxy_bytes": {
      +            "type": "number"
      +          },
      +          "spans": {
      +            "additionalProperties": true,
      +            "description": "Latency in milliseconds per stage; null means not measured. Stages do not sum to total_ms.",
      +            "properties": {
      +              "admission_ms": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "dispatch_ms": {
      +                "$ref": "#/properties/data/items/properties/spans/properties/admission_ms"
      +              },
      +              "engine_ms": {
      +                "$ref": "#/properties/data/items/properties/spans/properties/admission_ms"
      +              },
      +              "extract_ms": {
      +                "$ref": "#/properties/data/items/properties/spans/properties/admission_ms"
      +              },
      +              "queue_ms": {
      +                "$ref": "#/properties/data/items/properties/spans/properties/admission_ms",
      +                "description": "Wait for a slot; high means capacity shortage, not a slow page."
      +              },
      +              "total_ms": {
      +                "$ref": "#/properties/data/items/properties/spans/properties/admission_ms"
      +              },
      +              "upstream_ms": {
      +                "$ref": "#/properties/data/items/properties/spans/properties/admission_ms"
      +              },
      +              "worker_ms": {
      +                "$ref": "#/properties/data/items/properties/spans/properties/admission_ms"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "status": {
      +            "description": "Terminal outcome: success, failed, timeout, blocked, rejected or cancelled. Only success is charged.",
      +            "type": "string"
      +          },
      +          "url": {
      +            "description": "The target URL as requested.",
      +            "type": "string"
      +          },
      +          "url_host": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "page": {
      +      "additionalProperties": true,
      +      "description": "Paging cursor and the retention window.",
      +      "properties": {
      +        "has_more": {
      +          "description": "True when more records may exist; continue with next_before and next_before_id.",
      +          "type": "boolean"
      +        },
      +        "next_before": {
      +          "description": "Send back as before. Present only when has_more.",
      +          "type": "string"
      +        },
      +        "next_before_id": {
      +          "description": "Send back as before_id. Present only when has_more.",
      +          "type": "string"
      +        },
      +        "retained_since": {
      +          "description": "The oldest instant still readable.",
      +          "type": "string"
      +        },
      +        "retention_hours": {
      +          "description": "How long records are kept; an empty data means nothing in this window.",
      +          "type": "number"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  2. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint/idempotentHint annotations by disclosing the retention window (page.retention_hours/retained_since), the meaning of an empty page, the exact 403 ERR::AUTH::INSUFFICIENT_SCOPE failure mode and required `read` scope, and the pagination contract. This is behavior an agent cannot infer from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: core purpose first, then filtering, scope, retention, pagination, and the billing caveat. Every sentence earns its place, though the enumeration of returned fields is dense enough to slightly slow the opening.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a paginated, retention-bounded, scope-sensitive list tool, the description covers pagination mechanics, retention semantics, scope requirements, error behavior, and the distinction from the totals tool. An output schema exists, so omission of return formatting is appropriate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description still adds value by tying parameters together (paginate via page.next_before/next_before_id into before/before_id, keep all_projects stable across pages, only_errors semantics) and reinforcing intent behind status filtering.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Starts with a precise verb+resource+ordering statement ('Recent API calls in your key's project, newest first') and enumerates the fields returned, so the agent knows exactly what this list yields. It also distinguishes itself from sibling spicrawl_request_get (single call) and spicrawl_usage (totals) by naming the latter explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit use cases ('find failing calls (only_errors=true)' and 'spot patterns across a target') plus a strong when-not directive ('Not billing-grade: use spicrawl_usage for totals'). Also names the alternative scope mode (all_projects=true) with its precondition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources