Working with images#
Every entity in the API has an image at a predictable URL built from the same id the REST API gives you. No token, no extra lookups, aggressive caching. Full type list: Image API reference.
URL patterns#
https://sports.bzzoiro.com/img/<type>/<id>/ football (bare types)
https://sports.bzzoiro.com/img/<sport>/<type>/<id>/ other sports
<!-- Football: badge, league logo, player photo, manager, venue -->
<img src="https://sports.bzzoiro.com/img/team/755/">
<img src="https://sports.bzzoiro.com/img/league/85/">
<img src="https://sports.bzzoiro.com/img/player/12994/">
<!-- Other sports: prefix with the sport slug -->
<img src="https://sports.bzzoiro.com/img/tennis/player/1207/">
<img src="https://sports.bzzoiro.com/img/csgo/team/311/">
<img src="https://sports.bzzoiro.com/img/basketball/team/98/">
The <id> is the same numeric id the REST API returns — team_id,
league_id, player_id and so on.
Modifiers#
| Param | Effect |
|---|---|
?bg=transparent |
Removes the white background from the image edges — for cards and dark UIs |
?sor=true |
Players only: serves a cut-out face-style photo when available, silently falls back to the regular photo otherwise |
?sor=true&bg=transparent |
Both combined |
<img src="https://sports.bzzoiro.com/img/player/12994/?sor=true&bg=transparent">
Because ?sor=true falls back silently, you can use it on every player image
without checking availability first.
Caching and fallbacks — what to expect#
- Images are cached server-side up to 30 days and browser-cached up to a year. Don't build your own image cache; hotlinking is the intended use.
- An id that exists but has no image yet returns 204 No Content (empty body) rather than 404 — render your own placeholder when the image fails to load:
<img src="https://sports.bzzoiro.com/img/team/755/"
onerror="this.src='/static/img/placeholder.svg'">
- A
nullor non-numeric id also returns 204, so templates that interpolate optional ids never break. - First-ever request for an image can take ~1 s (upstream fetch); every request after that is instant from cache.
Sport-scoped types don't collide#
/img/tennis/player/1207/ and /img/player/1207/ are different namespaces —
a tennis id never accidentally serves a football photo. Always use the sport
prefix for non-football entities.