Skip to content

The Day — one merchant-local date's departures, parties, riders, readiness and balances

GET
/days/{date}
curl --request GET \
--url https://quikstik-core.fly.dev/days/2026-04-15 \
--header 'Authorization: Bearer <token>' \
--header 'x-tenant-id: 2489E9AD-2EE2-8E00-8EC9-32D5F69181C0'

The one read the operator app’s Day tab, the Now tab’s “next departure” header and the conditions card render from. Rust composes it; the client does no grouping, counting or per-booking calls. Commerce-rooted (departures, bookings, obligations and agreements are the spine) even though it joins participants rosters/readiness, open threads, capacity and conditions — each leg is a batch read, so the SQL statement count does not grow with the number of bookings.

date is the merchant-local civil date (YYYY-MM-DD) in tz, the tenant’s one catalog time zone; the day is [local 00:00, next local 00:00). A tenant whose catalog declares no single zone answers 409 time_zone_unresolved rather than a guess.

Ordering: departures by start_at_ms; parties by lead display_name (case-insensitive).

Counting law: cancelled bookings are listed in parties with status: cancelled (the operator must see who dropped) and add nothing to riders, party_count, readiness, balance_due_minor or totals. A cancelled departure is listed with status: cancelled and contributes nothing either. A scheduled departure with no live parties still appears.

next_departure is the earliest scheduled departure on the date with start_at_ms >= now_ms, else null.

meeting_point is the departure’s (else its variant’s). A party’s agreed_start_at_ms / agreed_meeting_point appear only when its agreement differs from the departure and are never written onto the departure.

A party carries channel_ref (the OTA’s own booking reference, e.g. BR-1453533133) when the booking has one; absent otherwise.

party.balance.due_minor equals GET /obligations/{obligation_ref}/balance. Dues sum only within one currency: live parties in two currencies answer 409 mixed_currency.

Readiness folds the participants engine: blocked = a required requirement has a current attestation that fails it, missing = a required requirement has none (or only under a stale policy), else ready; missing lists the unmet requirement kinds.

Auth: a session, or an operator key scoped bookings.read.

date
required
string format: date

Merchant-local civil date, YYYY-MM-DD.

x-tenant-id
required
string format: uuid

Tenant identifier (UUID).

Authn/authz semantics are intentionally TBD for this contract slice; this header exists to keep the contract explicitly multi-tenant from day 0.

The day

Media typeapplication/json
object
date
required

Merchant-local civil date.

string format: date
tz
required

The tenant’s IANA zone the date is read in.

string
now_ms
required

Server clock the read was computed at, Unix ms.

integer format: int64
next_departure
required

Earliest scheduled departure with start_at_ms >= now_ms, else null.

object
departure_id
required
string format: uuid
start_at_ms
required
integer format: int64
variant_name
required
string
departures
required
Array<object>
object
departure_id
required
string format: uuid
status
required
string
Allowed values: scheduled cancelled
start_at_ms
required
integer format: int64
end_at_ms

Start + the variant’s duration, when known.

integer format: int64
variant_id
required
string format: uuid
variant_name
required
string
offering_name
required
string
meeting_point

The departure’s (else its variant’s); per-booking overrides stay on the party.

object
name
required
string
address
required
string
nullable
capacity
required

The departure’s pool; null when no pool is provisioned.

object
pool_key
required

Dep:{departure_id}

string
target
required
integer format: int64
committed
required
integer format: int64
remaining
required

Max(0, target - committed)

integer format: int64
conditions
required

From conditions_states; null when the departure is not scored.

object
state
required
string
Allowed values: ride watch guest_may_cancel operator_call
rule_name

The rule that fired, when the state came from one.

string
fired_hours
required
Array<integer>
riders
required

Riders on live parties.

integer
party_count
required

Live (non-cancelled) parties; the listing is parties.

integer
readiness
required
object
ready
required
integer
missing
required
integer
blocked
required
integer
balance_due_minor
required

Sum of live parties’ due, minor units.

integer format: int64
currency

ISO 4217, present when any live party carries a balance.

string
parties
required
Array<object>
object
booking_id
required
string format: uuid
obligation_ref
required
string format: uuid
reference
required

QS-XXXXXXXX, or the OTA’s VIA-… / GET-… number.

string
external_ref
string
channel_ref

The OTA’s own booking reference (BR-…, GYG-…), normalised; absent when the booking has none. Added 2026-10-26 (#932) — undeclared until 2026-10-27, which broke strict clients.

string
status
required
string
Allowed values: created cancelled
channel
required
string
Allowed values: direct viator getyourguide other
lead
required
object
display_name
required

Buyer name, else the first rider’s, else the reference.

string
email
string
phone
string
riders
required
integer
participants
required
Array<object>
object
participant_id
required
string format: uuid
person_id

The person behind the roster row; omitted when the row has none.

string format: uuid
room

The person’s room; present iff person_id is.

object
ref_type
required
string
Allowed values: person
ref_id
required
string format: uuid
display_name
required
string
nullable
readiness
required
string
Allowed values: ready missing blocked
missing
required

Unmet required requirement kinds; empty iff readiness is ready.

Array<string>
Allowed values: waiver eligibility competency_check
agreed_start_at_ms

Only when the agreement’s start differs from the departure’s.

integer format: int64
agreed_meeting_point

Only when the agreement’s place differs from the departure’s.

object
name
required
string
address
required
string
nullable
balance
required

Null when the booking has no obligation row.

object
gross_minor
required
integer format: int64
settled_minor
required
integer format: int64
due_minor
required

Gross - settled; equals GET /obligations/{ref}/balance.

integer format: int64
currency
required
string
open_thread_id

The party’s open (not closed, not archived) thread.

string format: uuid
held_send_id

A held reply on that thread, awaiting approval.

string format: uuid
room
required

The booking’s room: open GET /rooms/booking/{ref_id} with no second lookup.

object
ref_type
required
string
Allowed values: booking
ref_id
required
string format: uuid
totals
required
object
departures
required

Scheduled departures.

integer
parties
required

Live parties.

integer
riders
required
integer
balance_due_minor
required
integer format: int64
ready
required
integer
missing
required
integer
blocked
required
integer

Example

{
"departures": [
{
"status": "scheduled",
"conditions": {
"state": "ride"
},
"parties": [
{
"status": "created",
"channel": "direct",
"participants": [
{
"room": {
"ref_type": "person"
},
"readiness": "ready",
"missing": [
"waiver"
]
}
],
"room": {
"ref_type": "booking"
}
}
]
}
]
}

Invalid_session

Operator key without bookings.read

Time_zone_unresolved (no single catalog zone) or mixed_currency

Media typeapplication/json
object
reason
required

Stable, machine-readable reason code (e.g. “sold_out”, “processor_not_configured”, “rail_refused”).

string

Example

{
"reason": "sold_out"
}

Invalid_date

Media typeapplication/json
object
reason
required

Stable, machine-readable reason code (e.g. “sold_out”, “processor_not_configured”, “rail_refused”).

string

Example

{
"reason": "sold_out"
}

Days_unavailable (a leg is not wired or failed; no partial answer is served)

Media typeapplication/json
object
reason
required

Stable, machine-readable reason code (e.g. “sold_out”, “processor_not_configured”, “rail_refused”).

string

Example

{
"reason": "sold_out"
}