Skip to main content

Overview

/v3/odds tells you the price. To find that exact selection at the bookmaker, you need the bookmaker’s own id for it. /v3/mappings gives you that link: for every selection we price, it returns the bookmaker’s event, market and outcome ids, together with our event’s teams, start time, sport and league. For Polymarket: For Kalshi: Kalshi outcome ids are always yes or no, so an outcomeId on its own is not unique. For Kalshi, look up a selection with marketId and outcomeId together. The endpoint and response are the same for every bookmaker, so more books can be added without changes on your side.
Native id mappings are available on paid plans. The bookmaker you query must be in your bookmaker selection, as with /v3/odds.

Request

Modes

Every mode returns { "data": [...], "nextCursor": ... }. nextCursor is always null for lookups and is only set in bulk sync while more pages remain. A lookup that matches more than 5,000 mappings returns 400: request fewer ids, add a market filter, or use bulk sync. A batch or bulk call counts as one request against your rate limit, like /v3/odds/multi.

Query Parameters

eventId/eventIds cannot be combined with marketId/marketIds/outcomeId. Duplicate ids in a batch are ignored.

Example Response

Kalshi example

Each Kalshi contract is a yes/no question. yes on “Buffalo wins by more than 2.5” is home -2.5, and no on the same contract is the other side of that line (away, shown with the home handicap -2.5). An ML contract per team works the same way: yes on the home team’s ticker is home, and no on it is away. On a football ML, Kalshi lists a separate contract per result (home, away, tie), and we map the yes outcome of each. Both Teams To Score uses side yes and no.

Response Fields

Bulk sync

To keep a local copy of every mapping, call /v3/mappings with only bookmaker (and optionally sport, league, market or active). It returns the mappings of every upcoming and live event we have linked to that bookmaker, ordered for paging:
Pass nextCursor back as cursor until it is null. Each page is cached for about 30 seconds, so there is no benefit in polling faster than that.
Key your copy on (marketId, outcomeId): for Kalshi the outcomeId alone repeats across contracts. Bulk sync covers events that start in the future or are live. Events that started more than 6 hours ago, or are settled or cancelled, drop out of it; look those up by eventId instead.

Orientation

market, hdp, side, home and away always follow our event’s home and away, the same as /v3/odds. Polymarket and Kalshi often list a game the other way round (“Away vs. Home” or “Away at Home”). When they do, we swap the sides and flip the sign of hdp for you, and team markets such as Team Total Home take our name for that team. A side: "home" row is the outcome that pays when our home team covers, whatever the order at the bookmaker. To match a price to its id, join on eventId, market, hdp and side:

Things to Know

  • Mappings do not depend on prices. We refresh them separately from prices. When a book is briefly empty and the price disappears from /v3/odds, the mapping is still returned.
  • Polymarket refreshes stop at kickoff. Mappings of in-play Polymarket events are still returned, with the ids we last confirmed before kickoff, but lastCheckedAt no longer moves and new in-play contracts are not added.
  • Spreads are often listed twice. Polymarket lists many spreads once from each team’s side, for example “Steelers (-2.5)” and “Browns (-2.5)”. These are two different lines (home +2.5 and home -2.5 in our orientation), each with its own marketId and tokens, and both are returned.
  • Football results are three contracts. A football ML on Polymarket is three Yes/No markets (home, draw, away). We map the Yes token of each, so each side has its own marketId.
  • Tennis totals. Totals is total sets and Totals (Games) is total games, the same names /v3/odds uses.
  • Only confirmed sides are mapped. If we cannot tell from the outcome names which team a token belongs to, we leave it out rather than guess. For Kalshi, a contract is mapped to a side only when Kalshi’s own ticker identifies the team.
  • Cache locally. Mappings change rarely. Run a bulk sync on start and refresh it every few minutes, then look up anything new with eventIds, marketIds or outcomeId.

Next Steps

Prediction Markets

How Polymarket and Kalshi prices appear in /v3/odds

Fetching Odds

Fetch the prices these ids belong to