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:
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.
[
{
"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. |
{
"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
- Persist the highest
event_idyou have already ingested as a watermark in your ETL state store. - On each run, call
/api/v1/cbot/readings?cursor=<watermark>&limit=5000. - Insert the returned rows into your destination table.
- While
has_moreis true, repeat with the newnext_cursor. - Once
has_moreis false, save the largestevent_idfrom 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,cursoras 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 token403— token has been disabled400— malformed query parameter404— resource not found