> ## 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.

# Storefront proposals

> Freeze a discovery offer and mint a shareable proposal code a buyer can redeem

A **storefront proposal** captures a discover-products response, binds it to a buyer (operator), and mints a short, shareable `proposalCode`. The seller runs discovery, picks the proposal they want to extend, and saves it; the buyer later redeems the code on `discover_products` to receive the exact frozen offer. The saved snapshot — products and proposals — does not change after creation, so the offer the buyer sees is the offer the seller approved.

Proposals move through a lifecycle: `active` (available to redeem), `redeemed` (the buyer applied it to a media buy), `expired` (past its TTL), and `revoked` (the seller withdrew it). You set an `expiresAt` on creation; you can edit the label, notes, or expiry while it is open, and revoke it to pull it back.

All examples use the storefront base URL:

```
https://api.interchange.io/api/v2/storefront
```

Authenticate every request with `Authorization: Bearer $SCOPE3_API_KEY`.

## Task reference

<CardGroup cols={2}>
  <Card title="Create proposal" href="/v2/storefront/proposals/tasks/create-proposal" icon="plus">
    `POST /proposals` — freeze a discovery offer and mint a code
  </Card>

  <Card title="List proposals" href="/v2/storefront/proposals/tasks/list-proposals" icon="list">
    `GET /proposals` — all proposals, filterable by status and operator
  </Card>

  <Card title="Get proposal" href="/v2/storefront/proposals/tasks/get-proposal" icon="magnifying-glass">
    `GET /proposals/{id}` — one proposal with its saved snapshot
  </Card>

  <Card title="Update proposal" href="/v2/storefront/proposals/tasks/update-proposal" icon="pen">
    `PATCH /proposals/{id}` — edit label, notes, or expiry
  </Card>

  <Card title="Revoke proposal" href="/v2/storefront/proposals/tasks/revoke-proposal" icon="ban">
    `POST /proposals/{id}/revoke` — withdraw a code so it can't be redeemed
  </Card>
</CardGroup>
