Skip to content

For agents

How an AI agent, or the developer building one, gets HalfPoint's data: fixtures, live scores, venue mappings, grades and a market-implied consensus probability for MLB, NBA, NFL, college football, NHL, the Premier League, the Bundesliga, LaLiga and the Champions League. Every page of these docs is also Markdown: add .md to its path (this one: /agents.md); llms.txt lists them all.

1. Try it without a key

The sample answers without a key: one league, delayed, 10 fixtures.

curl "https://odds.halfpoint.tech/sample/odds?league=nba"
curl "https://fixtures.halfpoint.tech/sample/fixtures?league=nba"

2. Describe the API to your agent

Both hosts serve an OpenAPI 3.0 description of every route, its parameters and errors, without a key:

https://odds.halfpoint.tech/openapi.json
https://fixtures.halfpoint.tech/openapi.json

3. Get a key

A key works on both hosts and gets what its plan includes: Consensus USD 49 a month, Realtime 249, Risk 799 (or 490, 2,490 and 7,990 a year). Subscribe with a card in a browser at

https://account.halfpoint.tech/checkout?plan=consensus      # or realtime, risk; &interval=year

The page names the plan, its price and its trial and asks for your email; its button takes you to Stripe. Consensus and Realtime start with a 7-day free trial (card required; one trial per customer and email); Risk has none. The key is shown once after the checkout; it can be rotated after logging in with your email at https://account.halfpoint.tech/login. See After you pay.

Send it as the X-Api-Key header:

curl -H "X-Api-Key: $HALFPOINT_KEY" "https://odds.halfpoint.tech/odds?league=nba"

4. Or connect over MCP

An MCP server (streamable HTTP) offers the same data as tools:

https://mcp.halfpoint.tech/
tool does key
get_sample the sample above: kind odds or fixtures, one league no
get_pass_options the plans, prices and checkout links no
list_leagues the leagues served yes
list_fixtures a league's schedule on a date yes
get_live score, period and clock of the games being played yes
get_consensus the consensus, of a league or one fixture yes
get_bet_stop_status the bet stop and widened per market yes, plan risk

Set the key as a header in the client's config, e.g.:

{
  "mcpServers": {
    "halfpoint": {
      "type": "http",
      "url": "https://mcp.halfpoint.tech/",
      "headers": {"X-Api-Key": "hp_..."}
    }
  }
}

Authorization: Bearer hp_... works too. A client that can't set headers (some hosted connectors) can put the key in the URL instead, https://mcp.halfpoint.tech/?key=hp_...; prefer the header where you can. Without a key only get_sample and get_pass_options answer; the others say how to get one.

5. Or pay with x402

Agents with a wallet can pay in USDC with x402, without an account. Payments settle on Base (eip155:8453) in USDC.

x402 version 2 only: the payment goes in the PAYMENT-SIGNATURE header (a v1 client's X-PAYMENT is not read, and gets 402 again). Paying for a request accepts the terms.

Per request. A request without a key to /odds, /fixtures, /live or /grades answers 402 with the payment requirements in the PAYMENT-REQUIRED header (scheme exact, USDC, the amount in its smallest unit, the address paid). Retry with PAYMENT-SIGNATURE: the answer comes once the payment is settled, with PAYMENT-RESPONSE (the transaction). An x402 client library does this for you. On /odds, ?plan=x402.risk adds stop, widened and range. Only an answer that delivers data (2xx) is settled: an error is not charged, and a paid request always gets the full answer, never 304.

route price (USD)
/odds 0.01, or 0.03 with ?plan=x402.risk
/fixtures, /live, /grades 0.002

A pass. For many calls or the stream, buy a plan for a period: it comes with a key, shown once, that works until the period ends. A pass bought without a key has no email login: a lost key is replaced by signing a message with the paying wallet (POST /x402/key, see After you pay).

POST https://account.halfpoint.tech/x402/pass?plan=realtime&period=24h
pass price (USD)
realtime, 24h 15
risk, 24h 49
realtime, 7d 69

A payer whose settlements fail repeatedly is refused for a while (403); a payer may have 2 paid requests open at once (429 beyond), and one payment serves one request (409 while it is in use by another). While payments are starting up they answer 503 with Retry-After: 30. A pass settled but not recorded answers 500 with its transaction (tx): contact us with it.

Errors your agent should handle

status meaning what to do
400 invalid parameters fix the request; the body says what
401 unknown key check the key
402 no key, or the key's subscription has lapsed get a key, renew, or pay with x402: the body names the options
403 the plan doesn't include this route, or the x402 payer is blocked a higher plan
409 this x402 payment is in use by another request wait for that request, or sign a new payment
429 too many requests, or too many streams open for the key wait Retry-After seconds; for streams (no Retry-After), close one
451 not available in your country
503 x402 payments not available yet retry after Retry-After seconds

Errors answer {"error": "..."}. See Errors and Polling: answers carry an ETag, and polling faster than the data changes returns the same answer.