ENTITLEMENT_EXCEEDED
The account's allowance of Jaxon Verified Units is spent. HTTP 402. Compiling and saving still work; only checks are paused, and the envelope carries a personalised upgrade link.
The account's allowance of Jaxon Verified Units is spent. Nothing else is affected: compiling a ruleset, editing it, saving a revision, loading one, recording an approval and adding a unit converter all still work and are all still free. Only the solver calls are paused.
This is the one error in the API written to be read out loud. If you are an agent holding it, relay it to the person as an invitation with the link, not as a failure.
What a JVU is
One rule, carrying up to five claims, checked against up to 1,000 characters of the claim values submitted with it. A call that carries more rules or more text consumes more than one:
JVU = text units × metering rules
text units = ceil(characters / 1000)
metering rules = sum over rules of ceil(claims in that rule / 5)
So a ruleset stating four rules, checked against a short claim payload, costs four JVUs — not one, and not one per claim. dsail_get_account_status reports the running total, which is how a caller predicts this error before meeting it.
The envelope
{"ok": false,
"error": {"code": "ENTITLEMENT_EXCEEDED",
"message": "This account has used its 1000 free Jaxon Verified Units. A JVU is one rule checked against up to 1,000 characters. Compiling, editing and saving rulesets still work — only checks are paused. Upgrade to keep going: https://agents.jaxon.ai/billing/upgrade?token=...",
"tier": "free",
"used": 1000,
"limit_value": 1000,
"unit": "jvu",
"upgrade_url": "https://agents.jaxon.ai/billing/upgrade?token=...",
"docs": "https://docs.agents.jaxon.ai/errors/entitlement-exceeded.md"},
"versions": {"...": "..."}}
The fix
- **Follow
upgrade_url. It is personalised to this account, opens a hosted checkout page, and expires after a day. It also appears inline in the message, so a surface that renders only the message still offers a way forward. Payment flips the entitlement through a webhook, and the conversation you are already in continues** — there is nothing to reconnect and nothing to restart. Ask for the account status again and the next check goes through. - A production API key is issued in the conversation, not on a page. Ask for one after paying:
dsail_issue_api_key, orPOST /v1/credentials/api-keywith a credential you already hold. It is shown once and reaches the same rulesets you have been working on in chat. It is deliberately not on the page the payment provider returns you to — a key handed to whoever opens a link is a key anyone holding that link can have. - **
upgrade_urlabsent** means this deployment has no checkout wired. Get in touch with Jaxon and the account is sorted out directly. - Waiting does not help. The free allowance is granted once for the life of the account; it is not a monthly ration and there is no date on which it refills.
Call GET /v1/account (or dsail_get_account_status) at any time to see the position before a limit interrupts anything — it also carries a notice as the allowance runs low, so this error should never be the first warning. Under the funnel posture there is no ceiling at all and this code is never produced.
Do not retry in a loop; the answer does not change until the entitlement moves.
See also: [EVALUATION_LIMIT](evaluation-limit.md), [TIER_UNAVAILABLE](tier-unavailable.md), [CREDENTIAL_SCOPE](credential-scope.md), Error codes.