Growing Discord community — direct access to the developer, live coverage & picks. Join the Discord Join now →
Matches Leagues Predictions The Edge Money News Stats Coverage
Docs / Guides

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.

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=10 returns 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_at moves only when a price actually moved — read that rather than last_update_at if 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.

View this page as Markdown · Found a mistake? Tell us