Who this is for: the analyst who works with the data outside Nebli Environment, and the developer who connects a dashboard or a data platform to it.
Before you start:
- Raw exports need the Analyst role or above (People and access).
- API keys are created and revoked by an Administrator.
Raw export of a site
Export raw readings, on the table, prepares every reading of one site over a period: the last 24 hours, 7, 30 or 90 days. Choose the Site and the Period, then Prepare. The table's own Export table, which downloads exactly what you see, is described in Map, node page and table.
The export is prepared in the background. You find it in your menu under Exports, with its status:
| Status | Meaning |
|---|---|
| Queued; prepared in the background. | Waiting to start. |
| Being prepared… | Running. |
| Ready: {n} readings. Available until {date}. | Ready to download. |
| It could not be prepared. Ask for it again. | It failed after several tries. |
A ready export can be downloaded for 7 days.
It comes as two CSV files:
- Readings (CSV). Every reading of every node of the site in the period, suspect readings included, one row each:
node_id, node, channel, value, unit, device_time_utc, arrived_at_utc, quality. Times are UTC with the offset.qualityisraw,correctedorsuspect. A gap is a gap: nothing is filled in. - % valid data (CSV). For each node, channel and day (in the site's time zone): how many readings were expected at the node's reporting interval, how many arrived and were not suspect, and the share:
node_id, node, channel, day_site_local, expected, valid, valid_percent.
The export holds what had arrived when you asked for it. A cell that starts like a spreadsheet formula is prefixed with a single quote, so a typed name can never run in your spreadsheet.
Limits:
- You can have one export being prepared at a time: "An export of yours is already being prepared; wait for it to finish."
- An organisation can request 5 raw exports in any 24 hours: "Your organisation has used today's exports."
The read-only API
The API reads your organisation's nodes and readings as JSON. It cannot change anything.
Create a key
- Go to Settings › API keys and choose New key.
- Give it a name, for example "Environment department dashboard".
- Copy the key from the card. It is shown this once and never again.
A key reads your whole organisation. Its card shows Scope: read only, when it was created and when it was last used. Revoke asks first ("Revoke the key {name}? Its next request will be refused.") and takes effect on the key's next request. Revoked keys stay listed for 30 days.
Make a request
Send the key in the Authorization header, never in the address:
curl -H "Authorization: Bearer $NEBLI_ENV_KEY" \
"https://env.nebli.ai/api/v1/nodes?lang=en"
Only GET exists. There are three routes:
| Route | Returns |
|---|---|
GET /api/v1/nodes |
Every node of your organisation with its current values. |
GET /api/v1/nodes/{nodeId} |
One node. |
GET /api/v1/nodes/{nodeId}/readings |
One channel of one node over a time range. |
lang=en or lang=es sets the language of names and messages.
Readings
GET /api/v1/nodes/{nodeId}/readings?channel=pm25&from=2026-10-01T00:00:00-05:00&to=2026-10-02T00:00:00-05:00
channel,fromandtoare required.fromandtoare dates and times with their offset. A range longer than 31 days is refused.- Without
period, you get raw points, up to 1,440 a page. When there are more, the answer hasnext; send it back ascursorfor the next page. - With
period=1h,8hor24h, you get averaged points in one page, each withcount, the number of readings it was made from. quality=correctedreturns the corrected series where there is one; the default israw. A series is never a mix of the two.- Suspect readings are left out. A period with no readings returns no points, never zeros.
Each point has time (the device time, or the start of an averaged period), value (or textValue for a channel that takes words), unit and quality.
Limits and answers
- Each key can make 60 requests a minute. Every answer carries
X-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Reset. Past the limit, the answer is429withRetry-After. - A missing, malformed, unknown or revoked key gets
401: "API key not valid or revoked." - A node that does not exist and a node of another organisation get the same
404. - A request out of bounds (a range, a period or a cursor) gets
400. 503means try again.
What the API does not include
- Alerts. The API reads nodes and readings only.
- The air-quality indices (ICA, IBOCA). They are in the console and in Export table, not in the API.
Next
- Map, node page and table: the table export of exactly what you see.
- Connecting sensors: how readings get in.