Skip to main content

Amounts are strings of minor units

An amount is a whole number of the currency’s smallest unit, written as a string. With two decimals, "500000" in NGN is ₦5,000.00 and "10000" in USD is $100.00. There are no floats anywhere. Request amounts are digits only: no sign, separator or decimal point, and at most 38 digits. Zero is refused on a posting. A currency’s decimals are its scale, from GET /v1/ledgers. A balance can be negative, for example an overdrawn account, so posted and available may start with -. Do not parse them as unsigned.

Other numbers

64-bit integers are strings too: balance.version, page.total and event seq. 32-bit integers are JSON numbers: posting.seq, rateBps.

Zero values

A field at its zero value is left out of responses. That means empty strings, 0, false and empty lists. A new account’s balance has no version, the first posting of an entry has no seq, and a schedule with active: false has no active. Read a missing field as its zero value.

Ids

Ids are a prefix and a base32 string, like acc_01M6F1BK8KE6JT32WRN50HYC4R. Treat them as opaque. Approval ids take a prefix from their kind, such as adj_ or fx_.

Times and dates

Times are RFC 3339 in UTC. businessDate is YYYY-MM-DD in the tenant’s time zone, and rolls to the next day at the tenant’s cut-off. A tenant in Lagos with a 17:00 cut-off books an entry at 18:30 on the 2nd to the 3rd. GET /v1/tenant shows the timezone and businessDayCutoff.

Field casing

Responses are lowerCamelCase. Requests accept lowerCamelCase or snake_case, and these docs use the former. Two things stay snake_case: the error envelope’s request_id and details, and the data of webhook events.