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 |
Parameters
Section titled “Parameters”| 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.
Example
Section titled “Example”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 } ]}Paging
Section titled “Paging”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.
Errors
Section titled “Errors”| 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 |
Coming later
Section titled “Coming later”CQL2 filter and filter-lang (text on GET, JSON on POST) on the properties listed by /queryables, the optical-sr collection and anonymous search.