STAC item search, cql2-json
const url = 'https://api.satellitedata.net/v1/search';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"collections":["optical-sr"],"bbox":[-93.3,44.9,-93.2,45],"datetime":"2026-06-01T00:00:00Z/2026-08-31T23:59:59Z","limit":2,"filter":{"op":"and","args":[{"op":"<","args":[{"property":"eo:cloud_cover"},40]},{"op":"in","args":[{"property":"platform"},["landsat-8","landsat-9","sentinel-2a","sentinel-2b","sentinel-2c"]]}]},"filter-lang":"cql2-json","sortby":[{"field":"properties.eo:cloud_cover","direction":"asc"}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.satellitedata.net/v1/search \ --header 'Content-Type: application/json' \ --data '{ "collections": [ "optical-sr" ], "bbox": [ -93.3, 44.9, -93.2, 45 ], "datetime": "2026-06-01T00:00:00Z/2026-08-31T23:59:59Z", "limit": 2, "filter": { "op": "and", "args": [ { "op": "<", "args": [ { "property": "eo:cloud_cover" }, 40 ] }, { "op": "in", "args": [ { "property": "platform" }, [ "landsat-8", "landsat-9", "sentinel-2a", "sentinel-2b", "sentinel-2c" ] ] } ] }, "filter-lang": "cql2-json", "sortby": [ { "field": "properties.eo:cloud_cover", "direction": "asc" } ] }'Searches items with a JSON body, the form to use for long geometries and cql2-json filters. The next link is a POST link whose body carries the paging token, merged into the original body. POST search is never cached, and it costs the same units as GET. It also accepts anonymous calls, like GET search, so pystac-client, which searches with POST by default, works without a key; anonymous calls are capped at 100 items a page and 300 requests per IP per 300 seconds.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”Search body.
STAC item search body. bbox and intersects are mutually exclusive.
object
Collection ids or aliases. optical-sr expands to its members.
Item ids.
Bounding box as [west, south, east, north] in CRS84 longitude and latitude, or six numbers with heights.
A GeoJSON geometry.
object
GeoJSON geometry type.
GeoJSON coordinates in CRS84 longitude and latitude (RFC 7946).
RFC 3339 instant or interval; an open end is written .. (for example 2026-06-01T00:00:00Z/..).
Page size.
CQL2 JSON filter on queryables.
object
Filter language. POST accepts cql2-json only.
Sort order. Default datetime descending, then id.
Sort term.
object
Queryable property.
Sort direction.
Fields extension.
object
Fields to include.
Fields to exclude.
Opaque paging token from a next or prev link.
Example
{ "collections": [ "optical-sr" ], "bbox": [ -93.3, 44.9, -93.2, 45 ], "datetime": "2026-06-01T00:00:00Z/2026-08-31T23:59:59Z", "limit": 2, "filter": { "op": "and", "args": [ { "op": "<", "args": [ { "property": "eo:cloud_cover" }, 40 ] }, { "op": "in", "args": [ { "property": "platform" }, [ "landsat-8", "landsat-9", "sentinel-2a", "sentinel-2b", "sentinel-2c" ] ] } ] }, "filter-lang": "cql2-json", "sortby": [ { "field": "properties.eo:cloud_cover", "direction": "asc" } ]}Responses
Section titled “Responses”One page of matching items.
STAC item collection, one page of results.
object
Always FeatureCollection.
Matching items, at most limit.
STAC item.
object
Always Feature.
STAC version.
Extensions.
Native upstream item id.
Collection id.
Bounding box as [west, south, east, north] in CRS84 longitude and latitude, or six numbers with heights.
Item properties. Any property listed by queryables can appear; the common ones are named here.
object
Acquisition time, UTC.
Normalized lowercase platform, for example sentinel-2c or landsat-9.
Constellation.
Instruments.
Scene cloud cover percentage from the producer.
Sentinel-2 MGRS tile.
Sentinel-2 processing baseline, which decides the DN offset.
Landsat WRS-2 path.
Landsat WRS-2 row.
Native collection of an item returned through optical-sr.
Cloud-mask source for the item.
Mask classes the item can detect.
Harmonization level that applies to this item at the collection default.
Assets keyed by native band name or role.
object
STAC asset. href points at the public upstream COG.
object
Asset URL.
Media type.
Title.
Asset roles such as data, overview or cloud.
Band name the asset holds, when it holds one band.
Links, including self, collection and preview.
A STAC and OGC API link object.
object
Link target.
Relation type, such as self, root, parent, next, prev, items, queryables, tiles or license.
Media type of the target.
Human-readable title.
HTTP method for the link, GET unless stated. Paging POST /v1/search uses POST.
Request body to send with a POST link, used for the next page of POST /v1/search.
object
When true the client merges body into the previous request body.
Paging links: next and prev carry the token.
A STAC and OGC API link object.
object
Link target.
Relation type, such as self, root, parent, next, prev, items, queryables, tiles or license.
Media type of the target.
Human-readable title.
HTTP method for the link, GET unless stated. Paging POST /v1/search uses POST.
Request body to send with a POST link, used for the next page of POST /v1/search.
object
When true the client merges body into the previous request body.
Total matches, present when under 10,000.
Items in this page.
Example
{ "type": "FeatureCollection", "features": [ { "type": "Feature", "stac_version": "1.1.0", "stac_extensions": [ "https://stac-extensions.github.io/eo/v2.0.0/schema.json", "https://stac-extensions.github.io/raster/v2.0.0/schema.json" ], "id": "S2C_T15TVK_20260712T171233_L2A", "collection": "sentinel-2-l2a", "geometry": { "type": "Polygon", "coordinates": [ [ [ -94.27, 44.16 ], [ -92.88, 44.16 ], [ -92.88, 45.15 ], [ -94.27, 45.15 ], [ -94.27, 44.16 ] ] ] }, "bbox": [ -94.27, 44.16, -92.88, 45.15 ], "properties": { "datetime": "2026-07-12T17:21:21Z", "platform": "sentinel-2c", "constellation": "sentinel-2", "instruments": [ "msi" ], "eo:cloud_cover": 0.32, "s2:mgrs_tile": "15TVK", "s2:processing_baseline": "05.12", "sdn:source_collection": "sentinel-2-l2a", "sdn:mask_source": "scl", "sdn:mask_capabilities": [ "nodata", "saturated_defective", "cloud", "cloud_shadow", "cirrus", "snow_ice", "water", "dark_terrain_shadow", "unclassified", "clear", "cloud_adjacent" ], "sdn:harmonization": "bandpass_adjusted" }, "assets": { "B04": { "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/VK/2026/7/S2C_T15TVK_20260712T171233_L2A/B04.tif", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "roles": [ "data" ], "sdn:band": "B04" }, "B8A": { "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/VK/2026/7/S2C_T15TVK_20260712T171233_L2A/B8A.tif", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "roles": [ "data" ], "sdn:band": "B8A" }, "SCL": { "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/VK/2026/7/S2C_T15TVK_20260712T171233_L2A/SCL.tif", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "roles": [ "cloud" ], "sdn:band": "SCL" } }, "links": [ { "href": "https://api.satellitedata.net/v1/collections/sentinel-2-l2a/items/S2C_T15TVK_20260712T171233_L2A", "rel": "self", "type": "application/geo+json" }, { "href": "https://api.satellitedata.net/v1/collections/sentinel-2-l2a", "rel": "collection", "type": "application/json" }, { "href": "https://api.satellitedata.net/v1/collections/sentinel-2-l2a/items/S2C_T15TVK_20260712T171233_L2A/preview.png", "rel": "preview", "type": "image/png" } ] }, { "type": "Feature", "stac_version": "1.1.0", "stac_extensions": [ "https://stac-extensions.github.io/eo/v2.0.0/schema.json", "https://stac-extensions.github.io/raster/v2.0.0/schema.json" ], "id": "LC08_L2SP_027029_20260718_02_T1", "collection": "landsat-ot-l2", "geometry": { "type": "Polygon", "coordinates": [ [ [ -95.03, 43.52 ], [ -92.02, 43.52 ], [ -92.02, 45.67 ], [ -95.03, 45.67 ], [ -95.03, 43.52 ] ] ] }, "bbox": [ -95.03, 43.52, -92.02, 45.67 ], "properties": { "datetime": "2026-07-18T16:58:29Z", "platform": "landsat-8", "constellation": "landsat", "instruments": [ "oli", "tirs" ], "eo:cloud_cover": 4.59, "landsat:wrs_path": "027", "landsat:wrs_row": "029", "sdn:source_collection": "landsat-ot-l2", "sdn:mask_source": "qa_pixel", "sdn:mask_capabilities": [ "nodata", "saturated_defective", "cloud", "cloud_shadow", "cirrus", "cloud_adjacent", "snow_ice", "water", "dark_terrain_shadow", "clear" ], "sdn:harmonization": "offset_removed" }, "assets": { "SR_B4": { "href": "s3://usgs-landsat/collection02/level-2/standard/oli-tirs/2026/027/029/LC08_L2SP_027029_20260718_20260725_02_T1/LC08_L2SP_027029_20260718_20260725_02_T1_SR_B4.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "roles": [ "data" ], "sdn:band": "SR_B4" }, "SR_B5": { "href": "s3://usgs-landsat/collection02/level-2/standard/oli-tirs/2026/027/029/LC08_L2SP_027029_20260718_20260725_02_T1/LC08_L2SP_027029_20260718_20260725_02_T1_SR_B5.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "roles": [ "data" ], "sdn:band": "SR_B5" }, "QA_PIXEL": { "href": "s3://usgs-landsat/collection02/level-2/standard/oli-tirs/2026/027/029/LC08_L2SP_027029_20260718_20260725_02_T1/LC08_L2SP_027029_20260718_20260725_02_T1_QA_PIXEL.TIF", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "roles": [ "cloud" ], "sdn:band": "QA_PIXEL" } }, "links": [ { "href": "https://api.satellitedata.net/v1/collections/landsat-ot-l2/items/LC08_L2SP_027029_20260718_02_T1", "rel": "self", "type": "application/geo+json" }, { "href": "https://api.satellitedata.net/v1/collections/landsat-ot-l2", "rel": "collection", "type": "application/json" }, { "href": "https://api.satellitedata.net/v1/collections/landsat-ot-l2/items/LC08_L2SP_027029_20260718_02_T1/preview.png", "rel": "preview", "type": "image/png" } ] } ], "numberMatched": 23, "numberReturned": 2, "links": [ { "href": "https://api.satellitedata.net/v1/search", "rel": "self", "type": "application/geo+json", "method": "POST" }, { "href": "https://api.satellitedata.net/v1/search", "rel": "next", "type": "application/geo+json", "method": "POST", "body": { "token": "next:landsat-ot-l2:LC08_L2SP_027029_20260718_02_T1" }, "merge": true } ]}Headers
Section titled “Headers”Request id for support and logs.
Example
01JQ7Z3M8R5V2W6X9Y0A1B2C3DUnits charged for this response; 0 for cache hits and free routes.
Example
1.333Units left this month before restricted mode.
Example
8664.2Remaining units and seconds to reset in the current window (IETF RateLimit header draft).
Example
"units";r=287;t=41Quota policy of the caller (IETF RateLimit header draft).
Example
"units";q=300;w=60The request is malformed or a parameter is invalid.
RFC 9457 problem details. Every 4xx and 5xx response uses this shape with media type application/problem+json. The type URL opens a documentation page that explains the cause and the fix.
object
URL of the documentation page for this problem type, stable for the life of /v1.
Short summary of the problem type. It does not change between occurrences.
HTTP status code, repeated for clients that lose the status line.
Explanation specific to this occurrence, written for a developer.
Path of the request that failed.
Machine-readable problem code; equals the last path segment of type.
Request id, also sent in X-Request-Id. Quote it in support requests.
Field-level validation failures, present on 400 and 422.
One field-level failure.
object
JSON Pointer (RFC 6901) into the request body, or the query parameter name.
What is wrong with that member.
Seconds until the request can succeed; equals the Retry-After header.
The limit that was hit and the value requested, for example maxWidth and requestedWidth.
object
Units the request would have cost, computed before execution.
OAuth 2.0 error code (RFC 6749 section 5.2). Present only on /oauth/token responses.
OAuth 2.0 error description. Present only on /oauth/token responses.
Copy of detail for openEO clients, which read message. Present only on /v1/openeo routes.
Example
{ "type": "https://docs.satellitedata.net/problems/invalid-parameter", "title": "Invalid parameter", "status": 400, "detail": "bbox must have 4 or 6 numbers; got 3.", "instance": "/v1/search", "code": "invalid-parameter", "requestId": "01JQ7Z3M8R5V2W6X9Y0A1B2C3D", "errors": [ { "pointer": "bbox", "detail": "expected 4 or 6 numbers" } ]}Headers
Section titled “Headers”Request id for support and logs.
Example
01JQ7Z3M8R5V2W6X9Y0A1B2C3DThe API key or bearer token is missing, unknown, revoked or expired.
RFC 9457 problem details. Every 4xx and 5xx response uses this shape with media type application/problem+json. The type URL opens a documentation page that explains the cause and the fix.
object
URL of the documentation page for this problem type, stable for the life of /v1.
Short summary of the problem type. It does not change between occurrences.
HTTP status code, repeated for clients that lose the status line.
Explanation specific to this occurrence, written for a developer.
Path of the request that failed.
Machine-readable problem code; equals the last path segment of type.
Request id, also sent in X-Request-Id. Quote it in support requests.
Field-level validation failures, present on 400 and 422.
One field-level failure.
object
JSON Pointer (RFC 6901) into the request body, or the query parameter name.
What is wrong with that member.
Seconds until the request can succeed; equals the Retry-After header.
The limit that was hit and the value requested, for example maxWidth and requestedWidth.
object
Units the request would have cost, computed before execution.
OAuth 2.0 error code (RFC 6749 section 5.2). Present only on /oauth/token responses.
OAuth 2.0 error description. Present only on /oauth/token responses.
Copy of detail for openEO clients, which read message. Present only on /v1/openeo routes.
Example
{ "type": "https://docs.satellitedata.net/problems/invalid-key", "title": "Invalid or missing credentials", "status": 401, "detail": "Send a verified key in X-API-Key or a bearer token from /oauth/token.", "instance": "/v1/process", "code": "invalid-key", "requestId": "01JQ7Z3M8R5V2W6X9Y0A1B2C3D"}Headers
Section titled “Headers”Request id for support and logs.
Example
01JQ7Z3M8R5V2W6X9Y0A1B2C3DChallenge naming the accepted schemes.
Example
Bearer realm="satellitedata.net", ApiKey header="X-API-Key"The credentials are valid but cannot use this route, for example before email verification or without the scope.
RFC 9457 problem details. Every 4xx and 5xx response uses this shape with media type application/problem+json. The type URL opens a documentation page that explains the cause and the fix.
object
URL of the documentation page for this problem type, stable for the life of /v1.
Short summary of the problem type. It does not change between occurrences.
HTTP status code, repeated for clients that lose the status line.
Explanation specific to this occurrence, written for a developer.
Path of the request that failed.
Machine-readable problem code; equals the last path segment of type.
Request id, also sent in X-Request-Id. Quote it in support requests.
Field-level validation failures, present on 400 and 422.
One field-level failure.
object
JSON Pointer (RFC 6901) into the request body, or the query parameter name.
What is wrong with that member.
Seconds until the request can succeed; equals the Retry-After header.
The limit that was hit and the value requested, for example maxWidth and requestedWidth.
object
Units the request would have cost, computed before execution.
OAuth 2.0 error code (RFC 6749 section 5.2). Present only on /oauth/token responses.
OAuth 2.0 error description. Present only on /oauth/token responses.
Copy of detail for openEO clients, which read message. Present only on /v1/openeo routes.
Example
{ "type": "https://docs.satellitedata.net/problems/email-unverified", "title": "Email not verified", "status": 403, "detail": "Keys work only after the account email is verified. Check your inbox or resend from the dashboard.", "instance": "/v1/process", "code": "email-unverified", "requestId": "01JQ7Z3M8R5V2W6X9Y0A1B2C3D"}Headers
Section titled “Headers”Request id for support and logs.
Example
01JQ7Z3M8R5V2W6X9Y0A1B2C3DA per-minute, concurrency, monthly or per-IP limit was hit. Retry-After says when to retry.
RFC 9457 problem details. Every 4xx and 5xx response uses this shape with media type application/problem+json. The type URL opens a documentation page that explains the cause and the fix.
object
URL of the documentation page for this problem type, stable for the life of /v1.
Short summary of the problem type. It does not change between occurrences.
HTTP status code, repeated for clients that lose the status line.
Explanation specific to this occurrence, written for a developer.
Path of the request that failed.
Machine-readable problem code; equals the last path segment of type.
Request id, also sent in X-Request-Id. Quote it in support requests.
Field-level validation failures, present on 400 and 422.
One field-level failure.
object
JSON Pointer (RFC 6901) into the request body, or the query parameter name.
What is wrong with that member.
Seconds until the request can succeed; equals the Retry-After header.
The limit that was hit and the value requested, for example maxWidth and requestedWidth.
object
Units the request would have cost, computed before execution.
OAuth 2.0 error code (RFC 6749 section 5.2). Present only on /oauth/token responses.
OAuth 2.0 error description. Present only on /oauth/token responses.
Copy of detail for openEO clients, which read message. Present only on /v1/openeo routes.
Example
{ "type": "https://docs.satellitedata.net/problems/rate-limited", "title": "Rate limit exceeded", "status": 429, "detail": "This key spent 300 of its 300 units in the current minute.", "instance": "/v1/process", "code": "rate-limited", "requestId": "01JQ7Z3M8R5V2W6X9Y0A1B2C3D", "retryAfter": 17, "limits": { "unitsPerMinute": 300, "unitsSpentThisMinute": 300 }}Headers
Section titled “Headers”Request id for support and logs.
Example
01JQ7Z3M8R5V2W6X9Y0A1B2C3DSeconds to wait before retrying.
Example
17Remaining units and seconds to reset in the current window (IETF RateLimit header draft).
Example
"units";r=287;t=41Quota policy of the caller (IETF RateLimit header draft).
Example
"units";q=300;w=60An unexpected server error. No units are charged.
RFC 9457 problem details. Every 4xx and 5xx response uses this shape with media type application/problem+json. The type URL opens a documentation page that explains the cause and the fix.
object
URL of the documentation page for this problem type, stable for the life of /v1.
Short summary of the problem type. It does not change between occurrences.
HTTP status code, repeated for clients that lose the status line.
Explanation specific to this occurrence, written for a developer.
Path of the request that failed.
Machine-readable problem code; equals the last path segment of type.
Request id, also sent in X-Request-Id. Quote it in support requests.
Field-level validation failures, present on 400 and 422.
One field-level failure.
object
JSON Pointer (RFC 6901) into the request body, or the query parameter name.
What is wrong with that member.
Seconds until the request can succeed; equals the Retry-After header.
The limit that was hit and the value requested, for example maxWidth and requestedWidth.
object
Units the request would have cost, computed before execution.
OAuth 2.0 error code (RFC 6749 section 5.2). Present only on /oauth/token responses.
OAuth 2.0 error description. Present only on /oauth/token responses.
Copy of detail for openEO clients, which read message. Present only on /v1/openeo routes.
Example
{ "type": "https://docs.satellitedata.net/problems/internal", "title": "Internal error", "status": 500, "detail": "The request failed on our side and was logged. No units were charged.", "instance": "/v1/process", "code": "internal", "requestId": "01JQ7Z3M8R5V2W6X9Y0A1B2C3D"}Headers
Section titled “Headers”Request id for support and logs.
Example
01JQ7Z3M8R5V2W6X9Y0A1B2C3DAn upstream catalog or bucket is unavailable, or the service is in maintenance. No units are charged.
RFC 9457 problem details. Every 4xx and 5xx response uses this shape with media type application/problem+json. The type URL opens a documentation page that explains the cause and the fix.
object
URL of the documentation page for this problem type, stable for the life of /v1.
Short summary of the problem type. It does not change between occurrences.
HTTP status code, repeated for clients that lose the status line.
Explanation specific to this occurrence, written for a developer.
Path of the request that failed.
Machine-readable problem code; equals the last path segment of type.
Request id, also sent in X-Request-Id. Quote it in support requests.
Field-level validation failures, present on 400 and 422.
One field-level failure.
object
JSON Pointer (RFC 6901) into the request body, or the query parameter name.
What is wrong with that member.
Seconds until the request can succeed; equals the Retry-After header.
The limit that was hit and the value requested, for example maxWidth and requestedWidth.
object
Units the request would have cost, computed before execution.
OAuth 2.0 error code (RFC 6749 section 5.2). Present only on /oauth/token responses.
OAuth 2.0 error description. Present only on /oauth/token responses.
Copy of detail for openEO clients, which read message. Present only on /v1/openeo routes.
Example
{ "type": "https://docs.satellitedata.net/problems/upstream-unavailable", "title": "Upstream unavailable", "status": 503, "detail": "NASA Earthdata returned 503 for the HLS credentials endpoint; HLS scenes are temporarily unavailable.", "instance": "/v1/process", "code": "upstream-unavailable", "requestId": "01JQ7Z3M8R5V2W6X9Y0A1B2C3D", "retryAfter": 120}Headers
Section titled “Headers”Request id for support and logs.
Example
01JQ7Z3M8R5V2W6X9Y0A1B2C3DSeconds to wait before retrying.
Example
17