Send stream events
Post events to a stream when the data is not a device. Same body shape, its own token, no status field.
A stream carries data that does not come from one device. Use it for a spreadsheet export, a reading from another system, or a manual entry.
What a stream is#
A stream is a data source with its own id and its own token. It has no online or offline state, and it never appears in a device's status history. A stream can still be the data source behind a dashboard widget, and it can still be a trigger target.
The endpoint#
POST https://ingest.logable.app/streams/<STREAM_ID>/ingest
Authorization: Bearer <STREAM_TOKEN>
Content-Type: application/json<STREAM_ID> is the stream's UUID. <STREAM_TOKEN> is the token Logable showed once when you created the stream.
The body#
| Field | Type | Required | Description |
|---|---|---|---|
| timestamp | string | No | ISO 8601. Omit it and the server uses its own clock. |
| data | object | Yes | The event itself. Field names come from the stream's own schema, not a device type. |
| metadata | object | No | Anything else you want stored with the event. |
Validation is lenient. A field the stream's schema does not define is still stored. A field the schema does define is rejected only if its type is wrong. The custom-key limits on Send a field the device type does not define do not apply here. That rule is for devices only.
Over MQTT#
Publish to the stream's own topic, at QoS 1.
streams/<STREAM_ID>/dataThe message body is the same JSON the HTTP endpoint takes.
Example#
curl -X POST https://ingest.logable.app/streams/<STREAM_ID>/ingest \
-H "Authorization: Bearer <STREAM_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"timestamp": "2026-07-01T10:00:00.000Z",
"data": {
"shift": "Shift 2",
"note": "No faults reported"
}
}'{
"timestamp": "2026-07-01T10:00:00.000Z",
"data": {
"shift": "Shift 2",
"note": "No faults reported"
}
}Limits#
A stream accepts 100 events per second. See Limits for every other bound.