Export your data
Your data is yours. Export any slice of readings and annotations as an analysis-ready bundle, whenever you want it.
Bulk export, asynchronously
An ExportJob runs in the background. You pick a scope (a site, device, component, or sensor), a time range, and what to include — readings, annotations, or both. The job moves through PENDING → RUNNING → READY, and when it's ready you get a presigned download link.
The bundle is a ZIP of Parquet files plus a JSON manifest: readings.parquet (with columns derived from each sensor's profile), annotations.parquet, and manifest.json describing the scope, window, and counts. Parquet drops straight into data tooling, so reshaping for a downstream system is a customer-side script — the platform hands you a clean, neutral bundle.
Nothing silently dropped
Structured readings that fail validation aren't lost — they land in PayloadQuarantine, where you can inspect why a payload was rejected (unknown sensor, missing profile, out-of-range value) and discard it. It's a diagnostic record, so you can see exactly what a device sent and why it didn't land.
In the app
Submit and download exports under Exports (/{slug}/admin/exports), and review rejected payloads under Quarantine (/{slug}/admin/quarantine).
In the API
POST /api/v1/exports— submit an export jobGET /api/v1/exports/{id}— check status; the response includes a download URL onceREADYGET /api/v1/exports— list your jobs;DELETE …/{id}removes a finished exportGET /api/v1/admin/quarantine— inspect rejected payloads;DELETE …/{id}to discard
Download links are presigned and time-limited (about 24 hours). Re-fetch the job to mint a fresh link.