---
title: Get Execution
api: GET /brands/{brand_id}/executions/{execution_id}
description: "Retrieve a completed content draft. The article content lives in the outputs field."
---

> **For AI agents:** the complete documentation index is at [llms.txt](https://docs.boringmarketing.com/llms.txt). Append `.md` to any page URL for its markdown version.

Returns a single completed execution. The generated article content lives in the `outputs` field (a JSON object produced by the content agent — shape depends on the execution `format`).

## Path parameters

<ParamField path="brand_id" type="string" required>
  The brand UUID.
</ParamField>

<ParamField path="execution_id" type="string" required>
  The execution UUID. This is **not** the same as the `run_id` returned from `POST /brands/{id}/execute` — list executions first to find the right ID.
</ParamField>

## Response

```json
{
  "id": "exec-uuid",
  "brand_id": "brand-uuid",
  "run_id": "exec-run-uuid",
  "brief_id": "brief-uuid",
  "format": "comparison",
  "status": "draft",
  "content": {
    "title": "Best AI Marketing Tools in 2026: Complete Comparison",
    "body": "# Best AI Marketing Tools in 2026\n\nMarketing teams face a paradox...",
    "word_count": 2847
  },
  "gate_scores": null,
  "created_at": "2026-04-07T10:45:00Z",
  "updated_at": "2026-04-07T10:48:12Z"
}
```

## Field notes

| Field | Description |
|-------|-------------|
| `id` | Execution UUID. **Not** the same as the `run_id` returned from `POST /execute` — fetch executions via this ID. |
| `run_id` | Pipeline run that produced this execution. |
| `brief_id` | The brief used as input. |
| `format` | One of `hub_and_spokes`, `single_article`, `programmatic`, `comparison`, `landing_page`. |
| `content` | Opaque JSON blob produced by the content agent. The shape **is not a stable API contract** — it reflects whatever the current content agent emits and may change between deployments. Tolerate unknown keys; do not hard-code paths beyond `title` / `body`-style top-levels you have verified at runtime. |
| `gate_scores` | **Reserved — always `null` in the current implementation.** Quality gate scores are not produced today. |
| `status` | **Always `"draft"` in the current implementation.** State transitions (`queued` → `running` → `done` / `failed`) are planned but not wired — the value is set once at persist time and never updated. To know whether the execution finished, poll the `run_id` (`GET /brands/{id}/runs/{run_id}`), not the execution row. |

## List all executions

To list all executions for a brand:

```bash
curl -H "X-API-Key: $BM_API_KEY" \
  https://api.boringmarketing.com/brands/$BRAND_ID/executions
```

## Example

```bash
# First find the execution_id
curl -H "X-API-Key: $BM_API_KEY" \
  https://api.boringmarketing.com/brands/$BRAND_ID/executions

# Then fetch the full execution
curl -H "X-API-Key: $BM_API_KEY" \
  https://api.boringmarketing.com/brands/$BRAND_ID/executions/$EXECUTION_ID
```
