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.
A controlled synthetic evaluation
does not create or redeem a storefront proposal code. It opens an immutable
synthetic RFP turn in Proposal Pass. Its rate-card figures are planning
examples, not live prices or buyer-quotable rates. Custom fulfilment requires
a named human or Connect follow-up.
Authorization: Bearer $SCOPE3_API_KEY.
Task reference
Create proposal
POST /proposals — freeze a discovery offer and mint a codeList proposals
GET /proposals — all proposals, filterable by status and operatorGet proposal
GET /proposals/{id} — one proposal with its saved snapshotUpdate proposal
PATCH /proposals/{id} — edit label, notes, or expiryRevoke proposal
POST /proposals/{id}/revoke — withdraw a code so it can’t be redeemed