A summit without ele is a gap in the map: many maps and apps show the height next to the name. This query finds peaks without one, and elevation=1 adds the height of the 90 m elevation model for reference, so you can start with the highest.
Don't copy that value into ele. On summits the model reads tens of metres too low (see peaks with their height). Use it to sort the list, then take the height from your own survey or from a source whose licence allows its use in OpenStreetMap.
The query
[out:json][timeout:60]; node["natural"="peak"][!"ele"](45.8,6.8,46.6,8.5); out;
Run it
Live result from overpass.ch, cached for up to 12 hours. Map data © OpenStreetMap contributors (ODbL). Heights produced using Copernicus WorldDEM™-90 © DLR e.V. 2010-2014 and © Airbus Defence and Space GmbH 2014-2018 provided under COPERNICUS by the European Union and ESA; all rights reserved. Sea depths: GEBCO Compilation Group (2026) GEBCO 2026 Grid.
How it works
[!"ele"]keeps only peaks without aneletag.- The bounding box covers the Valais and the Mont Blanc massif. About 200 peaks there have no height.
- With
elevation=1the table lists them from the highest, so the summits that most deserve anelecome first.
Variations
- Named peaks only: add
["name"]. - Other features that often lack a height:
node["mountain_pass"="yes"][!"ele"]ornwr["tourism"="alpine_hut"][!"ele"].
Run it from your code
The query is unchanged; elevation=1 in the URL adds the heights. Each height uses one lookup from your elevation allowance.
curl 'https://api.overpass.ch/v1/YOUR_API_KEY/interpreter?elevation=1' \
--data-urlencode 'data@query.overpassql'
import requests
query = open("query.overpassql").read()
r = requests.post("https://api.overpass.ch/v1/YOUR_API_KEY/interpreter",
params={"elevation": 1}, data={"data": query}, timeout=120)
r.raise_for_status()
for el in r.json()["elements"]:
height = el.get("elevation") or el.get("center", {}).get("elevation")
print(el.get("tags", {}).get("name"), height)
const res = await fetch("https://api.overpass.ch/v1/YOUR_API_KEY/interpreter?elevation=1", {
method: "POST",
body: new URLSearchParams({ data: query }),
});
if (!res.ok) throw new Error(await res.text());
const { elements } = await res.json();
for (const el of elements) console.log(el.tags?.name, el.elevation ?? el.center?.elevation);
Save the query as query.overpassql. It works the same in Overpass Turbo, QGIS and JOSM.