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

Get elevation in metres and feet for coordinate lists, grids and route profiles. Preserve missing values and verify point coverage using public OpenTopoData datasets. Export JSON or CSV.

Pricing

from $0.50 / 1,000 results

Rating

0.0

(0)

Developer

ninhothedev

ninhothedev

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

3

Monthly active users

12 days ago

Last modified

Share

What does Elevation & Terrain Data Scraper do?

Get elevation in metres and feet for coordinate lists, bounding-box grids and route profiles. This Actor batches requests to the public OpenTopoData elevation API, verifies the returned coordinates and exports ordered data for GIS enrichment, terrain exploration and profile charts. No upstream API key is required.

Each point retains its index and selected dataset. Source-confirmed missing values remain null, while a failed or mismatched response is reported as an error. A Run coverage report separates successfully answered points from unfinished work.

How to get elevation data

  1. Choose Points, Grid or Path.
  2. Enter WGS84 latitude/longitude pairs, or supply grid bounds. Select a dataset suitable for the area.
  3. Set Max items and Apify's maximum charge per run, then start the Actor.
  4. Inspect Elevation points and Run coverage report. Download JSON, CSV, HTML or Excel, or use the Apify API and integrations.

A small route crossing the international date line:

{
"mode": "path",
"coordinates": ["0,179", "0,-179"],
"dataset": "gebco2020",
"pathSamples": 3,
"maxItems": 3
}

This samples a roughly 222.39 km equatorial route across 180°, including its midpoint. GEBCO supplies ocean depth as negative elevation. It does not take the long route through longitude 0°.

Input and sampling modes

See the Input tab for all options. Coordinates are normalized to six decimal places. Invalid coordinates, an unknown dataset or mode, and non-finite values fail validation instead of silently changing your request.

OptionMeaning
modepoints (default), grid or path.
coordinatesOrdered list of "latitude,longitude" strings for points or path. Points preserve duplicates and order; repeated route waypoints are allowed.
datasetDefault srtm30m; select one of the models below.
maxItemsInteger from 1 to 5,000, default 500. Limits selected output points, including already saved points on resume.
bboxSouth, bboxNorth, bboxWest, bboxEastGrid bounds in valid latitude/longitude ranges. Reversed edges are sorted. A box crossing the date line is not supported; use separate boxes.
gridStepGrid spacing in degrees, default 0.01, minimum 0.000001. This is angular spacing, not a fixed distance in metres.
pathSamplesRequested route samples, 2–5,000, default 50. Reduced to maxItems if needed. With maxItems: 1, only the first waypoint is selected.

Points enriches your explicit list. Grid traverses west to east, then south to north, stopping at the selected-point cap before source requests begin. Path distributes samples evenly by route distance along shortest spherical great-circle legs between waypoints. It does not follow roads or measure distance over terrain. Antipodal waypoints need an intermediate waypoint because there is no unique shortest arc.

Route distances follow the original waypoint polyline, including corners between samples. Distance is a spherical approximation, not an ellipsoidal survey measurement. The equivalent longitude −180° is used for source requests at +180° to avoid an observed dataset-edge gap; output retains the requested coordinate.

Elevation datasets

Availability, coverage, vertical datum and resolution depend on the source model. Finer grid spacing does not improve the underlying elevation model's resolution.

DatasetGeneral scope
srtm30m, srtm90mSRTM land elevations within the mission's latitude coverage.
aster30mASTER land elevations.
mapzenComposite terrain including ocean bathymetry.
gebco2020GEBCO 2020 land and ocean depth grid.
etopo1Coarse global relief.
eudem25mEuropean terrain.
ned10mUS regional elevation coverage.
bkg200mGerman terrain.
nzdem8mNew Zealand terrain.
emod2018European marine bathymetry.

Use the provider's dataset descriptions and attribution links for coverage and reuse requirements. GEBCO data in the example is from the GEBCO 2020 Grid, served by OpenTopoData; no endorsement is implied. Numeric elevation is preserved, including zero and negative depth. An explicit null can mean a location outside model bounds or a NODATA cell, so in_coverage describes the presence of a returned height, not an independently verified geographic coverage boundary.

Output fields

FieldMeaning
point_indexZero-based index in the selected point list. Use it to join output to input order.
latitude, longitudeNormalized requested coordinate, verified against the source response.
elevation_m, elevation_ftSource elevation in metres and its feet conversion, or null.
in_coverageTrue when a numeric source elevation is present. Zero is valid; null is unknown.
datasetVerified source model name.
path_distance_kmDistance along the original spherical waypoint route, or null outside path mode.
source, scraped_atopentopodata and UTC extraction time.

Selected fields from a real local sample; elevation values can change with the source:

{
"point_index": 0,
"latitude": 0.0,
"longitude": 179.0,
"elevation_m": -5412.0,
"elevation_ft": -17755.9,
"dataset": "gebco2020",
"in_coverage": true,
"path_distance_km": 0.0,
"source": "opentopodata"
}

Pricing and budgets

Current base pricing is $0.50 per 1,000 stored points, plus $0.00005 per GB-start event, with at least one start event. At 512 MB, three points and one start cost $0.00155 before applicable discounts. Check the Pricing tab for current rates.

A verified point with elevation_m: null is a stored, billable result. Failed source responses are not converted into billable placeholder rows. A start event can still apply when a run produces no points.

The Actor checks the remaining result budget before each source batch, reduces the batch to the available allowance, and counts only rows accepted by the SDK. It stops fetching when the budget is exhausted. Standard post-run storage access charges can apply.

Coverage and partial runs

Open Run coverage report or read RUN_SUMMARY in the run's key-value store:

  • complete: every selected point was verified and saved. This may include null elevations or an input truncated by maxItems.
  • partial: a budget limit or source error stopped later work. Existing rows remain available.
  • incomplete: execution failed. If the first batch cannot be verified, the run fails without inventing missing-height rows.

The report includes availablePoints, selectedPoints, inputLimitApplied, deliveredItems, pointsWithElevation, pointsWithoutElevation and unprocessedPointIndices. Check both the coverage status and numeric-height count before using the output. A platform status of SUCCEEDED can accompany useful partial results.

Restarting the same run with the same selected points reuses saved output and skips those point indices. Changed selections need a fresh run. A fresh run takes a new snapshot and is billed independently.

Source limits

The public provider documents 100 points per request, one request per second and 1,000 requests per day. This Actor sends at most 100 points per batch, spaces requests and uses bounded backoff for temporary failures. These limits are not a reserved capacity allocation; quota or availability can be shared with other traffic.

Quota exhaustion is reported explicitly. Retry later or reduce the workload. The current Actor uses the public endpoint; it does not expose a custom self-hosted endpoint. Source changes and outages remain possible.

Python API example

Install apify-client==3.2.0 and set your APIFY_TOKEN environment variable. This uses the typed client response and checks completeness before consuming data:

import os
from datetime import timedelta
from decimal import Decimal
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("ninhothedev/elevation-scraper").call(
run_input={"mode": "path", "coordinates": ["0,179", "0,-179"],
"dataset": "gebco2020", "pathSamples": 3, "maxItems": 3},
memory_mbytes=512,
run_timeout=timedelta(seconds=180),
max_total_charge_usd=Decimal("0.01"),
)
if run is None or run.status != "SUCCEEDED":
raise RuntimeError("Elevation run failed; inspect its log.")
record = client.key_value_store(run.default_key_value_store_id).get_record("RUN_SUMMARY")
if record is None or record["value"].get("status") != "complete":
raise RuntimeError("Elevation coverage is incomplete; inspect RUN_SUMMARY.")
for point in client.dataset(run.default_dataset_id).iterate_items():
print(point["point_index"], point["elevation_m"], point["path_distance_km"])

Support

Open the Actor's Issues tab with your run ID, mode and dataset. For a source-data issue, include an example coordinate you are comfortable sharing. Do not post tokens or private location lists.