Skip to content

GET and POST /v1/search

Searches across collections.

Method and path GET /v1/search, POST /v1/search
Key needed
Request query parameters (GET) or a JSON body (POST)
Response application/geo+json, a FeatureCollection of STAC items
Lean OpenAPI searchItemsGet, searchItemsPost
Full contract searchItemsGet, searchItemsPost
Name GET POST Meaning
collections comma-separated array collection ids or aliases
ids comma-separated array item ids
bbox comma-separated array west, south, east, north
intersects GeoJSON geometry instead of bbox, not both
datetime string string RFC 3339 instant or interval
limit integer integer page size
query JSON string object STAC query extension, for example {"eo:cloud_cover": {"lte": 20}}
sortby -properties.eo:cloud_cover array of {"field", "direction"} sort order
fields comma-separated {"include": [...], "exclude": [...]} fields extension
token string string paging token from a next link

limit is 1 to 1,000, default 10. Unknown GET parameters and unknown body members are rejected with 400. A search on landsat-ot-l2 is limited to Landsat 8 and 9.

Terminal window
curl -s -X POST https://api.satellitedata.net/v1/search \
-H "X-API-Key: $SDN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"collections": ["sentinel-2-l2a", "landsat-ot-l2"],
"bbox": [-93.3, 44.9, -93.2, 45.0],
"datetime": "2026-06-01T00:00:00Z/2026-08-31T23:59:59Z",
"limit": 2,
"query": {"eo:cloud_cover": {"lt": 40}}
}'

Abridged response:

{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"id": "S2C_T15TVK_20260712T171233_L2A",
"collection": "sentinel-2-l2a",
"bbox": [-94.27, 44.16, -92.88, 45.15],
"properties": {
"datetime": "2026-07-12T17:21:21Z",
"platform": "sentinel-2c",
"eo:cloud_cover": 0.32,
"s2:mgrs_tile": "15TVK",
"s2:processing_baseline": "05.12"
},
"assets": { "...": "..." },
"links": [
{ "rel": "self", "href": "https://api.satellitedata.net/v1/collections/sentinel-2-l2a/items/S2C_T15TVK_20260712T171233_L2A" }
]
}
],
"links": [
{ "rel": "next", "href": "https://api.satellitedata.net/v1/search", "method": "POST", "body": { "token": "..." }, "merge": true }
]
}

Follow the next link until it is absent. Paging links are rewritten to api.satellitedata.net/v1. For POST, the next link carries method: POST, a body holding the token and merge: true: merge that body into your original request and post again. pystac-client does this for you.

Status Code When
400 invalid-parameter a malformed GET parameter
400 invalid-body a malformed POST body
401 invalid-key no key or an unknown key
400 invalid-filter a CQL2 filter or filter-lang; use query instead
429 rate-limited, quota-exhausted over the rate or monthly limit
503 upstream-unavailable Earth Search did not answer

CQL2 filter and filter-lang (text on GET, JSON on POST) on the properties listed by /queryables, the optical-sr collection and anonymous search.