# 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

```json
{"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`, or `POST /v1/credentials/api-key` with
  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_url` absent** 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](../reference/errors.md).
