GET/v1/billing
Get the current merchant's billing
Returns what the merchant has bought — every subscription — the plans they may buy, and the tier their subscriptions grant.
The tier a client enforces on is derived server-side, so a lagging or partitioned client meets a value it predates rather than one it worked out wrong.
Responses
-
200
The billing status.
BillingStatus · application/json
billable_locationsintegerRequired
The locations a per-location plan charges this business for, which each plan's
estate_pricecounts.≥ 0
-
offersarray of BillingOfferRequired
What each plan would cost this business a month, one per plan.
-
estate_changeMoneyRequired
A monetary amount in a specific currency: Square's
Money, and Stripe'samountbeside itscurrency.The amount is always an integer count of the currency's minor unit — pence for
GBP, cents forUSD. Zero-decimal currencies such asJPYhave a minor unit equal to their major unit, so{"amount": 500, "currency": "JPY"}is ¥500 while{"amount": 500, "currency": "GBP"}is £5.00.Floating point is never used for money anywhere in this API. Binary floats cannot represent most decimal fractions exactly, so accumulating them across the line items of an order produces totals that disagree with the printed receipt by a penny. Integer minor units make every arithmetic operation exact.
amountinteger · int64Required
The amount, as a whole number of the currency's minor unit. May be negative to express a refund, discount or credit.
currencyCurrencyRequired
ISO 4217 currency code.
Determines the minor unit that
Money.amountis expressed in. Zero-decimal currencies such asJPYhave a minor unit equal to the major unit.One of 182 values; see the schema.
-
estate_priceMoneyRequired
A monetary amount in a specific currency: Square's
Money, and Stripe'samountbeside itscurrency.The amount is always an integer count of the currency's minor unit — pence for
GBP, cents forUSD. Zero-decimal currencies such asJPYhave a minor unit equal to their major unit, so{"amount": 500, "currency": "JPY"}is ¥500 while{"amount": 500, "currency": "GBP"}is £5.00.Floating point is never used for money anywhere in this API. Binary floats cannot represent most decimal fractions exactly, so accumulating them across the line items of an order produces totals that disagree with the printed receipt by a penny. Integer minor units make every arithmetic operation exact.
amountinteger · int64Required
The amount, as a whole number of the currency's minor unit. May be negative to express a refund, discount or credit.
currencyCurrencyRequired
ISO 4217 currency code.
Determines the minor unit that
Money.amountis expressed in. Zero-decimal currencies such asJPYhave a minor unit equal to the major unit.One of 182 values; see the schema.
plan_idstringRequired
-
-
plansarray of PlanRequired
The plans a merchant may buy — the seeded catalogue Tenvelo sells.
idstringRequired
A stable id for the plan, e.g.
tier-plus.namestringRequired
A human-readable plan name.
-
priceMoneyRequired
A monetary amount in a specific currency: Square's
Money, and Stripe'samountbeside itscurrency.The amount is always an integer count of the currency's minor unit — pence for
GBP, cents forUSD. Zero-decimal currencies such asJPYhave a minor unit equal to their major unit, so{"amount": 500, "currency": "JPY"}is ¥500 while{"amount": 500, "currency": "GBP"}is £5.00.Floating point is never used for money anywhere in this API. Binary floats cannot represent most decimal fractions exactly, so accumulating them across the line items of an order produces totals that disagree with the printed receipt by a penny. Integer minor units make every arithmetic operation exact.
amountinteger · int64Required
The amount, as a whole number of the currency's minor unit. May be negative to express a refund, discount or credit.
currencyCurrencyRequired
ISO 4217 currency code.
Determines the minor unit that
Money.amountis expressed in. Zero-decimal currencies such asJPYhave a minor unit equal to the major unit.One of 182 values; see the schema.
suiteBillingSuiteRequired
A product line a merchant may buy — the POS till, ordering, customers, operations.
tierBillingTierRequired
The packaging a merchant is on. Free is the till and back office with cash-up and Z reports; Plus adds tables, kitchen, bookings, customer records, rotas and several sites; Pro adds online and QR ordering, loyalty, gift cards, stock, and payroll and accounts exports.
unitBillingUnitRequired
How a plan's price scales.
flat— one price for the merchant, regardless of size.location— per shop, stall or van; the price scales with the estate.device— per till.flatlocationdevice
-
subscriptionsarray of SubscriptionRequired
What the merchant has taken, one per site packaging.
idstring · uuidRequired
The subscription's own id, minted when it is taken.
billed_to_cardbooleanRequired
Whether the card provider charges for it, against the card the owner put on file.
charged_quantityintegerRequiredNullable
How many units the card provider is charging for, when that differs from
quantity. Null when they agree.≥ 0
created_atstring · date-timeWhen the subscription was first recorded.
-
current_chargeBilling chargeRequiredNullable
What a live subscription charges for its current period so far; null otherwise.
ends_atstring · date-timeRequired
-
linesarray of Billing charge lineRequired
-
amountMoneyRequired
A monetary amount in a specific currency: Square's
Money, and Stripe'samountbeside itscurrency.The amount is always an integer count of the currency's minor unit — pence for
GBP, cents forUSD. Zero-decimal currencies such asJPYhave a minor unit equal to their major unit, so{"amount": 500, "currency": "JPY"}is ¥500 while{"amount": 500, "currency": "GBP"}is £5.00.Floating point is never used for money anywhere in this API. Binary floats cannot represent most decimal fractions exactly, so accumulating them across the line items of an order produces totals that disagree with the printed receipt by a penny. Integer minor units make every arithmetic operation exact.
amountinteger · int64Required
The amount, as a whole number of the currency's minor unit. May be negative to express a refund, discount or credit.
currencyCurrencyRequired
ISO 4217 currency code.
Determines the minor unit that
Money.amountis expressed in. Zero-decimal currencies such asJPYhave a minor unit equal to the major unit.One of 182 values; see the schema.
daysintegerRequired
The days the site was open in the period.
≥ 0
location_idstring · uuidRequiredNullable
The site charged for, or null for a flat plan, which no site scales.
location_namestringRequiredNullable
The site's name, kept for one since closed.
-
starts_atstring · date-timeRequired
-
totalMoneyRequired
A monetary amount in a specific currency: Square's
Money, and Stripe'samountbeside itscurrency.The amount is always an integer count of the currency's minor unit — pence for
GBP, cents forUSD. Zero-decimal currencies such asJPYhave a minor unit equal to their major unit, so{"amount": 500, "currency": "JPY"}is ¥500 while{"amount": 500, "currency": "GBP"}is £5.00.Floating point is never used for money anywhere in this API. Binary floats cannot represent most decimal fractions exactly, so accumulating them across the line items of an order produces totals that disagree with the printed receipt by a penny. Integer minor units make every arithmetic operation exact.
amountinteger · int64Required
The amount, as a whole number of the currency's minor unit. May be negative to express a refund, discount or credit.
currencyCurrencyRequired
ISO 4217 currency code.
Determines the minor unit that
Money.amountis expressed in. Zero-decimal currencies such asJPYhave a minor unit equal to the major unit.One of 182 values; see the schema.
-
current_priceMoneyRequired
A monetary amount in a specific currency: Square's
Money, and Stripe'samountbeside itscurrency.The amount is always an integer count of the currency's minor unit — pence for
GBP, cents forUSD. Zero-decimal currencies such asJPYhave a minor unit equal to their major unit, so{"amount": 500, "currency": "JPY"}is ¥500 while{"amount": 500, "currency": "GBP"}is £5.00.Floating point is never used for money anywhere in this API. Binary floats cannot represent most decimal fractions exactly, so accumulating them across the line items of an order produces totals that disagree with the printed receipt by a penny. Integer minor units make every arithmetic operation exact.
amountinteger · int64Required
The amount, as a whole number of the currency's minor unit. May be negative to express a refund, discount or credit.
currencyCurrencyRequired
ISO 4217 currency code.
Determines the minor unit that
Money.amountis expressed in. Zero-decimal currencies such asJPYhave a minor unit equal to the major unit.One of 182 values; see the schema.
grace_ends_atstring · date-timeRequiredNullable
When a past-due subscription stops working, if it is past due.
location_idsarray of string · uuidNullable
The sites a per-location plan covers; the suite grants at exactly those locations. Null for flat and per-device plans, which are merchant-wide.
-
planPlanRequired
What a merchant can buy: a suite at a tier, priced per unit (per location, per device or flat). Plans are the catalogue Tenvelo sells; the merchant chooses from it.
idstringRequired
A stable id for the plan, e.g.
tier-plus.namestringRequired
A human-readable plan name.
-
priceMoneyRequired
A monetary amount in a specific currency: Square's
Money, and Stripe'samountbeside itscurrency.The amount is always an integer count of the currency's minor unit — pence for
GBP, cents forUSD. Zero-decimal currencies such asJPYhave a minor unit equal to their major unit, so{"amount": 500, "currency": "JPY"}is ¥500 while{"amount": 500, "currency": "GBP"}is £5.00.Floating point is never used for money anywhere in this API. Binary floats cannot represent most decimal fractions exactly, so accumulating them across the line items of an order produces totals that disagree with the printed receipt by a penny. Integer minor units make every arithmetic operation exact.
amountinteger · int64Required
The amount, as a whole number of the currency's minor unit. May be negative to express a refund, discount or credit.
currencyCurrencyRequired
ISO 4217 currency code.
Determines the minor unit that
Money.amountis expressed in. Zero-decimal currencies such asJPYhave a minor unit equal to the major unit.One of 182 values; see the schema.
suiteBillingSuiteRequired
A product line a merchant may buy — the POS till, ordering, customers, operations.
tierBillingTierRequired
The packaging a merchant is on. Free is the till and back office with cash-up and Z reports; Plus adds tables, kitchen, bookings, customer records, rotas and several sites; Pro adds online and QR ordering, loyalty, gift cards, stock, and payroll and accounts exports.
unitBillingUnitRequired
How a plan's price scales.
flat— one price for the merchant, regardless of size.location— per shop, stall or van; the price scales with the estate.device— per till.flatlocationdevice
quantityintegerRequired
How many units the plan covers — locations for a per-location plan, devices for a per-device plan, 1 for a flat plan.
≥ 0
started_atstring · date-timeRequired
When the subscription began.
stateBillingStateRequired
The state a subscription is in.
trialing— the merchant is trying it; the entitlements it grants may end.active— the merchant is paying for it; its entitlements are granted.past_due— payment has lapsed; dunning runs before any refusal.stopped— a past-due grace window closed without payment; the suite stopped granting, and the merchant may still put it right.canceled— the merchant ended it; its entitlements are no longer granted.trialingactivepast_duestoppedcanceledtrial_ends_atstring · date-timeNullable
When a trial ends, if the subscription is trialing.
uncovered_location_idsarray of string · uuidRequired
The open sites a per-location plan limited to some sites does not cover.
updated_atstring · date-timeWhen the subscription was last changed.
versioninteger · int64Required
The version the caller last saw, for optimistic concurrency.
tierBillingTierRequired
The packaging a merchant is on. Free is the till and back office with cash-up and Z reports; Plus adds tables, kitchen, bookings, customer records, rotas and several sites; Pro adds online and QR ordering, loyalty, gift cards, stock, and payroll and accounts exports.
tier_ladderarray of BillingTierRequired
The tiers in the order they stack, weakest first. A client derives what a tier grants from the label's rung on this list rather than comparing labels it released knowing — a tier added above is one server deployment, not one client release.
trial_daysintegerRequired
How long a trial of a plan lasts.
≥ 1
-
400
The request could not be parsed. Malformed JSON, a bad query parameter, or a header that failed to decode, among them an
API-Versionlater than the server speaks or not a date (api-version-unknown, with the server's own inapi_version).Distinct from
422: a400never reached validation, soinvalid_paramsis absent. Retrying without changing the request will fail again, except that a request refused for itsAPI-Versiongoes once the server is updated. -
401
No credentials, or credentials that could not be verified — missing bearer token, malformed JWT, expired token, or a signature that failed against the issuer's JWKS.
Refresh the token and retry once. Repeated
401after a refresh means the device needs to re-enrol. -
403
Authenticated, but not permitted. The token is valid and its merchant was resolved, but the caller's role does not allow this operation, or the target belongs to a different merchant.
Cross-tenant access is reported as
403on a resource the caller may not see, and as404where even confirming existence would leak information. Retrying will not help. -
410
The request names an
API-Versionthis server no longer serves (docs/decisions/0011). Nothing in it was read.api_versionnames the version the server speaks: the client is behind, and sends the request again once it is updated. -
429
Rate limit exceeded. Honour
Retry-Afterrather than applying your own backoff.A fleet of tills coming back online together after an outage is the realistic cause, which is exactly when uncoordinated client-side retry turns a brief outage into a sustained one. The limit is per process, and per site for what records trade there — a request spends its site's budget, and a till's own smaller one inside it — and per
(client, merchant)for everything else; noRateLimitfield is sent, so this response and itsRetry-Afterare the whole of the contract. -
500
Something failed on our side.
trace_ididentifies the request in our tracing — quote it in a support ticket.The body never carries internal detail: no SQL, no stack traces, no upstream error strings. Safe to retry with the same
Idempotency-Key. -
503
Temporarily unable to serve the request — a dependency is down or the service is shedding load.
Retry with the same
Idempotency-KeyafterRetry-After. This is always safe: a request that did take effect before the failure will be recognised as a replay.