The race calendar is public. The spreadsheet isn't.
Anyone selling into mass-participation sport ends up maintaining a race calendar by hand. Photo coverage, timing chips, nutrition, travel, kit — all of it gets planned against the same question: which races are happening, where, and when do they open for business.
Sportograf answers that question better than most, because it is the photo platform behind IRONMAN, HYROX, triathlons, marathons, cycling and open-water events. Its calendar is real and it is current. It is also a website: national page by national page, filtered, scrolled, and gone the moment you close the tab.
The calendar is an API wearing a website
The Sportograf front end is a React app, and every event on screen arrives from a public GraphQL query. Event name, start date, lifecycle state, banner image, location, sub-event count — all of it already structured, already paginated, already JSON. Nobody has to render a browser to read it.
That is the whole trick of this Actor: it asks the same endpoint the site asks, so a run finishes in seconds, on datacenter IPs, with no proxy bill and no headless Chrome.
Each event comes back as one row:
sgId— the stable Sportograf event idname— e.g.IRONMAN 70.3 Melbourne 2026beginsAt— ISO start datestate—online,reminder,closedand so onlocation,eventUrl,imageUrlsubEvents— how many disciplines or distances the event carrieslanguage— which national site the row came from
Three jobs it fits
- Coverage planning. A photography or media team wants every upcoming event in a region with sub-event counts, to size crews before the season fills up.
- Market research. Someone studying participation trends wants the calendar as a dataset, not as a screenshare. Run it weekly and diff.
- State tracking. Events move from
remindertoonlinetoclosed. The date that a race opens for photo sales is a business fact, and it is only visible if you snapshot the list on a schedule.
What it will not do
It reads public event data only. No athlete names, no finisher results, no photo listings, no purchase flows. If you need results per participant, this is the wrong Actor — the calendar is the product here.
Point it at https://www.sportograf.com/en/ or a national page such as /de/, and add ?q=IRONMAN to filter by name. A single https://www.sportograf.com/en/event/{id} URL scrapes just that race, which is handy for checking one event's current state without pulling the whole calendar.
Run it
Run Sportograf Events Scraper on Apify.
- Paste one or more Sportograf URLs (homepage, national page, or a single event).
- Set a maximum event count per URL — the default is 100.
- Export the dataset as JSON, CSV or Excel.
Pricing is pay-per-event: you are charged for events actually returned, not for a run that found nothing. Schedule it daily and you get a calendar that reports its own changes.
The pattern here is not unusual — a public page that hides clean rows behind a web view. We wrote about the same move for product pages and pricing and for cross-country price gaps. A race calendar is just another one of those pages.