Arena

The universal ticker

The universal ticker

One permanent Arena id for each bet, so a person or a bot can store what it traded without depending on a venue’s ticker.

Ids

game_ + 10 characters
One real game. A postponement moves its start time, never its id.
ins_ + 12 characters
One instrument: one bet on one game, such as the Chiefs to win by more than 3.5 points. This is the id to store.
ent_ + 8 characters
One team. Outputs name teams by code and name, so you will rarely need it.

The characters after the prefix are Crockford base32: digits and capital letters, without I, L, O or U. Ids are permanent: store them, and never build or parse one. The CLI and the MCP server accept an id in any case.

Slugs are readable aliases, such as nfl-2026-w03-kc-at-mia-spread-kc-3.5. Anything that takes an id takes its slug too, but a slug may change and the id does not. Ids on this page are made-up examples of the format.

What an instrument means

Every instrument has a YES side, and its label always names it: KC ML (the Chiefs win), KC -3.5 (the Chiefs win by more than 3.5 points), Over 44.5 (the two teams score more than 44.5 points combined). yes_means says the same in a sentence.

A spread is always stored as “subject wins by more than L”, with L above zero. So KC -3.5 and MIA +3.5 are one instrument seen from opposite sides: MIA +3.5 is its NO side. MIA -3.5 is a different instrument.

push_possible is true when the result can settle at neither 0 nor 100, such as a moneyline on a game that ends tied, and tie_rule says how the venue settles a tie (half means at 50). How Arena grades a result that is neither yes nor no is on /docs/execution.

Listings and polarity

A listing is one side of one venue market that pays on the instrument. venue names the venue (kalshi today), and ticker is its market.

polarity 1 means holding the listing’s side pays when the instrument is YES; -1 means it pays when the instrument is NO. Do not work it out yourself, and do not assume 1: each listing gives buy_for_yes and buy_for_no, the side of its ticker to buy to hold the instrument’s YES or NO.

Query side and instrument side

arena resolve and resolve_market answer with the instrument and query_side, the side of it your words asked for. "mia +3.5" resolves to the KC -3.5 instrument with query_side no. In the CLI, the default columns show the words’ own label, buy_side, the id and query_side.

There are two ways to trade exactly what the words asked: buy buy_side on the listed ticker (arena buy <ticker> --side <buy_side>), or pass the id with the query side (arena buy <ins_id> --side <query_side>; on the MCP server, instrument_id with instrument_side set to query_side).

With an id or slug, --side in the CLI and instrument_side on the MCP server always mean the instrument’s side. Arena maps it to the ticker’s side, and quotes and receipts show both, as instrument_side and ticker_side.

Coverage

Version 1 covers the NFL: full-game moneylines, spreads and game totals on half-point lines. Team totals, halves, player props and other leagues have no instruments yet, so the resolver answers no rows for them. Spreads and totals are added closer to kickoff, so a game far out may list only its moneylines.

Looking ids up

arena resolve "chiefs ml"
A bet in words to the instrument id, the ticker and the side to buy. MCP: resolve_market. Works signed out.
arena instrument <ins_id|slug>
One instrument with its listings. MCP: get_instrument. Works signed out.
arena game <game_id|slug|words…> [--type spread]
Every instrument on one game. MCP: get_game. Works signed out.
arena games [--date today]
Upcoming games with their ids. MCP: list_games. Works signed out.

Ids and slugs are accepted wherever a quote or a trade takes a ticker: arena market, orderbook, chart and buy in the CLI; get_market, get_orderbook, get_price_history, place_trade (instrument_id with instrument_side) and the get_orders filter on the MCP server. Quotes, prices and trades need arena login.

Account rows carry instrument_id, instrument_label (the instrument’s YES side) and instrument_side (which side of it the row holds) when the ticker maps to an instrument: always on the MCP server, and with --json or --fields in the CLI. Picks from the HTTP API carry instrumentId and Arena’s own marketLabel.

agent mode, a made-up id and the placeholder ticker
$ arena instrument ins_0123456789AB | cat
instrument:
  instrument_id: ins_0123456789AB
  label: KC -3.5
  market_type: spread
  line: 3.5
  starts_at: 2026-09-20T17:00:00+00:00
  game_status: scheduled
  push_possible: false
  tie_rule: null
listings[1]{venue,ticker,listing_side,polarity,buy_for_yes,buy_for_no}:
  kalshi,ARENA-EXAMPLE-1,yes,1,yes,no
help[3]:
  - arena login
  - arena market ins_0123456789AB
  - arena buy ins_0123456789AB --side yes --contracts 10 --dry-run

Errors and empty results

No rows from resolve
Exit 0 with an empty list, count: 0 and an emptyReason (empty_reason on the MCP server). The resolver never guesses, so rephrase.
Unknown id or slug
CLI exit 6; MCP not_found. Resolve the bet in words again to get the current id.
A game where a bet goes
A game_ id passed to market, orderbook, chart or buy exits 2 before any request, with the hint arena game <ref>. MCP: invalid_request.
No single live listing
The instrument has no listing to trade right now, or more than one. CLI exit 6; MCP market_not_open. Trade a listed ticker instead.
A game with no instruments yet
Exit 0 with an empty list and an emptyReason: spreads and totals are added closer to kickoff.
Merged or retired ids
When two ids turn out to name the same bet, Arena records the merge on its server, but those redirects are not readable publicly yet. A merged or retired id answers not found: resolve the bet in words again to get the current id.