CBOT™ Sensor REST API

Pull near-real-time corrosion, environmental, and telemetry readings from your CBOT™ sensor fleet — designed for nightly ETL jobs and on-demand integration with internal databases and dashboards.

Authentication

All requests require a customer-scoped API token. Tokens are issued per organization — contact your account manager to provision one. Send the token as a bearer credential:

Authorization: Bearer <your_token>

Tokens are scoped to the sensors your organization owns. A request will only ever return data for sensors you are entitled to see. Disabled tokens return 403; missing or invalid tokens return 401.

GET /api/v1/cbot/sensors

Returns the list of CBOT sensors your token can access. Use this to enumerate sensors before fetching readings.

curl -H "Authorization: Bearer $TOKEN" \ https://secure.engineeringdirector.com/api/v1/cbot/sensors
[
  {
    "serial_no": "CBOT-0123",
    "hash_id": "a1b2c3d4e5",
    "iccid": "89014103211118510720",
    "name": "GTM West Texas #4",
    "model_id": 162,
    "model": "CBOT.2023.07-V7",
    "latitude": 31.4523,
    "longitude": -103.1234,
    "status": "active",
    "timezone": "America/Chicago",
    "last_event_at": "2026-05-06T14:22:11"
  },
  ...
]
Field Type Description
serial_no string Sensor serial number. Stable identifier; use this to join readings to sensors.
hash_id string Internal unique identifier for the sensor.
iccid string ICCID of the sensor's cellular SIM (mobile device identifier). null if no SIM is associated.
name string Human-readable sensor name.
model_id integer Internal model identifier. null if no model is assigned.
model string Model name and version (e.g. CBOT.2023.07-V7). null if no model is assigned.
latitude, longitude number Sensor location in decimal degrees (WGS84).
status string Sensor status (e.g. active).
timezone string IANA timezone the sensor's local timestamps are expressed in.
last_event_at ISO-8601 datetime Timestamp of the most recent event seen for this sensor. null if no events yet.
GET /api/v1/cbot/readings

Returns sensor readings (events with their measurements), cursor-paginated by event ID. Use the since parameter for incremental daily pulls.

Name Type Description
since ISO-8601 datetime Optional. Only return readings with event_at ≥ since.
serial_no string Optional. Limit to readings from a single sensor.
limit integer Page size. Default 1000, max 5000.
cursor integer Optional. Pass the next_cursor from a prior response to fetch the next page.
curl -H "Authorization: Bearer $TOKEN" \ 'https://secure.engineeringdirector.com/api/v1/cbot/readings?since=2026-05-01T00:00:00&limit=500'
{
  "next_cursor": 8843211,
  "has_more": true,
  "readings": [
    {
      "event_id": 8843200,
      "serial_no": "CBOT-0123",
      "event_at": "2026-05-06T14:22:11",
      "event_at_utc": "2026-05-06T19:22:11+00:00",
      "battery_voltage": 3.87,
      "signal_quality_db": -91,
      "gps": {
        "lat": 31.4523, "lon": -103.1234,
        "hdop": 1.2, "sats": 9
      },
      "measurements": {
        "SENSOR_TEMP_C": 24.3,
        "SENSOR_HUMIDITY_PCT": 41.0,
        "IMPEDANCE_AVG": 12345.6,
        "IMPEDANCE_30KHZ": 11200.0,
        "IMPEDANCE_80KHZ": 13500.2,
        "MAG_X": 12.4, "MAG_Y": -3.1, "MAG_Z": 47.0, "MAG_F": 48.7
      }
    }
  ]
}

event_at is the sensor's local timestamp (in the sensor's timezone); event_at_utc is the same instant expressed in UTC.

When has_more is true, the response includes next_cursor. Pass it back as the cursor param on the next request to continue paging. When has_more is false, you have all readings up to the current moment.

Recommended daily ETL pattern
  1. Persist the highest event_id you have already ingested as a watermark in your ETL state store.
  2. On each run, call /api/v1/cbot/readings?cursor=<watermark>&limit=5000.
  3. Insert the returned rows into your destination table.
  4. While has_more is true, repeat with the new next_cursor.
  5. Once has_more is false, save the largest event_id from the batch as the new watermark.
FME Safe integration

In FME, configure an HTTPCaller transformer with:

  • Request URL: https://secure.engineeringdirector.com/api/v1/cbot/readings
  • HTTP Method: GET
  • Query parameters: since, limit, cursor as needed
  • Custom headers: Authorization: Bearer <your_token>
  • Response body type: JSON — flatten with JSONFlattener on the readings[] array.

Wire the resulting feature stream into your destination writer (Postgres, SQL Server, etc.). Use the event_id as the natural primary key for upserts.

Errors & status codes
  • 401 — missing or invalid token
  • 403 — token has been disabled
  • 400 — malformed query parameter
  • 404 — resource not found
Need a token, a higher rate limit, or have a question? Contact us.