structuredContent, and as the JSON text of the first content block. Read whichever your client exposes; they are identical. Every tool publishes a matching outputSchema, so a spec-compliant client validates structuredContent against it.
data
- List tools return
data.results, an array. - Detail tools (
get-venue,get-order,get-menu,get-payment-link,get-order-stats, the two writes) return the record itself indata. get-snooze-reportreturns a summary, a time series and a paginateditemsarray together.- Fields are allowlisted per resource. Anything not in a tool’s
outputSchemais never sent, whatever the underlying record holds.
meta
meta is strict: no undocumented keys appear, and new keys arrive with a version bump.
Pagination
Pages start at 1.limit is capped at 100 (25 for list-top-products) and silently reduced if you ask for more.
hasMore and nextPage come from fetching one row beyond the page, so they are always exact. total is null when the tool does not count, and may be flagged totalIsEstimate: true on large order lists where an exact count is too slow. Drive loops from hasMore, not from total:
Dates and Timezones
Inputs (from, to) accept either:
YYYY-MM-DD— a local calendar date in the effective timezone, inclusive at both ends (to: "2026-09-18"runs to23:59:59.999that day); or- an ISO datetime with
Zor a numeric offset and at most three fractional digits, e.g.2026-09-18T14:00:00+01:00. Offset-less datetimes are rejected.
timezone if supplied, otherwise the venue’s timezone when venueId is given, otherwise UTC. meta.timezone always states which was used.
Ranges may span at most 90 local calendar dates; longer ranges are rejected with INVALID_INPUT. Each tool has a default range (7 or 30 dates) and a basis — creation, fulfillment, refund or snooze_overlap — that says which timestamp the range filters; see Tools. meta.dateRange echoes the resolved range so a client can display exactly what was counted.
Write inputs (startDate, endDate, expiresAt) must be full ISO timestamps with an offset. Date-only values are not accepted for writes.
Money
All amounts are integers in minor currency units (pence, cents) and are never converted. The currency travels with the data — as acurrency field on venues, orders, bills and links, and as meta.currencyCodes for the result as a whole. codeAmount on a percentage discount is in tenths of a percent, not a currency amount.
Account-wide stats and top-product queries on an account whose venues use more than one currency are refused (INVALID_INPUT); pass venueId.
Images
get-payment-link-qr is the only tool that returns binary data. Its content array holds the JSON text block followed by a native MCP image block:
structuredContent carries the checkout URL and link metadata only; there is no base64 field inside data.
Errors
A failed call is not an envelope. It is anisError: true result whose single text block is an { error } object, with no structuredContent. See Errors.