---
title: Executions API
description: Inspect past scrape, analyse, and map runs — list with filters, fetch one by id.
---

Every `/scrape`, `/analyse`, and `/map` call creates an execution row. The rows persist the full request, result, and error JSON for later inspection. Ids are `ex_…`.

MCP equivalents: [`get_execution`](/docs/mcp#get_execution) and [`list_executions`](/docs/mcp#list_executions) — same row shape as these REST endpoints.

## `GET /executions`

List recent executions. Bearer (`sf_…`) is scoped to that key. A Clerk session sees every key on the account (optionally filtered with `apiKeyId`).

```
GET /executions?status=failed&limit=20&batchId=bt_…&apiKeyId=ak_…
Authorization: Bearer <token>
```

Query params:

| Param | Type | Default | Notes |
|---|---|---|---|
| `status` | `pending` \| `running` \| `completed` \| `failed` \| `cancelled` | — | Unknown values are ignored. |
| `limit` | integer | 50 (max 200) | Most recent first. |
| `batchId` | string | — | Rows from one multi-URL request. `null` on single-URL runs. |
| `apiKeyId` | string | — | Clerk users only: filter to one key. Ignored for raw API-key auth. |

Response: `ExecutionRow[]`, newest first:

```ts
{
  id:           string;          // ex_…
  apiKeyId:     string;          // ak_…
  status:       'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
  batchId:      string | null;
  request:      ExecutionRequest; // scrape | analyse | map body; request.engine is html | browser | analyse | map
  result:       ExecutionResult | null;
  error:        unknown | null;
  recordingUrl: string | null;   // Playwright trace (browser), else null
  replayUrl:    string | null;   // live browser view; dies when the session is released
  startedAt:    string | null;   // ISO
  completedAt:  string | null;   // ISO
  createdAt:    string;          // ISO
}
```

`request.engine` is `html` \| `browser` \| `analyse` \| `map`.

## `GET /executions/:id`

Fetch a single execution. Returns `ExecutionRow` (same shape as above) or `404` if the id doesn't belong to your key (Bearer) or account (Clerk).

```bash
curl -sS https://api.scrapesilo.com/executions/ex_8bd378d8 \
  -H "Authorization: Bearer sf_…"
```

```json
{
  "id": "ex_8bd378d8",
  "apiKeyId": "ak_d102c5de",
  "status": "completed",
  "batchId": null,
  "request": { "url": "https://example.com", "engine": "browser", "actions": { "title": "h1" } },
  "result":  { "url": "https://example.com/", "data": { "title": "Example Domain" }, "tookMs": 153, "antibot": [] },
  "error": null,
  "recordingUrl": "https://assets.scrapesilo.com/recordings/ex_8bd378d8.zip",
  "replayUrl": null,
  "startedAt": "2026-08-13T19:20:44.354Z",
  "completedAt": "2026-08-13T19:20:44.663Z",
  "createdAt": "2026-08-13T19:20:44.360Z"
}
```

The dashboard's [/executions](/executions) page is a thin visual wrapper over these two endpoints.
