Every store's bookings, for your operations desk
const url = 'https://data.creatorain.com/partner/v1/reservations?from=2026-09-01&to=2026-09-30&status=pending&acknowledged=false&limit=50';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://data.creatorain.com/partner/v1/reservations?from=2026-09-01&to=2026-09-30&status=pending&acknowledged=false&limit=50' \ --header 'Authorization: Bearer <token>'The same rows as the per-store list, across every store enrolled under your key, each row
also carrying partner_location_id and location_id so it can be attributed.
YOUR “NEEDS FOLLOW-UP” LIST IS THIS CALL WITH FOUR PARAMETERS:
GET /partner/v1/reservations?status=confirmed&from=2026-09-11&to=2026-09-12&acknowledged=false
Those are the visits arriving that nobody at the restaurant has confirmed seeing, and they
are the same bookings unacknowledged_upcoming on GET /summary counts, so a desk can go
from the number straight to the rows.
PARTNER KEY ONLY. A store token cannot read this: a merchant’s browser must never be able to read the whole chain’s schedule, which is the reason the per-store credential exists.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Earliest VISIT DATE to include, YYYY-MM-DD in the store’s own calendar. A value we cannot
read is refused rather than ignored: a reconciliation run whose window was silently dropped
would read the whole book and report it as one month.
Example
2026-09-01Latest VISIT DATE to include, YYYY-MM-DD, inclusive.
Example
2026-09-30Return only bookings in this state.
true for bookings a human at the restaurant has confirmed seeing (you told us so with
POST /reservations/{reservation_id}/acknowledge), false for the ones nobody has. Omit
it for both.
1 and 0 are accepted as well. ANY OTHER VALUE IS REFUSED with 400 validation_error
rather than ignored, and that is on purpose: a follow-up list that silently returned every
booking would show your desk a queue of work that has already been done.
Example
falseThe next_cursor from the previous page, sent back UNCHANGED. Omit it for the first page.
It is opaque: do not build one yourself. It names a POSITION in the sort order rather than
a count of rows to skip, which is why a page stays stable when a booking is touched between
two requests. A cursor we did not issue is refused with 400 validation_error, rather than
silently treated as the first page, so a broken client fails loudly instead of looping over
page one for ever.
Rows per page. Default 50, maximum 200. A larger value is CLAMPED to 200 rather than refused, so you never have to guess the ceiling.
Responses
Section titled “Responses”A page of bookings across every store of this key.
object
One creator booking. NO PERSONAL DATA: no guest name, email or phone, no internal notes, and no free-text party note (those routinely carry dietary and medical detail).
object
Who made the booking. Every booking on this API is a CreatoRain creator visit, so this
is always creatorain. Also on the reservation webhook events.
Always true: the visit is at no charge to the store (show it as “CreatoRain, no
charge”). Also on the reservation webhook events.
RFC 3339 with the STORE’S offset. The digits are the restaurant’s wall clock, so render them as they are; do not convert.
How many people are coming, the creator included. Always a number: 2 (the creator plus one guest) when the booking does not state one. The same value the webhook events send.
As much of the creator as an outside system may see. Their contact details are never returned on this API.
object
Their public handle.
Cross-platform follower total, not one platform’s count.
The platforms they publish on. Always an array, never null.
The dish chosen for this booking, or null when none was chosen. Never a guess from the store’s menu. The same value the webhook events send.
RFC 3339 with the store’s offset.
RFC 3339 with the store’s offset. This is the sort key of the list.
When a human at the restaurant told us they had seen this booking, RFC 3339 with the
STORE’S offset. Null when nobody has, which is what acknowledged=false filters on.
THE EARLIEST ACKNOWLEDGEMENT, not the latest. A booking can carry both kinds (forwarded to the manager, and acknowledged), and the question this answers is “has anybody seen this yet, and when”.
Which kind that earliest acknowledgement was. Null when there is none.
Present only on GET /reservations, where a row has to say which store it belongs to.
Present only on GET /reservations.
Send this back as cursor for the next page. NULL means this was the last page, and it
is honest about that: we read one row beyond your limit to answer the question, so a
page that happens to be exactly full does not cost you an extra empty request.
Example
{ "items": [ { "booked_by": "creatorain", "no_charge": true, "status": "pending", "arrive_at": "2026-09-14T19:00:00-07:00", "timezone": "America/Los_Angeles", "party_size": 2, "creator": { "handle": "example_creator", "followers": 48213, "platforms": [ "instagram", "tiktok" ] }, "acknowledged_at": "2026-09-11T16:04:12-07:00", "acknowledged_kind": "forwarded_to_manager" } ]}validation_error. field names the offending parameter.
object
object
The stable value to branch on.
A human sentence. Copy, not contract; it may be reworded.
The request field at fault, dotted for a nested one (plan.term_months).
Example
{ "error": { "code": "unauthorized" }}unauthorized. A missing, malformed, unknown or revoked key; or an invalid, expired or
wrong-store dashboard token. One answer for every case on purpose: the holder of a bad
credential learns nothing from the difference.
object
object
The stable value to branch on.
A human sentence. Copy, not contract; it may be reworded.
The request field at fault, dotted for a nested one (plan.term_months).
Example
{ "error": { "code": "unauthorized" }}rate_limited. Over this key’s requests-per-minute ceiling.
object
object
The stable value to branch on.
A human sentence. Copy, not contract; it may be reworded.
The request field at fault, dotted for a nested one (plan.term_months).
Example
{ "error": { "code": "unauthorized" }}