Offers
The public offer flow has one buyer offer and, when the seller chooses, one seller counter-offer. The buyer cannot counter again; the buyer must accept or reject the seller counter.
Prerequisites
- The product is currently available to this buyer.
- The product reports
offers_allowed: true. - The collector authorized the relevant offer scopes.
- A usable saved payment method and default shipping address are required before accepting a counter-offer or when an offer completes a purchase immediately.
Sequence
- Submit
POST /api/public/v1/offerswithproduct_id, buyer amount, and a new external ID. - Inspect the response:
- An offer response represents the current offer thread.
- A purchase response means the offer completed a purchase immediately.
- Read
GET /api/public/v1/offers/{offerId}or consume offer webhooks for changes. - When the latest offer is
PENDINGandfrom_sideisSELLER, either:- Accept it with
POST /api/public/v1/offers/{offerId}/accept. - Reject it with
POST /api/public/v1/offers/{offerId}/reject.
- Accept it with
- An accepted counter returns the same purchase schema as the buy endpoint.
Use GET /api/public/v1/offers?status=ACTIVE to return only offer threads whose latest offer is
pending and has not expired. The filter is applied before pagination.
Identifiers
ididentifies the latest offer message returned by Mascot.thread_idis stable across the original buyer offer and seller counter-offer.- Request
external_idvalues are generated by your integration and provide idempotency.
Use a distinct external ID for creating the offer and for each accept or reject action. Reusing an
action ID for a different offer or action returns 409 idempotency_conflict.
Webhooks
offer.createdis sent when the buyer offer is created.offer.updatedis sent when the current offer state changes, including a seller counter-offer.purchase.createdis sent when an accepted offer becomes a purchase.
Webhook deliveries can be duplicated, so use the envelope event ID for deduplication.