Mountain Project APImountainproject.com ↗
Access Mountain Project's climbing route database via API. Search routes and areas, get difficulty ratings, GPS coords, user comments, and filtered route lists.
What is the Mountain Project API?
The Mountain Project API exposes 5 endpoints covering the full climbing route database at mountainproject.com — from broad keyword search to per-route beta. The get_route endpoint returns first ascent info, YDS difficulty, GPS coordinates, and approach directions for any route by numeric ID. get_route_finder lets you filter by star rating, difficulty range, and climb type within a specific area, making it straightforward to query best-rated climbs programmatically.
curl -X GET 'https://api.parse.bot/scraper/d806c1ab-d61a-4e73-a2fd-01f0ad04feae/search?query=Yosemite&types=Route%2CArea&offset=0' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace mountainproject-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
from parse_apis.mountain_project_api import MountainProject, ClimbType
mp = MountainProject()
# Search for climbing areas
for result in mp.searchresults.search(query="Joshua Tree", types="Area"):
print(result.name, result.breadcrumbs, result.rating)
# Get a specific route by ID
route = mp.routes.get(route_id="105924807")
print(route.name, route.difficulty, route.type)
# Read comments on a route
for comment in route.comments.list():
print(comment.user, comment.date, comment.text)
# Get area details and find routes within it
area = mp.areas.get(area_id="105833388")
print(area.name, area.url)
# Use the constructible area to find highly-rated rock routes
yosemite = mp.area(id="105833388")
for r in yosemite.find_routes(climb_type=ClimbType.ROCK, stars="3.8"):
print(r.name, r.url)
Search for routes, areas, users, and other content on Mountain Project using the internal v2 search API. Returns paginated results with metadata including location, rating, and breadcrumbs. Paginates via offset. Each result includes type, category, breadcrumbs for navigation context, and a location array for geo-aware filtering.
| Param | Type | Description |
|---|---|---|
| queryrequired | string | Search keyword (e.g. 'Yosemite', 'El Capitan'). |
| types | string | Comma-separated content types to search. Accepted values include Route, Area, Forum, User, Photo. |
| offset | integer | Result offset for pagination. |
{
"type": "object",
"fields": {
"total": "integer total number of matching results",
"results": "array of search result objects with id, name, type, category, url, description, breadcrumbs, location, rating, difficulty, summary"
},
"sample": {
"data": {
"total": 3962,
"results": [
{
"id": "areas.105833388",
"url": "https://www.mountainproject.com/area/105833388/yosemite-valley",
"name": "Yosemite Valley",
"type": "Area",
"rating": 3.67,
"summary": "1894 Routes",
"category": "Areas",
"location": [
-119.63452,
37.72349
],
"difficulty": null,
"breadcrumbs": "California > Yosemite National Park",
"description": "Yosemite Valley is THE PLACE for many rock climbers."
}
]
},
"status": "success"
}
}About the Mountain Project API
Search and Discovery
The search endpoint accepts a free-text query and an optional types parameter accepting comma-separated values such as Route, Area, User, or Forum. Results return paginated with a total count and per-result fields including breadcrumbs, location, difficulty, rating, and category. Use the offset parameter to walk through large result sets. Route and area IDs surfaced here feed directly into the detail endpoints.
Route and Area Detail
get_route takes a required route_id and returns structured fields: name, type (describing route type and pitch length), difficulty in YDS notation, fa for first ascent attribution, gps coordinates as a string, a prose description, and a location_description covering the approach. get_area works similarly by area_id, returning a list of sub_areas and classic_routes, each with their own id, name, and url — useful for traversing the area hierarchy.
Filtered Route Finding and Comments
get_route_finder queries Mountain Project's Route Finder tool within a given area_id. Filters include stars (minimum average star rating as a decimal string), diff_min and diff_max (numeric code strings bounding the difficulty range), and climb_type accepting boulder or rock. Results are route stubs with id, name, and url. get_route_comments fetches all user-submitted comments and trip beta for a route, returning each entry's user, user_url, text, date, and comment_id, sorted oldest-first.
IDs and Slugs
Most endpoints require a numeric ID (route_id or area_id). The slug parameter accepted by get_route and get_area appears in the URL path but does not change the data returned — only the numeric ID is functionally required. IDs can be obtained from search results or directly from Mountain Project URLs.
The Mountain Project API is a managed, monitored endpoint for mountainproject.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when mountainproject.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official mountainproject.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a trip-planning tool that uses
get_route_finderto surface top-rated climbs within a target area at a specified difficulty range. - Aggregate user beta and conditions reports by pulling
get_route_commentsfor a list of routes before a climbing trip. - Populate a climbing logbook app with route metadata — name, difficulty, GPS, first ascent — via
get_route. - Build an area directory that traverses the
sub_areashierarchy returned byget_areato map all crags within a region. - Feed a recommendation engine with route difficulty, star rating, and type data sourced from
searchandget_route. - Monitor new comments on a watchlist of routes by polling
get_route_commentsand comparingcomment_idvalues. - Cross-reference
classic_routesfromget_areawithget_routedetail to build curated area guidebook content.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Mountain Project have an official developer API?+
What does `get_route_finder` return, and how do the difficulty filters work?+
get_route_finder returns a list of route stubs — id, name, and url — matching the filters you provide. diff_min and diff_max are numeric code strings that correspond to Mountain Project's internal difficulty scale (not raw YDS text). The stars filter sets a minimum average community rating as a decimal, e.g. '3.8'. Set climb_type to boulder or rock to narrow by discipline. All filters are optional except area_id.Does the API return topo images or photo galleries for routes or areas?+
Are tick lists or user ascent logs available?+
How do I get a route or area ID to use with the detail endpoints?+
search endpoint returns an id field on each result object. Alternatively, IDs appear directly in Mountain Project URLs — for example, mountainproject.com/route/105924807/the-nose uses 105924807 as the route ID. The slug parameter in get_route and get_area is optional and does not affect what data is returned.