DeepChamp for Agents
Free sports slate and matchup research tools for AI agents, over MCP and REST, no signup. Research only; 21+.
Hosted MCP Server
npx add-mcp 'https://deepchampai.com/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
Quickstart
The free tools need no account and no key. Try one now.
curl
curl 'https://deepchampai.com/api/agent/v1/slate/today?sport=nba'
Connect a coding agent over remote MCP. Pick your client:
Claude Code
Add the server from the command line.
shell
claude mcp add --transport http deepchamp https://deepchampai.com/mcp
Codex
Add this to ~/.codex/config.toml (or run `codex mcp add deepchamp --url https://deepchampai.com/mcp\`), then restart Codex.
toml
[mcp_servers.deepchamp]
url = "https://deepchampai.com/mcp"
startup_timeout_sec = 20
Claude Desktop and Cursor
Add this to the MCP settings file (claude_desktop_config.json, or.cursor/mcp.json) and restart the client.
json
{
"mcpServers": {
"deepchamp": {
"url": "https://deepchampai.com/mcp"
}
}
}
VS Code
Add this to.vscode/mcp.json in your workspace.
json
{
"servers": {
"deepchamp": {
"type": "http",
"url": "https://deepchampai.com/mcp"
}
}
}
Any other MCP client
Point it at the streamable HTTP endpoint https://deepchampai.com/mcp. The server card is at https://deepchampai.com/mcp/server-card.
url
https://deepchampai.com/mcp
Install the agent skill
shell
npx skills add https://deepchampai.com --skill deepchamp-edge -g -y
The skill teaches your agent every tool and when to use it. The OpenAPI 3.1 document at /openapi.json describes every live REST operation; generate a client from it with any OpenAPI tool.
Charts and pictures (Claude Code, Codex and others)
The free get_daily_slate and get_matchup_context tools can return a visual with the data. It only draws fields the JSON already carries: no odds, no prices, no logos or photos (teams are neutral tiles), and no result claims. Every picture ends with derived analysis, not advice, 21+, 1-800-MY-RESET.
| Client | Text chart | Inline PNG | Picture link | structuredContent |
|---|---|---|---|---|
| Claude Code | Own text block | Yes (the model sees it) | Yes | Left out, so every block reaches the model |
| Codex | Own text block | Yes (the model sees it) | Yes | Left out (Codex drops all content when it is present) |
| Any other client | Inside the JSON (visual.text_chart) | Only with visual: "image" | Yes | Kept |
Claude Code and Codex give an MCP image to the model, not to the person in a terminal, so the server instructions ask the model to paste the chart block into its reply and link visual.url (a model may not follow them, which is why the picture link is also in the answer). The picture link is a public URL on this site (/api/agent/v1/visual/slate/{sport}/{date}.png and /visual/matchup/..., with an .svg twin), cached like the free JSON. Paid lines never get a picture link.
Arguments on tools that can carry a visual: visual is auto (default, by client), image (picture and link), text (chart only) or none (plain data). harness (claude-code, codex, generic) is a display hint that changes the format and nothing else. The client is recognised from the MCP client name, the User-Agent or the X-Agent-Harness header; all of these are self-declared and never unlock anything.
The response envelope
Every response has four parts: data, compliance, meta and billing. Errors use a smaller body (see Errors).
| Field | Meaning |
|---|---|
data | The tool result. Its shape is in the OpenAPI document and the MCP tool schema. |
compliance | age_gate (21), notice, helpline, helpline_url, ai_generated, terms_url, privacy_url. Relay it to the people your agent serves. |
meta.request_id | Quote it in support requests and when rating a response. |
meta.as_of | When the response was produced. |
meta.model_version | The model version, for example dc-intel-1.0.0. Log it with every signal. |
meta.data_freshness_seconds | Age of the data behind the response, or null. |
meta.cache | hit, miss, stale or none. |
meta.day | The Eastern calendar day the response is for. |
billing.status | free, charged, not_charged or replayed. You are charged only on charged. |
billing.units / price_micros | Units used and the price in millionths of a US dollar. |
billing.payer / balance_micros | Who paid (none, account or receipt) and the remaining prepaid balance when a key was used. |
Prices are integers in micro-USD: one US dollar is 1,000,000 micro-USD. Free responses are cacheable for five minutes. Paid and error responses are never cacheable.
Authentication
Free tools: none. Do not send a key. Paid tools: one of two ways, which you can mix. Paying is the signup, so there is no form to fill in first.
- Pay per call. Call the tool, receive an HTTP 402 payment challenge, pay it, and repeat the request with the credential. The receipt is your identity.
- API key. A key spends a prepaid balance. Send it in the
X-DC-Api-Keyheader. Keys look likedc_sk_live_followed by an id, a secret and a checksum, so secret scanners can find a leak. Only a hash is stored. A key is shown once and can be rotated or revoked.
API key (when paid lines are open)
curl 'https://deepchampai.com/api/agent/v1/ranked-picks?sport=nba' \
-H 'X-DC-Api-Key: dc_sk_live_<your key>' \
-H 'Idempotency-Key: 6f1c1a52-0a0e-4f6e-9a77-5f0f5d1c9d11'
Never put a key in client-side code, a public repository or a prompt. Paid access is not open yet: only the free tools are live today.
Payments and the 402 flow
A paid call without a valid credential returns HTTP 402 Payment Required (REST) or JSON-RPC error -32042 (MCP) with a payment challenge: the price, the methods we accept and an expiry. Your agent pays and repeats the same request with the credential. We use the HTTP payment authentication scheme (the Machine Payments Protocol), so clients such as the Stripe link CLI and the mppx library do the exchange for you.
the 402 flow
# 1. Call a paid tool without a credential
curl -i 'https://deepchampai.com/api/agent/v1/ranked-picks?sport=nba'
# HTTP/1.1 402 Payment Required
# WWW-Authenticate: Payment ... (the challenge: price, methods, expiry)
# 2. Pay the challenge with a method your agent supports, for example a card token
npx @stripe/link-cli mpp pay '<url>'
# 3. Repeat the same request with the credential and a stable idempotency key
curl -i 'https://deepchampai.com/api/agent/v1/ranked-picks?sport=nba' \
-H 'Authorization: Payment <credential>' \
-H 'Idempotency-Key: 6f1c1a52-0a0e-4f6e-9a77-5f0f5d1c9d11'
# HTTP/1.1 200 OK (billing.status = charged, Payment-Receipt header)
Rails and their status
- Card, by Shared Payment Token Coming soon
npx @stripe/link-cli mpp pay <url>
Machine Payments Protocol (MPP). US businesses, all states. - Stablecoin (USDC) over MPP and x402 Coming soon
US customers except New York. Switches on after our payment processor completes its stablecoin access review. - stripe pay, zero fee (enterprise) Coming soon
stripe pay @deepchampai --dry-run
Enterprise settles at a 5% discount on this rail. - Invoice (enterprise) Coming soon
From $500 per month. - Stripe Projects Coming soon
stripe projects add deepchamp/edge-api
Listing in progress. - API key Coming soon
Never put a key in client-side code, a public repository or a prompt.
No payment rail is live yet. The free tools never ask for payment.
Payment minimums set what can be paid per call: a card payment needs at least $0.50 and a stablecoin payment at least one cent. Calls priced below that, such as the calculators at half a cent, are prepaid-only: fund a balance and use an API key. The 402 response says which methods can pay the call in front of you.
Idempotency
Send an Idempotency-Key header (up to 120 characters) on every paid call. A repeat with the same key and the same request returns the stored response with billing.status of replayed and does not charge again. The same key with a different request is 409 idempotency_conflict. A payment receipt buys exactly one successful call; a receipt whose call failed can be reused.
When you are charged
You are charged only when billing.status is charged. You are never charged for a client or server error, a rate limit, a paused line, a provider fault, a timeout, a refused or filtered answer, or a replay. Every error body says billable: false. If a charge ever lands for a call that failed, it is refunded.
We only ever receive payments. DeepChamp never sends money. Card payments settle to our Stripe balance; stablecoin is converted to dollars by Stripe; every paid call has a receipt and a ledger entry.
Tools
One row per tool, from the catalog the MCP server, the OpenAPI document and the agent card also read. A tool is live only when its product line is on. The live price book is deepchampai.com/api/agent/v1/pricing and always wins over this table.
| Tool | Route | Price | Status |
|---|---|---|---|
get_daily_slate Games for a sport and Eastern date with start times, status, and plain-language rest and schedule context. | GET /slate/today | Free, no signup | Live |
get_matchup_context Schedule context for one game: each team's last result, rest, and next game. Facts and our computed context only. | GET /matchup/{sport}/{date}/{slug} | Free, no signup | Live |
request_capability Tell us what you need that is missing: a category, sport, market, format and urgency, with an optional short plain-text note. Enumerated fields only. Free, never charged, no signup. | POST /request-capability | Free, no signup | Live |
rate_response Say whether a response was useful, with a reason code, tied to its request id. No free text. Free, never charged, no signup. | POST /rate-response | Free, no signup | Live |
get_edge_score Our edge score, probability and confidence tier for one pick or game market. | GET /edge-score | $0.010 per call | Coming soon |
get_ranked_picks Ranked signals for a sport and day with edge score, probability, tier, rationale and factors. | GET /ranked-picks | $0.030 per call | Coming soon |
get_matchup_brief Our written research brief for one game, built from our signals. | GET /briefs/matchup | $0.050 per call | Coming soon |
get_prop_brief Our written research brief for one player prop signal. | GET /briefs/prop | $0.050 per call | Coming soon |
get_research_card A compact research card for one pick. | GET /research-card | $0.020 per call | Coming soon |
get_ranked_news News ranked, deduped and scored by us, with attribution and link. | GET /news | $0.020 per call | Coming soon |
get_game_news Ranked stories linked to one game. | GET /news/by-game | $0.010 per call | Coming soon |
search_news Search our ranked story index. | GET /news/search | $0.020 per call | Coming soon |
get_daily_intel Our daily digest with changed-since cursors. | GET /intel/daily | $0.020 per call | Coming soon |
get_injury_lineup_intel Injury and lineup items in our words. | GET /intel/injuries-lineups | $0.020 per call | Coming soon |
get_live_game_intel Derived live flags and what changed between polls. | GET /live/intel | $0.020 per call | Coming soon |
get_market_signals Derived gap buckets and movement direction. No prices. | GET /markets/signals | $0.030 per call | Coming soon |
evaluate_market Arithmetic on your own price plus our probability: fair value, edge, expected value, Kelly. | POST /evaluate-market | $0.015 per call | Coming soon |
get_signal_archive Our issued signals by day, as issued. | GET /archive/signals | $0.010 per page | Coming soon |
get_news_archive Our ranked stories by day, as issued. | GET /archive/news | $0.010 per page | Coming soon |
ask_jev A natural-language research question in; an answer and structured evidence cards out. | POST /ask | from $0.040, up to $0.10 | Coming soon |
subscribe Signed webhook or event stream for new ranked news, live flags and market signals. | POST /subscriptions | $0.005 per event | Coming soon |
fair_value No-margin fair probability from prices you supply, proportional or power method. Prices as american, decimal, probability or cents. | POST /tools/fair-value | $0.005 per call | Coming soon |
best_price The best of the quotes you supply per outcome. Arithmetic only. | POST /tools/best-price | $0.005 per call | Coming soon |
kelly_math Kelly sizing arithmetic on your price and probability. Enterprise keys of accounts that attested a human decides before any stake only; others get 403 human_attestation_required, never charged. | POST /tools/kelly-math | $0.005 per call | Coming soon |
hedge_calculator Plain arithmetic on your stake and prices. Enterprise keys of accounts that attested a human decides before any stake only; others get 403 human_attestation_required, never charged. | POST /tools/hedge | $0.005 per call | Coming soon |
jev_rank Orders your candidate list by our edge score and confidence where we have a signal; unmatched candidates follow. | POST /tools/jev-rank | $0.020 per call | Coming soon |
match_event Maps free text plus a date to our game ids with a confidence. The text is never stored. | GET /match-event | $0.005 per call | Coming soon |
ev_scan Batch edge and expected value over selections whose prices you supply. Stake sizing appears only for accounts that attested a human decides before any stake. | POST /tools/ev-scan | $0.025 per call | Coming soon |
list_subscriptions Your webhook subscriptions. Needs an enterprise key; free. | GET /subscriptions | Free, no signup | Coming soon |
get_usage Today's requests, spend, remaining cap and prepaid balance for your account. Needs an enterprise key; free. | GET /usage | Free, no signup | Coming soon |
get_evaluation Calibration and closing-line value of our own signals. Status is unproven until 500 graded signals exist, and it reports calibration only, with no performance claims. Free, no signup. | GET /evaluation | Free, no signup | Coming soon |
send_feedback Tell us whether a response was useful. Free, no signup; nothing personal is stored. | POST /feedback | Free, no signup | Coming soon |
calc_kelly Sizing fraction for your price and your probability, capped at 5 percent of bankroll. Enterprise keys of accounts that attested a human decides before any stake only. | POST /calc/kelly | $0.005 per call | Coming soon |
calc_fair_value No-margin fair probability from one or two of your own prices. | POST /calc/fair-value | $0.005 per call | Coming soon |
calc_hedge The stake on the other side that equalizes the result, from your own prices. Enterprise keys of accounts that attested a human decides before any stake only. | POST /calc/hedge | $0.005 per call | Coming soon |
calc_parlay Combined price, and combined probability if you supply yours, for two to twenty legs. | POST /calc/parlay | $0.005 per call | Coming soon |
calc_best_price Rank up to 50 prices you supply for the same outcome by payout. | POST /calc/best-price | $0.005 per call | Coming soon |
calc_ev_scan Expected value per unit for up to 50 price and probability pairs you supply. | POST /calc/ev-scan | $0.005 per call | Coming soon |
Routes are relative to https://deepchampai.com/api/agent/v1. Free tools also have these routes: GET /slate/{date}, GET /matchup/{sport}/{date}/{slug}, GET /pricing, GET /catalog and GET /health.
Signal verification
Every ranked signal carries signal_id, content_hash, model_version and issued_at. The signal_id is stable for identical content. The issued_at time is when we first issued exactly that content. The content_hash is a hash of the immutable fields of the signal, so you can check that the copy you hold is the copy we issued.
Signals are appended to a hash-chained ledger. Ask the verify endpoint whether the hash you hold matches: it returns the issue time, the model version, the chain position and a matches flag. Verification opens with the picks line. The ledger exists for the people who receive signals and for our own evaluation. It records issue times and content, never outcomes.
How to evaluate DeepChamp shows how to use these fields to measure the intelligence yourself.
Errors
Errors use one shape and are never billed or cached:
error body
{
"error": {
"code": "rate_limited",
"message": "The free tier allows 20 requests a minute and 300 a day per client. Retry in 43 seconds.",
"request_id": "req_0000000000sample0000",
"billable": false,
"retry_after_seconds": 43
}
}
A 429 or 503 may carry a Retry-After header. Back off, then retry; use the same Idempotency-Key for a paid retry.
| HTTP | code | Meaning |
|---|---|---|
| 400 | invalid_request | A parameter is missing, unknown or out of range. The message names the field. |
| 401 | invalid_api_key | The key is missing, malformed or revoked. |
| 402 | payment_required | The call is paid. The response carries the payment challenge and the price; pay it and repeat the request. |
| 402 | insufficient_funds | The prepaid balance cannot cover the call. Top up and retry. |
| 403 | key_disabled | The key was disabled. |
| 403 | account_suspended | The account was suspended. |
| 403 | banned | Access was withdrawn after repeated failures or abuse. |
| 403 | scope_forbidden | The key is not allowed to call this tool. |
| 404 | not_found | The route or the item does not exist, or the line is not open yet. |
| 404 | outside_free_window | A free read outside yesterday, today and tomorrow in US Eastern time. |
| 409 | idempotency_conflict | The same Idempotency-Key was used with a different request. |
| 409 | request_in_progress | An identical request is still running. Wait and retry with the same key. |
| 409 | receipt_already_used | A payment receipt buys one successful call. Pay again for a different request. |
| 409 | replay_unavailable | The response is never stored (evaluate_market). Not charged; resend with a new key to recompute. |
| 413 | request_too_large | The request body is over the size cap. |
| 429 | rate_limited | Too many requests. Wait the number of seconds in Retry-After. |
| 429 | concurrency_limited | Too many calls in flight for this key. |
| 429 | daily_cap_exceeded | The daily call or spend cap was reached. |
| 429 | spend_cap_exceeded | A spend cap on the key, account or wallet was reached. |
| 429 | session_cap_exceeded | The per-session cap was reached (ask_jev). |
| 503 | line_disabled | The product line is not open or was paused. Not charged. |
| 503 | paid_lane_disabled | Paid access is not open yet. |
| 503 | kill_switch | Billable calls are paused. Free reads stay up. |
| 503 | provider_unavailable | An upstream provider is unavailable. Not charged. |
| 503 | lane_budget_exhausted | The line reached its daily budget. Not charged. |
| 503 | service_unavailable | A temporary fault. Retry with backoff. |
| 504 | timeout | The call timed out on our side. Not charged. |
Limits
Free tools: 20 requests a minute and 300 a day per IP address, cached for 5 minutes, for today minus 1 to today plus 1 (US Eastern), one sport per call and at most 30 games. Sports: nba, nfl, mlb, nhl, cfb, cbb, wnba.
Paid callers get higher limits by tier. These are beta defaults. Per-key overrides exist and the numbers may change; the response headers and error bodies always state the limit that applies.
| Tier | Requests a minute | In flight | Daily spend cap |
|---|---|---|---|
| Free (web) | 20 | 2 | none (free tools only) |
| Pay per call | 60 | 2 | $5 |
| Developer | 120 | 4 | $25 |
| Partner | 300 | 6 | $250 |
Using many keys, addresses or accounts to get around a limit breaks the Acceptable Use Policy. There is no service level in the beta.
Versioning and status
The API path is versioned (/api/agent/v1). Adding fields and tools is not a breaking change; build clients that ignore fields they do not know. We give 30 days' notice of a breaking change to a paid tool unless a law, a data provider or security requires faster action. The model version is in meta.model_version on every response.
Status: deepchampai.com/api/agent/v1/health returns liveness and which lines are on, with no upstream calls.
Compliance
Research and information, not betting advice. No outcomes are guaranteed. Adults 21+ only, where legal. Every response carries a compliance object. When your product shows our output, or something built from it, to a person, show the notice and the helpline in readable text, say that it is AI-generated, and say it is for adults 21 and over. Show it at the start of each session and with every response that presents a ranked signal, a probability or an edge score.
compliance object
{
"age_gate": 21,
"notice": "Research and information, not betting advice. No outcomes are guaranteed. Adults 21+ only, where legal. AI-generated analysis can be wrong; use your own judgment.",
"helpline": "1-800-MY-RESET",
"helpline_url": "https://www.1800myreset.org",
"ai_generated": true,
"terms_url": "https://deepchampai.com/terms/api",
"privacy_url": "https://deepchampai.com/privacy"
}
A person makes every betting decision. Automated wagering with our output is not allowed. If someone shows signs of distress about gambling, show the helpline and do not use an output to encourage more betting. Problem gambling help: call or text 1-800-MY-RESET, or chat at 1800myreset.org.
Changelog
2026-10-31: Charts and pictures for Claude Code and Codex
The free slate and matchup answers now carry a terminal chart, a picture link and, for Claude Code and Codex, an inline image the model can see. Both coding harnesses hand images to the model rather than to you in a terminal, so the server asks the model to paste the chart into its reply, and the link opens the picture in your browser. Pass visual=none for the plain data.
2026-10-30: Beta opens: free daily slate and matchup context
The free daily slate and matchup context are live over REST and MCP with no signup. OpenAPI 3.1, the MCP server card, the A2A agent card, agents.md and the deepchamp-edge skill are published. The catalog of paid lines is listed as coming soon. The Beta API Terms and the Acceptable Use Policy are published. The waitlist and the pricing survey are open.