📡 API Reference · v1

SAGRIS ODC API Documentation

Complete reference for integrating with the SAGRIS Open Data Cube API — covering STAC catalog search, timeseries analysis, authentication, rate limits, and compatible client libraries.

Base URL https://odcube.landimage.info

Overview #

The SAGRIS ODC exposes two complementary API surfaces: a STAC 1.0 catalog API for dataset discovery and metadata retrieval, and a custom Analysis API for server-side backscatter aggregation over user-supplied geometries. Both require an API key.

The data cube holds 850,000+ analysis-ready Sentinel-1 GRD datasets covering Europe from 2015 to the present, in both VH and VV polarisations. Backscatter values are expressed as gamma-naught (γ⁰) × 10³ integer DN — multiply by 0.001 to obtain linear γ⁰.

ℹ️
OGC Compliance. The STAC endpoint is fully OGC API – Features compliant and can be consumed directly by QGIS 3.x (built-in STAC plugin), ArcGIS Pro, pystac-client, and any GDAL ≥ 3.4 installation.

Authentication #

All API requests must include a valid API key. Keys are issued per user account and tied to a rate-limit tier. Register at odcube.landimage.info/register to obtain a free key.

Header-based authentication (recommended)

HTTP Header
X-Api-Key: YOUR_API_KEY

Query parameter fallback

URL
https://odcube.landimage.info/stac/?api_key=YOUR_API_KEY
⚠️
Security note. Prefer the X-Api-Key header over query parameters to avoid keys appearing in server logs or browser history.

Base URL & Versioning #

All endpoints are served from a single base URL. The STAC API follows the STAC 1.0.0 specification. The Analysis API is versioned implicitly via the /api/ path prefix.
SurfacePath prefixSpec
STAC Catalog API/stac/STAC 1.0.0 · OGC API Features
Analysis / Timeseries API/api/Custom REST · JSON
ODC Explorer UI/productsdatacube-explorer
STAC Browser UI/browserSTAC Browser v5

STAC Root Catalog #

The root catalog endpoint returns the top-level STAC landing page with links to all available collections and conformance declarations.
GET /stac/ Root catalog

Returns a STAC Catalog object with links to collections, the search endpoint, and conformance classes.

curl
curl -H "X-Api-Key: YOUR_API_KEY" \
  https://odcube.landimage.info/stac/

Collections #

Collections group datasets by polarisation. Each collection contains all temporal acquisitions for a given SAR polarisation channel across the European coverage area.
GET /stac/collections List all collections

Returns a JSON array of all available STAC collections with their spatial and temporal extents.

GET /stac/collections/{collection_id} Single collection

Returns the full metadata record for one collection, including spatial extent (WGS84 bounding box), temporal extent, and available asset types.

ParameterTypeRequiredDescription
collection_idstringrequiredCollection identifier — see Collection Names below.
curl
curl -H "X-Api-Key: YOUR_API_KEY" \
  https://odcube.landimage.info/stac/collections/sagris_s1_rtc_vh_img_europe

Items & Search #

Individual Sentinel-1 acquisitions are represented as STAC Items. Use the search endpoint to filter by bounding box, datetime range, and collection.
GET /stac/collections/{collection_id}/items List items in collection
Query paramTypeDescription
bboxstringoptionalComma-separated bounding box: min_lon,min_lat,max_lon,max_lat in WGS84.
datetimestringoptionalSingle date or interval: 2024-03-01/2024-08-31. ISO 8601.
limitintegeroptionalPage size. Default 10, max 500.
tokenstringoptionalPagination cursor from previous response context.next.
POST /stac/search Cross-collection search

OGC-compliant STAC search across one or more collections. Accepts a JSON body.

Body fieldTypeDescription
collectionsstring[]optionalArray of collection IDs to search. Omit to search all.
bboxnumber[]optional[min_lon, min_lat, max_lon, max_lat]
datetimestringoptionalDate or interval string. ISO 8601.
intersectsGeoJSONoptionalGeoJSON geometry to intersect. Use instead of bbox for polygon queries.
limitintegeroptionalMax items to return. Default 10, max 500.
Example
Python curl
from pystac_client import Client

catalog = Client.open(
    "https://odcube.landimage.info/stac/",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
results = catalog.search(
    collections=["sagris_s1_rtc_vh_img_europe"],
    bbox=[23.5, 54.2, 26.0, 56.5],
    datetime="2024-04-01/2024-07-31",
    max_items=100
)
for item in results.items():
    print(item.id, item.datetime, item.assets["vh"].href)

Assets & Downloads #

Each STAC Item contains asset links for the raster data file, a PNG thumbnail, and the source metadata. Assets are served as GeoTIFF files in EPSG:4326.
Asset keyTypeDescription
vhimage/tiffVH polarisation GeoTIFF, γ⁰ × 10³ DN, EPSG:4326, ~20m resolution.
vvimage/tiffVV polarisation GeoTIFF, γ⁰ × 10³ DN, EPSG:4326, ~20m resolution.
thumbnailimage/png256×256 PNG preview image, contrast-stretched.
metadataapplication/yamlEO3-compliant YAML dataset descriptor used for ODC ingestion.
ℹ️
Direct GeoTIFF access is available to Professional tier and above. Free tier accounts receive STAC metadata and thumbnail access only. Asset href URLs will return HTTP 403 for Free tier requests.

POST /api/timeseries #

The core analysis endpoint. Submit a GeoJSON polygon geometry and a date range; receive a per-acquisition time series of γ⁰ backscatter statistics aggregated over all pixels within the polygon. Available to all tiers.
POST /api/timeseries Backscatter time series

Request body (JSON)

FieldTypeDescription
geometryGeoJSON objectrequiredGeoJSON Polygon or MultiPolygon in WGS84 (EPSG:4326). Maximum area 50 km².
polarisationstringrequired"VH" or "VV". Case-insensitive.
date_fromstringrequiredStart date, inclusive. ISO 8601: "2024-03-01".
date_tostringrequiredEnd date, inclusive. ISO 8601: "2024-08-31".
statsstring[]optionalStatistics to include. Default: ["mean","median","std","count"]. Options: mean, median, std, min, max, count, valid_pct.
Request
Python curl R
import requests, pandas as pd

r = requests.post(
    "https://odcube.landimage.info/api/timeseries",
    headers={"X-Api-Key": "YOUR_API_KEY"},
    json={
        "geometry": {
            "type": "Polygon",
            "coordinates": [[[24.10,54.68],[24.12,54.68],
                               [24.12,54.70],[24.10,54.70],
                               [24.10,54.68]]]
        },
        "polarisation": "VH",
        "date_from": "2024-03-01",
        "date_to":   "2024-08-31",
        "stats": ["mean", "std", "count"]
    }
)
df = pd.DataFrame(r.json()["results"])
df["date"] = pd.to_datetime(df["date"])
df["mean_linear"] = df["mean"] * 0.001  # DN → linear γ⁰
print(df.head())

Response Format #

The timeseries endpoint returns a JSON object with a results array — one entry per Sentinel-1 acquisition that intersects the geometry and date range.
Response · 200 OK
{
  "status":      "ok",
  "collection":  "sagris_s1_rtc_vh_img_europe",
  "polarisation":"VH",
  "pixel_size_m": 20,
  "units":       "γ⁰ × 10³ DN  (multiply by 0.001 → linear γ⁰)",
  "results": [
    {
      "date":       "2024-03-04",
      "mean":       312,
      "median":     298,
      "std":        87,
      "min":        42,
      "max":        1204,
      "count":      1847,
      "valid_pct":  98.4
    },
    // ... one object per acquisition date
  ]
}
FieldTypeDescription
datestringAcquisition date. ISO 8601 YYYY-MM-DD.
meanintegerMean γ⁰ × 10³ over all valid pixels in the polygon.
medianintegerMedian γ⁰ × 10³.
stdintegerStandard deviation γ⁰ × 10³.
min / maxintegerMinimum and maximum pixel values within the polygon.
countintegerTotal number of valid pixels used in the aggregation.
valid_pctfloatPercentage of pixels with valid (non-nodata) values.

Collection Names #

Use these exact identifiers in STAC queries and API requests. Collections follow the naming convention sagris_s1_rtc_{polarisation}_img_{region}.
Collection IDPolarisationCoveragePeriod
sagris_s1_rtc_vh_img_europeVHEurope (~6.5M km²)2015 – present
sagris_s1_rtc_vv_img_europeVVEurope (~6.5M km²)2015 – present
🔭
Planned collections. Africa and Middle East regional collections are in preparation and will follow the same naming convention with _africa and _mideast suffixes.

Rate Limits & Quotas #

API usage is throttled per API key according to the account tier. Exceeding limits returns HTTP 429 with a Retry-After header.
TierAPI requests / monthImages accessed / monthMax geometry areaQueue priority
Free5001,00010 km²Standard
Professional10,00025,00050 km²Priority
EnterpriseUnlimited100,000+200 km²Dedicated pool
InstitutionalCustomCustomCustomNamed contact
📊
Current usage and remaining quota are returned in every API response as HTTP headers: X-RateLimit-Remaining, X-RateLimit-Reset.

Error Codes #

All errors return a JSON body with error and message fields alongside the HTTP status code.
HTTP StatusError codeDescription
400invalid_geometryGeoJSON is malformed or not a valid Polygon/MultiPolygon.
400invalid_date_rangedate_from is after date_to, or dates are outside 2015–present.
400area_too_largePolygon area exceeds the tier limit. Reduce geometry or upgrade tier.
401missing_api_keyNo X-Api-Key header or api_key query parameter provided.
401invalid_api_keyKey does not exist or has been revoked.
403asset_access_deniedDirect GeoTIFF asset access requires Professional tier or above.
429rate_limit_exceededMonthly quota exhausted. Check Retry-After header or upgrade tier.
500internal_errorServer-side processing error. Contact info@geomatrix.lt with the request ID from the response.
Error response example
{
  "status":    "error",
  "error":     "area_too_large",
  "message":   "Polygon area 78.3 km² exceeds the 50 km² limit for Professional tier.",
  "request_id":"req_a1b2c3d4"
}

Compatible Clients #

The STAC API is interoperable with all standard OGC and STAC-compatible clients.
ClientTypeHow to connect
pystac-clientPythonClient.open("https://odcube.landimage.info/stac/", headers={"X-Api-Key":"..."})
QGIS 3.xDesktop GISPlugins → STAC API Browser → New connection → URL: https://odcube.landimage.info/stac/, auth header.
ArcGIS ProDesktop GISAdd STAC connection via Living Atlas → Custom STAC URL, set X-Api-Key in header settings.
GDAL / rasterioLibraryUse STAC item asset href directly with GDAL_HTTP_HEADER_FILE env var for auth.
Google ColabNotebookUse requests or pystac-client — no installation of GDAL/PROJ required for STAC metadata queries.
R (httr)RSee R code example in the timeseries section above.
💬
Need help integrating?
Open a support request at info@geomatrix.lt — include your API key tier, language/client, and a minimal reproducible example. Professional and Institutional tier accounts receive priority support with a 48h response SLA.