---
title: "Get Execution Run Episodes"
method: GET
path: "/v1/deployments/{deployment_id}/executions/{execution_run_id}/episodes"
tags: ["execution-analytics"]
---

# Get Execution Run Episodes

`GET /v1/deployments/{deployment_id}/executions/{execution_run_id}/episodes`

## Request

- Base URL: `https://api.usekeel.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.usekeel.io/v1/deployments/{deployment_id}/executions/{execution_run_id}/episodes`
- Auth: none declared

The run's per-episode receipt index (Q-0908).

A run's receipts are per EPISODE and Q-0341 (still in force) refuses to
let one of them stand as the run's summary. Post-cutover no run has a
single episode, so without this route the entire sealed-receipt surface
was unreachable from the executions timeline. Nothing here aggregates
across episodes.

An unknown or foreign run_id returns an EMPTY list rather than 404: the
org/deployment scope is already enforced above, and "this run has no
native episodes" is a real answer (a legacy-routed run, a dispatch that
has not produced episodes yet). A 404 would make those indistinguishable
from a deployment the caller cannot see.

## Path parameters

- `deployment_id` string, required
- `execution_run_id` string, required

## Headers

- `Authorization` string, nullable
- `X-Org-Id` string, nullable

## Response `200`

Successful Response

- ExecutionRunEpisodesResponse: The per-episode receipt index for ONE run (Q-0908). `episode_count` is `len(episodes)` by construction — both come from the same NATIVE-episode selector `_RUN_EPISODE_COUNT_SQL` counts, so the number the timeline row shows and the number of rows this returns cannot disagree. `sealed_receipt_count` / `provisional_count` are counted over the returned episodes for the same reason. There is deliberately NO run-level quality field here. See `ExecutionRunEpisode`.
  - `execution_run_id` string, required
  - `episode_count` integer, required
  - `sealed_receipt_count` integer, required
  - `provisional_count` integer, required
  - `episodes` ExecutionRunEpisode[], required
    - `session_id` string, required
    - `intent_rev` integer, required
    - `symbol` string, required
    - `side` 'BUY' | 'SELL' | 'NONE', nullable
    - `action_state` string, required
    - `zero_action_reason` string, nullable
    - `style` string, nullable
    - `outcome` string, nullable
    - `quality_summary` ExecutionQualitySummary: Server-authored compact projection of provisional or sealed evidence. Decimal values remain canonical base-10 strings. In particular, this response model must never turn exact NUMERIC values back into binary floats for the existing execution timeline. A provisional projection has no receipt identity: immutable receipt IDs and versions begin only at sealing.
      - `receipt_id` string, nullable
      - `receipt_version` integer, nullable
      - `session_id` string, required
      - `intent_rev` integer, required
      - `state` 'PROVISIONAL' | 'SEALED' | 'CORRECTED' | 'INCOMPLETE' | 'PROJECTION_MISMATCH' | 'ZERO_ACTION', required
      - `corrected` boolean, required
      - `record_origin` 'NATIVE', required
      - `target_quantity` string, required
      - `filled_at_e_quantity` string, required
      - `filled_final_quantity` string, required
      - `residual_at_e_quantity` string, required
      - `vwap_at_e` string, nullable
      - `vwap_final` string, nullable
      - `duration_ms` integer, nullable
      - `terminal_reason` string, required
      - `outcome` string, required
      - `economics_state` 'SCORED' | 'UNSCORABLE' | 'NOT_APPLICABLE', required
      - `decision_mid` string, nullable
      - `arrival_mid` string, nullable
      - `decision_filled_price_cost_reporting` string, nullable
      - `decision_fee_reporting` string, nullable
      - `decision_residual_cost_reporting` string, nullable
      - `decision_all_in_shortfall_reporting` string, nullable
      - `arrival_filled_price_cost_reporting` string, nullable
      - `arrival_fee_reporting` string, nullable
      - `arrival_residual_cost_reporting` string, nullable
      - `arrival_all_in_shortfall_reporting` string, nullable
      - `decision_bps` string, nullable
      - `arrival_bps` string, nullable
      - `fee_native_at_e` ExecutionNativeFeeTotal[], required
        - `currency` string, required
        - `amount` string, required
      - `fee_reporting_at_e` string, nullable
      - `fee_components_at_e` ExecutionNativeFeeComponents[], required
        - `currency` string, required
        - `total` string, required
        - `builder` string, required
        - `venue` string, nullable
      - `missing_fee_components` string[], required
      - `completion_at_e` string, nullable
      - `final_completion` string, nullable
      - `reporting_asset_version_id` string, required
      - `metric_version` string, required
      - `completeness` 'COMPLETE' | 'INCOMPLETE' | 'BLOCKED', required
      - `missing_reasons` string[], required
      - `markout_favorable_1s_bps` string, nullable
      - `markout_favorable_5s_bps` string, nullable
      - `markout_favorable_30s_bps` string, nullable
      - `net_capture_30s_bps` string, nullable
      - `markout_completeness` 'COMPLETE' | 'PARTIAL' | 'MISSING' | 'NOT_APPLICABLE', nullable
      - `markout_source` string, nullable
      - `interval_twap_mid` string, nullable
      - `interval_vwap_mid` string, nullable
      - `interval_twap_bps` string, nullable
      - `interval_vwap_bps` string, nullable
      - `participation_of_volume` string, nullable
      - `interval_twap_required_seconds` string, nullable
      - `interval_twap_covered_seconds` string, nullable
      - `interval_twap_max_gap_ms` integer, nullable
      - `interval_twap_edge_covered_seconds` string, nullable
      - `interval_twap_lead_carry_age_ms` integer, nullable
      - `interval_twap_tail_carry_age_ms` integer, nullable
      - `interval_twap_update_count` integer, nullable
      - `interval_vwap_print_count` integer, nullable
      - `unfilled_opportunity_cost_reporting` string, nullable
      - `unfilled_reference_mid` string, nullable
      - `unfilled_reference_window_start` string, date-time, nullable
      - `unfilled_reference_window_end` string, date-time, nullable
      - `unfilled_reference_max_gap_ms` integer, nullable
      - `unfilled_horizon_at` string, date-time, nullable
      - `unfilled_horizon_kind` string, nullable
      - `unfilled_reference_missing_reason` string, nullable
      - `decision_all_in_shortfall_ruled_horizon_reporting` string, nullable
      - `decision_benchmark_source` string, nullable
      - `decision_benchmark_venue_age_ms` integer, nullable
      - `decision_benchmark_receive_age_ms` integer, nullable
      - `arrival_benchmark_source` string, nullable
      - `arrival_benchmark_venue_age_ms` integer, nullable
      - `arrival_benchmark_receive_age_ms` integer, nullable
      - `end_benchmark_source` string, nullable
      - `end_benchmark_venue_age_ms` integer, nullable
      - `end_benchmark_receive_age_ms` integer, nullable

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/usekeel/apis/keel-api.md) · [All operations](https://skmtc.dev/usekeel/apis/keel-api/llms.txt) · [OpenAPI document](https://skmtc.dev/usekeel/apis/keel-api/revisions/3191ca10b0ab?raw)
