Read API
The read API hands your data back. Every run, event, evaluation result, and agent on your account is reachable with a read-scoped key, with cursor pagination and no per-call charge.
It is served by the control plane, not the ingest tier:
https://agentping.io/v1/...
Authentication and scope
Read endpoints require an API key with the read scope. Mint one in
Settings, API keys and grant it read; the ingest scope and the
read scope are separate, so a key your SDK uses to send data does not
automatically read it back, and vice versa. Keys created before scopes
existed keep working for ingest only.
curl https://agentping.io/v1/runs \
-H "Authorization: Bearer apk_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3b6"
A key without the read scope returns 403 insufficient_scope.
Rate limit
Read requests are limited to 60 per minute per key. Over the limit
returns 429 with a Retry-After header in seconds. This is generous
for backfills and automations; for a full account dump prefer a
bulk export.
Retention
Reads are bounded by your plan's run-history horizon. A from/to
window that reaches past it is silently clamped, never an error: list
responses carry a retention_horizon field with the oldest timestamp
you can read, and a window entirely before it returns an empty data
array. See data retention.
Pagination
List endpoints use opaque cursor pagination. Pass per_page (max 100,
default 50) and follow next_cursor until it is null:
{
"data": [ ... ],
"next_cursor": "eyJpZCI6...",
"retention_horizon": "2026-03-15T00:00:00+00:00"
}
curl "https://agentping.io/v1/runs?per_page=100&cursor=eyJpZCI6..." \
-H "Authorization: Bearer apk_eu_..."
GET /v1/runs
List runs newest-first.
| Query | Description |
|---|---|
from, to |
ISO 8601 bounds on received_at. Clamped to the retention horizon. |
status |
success, failed, timeout, or cancelled. |
agent_id |
Agent external id or slug. |
per_page |
1 to 100, default 50. |
cursor |
From a prior next_cursor. |
Each item is a run summary:
{
"id": "run_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3b6",
"agent": "support-triage",
"status": "success",
"goal": "Route the ticket to the right department",
"customer_id": "acme-corp",
"feature": "ticket-routing",
"started_at": "2026-05-15T14:32:01+00:00",
"finished_at": "2026-05-15T14:32:05+00:00",
"duration_ms": 4666,
"cost_usd": 0.0142,
"total_input_tokens": 1200,
"total_output_tokens": 340,
"step_count": 3,
"error_count": 0
}
GET /v1/runs/{id}
One run, in full. Returns the same summary plus metadata, tools, and
output. A run id from another team returns 404 (not 403), so a
caller can't probe which ids exist.
GET /v1/runs/{id}/events
The run's events in timestamp order (up to 1000). When an event has an
offloaded payload, data is the slimmed inline copy and payload_url
points at the full body:
{
"data": [
{
"id": "evt_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3b7",
"type": "llm_call",
"ts": "2026-05-15T14:32:02.456Z",
"data": { "provider": "anthropic", "model": "claude-opus-4-7" },
"payload_url": "https://agentping.io/v1/runs/run_eu_.../events/evt_eu_.../payload"
}
]
}
GET /v1/runs/{id}/events/{eventId}/payload
The full event payload, fetched from the payload store when one exists, otherwise the inline copy. Payloads are only available within your plan's step-detail horizon.
GET /v1/runs/{id}/evaluation
The run's evaluation in the public shape, with internal stages collapsed
to a single evaluation type:
{
"data": {
"type": "evaluation",
"status": "complete",
"result": "goal_achieved",
"quality": 4,
"issues": [],
"reasoning": "The ticket was routed to billing, matching the goal.",
"evaluated_at": "2026-05-15T15:02:11+00:00"
}
}
status is one of complete, pending,
covered_by_routine_baseline, or returned_to_allowance. quality is
0 to 5 when present. A run that was never evaluated returns 404.
GET /v1/agents
Every agent on the team with rolled-up health:
{
"data": [
{
"id": "agt_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3b9",
"slug": "support-triage",
"first_seen_at": "2026-02-01T09:14:00+00:00",
"last_seen_at": "2026-05-15T14:32:01.156Z",
"health_pass_rate_24h": 0.9821,
"quality_7d": 88
}
]
}
last_seen_at is the most recent run received for the agent;
health_pass_rate_24h and quality_7d are null until there is data.