Skip to main content
GET
Subscription Billing month grid (scheduled, at risk, settled)

Authorizations

Authorization
string
header
required

Bearer token authentication. Requires a company-admin token whose role holds reports.view.

Query Parameters

month
string

Calendar month to report on, as YYYY-MM. Defaults to the current month. A value that is not this exact shape (or names a month that does not exist, such as 2026-13) returns 400 rather than being coerced.

Pattern: ^\d{4}-\d{2}$
Example:

"2026-09"

country
string

ISO alpha-2 code of one of the requesting company's configured countries (see GET /countries). When present, every service on this endpoint filters its data to that country and reports money in the country's own currency. Omit (or send "all") for the aggregate-across-countries view, which is the default and matches pre-Phase-004 behavior. Unknown ISO codes or ones the company is not configured for return 400.

Example:

"US"

tz
string

IANA timezone name (e.g. America/Denver) or Rails-style alias (Eastern Time (US & Canada)) used to anchor "today" boundaries and hour-of-day bucketing. The frontend sends Intl.DateTimeFormat().resolvedOptions().timeZone. Unknown or malformed values silently fall back to UTC — callers omit the param when the endpoint doesn't need wall-clock alignment (see CURRENT-3077).

Example:

"America/Denver"

Response

Month grid payload

month
string<date>
required

First of the month reported.

Example:

"2026-09-01"

time_zone
string
required

IANA zone the scheduled half was bucketed in — the tz that was sent, or UTC when it was missing or unknown. Echoed so the grid can label which day boundaries it is drawing. The settled half needs no such note: billing events carry an already-local date.

Example:

"America/Denver"

currency
string
required

ISO 4217 three-letter code (uppercase).

Required string length: 3
Example:

"USD"

days
object[]
required

One entry per date in the month, ascending, always the full month. A quiet month returns zero-filled days rather than an empty array, so the grid can tell "nothing happened" from "nothing loaded".

totals
object
required

Month-level sums. renewal_* rolls scheduled and overdue together; the two questions differ, and a previous month is always read after its own overdue floor has passed, so a month-over-month comparison against scheduled_* alone would show nothing there.

previous_totals
object
required

Month-level sums. renewal_* rolls scheduled and overdue together; the two questions differ, and a previous month is always read after its own overdue floor has passed, so a month-over-month comparison against scheduled_* alone would show nothing there.