Senmo MAI API
Lees platforms, devices, metingen en lifecycle events, of stuur nieuwe metingen en events in vanuit je eigen systeem. Alle ingest verschijnt binnen een seconde op de live feed en de kaart via realtime broadcast.
https://senmo-mai.lovable.appQuickstart
In drie stappen aangesloten. Read endpoints kun je meteen uitproberen, ingest vereist een API key.
- 1Probeer een open GET callBijvoorbeeld
GET /api/public/v1/platforms. Geen key nodig. - 2Vraag een API key aanNeem contact op met de beheerder. Je krijgt een key met scopes op maat, bijvoorbeeld alleen
ingest:measurements. - 3Stuur je eerste batch metingenPOST naar
/api/public/ingest/measurementsmet headerX-API-Key. Je ziet de meting direct in de UI.
Authenticatie
Read endpoints zijn open. Ingest endpoints vereisen een API key per bron, met eigen scopes.
Stuur je key mee in de header X-API-Key, of als bearer token in Authorization. Iedere key is gebonden aan een set scopes.
X-API-Key: smk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# of gelijkwaardig:
Authorization: Bearer smk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxExterne UID (EUID)
Elk object en elke ingest-rij mag een eigen externe identifier meekrijgen, zodat je onze records altijd terug relateert aan jouw eigen dataset.
external_uid: de ID die jouw systeem al gebruikt, bijvoorbeeldSAP-EQ-000123ofMAX-DEV-4711.external_source: optioneel label van dat systeem, bijvoorbeeldsap,maximoofgis. Laat je het leeg, dan vullen wij automatisch de naam van jouw API key in.
# Vind ons device dat correspondeert met jouw Maximo-record
curl "https://senmo-mai.lovable.app/api/public/v1/devices?external_uid=MAX-DEV-4711&external_source=maximo"
# Alle platforms uit jouw SAP-koppeling
curl "https://senmo-mai.lovable.app/api/public/v1/platforms?external_source=sap"{
"devices": [
{
"id": "dev-radar-bsa",
"sublocation_id": "sub-bsa-01",
"name": "Radar BSA-1",
"type": "nautical_radar",
"external_uid": "MAX-DEV-4711",
"external_source": "maximo"
}
]
}Bij een tweede levering met dezelfde external_uid en external_source wordt de bestaande rij bijgewerkt in plaats van gedupliceerd.
Read endpoints
Publieke gegevens. Ideaal voor dashboards, integraties en analyses.
/api/public/v1/platformsLijst van alle offshore platforms met status en coƶrdinaten.
| Naam | Type | Beschrijving |
|---|---|---|
| external_uid | string | Vind een platform op jouw eigen externe UID. |
| external_source | string | Beperk tot een bepaalde bron, bijvoorbeeld sap of maximo. |
curl "https://senmo-mai.lovable.app/api/public/v1/platforms?external_uid=..."{
"platforms": [
{
"id": "BSA",
"name": "Borssele Alpha",
"operator": "TenneT",
"zone": "Borssele",
"grid_type": "AC 220kV",
"latitude": 51.7,
"longitude": 3.06,
"status": "operational",
"external_uid": "SAP-EQ-000123",
"external_source": "sap"
}
]
}/api/public/v1/devicesDevices per platform, inclusief geneste componenten en sensoren.
| Naam | Type | Beschrijving |
|---|---|---|
| platform_id | string | Filter op platform, bijvoorbeeld BSA. |
| external_uid | string | Vind een device op jouw eigen externe UID. |
| external_source | string | Beperk tot een bepaalde bron. |
curl "https://senmo-mai.lovable.app/api/public/v1/devices?platform_id=..."{
"devices": [
{
"id": "dev-radar-bsa",
"platform_id": "BSA",
"name": "Nautische radar BSA-1",
"type": "nautical_radar",
"external_uid": "MAX-DEV-4711",
"external_source": "maximo",
"components": [ { "id": "cmp-bsa-antenna", "name": "Antenna", "external_uid": "MAX-CMP-8802" } ],
"sensors": [ { "id": "sen-bsa-temp", "name": "Temperature", "unit": "celsius", "external_uid": "MAX-SEN-1201" } ]
}
]
}/api/public/v1/measurementsRecente metingen, filterbaar per sensor en tijdvenster.
| Naam | Type | Beschrijving |
|---|---|---|
| sensor_id | string | Filter op sensor id. |
| since | ISO 8601 | Alleen metingen vanaf dit tijdstip. |
| limit | number | Maximaal 1000 (default 100). |
curl "https://senmo-mai.lovable.app/api/public/v1/measurements?sensor_id=..."{
"measurements": [
{
"id": "01HZ...",
"sensor_id": "sen-17-temp",
"ts": "2026-07-02T09:00:00Z",
"value": 34.2,
"quality": "good",
"source": "ingest",
"external_uid": "SCADA-TS-9982371",
"external_source": "scada"
}
]
}/api/public/v1/eventsLifecycle events per object, of geheel.
| Naam | Type | Beschrijving |
|---|---|---|
| object_id | string | Filter op object (device, component, sensor, ...). |
| limit | number | Maximaal 500 (default 100). |
curl "https://senmo-mai.lovable.app/api/public/v1/events?object_id=..."{
"events": [
{
"id": "01HZ...",
"object_type": "device",
"object_id": "dev-radar-17a",
"event_type": "maintenance",
"title": "Cooling fan vervangen",
"severity": "low",
"occurred_at": "2026-07-01T13:24:00Z",
"maintenance_delta_days": 30,
"replacement_delta_days": 15,
"external_uid": "WO-2026-00815",
"external_source": "maximo"
}
]
}Ingest endpoints
Schrijf metingen, events of objecten weg. Vereist een API key met de juiste scope.
/api/public/ingest/measurementsBatch van maximaal 1000 metingen aanleveren. Verschijnt direct in de live feed.
curl -X POST "https://senmo-mai.lovable.app/api/public/ingest/measurements" \
-H "content-type: application/json" \
-H "x-api-key: smk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
--data '{
"measurements": [
{
"sensor_id": "sen-17-temp",
"ts": "2026-07-02T09:00:00Z",
"value": 34.2,
"quality": "good",
"external_uid": "SCADA-TS-9982371"
},
{ "sensor_id": "sen-17-heartbeat", "value": 1 }
]
}'{
"measurements": [
{
"sensor_id": "sen-17-temp",
"ts": "2026-07-02T09:00:00Z",
"value": 34.2,
"quality": "good",
"external_uid": "SCADA-TS-9982371"
},
{ "sensor_id": "sen-17-heartbeat", "value": 1 }
]
}{ "inserted": 2 }/api/public/ingest/eventsOnderhoud, incident of observatie op een object. Impact op onderhoud en vervanging worden verwerkt in de ledger.
curl -X POST "https://senmo-mai.lovable.app/api/public/ingest/events" \
-H "content-type: application/json" \
-H "x-api-key: smk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
--data '{
"object_type": "device",
"object_id": "dev-radar-17a",
"event_type": "maintenance",
"title": "Cooling fan vervangen",
"severity": "low",
"maintenance_delta_days": 30,
"replacement_delta_days": 15,
"external_uid": "WO-2026-00815",
"external_source": "maximo"
}'{
"object_type": "device",
"object_id": "dev-radar-17a",
"event_type": "maintenance",
"title": "Cooling fan vervangen",
"severity": "low",
"maintenance_delta_days": 30,
"replacement_delta_days": 15,
"external_uid": "WO-2026-00815",
"external_source": "maximo"
}{ "inserted": 1 }/api/public/ingest/objectsUpsert van platforms, sublocaties, devices, componenten en sensoren. Referentiƫle volgorde wordt automatisch aangehouden. Elke rij mag een external_uid meekrijgen.
curl -X POST "https://senmo-mai.lovable.app/api/public/ingest/objects" \
-H "content-type: application/json" \
-H "x-api-key: smk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
--data '{
"platforms": [ { "id": "BSA", "name": "Borssele Alpha", "latitude": 51.7, "longitude": 3.06, "external_uid": "SAP-EQ-000123" } ],
"sublocations": [ { "id": "sub-bsa-01", "platform_id": "BSA", "name": "Sensormast", "external_uid": "SAP-LOC-000123-M1" } ],
"devices": [ { "id": "dev-radar-bsa", "sublocation_id": "sub-bsa-01", "name": "Radar BSA-1", "type": "nautical_radar", "external_uid": "MAX-DEV-4711" } ],
"components": [ { "id": "cmp-bsa-antenna", "device_id": "dev-radar-bsa", "name": "Antenna", "external_uid": "MAX-CMP-8802" } ],
"sensors": [ { "id": "sen-bsa-temp", "component_id": "cmp-bsa-antenna", "name": "Temperature", "unit": "celsius", "external_uid": "MAX-SEN-1201" } ]
}'{
"platforms": [ { "id": "BSA", "name": "Borssele Alpha", "latitude": 51.7, "longitude": 3.06, "external_uid": "SAP-EQ-000123" } ],
"sublocations": [ { "id": "sub-bsa-01", "platform_id": "BSA", "name": "Sensormast", "external_uid": "SAP-LOC-000123-M1" } ],
"devices": [ { "id": "dev-radar-bsa", "sublocation_id": "sub-bsa-01", "name": "Radar BSA-1", "type": "nautical_radar", "external_uid": "MAX-DEV-4711" } ],
"components": [ { "id": "cmp-bsa-antenna", "device_id": "dev-radar-bsa", "name": "Antenna", "external_uid": "MAX-CMP-8802" } ],
"sensors": [ { "id": "sen-bsa-temp", "component_id": "cmp-bsa-antenna", "name": "Temperature", "unit": "celsius", "external_uid": "MAX-SEN-1201" } ]
}{
"upserted": { "platforms": 1, "sublocations": 1, "devices": 1, "components": 1, "sensors": 1 }
}Foutafhandeling
Alle fouten komen terug als JSON met een error veld. HTTP status geeft de aard aan.
| Status | Betekenis | Actie |
|---|---|---|
| 200 | OK | Verwerkt zoals verwacht. |
| 207 | Multi-status | Gedeeltelijk succes bij bulk upsert. Zie response body per item. |
| 400 | Bad request | Validatie mislukt of ongeldige JSON. Controleer het schema. |
| 401 | Unauthorized | Ontbrekende of onbekende API key. |
| 403 | Forbidden | Key mist de vereiste scope. |
| 429 | Too many requests | Rate limit geraakt. Bouw exponentiele backoff in. |
| 500 | Server error | Tijdelijk probleem. Probeer opnieuw en meld het aan. |
{
"error": "Validation failed",
"details": [
{ "path": ["measurements", 0, "sensor_id"], "message": "Required" }
]
}mai-live broadcast kanaal: elke succesvolle ingest wordt binnen 1 seconde uitgezonden.