---
title: "Quotas and Stats"
description: "Read your account's registration and look-up grants, learn what spends them, and handle the 429 refusal."
published: 2026-09-21T23:44:02.390615+00:00
updated: 2026-09-21T23:44:02.390615+00:00
tags: ["parallax", "quotas", "usage"]
url: https://xiobjects.com/docs/xio/parallax/quotas-and-stats
source: XI Objects
---

<!-- xion:doctype xion+markdown -->
<!-- xion:metadata
{
  "version": "1.0",
  "content_type": "application/xion\u002Bmarkdown",
  "source_type": "xi-content/doc",
  "generator": "xio-content-publisher/1.0.0",
  "generated": "2026-09-21T23:42:04.7047849\u002B00:00",
  "encoding": "utf-8",
  "render_intent": "markdown",
  "title": "Quotas and Stats",
  "slug": "xio/parallax/quotas-and-stats",
  "copyright": "\u00A9 2026 XI Objects Inc"
}
-->

# Quotas and Stats

Each beta account is granted a fixed number of registrations and a fixed number of look-ups. They are lifetime totals, not a rate. There is no self-service top-up: ask the operator.

## Read your usage

```bash
curl -sS "$BASE/account/stats" -H "Authorization: Bearer $TOKEN"
```

```json
{
  "registrations": { "grant": 10, "consumed": 3, "held": 2, "remaining": 7 },
  "lookups": { "grant": 50, "consumed": 12, "held": 0, "remaining": 38 },
  "callCount": 84
}
```

| Field | Type | Description |
|-------|------|-------------|
| `registrations.grant` | `int` | Registrations granted to your account. |
| `registrations.consumed` | `int` | Registrations actually spent. |
| `registrations.held` | `int` | Images reserved right now across your open registration slots. Not yet spent. |
| `registrations.remaining` | `int` | `grant` minus `consumed`. It is not reduced by `held`. |
| `lookups.grant` | `int` | Look-ups granted to your account. |
| `lookups.consumed` | `int` | Look-ups actually spent. |
| `lookups.held` | `int` | Query images reserved right now across your open look-up slots. |
| `lookups.remaining` | `int` | `grant` minus `consumed`. It is not reduced by `held`. |
| `callCount` | `int` | Every authenticated call your account has ever made. |

`GET /account/stats` reports your own account only. No other account's stats are a request this API can express.

## What spends a registration

One registration, per image that actually registers. That is it.

| Event | Registrations |
|-------|---------------|
| An image registers at commit, or through `POST /registrations` | 1 |
| An image refused as already registered or as a derivative | 0 |
| An entry that failed at commit | 0 |
| An image refused at upload for any reason | 0 |
| A commit that was refused or never finished | 0 for what did not register |

The charge runs before the engine call, then anything that did not end up registered is settled back. `consumed` reflects what you got, not what was attempted. A commit that is cancelled or fails part way settles exactly like one that completes.

## What spends a look-up

| Event | Look-ups |
|-------|----------|
| A look-up query that produced a verdict, single or batch | 1 |
| A registration pre-check that **matched** | 1 |
| A registration pre-check that did not match | 0 |
| A query the engine refused, or that never reached a verdict | 0 |

The pre-check charge is the one that surprises people. When you try to register an image and it is refused as already registered, you were given a global look-up verdict for it, so it costs one look-up. It never costs a registration.

## Reservations

An image held in an open slot reserves grant without spending it. That is the `held` figure.

Reservations come back when they are released: remove the entry, abandon the slot, let the slot expire, or have the commit refused. Nothing needs to be reclaimed by hand.

`remaining` never subtracts `held`. To know what you can still add to a slot, compare `held` against `remaining` yourself.

Across all your open registration slots, uncommitted entries may never exceed your remaining registration grant. An image past that bound is refused at upload with `The account's remaining registration grant does not cover this image.`

## An account with no look-ups left cannot register

Registration runs a pre-check, and a matched pre-check spends a look-up. The service reserves that look-up before it calls the engine, so an exhausted grant can never be spent to read a verdict for free.

With no look-up grant left:

- `POST /registrations` answers `429 Quota exceeded` before the engine is asked anything.
- A slot upload refuses the image with `The account's remaining lookup grant does not cover this image.`, naming the look-up grant even though the route is the registration one.

A look-up slot holding your whole look-up grant blocks registration the same way, until that slot commits or expires.

## The 429

```json
{
  "title": "Quota exceeded",
  "status": 429,
  "detail": "The account's remaining quota does not cover this request.",
  "registrationRemaining": 1,
  "lookupRemaining": 0,
  "traceId": "00-..."
}
```

| Extension | Description |
|-----------|-------------|
| `registrationRemaining` | Registrations left at the moment of refusal. |
| `lookupRemaining` | Look-ups left at the moment of refusal. |

Both counts are always carried, whichever grant refused the request. Read the one that is `0`.

Routes that answer it: `POST /registrations`, `POST /slots/{slotId}/uploads` when no image in the request fits, `POST /slots/{slotId}/commit`, `POST /lookup`, `POST /lookup/slots/{lookupSlotId}/queries` when no image fits, and `POST /lookup/slots/{lookupSlotId}/commit`.

A slot upload whose images straddle the edge does not answer `429`. It answers `200 OK`, holds what fits, and refuses each over-edge image on its own with the same two counts on the outcome.

## What to do about it

Retrying does not help. A grant is a lifetime total, so a `429` means you are out, not that you are going too fast.

Take down registrations you no longer need to free the images, though that does not return spent grant. To raise a grant, ask the operator.
<!-- xion:trust
{
  "v": 1,
  "canon_v": 1,
  "ctx": "xiobjects.com/content",
  "hash_blake3_hex": "e2c79592391c3241c9119bf78c9df5ae580b7ee024f5958b80ffc016d2280bd9",
  "hash_sha256_hex": null,
  "sig_alg": "ed25519",
  "sig_b64": "leaX_uECkvx_m4kM0QBEH6MzOGoZKIeFW0h7qRLnTEJUNzn6kkp5OPY79EL5gKbGXKLVyi6sGgD5Du8dk3qBDA",
  "pubkey_b64": "VrV0rqYGnIqutEwPTr11jfrjH9wmtkOlL68wL0W6ed0",
  "x509_chain_pem": [
    "-----BEGIN CERTIFICATE-----\nMIIB9DCCAaagAwIBAgIQbmGqXUijS3XuRUHDuVME8jAFBgMrZXAwLjEsMCoGA1UE\nAwwjWEkgT2JqZWN0cyBJbmMgQ29udHJvbCBJbnRlcm1lZGlhdGUwHhcNMjYwOTIx\nMjMzNjU1WhcNMjYxMDIxMjMzNjU1WjBLMR4wHAYDVQQDDBV4aW8tY29udGVudC1w\ndWJsaXNoZXIxFzAVBgNVBAoMDlhJIE9iamVjdHMgSW5jMRAwDgYDVQQLDAdDb250\nZW50MCowBQYDK2VwAyEAVrV0rqYGnIqutEwPTr11jfrjH9wmtkOlL68wL0W6ed2j\ngbwwgbkwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYI\nKwYBBQUHAyQwZQYDVR0jBF4wXIAUOym3mFmw/qs1fgKrujCkxhrTk7KhLqQsMCox\nKDAmBgNVBAMMH0luc3RpdHV0ZSBvZiBQcm92ZW5hbmNlIFJvb3QgQ0GCFFJgN/ix\nQn72H6h3T5lEr9f8lJQFMB0GA1UdDgQWBBTnptRqwN8T\u002B5J0zUSRl65iscaPUzAF\nBgMrZXADQQBTzG1wSuUk70ymEN3Mj6XxsS1c5egjDoy\u002BW/V2kko5c2a1Cs7c/kiD\n6H2y9z1DNSH5qjzLZcm9JKPN0mjCy8MO\n-----END CERTIFICATE-----\n",
    "-----BEGIN CERTIFICATE-----\nMIIByDCCAXqgAwIBAgIUUmA3\u002BLFCfvYfqHdPmUSv1/yUlAUwBQYDK2VwMCoxKDAm\nBgNVBAMMH0luc3RpdHV0ZSBvZiBQcm92ZW5hbmNlIFJvb3QgQ0EwHhcNMjUxMTAy\nMDMxNzEyWhcNMzAxMTAxMDMxNzEyWjAuMSwwKgYDVQQDDCNYSSBPYmplY3RzIElu\nYyBDb250cm9sIEludGVybWVkaWF0ZTAqMAUGAytlcAMhAFSS/pggSRmTcAMko7uc\nATH8OHgxVymd5mBFlPXbJkgio4GtMIGqMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYD\nVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQ7KbeYWbD\u002BqzV\u002BAqu6MKTGGtOTsjBlBgNV\nHSMEXjBcgBQAZRTDswSVORu\u002BkUOKX6WvrOvmQKEupCwwKjEoMCYGA1UEAwwfSW5z\ndGl0dXRlIG9mIFByb3ZlbmFuY2UgUm9vdCBDQYIUJqoJlpiSFg\u002B7W5IJLMrLttgR\nQp4wBQYDK2VwA0EA5FOht7YOsVRPp/FOKMQ\u002B3Mo9JxrvGR3ylKWAWNm6OUV7N3DB\nI9cD62wU5I0d0EKDBy0CX9DnoqUyxv5yguraAA==\n-----END CERTIFICATE-----\n",
    "-----BEGIN CERTIFICATE-----\nMIIBaTCCARugAwIBAgIUJqoJlpiSFg\u002B7W5IJLMrLttgRQp4wBQYDK2VwMCoxKDAm\nBgNVBAMMH0luc3RpdHV0ZSBvZiBQcm92ZW5hbmNlIFJvb3QgQ0EwHhcNMjUxMTAy\nMDMwNTEyWhcNMzUxMDMxMDMwNTEyWjAqMSgwJgYDVQQDDB9JbnN0aXR1dGUgb2Yg\nUHJvdmVuYW5jZSBSb290IENBMCowBQYDK2VwAyEAEWNZl\u002Br3IC7\u002BgBh90Yo1kWk1\npZCVzVuFdFT7qBBU8W2jUzBRMB0GA1UdDgQWBBQAZRTDswSVORu\u002BkUOKX6WvrOvm\nQDAfBgNVHSMEGDAWgBQAZRTDswSVORu\u002BkUOKX6WvrOvmQDAPBgNVHRMBAf8EBTAD\nAQH/MAUGAytlcANBAO6QeydOFNrN75qNyftggYudsxMyl4w9qWkSdZ6hlhrRcbSr\niG9Si0kbrIJOwYB/LTBU0RM4Rl\u002Bo9PM3Qp0mPwo=\n-----END CERTIFICATE-----\n"
  ],
  "key_id": "_A4EpsXvfBfVEGu5deK65yN4EjBJsUpgkdoS25zPEFk",
  "created_at": "2026-09-21T23:42:04Z"
}
-->