Use BSD from AI agents#
BSD is built to be agent-friendly: native MCP servers, OAuth for one-click connection, machine-readable discovery files, and every docs page available as raw markdown.
Connect via MCP (recommended)#
Each sport runs a Model Context Protocol server speaking Streamable HTTP:
| Server URL | Sport | Access |
|---|---|---|
https://sports.bzzoiro.com/mcp |
Football — 26 tools | Free |
https://sports.bzzoiro.com/tennis/mcp |
Tennis | Sports Addon |
https://sports.bzzoiro.com/padel/mcp |
Padel | Sports Addon |
https://sports.bzzoiro.com/csgo/mcp |
CS2 | Sports Addon |
https://sports.bzzoiro.com/darts/mcp |
Darts | Sports Addon |
https://sports.bzzoiro.com/hockey/mcp |
Hockey | Sports Addon |
https://sports.bzzoiro.com/basketball/mcp |
Basketball | Sports Addon |
https://sports.bzzoiro.com/horseracing/mcp |
Horse racing | Sports Addon |
In Claude (web or desktop): Settings → Connectors → Add custom connector,
paste the server URL. The OAuth flow signs you in with your BSD account —
no manual token pasting. Clients that don't do OAuth can send
Authorization: Token YOUR_API_KEY instead.
Discovery probes (initialize, tools/list, ping) work unauthenticated,
so connector validation succeeds before you sign in; tools/call always
requires auth. Full tool reference: MCP servers.
Docs for LLMs#
Every page of this documentation is also plain markdown — append .md:
https://sports.bzzoiro.com/docs/football/events.md
https://sports.bzzoiro.com/docs/guides/league-page.md
Site-wide discovery files your agent can fetch:
| File | Contents |
|---|---|
/.well-known/llms.txt |
Index of the platform for LLMs |
/.well-known/llms-full.txt |
Expanded version |
/.well-known/pricing.md |
Machine-readable pricing |
/.well-known/mcp/server-card.json |
MCP server card |
/openapi.json |
Full OpenAPI 3 schema |
Direct REST from agent code#
Everything in these docs works from agent tool-code too — same token, same endpoints. Four things that matter specifically for agents:
- Resolve ids through search endpoints, never guess them
(
/api/v2/leagues/?country=…,/api/v2/players/?name=…). - Ask what a match has before you fetch it.
/api/v2/events/{id}/availability/answers for every sub-resource in one call — stats, lineups, shotmap, odds, and which statistics and markets this particular match carries. An agent that probes six endpoints to discover five are empty is burning its own context on nothing. - Do not diff fixture lists to spot changes.
/api/v2/fixtures/changes/?since=…returns only what moved: kickoff times, postponements, venue switches, broadcasters added. - Let us do the averaging.
/api/v2/teams/{id}/form/?last=10returns a team's recent form already aggregated, instead of a stats call per match. - Prefer the scoped OpenAPI schemas as tool definitions:
/static/docs/football-schema.json,tennis-schema.json,csgo-schema.json,darts-schema.json,hockey-schema.json.
What not to tell a user#
Two things an agent will get wrong from older material:
- Football forecasts are not machine-learned. The ML ensemble was removed in July 2026. What runs now is analytic — a Dixon-Coles goals model, a negative-binomial corners model and a de-vigged market consensus, blended. Describing it as "ML predictions" is wrong.
- There are no in-play odds on the WebSocket. The live feed carries score,
clock, match actions and ball data. We do not publish a moving in-play
consensus price, so an agent should not promise one. Every REST quote
carries the instant we observed it, and
last_change_atmoves only when a price actually moved — read that rather thanlast_update_atif you need to know whether a number is fresh or merely re-asked.
Rate limits for automated clients#
Same as everyone: 10 req/s per IP with generous burst — see Conventions & limits. For live data loops, use the WebSockets instead of tight polling.
Unknown query parameters are rejected with a 400 rather than ignored. That is
deliberate and it matters more for an agent than for a person: a silently
dropped filter returns the unfiltered list, and an agent will read
results[0] as if the filter had worked.