Elevation & Terrain Data Scraper - Altitude by Coordinates
Pricing
from $0.50 / 1,000 results
Elevation & Terrain Data Scraper - Altitude by Coordinates
$0.5/1K ๐ฅ Elevation scraper! Terrain height for any coordinates, grid or route from 11 datasets. No key. JSON, CSV, Excel or API in seconds. Build hiking profiles & GIS pipelines โก
Pricing
from $0.50 / 1,000 results
Rating
0.0
(0)
Developer
ninhothedev
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Elevation & Terrain Data Scraper โ altitude for any coordinates, no API key
Get the terrain elevation (altitude) of any latitude/longitude on Earth โ and the depth of any point in the ocean โ without an API key, without registration and without a Google Elevation API bill. Feed it a list of coordinates, a bounding box, or a route, and get back clean elevation data in metres and feet.
Powered by the free public OpenTopoData instance, which serves eleven verified digital elevation models (DEMs), from global 30 m SRTM coverage down to 8 m New Zealand LiDAR and European sea-floor bathymetry.
- No API key, no account, no OAuth. Just coordinates in, elevation out.
- Three modes: single points, bounding-box grids, and interpolated route profiles.
- Honest nulls. Outside a dataset's coverage you get
elevation_m: nullโ never a fake0. - ~$0.50 per 1,000 elevation points on the Apify platform.
What you get
One dataset item per coordinate:
| Field | Description |
|---|---|
latitude | Latitude of the sampled point (decimal degrees) |
longitude | Longitude of the sampled point (decimal degrees) |
elevation_m | Elevation above sea level in metres. Negative for ocean depth. null when the dataset has no data there |
elevation_ft | Same value in feet, rounded to 0.1. null when elevation_m is null |
dataset | The DEM that answered (e.g. srtm30m) |
in_coverage | true when the dataset actually returned a height for this coordinate |
point_index | Position of the point in the request order โ keeps grids and profiles ordered |
path_distance_km | Cumulative great-circle distance from the first point. Path mode only, otherwise null |
source | Always opentopodata |
scraped_at | UTC ISO-8601 timestamp of the run |
Sample output
[{"latitude": 47.421,"longitude": 10.9855,"elevation_m": 2937.0,"elevation_ft": 9635.8,"dataset": "srtm30m","in_coverage": true,"point_index": 0,"path_distance_km": null,"source": "opentopodata","scraped_at": "2026-07-28T18:10:03+00:00"},{"latitude": -30.0,"longitude": -40.0,"elevation_m": null,"elevation_ft": null,"dataset": "srtm30m","in_coverage": false,"point_index": 1,"path_distance_km": null,"source": "opentopodata","scraped_at": "2026-07-28T18:10:03+00:00"}]
The second row is the South Atlantic. SRTM is a land elevation model, so it correctly reports null โ not 0. Sea level and "no data" are different things, and this Actor never conflates them. If you need ocean depth, pick a bathymetry dataset such as gebco2020 or mapzen.
Three modes
1. points โ an explicit coordinate list
Give it ["52.5200,13.4050", "47.4210,10.9855"] and it returns one item per pair. Ideal for enriching an existing list of addresses, sensor sites, store locations or GPS fixes.
2. grid โ a bounding box + step
Set bboxSouth, bboxNorth, bboxWest, bboxEast and gridStep (in degrees; 0.01 โ 1.1 km of latitude). The Actor builds the lat/lon grid itself and caps it against maxItems before a single request goes out, so a careless bbox can never turn into a runaway run. Perfect for terrain rasters, viewshed inputs and slope analysis.
3. path โ waypoints interpolated into a profile
Give two or more waypoints in coordinates and a pathSamples count. The Actor resamples the polyline into evenly spaced points by ground distance (haversine, not degrees) and adds a cumulative path_distance_km to every row โ an elevation profile you can plot straight away.
Datasets and their coverage (all verified live)
| Dataset | Resolution | Coverage |
|---|---|---|
srtm30m | ~30 m | Global land, 60ยฐNโ56ยฐS (NASA SRTM GL1) โ default |
srtm90m | ~90 m | Global land, 60ยฐNโ56ยฐS (NASA SRTM GL3) |
aster30m | ~30 m | Global land, 83ยฐNโ83ยฐS (ASTER GDEM v3) |
mapzen | ~30 m | Global land and ocean, near-global composite (Mapzen Terrarium) |
gebco2020 | ~450 m | Global land and ocean bathymetry (GEBCO 2020) |
etopo1 | ~1.8 km | Global land and ocean, coarse (NOAA ETOPO1) |
eudem25m | 25 m | Europe (EEA member states) only (Copernicus EU-DEM v1.1) |
ned10m | ~10 m | Continental USA, Hawaii, parts of Alaska only (USGS NED / 3DEP) |
bkg200m | 200 m | Germany only (BKG DGM200) |
nzdem8m | 8 m | New Zealand only (LINZ) |
emod2018 | varies | European seas only โ bathymetry, negative depths (EMODnet 2018) |
Rule of thumb: use a regional dataset when your points are inside its region (it is far more precise), and a global one otherwise. Querying a regional dataset outside its region returns elevation_m: null with in_coverage: false. That is correct behaviour, not a failure.
Rate limits โ read this before planning a big run
This Actor talks to the free public OpenTopoData instance. Verified live against the running service (x-opentopodata-version: 1.9.0):
- 100 locations per request. Sending 101 returns HTTP 400 with
"Too many locations provided (101), the limit is 100."โ confirmed for both GET and POST. The Actor chunks your coordinates into batches of exactly 100. - About 1 call per second. Three back-to-back calls produced an HTTP 429 on the third. The Actor waits โฅ1.1 s between batches and backs off exponentially on 429.
- 1,000 calls per day, per the operator's published fair-use policy. Note: the public instance exposes no
X-RateLimit-*orRetry-Afterheaders, so the daily counter cannot be read from a response โ you only find out by receiving a 429.
Practically, 1,000 calls ร 100 locations = up to 100,000 elevation points per day on the free public instance. If you hit the quota, the run fails with an explicit rate-limit message rather than silently returning nothing.
Need more? OpenTopoData is open source and self-hostable. Running your own instance removes the 1 call/second and 1,000 calls/day limits entirely (you only pay for your own server). This Actor's request logic is unchanged against a self-hosted instance.
Use cases
- Route & hiking elevation profiles. Path mode turns a GPX-style waypoint list into a plottable profile with cumulative distance and altitude gain.
- Solar and wind siting. Grid mode gives you the terrain raster you need for shading, slope, aspect and wind-exposure modelling across a candidate site.
- Flood risk modelling. Sample elevations across a floodplain, compare heights against river gauge levels, and rank addresses by height above a reference datum.
- GIS and data pipelines. Enrich any table of coordinates โ property listings, cell towers, agricultural plots, delivery stops โ with a height column, with no key management.
Input example
{"mode": "path","coordinates": ["47.4210,10.9855", "47.5000,11.1000"],"dataset": "srtm30m","pathSamples": 100,"maxItems": 500}
Grid example:
{"mode": "grid","bboxSouth": 52.45,"bboxNorth": 52.55,"bboxWest": 13.30,"bboxEast": 13.45,"gridStep": 0.01,"dataset": "eudem25m","maxItems": 500}
Pricing
Pay-per-result: about $0.50 per 1,000 elevation points. A 500-point run costs roughly $0.25. Because up to 100 points ride in a single upstream call, even large grids finish quickly and cheaply.
Related Actors
- Geocoding Scraper โ turn addresses into coordinates, then feed them straight into this Actor.
- Reverse Geocoding Scraper โ turn coordinates back into addresses.
- OpenStreetMap Notes Scraper โ community map notes for any area.
- Airports & Airlines Scraper โ airport, runway and airline reference data.
FAQ
Do I need an API key? No. There is nothing to sign up for.
Why is my elevation null? The chosen dataset has no data at that coordinate โ usually because it is a regional DEM and your point is outside its region, or a land-only DEM and your point is over water. Switch to a global dataset (srtm30m, aster30m) or a bathymetric one (gebco2020, mapzen).
Why not just return 0 for missing data? Because 0 m is a real, meaningful elevation (sea level). Substituting 0 for "unknown" silently corrupts every downstream flood, slope or profile calculation. This Actor keeps them strictly distinct via elevation_m: null and in_coverage: false.
How accurate is it? Depends on the DEM. SRTM 30 m has a vertical accuracy of roughly ยฑ16 m; regional models like ned10m, eudem25m and nzdem8m are considerably better. Cross-checking two datasets for the same point is a cheap accuracy sanity check.
Can I get ocean depth? Yes โ use gebco2020, mapzen or etopo1 globally, or emod2018 for European seas. Depths come back as negative elevation_m.
Data source and licensing. Elevation values come from public DEMs (NASA, USGS, ESA/Copernicus, GEBCO, BKG, LINZ, EMODnet) served via OpenTopoData. Check each dataset's own attribution requirements before redistributing.