Open app

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

Requests need a write-scoped key — anything else gets 403. Gzip is supported via Content-Encoding: gzip, and the 5 MB body / 10,000 points-per-batch caps apply (see Limits).

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_id creates a new device in the fleet
  • Metric names — use <subsystem>.<metric> (e.g. motor.rpm, gps.latitude)