{"info":{"_postman_id":"6a4e0d1c-0f2b-4a5d-9c3e-parlayapi0001","name":"ParlayAPI: sports odds, props and prediction markets","description":"Real-time sports odds from 30+ sportsbooks and data sources, across 90+ sport\nkeys: moneylines, spreads, totals, player props, arbitrage and positive EV\nboards, historical closing lines from 2005, and prediction markets (Kalshi,\nPolymarket).\n\n## Run it right now, with no key\n\nOpen folder **1. Getting started** and press Send. Those seven requests need\nno API key, no signup and no credit card. They hit live production.\n\n## Then add a key\n\nA free key is 1,000 credits per month with no card at\nhttps://parlay-api.com/signup . Paste it into the `api_key` collection\nvariable (Collection > Variables) and the other five folders start working.\nAuth is an `X-API-Key` header, set once at collection level.\n\n`?apiKey=` as a query parameter and `Authorization: Bearer <key>` both work\ntoo, if either fits your stack better.\n\n## Collection variables\n\n| Variable | Default | What it is |\n|---|---|---|\n| `base_url` | https://parlay-api.com | API host. |\n| `api_key` | (empty) | Your key. Keyless folder works without it. |\n| `sport_key` | americanfootball_nfl | Any key from GET /v1/sports. |\n| `event_id` | (an NFL Week 1 game) | Refresh from GET /v1/sports/{sport_key}/events. |\n| `player` | Patrick Mahomes | Partial name match for the props search. |\n| `asset` | BTC | Asset for the crypto prediction markets. |\n| `date` | a recent date | YYYY-MM-DD for the historical requests. |\n\nChange `sport_key` once and most of the collection follows.\n\n## Good to know\n\n- Credits are per endpoint and the odds endpoints scale with markets and\n  regions. The catalogue is `GET /v1/meta/credit-costs` and the tier table is\n  at https://parlay-api.com/pricing .\n- The odds response shape is drop-in compatible with the-odds-api's /v4\n  endpoints, so an existing integration usually only needs a new base URL and\n  key.\n- Streaming (WebSocket and SSE) is a Business-tier and up feature and is not\n  in this collection, because Postman is not a streaming client. The\n  streaming contract is described in /v1/asyncapi.json.\n- Full machine-readable spec: https://parlay-api.com/openapi.json .\n  Browseable docs: https://parlay-api.com/docs .\n\nCanonical copy of this file, always current:\nhttps://parlay-api.com/collections/ParlayAPI.postman_collection.json","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json"},"auth":{"type":"apikey","apikey":[{"key":"key","value":"X-API-Key","type":"string"},{"key":"value","value":"{{api_key}}","type":"string"},{"key":"in","value":"header","type":"string"}]},"item":[{"name":"1. Getting started (no API key)","description":"Every request in this folder runs with no API key and no signup. Hit Send\nright now.\n\nThe `/v1/try/*` endpoints are the keyless demo: real live prices, capped at\nthe first 5 events per sport and 60 requests per hour per IP. The response\nnests the games under an `events` key and carries a `demo_remaining_hour`\ncounter so you can see the budget you have left.\n\nWhen you want all events, all books and all markets, a free key is 1,000\ncredits per month with no card: https://parlay-api.com/signup . Paste it into the\n`api_key` collection variable and every other folder starts working.","item":[{"name":"Demo odds, no key (first 5 events)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/try/{{sport_key}}/odds","host":["{{base_url}}"],"path":["v1","try","{{sport_key}}","odds"],"query":[]},"description":"The fastest possible look at the data. No key, no signup, real prices from\n30+ sportsbooks and data sources.\n\nGames come back under the `events` key, each with a `bookmakers` array\nholding one entry per book and its markets. `demo_remaining_hour` tells you\nhow many of the 60 hourly demo calls are left for your IP.\n\nChange `sport_key` (a collection variable) to any key from\n`GET /v1/sports`: americanfootball_nfl, basketball_nba, baseball_mlb,\nicehockey_nhl, soccer_epl, mma_mixed_martial_arts, and 90+ more.\n\nThe keyed equivalent, with every event and every market, is\n`GET /v1/sports/{sport_key}/odds` in the Odds folder.","auth":{"type":"noauth"}},"response":[]},{"name":"Demo arbitrage scan, no key","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/try/{{sport_key}}/arbitrage","host":["{{base_url}}"],"path":["v1","try","{{sport_key}}","arbitrage"],"query":[]},"description":"Cross-book arbitrage on the demo slice: pairs of prices where backing both\nsides locks a profit regardless of result.\n\nEach row names the two books, the two prices, the stake split and the profit\npercentage. Empty array is a normal and honest answer: clean two-way arbs on\nfive events are rare, and the keyed endpoint scanning every event is where\nthey turn up.\n\nKeyed version with filters (minProfit, exclude_books, markets):\n`GET /v1/sports/{sport_key}/arbitrage`.","auth":{"type":"noauth"}},"response":[]},{"name":"Demo positive EV, no key","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/try/{{sport_key}}/ev","host":["{{base_url}}"],"path":["v1","try","{{sport_key}}","ev"],"query":[]},"description":"Positive expected value picks on the demo slice: soft-book prices measured\nagainst a sharp book's no-vig line, which is the standard way to estimate\nwhether a price is actually beatable.\n\nEach row carries the offered price, the fair price, the edge percentage and\nthe books compared. Keyed version lets you choose the sharp book and the\nminimum edge: `GET /v1/sports/{sport_key}/ev`.","auth":{"type":"noauth"}},"response":[]},{"name":"Demo middles, no key","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/try/{{sport_key}}/middles","host":["{{base_url}}"],"path":["v1","try","{{sport_key}}","middles"],"query":[]},"description":"Middle opportunities on the demo slice: two books offering spreads or totals\nfar enough apart that a range of results wins both sides.\n\nRows carry the two lines, the gap and the win window. Keyed version:\n`GET /v1/sports/{sport_key}/middles`.","auth":{"type":"noauth"}},"response":[]},{"name":"List every sport key","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/sports","host":["{{base_url}}"],"path":["v1","sports"],"query":[]},"description":"The catalogue: 90+ sport keys with their titles, groups and whether they are\ncurrently in season. No key required.\n\nThis is the lookup for the `sport_key` collection variable. Every odds,\nprops, historical and prediction-market request in this collection takes one\nof these keys.","auth":{"type":"noauth"}},"response":[]},{"name":"List every bookmaker","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/bookmakers","host":["{{base_url}}"],"path":["v1","bookmakers"],"query":[]},"description":"Every sportsbook, DFS app, exchange and prediction market we collect, with\nits key, title and region. No key required.\n\nUse the `key` values in the `bookmakers=` query parameter on the odds, props\nand closing-line endpoints to pin a response to the books you care about.","auth":{"type":"noauth"}},"response":[]},{"name":"Biggest line moves right now","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/moves.json","host":["{{base_url}}"],"path":["moves.json"],"query":[]},"description":"A public JSON feed of the largest recent line movements across the board, the\nsame data behind the /moves page on the site. No key required, no credits.\n\nHandy as a zero-setup smoke test that the collection is wired up, and as a\ncheap way to see whether the data looks alive before you sign up.","auth":{"type":"noauth"}},"response":[]}]},{"name":"2. Odds","description":"Game lines: moneyline (h2h), spreads and totals across every book we\ncollect, plus the derived boards (best line, arbitrage, positive EV) built on\ntop of them.\n\nThese need an API key in the `api_key` collection variable. Free tier is\n1,000 credits per month with no card: https://parlay-api.com/signup . Per-endpoint\ncredit costs are in `GET /v1/meta/credit-costs`, and the tier table is at\nhttps://parlay-api.com/pricing .","item":[{"name":"Game odds: h2h, spreads, totals","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/sports/{{sport_key}}/odds?markets=h2h,spreads,totals&regions=us&oddsFormat=american","host":["{{base_url}}"],"path":["v1","sports","{{sport_key}}","odds"],"query":[{"key":"markets","value":"h2h,spreads,totals","description":"Comma-separated: h2h, spreads, totals.","disabled":false},{"key":"regions","value":"us","description":"Comma-separated book regions: us, us2, uk, eu, au.","disabled":false},{"key":"oddsFormat","value":"american","description":"american or decimal. Decimal is the default.","disabled":false},{"key":"bookmakers","value":"draftkings,fanduel,pinnacle","description":"Comma-separated book keys from GET /v1/bookmakers. Overrides regions.","disabled":true},{"key":"date","value":"","description":"Shortcut for one UTC day, YYYY-MM-DD.","disabled":true}]},"description":"The core endpoint. Every upcoming event for a sport, with one entry per\nbookmaker and one price per outcome.\n\n`markets` takes any comma-separated combination of h2h (moneyline), spreads\nand totals. `regions` picks the book set (us, us2, uk, eu, au); `bookmakers`\noverrides it with explicit keys. `oddsFormat` is decimal by default, american\nif you ask.\n\nResponse shape is drop-in compatible with the-odds-api's /v4 odds endpoint,\nso an existing integration usually only needs the base URL and the key\nswapped.\n\nCost scales with markets and regions, so ask for what you need: see\n`GET /v1/meta/credit-costs`."},"response":[]},{"name":"Upcoming events (ids, teams, start times)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/sports/{{sport_key}}/events","host":["{{base_url}}"],"path":["v1","sports","{{sport_key}}","events"],"query":[{"key":"commenceTimeFrom","value":"","description":"ISO 8601 lower bound on start time.","disabled":true},{"key":"commenceTimeTo","value":"","description":"ISO 8601 upper bound on start time.","disabled":true}]},"description":"The schedule without any prices: event id, home and away team, and commence\ntime.\n\nCheap way to find the `event_id` you need for the single-event odds call\nbelow, and the right endpoint to poll when you are building a slate view and\ndo not want to pay for odds you are not showing yet."},"response":[]},{"name":"Odds for one event","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/sports/{{sport_key}}/events/{{event_id}}/odds?regions=us&markets=h2h,spreads,totals&oddsFormat=american","host":["{{base_url}}"],"path":["v1","sports","{{sport_key}}","events","{{event_id}}","odds"],"query":[{"key":"regions","value":"us","description":"Required. Comma-separated: us, us2, uk, eu, au.","disabled":false},{"key":"markets","value":"h2h,spreads,totals","description":"Comma-separated market keys.","disabled":false},{"key":"oddsFormat","value":"american","description":"american or decimal.","disabled":false}]},"description":"Every book's prices for a single game. Use this instead of the full-sport\ncall when you already know which event you care about: it is the difference\nbetween pulling one game and pulling a whole slate.\n\n`event_id` is a collection variable pre-filled with a real NFL Week 1 game.\nEvent ids do not live forever, so when this returns 404 grab a fresh one from\nthe Upcoming events request above.\n\n`regions` is required on this endpoint."},"response":[]},{"name":"Best available line per outcome","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/sports/{{sport_key}}/best-line?markets=h2h&oddsFormat=american","host":["{{base_url}}"],"path":["v1","sports","{{sport_key}}","best-line"],"query":[{"key":"markets","value":"h2h","description":"Comma-separated market keys.","disabled":false},{"key":"oddsFormat","value":"american","description":"american or decimal.","disabled":false},{"key":"bookmakers","value":"","description":"Restrict the comparison to these book keys.","disabled":true}]},"description":"Line shopping in one call: for each outcome, the book offering the best\nprice right now, and what that price is worth against the field.\n\nThis is the request that makes the case for an aggregator. The same\nmoneyline can differ by several cents between books, and over a season that\ngap is the whole margin."},"response":[]},{"name":"Arbitrage scan","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/sports/{{sport_key}}/arbitrage?minProfit=1.0&markets=h2h,spreads,totals&limit=50","host":["{{base_url}}"],"path":["v1","sports","{{sport_key}}","arbitrage"],"query":[{"key":"minProfit","value":"1.0","description":"Minimum profit percentage to include.","disabled":false},{"key":"markets","value":"h2h,spreads,totals","description":"CSV of market keys to scan.","disabled":false},{"key":"exclude_books","value":"","description":"CSV of book keys to drop from either side.","disabled":true},{"key":"limit","value":"50","description":"Max opportunities returned.","disabled":false}]},"description":"Every two-sided price pair on the board that locks a profit, sorted best\nfirst, with the stake split already computed.\n\n`minProfit` filters out the noise floor. `exclude_books` is worth knowing\nabout: exchange asks (novig, prophetx) can be thin, so an arb anchored on one\nmay not be fillable at size. `markets` narrows the scan to game lines or to\nspecific prop markets."},"response":[]},{"name":"Positive EV against a sharp book","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/sports/{{sport_key}}/ev?sharpBook=pinnacle&minEdge=2.0&limit=50","host":["{{base_url}}"],"path":["v1","sports","{{sport_key}}","ev"],"query":[{"key":"sharpBook","value":"pinnacle","description":"Sharp book used as the fair-odds baseline.","disabled":false},{"key":"minEdge","value":"2.0","description":"Minimum edge percentage.","disabled":false},{"key":"markets","value":"","description":"CSV of market keys, including player_* prop markets.","disabled":true},{"key":"limit","value":"50","description":"Max picks returned.","disabled":false}]},"description":"Soft-book prices measured against a sharp book's no-vig line. Rows carry the\noffered price, the implied fair price, the edge percentage and how many books\nwere compared.\n\n`sharpBook` defaults to pinnacle. `minEdge` sets the floor in percent, and\n`min_books` drops rows where too few books priced the market for the\nconsensus to mean much."},"response":[]},{"name":"Line movement history","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/sports/{{sport_key}}/line-movement?hours=24&market=h2h","host":["{{base_url}}"],"path":["v1","sports","{{sport_key}}","line-movement"],"query":[{"key":"hours","value":"24","description":"Lookback window in hours.","disabled":false},{"key":"market","value":"h2h","description":"Market key to trace.","disabled":false},{"key":"bookmaker","value":"","description":"Single book key to trace.","disabled":true},{"key":"eventId","value":"","description":"Restrict to one event id.","disabled":true}]},"description":"How a price got where it is: the timestamped movement history for a market,\noptionally narrowed to one event, one book or one player.\n\n`hours` is the lookback window. Steam detection, opener-to-current deltas and\n\"who moved first\" analysis all start here."},"response":[]}]},{"name":"3. Player props","description":"Player props with American odds from sportsbooks, DFS apps (PrizePicks,\nUnderdog, Sleeper and friends) and exchanges, in one normalized shape.\n\nDFS apps do not quote two-sided odds the way a sportsbook does, so\n`dfsOdds=midpoint` normalizes them to a zero-vig +100/-100 pair by default.\nPass `dfsOdds=effective` if you would rather see each app's own implied\nprice.","item":[{"name":"Player props for a sport (grouped)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/sports/{{sport_key}}/props?grouped=true&markets=player_pass_yds,player_rush_yds,player_receptions&oddsFormat=american&limit=200","host":["{{base_url}}"],"path":["v1","sports","{{sport_key}}","props"],"query":[{"key":"grouped","value":"true","description":"One entry per prop with a books[] array. Recommended.","disabled":false},{"key":"markets","value":"player_pass_yds,player_rush_yds,player_receptions","description":"Comma-separated player_* market keys.","disabled":false},{"key":"oddsFormat","value":"american","description":"american or decimal.","disabled":false},{"key":"limit","value":"200","description":"Max rows returned.","disabled":false},{"key":"dfsOdds","value":"midpoint","description":"midpoint (zero-vig) or effective (per-app implied).","disabled":true}]},"description":"Every player prop currently priced for a sport. `grouped=true` returns one\nentry per prop with a `books[]` array, which is what you want for line\nshopping; leave it off and you get one flat row per book per prop.\n\n`markets` takes any comma-separated player_* keys. Full list per sport comes\nfrom the prop markets request below, or from `GET /v1/markets`.\n\nResponses can be large. `limit` and `offset` paginate; `maxAgeSec` drops\nrows staler than you are willing to trade on."},"response":[]},{"name":"Player props for one player","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/sports/{{sport_key}}/props?player={{player}}&grouped=true&oddsFormat=american","host":["{{base_url}}"],"path":["v1","sports","{{sport_key}}","props"],"query":[{"key":"player","value":"{{player}}","description":"Partial player-name match.","disabled":false},{"key":"grouped","value":"true","description":"One entry per prop with a books[] array.","disabled":false},{"key":"oddsFormat","value":"american","description":"american or decimal.","disabled":false}]},"description":"The same endpoint narrowed to a single player by partial name match. This is\nthe shape most prop tools actually ship: a search box, then every book's\nprice for that player's markets side by side.\n\n`player` is a collection variable so you can change it once and re-run."},"response":[]},{"name":"Prop markets offered for a sport","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/sports/{{sport_key}}/props/markets","host":["{{base_url}}"],"path":["v1","sports","{{sport_key}}","props","markets"],"query":[]},"description":"Which player_* market keys are actually live for this sport right now, so you\ncan build the `markets=` filter from data instead of guessing.\n\nNFL gives you passing, rushing, receiving, anytime touchdown and kicking\nmarkets; NBA gives points, rebounds, assists and the combination markets;\nMLB gives strikeouts, hits, total bases and more."},"response":[]}]},{"name":"4. Historical and closing lines","description":"The archive: game-line closing odds from 2005, and 30M+ player prop closing\nlines since 2022.\n\nClosing lines are the benchmark serious bettors grade against, because a\nstrategy that consistently beats the close is the one that holds up over a\nlarge sample. The CLV request at the bottom of this folder does that grading\nfor you.\n\nFree-tier keys have a short lookback window, so start with the coverage\nrequest (no key needed) to see what the archive holds before you commit to a\ntier: https://parlay-api.com/pricing .","item":[{"name":"Archive coverage, no key","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/historical/coverage","host":["{{base_url}}"],"path":["v1","historical","coverage"],"query":[{"key":"sport_key","value":"","description":"Filter to one sport key.","disabled":true},{"key":"min_rows","value":"","description":"Only list sports with at least this many rows.","disabled":true}]},"description":"How deep the archive actually goes, per sport: row counts, date span,\ncontributing sources and score-coverage percentage. Public, no key, no\ncredits.\n\nRun this before you plan a backtest. It answers \"do you have enough of my\nsport, far enough back\" with numbers instead of marketing copy.","auth":{"type":"noauth"}},"response":[]},{"name":"Historical odds snapshot for a date","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/historical/sports/{{sport_key}}/odds?date={{date}}&markets=h2h,spreads,totals&regions=us&oddsFormat=american","host":["{{base_url}}"],"path":["v1","historical","sports","{{sport_key}}","odds"],"query":[{"key":"date","value":"{{date}}","description":"YYYY-MM-DD or ISO 8601 timestamp.","disabled":false},{"key":"markets","value":"h2h,spreads,totals","description":"Comma-separated market keys.","disabled":false},{"key":"regions","value":"us","description":"Comma-separated book regions.","disabled":false},{"key":"oddsFormat","value":"american","description":"american or decimal.","disabled":false}]},"description":"The board as it stood on a given day. Pass `date=YYYY-MM-DD` for a single\nday out of the long-term archive, which also carries the anchored\nclosing-line variants (book keys suffixed `_an`).\n\nOmit `date` and you get the most recent snapshot. Note that the single-date\npath and the dateFrom/dateTo range path read different stores and can return\ndifferent rows for the same day; the single-date path is the archival one."},"response":[]},{"name":"Closing odds for a date range","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/historical/sports/{{sport_key}}/closing-odds?dateFrom=2026-08-01&dateTo={{date}}&markets=h2h,spreads,totals&limit=500","host":["{{base_url}}"],"path":["v1","historical","sports","{{sport_key}}","closing-odds"],"query":[{"key":"dateFrom","value":"2026-08-01","description":"Start date YYYY-MM-DD.","disabled":false},{"key":"dateTo","value":"{{date}}","description":"End date YYYY-MM-DD.","disabled":false},{"key":"markets","value":"h2h,spreads,totals","description":"Game-line or player_* market keys.","disabled":false},{"key":"limit","value":"500","description":"Max rows returned.","disabled":false},{"key":"season","value":"","description":"Season filter for game lines, e.g. 2025-26.","disabled":true}]},"description":"Closing lines in bulk: game lines from the historical odds archive, player\nprops from the prop closing-line archive, over any date range or season.\n\nPass a `player_*` key in `markets` to pull prop closes instead of game lines.\n`season` (for example 2025-26) is a shortcut for a full season of game lines.\nPaginate with `limit` and `offset`.\n\nThis is the endpoint model backtests are built on."},"response":[]},{"name":"Recent closing lines","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/sports/{{sport_key}}/closing-lines?daysFrom=3&bookmakers=pinnacle&oddsFormat=american&limit=500","host":["{{base_url}}"],"path":["v1","sports","{{sport_key}}","closing-lines"],"query":[{"key":"daysFrom","value":"3","description":"Lookback in days.","disabled":false},{"key":"bookmakers","value":"pinnacle","description":"Comma-separated book keys.","disabled":false},{"key":"oddsFormat","value":"american","description":"american or decimal.","disabled":false},{"key":"limit","value":"500","description":"Max rows returned.","disabled":false}]},"description":"The last price each book showed before each match started, for the last few\ndays. Pinnacle by default, since Pinnacle's close is the usual sharp\nreference.\n\n`daysFrom` is the lookback in days, bounded by your plan. For anything older\nthan that window, use the closing-odds request above."},"response":[]},{"name":"Grade a bet slip for closing line value","request":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/clv","host":["{{base_url}}"],"path":["v1","clv"],"query":[]},"description":"Send the bets you took and get back what they were worth against the closing\nline: per-bet `clv_cents` and `clv_pct`, no-vig adjusted where both sides\nclosed, plus an aggregate summary.\n\nWorks for game lines (send home_team and away_team) and for player props\n(send player, market and line). `taken_odds` is your actual fill in American\nodds. `sharp_book` defaults to pinnacle and falls back to novig when Pinnacle\ndid not price the market.\n\nEdit the example body: it is a two-bet slip, one prop and one moneyline.","body":{"mode":"raw","raw":"{\n  \"bets\": [\n    {\n      \"sport_key\": \"americanfootball_nfl\",\n      \"game_date\": \"2026-01-11\",\n      \"player\": \"Patrick Mahomes\",\n      \"market\": \"player_pass_yds\",\n      \"outcome\": \"over\",\n      \"line\": 274.5,\n      \"taken_odds\": -110\n    },\n    {\n      \"sport_key\": \"americanfootball_nfl\",\n      \"game_date\": \"2026-01-11\",\n      \"home_team\": \"Kansas City Chiefs\",\n      \"away_team\": \"Buffalo Bills\",\n      \"market\": \"h2h\",\n      \"outcome\": \"Kansas City Chiefs\",\n      \"line\": null,\n      \"taken_odds\": -135\n    }\n  ],\n  \"sharp_book\": \"pinnacle\"\n}","options":{"raw":{"language":"json"}}}},"response":[]}]},{"name":"5. Prediction markets","description":"Kalshi and Polymarket prices alongside the sportsbook board, in the same\nnormalized shape as everything else.\n\nPrediction markets settle in dollars rather than in odds, so a contract\ntrading at 0.62 is the market's 62% probability. Reading them next to a\nsportsbook price is one of the cleaner edges available right now, and the\ndivergence feed at the bottom of this folder is exactly that comparison,\nfree and keyless.\n\nTwo of the four requests here need no key: the keyword search and the\ndivergence feed.","item":[{"name":"Prediction markets for a sport","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/prediction-markets/{{sport_key}}?sources=kalshi,polymarket","host":["{{base_url}}"],"path":["v1","prediction-markets","{{sport_key}}"],"query":[{"key":"sources","value":"kalshi,polymarket","description":"Comma-separated venues.","disabled":false}]},"description":"Current Kalshi and Polymarket contracts for a sport, with yes/no bid, ask,\nmid-market implied probability, volume and open interest.\n\n`sources` narrows to one venue. Pair the implied probabilities here with\n`GET /v1/sports/{sport_key}/consensus` to see where the exchanges and the\nbooks disagree."},"response":[]},{"name":"Search prediction markets by keyword, no key","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/prediction-markets/search?q=afc&sources=kalshi,polymarket&min_volume=1000&limit=25","host":["{{base_url}}"],"path":["v1","prediction-markets","search"],"query":[{"key":"q","value":"afc","description":"Search terms. Percent-encode spaces as %20 for phrases.","disabled":false},{"key":"sources","value":"kalshi,polymarket","description":"Comma-separated venues. Novig is also accepted but its public endpoint is refusing requests at the moment, so the example pins the two that answer.","disabled":false},{"key":"min_volume","value":"1000","description":"Drop contracts below this traded volume.","disabled":false},{"key":"limit","value":"25","description":"Max results.","disabled":false}]},"description":"Keyword search across the prediction-market venues we collect, and it needs no API key.\nPrediction-market contracts are titled in prose, not in team keys, so search\nis usually the right way in.\n\nThe example searches `afc` because a conference-winner futures market is one\nof the few things both Kalshi and Polymarket price, so one request shows you\nboth venues side by side. Single-word terms keep the raw URL clean; if you\nsearch a phrase, percent-encode the space as `%20`.\n\n`sources` narrows the venues. `min_volume` filters out untraded contracts,\nwhich is worth doing: a market with no volume has a price but not an opinion.\n`sort` accepts balanced, volume or confidence.\n\nFirst call for a term fans out to the venues live, so expect several\nseconds; the answer is cached for 90 seconds after that and comes back\nimmediately. `cache_hit` in the response tells you which one you got.","auth":{"type":"noauth"}},"response":[]},{"name":"Crypto prediction markets","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/prediction-markets/crypto/{{asset}}?market_type=all&limit=100","host":["{{base_url}}"],"path":["v1","prediction-markets","crypto","{{asset}}"],"query":[{"key":"market_type","value":"all","description":"all, price_above, price_range, direction_15m, direction_1h, direction_daily.","disabled":false},{"key":"limit","value":"100","description":"Max contracts returned.","disabled":false}]},"description":"Kalshi crypto price markets for an asset: the price ladders\n(`price_at_or_above` per strike, and `price_range` bands) with bid, ask,\nimplied probability, volume and open interest.\n\n`asset` is a collection variable, pre-filled with BTC. `market_type` filters\nthe ladder family. Ask for a combination outside the live window and you get\na 404 naming what is live, with no credit charged, rather than a billed empty\narray."},"response":[]},{"name":"Books vs prediction markets divergence, no key","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/divergence.json","host":["{{base_url}}"],"path":["divergence.json"],"query":[]},"description":"A public JSON feed of the widest current gaps between sportsbook implied\nprobability and prediction-market implied probability, the same data behind\nthe /divergence board on the site. No key, no credits.\n\nThe clearest one-request demonstration of why having both sides in one API\nis useful.","auth":{"type":"noauth"}},"response":[]}]},{"name":"6. Meta and status","description":"The endpoints you wire up once and then forget: what everything costs, what\nthe platform is doing, and how much of your quota is left.\n\nAll of these except account usage are keyless.","item":[{"name":"Platform status, no key","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/status","host":["{{base_url}}"],"path":["v1","status"],"query":[]},"description":"Machine-readable platform status: per-source collection health and the\nfreshness of what we are serving. No key required.\n\nWorth polling from a monitoring job if you have a pipeline that depends on\nfresh odds, so a stale-source problem shows up as an alert rather than as a\nbad bet.","auth":{"type":"noauth"}},"response":[]},{"name":"Credit cost of every endpoint, no key","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/meta/credit-costs","host":["{{base_url}}"],"path":["v1","meta","credit-costs"],"query":[]},"description":"The full cost catalogue: what each endpoint charges, which ones are free, and\nthe formulas behind the variable-cost ones (odds calls scale with markets and\nregions).\n\nRead this before you write a polling loop. The same costs are published as\n`x-credit-cost` extensions in /openapi.json, so SDK generators and agents can\npick them up automatically. Tier limits are at\nhttps://parlay-api.com/pricing .","auth":{"type":"noauth"}},"response":[]},{"name":"API info and discovery URLs, no key","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/meta/api-info","host":["{{base_url}}"],"path":["v1","meta","api-info"],"query":[]},"description":"The discovery document: spec URLs (/openapi.json, /v1/asyncapi.json),\ndocumentation links, SDK packages and the endpoint families available. No key\nrequired.\n\nThis is the request an AI agent makes first when it lands on the API, and it\nis a fast way for a human to see the whole surface at once.","auth":{"type":"noauth"}},"response":[]},{"name":"Your account usage and quota","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/account","host":["{{base_url}}"],"path":["v1","account"],"query":[]},"description":"Credits used, credits remaining, reset date and current tier for the key in\nthe `api_key` variable.\n\nFree tier is 1,000 credits per month with no card. Check this in your own\nintegration before a big pull so you find the ceiling in your logs rather\nthan in a 402."},"response":[]}]}],"variable":[{"key":"base_url","value":"https://parlay-api.com","type":"string","description":"API host. Leave as is. https://api.parlay-api.com is the same surface on a host that bypasses the CDN edge, for high-volume callers."},{"key":"api_key","value":"","type":"string","description":"Your ParlayAPI key. Empty on purpose: folder 1 runs without one. Get a free key, 1,000 credits per month and no card, at https://parlay-api.com/signup . Sent as the X-API-Key header."},{"key":"sport_key","value":"americanfootball_nfl","type":"string","description":"Any key from GET /v1/sports: basketball_nba, baseball_mlb, icehockey_nhl, soccer_epl, mma_mixed_martial_arts, and 90+ more."},{"key":"event_id","value":"1bb67464f064518614cf526e0af54269","type":"string","description":"An NFL Week 1 game. Event ids expire once the game is old, so refresh from GET /v1/sports/{sport_key}/events."},{"key":"player","value":"Patrick Mahomes","type":"string","description":"Partial name match for the player props search."},{"key":"asset","value":"BTC","type":"string","description":"Asset for the Kalshi crypto prediction markets."},{"key":"date","value":"2026-08-31","type":"string","description":"YYYY-MM-DD for the historical requests. Free-tier keys have a short lookback window, so keep this recent until you upgrade."}]}