Dates, time zones and amounts¶
This page gives the formats every V2 field and filter follows for moments, days and money. It applies to V2 REST responses, V2 requests and V2 webhook payloads. For filter names and pagination, see Pagination and filtering. For the unit of each billing amount, see Read billing data.
The company's time zone¶
V2 reads and writes moments in the company's time zone. Read the table to see which time zone applies to each surface.
| Surface | Time zone |
|---|---|
GET request without X-Timezone-Name |
The company's |
GET request with a valid X-Timezone-Name, such as Asia/Tokyo |
The time zone the header names, for that request only |
Write request (POST, PATCH, PUT, DELETE) |
The company's, even with the header |
| Webhook payload | The company's: webhooks have no header |
The header accepts an IANA time zone name. An unknown name is ignored and the company's time
zone applies. A class keeps its moments in the company's time zone even when its venue is in
another time zone; /venues/ still returns the venue's own timezone.
Moments¶
A field ending in _at, or describing a moment such as bookable_from, is an ISO 8601
timestamp with the UTC offset of the time zone above at that moment.
A zero offset is written +00:00, never Z. RFC 9557 reads Z as "UTC, local offset
unknown", while +00:00 states that the local offset is zero. Companies at UTC+0 see
+00:00: UTC companies, and the UK, Ireland and Portugal in winter.
Days¶
A field ending in _date is a day, YYYY-MM-DD, without a time or an offset.
- A day stored as a day, such as
birth_dateor a passexpiration_date, is returned as stored. - A day derived from a moment, such as a client's
joined_dateor a client subscription'sfirst_billing_date, is the day of that moment in the time zone above.
Sending moments and days¶
A timestamp you send without a UTC offset is read in the time zone above. Send the offset to
remove any doubt. In a query string, encode + as %2B: a raw + reads as a space.
Filters take the type of the field they filter, and both bounds are inclusive.
| Field filtered | Filter names | Value sent |
|---|---|---|
A moment, such as created_at |
created_after, created_before |
An ISO 8601 timestamp |
A day, such as joined_date |
joined_after_date, joined_before_date |
A day, YYYY-MM-DD |
A filter on a moment drops a trailing _at: starts_at gives starts_after and
starts_before, and the bookings field class_start_at gives class_start_after and
class_start_before.
A plain date sent to a moment filter means midnight
A moment filter also accepts a plain date, read as midnight at the start of that day in
the time zone above. created_before=2026-03-11 therefore stops at the start of March 11,
2026, and leaves that day out. To include the whole day, send 2026-03-11T23:59:59.999999.
Amounts¶
Every amount is a decimal string in major units of the company's currency: "49.00" means
EUR 49.00 when the company bills in euros. Strings keep the exact cents, whereas most JSON
clients read numbers as floating-point values.
| Value | Format | Example |
|---|---|---|
| Amount: price, total, tax, discount, balance | Decimal string in major units | "49.00" |
| Rate | Decimal-string percentage | "20.000" means 20% |
| Credits and counts | Integer | credit_price: 2 |