> ## Documentation Index
> Fetch the complete documentation index at: https://docs.arena-predictions.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Conventions

> Rules every endpoint follows.

## Names

| Element | Style | Example |
| - | - | - |
| JSON fields | camelCase | `displayName`, `expiresInDays` |
| Query parameters | snake\_case | `status`, `cursor` |
| Enum values | lowercase | `active`, `revoked`, `paper` |
| Paths | plural nouns | `/api_keys`, `/portfolio` |

## Units are in the name

| Suffix | Meaning |
| - | - |
| `*Cents` | Integer price in cents, 1–99, for the side named. |
| `*Dollars`, `dollars` | Paper dollars as a JSON number, two decimals. `984.3` is \$984.30. |
| `*Count` | Integer. |
| `*Pct` | Percentage as a number, not a fraction. |
| `*At` | RFC 3339 UTC instant, second precision, ending in `Z`. |

A contract pays \$1 if it settles yes. Stake = contracts × cents ÷ 100. On one venue the order fills whole at one price. `route` `best` may split that ticket across eligible venues. `fills` lists each leg: `venue`, `contracts`, and `priceCents` while venue data is on. `fillVenue` is the first leg. `route` `kalshi` stays on one venue.

## Paper accounts

Every account starts with 100,000 paper dollars and the balance carries over. A reset (at most one every 30 days) returns cash to 100,000 and starts a new run; `run` counts resets and is `0` until the first. Lifetime profit counts every run, so a reset never lifts a rank.

## Identifiers

| Identifier | Format |
| - | - |
| Keys, traders, trades | UUID |
| Instruments | `ins_` + 12 characters. Permanent and opaque. |
| Market tickers | Uppercase strings. Opaque: never parse one. |

Store ids as strings. Never infer meaning from their contents.

## Responses

* Every keyed response body includes `"mode": "paper"`.
* Create answers `201`. Revoke answers `200` with the updated resource.
* Key management, `GET /me` and every error are `Cache-Control: no-store`. Successful records reads are `Cache-Control: private, max-age=30`.
* A method a path does not serve answers `405 method_not_allowed` with an `Allow` header.
* No streaming under a key. Poll.

## Headers

| Header | On |
| - | - |
| `X-Request-Id` | Every response. Quote it when contacting support. |
| `RateLimit-*`, `Arena-Quota-*`, `Arena-Plan` | Every keyed response. See [Rate limits](/rate-limits). |
| `Retry-After` | `429` and `503`. |
| `X-Arena-Org` | Optional request header on `GET /portfolio`, `GET /portfolio/trades`, `POST /portfolio/orders` and `DELETE /portfolio/orders/{orderId}`. An organization id selects that organization's paper sandbox. `GET /portfolio` and `GET /portfolio/trades` return that sandbox (cash, positions, resting orders and trades) and `organization.slug`. Absent, those calls use the personal paper account. The id comes from [`GET /organizations`](/api-reference/identity/list-your-organizations), which ignores this header. See [Authentication](/authentication#organization-sandbox). |

`GET /openapi.json` is CDN-cached and carries neither the request id nor rate headers.

## Identify your client

Send `x-arena-client: yourapp/1.2.0` or a descriptive `User-Agent`. Not enforced today; it lets Arena warn an outdated client instead of breaking it.

## Versioning

The version is in the path. Within `v1`, changes are additive: new endpoints and optional fields, never a rename or removal. A breaking change ships as `/api/v2`, with `v1` kept at least 180 days.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.