Skip to content

Open receivables behind the summary, bucket order then largest due first

GET
/money/receivables
curl --request GET \
--url 'https://quikstik-core.fly.dev/money/receivables?bucket=overdue&limit=50' \
--header 'Authorization: Bearer <token>'

Core’s view, not the ledger’s and not Stripe’s (source: "core"). One row per non-cancelled booking whose obligation still has a balance owed (due_minor > 0), with the same window, bucket and accrual semantics as GET /money/summary: a receivable is an unpaid balance by departure date — not revenue, not cash. due_minor equals the amount GET /obligations/{ref}/balance serves for the same obligation. Ordered by bucket (overdue, today, next_7, later), then due_minor descending, then obligation_ref.

lead is the contact stamped on the obligation; display_name falls back to the email, then the phone, then "Unnamed guest", while email/phone stay null when absent. last_reminder_at_ms is the newest delivered balance-reminder email recorded for the obligation (the delivery webhook’s recorded time, not the send time); null if none. The booking channel and a pay-link token are not exposed: core stores no channel on a booking, and a balance link persists only its token hash (the plaintext exists once, at mint).

Session, or an operator key scoped bookings.read. limit defaults to 50, max 200 (invalid_limit, 422).

from
string format: date

Window start, a merchant-timezone calendar date (YYYY-MM-DD). Window is at most 92 days.

to
string format: date

Window end, inclusive (YYYY-MM-DD).

bucket

Departure-date bucket of an open receivable, relative to the merchant’s today.

string
Allowed values: overdue today next_7 later

Restrict to one departure bucket (invalid_bucket, 422, otherwise).

limit
integer
default: 50 >= 1 <= 200

Open receivables, core’s view

Media typeapplication/json
object
from
required
string format: date
to
required
string format: date
tz
required
string
source
required
string
Allowed values: core
items
required
Array<object>

One open receivable (an unpaid balance on a non-cancelled booking). Core’s view.

object
obligation_ref
required
string format: uuid
reference
required

Guest-facing QS-XXXXXXXX reference.

string
booking_id
required
string format: uuid
bucket
required

Departure-date bucket of an open receivable, relative to the merchant’s today.

string
Allowed values: overdue today next_7 later
departure_at_ms
required
integer format: int64
variant_name
required
string
nullable
lead
required

The guest to contact, from the contact stamped on the obligation.

object
display_name
required

Name, else email, else phone, else “Unnamed guest”.

string
email
required
string
nullable
phone
required
string
nullable
gross_minor
required

Full amount owed, tax included.

integer format: int64
settled_minor
required

Settled so far, as core last synced it.

integer format: int64
due_minor
required

Gross - settled; equals GET /obligations/{ref}/balance. Always greater than 0.

integer format: int64
currency
required
string
days_to_departure
required

Departure date minus today in the merchant timezone; negative once overdue.

integer
last_reminder_at_ms
required

Newest delivered balance-reminder email recorded; null if none.

integer format: int64
nullable

Example

{
"source": "core",
"items": [
{
"bucket": "overdue"
}
]
}

Missing or invalid session bearer token

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"
}

The session’s effect authority does not cover this operation

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 query. reason is one of invalid_date, invalid_window (from after to), window_too_large (more than 92 days), invalid_limit, invalid_bucket.

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"
}

No durable backend is wired for this operation (fail-closed)

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"
}