Skip to content

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.

{
  "starts_at": "2026-11-20T19:00:00+01:00",
  "created_at": "2026-07-01T09:30:00+02:00"
}

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_date or a pass expiration_date, is returned as stored.
  • A day derived from a moment, such as a client's joined_date or a client subscription's first_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