POST /api/v2/storefront/storefronts/{storefrontId}/demand-signals/{signalId}/respond
Records a seller action against a demand signal routed to the caller’s storefront. The call is transactional: it writes the response, advances the per-target dispatch status (ACKNOWLEDGED for QUOTE/CLARIFY/BOOK, DECLINED for DECLINE), and re-evaluates the parent signal’s status. BOOK is terminal — once a signal is BOOKED it cannot move backward.
Request
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
storefrontId | integer | Yes | Storefront the caller owns (path) |
signalId | integer | Yes | Demand signal identifier (path) |
kind | enum | Yes | QUOTE, CLARIFY, DECLINE, or BOOK. Determines the payload shape |
payload | object | Yes | Shape depends on kind (see below) |
payload by kind:
- QUOTE —
proposedCpm(number, required, > 0),currency(3-letter, required),products[](eachproductIdrequired; optionalname,estimatedImpressions),notes(optional, max 4000). - CLARIFY —
question(required, max 4000),gaps[](optional list of strings). - DECLINE —
reason(required, max 4000). - BOOK —
dealId(required),notes(optional, max 4000).
Response
proposalCode the buyer’s agent can redeem via discover_products. proposalCode is null on DECLINE, or when operator resolution failed at quote time.
Errors
400 VALIDATION_ERROR—payloaddoes not matchkind, missing required payload field, orproposedCpm≤ 0.403 FORBIDDEN— thedemand-supply-signalsfeature is not enabled, or the caller does not own the storefront.404 NOT_FOUND— the signal is not routed to this storefront.
Related
Demand signal tasks
All demand-signal operations
Test-fit demand signal
Preview the match before responding
Get demand signal
One signal with its target row
List demand signals
Filterable, paginated list