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