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",
    "name": "GTM West Texas #4",
    "latitude": 31.4523,
    "longitude": -103.1234,
    "status": "active",
    "timezone": "America/Chicago",
    "last_event_at": "2026-05-06T14:22:11"
  },
  ...
]
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",
      "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
      }
    }
  ]
}

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.