---
title: "Spectral-index time series over an area"
method: POST
path: "/api/v1/index-series"
---

# Spectral-index time series over an area

`POST /api/v1/index-series`

## Request

- Base URL: `https://offnadir-delta.com`
- URL: `https://offnadir-delta.com/api/v1/index-series`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Measure a spectral index over a polygon, scene by scene, back through the Sentinel-2 archive — the answer to "how has this changed since <year>". Costs 0.5 tokens per scene ACTUALLY measured; a scene that fails to read appears in `skipped` and is not charged. Send `estimate_only: true` first: that is free and returns how many scenes match, the real date span, and what measuring them would cost. Three limits the response states rather than hides — the archive begins 2015-06-27 so an earlier start is clamped (`clamped_to_archive`), at most 24 scenes are measured per call so a longer period comes back as a sample with the rest in `skipped`, and `trend` compares the first and last measured scene only, so it is not a fitted rate. For a SAR quantity, or to keep measuring as new imagery arrives, create a monitored area instead.

## Request body

- object
  - `polygon` array[]: WGS84 ring [[lon, lat], …] with at least 3 vertices. Statistics cover the samples INSIDE it. A GeoJSON Polygon or Feature is also accepted.
    - number[]
  - `bbox` number[]: Alternative to polygon: [lon_min, lat_min, lon_max, lat_max] (WGS84).
  - `index` 'ndvi' | 'evi' | 'savi' | 'ndmi' | 'ndwi' | 'mndwi' | 'ndbi' | 'ndsi' | 'nbr' | 'iron-oxide' | 'clay' | 'ferrous', required: Which optical index to measure: ndvi, evi, savi, ndmi, ndwi, mndwi, ndbi, ndsi, nbr, iron-oxide, clay, ferrous.
  - `start` string, date, required: Start date YYYY-MM-DD (UTC). Clamped forward to 2015-06-27 if earlier.
  - `end` string, date, required: End date YYYY-MM-DD (UTC).
  - `max_scenes` integer: Cap on scenes measured in this call. Server maximum 24.
  - `max_cloud_cover` number: Scene cloud-cover ceiling in percent. Default 30.
  - `estimate_only` boolean: True = free: return the scene count, date span and token cost WITHOUT measuring or charging.

## Response `200`

The measured series, or the free estimate when estimate_only was set.

- object
  - `summary` string
  - `series` object: Present when a measurement ran: samples, skipped, trend, notes.
  - `estimate` object: Present for estimate_only.
  - `meta` object

## Other responses

- `400`: Error response with a stable machine-readable code.
- `401`: Error response with a stable machine-readable code.
- `402`: Error response with a stable machine-readable code.
- `403`: Error response with a stable machine-readable code.
- `429`: Error response with a stable machine-readable code.

---

[API](https://skmtc.dev/offnadir-delta/apis/off-nadir-delta-api.md) · [All operations](https://skmtc.dev/offnadir-delta/apis/off-nadir-delta-api/llms.txt) · [OpenAPI document](https://skmtc.dev/offnadir-delta/apis/off-nadir-delta-api/revisions/5cf3f2bed5a2?raw)
