Money and time
Amounts are whole numbers, never decimals; quantities are thousandths; days are the restaurant’s own. The same units run through every endpoint and are named the same way in every field.
Units
Moneyminor unitscurrency (cents for USD).total: 5564 is $55.64 when minor_digits is 2.
Amountminor units, 1 or moreWhat a request sends when an amount cannot be zero.
BasisPointsbasis points, _bpvat_rate_bp: 700 is 7%.
Millimilli-units, _milliquantity_milli: 2500 is 2.5 kg of a material kept in kg.
CurrencyISO 4217currency: "USD", on every answer.
MinorDigits0–3currency: USD 2, JPY 0.minor_digits: 2, on every answer.
TimestampISO 8601created_at: "2026-09-29T23:41:12.000Z".
DayKeyYYYY-MM-DDopened_from=2026-09-29.
MonthKeyYYYY-MMmonth=2026-09.
Money
- Every amount is in the restaurant’s
currency, in its minor units, and every answer says which:currencyandminor_digits. Divide by 10 to the power ofminor_digitsto show one; never round through a float. - A tip is staff money on top of the bill. It is never in an order’s
totalorpaid_amount, and never a sale;tip_amountsays what an order’s payments hold in tips. The service charge is not a tip: it stays on the bill, taxed. - Tax is named with the restaurant’s own tax label (
tax_labelon get-restaurant: “Sales tax” in the US). The fields that carry it keep the namevat. - A key never oversees a cash drawer: cash moves only through its maker’s own open drawer, as it would at the register.
Instants and days
- An instant is ISO 8601 in UTC. Show it in the restaurant’s
timezone(get-restaurant), never the server’s. - A day is a business day in the restaurant’s time zone, cut where its business day starts, never at the server’s midnight.
day_starts_at_minute: When its business day starts, in minutes after midnight (240 is 4:00 AM): a check at 1:30 AM belongs to the day before. - Sales count an order on the day it was opened; money counts on the day it moved. The two do not match, on purpose, and each report’s notes say how it counted.
Orders from other systems
channel: Where the order came from: table_buddy for the POS and this API, else the outside system that brought it in. Its values: table_buddy, online, toast, doordash, uber_eats, grubhub. A new system adds a value: handle one you do not know. external_code is what that system prints on the check (“57”), and null for the POS and this API.
A check another system recorded arrives closed, keeps that system’s bill, and can hold two amounts that are 0 on every order the POS or this API made:
non_sale_amountMoney taken on the bill that is not a sale — a gift card sold, a house account paid, a donation. It is in total and paid_amount; sales are total − non_sale_amount.other_tenderedPart of the bill settled by tenders that move no money — a gift card redeemed, a house-account charge. It is not in paid_amount; still owed is total − paid_amount − other_tendered.What another system keeps
A check another system recorded — a Toast check — is that system’s truth, and so are a linked menu item’s name and price: they change there, and the next sync brings the change here. A recorded check arrives closed, and a change to it through this API is answered 409 refused in the engine’s own words, which say what to do instead: Add a round to an order answers Order #{number} is closed. Start a new order.
See Errors.