Komoot Routes & Tours Extractor avatar

Komoot Routes & Tours Extractor

Pricing

from $1.99 / 1,000 route delivereds

Go to Apify Store
Komoot Routes & Tours Extractor

Komoot Routes & Tours Extractor

Extract public komoot route records: title, sport, distance, ascent, duration, difficulty, rating and canonical URL. HTML only, sitemap discovery, schema-validated output.

Pricing

from $1.99 / 1,000 route delivereds

Rating

0.0

(0)

Developer

Steadfetch

Steadfetch

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 hours ago

Last modified

Categories

Security

Limited permissions

Share

steadfetch/komoot-route-extractor

Extract public komoot route records with Apify pay-per-event pricing and schema-validated output.

Data Source: Komoot

What it does

The Actor reads public komoot route pages (/tour/... and /smarttour/...) and saves one validated dataset item per route:

  • route title, sport, distance in kilometres, ascent in metres and ISO 8601 duration;
  • published difficulty and aggregate rating (no review text, no reviewer data);
  • canonical route URL, route id and page locale.

Routes can be supplied explicitly through urls, or discovered from the locale sitemaps declared in robots.txt. The Actor reads server-rendered HTML only: it never calls /api, /webapi, /account, user sub-pages, or the /embed, /zoom and /is-private variants.

Input

{
"locale": "en",
"maxResults": 3
}
  • locale (default en): sitemap locale, such as en, de-de, es-es or fr-fr. Output text (title and difficulty) is published in that locale.
  • region (optional): case-insensitive substring filter on the route title or URL, e.g. Wales.
  • urls (optional): canonical komoot route URLs. When omitted, routes are discovered from the locale sitemap. Duplicate route ids are fetched once and billed once.
  • maxResults: 1 to 10,000 routes saved to the dataset (default 100).

Example output

Real output for route e1005421987 (English page):

{
"routeId": "e1005421987",
"title": "Margam Country Park to Brombil Reservoir loop via Heol Y Moch",
"url": "https://www.komoot.com/smarttour/e1005421987/margam-country-park-to-brombil-reservoir-loop-via-heol-y-moch",
"sport": "hike",
"distanceKm": 20.2,
"ascentM": 520,
"durationIso": "PT5H51M",
"difficulty": "Hard",
"ratingAvg": 3.8,
"ratingCount": 6,
"locale": "en",
"scrapedAt": "2026-10-22T10:20:00.000Z"
}

The same route on the German page produces distanceKm: 9.05 for a different route, the German difficulty label (the German word for "moderate") and locale: "de-de": JSON-LD property names and decimal separators are localized, so the extractor classifies values by shape and locale rather than by English key names. difficulty is reported exactly as published, in the page locale.

Every item is validated against .actor/dataset_schema.json before it reaches the dataset. Rows without a published distance are not emitted, and a schema violation fails the run.

Pricing

Pay-per-event, with the two synthetic Apify events declared in .actor/pay_per_event.json:

EventCharged whenPrice
apify-actor-startonce per run start (synthetic, charged automatically)0.00005 USD per run (Apify-recommended default)
apify-default-dataset-itemonce per route saved to the dataset (synthetic, charged automatically)0.003 USD per route = 3 USD per 1,000 results

That is 3 USD per 1,000 results, inside the Steadfetch 1-10 USD per 1,000 results band and below the 3.50 USD/1k incumbent komoot Actor on the Store. There is no custom per-item event and no Actor.charge() call: apify-default-dataset-item already bills each result, so a second event would bill users twice. A run that delivers nothing is only charged the start event.

Cost per 1,000 results

Measured locally on 2026-10-22 with the three committed fixtures and Node 24 (no Apify credit):

  • Extraction: 284 ms per page after a warm-up, about 284 s of CPU per 1,000 routes.
  • Politeness delay: 1 s per request, so 1,000 routes need at least ~17 minutes of wall time.
  • At 256 MB, that wall time is 0.071 GB-hour = ~0.014 USD per 1,000 routes at 0.20 USD/GB-hour (compute only). At 512 MB it doubles to ~0.028 USD. Data transfer is not itemised by this local measurement and no Apify platform run has been spent yet.
  • Expected infrastructure cost is therefore in the 0.01-0.03 USD per 1,000 range, well below the 0.10-0.30 USD/1k estimate in the spec. Gross margin at 3.00 USD per 1,000 is above 99%.

When APIFY_TOKEN is available, a single minimal platform run with maxResults: 3 should replace the estimate above with the platform-measured figure.

robots.txt (checked 2026-10-22) allows canonical /tour/... and /smarttour/... pages under User-agent: *; it disallows /api, /webapi, /account, /terms-of-service, /service, /product/buy, /tiles, /static, /plan/tour/, /plan/@, /discover/..., user sub-pages and the embed/zoom/private variants. This Actor:

  • builds only canonical route URLs and declared sitemap files, all checked by assertAllowedUrl();
  • aborts the run if a redirect leaves that allowlist;
  • issues one request at a time with a conservative 1 s delay (robots declares no crawl delay);
  • sends an honest
    User-Agent: steadfetch-komoot-route-extractor/0.1 (+https://apify.com/steadfetch; contact: https://apify.com/steadfetch)
    ;
  • collects no personal data: route metadata and aggregate ratings only.

The full evidence is in docs/legal-gate.md.

FAQ

Does the Actor need a komoot account? No. It reads public HTML pages only and never bypasses logins, paywalls or CAPTCHAs.

How are routes discovered? From the locale sitemaps declared in robots.txt. You can also pass explicit canonical URLs in urls.

Why is the sport a canonical slug but the difficulty localized? sport is normalised to a stable slug (hike, mtb, racebike, ...) so it can be filtered across locales. difficulty is reported exactly as published because komoot's scale labels vary by language; the locale field tells you which language you received.

Why is ascentM sometimes null? Only when the page publishes no elevation figure. The Actor never invents one.

Is the output schema stable? Yes. New fields are added additively and required fields do not change. Every item keeps the common Steadfetch envelope (url, scrapedAt) plus routeId.

Can I request another source? Yes. Open an issue in the Steadfetch Actors repository describing the public page you want extracted.

Maintenance

This Actor is tested daily: automated runs keep the source reachable and the output schema valid. Every push runs lint, typecheck, offline fixture tests, the Steadfetch publish gate and apify-cli validate-schema in CI. Schema changes are announced through repository releases.

Development

npm install
npm test # lint + typecheck + offline fixture tests
npm run publish:check # Steadfetch publish gate
npm run build # tsc build to dist/

Fixtures are real pages saved from komoot on 2026-10-22, gzipped to keep the repository small. Refetch them (1 s delay, no Apify credit, no token) with docs/evidence/fixtures/fetch-fixtures.sh.