AllTrails Hiking Scraper - Trails, Stats & Reviews avatar

AllTrails Hiking Scraper - Trails, Stats & Reviews

Pricing

from $1.20 / 1,000 trail records

Go to Apify Store
AllTrails Hiking Scraper - Trails, Stats & Reviews

AllTrails Hiking Scraper - Trails, Stats & Reviews

Scrape AllTrails, the world's largest hiking platform: trails with difficulty, length, elevation gain, route type, ratings, review counts, dog and kid friendly attributes, trail conditions and hiker reviews. Browse any region or paste links, with recurring change monitoring.

Pricing

from $1.20 / 1,000 trail records

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Categories

Share

AllTrails Hiking Scraper

Collect public AllTrails trail records from regional grids, tag grids, or trail links. Listing mode returns core trail identity, location, ratings, difficulty, distance, elevation, and route information when the site serves it. Detail mode adds descriptions, conditions, attributes, rating breakdowns, counts, and recent reviews. The actor also supports photos, readable GPS-track files, resume, incremental monitoring, and optional connector delivery.

Why This Scraper?

  • Collects trail identity, location, difficulty, ratings, distance, elevation, route type, activities, and features in one dataset row.
  • Supports regional browsing, tag-specific grids, pasted grid links, and pasted trail links.
  • Reads the site's served GPS track as an encoded polyline with a point count when detail mode provides it.
  • Adds descriptions, alerts, highlights, review samples, weather, and popularity when detail reading is on, and community photos independently, on by default.
  • Applies difficulty, rating, review-count, activity, route-type, length, elevation, and feature filters consistently in both collection modes.
  • Supports resume for interrupted runs and incremental labels for recurring monitoring.
  • Keeps the complete dataset in Apify and can optionally export a concise summary through an authorized connector.

Use Cases

  • Outdoor trip planning apps and route pickers: pull trail difficulty, distance, elevation gain, route type and the GPS track to power a map-based planner.
  • Land manager and park communications teams: watch a park's or region's trails for new alerts, closures and highlights posted on the detail page.
  • Outdoor content and gear marketing teams: build region guides from ratings, review counts, popularity and season windows without opening every trail page by hand.
  • Trail recommendation and outdoor data science: assemble a dataset of length, elevation, difficulty, activities and features across a region for a recommendation model.
  • Hiking clubs and community monitoring: schedule recurring updates to catch newly listed trails, rating changes or condition changes for a watched region.

Data You Get

Sample shape: values are illustrative placeholders, not from a live trail.

FieldExample
recordTypetrail
id00000001
nameSample Lake Loop Trail
urlhttps://www.alltrails.com/explore/trail/sample-lake-loop-trail
slugtrail/us/colorado/sample-lake-loop-trail
difficulty / difficultyGrademoderate / 3
rating / ratingCount4.8 / 1200
lengthMeters / lengthMiles8500 / 5.3
elevationGainMeters / elevationMaxMeters420 / 3120
durationMinutes / routeType180 / Loop
activities / features["hiking"] / ["lake"]
areaName / stateNameSample National Park / Colorado
cityName / countryNameSample Valley / United States
lat / lng39.0000 / -106.7000
routeGeometry / routePointsencoded-polyline-placeholder / 000
overview / descriptionSample overview / Sample description text
alerts / highlights[] / []
reviews / photos[] / []
surfaceTypes / weather["dirt"] / {"summary":"Sample forecast"}
sourceUrl / scrapedAthttps://www.alltrails.com/us/colorado / 2026-01-01T00:00:00.000Z

Listing fields are populated whenever the source supplies them. Detail fields depend on fetchDetails for a region or tag grid row; a row built from a pasted trail link always reads its own detail page, so its detail fields are populated either way. The detail page serves the five most recent reviews, five per trail, in the reviews field. routeGeometry and routePoints are present only when the site serves a GPS track. photos depends on fetchPhotos and the photo service response, independently of fetchDetails.

How to Use

Browse one geographic region with the default listing fields. Type a place or region keyword such as California, Yosemite, or British Columbia into regionPath. The actor resolves the best geographic match on AllTrails, then builds the region and tag-grid URLs. By contrast, My own links mode accepts a list of separate grid or trail links.

{
"mode": "search",
"regionPath": "Colorado",
"maxItems": 20
}

Browse with tags, filters, and detail enrichment:

{
"mode": "search",
"regionPath": "Colorado",
"tags": ["backpacking", "waterfall"],
"difficulty": ["moderate", "hard"],
"minRating": 4.5,
"fetchDetails": true,
"maxItems": 50
}

Read pasted grid and trail links:

{
"mode": "urls",
"urls": [
"https://www.alltrails.com/us/california",
"https://www.alltrails.com/explore/trail/us/colorado/sample-lake-loop-trail"
],
"fetchDetails": true,
"maxItems": 10
}

A pasted trail link still produces a URL-backed row if the detail page is temporarily refused; detail-only fields remain empty and no detail surcharge is charged. A genuine missing trail page is omitted.

A pasted trail link has no listing card to fall back on, so its record always comes from reading that trail's own detail page, whether or not fetchDetails is on; the detail surcharge applies whenever that read succeeds and the row is returned. fetchDetails instead decides whether region and tag grid rows, in either mode, are enriched with the same detail fields.

Run recurring monitoring with readable track files:

{
"mode": "urls",
"urls": ["https://www.alltrails.com/us/colorado"],
"fetchDetails": true,
"storeTracksInKV": true,
"incrementalMode": true,
"stateKey": "sample-colorado-monitor"
}

Use fetchDetails: true when you need descriptions, reviews, detail attributes, or GPS tracks for region and tag grid rows. The dataset row is always the primary output. storeTracksInKV adds a readable key such as track__us-colorado__sample-lake-loop-trail.json for systems that prefer one track object per trail.

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/alltrails-hiking-scraper").call(run_input={"mode": "search", "regionPath": "Colorado", "maxItems": 20})
for trail in client.dataset(run["defaultDatasetId"]).iterate_items():
print(trail["name"], trail["difficulty"], trail["rating"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/alltrails-hiking-scraper').call({ mode: 'search', regionPath: 'Colorado', maxItems: 20 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Send results into your apps (MCP connectors)

Add authorized connector IDs to mcpConnectors to send concise summaries after the scrape. Set notionParentPageUrl when using Notion. Connector delivery is optional and never changes the complete Apify dataset.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchChoose search to browse a region or urls to read the links in urls.
regionPathstringCaliforniaPlace or region keyword resolved to a geographic AllTrails scope in search mode. Existing paths and full AllTrails URLs remain accepted for compatibility.
tagsstring[]["backpacking"]Optional tag grids to add after the region grid. An unavailable tag produces a clear validation failure.
urlsstring[]sample region URLGrid or trail links used by urls mode. Trail links produce one enriched trail record.
followSubGridsbooleanfalseIn urls mode, follow additional grid links discovered from pasted grid pages, which is read in that mode only.
fetchDetailsbooleanfalseOpen each region or tag grid trail's detail page for descriptions, exact attributes, conditions, reviews, and any GPS track served by the page. A detail charge applies to successfully saved detail rows. A pasted trail link always reads its own detail page regardless of this setting, since it has no grid card to fall back on.
fetchPhotosbooleantrueFetch community photos from the separate photo service, independently of fetchDetails. A failure keeps the trail row and does not fail the run.
maxPhotosinteger10Maximum photos per trail when enabled. Range: 1 to 50.
storeTracksInKVbooleanfalseSave each served GPS track as a readable per-trail KV record such as track__us-colorado__sample-lake-loop-trail.json, in addition to the dataset row. A storage charge applies only after the KV write succeeds.
difficultystring[]emptyKeep only trails labelled easy, moderate, hard, or strenuous. Applied to records collected in either mode.
minRatingnumber0Keep trails whose rating is at least this value. Range: 0 to 5.
minReviewsinteger0Keep trails with at least this many reviews.
activityFilterstring[]emptyKeep trails tagged with at least one activity such as hiking, backpacking, or mountain-biking.
routeTypeFilterstring[]emptyKeep loop, out-and-back, or point-to-point routes.
lengthMinnumberemptyKeep trails at least this long, in metres.
lengthMaxnumberemptyKeep trails no longer than this, in metres.
elevationGainMinnumberemptyKeep trails with at least this elevation gain, in metres.
elevationGainMaxnumberemptyKeep trails with no more than this elevation gain, in metres.
featuresFilterstring[]emptyKeep trails containing every selected feature label, such as waterfall, views, forest, or dogs-leash.
maxItemsinteger20Maximum trail rows across the run. 0 means no item cap.
maxPagesinteger0Maximum grid pages as a runaway guard. 0 reads until the configured scope ends.
resumeFromRunIdstringemptyContinue one interrupted run or dataset. Previously returned trail IDs are skipped. Do not combine this with incremental monitoring.
incrementalModebooleanfalseRemember the same scope for recurring runs. The first run returns NEW; later runs return changes by default.
stateKeystringemptyOptional name for the incremental campaign. Empty derives a stable key from the collection scope.
emitUnchangedbooleanfalseIn incremental mode, also return unchanged trails labelled UNCHANGED. These rows are returned and billed.
emitExpiredbooleanfalseIn incremental mode, return trails absent from a complete scan as EXPIRED. Capped or interrupted scans do not infer expiration.
mcpConnectorsstring[]emptyOptional authorized connector IDs for concise result summaries after the scrape.
notionParentPageUrlstringemptyNotion destination page when a Notion connector is selected. Ignored by other connectors.
maxNotifyListingsinteger50Maximum rows sent to each connector. Does not change the dataset.
proxyConfigurationobjectApify connectionConnection settings for source requests. Keep the prefilled setting unless you have an authorized alternative.

Resume and incremental monitoring are separate features. Resume continues one interrupted collection. Incremental mode compares recurring runs of the same scope and adds changeType, changedFields, firstSeenAt, and lastSeenAt to returned rows.

Output Example

Sample shape: values are illustrative placeholders, not from a live trail.

{
"recordType": "trail",
"id": "00000001",
"name": "Sample Lake Loop Trail",
"url": "https://www.alltrails.com/explore/trail/sample-lake-loop-trail",
"slug": "trail/us/colorado/sample-lake-loop-trail",
"difficulty": "moderate",
"difficultyGrade": 3,
"rating": 4.8,
"ratingCount": 1200,
"reviewTextCount": 300,
"lengthMeters": 8500,
"lengthMiles": 5.3,
"elevationGainMeters": 420,
"elevationMaxMeters": 3120,
"durationMinutes": 180,
"routeType": "Loop",
"activities": ["hiking"],
"features": ["lake", "views"],
"areaName": "Sample National Park",
"areaSlug": "parks/us/colorado/sample-national-park",
"cityName": "Sample Valley",
"stateName": "Colorado",
"countryName": "United States",
"lat": 39.0000,
"lng": -106.7000,
"routeGeometry": "encoded-polyline-placeholder",
"routePoints": 0,
"imageUrl": "https://images.alltrails.com/000000000-placeholder",
"overview": "Sample trail overview.",
"description": "Sample detail description text appears when fetchDetails is enabled.",
"alerts": [],
"highlights": [],
"ratingsBreakdown": {"1": 10, "2": 20, "3": 80, "4": 300, "5": 790},
"reviewCount": 300,
"photoCount": 40,
"completedCount": 8000,
"seasonStart": "2026-05-01",
"seasonEnd": "2026-10-01",
"reviews": [],
"photos": [],
"surfaceTypes": ["dirt"],
"weather": {"summary": "Sample forecast"},
"popularity": 0.75,
"reviewsFetched": 5,
"sourceType": "grid",
"sourceUrl": "https://www.alltrails.com/us/colorado",
"position": 1,
"scrapedAt": "2026-01-01T00:00:00.000Z",
"changeType": "NEW",
"changedFields": [],
"firstSeenAt": "2026-01-01T00:00:00.000Z",
"lastSeenAt": "2026-01-01T00:00:00.000Z"
}

Plan Requirement

An Apify account and a connection configuration that can access the selected public source are required. The actor uses the connection settings supplied in the input and returns source-derived rows only when the source serves the requested data.

FAQ

How much does it cost?

You pay a start fee per run and a fee per trail record returned, plus a detail enrichment charge only for returned trails whose detail page was read, and a GPS track storage charge only when a track is written to the key value store. The Pricing tab on the actor page shows the current rates. Use Maximum trail records to cap the cost of any run.

This actor collects only publicly available trail listings and detail pages. You are responsible for how you use the data: follow AllTrails' terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Trail statistics such as length and elevation are generally facts, but descriptions, photos and reviews may carry their own rights.

Can I get only new or changed trails on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Recurring updates. Each run then returns NEW, UPDATED and REAPPEARED trails by default, and unchanged trails are not billed unless you turn on Return unchanged trails. With Return expired trails on, a trail is marked EXPIRED only after a complete scan no longer lists it in the grids you read; a capped or resumed run, or one where a grid page was refused or left unread, skips gone-record detection. One exception to know about: if a pasted trail link's detail page is refused on a later run, that run returns a URL-backed row for the link and marks the trail's earlier record EXPIRED, so re-run it once the page reads again rather than acting on that single result.

A pasted trail link has no listing card to fall back on, so its record always comes from reading that trail's own detail page, description, reviews and GPS track included, and the detail surcharge applies whenever that read succeeds and the row is returned, whether or not fetchDetails is on. The toggle instead controls whether region and tag grid rows, in either mode, are enriched with those same detail fields.

Why did my run fail instead of returning an empty dataset?

If the site refuses every grid page, the run stops with a clear message so "no trails match" is never confused with "nothing could be read". Run it again in a few minutes. If only some grids could be read, the run still succeeds and reports the trails it did collect. A refused pasted trail link does not fail the run: it returns a URL-backed row with detail fields empty and no detail surcharge.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push trail summaries into Notion, Linear, Airtable or another authorized app.

๐Ÿ”— More scrapers you might like

Pair this actor with these related scrapers from the same team:

๐Ÿงฉ Flightradar24
Live aircraft positions by map area (callsign, lat/lng, altitude, speed, vertical speed...
๐Ÿงฉ KKday Scraper
Scrape KKday travel activities by keyword, city or URL. Every row carries prices...
๐Ÿจ Klook Scraper
Scrape Klook activities, tours, attractions and travel experiences from search pages or...
๐Ÿ›’ Depop Scraper
From $1/1K. Scrape Depop search results, listings, shops, and reviews to JSON, CSV, or...
๐Ÿ›’ The Warehouse NZ Scraper
Scrape The Warehouse New Zealand search results, category pages, and direct product URLs...
๐Ÿจ Rover Pet Care Scraper
Scrape Rover.com pet-care providers: sitter search by city, rates per stay type, ratings...

๐Ÿ‘‰ Browse all abotapi scrapers

๐Ÿ’ฌ Support & custom scrapers

  • ๐Ÿž Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • ๐Ÿ› ๏ธ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
  • โญ Enjoying it? A quick review on the actor page helps other users find it.