HTTP (Microcontrollers)
For devices without Python — ESP32, Arduino, bare-metal firmware, or any platform with an HTTP client. POST directly to the ingest endpoint.
Ingest URL: https://gateway.plexus.company/ingest
Auth: x-api-key: YOUR_API_KEY
Send a metric
curl -X POST https://gateway.plexus.company/ingest \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"source_id": "device-01",
"points": [
{ "metric": "battery.voltage", "value": 12.4 }
]
}'Send a batch
Multiple points per request — strongly recommended on constrained hardware:
curl -X POST https://gateway.plexus.company/ingest \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"source_id": "device-01",
"points": [
{ "metric": "battery.voltage", "value": 12.4 },
{ "metric": "battery.current_ma", "value": 340 },
{ "metric": "sensor.temperature_c", "value": 23.5 },
{ "metric": "sensor.humidity_pct", "value": 54.1 }
]
}'Send an event
For faults, state changes, or any non-numeric payload, add "class": "event":
curl -X POST https://gateway.plexus.company/ingest \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"source_id": "device-01",
"points": [
{
"metric": "device.fault",
"value": { "code": "SENSOR_TIMEOUT", "sensor": "imu" },
"class": "event"
}
]
}'Events appear in the Logs endpoint, separate from metrics.
With a timestamp
Include "timestamp" (Unix milliseconds) if your device has a real-time clock.
Without it, Plexus uses server receive time:
{ "metric": "battery.voltage", "value": 12.4, "timestamp": 1716201600000 }Best practices
- Batch when possible — minimizes radio/network overhead and latency
- Buffer locally — queue points during connectivity loss and flush on reconnect
- Use consistent source IDs — changing
source_idcreates a new device in the fleet - Metric names — use
<subsystem>.<metric>(e.g.motor.rpm,gps.latitude)
Last updated on