Elevation & Terrain Data Scraper - Altitude by Coordinates avatar

Elevation & Terrain Data Scraper - Altitude by Coordinates

Pricing

from $0.50 / 1,000 results

Go to Apify Store
Elevation & Terrain Data Scraper - Altitude by Coordinates

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

ninhothedev

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

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 fake 0.
  • ~$0.50 per 1,000 elevation points on the Apify platform.

What you get

One dataset item per coordinate:

FieldDescription
latitudeLatitude of the sampled point (decimal degrees)
longitudeLongitude of the sampled point (decimal degrees)
elevation_mElevation above sea level in metres. Negative for ocean depth. null when the dataset has no data there
elevation_ftSame value in feet, rounded to 0.1. null when elevation_m is null
datasetThe DEM that answered (e.g. srtm30m)
in_coveragetrue when the dataset actually returned a height for this coordinate
point_indexPosition of the point in the request order โ€” keeps grids and profiles ordered
path_distance_kmCumulative great-circle distance from the first point. Path mode only, otherwise null
sourceAlways opentopodata
scraped_atUTC 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)

DatasetResolutionCoverage
srtm30m~30 mGlobal land, 60ยฐNโ€“56ยฐS (NASA SRTM GL1) โ€” default
srtm90m~90 mGlobal land, 60ยฐNโ€“56ยฐS (NASA SRTM GL3)
aster30m~30 mGlobal land, 83ยฐNโ€“83ยฐS (ASTER GDEM v3)
mapzen~30 mGlobal land and ocean, near-global composite (Mapzen Terrarium)
gebco2020~450 mGlobal land and ocean bathymetry (GEBCO 2020)
etopo1~1.8 kmGlobal land and ocean, coarse (NOAA ETOPO1)
eudem25m25 mEurope (EEA member states) only (Copernicus EU-DEM v1.1)
ned10m~10 mContinental USA, Hawaii, parts of Alaska only (USGS NED / 3DEP)
bkg200m200 mGermany only (BKG DGM200)
nzdem8m8 mNew Zealand only (LINZ)
emod2018variesEuropean 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-* or Retry-After headers, 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.



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.