33 Ultras, By the Numbers — And You Can Fly Every One of Them

By RunPact TeamAugust 19, 2026

Here is the question every ultrarunner asks before a race they have never run: what does this thing actually do to people?

Not the elevation profile. Not the marketing copy about "the toughest 100 miles in the world." What actually happens out there — when the median finisher reaches the aid station, which climb the field bleeds time on, how many people scrape in against the final cutoff, and where a finish time like yours would land in the pack.

That data exists. It sits in timing-provider results tables as thousands of rows of per-runner checkpoint splits, and almost nobody turns it into something a runner can read. So we did.

RunPact race pages are now live for 33 courses, built from 28,350 real finisher results across nine countries.

What's On a Race Page

Every page is built from the same thing: per-runner checkpoint times for every finisher we have, joined against the official cutoff chart where the organiser publishes one, and against the course GPX where they don't.

Where your hours would land. The full finish-time distribution, one bar per hour. Not an average — the actual shape of the field. At Western States, 2,034 finishers across seven editions produce a median of 26:48, a fast-10% line at 19:29, and a visible pile-up against the 30-hour wall. That pile-up is the real story of the race, and a "median finish time" alone hides it completely.

When the field actually arrives. An aid station almanac: official cutoff, median finisher's real arrival, and the share of finishers who cleared that station with less than an hour in hand. At Western States, 47.6% of finishers came through Duncan Canyon — at 39 km, barely a quarter into the race — with under an hour of buffer. At Hardrock, only 7% are tight at the Kamm Traverse, and 10.5% at the finish. Those two numbers describe two completely different kinds of pressure, and neither is knowable from a cutoff chart on its own.

Where the course breaks runners. Segment-by-segment field pace, normalised against the runner's own average for that race. The number is a multiplier: 1.00× is "the field ran this segment at its own average pace," and anything above is where the course took time back.

Race Worst segment Field pace
Tromsø Skyrace Hamperokken, km 26 2.38×
Endurance Trail des Templiers Massabiau, km 46 1.81×
Western States Green Gate, km 128 1.56×
Hardrock 100 Kroger, km 109 1.48×
SaintéLyon Le Camp – Saint-Genou, km 45 1.18×

Hamperokken at 2.38× is a segment where the field moves at less than half its own race pace. SaintéLyon's worst segment is 1.18×. Those two races are both trail ultras and they are not the same sport.

Different race every year. Where we have multiple editions, the year-by-year table: starters, finishers, finish rate, winning time, median. Seven editions of Western States. Four of Sätila Trail's Lygnernslingan. The spread between a cool year and a hot one is not subtle, and it's the honest answer to "what finish rate should I expect."

Every Page Flies

The 3D course flythrough has been RunPact's most distinctive feature since we built it, and until last week it was reachable from seven of our race pages. The other eighteen had a "Train for this race" button and nothing else — we were hiding the one thing nobody else has behind a field somebody had to remember to fill in.

That's fixed at the structural level. Every published race is required to have a course GPX, which means every published race can have a flythrough, which means it should never have been a decision. The page builder now derives the flythrough from the race's own course file automatically.

33 of 33 race pages now let you fly the course before you enter it. Adding a new race carries its flythrough with it, for free.

The flythrough itself got substantially better this summer too — a race-aware HUD with a real race clock driven by predicted per-segment pace, so the time of day advances the way it actually would (slow climbs burn daylight), smooth sunrise and sunset instead of lighting that pops between hour bands, a real night sky, and tag-driven building shapes so a village looks like a village. That's its own post.

Nine Countries, Three Distance Bands

The index groups by distance, because that's how runners actually shop for a race:

  • 100 miles and beyond (6 races): Bieg Siedem Szczytów 240 km, Kullamannen Ultra 100 Miles, Sto Mil Trail 170 km, 100 Miles Berlin, Western States 100, Hardrock 100
  • 100K to 150K (8 races): Łemkowyna Ultra-Trail 150, Super Trail 130 km, Lavaredo Ultra Trail 120K, EcoTrail Paris 120K, Bieg K-B-L 110 km, Kullamannen Sprint Ultra 100 km, Penyagolosa Trails CSP, Łemkowyna Ultra-Trail 100
  • Under 100K (19 races): Endurance Trail des Templiers, Rzeźnik Ultra, Lygnernslingan 85 km, EcoTrail Paris 80K, SaintéLyon, Łemkowyna Ultra-Trail 70, Bieg Ultra Trail 70 km, Intégrale des Causses, Grand Tour des Cerces, Penyagolosa Trails MIM, Tromsø Skyrace, Kullamannen Seventh Seal, SuperTrail du Barlatay 50K, Łemko Maraton 48, Boffi Fifty, EcoTrail Paris 45K, Marathon des Cerces, Złoty Maraton 45 km, SaintExpress

The top band starts at 155 km rather than a true 100 miles on purpose, so Hardrock sits with the hundred-milers it's raced alongside instead of being stranded a mile short of its own category.

Poland is the deepest at eleven courses, then France with ten, Sweden with four, the USA and Spain with two each, and one apiece in Germany, Italy, Switzerland and Norway.

Some of these are races everyone knows. Some are races that have never had their results turned into anything readable — Bieg Siedem Szczytów, 240 km and 7,670 m of climbing through Lądek-Zdrój, finished by 102 of the 289 who started. A 35% finish rate. That number deserves to be somewhere a runner can find it.

What the Numbers Do and Don't Say

Two things we say on every page, because they matter:

Everything split-derived is finishers-only. Runners who missed a cutoff or dropped are not in the checkpoint data — timing systems record what happened, and a DNF stops generating splits. So the buffer statistics understate cutoff pressure: the people who got squeezed hardest are the ones missing from the sample. Where we have official starter counts we use them for finish rates, and we label the difference.

Where the data is thin, we say so instead of filling it in. Livetrail's published "age" is a category floor, not a real age, so we suppress median age for every livetrail-sourced race rather than reporting a plausible-looking wrong number. Templiers publishes gender on 7 rows out of 1,282, so its female-share stat doesn't render at all. B4SPORT grids carry no age data whatsoever. Each page has a methodology block at the bottom listing where its numbers came from and what they exclude.

That restraint is the whole point. A page full of confident-looking statistics is easy to generate. A page where every number is one you could verify against the timekeeper is the harder thing, and the only version worth publishing.

Where This Connects

The race pages aren't a standalone microsite. They sit on top of the same corpus that powers the rest of the platform:

  • The race time predictor — a race page pre-loads its own course, so you get a prediction for that specific race without uploading anything.
  • Cutoff calculators cross-link both ways with the race pages that have official cutoff charts.
  • Training plans — "Train for this race" goes straight into plan creation with the course already selected.
  • The ML model trains on the same splits. Every race we ingest for a page makes the finish-time model better, and every model improvement makes the predictions on the pages better.

If Your Race Isn't Here

We're adding them steadily, and the constraint is data rather than effort: we need a published course GPX and per-runner checkpoint splits, and we won't publish a page without both. Nine of the current pages came from courses that were already in the corpus and simply hadn't been published yet.

If you organise a race and want its page built — or you'd like the one we've built taken down — get in touch. We'll always take a page down on request, no argument.

Start here: all 33 races.