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

# Decide a review

> Approve or reject a pending creative review

`POST /api/v2/storefront/creative-reviews/{creativeId}/decide`

Records a terminal decision on a pending creative review. Only `pending → approved` and `pending → rejected` transitions are allowed — revoking a previously-approved creative is a separate gesture and `revoked` is not a valid value here. Approved creatives are forwarded to the underlying sales agent verbatim; your reviewer note travels back to the buyer in their `sync_creatives` follow-up.

## Request

<CodeGroup>
  ```bash Approve theme={null}
  curl -X POST \
    "https://api.interchange.io/api/v2/storefront/creative-reviews/cr_abc123/decide" \
    -H "Authorization: Bearer $SCOPE3_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "status": "approved"
    }'
  ```

  ```bash Reject theme={null}
  curl -X POST \
    "https://api.interchange.io/api/v2/storefront/creative-reviews/cr_abc123/decide" \
    -H "Authorization: Bearer $SCOPE3_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "status": "rejected",
      "reviewer_notes": "Logo lockup violates publisher brand-safety guidelines"
    }'
  ```
</CodeGroup>

## Parameters

| Field            | Type   | Required | Notes                                                                                   |
| ---------------- | ------ | -------- | --------------------------------------------------------------------------------------- |
| `creativeId`     | string | Yes      | Path param — AdCP creative id as supplied by the buyer                                  |
| `status`         | enum   | Yes      | Decision to record. `approved` or `rejected` only — `revoked` is not allowed here       |
| `reviewer_notes` | string | No       | Free-text note visible to the buyer in their `sync_creatives` follow-up. Max 2000 chars |

## Response

```json theme={null}
{
  "id": "42",
  "storefrontId": "1234",
  "creativeId": "cr_abc123",
  "mediaBuyId": "mb_2026_q2_ctv",
  "buyerCustomerId": 8801,
  "submittedPayload": {
    "creative_id": "cr_abc123",
    "format": "video",
    "media_url": "https://cdn.acme-brand.example/spots/launch-30s.mp4"
  },
  "status": "rejected",
  "reviewedBy": "5567",
  "reviewedAt": "2026-06-02T13:45:00Z",
  "reviewerNotes": "Logo lockup violates publisher brand-safety guidelines",
  "createdAt": "2026-06-02T11:00:00Z",
  "updatedAt": "2026-06-02T13:45:00Z"
}
```

Returns the decided `CreativeReviewResponse`. `reviewedBy`, `reviewedAt`, and `updatedAt` are stamped at decision time. Deciding a row that is already decided is rejected — re-deciding is not a no-op.

## Errors

* `400 VALIDATION_ERROR` — missing `status`, or `status` is not `approved` or `rejected`.
* `404 NOT_FOUND` — no creative review row with that id exists for your storefront.

See [Errors](/v2/reference/errors) for the full error contract.

## Related

<CardGroup cols={2}>
  <Card title="Get a review" href="/v2/storefront/creative-reviews/tasks/get-review" icon="magnifying-glass">
    Inspect the creative before deciding
  </Card>

  <Card title="List reviews" href="/v2/storefront/creative-reviews/tasks/list-reviews" icon="list">
    See the pending queue
  </Card>

  <Card title="Creative review tasks" href="/v2/storefront/creative-reviews/tasks" icon="list-check">
    All creative-review operations
  </Card>

  <Card title="Creative reviews overview" href="/v2/storefront/creative-reviews/overview" icon="image">
    Queue lifecycle and concepts
  </Card>
</CardGroup>
