{
  "api_version": "v1",
  "generated_at": "2026-11-01T08:59:15.195Z",
  "self": "https://calloutiq.pages.dev/api/v1",
  "attribution": {
    "name": "CalloutIQ",
    "url": "https://calloutiq.com",
    "license": {
      "name": "CC BY 4.0",
      "url": "https://creativecommons.org/licenses/by/4.0/",
      "covers": "CalloutIQ's compilation of this record. NOT the underlying third-party material it cites — sanctioning bodies' trademarks, and the source publishers' own articles and images at source_url, remain theirs.",
      "requires": "Credit CalloutIQ, link back, and keep the source_url on any row you republish."
    },
    "policy": "https://calloutiq.com/sources",
    "report_an_error": "https://calloutiq.com/report",
    "notice": "CalloutIQ is an independent, fan-made project and is NOT an official source. It is not affiliated with, authorized by, or endorsed by the IFBB Professional League, the IFBB (International Fitness and Bodybuilding Federation), the NPC, or Olympia LLC. All data here is compiled by fans from publicly available third-party sources, may be incomplete or contain errors, and carries no official standing. Only the sanctioning bodies — the IFBB Pro League and the NPC — publish official professional results, standings, and qualification status; always verify with them. “IFBB”, “IFBB Professional League”, “NPC”, “Olympia” and “Mr. Olympia” are trademarks of their respective owners, used here for identification purposes only.",
    "cite": "CalloutIQ, \"https://calloutiq.pages.dev/api/v1\", accessed 2026-11-01. Licensed CC BY 4.0."
  },
  "data": {
    "name": "CalloutIQ API",
    "version": "v1",
    "description": "Read-only access to CalloutIQ's IFBB Pro League and NPC amateur contest record: shows, placings, judging scores off official cards, and Olympia qualification standings. Every result row carries the URL it was transcribed from.",
    "docs": "https://calloutiq.com/api",
    "license": {
      "name": "CC BY 4.0",
      "url": "https://creativecommons.org/licenses/by/4.0/",
      "covers": "CalloutIQ's compilation of this record. NOT the underlying third-party material it cites — sanctioning bodies' trademarks, and the source publishers' own articles and images at source_url, remain theirs.",
      "requires": "Credit CalloutIQ, link back, and keep the source_url on any row you republish."
    },
    "current_season": 2027,
    "endpoints": [
      {
        "path": "https://calloutiq.com/api/v1/divisions",
        "returns": "The twelve divisions CalloutIQ covers, each with its qualification rule type.",
        "params": {}
      },
      {
        "path": "https://calloutiq.com/api/v1/contests",
        "returns": "The show calendar and archive, newest first.",
        "params": {
          "division": "Division slug. See /divisions.",
          "tier": "pro | amateur | all. Default all.",
          "year": "Four-digit year.",
          "from": "ISO date (YYYY-MM-DD); shows starting on or after.",
          "to": "ISO date; shows starting on or before.",
          "limit": "1-200. Default 50.",
          "offset": "Rows to skip."
        }
      },
      {
        "path": "https://calloutiq.com/api/v1/contests/{slug}",
        "returns": "One show: the announced field, then every division with its placings, judging scores and per-row source links. A merged-away slug 301s to the surviving show.",
        "params": {}
      },
      {
        "path": "https://calloutiq.com/api/v1/athletes/{slug}",
        "returns": "One competitor: their full result history with sources, and their qualification standing per season. A merged-away slug 301s to the surviving athlete.",
        "params": {}
      },
      {
        "path": "https://calloutiq.com/api/v1/standings/{division}",
        "returns": "A division's Olympia qualification board for a season, with that season's own published rule.",
        "params": {
          "season": "Four-digit year. Defaults to the season whose window is open now.",
          "limit": "1-200. Default 50.",
          "offset": "Rows to skip."
        }
      }
    ],
    "conventions": {
      "nulls": "A null is an absence, never a zero. scores.total null means the card's TOTAL cell was blank -- some divisions' card templates print no total, and deriving one from the prejudging score has twice invented data here. placement null means no placing was awarded; read non_placed_status and disqualified for which reason.",
      "field_size": "field_size.verified false means nobody has confirmed how many competitors actually took the stage. results_on_file may therefore be fewer than the real field. It does not mean the field was empty.",
      "official": "Nothing CalloutIQ publishes is official. The only official record is the sanctioning body's own, which is what source_url and official_urls point at. Please attribute accordingly.",
      "qualified": "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 any given row is; see /how-qualification-works.",
      "tiers": "level is 'pro' or 'amateur' and is inferred from nothing else. Any aggregate across a division or a date window must filter on it deliberately. An amateur show is NPC or an NPC Worldwide national federation, named in sanctioning_body, and awards no Olympia qualification points.",
      "amateur_scope": "Amateur coverage is open class only. Masters, Novice and Teen brackets are deliberately out of scope, so a class count here will be lower than the federation's own.",
      "pro_card": "pro_card_earned is a stored fact, never derived from a placing. One amateur show can award several pro cards in one division, one per weight class.",
      "weight_classes": "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. They are not interchangeable.",
      "names": "name is what the athlete competes under and is what the site renders. full_name is the fullest spelling on file; it is not a legal name. Match on slug, which is stable across spelling changes.",
      "slugs": "Slugs are stable. When two records turn out to be one, the losing slug is kept as a redirect rather than deleted, so a citation keeps resolving. Follow 301s.",
      "dates": "date_precision is 'day' unless it says otherwise. 'year' means the show is known to have happened that year and the exact date is not on file -- do not present start_date as a specific day in that case."
    },
    "usage": {
      "auth": "None. Public, read-only, CORS open to any origin.",
      "methods": "GET, HEAD, OPTIONS.",
      "paging": "limit (max 200) and offset. Responses carry meta.has_more and a meta.next link; there is no total count.",
      "caching": "Responses are cacheable for 60s by a client and 300s at a shared cache. Please honour them rather than polling.",
      "errors": "Non-2xx responses carry { error: { code, message, status } }. Branch on code, not on message text.",
      "corrections": "Found something wrong? https://calloutiq.com/report -- corrections are the point.",
      "attribution": "CC BY 4.0. Credit CalloutIQ, link back to the page or endpoint you took it from, and keep source_url on any row you republish -- that link is what makes the row checkable, and it credits the publisher who did the original reporting."
    }
  }
}
