Holding a timed slot

Last updated ยท Page 5 of 11

A product booked on groupon.com (its options carry a bookingUrl) can be paid for one exact day and time. Read the product's availability, let the shopper pick a slot and its tickets (each ticketTypeId from the slot's tickets, at most 20 tickets in all), then hold them:

bash
curl -s -X POST "https://api-core.livingsocial.com/partner_storefront/products/<productId>/holds" \
  -H "Authorization: Bearer $GROUPON_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"optionId":"<optionId>","date":"2026-11-05","time":"11:00","tickets":[{"ticketTypeId":"<ticketTypeId>","quantity":2}],"idempotencyKey":"<your key for this choice>"}'

Groupon holds the tickets for 15 minutes and answers holdId, expiresAt, each ticket's price, the total, and bookingUrl, Groupon's page where the shopper pays for exactly that slot until expiresAt. Nothing releases a hold earlier, so hold only when the shopper is about to pay, one slot per shopper at a time. With a confirmed CJ publisher ID, bookingUrl is CJ's click link around that page, as buyLink is, with the hold's id as the sale's SID.

Reuse idempotencyKey when you retry the same choice: the same key, slot and tickets answer the same hold, never a second one. validateOnly: true checks the slot and prices the tickets without holding anything.

At most 20 holds of your storefront are open at once (placed and not lapsed). Past that a hold answers 429 with details.error OPEN_HOLDS_LIMIT and details.retryAfterSeconds, the seconds until your oldest open hold lapses. Every refusal the shopper can book around (HOLDS_NOT_AVAILABLE, SLOT_NOT_AVAILABLE, HOLD_REFUSED) carries details.bookingUrl, Groupon's booking page for the option, where the shopper picks the slot and pays. Holds are open on the Partner API from this release.