API
STAC 1.0, no dialect
If it works against another STAC catalogue it works here. The extensions we implement are listed in the landing page conformance array.
$ curl -s 'https://api.mirnl.13381338.xyz/search' -d @query.json
{"type":"FeatureCollection","numberMatched":1240,
"features":[{"id":"S2B_32UNB_20260802_L2A",
"assets":{"B08":{"href":"https://data…/B08.tif"}}}]}
200 OK · 84 ms
Endpoints
GET/Landing page with conformance classes
GET/collectionsList collections
GET/collections/{id}Collection metadata and extent
GET/collections/{id}/itemsItems in a collection, paginated
GET/collections/{id}/items/{item}One item with all assets
POST/searchCross-collection search with CQL2 filters
POST/ordersBulk order: a delivery manifest for many assets
GET/orders/{id}Order status and signed download URLs
POST/subscriptionsPush new matching scenes to a webhook
GET/queryablesFields available to CQL2 filters
Examples
query.json
{
"collections": ["sentinel-2-l2a"],
"bbox": [8.1, 49.2, 9.4, 50.1],
"datetime": "2026-04-01/2026-09-30",
"filter": {"op": "<=", "args": [
{"property": "eo:cloud_cover"}, 20]},
"limit": 500
}bash
curl -X POST https://api.mirnl.13381338.xyz/orders \
-H "Authorization: Bearer $TG_TOKEN" \
-d '{"search": {"collections":["sentinel-2-l2a"],
"bbox":[8.1,49.2,9.4,50.1],
"datetime":"2026-04-01/2026-09-30"},
"assets":["B04","B08","SCL"],
"delivery":"manifest"}'
# → 1,240 items · 4.1 TB · manifest ready in ~30spython
from pystac_client import Client
cat = Client.open('https://api.mirnl.13381338.xyz')
search = cat.search(
collections=['sentinel-2-l2a'],
bbox=[8.1, 49.2, 9.4, 50.1],
datetime='2026-04-01/2026-09-30',
query={'eo:cloud_cover': {'lt': 20}},
)
print(search.matched(), 'scenes')Bulk orders are the polite way to move terabytes. An order returns a manifest of signed URLs plus a checksum file, so you can hand it to
aria2c or rclone and saturate whatever line you have. Ad-hoc parallel scraping of the item endpoints gets rate limited; orders do not.