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
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:
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.
(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
lastCheckedAtno 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
marketIdand tokens, and both are returned. - Football results are three contracts. A football
MLon Polymarket is three Yes/No markets (home, draw, away). We map the Yes token of each, so each side has its ownmarketId. - Tennis totals.
Totalsis total sets andTotals (Games)is total games, the same names/v3/oddsuses. - 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,marketIdsoroutcomeId.
Next Steps
Prediction Markets
How Polymarket and Kalshi prices appear in /v3/odds
Fetching Odds
Fetch the prices these ids belong to