{"openapi":"3.1.0","info":{"title":"Life oracle API","version":"0.1.0","description":"Seven readings and one verdict per place, plus ingest endpoints for sound recorders and soil probes. Auth: `Authorization: Bearer <key>`. Keys: admin (env), STEWARD/VERIFIER/CONSUMER keys (lo_key_…), device tokens (lo_dev_…).","license":{"name":"Apache-2.0"}},"servers":[{"url":"https://life.oncra.org/api/v1"}],"paths":{"/places":{"get":{"summary":"List public places","parameters":[{"name":"format","in":"query","schema":{"type":"string","enum":["json","geojson"]}}],"responses":{"200":{"description":"List or FeatureCollection"}}},"post":{"summary":"Register a place (STEWARD or admin)","security":[{"bearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","geometry"],"properties":{"name":{"type":"string"},"geometry":{"description":"GeoJSON Polygon or MultiPolygon (WGS84)"},"landUse":{"type":"string"},"country":{"type":"string"},"description":{"type":"string"},"public":{"type":"boolean"}}}}}},"responses":{"201":{"description":"Place + one-time steward key; satellite backfill queued"}}}},"/places/{id}":{"get":{"summary":"Place detail: readings, verdict, satellite series, devices, visits","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"id or slug"}],"responses":{"200":{"description":"ok"}}},"patch":{"summary":"Update place metadata","security":[{"bearer":[]}],"responses":{"200":{"description":"ok"}}},"delete":{"summary":"Delete (admin)","security":[{"bearer":[]}],"responses":{"200":{"description":"ok"}}}},"/places/{id}/satellite":{"get":{"summary":"NDVI observations","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"format","in":"query","schema":{"type":"string","enum":["json","csv"]}}],"responses":{"200":{"description":"ok"}}}},"/places/{id}/readings":{"get":{"summary":"All readings by period","responses":{"200":{"description":"ok"}}},"post":{"summary":"Recompute readings now (steward/verifier/admin)","security":[{"bearer":[]}],"responses":{"200":{"description":"readings + verdict"}}}},"/places/{id}/devices":{"get":{"summary":"Devices on a place","responses":{"200":{"description":"ok"}}},"post":{"summary":"Register a device; returns a one-time device token","security":[{"bearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["kind","model"],"properties":{"kind":{"type":"string","enum":["SOUND","SOIL","CAMERA","OTHER"]},"model":{"type":"string"},"devEui":{"type":"string","description":"16 hex chars, LoRaWAN devices"},"lat":{"type":"number"},"lon":{"type":"number"},"heightM":{"type":"number"},"depthCm":{"type":"integer"},"installedAt":{"type":"string","format":"date-time"},"mapping":{"type":"object","description":"decoded_payload field names: {vwc, tempC, ec, co2Ppm}"}}}}}},"responses":{"201":{"description":"device + token"}}}},"/places/{id}/visits":{"get":{"summary":"Visits","responses":{"200":{"description":"ok"}}},"post":{"summary":"File a visit (VERIFIER/admin)","security":[{"bearer":[]}],"responses":{"201":{"description":"ok"}}}},"/ingest/sound":{"post":{"summary":"Deliver detections and/or acoustic indices (device token)","security":[{"bearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"detections":{"type":"array","items":{"type":"object","required":["ts","species","confidence"],"properties":{"ts":{"type":"string","format":"date-time"},"species":{"type":"string"},"scientific":{"type":"string"},"confidence":{"type":"number"},"detector":{"type":"string","example":"birdnet-2.4"},"durationS":{"type":"number"}}}},"indices":{"type":"array","items":{"type":"object","required":["ts"],"properties":{"ts":{"type":"string","format":"date-time"},"windowS":{"type":"integer"},"aci":{"type":"number"},"adi":{"type":"number"},"aei":{"type":"number"},"bio":{"type":"number"},"ndsi":{"type":"number"},"biophony":{"type":"number"},"anthrophony":{"type":"number"},"spl":{"type":"number"}}}}}}}}},"responses":{"201":{"description":"counts"}}}},"/ingest/soil":{"post":{"summary":"Deliver soil readings (device token)","security":[{"bearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["readings"],"properties":{"readings":{"type":"array","items":{"type":"object","required":["ts"],"properties":{"ts":{"type":"string","format":"date-time"},"depthCm":{"type":"integer"},"vwc":{"type":"number","description":"percent"},"tempC":{"type":"number"},"ec":{"type":"number","description":"µS/cm"},"co2Ppm":{"type":"number"},"fluxUmol":{"type":"number"}}}}}}}}},"responses":{"201":{"description":"count"}}}},"/ingest/ttn":{"post":{"summary":"The Things Stack webhook (uplink messages). Auth with a device token, or a STEWARD/ADMIN key + registered DevEUI.","security":[{"bearer":[]}],"responses":{"201":{"description":"stored"},"422":{"description":"no soil fields recognised; set device.mapping"}}}},"/keys":{"post":{"summary":"Create an API key (admin)","security":[{"bearer":[]}],"responses":{"201":{"description":"one-time key"}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}}}}