> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.pixalate.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.pixalate.com/_mcp/server.

# Quotas, limits and errors

> Quota mechanics for Pixalate's Enrichment, Fraud and Analytics Reports APIs, how to check your quota status, and the HTTP status codes each API returns.

Most Pixalate APIs draw on a usage quota. Your plan or contract sets the size of each quota, so this page explains how usage is counted rather than listing numbers. To see your own numbers, call the free metadata endpoint for the API (see [Check your quota](#check-your-quota)).

## How quota works

### One pool per product

Your usage is counted in separate pools:

* one for each Enrichment API supply type: **mobile apps**, **CTV apps** and **domains**
* one for the **Analytics Reports API**
* one for the **Fraud API**

The pools are independent. Using one never draws down another, so an empty mobile apps pool doesn't affect your domains lookups. When a pool runs out, every request that draws on it is blocked, whatever widgets you ask for, until the pool refreshes or your plan changes.

### Enrichment API: input items and output items

Enrichment API usage is counted the same way as in the Media Ratings Terminal:

* Each **input item**, an app or domain you submit in a single lookup or a batch, uses one quota unit when it's submitted.
* Each **output item**, a result returned or made available for that input item, uses one more unit. A result is one app or domain for one combination of store, region and device.

So one input item can use several units: one for the item itself, plus one for each result returned. Usage is shared across everyone on your account.

**Region and device control how many results come back.** A lookup with no filters returns a result for every region and device combination. Add `region=GLOBAL&device=GLOBAL` to get one result per store, which covers most needs.

For example, to look up one app with the fewest results:

```bash
curl "https://api.pixalate.com/api/v2/mrt/apps/com.example.mobileapp?region=GLOBAL&device=GLOBAL" \
  -H "x-api-key: $PIXALATE_API_KEY"
```

The same filters work on the mobile apps batch endpoint, which is where they save the most: a batch multiplies records by region and device for every app you submit. See the [Enrichment API](/apis/enrichment-api) guide.

### Fraud API

The Fraud API's quota status reports usage as a count of requests in the current quota period. See [Check your quota](/apis/fraud-api#check-your-quota) in the Fraud API guide.

### Other APIs

For the SCO Validation & Verification API, the OpenEPG preview and Pixalate's MCP connectors, ask your Pixalate account manager about the limits on your plan. The MCP connectors' limits are described in [Access and limits](/mcp/access).

## Check your quota

Each of these calls returns your current quota status.

| API                         | Request                                                                                   |
| --------------------------- | ----------------------------------------------------------------------------------------- |
| Enrichment API: Mobile Apps | `GET https://api.pixalate.com/api/v2/mrt/apps`                                            |
| Enrichment API: CTV Apps    | `GET https://api.pixalate.com/api/v2/mrt/ctv`                                             |
| Enrichment API: Domains     | `GET https://api.pixalate.com/api/v2/mrt/domains`                                         |
| Analytics Reports API       | `GET https://api.pixalate.com/api/v2/analytics/reports`                                   |
| Fraud API v3                | `GET https://fraud-api.pixalate.com/api/v3/fraud` with no `ip`, `deviceId` or `userAgent` |

```bash
curl "https://api.pixalate.com/api/v2/mrt/apps?pretty=true" \
  -H "x-api-key: $PIXALATE_API_KEY"
```

The Enrichment API and Analytics Reports API return a `quota` object alongside the date the data was last updated:

```json
{
  "database": {
    "lastUpdated": "2022-04-30"
  },
  "quota": {
    "available": 480,
    "used": 520,
    "expiry": "2022-05-01T12:45:23.234Z",
    "limit": 1000,
    "interval": 1000,
    "timeUnit": "month"
  }
}
```

The values above are illustrations from the API reference, not real allowances.

| Field       | What it tells you                                                                             |
| ----------- | --------------------------------------------------------------------------------------------- |
| `available` | How much quota you have left.                                                                 |
| `used`      | How much quota you've used.                                                                   |
| `expiry`    | When the quota refreshes back to `limit`, in `YYYY-MM-DDTHH:MM:SS.SSSZ` format.               |
| `limit`     | How much quota you get each time it refreshes.                                                |
| `interval`  | The number of time units used to calculate the refresh time.                                  |
| `timeUnit`  | The time unit used to calculate the refresh time: `minute`, `hour`, `day`, `week` or `month`. |

Each Enrichment API supply type reports its own pool, so check the endpoint for the supply type you're about to use. Check `available` before you start a large batch.

## Rate limits

The OpenEPG preview declares a rate limit: when you exceed it, you get `429` with a `Retry-After` header that says when to try again. For rate limits on the other APIs, contact [support@pixalate.com](mailto:support@pixalate.com).

## HTTP status codes

These are the status codes each API's specification declares.

| Status                    | Fraud API | Enrichment API | Analytics Reports API | SCO V\&V API | OpenEPG (preview) |
| ------------------------- | :-------: | :------------: | :-------------------: | :----------: | :---------------: |
| `200` OK                  |     ✓     |        ✓       |           ✓           |       ✓      |         ✓         |
| `400` Bad Request         |     ✓     |        ✓       |           ✓           |       ✓      |         ✓         |
| `401` Unauthorized        |     ✓     |        ✓       |           ✓           |       ✓      |         ✓         |
| `403` Forbidden           |     ✓     |        ✓       |           ✓           |              |         ✓         |
| `413` Payload Too Large   |           |                |                       |              |         ✓         |
| `429` Too Many Requests   |           |                |                       |              |         ✓         |
| `503` Service Unavailable |           |                |                       |              |         ✓         |
| `5xx` Server Error        |     ✓     |        ✓       |           ✓           |              |                   |

### What each status means and what to do

| Status | Meaning                                                                                                                                                  | What to do                                                                                                                                                    |
| ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `400`  | The request has invalid parameters.                                                                                                                      | Check parameter names and values against the API reference. URL-encode values such as user agents and queries.                                                |
| `401`  | The API key is missing or invalid.                                                                                                                       | Check that you're sending your key in the `x-api-key` header. See [Authentication and API keys](/apis/authentication).                                        |
| `403`  | Your key isn't allowed to make this request. For example, your subscription or rate plan has expired, needs an upgrade, or doesn't include this product. | Check your quota status, then contact your Pixalate account manager about your plan.                                                                          |
| `413`  | OpenEPG only: the request body is too large.                                                                                                             | Send a smaller body, or fewer items in a batch.                                                                                                               |
| `429`  | OpenEPG only: you've exceeded the rate limit.                                                                                                            | Wait for the number of seconds in the `Retry-After` header, then retry.                                                                                       |
| `503`  | OpenEPG only: the service is degraded. It fails closed rather than returning a false miss.                                                               | Retry after the delay in the `Retry-After` header.                                                                                                            |
| `5xx`  | The API had an internal error.                                                                                                                           | Retry once. If it keeps happening, contact [support@pixalate.com](mailto:support@pixalate.com) with the request you sent (without your API key) and the time. |

> **Tip**
>
> Check parameter values against the allowed values in the API reference before you retry a failed call. An unrecognized value, such as an unsupported `device`, may come back as a server error rather than a `400`.

Batch endpoints (Enrichment API batch lookups, Analytics exports with `isAsync`) report some results through a URL you poll afterwards, with their own status codes. See the [Enrichment API](/apis/enrichment-api) and [Analytics Reports API](/apis/analytics-reports-api) guides.

## Related

#### [Authentication and API keys](/apis/authentication)

Send your key and keep it safe.

#### [Pixalate APIs](/apis/overview)

Which API to use, with base URLs.