API
CalloutIQ’s claim is receipts: itemized points, verification dates, explicit source attribution, real head-to-head and scorecard facts. A claim like that is only worth something if someone else can check it, and “open the page and squint” is not checking. So the record is available as JSON, with the source link and verification state attached to every row.
No key, no signup, no rate limit to apply for. GET, HEAD and OPTIONS, CORS open to any origin. Responses are cacheable for 60 seconds by a client and 300 at a shared cache — please honour that rather than polling. Licensed CC BY 4.0; see Licence below.
Endpoints
Discovery
GET /api/v1
Every endpoint, every parameter, and the conventions below in machine-readable form. Start here.
Try it → https://calloutiq.com/api/v1
Divisions
GET /api/v1/divisions
The twelve divisions CalloutIQ covers, each with its qualification rule type. A standing is only interpretable against the rule — “rank 22” means one thing under a Top 25 cut and another under a Top 20.
Try it → https://calloutiq.com/api/v1/divisions
Contests
GET /api/v1/contests
The show calendar and archive, newest first.
division | Division slug, e.g. classic-physique. |
|---|---|
tier | pro, amateur or all. Default all. |
year | Four-digit year. |
from | ISO date. Shows starting on or after. |
to | ISO date. Shows starting on or before. |
limit | 1–200. Default 50. |
offset | Rows to skip. |
Try it → https://calloutiq.com/api/v1/contests?division=wheelchair&year=2026
One contest
GET /api/v1/contests/{slug}
The announced field, then every division with its placings, judging scores and a source link on every single row. A merged-away slug 301s to the surviving show.
Try it → https://calloutiq.com/api/v1/contests/mr-olympia
One athlete
GET /api/v1/athletes/{slug}
A competitor's whole result history with sources, and their qualification standing per season. Amateur and pro results both appear — read contest.level.
Try it → https://calloutiq.com/api/v1/athletes/samson-dauda
Standings
GET /api/v1/standings/{division}
A division's Olympia qualification board for a season, with that season's own published rule attached.
season | Four-digit year. Defaults to the season whose window is open now. |
|---|---|
limit | 1–200. Default 50. |
offset | Rows to skip. |
Try it → https://calloutiq.com/api/v1/standings/classic-physique
Reading the data
Every item below is a mistake that has been made against this data at least once, several of them by this project’s own code. They are worth two minutes before you build on it.
A null is an absence, never a zero
scores.total being null means the card’s TOTAL cell was blank — some divisions’ card templates print no total at all, and deriving one from the prejudging score has twice invented data on this site. placement null means no placing was awarded; non_placed_status and disqualified say which of several reasons it was.
An unverified field size is not an empty field
field_size.verified: false means nobody has confirmed how many competitors actually took the stage, so results_on_file may be fewer than the real field. It never means the division was empty.
Nothing here is official
CalloutIQ compiles third-party public data. The only official record is the sanctioning body’s own, which is what source_url and official_urls point at. Please don’t present this data as an official result.
“Qualified” is a mirror, not a calculation
qualified mirrors the IFBB Pro League’s published qualified-athletes list where one exists. The points ladder beneath it is CalloutIQ’s own arithmetic on sourced results. qualification_method tells you which of the two a given row is — see how qualification works.
Pro and amateur are one dataset with a flag
level is pro or amateur and is inferred from nothing else. Any aggregate across a division or a date window has to filter on it deliberately — every pro-facing total on this site needed that filter added by hand when the amateur tier landed. Amateur coverage is open class only: Masters, Novice and Teen brackets are out of scope, so a class count here is lower than the federation’s own.
A pro card is a recorded fact
pro_card_earned is never derived from a placing. One amateur show can award several pro cards in one division — one per weight class — and on the rows on file they run from 1st down to 16th.
Class placing and overall placing are different numbers
Where a show ran weight classes inside one division, placement is the placing within the class and overall_placement is the placing across the division. Treating them as one is how a class winner becomes an overall winner who never was.
Match on slug, not on name
name is what the athlete competes under; full_name is the fullest spelling on file and is not a legal name. Slugs are stable, and when two records turn out to be one person the losing slug is kept as a 301 redirect rather than deleted — so a citation keeps resolving. Follow redirects.
A date can be a year
date_precision is day unless it says year, which means the show is known to have happened that year and the exact date isn’t on file. Don’t render such a start_date as a specific day.
Response shape
Every successful response is an envelope. The attribution travels with the data rather than living only on this page, so a consumer who pipes an endpoint into a spreadsheet still holds the notice and a citation string.
{
"api_version": "v1",
"generated_at": "2026-09-20T14:00:00.000Z",
"self": "https://calloutiq.com/api/v1/contests/mr-olympia",
"attribution": { "name": "CalloutIQ", "url": "…", "policy": "…", "notice": "…", "cite": "…" },
"meta": { … },
"data": …
}
Errors carry { "error": { "code", "message", "status" } }. Branch on code, never on the message text. Paging uses limit and offset; responses carry meta.has_more and a meta.next link rather than a total count.
Licence
This data is published under CC BY 4.0. Use it for anything, including commercially. Three things in return:
- Credit CalloutIQ and link back to the page or endpoint you took it from.
- Keep
source_urlon any row you republish. That link is what makes the row checkable rather than merely asserted, and it credits the publisher who did the original reporting. - Don’t present it as an official result or ranking. It isn’t one — the Source & Attribution policy spells out why.
The licence covers CalloutIQ’s compilation: the structure, the reconciliation against the sanctioning bodies’ published lists, the verification states, the head-to-head arithmetic. It cannot and does not cover the underlying third-party material this record cites — the sanctioning bodies’ trademarks, or the source publishers’ own articles and photographs at the other end of a source_url. Those belong to whoever holds them, and redistributing this data carries that limit with it rather than lifting it. Claiming otherwise would be its own small invention, which is not how anything here works.
A citation string is included in every API response, so you don’t have to compose one:
CalloutIQ, "https://calloutiq.com/api/v1/contests/mr-olympia", accessed 2026-09-20. Licensed CC BY 4.0.
If you spot something wrong, report it — corrections are the whole point, and they get made. Building something with it? Get in touch; knowing what people need shapes what gets added next.