AllTrails Hiking Scraper at a glance
AllTrails Hiking Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes kind, id, trail, link and slug, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Web data
- Pricing
- $2.00 per 1,000 results (Free plan), from $1.20 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 38 options
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.
What AllTrails Hiking Scraper can do
- Full trail rows. Collects trail identity, location, difficulty, ratings, distance, elevation, route type, activities, and features in one dataset row.
- Flexible scope. Supports regional browsing, tag-specific grids, pasted grid links, and pasted trail links.
- GPS tracks. Reads the site's served GPS track as an encoded polyline with a point count when detail mode provides it.
- Optional depth. Adds descriptions, alerts, highlights, review samples, weather, and popularity when detail reading is on, and community photos independently, on by default.
- Consistent filters. Applies difficulty, rating, review-count, activity, route-type, length, elevation, and feature filters consistently in both collection modes.
- Resume and monitoring. Supports resume for interrupted runs and incremental labels for recurring monitoring.
Choose what to collect
These inputs let you configure AllTrails Hiking Scraper - Trails, Stats & Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Choose whether to browse a region and its optional tag grids, or read the grid and trail links you provide. |
regionPathstring | Used only in Browse a region mode. Type a place or region keyword such as California, Yosemite, or British Columbia. The actor searches AllTrails for the best geographic match, uses that region as the collection scope, then adds any Trail tag grids you select. My own links mode is separate: use it when you already have specific grid or trail links. |
tagsarray | Only read when mode = browse a region. Each tag adds its own regional grid, such as backpacking, waterfall, forest, or dog-friendly. An unavailable tag fails clearly instead of silently broadening the search. |
latitudenumber | Center latitude, -90 to 90. Use with Longitude and Search radius. |
longitudenumber | Center longitude, -180 to 180. |
searchRadiusnumber | Radius around the center point, 1 to 500 miles. Used only with Latitude and Longitude. |
customBottomLatnumber | South edge of a bounding box. All four box fields are required together; the box wins over the center point. |
Show 31 more inputs
| Input | What it controls |
|---|---|
customBottomLngnumber | West edge of the bounding box. |
customTopLatnumber | North edge of the bounding box. |
customTopLngnumber | East edge of the bounding box. |
urlsarray | Used in urls mode. Paste region-grid links, tag-grid links, or trail-page links. Grid links are walked; each trail link produces one trail record. Query strings such as ?page=2?sort=newest or ?ref=share are ignored (a grid always reads its first ten popular trails); the same trail pasted twice is returned once. Left untouched, the field scrapes this example set. |
followSubGridsboolean | Only read when mode = my own links. Follow extra tag, city, and park grids discovered from pasted grid pages. The item cap and grid-page guard still apply. |
fetchDetailsboolean | Open each trail page for descriptions, exact statistics, elevation data, attributes, conditions, alerts, rating breakdowns, counts, and recent reviews served by the page. A detail charge applies to successfully saved detail rows. |
fetchPhotosboolean | Fetch up to Max photos per trail, including image links, captions, likes, GPS location, and photographer credit. Photo failures keep the trail record and do not fail the run. |
maxPhotosinteger | Maximum number of community photos to keep for each trail when enabled. Range: 1 to 120. |
storeTracksInKVboolean | When the site serves a GPS track, save it in addition to the dataset row under a readable key such as track__us-california__vernal-falls.json. The value contains the encoded polyline and point count. Storage is charged only after a successful write. |
difficultyarray | Keep only trails labelled easy, moderate, hard, or strenuous. Applied to records collected in either mode. A pasted trail link without a difficulty label is excluded when this filter is set. Expert is accepted as a synonym of strenuous. |
minRatingnumber | Keep only trails whose average rating meets or exceeds this value. Range: 0 to 5. Applied in either mode. |
minReviewsinteger | Keep only trails with at least this many reviews. Applied in either mode. |
activityFilterarray | Keep trails tagged with at least one selected activity. Applied in either mode. |
routeTypeFilterarray | Keep trails whose route type matches one of the selected values. Applied in either mode. |
lengthMinnumber | Keep trails at least this long. Applied in either mode. |
lengthMaxnumber | Keep trails no longer than this. Applied in either mode. |
elevationGainMinnumber | Keep trails with at least this elevation gain. Applied in either mode. |
elevationGainMaxnumber | Keep trails with no more than this elevation gain. Applied in either mode. |
featuresFilterarray | Keep trails containing every selected feature label. Use the labels returned by AllTrails, such as waterfall, views, forest, or dogs-leash. Applied in either mode. |
visitorUsageFilterarray | Keep only trails with this crowd level on the site's 1-4 usage scale: light (1-2), moderate (3), heavy (4). Needs a listing that carries the level; applied in either mode. |
maxItemsinteger | Maximum trail records across the whole run. Set 0 for no item cap; the configured grids and page guard still bound the walk. |
maxPagesinteger | Safety guard for the number of grid pages read in one run. Set 0 to read until the selected scope ends. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue an interrupted collection. Trail IDs already returned there are skipped. Leave empty for a new collection; do not combine with recurring updates. |
incrementalModeboolean | Remember this collection scope for scheduled monitoring. The first run labels rows NEW; later runs return NEW, UPDATED, and REAPPEARED rows by default. A trail counts as UPDATED when its name, difficulty, length, elevation, route, location, features, description, alerts or season changed; community counters (ratings, review and photo counts, completions, popularity), the average rating, recent reviews, the cover image and per-run fields (scrape time, source, position, weather, photos) are excluded. Leave off for a one-time collection. |
stateKeystring | Optional name for this recurring campaign. Leave empty to derive a stable key from the collection scope. Use a separate name for separate monitoring campaigns. |
emitUnchangedboolean | In recurring updates, also return trails with no detected changes, labelled UNCHANGED. These rows are returned and billed. |
emitExpiredboolean | In recurring updates, return trails absent from a complete scan, labelled EXPIRED. Capped, blocked, or resumed runs do not infer that a trail is gone. These rows are returned and billed. |
ignoreFieldsForChangesarray | Optional extra field names to leave out of change detection, on top of the built-in exclusions. A dotted name such as parent.child reaches inside an object or list of objects. Ignored fields stay in every returned row; they only stop deciding UPDATED and appearing in changedFields. Dotted names do not reach inside description, overview or alerts, which are compared as a whole. |
mcpConnectorsarray | Optional list of authorized connector IDs. The actor sends concise summaries after the scrape; the complete record remains in the Apify dataset. Leave empty to skip. |
notionParentPageUrlstring | URL or ID of the Notion page under which summary pages are created. Required only when a Notion connector is selected. |
maxNotifyListingsinteger | Maximum trail summaries written to each selected connector. Does not affect the dataset row count. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
recordTypeKindidIdnameTrailurlLinkslugSlugdifficultyDifficultydifficultyGradeDifficulty graderatingRatingratingCountRatingsreviewTextCountText reviewslengthMetersLength (m)lengthMilesLength (mi)Show 57 more fields
elevationGainMetersElevation gain (m)elevationMaxMetersMax elevation (m)durationMinutesDuration (min)routeTypeRoute typeactivitiesActivitiesfeaturesFeaturesareaNamePark / areaareaSlugArea slugcityNameCitystateNameState / regioncountryNameCountrylatLatitudelngLongituderouteGeometryRoute (encoded polyline)routePointsTrack pointsimageUrlImageoverviewOverviewdescriptionDescriptionalertsAlertshighlightsHighlightsratingsBreakdownStar histogramreviewCountReview countphotoCountPhoto countcompletedCountCompletionsseasonStartSeason startseasonEndSeason endreviewsReviewsphotosPhotossurfaceTypesSurface typesweatherWeatherpopularityPopularityreviewsFetchedReviews (collected)sourceTypeSource kindsourceUrlSource linkpositionPositionscrapedAtScraped atchangeTypeChangechangedFieldsChanged fieldsfirstSeenAtFirst seenlastSeenAtLast seentrailUrlTrail URLavgRatingAverage ratingnumReviewsNumber of reviewslatitudeLatitudelongitudeLongitudeelevationGainFtElevation gain (ft)profilePhotoUrlProfile photodogFriendlyDog friendlykidFriendlyKid friendlyisClosedClosedvisitorUsageVisitor usage (1-4)reviews.ratingRatingreviews.dateDatereviews.authorAuthorreviews.activityActivityreviews.difficultyDifficultyreviews.textReviewExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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,
"lng": -106.7,
"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"
}Ways to use this data
- 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.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does AllTrails Hiking Scraper return?
The documented output for AllTrails Hiking Scraper includes kind, id, trail, link, slug, difficulty, difficulty grade and rating. Availability of each field depends on the source page and the selected mode.
How much does AllTrails Hiking Scraper cost?
It costs $2.00 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Which dataset views and review limits exist?
The dataset has four views: Results, Trail detail, Reviews and Changes. The detail page serves the five most recent reviews per trail, so reviews holds at most five entries. A grid page holds ten trails, so each link or tag reads its ten most popular trails; maxPages is capped at 200 grid pages per run.
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, or a point or box search matched more than 1,000 trails, 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 skips gone-record detection entirely, so no trail is marked EXPIRED on its account; re-run it once the page reads again.
Why does fetchDetails not seem to change a pasted trail link?
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.
