Small Python programs that read the OddsRelay odds API, one folder each.
Python 3.9 or later and nothing else: there are no packages to install. The one exception is
flumine-bookmaker-prices, which runs inside flumine (Python 3.10 or later). The two n8n- folders hold
n8n workflows instead, built on n8n's own HTTP Request node: import the JSON file into n8n.
| Folder | What it shows |
|---|---|
| oddsmatcher-50 | Each bookmaker back price on a matched board beside the lowest exchange lay price, sorted by a rating the script calculates. |
| odds-screen | The best back price for each selection across every venue on the raw board, and which venues offer it. |
| conditional-polling | Polling a board with ETag and If-None-Match: an unchanged board comes back as an empty 304 Not Modified that costs nothing. |
| csv-export | Any matched board written to CSV, one row per back or lay offer. |
| racing-board | The next races' prices from a racing board, posted to a Discord channel or a Telegram chat, and only when the board has changed. |
| flumine-bookmaker-prices | UK and Irish bookmakers' win prices beside Betfair's in a flumine strategy: a background worker polls the raw board and hands each new board to the strategy. |
| n8n-oddsmatcher-sheets | An n8n workflow that keeps a Google Sheet of bookmaker back prices beside the lowest exchange lay, rated, with new rows added and earlier ones updated on a schedule. |
| n8n-price-moves-telegram | An n8n workflow that sends a Telegram message when a bookmaker's price moves past a threshold you set, comparing each check with the last. |
Sign up at app.oddsrelay.io/signup and copy your key from the dashboard. Free gives you 50,000 tokens for 14 days from sign-up, with no card, then no tokens until you choose a plan, on the same key. Plans and token prices.
export ODDSRELAY_KEY="your API key"
cd oddsmatcher-50
python3 main.py --sports tennisEvery script takes --help. The docs cover routes and parameters.
- Reads the key from
ODDSRELAY_KEYand sends it asAuthorization: Bearer. It never goes in a URL and is never printed. - Sends
Accept-Encoding: gzipand unzips what comes back. Python'surllibasks for an uncompressed reply unless told otherwise, and the standard, dutching and raw boards refuse that. - Prices the request first with
quote=true, which costs nothing. If the request has a price, the script asks before spending it; pass--max-tokensto set a ceiling and run without the prompt. - Waits out a
429for as long asRetry-Aftersays, and stops on any other error with the API's error code and request id. flumine-bookmaker-prices runs as a long-lived worker instead: it logs the error, clears its bookmaker prices and polls again.
The HTTP helper is api.py. Each folder keeps an identical copy, so any folder can be lifted out on its own.
The n8n workflows keep the key in an n8n Header Auth credential (x-api-key) and price each call with
quote=true before they read, stopping above the cap set in their Settings node.
The tests run each example's logic on the response examples published in the API's OpenAPI file (fixtures/).
They make no network calls and need no key. The flumine example's tests are skipped unless flumine is installed
(pip install -r flumine-bookmaker-prices/requirements.txt).
for m in */main.py; do (cd "$(dirname "$m")" && python3 -m unittest -v) || break; done
for t in */test.mjs; do node --test "$t" || break; doneThe second line runs the n8n workflows' Code nodes on the same fixtures (Node.js 18 or later).
- oddsrelay-python: the Python client,
pip install oddsrelay - oddsrelay-js: the JavaScript and TypeScript client,
npm install oddsrelay - oddsrelay-r: the R client
- oddsrelay-mcp: an MCP server that gives Claude, Cursor and other AI assistants read access, with a token cap
- oddsrelay-sheets: formulas and a template spreadsheet for Google Sheets
- Libraries and tools, the docs, the API reference and the OpenAPI file
- Contact: hello@oddsrelay.io