AllTrails Scraper
AllTrails Trail Data Scraper
Scrapes trail data from AllTrails by keyword or location. Returns trail name, difficulty, distance, elevation gain, GPS coordinates, ratings, review counts, photos and full descriptions as structured JSON.
AllTrails Scraper Features
- Search by keyword, by location, or both
- Returns 18 fields per trail, including latitude and longitude
- Extracts difficulty, distance, elevation gain and route type as separate fields
- Captures rating and review count for popularity ranking
- Clears DataDome bot protection with a real browser over residential proxy
- Caps output with
maxItems, so a test run costs what a test run should
What can you do with AllTrails data?
- Outdoor and travel apps — Seed a trail database with real distances, elevation profiles and coordinates instead of licensing one.
- Tourism boards — Rank the trails in a region by rating and review volume to see what actually draws visitors.
- Gear retailers — Match product recommendations to trail difficulty and terrain in a given area.
- Researchers — Study recreation demand by region, using review counts as a proxy for foot traffic.
- Route planners — Pull GPS start points in bulk to build a map layer.
How AllTrails Scraper Works
- You supply a keyword, a location, or both.
- The scraper opens AllTrails search in a real browser routed through a residential proxy — enough to satisfy DataDome, which turns away plain HTTP clients.
- It walks the result set, opening each trail page and extracting the field set below.
- Records stream to the dataset as they are parsed, and the run stops at
maxItems.
Input
{
"keyword": "yosemite",
"location": "California, US",
"maxItems": 50
}
| Field | Type | Default | Description |
|---|---|---|---|
keyword |
string | yosemite |
Search term, e.g. grand canyon, waterfall |
location |
string | — | Location filter, e.g. California, US, Rocky Mountain National Park |
maxItems |
integer | 10 |
Maximum trail records to return |
Leave location empty to search by keyword alone. Supply both to narrow a common keyword to one region.
AllTrails Scraper Output Fields
{
"trail_id": "yosemite-national-park-mist-trail",
"trail_url": "https://www.alltrails.com/trail/us/california/mist-trail",
"name": "Mist Trail to Vernal and Nevada Falls",
"difficulty": "hard",
"distance_km": "10.9",
"elevation_gain_m": "652",
"route_type": "out and back",
"rating": "4.8",
"num_reviews": "12480",
"latitude": "37.7325",
"longitude": "-119.5583",
"city": "Yosemite Valley",
"region": "California",
"country": "United States",
"tags": "hiking,waterfall,views",
"photo_url": "https://images.alltrails.com/photo.jpg"
}
| Field | Type | Description |
|---|---|---|
trail_id |
string | AllTrails trail ID (slug from the URL) |
trail_url |
string | Full URL of the trail page |
name |
string | Trail name |
difficulty |
string | Difficulty level — easy, moderate, hard |
distance_km |
string | Trail distance in kilometres |
elevation_gain_m |
string | Elevation gain in metres |
route_type |
string | Loop, out and back, or point to point |
rating |
string | Average user rating, 0–5 |
num_reviews |
string | Number of user reviews |
description |
string | Full trail description text |
latitude |
string | Trail start latitude |
longitude |
string | Trail start longitude |
city |
string | Nearest city |
region |
string | State or region |
country |
string | Country |
tags |
string | Activity tags, comma-separated (hiking, biking, running) |
photo_url |
string | URL of the primary trail photo |
scraped_at |
string | ISO 8601 timestamp of extraction |
FAQ
Does the AllTrails Scraper need an AllTrails account?
No. It reads public trail pages. No login, no API key.
How does it get past AllTrails' bot protection?
AllTrails runs DataDome, which rejects ordinary HTTP requests. The scraper uses a real browser over a residential proxy, which is what the site expects to see. You do not configure any of it.
Can I get GPS tracks or full route geometry?
Not currently. You get the trail's start coordinates, distance, elevation gain and route type. Full GPX geometry is not part of the output.
Why are numeric fields returned as strings?
They come back as the page presents them, without a lossy cast. Parse them to numbers in your own pipeline, where you control the rounding.
How many trails can I pull in one run?
Set maxItems to whatever you need. Keep it low while you are testing the query — you pay per record, so a 10-record trial costs a tenth of a 100-record one.
Need More Features?
Missing a field or a search mode? Open an issue on the actor and it gets looked at.
Why Use AllTrails Scraper?
- Coordinates on every record — Latitude and longitude come standard, so trail data drops into a map layer without a geocoding pass.
- The anti-bot problem is already solved — DataDome turns away plain HTTP clients. This handles it without you touching a proxy setting.
- Pay per trail — No subscription, no minimum. A one-off regional survey costs what those records cost and then stops.