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

# Approvals & reviews

> Review media buys and creatives before they reach your inventory, with an advisory verdict on each.

When a gate in [AI Business Rules](/sell/ai-business-rules) is set to review, incoming media buys and
creatives wait in **Approvals & operations** until a person decides. Ask "What's waiting on me?" or
call `open_approvals`.

## What each item shows

| Part | Contents |
| - | - |
| **Request** | The buyer, advertiser, products, flight, budget and, for creatives, the rendered asset. |
| **Kind** | `create` for a new buy, `update` for a change to a live buy, or a creative review. |
| **Evaluation** | The advisory verdict (**Clearly on policy**, **Needs a look** or **Clearly against an explicit rule**), the recommendation, and each check with its result. |
| **Reviewer notes** | Your notes. On rejection they become the reason the buyer sees. |

The evaluation is advice. It never approves or rejects on its own, and a fresh evaluation never
changes an item's status.

## Deciding

Approve or reject in the page, or with `decide_media_buy_approval`:

```json decide_media_buy_approval theme={null}
{
  "approvalId": "appr_01JB7R2M4N6P8Q0S2T4V6X8Z0A",
  "decision": "rejected",
  "reviewerNotes": "We cannot run alcohol creative on our family programming. A non-alcohol variant would be welcome."
}
```

`decide_media_buy_approval` always asks the person to confirm before it acts.

## What happens next

* **Approved**: the buy is forwarded to your inventory source. The outcome is recorded (all
  completed, all submitted, partial, or failed), and the buyer's side moves to active once the
  source accepts.
* **Rejected**: the buyer's AdCP task ends as rejected, with your notes as the reason.

Items waiting too long raise an aging notice, so buyers are never left pending without anyone knowing.
If nobody eligible can approve, items stay held; they are never auto-approved.

## Media buys on your storefront

`open_media_buys_page` lists every buy on the storefront, most urgent first. `open_page` (`page: "media_buy_timeline"`)
shows one buy's stages (received, screened, decided, forwarded, accepted, delivering) with timestamps
and where it is stuck.

## Decisions are final

An item moves `pending → approved` or `pending → rejected`. Deciding an item that's no longer pending
fails ("Cannot approve an approval that is approved."), so a double decision can't slip through. A
pending approval for a proposal draft becomes `revoked` when that draft is discarded.

## When forwarding fails

Approval and forwarding are separate. If your approval is recorded but the forward to the inventory
source failed, re-send it with `retry_forward` (the media buy id or its approval id). It reuses the
same idempotency key, so a source that already received the buy can't book it twice. The result is
`forwarded`, `forward_failed` or `awaiting_source`. `retry_forward` asks the person to confirm.

## Over REST

All under `/api/v2/storefront`:

| Endpoint | What it does |
| - | - |
| `GET /media-buy-approvals?status=pending` | The queue, filtered by `status` (`pending` by default). |
| `GET /media-buy-approvals/{mediaBuyId}` | One item with its request and evaluation. |
| `POST /media-buy-approvals/{mediaBuyId}/evaluate` | Run the advisory evaluation again. |
| `POST /media-buy-approvals/{mediaBuyId}/decide` | `decision` (`approved` or `rejected`) and optional `reviewerNotes`. |
| `POST /media-buys/{mediaBuyId}/retry-forward` | Retry a failed forward. |

## Not available yet

* A delivery-readiness block on pending items (packages without a creative, creatives that don't fit
  and why, creative sync failures). Check the buy's creatives on the timeline before approving.
