POST /v1/process
Cuts an area out of the scenes in a time range, or out of scenes you name, and returns a GeoTIFF. The body follows the v1 contract’s Process request, modelled on the Sentinel Hub Process API without evalscripts. Lean v1 accepts a subset of it.
| Method and path | POST /v1/process |
| Key | needed |
| Request | application/json |
| Response | image/tiff up to 4 MB inline; larger outputs 303 See Other to a one-hour link |
| Lean OpenAPI | renderProcess |
| Full contract | renderProcess |
Available now
| Member | Meaning | Default |
|---|---|---|
input.bounds.bbox |
west, south, east, north in longitude and latitude (4 numbers, or 6 with heights) | |
input.bounds.geometry |
a GeoJSON Polygon or MultiPolygon instead of bbox; lean v1 reads its bounding box |
|
input.bounds.properties.crs |
CRS84 only | CRS84 |
input.data |
one source (no data fusion) | |
input.data[0].type |
collection id or any alias: sentinel-2-l2a, S2L2A, landsat-ot-l2, landsat-c2-l2, … |
|
input.data[0].dataFilter.timeRange |
{"from": ..., "to": ...} in RFC 3339; the API searches the window and keeps the first scenes, in mosaickingOrder, whose footprints together cover the box, at most 6 |
|
input.data[0].dataFilter.maxCloudCoverage |
scene cloud cover ceiling, 0 to 100 | 100 |
input.data[0].dataFilter.mosaickingOrder |
mostRecent, leastRecent or leastCC |
mostRecent |
input.data[0].dataFilter.ids |
lean extension: 1 to 6 scene ids to mosaic, in order, instead of timeRange |
|
input.data[0].processing.units |
REFLECTANCE (float32 physical values) or DN (stored integers) |
REFLECTANCE |
input.data[0].processing.harmonize |
none or offset_removed |
offset_removed |
input.data[0].processing.clipNegative |
set converted values below 0 to 0 | false |
bands |
common names, native names or aliases; see Bands | every spectral band |
output.width, output.height |
size in pixels, at most 2,500 a side; give one and the other follows the box | |
output.resx, output.resy |
pixel size in CRS units, instead of width and height | |
output.crs |
an EPSG code (EPSG:32615) or OGC URI |
EPSG:3857 |
output.format |
image/tiff |
image/tiff |
output.sampleType |
AUTO, or the type units and harmonize produce (see below) |
Unknown members are rejected with 400 invalid-body, so a typo fails loudly. Members of the contract that lean v1 does not offer (preset, expression, processing.cloudMask, dataFilter.platform, more than one data source, PNG, JPEG, WebP or JSON output) are also rejected with invalid-body, with a detail saying they are not available in lean v1.
Output type
Section titled “Output type”units |
harmonize |
GeoTIFF type |
|---|---|---|
REFLECTANCE |
either | FLOAT32, nodata NaN |
DN |
offset_removed (Sentinel-2) |
INT16, so values below zero survive |
DN |
none, or any Landsat |
UINT16, as stored |
sampleType, if given, must match. See Values, scale and offset.
The GeoTIFF’s band descriptions are Earth Search asset keys, such as red, nir08 and scl, in the order you asked for them. The response carries the credit line in X-Attribution.
Example
Section titled “Example”curl -s -L -X POST https://api.satellitedata.net/v1/process \ -H "X-API-Key: $SDN_API_KEY" \ -H "Content-Type: application/json" \ -o red-nir.tif \ -d '{ "input": { "bounds": {"bbox": [-93.3, 44.9, -93.2, 45.0]}, "data": [{ "type": "sentinel-2-l2a", "dataFilter": { "timeRange": {"from": "2026-07-01T00:00:00Z", "to": "2026-07-31T23:59:59Z"}, "maxCloudCoverage": 20, "mosaickingOrder": "leastCC" } }] }, "bands": ["red", "nir08"], "output": {"width": 512, "height": 512, "crs": "EPSG:4326"} }'This returns float32 reflectance (the defaults), one band per requested band.
Responses
Section titled “Responses”| Status | Meaning |
|---|---|
| 200 | the GeoTIFF, when it is 4 MB or less |
| 303 | Location is a presigned link to the GeoTIFF, valid for one hour; the file is deleted after a day |
HTTP clients follow the 303 on their own (curl -L, Python requests).
Limits
Section titled “Limits”| Limit | Value |
|---|---|
| Output size | 2,500 pixels a side; use jobs for up to 20,000 |
| Output values (width × height × bands) | 150,000,000 |
| Scenes in one mosaic | 6 |
| Render time | 29 seconds |
Errors
Section titled “Errors”| Status | Code | When |
|---|---|---|
| 400 | invalid-body |
malformed JSON, an unknown member, a value out of range, a band asked for twice, a sampleType that does not match, or a contract member lean v1 does not offer; errors[].pointer names the member |
| 401 | invalid-key |
no key or an unknown key |
| 404 | unknown-collection |
type is not a collection or alias |
| 404 | not-found |
no scenes under the cloud ceiling over the box in the time range |
| 413 | output-too-large |
over 2,500 pixels a side or 150 million values; limits gives the numbers |
| 422 | unknown-band |
a band the collection or scene lacks, or a pseudo-band such as dataMask; the detail suggests close names |
| 422 | harmonize-unavailable |
bandpass_adjusted or nbar |
| 422 | units-unavailable |
a unit other than REFLECTANCE or DN |
| 429 | rate-limited, quota-exhausted |
over the rate or monthly limit |
| 504 | render-timeout |
the render ran past 29 seconds; use a job |
Coming later
Section titled “Coming later”From the full contract: expression (band math, or an index id such as ndvi), preset, processing.cloudMask, resampling other than nearest, pixelSelection, dataFilter.platform, up to four data sources (data fusion), exact geometry clipping, PNG, JPEG, WebP and JSON output (with per-scene metadata), and unit metering.