> ## Documentation Index
> Fetch the complete documentation index at: https://docs.originalis.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Progress & Streaming

> Live progress objects on every status read, and SSE streams for push-style updates.

## Progress on status reads

A running action's status read carries a `progress` object — pipeline
stages for deal analysis, the current stage for founder analysis, stage +
percent for research — so a poller can show real movement, not a spinner:

```json theme={null}
{
  "deal_id": "8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d",
  "status": "running",
  "progress": {
    "percent": 0.4,
    "stages": [
      { "name": "extract", "label": "Reading the deck", "status": "done", "done": 24, "total": 24 },
      { "name": "founders", "label": "Looking up the founders", "status": "active", "done": 1, "total": 2 }
    ]
  },
  "result_url": null
}
```

## Server-Sent Events

Append `/events` to any analysis resource for an SSE stream of the same
payloads:

```text theme={null}
GET /api/v1/deals/{deal_id}/analysis/events
GET /api/v1/founders/analyses/{analysis_id}/events
GET /api/v1/research/{research_id}/events
```

```bash theme={null}
curl -N -H "X-API-Key: $KEY" \
  "https://api.originalis.ai/api/v1/deals/$DEAL_ID/analysis/events"
```

Named events:

* `progress` — emitted on change
* `done` — terminal; carries `result_url`, then the server closes
* `error` — stream-level problem: reconnect or fall back to polling

Keep-alive comments arrive every 25 seconds. Streams are not resumable —
on reconnect the first `progress` event re-hydrates you. There's a small
per-key cap on concurrent streams; polling always works, and for backends
that can't hold a connection, use [webhooks](/guides/webhooks).
