AllTrails Hiking Scraper icon

AllTrails Hiking Scraper

Scrape AllTrails, the world's largest hiking platform: trails with difficulty, length, elevation gain, route type, ratings, review counts, dog and kid…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

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.

Supported input fields
InputWhat it controls
modestring · requiredChoose whether to browse a region and its optional tag grids, or read the grid and trail links you provide.

Choices: search, urls

regionPathstringUsed 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.
tagsarrayOnly 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.
latitudenumberCenter latitude, -90 to 90. Use with Longitude and Search radius.
longitudenumberCenter longitude, -180 to 180.
searchRadiusnumberRadius around the center point, 1 to 500 miles. Used only with Latitude and Longitude.
customBottomLatnumberSouth edge of a bounding box. All four box fields are required together; the box wins over the center point.
Show 31 more inputs
More input fields
InputWhat it controls
customBottomLngnumberWest edge of the bounding box.
customTopLatnumberNorth edge of the bounding box.
customTopLngnumberEast edge of the bounding box.
urlsarrayUsed 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.
followSubGridsbooleanOnly 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.
fetchDetailsbooleanOpen 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.
fetchPhotosbooleanFetch 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.
maxPhotosintegerMaximum number of community photos to keep for each trail when enabled. Range: 1 to 120.
storeTracksInKVbooleanWhen 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.
difficultyarrayKeep 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.
minRatingnumberKeep only trails whose average rating meets or exceeds this value. Range: 0 to 5. Applied in either mode.
minReviewsintegerKeep only trails with at least this many reviews. Applied in either mode.
activityFilterarrayKeep trails tagged with at least one selected activity. Applied in either mode.
routeTypeFilterarrayKeep trails whose route type matches one of the selected values. Applied in either mode.
lengthMinnumberKeep trails at least this long. Applied in either mode.
lengthMaxnumberKeep trails no longer than this. Applied in either mode.
elevationGainMinnumberKeep trails with at least this elevation gain. Applied in either mode.
elevationGainMaxnumberKeep trails with no more than this elevation gain. Applied in either mode.
featuresFilterarrayKeep trails containing every selected feature label. Use the labels returned by AllTrails, such as waterfall, views, forest, or dogs-leash. Applied in either mode.
visitorUsageFilterarrayKeep 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.
maxItemsintegerMaximum trail records across the whole run. Set 0 for no item cap; the configured grids and page guard still bound the walk.
maxPagesintegerSafety guard for the number of grid pages read in one run. Set 0 to read until the selected scope ends.
resumeFromRunIdstringPaste 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.
incrementalModebooleanRemember 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.
stateKeystringOptional name for this recurring campaign. Leave empty to derive a stable key from the collection scope. Use a separate name for separate monitoring campaigns.
emitUnchangedbooleanIn recurring updates, also return trails with no detected changes, labelled UNCHANGED. These rows are returned and billed.
emitExpiredbooleanIn 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.
ignoreFieldsForChangesarrayOptional 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.
mcpConnectorsarrayOptional 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.
notionParentPageUrlstringURL or ID of the Notion page under which summary pages are created. Required only when a Notion connector is selected.
maxNotifyListingsintegerMaximum 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.

recordTypeKind
idId
nameTrail
urlLink
slugSlug
difficultyDifficulty
difficultyGradeDifficulty grade
ratingRating
ratingCountRatings
reviewTextCountText reviews
lengthMetersLength (m)
lengthMilesLength (mi)
Show 57 more fields
elevationGainMetersElevation gain (m)
elevationMaxMetersMax elevation (m)
durationMinutesDuration (min)
routeTypeRoute type
activitiesActivities
featuresFeatures
areaNamePark / area
areaSlugArea slug
cityNameCity
stateNameState / region
countryNameCountry
latLatitude
lngLongitude
routeGeometryRoute (encoded polyline)
routePointsTrack points
imageUrlImage
overviewOverview
descriptionDescription
alertsAlerts
highlightsHighlights
ratingsBreakdownStar histogram
reviewCountReview count
photoCountPhoto count
completedCountCompletions
seasonStartSeason start
seasonEndSeason end
reviewsReviews
photosPhotos
surfaceTypesSurface types
weatherWeather
popularityPopularity
reviewsFetchedReviews (collected)
sourceTypeSource kind
sourceUrlSource link
positionPosition
scrapedAtScraped at
changeTypeChange
changedFieldsChanged fields
firstSeenAtFirst seen
lastSeenAtLast seen
trailUrlTrail URL
avgRatingAverage rating
numReviewsNumber of reviews
latitudeLatitude
longitudeLongitude
elevationGainFtElevation gain (ft)
profilePhotoUrlProfile photo
dogFriendlyDog friendly
kidFriendlyKid friendly
isClosedClosed
visitorUsageVisitor usage (1-4)
reviews.ratingRating
reviews.dateDate
reviews.authorAuthor
reviews.activityActivity
reviews.difficultyDifficulty
reviews.textReview

Example 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.

Ready to collect with AllTrails Hiking Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.