APIs

STAC catalog API

Browse and search the full catalog with any STAC client — collections, item search, pagination, and asset access.

The catalog is a standards-compliant STAC API (SpatioTemporal Asset Catalog). Anything that speaks STAC works against it out of the box: pystac-client, STAC Browser, STAC Map, the QGIS STAC plugin, GDAL. No API key needed to browse — anonymous callers get 30 requests/min per IP, keys raise that to your plan's limit.

Text
https://api.darly.io

Collections and Items

A Collection is one coherent elevation dataset in Darly. It is either a global product, such as Copernicus DEM, or a specific selected dataset from a national (or other regional) lidar programme — for example, the USGS 3DEP seamless 1 m DTM. It is not a catch-all for every dataset an agency publishes. Collection metadata describes the source, coverage, resolution, and available surface models.

An Item is one spatial piece of that Collection, usually a source raster tile. Its geometry and bounding box show the area it covers; its properties carry the relevant acquisition and projection metadata; and its assets link to the terrain (dtm) and/or surface (dsm) raster for that area. Search for Items when you need data covering a place or time; use Collection metadata to choose the dataset first.

Endpoints

Endpoint Methods Purpose
/ GET Landing page + conformance links
/collections GET List all collections
/collections/{id} GET One collection's metadata
/collections/{id}/items GET Items in a collection (paginated)
/collections/{id}/items/{item_id} GET One item with full asset links
/search GET, POST Cross-collection spatial/temporal search

POST is accepted only on /search. Collection IDs and coverage are listed in coverage & datasets.

Using an API key

Browsing works without a key, so attaching one is optional — but it does two things for STAC:

  • Raises your rate limit from the anonymous 30 req/min per IP to your plan's limit.
  • Unlocks download links. On paid plans, the single-item endpoint replaces Darly-hosted asset hrefs with /dl/... links (see items and assets); anonymous callers never see them.

Send the key the same way as everywhere else — the X-API-Key header is preferred. It attaches to any STAC call; the search below just shows the common case:

curl -X POST "https://api.darly.io/search" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $DARLY_API_KEY" \
  -d '{"collections": ["usa-usgs-3dep-1m-seamless"], "limit": 10}'

For tools whose STAC field only takes a URL (some GIS clients, /vsicurl), append ?api_key=… to the request instead of setting a header — but a key in a URL can leak into logs, and it won't ride along as clients follow next links. Authorization: Bearer works too. All three forms, the security trade-offs, and how quotas attach to your account are covered in authentication.

Searching

curl -X POST "https://api.darly.io/search" \
  -H "Content-Type: application/json" \
  -d '{
    "collections": ["usa-usgs-3dep-1m-seamless"],
    "bbox": [-122.52, 37.70, -122.35, 37.83],
    "limit": 10
  }'

Standard STAC search parameters are supported: collections, bbox, intersects (GeoJSON geometry), datetime ranges, ids, and limit.

Pagination

Page size defaults to 10 items and is capped at 100. Responses carry a rel: next link; follow it until absent (pystac-client does this for you):

Response
{
  "type": "FeatureCollection",
  "features": ["…"],
  "links": [
    { "rel": "next", "href": "https://api.darly.io/search?token=…" }
  ]
}

Prefer narrow bbox/datetime filters over crawling: search and item-list requests consume rate-limit budget proportional to their page size (one unit per 10 items requested — see limits), so whole-catalog dumps are slow by design.

Items and assets

Item properties

Darly uses the following properties consistently across elevation Items:

Property Meaning
datetime Representative acquisition timestamp. For an Item with a temporal interval, this is always the elapsed-time midpoint between start_datetime and end_datetime.
start_datetime, end_datetime Inclusive source acquisition bounds. Both are present together or both are absent.
created, updated Creation and last-update timestamps for the STAC metadata.
vertical_datum Canonical vertical reference for elevation values, such as NAVD88, CGVD2013, or EGM2008.
vertical_datum_epsg EPSG identifier for the vertical CRS when one is available.
elevation_unit Elevation unit; currently m for every collection.
checksum:sha256 Checksum used to track changes to the upstream source record.

For interval Items, the midpoint helps clients that display or sort Items by one date. It does not mean that the whole raster was acquired at that instant: use start_datetime and end_datetime when the complete acquisition period matters. An Item that represents a true instant keeps its source-provided datetime and has no interval fields.

Elevation rasters use consistent asset keys across all collections — dtm (terrain) and/or dsm (surface) — with projection metadata (proj:code, proj:transform, proj:shape) on each asset, so GDAL and rasterio can read windows without opening the file blind.

Asset hrefs come in two flavors:

  • Source-hosted (USGS, NRCan, AWS Open Data, OpenGeoHub): direct public HTTPS URLs — fetch them however you like, they never touch your Darly quotas.
  • Darly-hosted (Mexico COGs re-hosted on our storage): on paid plans, the single-item endpoint (/collections/{id}/items/{item_id}) replaces these with /dl/... download links — see COG downloads. Multi-item responses (search, item lists) omit Darly-hosted assets; fetch the individual item to get its download link.

Errors

  • Unknown collections — and collections your plan doesn't include — return the same 404 {"detail": "Not found"}.
  • POST anywhere but /search405.
  • Over the per-minute limit → 429 with X-RateLimit-* headers; see rate limits & quotas.