API referenceTenvelo API
https://api.tenvelo.com The contract, as OpenAPI

Contract 2026-10-10. Every path below carries its own major version.

Errors · RFC 9457

Problem types

Every error is a problem document served as application/problem+json. These are the types this API sends. Branch on type, which never changes; title and detail are prose and may be reworded.

    • unauthorized401

      Credentials are missing, malformed or expired.

    • share-required428

      This order will be placed with your Tenvelo account. Agree to share your details with the business once, and try again.

    • last-partner-admin409

      A team keeps at least one admin. Make someone else an admin first.

    • merchant-intent-mismatch400

      This screen belongs to another business. Reload it.

    • insufficient-authentication401

      This needs a stronger sign-in. Sign in again with a second step.

    • no-account403

      That sign-in has no account in any merchant. Ask a merchant owner to invite you, then try again.

    • forbidden403

      This account is not permitted to perform that operation.

    • pin-locked429

      That PIN has been tried too many times and is locked for a while. Try again later, or have a manager reset it.

    • email-unverified403

      The sign-in provider has not verified that email. Verify it at the provider, then try again.

    • requires-manager403

      This refund or void is above the merchant's approval limit. A manager or owner must complete it.

    • not-entitled403

      This merchant is not licensed for that suite.

    • not-found404

      No such resource, or none visible to this account.

    • no-open-order404

      Nothing has been ordered at this table yet, so there is no bill to show.

    • version-conflict412

      The resource has changed since the version you read. Re-read it, re-apply your change, and retry.

    • immutable409

      This resource is append-only and cannot be modified. Void it and issue a replacement.

    • idempotency-key-reused422

      This Idempotency-Key was already used for a different request body. Use a new key, or resend the original request unchanged.

    • idempotency-key-in-flight409

      An identical request is still being processed. Retry shortly.

    • device-not-settled409

      This device has recorded facts that are not yet part of the books, and this write is judged against them. Nothing is wrong with it — it is early. Keep it queued and send it again; it will be accepted once the facts are applied.

    • totals-mismatch422

      The submitted totals do not match the server's calculation. The device may be running stale tax configuration.

    • tax-rule-missing422

      A product in a tax class was sold in a fulfilment the class has no rule for. Set the class's rule for that fulfilment in the back office.

    • currency-mismatch422

      Amounts in different currencies cannot be combined.

    • unit-mismatch422

      Quantities in different dimensions cannot be combined: a mass and a volume need a density, which is never guessed.

    • unknown-unit422

      The unit of measure is not one this API knows: each, g, kg, ml or l.

    • cursor-too-old422

      This cursor is older than the retained change log, so the changes between it and the oldest kept row are gone. Discard the cached data it refers to and start again from a snapshot; retrying with the same cursor would silently skip them.

    • api-version-retired410

      This request names an API-Version this server no longer serves, so none of it was read. Keep what was sent, update, then send it again.

    • api-version-unknown400

      This request names an API-Version later than this server speaks, or not a date, so none of it was read. Keep what was sent: it goes once the server is updated.

    • terminal-checkout-in-progress409

      This order already has a card payment in progress. Wait for its outcome, or cancel it, before taking another card.

    • campaign-audience-empty422

      The campaign's audience is empty: no guest in the segment may be told it. Widen the segment and try again.

    • account-closed409

      This customer's account takes no more charges: it is closed, or was never opened. Take the payment another way.

    • receipt-exceeds-balance422

      The receipt is more than the account owes, and would leave it in credit. Record no more than the balance.

    • receipt-already-recorded409

      This receipt is already recorded against the account; recording it again would count the same money twice.

    • card-hold-not-held409

      This card hold is no longer held: it was captured, released or expired, or was never authorised.

    • card-hold-declined409

      The card was declined for the authorisation. Take the card another way, or ask the guest for another card.

    • table-occupied409

      This table has an open order on it and cannot be withdrawn. Clear or move the tab first.

    • invalid-dispute-transition409

      This dispute cannot move to that status from the one it is in: evidence is not submitted against one already won or lost.

    • invalid-payout-transition409

      This payout cannot move to that status from the one it is in: a failed payout is not marked paid, and a paid one does not go back.

    • order-not-written202

      The facts are recorded, but the order was not written — the reason is on the order's flag.

    • already-settled409

      That house account charge is already recorded as received.

    • partner-bill-unchanged409

      The bill already stands in that state.

    • conflict409

      The request conflicts with the current state of the resource.

    • bad-request400

      The request could not be read: malformed JSON, or a path or query parameter that does not parse.

    • unsupported-media-type415

      Request bodies must be JSON, sent as application/json.

    • too-many-requests429

      Rate limit exceeded for this client and merchant. Retry after the time in Retry-After; the limit is per process.

    • not-implemented501

      This endpoint is defined in the API specification but is not yet available.

    • validation-failed422

      One or more fields failed validation.

    • service-unavailable503

      The service is temporarily unavailable. Retry after the time in Retry-After, with the same Idempotency-Key.

    • internal-server-error500

      An unexpected error occurred.