Zonal statistics per interval
const url = 'https://api.satellitedata.net/v1/statistics';const options = { method: 'POST', headers: {'X-API-Key': '<X-API-Key>', 'Content-Type': 'application/json'}, body: '{"input":{"bounds":{"geometry":{"type":"Polygon","coordinates":[[[-93.262,44.941],[-93.252,44.941],[-93.252,44.947],[-93.262,44.947],[-93.262,44.941]]]}},"data":[{"type":"optical-sr","dataFilter":{"timeRange":{"from":"2026-06-01T00:00:00Z","to":"2026-07-31T23:59:59Z"},"maxCloudCoverage":60},"processing":{"harmonize":"bandpass_adjusted","cloudMask":{"exclude":["nodata","saturated_defective","cloud","cloud_shadow","cirrus","cloud_adjacent"],"dilate_m":150}}}]},"aggregation":{"timeRange":{"from":"2026-06-01T00:00:00Z","to":"2026-07-31T23:59:59Z"},"aggregationInterval":{"of":"P1M"},"outputs":{"ndvi":"ndvi"},"resx":30,"resy":30},"calculations":{"percentiles":[10,50,90],"histogram":{"bins":4,"low":0,"high":1}}}'};
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/statistics \ --header 'Content-Type: application/json' \ --header 'X-API-Key: <X-API-Key>' \ --data '{ "input": { "bounds": { "geometry": { "type": "Polygon", "coordinates": [ [ [ -93.262, 44.941 ], [ -93.252, 44.941 ], [ -93.252, 44.947 ], [ -93.262, 44.947 ], [ -93.262, 44.941 ] ] ] } }, "data": [ { "type": "optical-sr", "dataFilter": { "timeRange": { "from": "2026-06-01T00:00:00Z", "to": "2026-07-31T23:59:59Z" }, "maxCloudCoverage": 60 }, "processing": { "harmonize": "bandpass_adjusted", "cloudMask": { "exclude": [ "nodata", "saturated_defective", "cloud", "cloud_shadow", "cirrus", "cloud_adjacent" ], "dilate_m": 150 } } } ] }, "aggregation": { "timeRange": { "from": "2026-06-01T00:00:00Z", "to": "2026-07-31T23:59:59Z" }, "aggregationInterval": { "of": "P1M" }, "outputs": { "ndvi": "ndvi" }, "resx": 30, "resy": 30 }, "calculations": { "percentiles": [ 10, 50, 90 ], "histogram": { "bins": 4, "low": 0, "high": 1 } } }'Computes zonal statistics for a geometry per time interval: min, max, mean, standard deviation, counts, percentiles and histograms for up to five named outputs. Every scene in each interval is read, cloud-masked with the defaultExclude classes unless overridden, and reduced in linear space. Capped at 120 intervals and 1,000 scenes per call.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”Statistics request.
Zonal statistics request, modelled on the Sentinel Hub Statistical API.
object
Inputs.
object
Area of interest: bbox or geometry, not both.
object
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).
Bounds properties.
object
CRS of bbox or geometry as an OGC URI.
Input collections.
One input collection.
object
Collection id or alias, for example optical-sr or S2L2A.
Name for this source when the request fuses several, used as a prefix in expressions (s1.vv).
Which scenes feed the request.
object
Acquisition time window.
object
Inclusive start, RFC 3339 UTC.
Inclusive end, RFC 3339 UTC.
Maximum scene cloud cover percentage.
Scene order for mosaics.
Normalized platform names such as landsat-9 or sentinel-2c.
On optical-sr, which copy wins when native and HLS observe the same overpass.
Extra CQL2 JSON filter on queryables.
object
How values are converted.
object
Output unit. Defaults per band from schema v1.
Harmonization level. Default offset_removed on native collections and bandpass_adjusted on optical-sr.
Unified cloud mask settings from schema v1.
object
Mask classes to drop. Defaults to schema v1 defaultExclude for statistics and time series and to the preset value for tiles.
How Sentinel-2 SCL class 7 is treated.
Buffer in metres around cloud and cloud_shadow on sources without one.
Minimum Landsat QA_PIXEL cloud confidence counted as cloud.
Clip negative reflectance to 0.
Resampling method.
How overlapping scenes combine into one value.
DEM only: return ellipsoidal heights instead of orthometric.
Aggregation.
object
Acquisition time window.
object
Inclusive start, RFC 3339 UTC.
Inclusive end, RFC 3339 UTC.
Interval length.
object
ISO 8601 duration such as P1D, P10D or P1M.
What to do with a final partial interval.
Output name to expression or index id, at most 5.
object
Pixel size in metres; default is the finest native gsd of the bands used.
Pixel size in metres.
Extra calculations.
object
Percentiles to compute.
Histogram request.
object
Bin count.
Lower edge.
Upper edge.
Example
{ "input": { "bounds": { "geometry": { "type": "Polygon", "coordinates": [ [ [ -93.262, 44.941 ], [ -93.252, 44.941 ], [ -93.252, 44.947 ], [ -93.262, 44.947 ], [ -93.262, 44.941 ] ] ] } }, "data": [ { "type": "optical-sr", "dataFilter": { "timeRange": { "from": "2026-06-01T00:00:00Z", "to": "2026-07-31T23:59:59Z" }, "maxCloudCoverage": 60 }, "processing": { "harmonize": "bandpass_adjusted", "cloudMask": { "exclude": [ "nodata", "saturated_defective", "cloud", "cloud_shadow", "cirrus", "cloud_adjacent" ], "dilate_m": 150 } } } ] }, "aggregation": { "timeRange": { "from": "2026-06-01T00:00:00Z", "to": "2026-07-31T23:59:59Z" }, "aggregationInterval": { "of": "P1M" }, "outputs": { "ndvi": "ndvi" }, "resx": 30, "resy": 30 }, "calculations": { "percentiles": [ 10, 50, 90 ], "histogram": { "bins": 4, "low": 0, "high": 1 } }}Responses
Section titled “Responses”Statistics per interval.
Zonal statistics.
object
OK, or PARTIAL when an interval failed.
One entry per interval.
One interval.
object
Interval.
object
Start.
End.
Scenes read in the interval.
Statistics per output name.
object
Statistics for one output in one interval.
object
Minimum.
Maximum.
Mean.
Standard deviation.
Pixel observations in the geometry: pixels times scenes read in the interval.
Pixel observations masked or without data; the statistics use the rest.
Requested percentiles keyed p10, p50 and so on.
object
Histogram.
object
Bins.
Bin.
object
Lower edge.
Upper edge.
Pixels.
Why this interval failed, when status is PARTIAL.
Harmonization level applied.
Credit line.
Example
{ "status": "OK", "harmonize": "bandpass_adjusted", "attribution": "Contains modified Copernicus Sentinel data 2026; Landsat data courtesy of the U.S. Geological Survey", "intervals": [ { "interval": { "from": "2026-06-01T00:00:00Z", "to": "2026-07-01T00:00:00Z" }, "observations": 13, "outputs": { "ndvi": { "min": 0.21, "max": 0.88, "mean": 0.61, "stDev": 0.11, "sampleCount": 7722, "noDataCount": 3861, "percentiles": { "p10": 0.42, "p50": 0.63, "p90": 0.77 }, "histogram": { "bins": [ { "low": 0, "high": 0.25, "count": 77 }, { "low": 0.25, "high": 0.5, "count": 401 }, { "low": 0.5, "high": 0.75, "count": 1606 }, { "low": 0.75, "high": 1, "count": 1777 } ] } } } }, { "interval": { "from": "2026-07-01T00:00:00Z", "to": "2026-07-31T23:59:59Z" }, "observations": 12, "outputs": { "ndvi": { "min": 0.21, "max": 0.88, "mean": 0.74, "stDev": 0.11, "sampleCount": 7128, "noDataCount": 2970, "percentiles": { "p10": 0.6, "p50": 0.76, "p90": 0.84 }, "histogram": { "bins": [ { "low": 0, "high": 0.25, "count": 19 }, { "low": 0.25, "high": 0.5, "count": 125 }, { "low": 0.5, "high": 0.75, "count": 1134 }, { "low": 0.75, "high": 1, "count": 2880 } ] } } } } ]}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=60Credit lines for the data in the response, separated by semicolons.
Example
Contains modified Copernicus Sentinel data 2026; Landsat data courtesy of the U.S. Geological SurveyMalformed body.
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-body", "title": "Invalid request body", "status": 400, "detail": "aggregation.aggregationInterval.of must be an ISO 8601 duration such as P1M.", "instance": "/v1/statistics", "code": "invalid-body", "requestId": "01JQ7Z3M8R5V2W6X9Y0A1B2C3D", "errors": [ { "pointer": "/aggregation/aggregationInterval/of", "detail": "not an ISO 8601 duration" } ]}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
01JQ7Z3M8R5V2W6X9Y0A1B2C3DToo many intervals or scenes, or an unknown output band.
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/too-many-scenes", "title": "Too many scenes", "status": 422, "detail": "The request would read 1,840 scenes; the cap is 1,000 per call. Split the time range.", "instance": "/v1/statistics", "code": "too-many-scenes", "requestId": "01JQ7Z3M8R5V2W6X9Y0A1B2C3D", "limits": { "maxScenes": 1000, "requestedScenes": 1840 }, "unitsEstimated": 184.4}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
17The render did not finish within the 29-second API Gateway limit. 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/render-timeout", "title": "Render timed out", "status": 504, "detail": "The render read 41 scenes and did not finish in 29 seconds. Narrow the time range or lower the output size.", "instance": "/v1/process", "code": "render-timeout", "requestId": "01JQ7Z3M8R5V2W6X9Y0A1B2C3D"}Headers
Section titled “Headers”Request id for support and logs.
Example
01JQ7Z3M8R5V2W6X9Y0A1B2C3D