telematric.
BUILD WITH TELEMATRIC

Build with Telematric APIs.

Device infrastructure, supported software connections and energy/AI services for your own application.

Get your API key

Choose your API workflow.

#

One workspace for your application's device data, supported source connections and AI operations. Your backend holds the API key; your application keeps its users, interface and business logic.

01

Try synthetic equipment

Start with the sandbox. No payment or SAP/Maximo credentials required. Create a key with only sandbox:read.

02

Choose a capability

Use the contracts below. A directory listing does not grant access or imply that a future connector is implemented.

03

Connect your application

Keep credentials on your server, confirm permissions and source identities, and handle paginated results and API errors.

Service familyStart hereWhat your application supplies
Device infrastructureDevices, telemetry, commands, OTA, eventsCompatible firmware, valid device credentials, units and measurement timestamps. Physical devices require active Device cloud access.
Operational connectionsSAP / Maximo, Giswater, laboratory recordsApproved source endpoint, dedicated credentials, supported schema and explicit identity mappings. Source systems remain authoritative.
Energy & AIWeather, solar and battery scenarios, authorized modelsCoordinates, equipment/scenario inputs or policy-authorized historical samples. Distinguish physical estimates, rules and trained predictions.
Water operationsWater records, metering and consumption, reviewed charge calculationsMeter/source identities, register values, units and reviewed tariffs. These charge calculations do not collect customer payments.

Hardware SDKs and software connectors are setup choices. A workspace is the ownership boundary; a service enables operations; scopes restrict each key. A service marked Available still needs activation where required. Read requirements and pricing before checkout.

Platform plans & optional capabilities

#

New workspaces use one platform plan when plan enrollment is enabled. Existing workspaces retain their legacy service subscriptions until an explicitly reviewed migration.

Plan / monthRegistered devicesAPI requests / UTC monthTelemetry units / UTC month
Starter25100,0001,000,000
Growth1001,000,0005,000,000
Scale5005,000,00020,000,000

All plans include Device cloud plus basic temperature/humidity, water and energy readings. Compatible commands, ESP32 OTA, alerts and webhooks are included. Hardware requirements and API scopes remain unchanged. Physical development devices can use verified sandbox subscriptions while sandbox billing mode is selected.

Starter includes 1 Standard software connection, Growth 3 and Scale 10. Admin classifies each working connector as Standard or Enterprise and configures its individual monthly price. Standard connectors use included capacity or their own paid subscription when the allowance is full. Enterprise connectors require a separate subscription even with spare Standard capacity. Source licences and API fees remain separate. Existing subscriptions and enabled connection classifications retain their saved agreements. Additional flat-slot sales are retired; earlier paid flat slots only add Standard capacity. Energy forecasting & planning and Water records, metering & tariffs are monthly workspace add-ons. Current prices and connector classifications are configured in Administration and returned by GET /v1/public/config; use the workspace quote before checkout. See current pricing. One current source configuration per connector type is supported. Extra slots do not enable multiple installations of the same provider yet. GET /v1/organizations/{org}/connectors returns connection_slots. A successful Standard configuration save claims included capacity when eligible; Enterprise requires its paid subscription. Quotes return expected_connector_revision and expected_connector_tier; pass both with the quoted amount/mode to checkout. Changing an admin category affects new or released-and-resaved configurations; enabled connections retain their billing classification. A successful configuration save is atomic; failed validation or stale revisions do not. POST /v1/organizations/{org}/connectors/{provider}/release-slot releases capacity without deleting retained data or cancelling a paid slot. Re-save the configuration to reconnect. Cancelling a connector subscription stops renewal; verified prepaid access remains until its paid period ends. Connections exceeding capacity then stop operating, in allocation order. Provider-specific subscriptions retain their saved rates and do not consume included Standard slots while paid. Source-system licensing, permissions and installation acceptance are separate. AI personalization is a separately priced gated capability; paid activation is not yet available.

Measure the actual usage

Registered-device limits include disabled registrations. One telemetry unit is one accepted timestamped reading up to 2 KiB of canonical JSON (event ID, UTC recorded time and normalized metrics), rounded up for larger readings. Identical accepted telemetry retries reuse the existing reading and do not consume another telemetry unit. API-key requests remain a separate shared workspace counter; authorized requests can count even if a later validation or upstream operation fails. The per-key minute limit still applies.

API counters reset at the UTC calendar-month boundary, not the subscription anniversary. Plan purchase does not reset existing usage. Monthly API/telemetry caps reject additional workload with 429; device registration above the allowance returns 409. No capacity pack or overage is charged automatically. Owner/admin account sessions can still manage Billing and keys when an API-key quota is exhausted. Full workspace exports remain support-assisted.

Use the same quote in your application

Platform administrators set monthly USD plan/add-on offer prices. Price changes affect new checkouts; existing subscriptions and earlier pending orders retain their saved amounts. New checkout can be disabled without revoking already-paid access. A stale quote returns 409; refresh the quote, or resume an earlier pending checkout from Billing. Capacity limits are independent of price edits.

GET /v1/organizations/{org}/services includes pricing_model, active_plan and service rows. Plan workspaces receive plan/add-on offers and bundled feature access. Legacy workspaces retain service offers and saved rates. A billing quote for a plan workspace uses contract_version: 2; legacy quotes remain version 1.

GET /v1/organizations/{org}/billing/quote?service_id=plan_starter&gateway=bachs
X-API-Key: YOUR_WORKSPACE_KEY_WITH_BILLING_READ

Use IDs plan_starter, plan_growth, plan_scale, addon_sap, addon_maximo, addon_giswater, addon_senaite, addon_lims, addon_energy or addon_water. Quote access accepts billing:read or an owner/admin session. Checkout remains owner/admin-session-only and requires accept_recurring: true, the selected gateway and the current expected amount/mode returned by the quote. USD plan checkout uses Bachs when configured; Paystack continues to support configured legacy NGN offers.

Renewal, expiry and migration

Only one effective base plan is supported. Resolve a pending plan checkout in Billing before starting another. Plan changes are support-assisted; do not buy a second plan to upgrade. Add-ons require a paid base plan in the same environment; live access takes precedence over sandbox access. An add-on grants no access after the base plan expires.

Stopping plan renewal also requests cancellation of active add-on renewals in that environment. Provider failures remain visible and must be retried; the renewal-review worker reconciles cancelled/expired parents. Paid access remains through the verified paid period. Conflicting verified plan payments are recorded for support review and do not grant a second effective plan.

GET /v1/organizations/{org}/billing/migration-preview is owner/admin-only and read-only. It shows the current pricing model, saved subscriptions and grants. It does not change prices, cancel renewals or convert a workspace. Existing customer migration needs separate review and agreement. Retention, aggregate, snapshot/egress packs and physical-trial targets in the roadmap are not implemented plan guarantees.

Test with the Telematric sandbox.

#

Build against our equipment and assets API using synthetic data. No SAP or IBM account, installation or connector credentials required.

  1. Create your Telematric account and workspace. Verify your email if requested.
  2. On Overview, choose Try equipment sandbox and run a sample request.
  3. Open API keys and choose Create sandbox key. It selects only sandbox:read; save the secret securely on your server.
  4. Use your workspace ID and key in the request below. No service subscription or vendor credentials are required for synthetic data.

In Dashboard → Integrations, select SAP or IBM Maximo and choose Try Telematric sandbox. For your own backend, create a workspace API key with sandbox:read for synthetic data only. Existing keys with both connectors:read and assets:read also work. Keep this key on your server. Workspace access and normal API limits still apply.

curl 'https://telematric.com/v1/organizations/YOUR_WORKSPACE_ID/sandbox/connectors/sap/assets?limit=2&page=1' \
  -H 'X-API-Key: YOUR_TELEMATRIC_WORKSPACE_KEY'

Replace sap with ibm for Maximo assets. GET /v1/organizations/{org}/sandbox/connectors lists sandbox resources. Responses contain records (external_id, name, source_fields), pagination, source_identity, fetched_at, environment: telematric_sandbox, synthetic: true and dataset_version: assets-v1.

Six stable sample assets per provider span industrial, building, energy and distribution equipment. Set limit (1–100), page (starting at 1), or external_id for an exact lookup. SAP starts at SBX-EQ-001; Maximo starts at SBX-AS-001 in site SBX-SITE, organization SBX-ORG. SAP’s current equipment profile does not supply a plant/site; applications must map that explicitly.

Add scenario=empty for an empty collection, scenario=rate_limit for HTTP 429, or scenario=unavailable for HTTP 503. Simulated errors include retry_after_seconds: 5 and a Retry-After: 5 header. Unknown scenarios return 422; invalid authentication and permissions return real access errors before any simulation.

Location and work-order previews use the same paths ending in /locations or /work-orders, with dataset_version: eam-v1. All resources include a vendor-neutral canonical object so applications do not need SAP/Maximo field translation. These previews stay outside operational permit workflows.

This is a read-only Telematric fixture service. It does not contact SAP/Maximo, create identity links, import assets or simulate payments or safety approvals. Keep synthetic data out of operational equipment and permit workflows. SAP’s own API-key sandbox is a separate provider service.

When ready for customer data, create and verify their connector in the dashboard, then explicitly switch to /v1/organizations/{org}/connectors/{provider}/assets. Keep sandbox and customer records separated by source identity and environment. Successful sandbox tests do not validate a real customer installation.

SAP and Maximo assets.

#

Read equipment and asset records from your own SAP S/4HANA or IBM Maximo installation, then link their identities to Telematric sites and devices.

Read-only pilots: customer installation validation is pending. Configure your API URL, dedicated credentials, product version and source scope in Dashboard → Integrations. SAP uses the API_EQUIPMENT OData V2 profile with Basic access for customer systems, or API-key access for SAP sample sandboxes and compatible equipment API gateways. Select the sandbox environment for sample data. Maximo uses MXAPIASSET with an API key and an explicit organization/site. Bounded read-only location and work-order endpoints are also available under /locations and /work-orders; the customer source must grant access to those resource profiles. Source edits, safety-status delivery, full inventory synchronization and connector fees are outside these profiles.

Use GET /v1/organizations/{org}/connectors/sap/assets?limit=25&page=1 or replace sap with ibm for Maximo. Backend keys need connectors:read and assets:read; managers use connectors:manage and assets:manage. Optional external_id filters one equipment identity. Responses include source identity, fetch time and bounded pagination.

Dedicated readers retain source-system authorization rules. Product versions are declared by your IT team, not automatically certified. Sandbox checks validate SAP sample data and do not certify a customer installation. Internal-only deployments need an approved connectivity arrangement; do not expose your ERP publicly to use this form.

Configure an asset pilot ↗

Connect your CRM.

#

Link existing customers, hand off an authorized lead and follow its sales progress.

In Integrations → Odoo CRM, configure Odoo 19 JSON-2 API access, the explicit database/company and a dedicated API key. Odoo Online requires a plan with external API access. Start with read access; enable explicit creation only when your application needs lead handoff. Odoo retains stages, assignments and business automation.

API base: /v1/organizations/{org}/connectors/odoo. Read scopes: connectors:read + crm:read. Manage settings/mappings: connectors:manage + crm:manage. Queuing/processing handoffs additionally requires crm:write. CRM works independently of Device cloud and Water records.

GET /browse/customers and GET /browse/leads accept limit/offset. Use shared /mappings to link explicit source customer/lead IDs with existing Telematric customers/sites/devices. No customer matching by name or automatic customer duplication.

POST /v1/organizations/{org}/connectors/odoo/handoffs
{
  "external_key": "enquiry-1234",
  "name": "Customer enquiry",
  "description": "Details from your application",
  "type": "lead",
  "partner_id": 7,
  "create_confirmed": true
}

Queuing explicitly authorizes scheduled delivery. Reusing the same reference and details is idempotent. POST /handoffs/{id}/sync processes or reconciles a request; GET /handoffs shows status/freshness and GET /handoffs/{id}/revisions preserves changed status history. Odoo standard external IDs support reconciliation without custom fields. An uncertain outcome triggers reference lookup, not blind creation retries. Source edits remain owned by the CRM.

No invoice, payment, maintenance or automatic alert-to-sales workflow is included. Zoho CRM is the next connector on this path; its dashboard listing currently collects interest.

Connect your network data.

#

Read Giswater nodes, pipes, service connections and DMAs through your Telematric backend.

Tested with Giswater API 1.8.1 and a WS 4.17.6 database. The connector accepts DB 4.17.x with HTTP Basic access. In Integrations → Giswater, save the public HTTPS tenant API URL, explicit project schema and dedicated reader credentials, then test the connection. Configure the reader’s project selections in Giswater.

API base: /v1/organizations/{org}/connectors/giswater. Reads require connectors:read and gis:read; management requires connectors:manage and gis:manage. GIS works independently of Device cloud, Metering and laboratory services.

Browse and track explicitly

GET /browse/{kind}?limit=10 reads a bounded source list for node, arc, connec or dma. Optional dma_id filters a selection. Source feature lists have no offset pagination and are never treated as a complete inventory. Coordinates retain the project EPSG; transform them explicitly before using a WGS84 map.

POST /records with {"record_kind":"node","external_id":"1001"} tracks an identity. Then POST /records/{id}/sync fetches and validates it. Use GET /records for paginated metadata, GET /records/{id} for the cached snapshot and freshness, and GET /records/{id}/revisions for history. Failed reads preserve prior snapshots and mark them noncurrent.

Scheduled refreshes process only explicitly tracked records. Use shared /mappings to link source assets to your sites/devices or optional laboratory sampling points. Project changes invalidate old links. Telematric does not edit networks, run hydraulic models or infer missing assets from limited lists.

Connect your systems.

#

A consistent connector contract for your own backend and dashboard.

GET /v1/organizations/{org}/connectors returns contract version 1, provider capabilities, configuration revision, safe connection health and service access. Use connectors:read; provider operations also require the relevant provider scopes. SENAITE, read-only Giswater and Odoo CRM use this foundation; other listed providers remain on the roadmap.

Owners and administrators can open Integrations to inspect the SENAITE connection, test it and manage explicit site/device identity links. The existing laboratory setup and result synchronization remain available. Connection verification alone does not establish result freshness.

Connection and identity APIs

Under /connectors/senaite, use /connection to read/save the existing encrypted configuration, /verify to test a revision, /mappings to list/create links, /mappings/{id} to revise a link, and /events for manager audit history. Writes require connectors:manage and water-labs:manage; mapping reads require connectors:read and water-labs:read. Water records must be enabled; Device cloud, native Metering and Billing are independent.

Mappings link explicit source sample UIDs to existing Telematric site/device IDs. They do not import results or verify a source sample exists. Source installations retain record ownership; changing an installation invalidates its old links until deliberately replaced. Existing laboratory sample mapping and publication checks still control result imports.

POST /v1/organizations/{org}/connectors/senaite/mappings
{
  "external_type": "sample",
  "external_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "target_type": "site",
  "target_id": "YOUR_SITE_UUID",
  "mapping_confirmed": true
}

Lists use limit and offset. Mapping updates require expected_revision, enabled, target_id and explicit confirmation. Existing SENAITE APIs remain compatible. Full source APIs remain accessible directly with the appropriate permissions for capabilities beyond our connector.

SENAITE laboratory connection

#

Configure and test a dedicated SENAITE account from Water records → Laboratory connection, or use your own backend and dashboard. Requires Water records access and an owner/admin session or an API key with water-labs:manage. Device cloud, native Metering and Utility billing are independent.

Use GET or POST /v1/organizations/{org}/water-data/laboratory-connection to read metadata or save api_url, username, password and integer expected_revision (zero initially). Passwords are encrypted and never returned. The URL must end in /@@API/senaite/v1 on a public HTTPS site.

Call POST /v1/organizations/{org}/water-data/laboratory-connection/verify with the current expected_revision. Verification checks the authenticated account and API version. Each completed test increments the revision; reload settings after failure. A verified status describes the last connection test only.

Connection setup, explicit sample mapping, result synchronization and snapshot history are implemented. Sample requests and report downloads remain future work. SENAITE retains responsibility for laboratory verification and publication.

Choose who operates SENAITE

Your installation: your team operates SENAITE and provides a dedicated read account. Partner laboratory: your lab partner operates SENAITE and authorizes access to the agreed clients and samples. Telematric-managed: request a dedicated hosted installation, review the quote and explicitly accept it before provisioning. Managed activation requires verified HTTPS access and backup, restore and monitoring evidence; it is not instantaneous.

All three arrangements use the same sample/result APIs and support your own dashboard. SENAITE remains responsible for laboratory workflow and publication. Telematric-managed hosting maintains the installation; it does not perform physical laboratory testing or confer accreditation.

Workspace managers can GET/POST /v1/organizations/{org}/water-data/laboratory-arrangement with arrangement (customer_hosted or partner_lab), provider_name, authorization_reference, authorization_confirmed: true and expected_revision. Changed authorization invalidates the previous connection check. Managed mode is assigned by the platform operator after activation.

GET/POST /v1/organizations/{org}/water-data/laboratory-hosting reads or requests hosting. Requests include preferred_region, requirements, request_confirmed: true and expected_revision. POST /laboratory-hosting/actions accepts the current quote with action: accept_quote, quote_accepted: true and its revision, or cancels an unprovisioned request with action: cancel and a reason. These actions do not collect payments or create cloud resources. Installation operations and infrastructure are quoted separately from the water-metering/billing services.

Platform administrators manage requests from Water records → Laboratory connection → Managed lab requests. Mutations require password reauthentication. Endpoint assignment follows a verified connection test; each managed hostname can belong to only one workspace. Customer users cannot overwrite managed credentials or undo operator suspension through connection verification. GET /laboratory-arrangement/events returns the paginated authorization/hosting audit history.

Samples and results

Use /v1/organizations/{org}/water-data/laboratory-samples: GET lists mappings, POST maps an existing sample using sampling_point_id (Telematric), sample_uid, client_uid and sample_point_uid (SENAITE). Read endpoints require water-labs:read; management endpoints require water-labs:manage. Dashboard viewers can read; owners/admins manage.

GET /{id} returns the latest snapshot and freshness; GET /{id}/revisions?limit=25&offset=0 returns immutable history. POST /{id}/sync with an empty JSON object requests synchronization. POST /{id}/status with enabled and expected_revision enables/disables polling. Source sample, client and point UIDs are checked before import. No lab-wide discovery or remote writes occur.

Enabled mappings are polled in bounded batches, at least five minutes between attempts per sample. Published sample values are released only for verified/published analyses whose effective visibility can be confirmed. Unresolved template/profile visibility withholds values. The adapter supports SENAITE 2.6 false/null flags and exact direct-child paths when a read-only account receives empty parent UIDs. Detection-limit qualifiers remain visible even when a formatted result is unavailable. Failed syncs retain history and mark it noncurrent. “Recent” means a successful sync within 24 hours; it does not imply water safety. Previous published values remain in historical revisions after amendments or withdrawal. Only accessible direct analyses are imported; this is not an official complete laboratory report.

Open Water records ↗

Utility charge calculation & exports

#

Price approved consumption, review charges, and export instructions to your own financial system.

Enable Water billing and Water records. Native Metering, Device cloud and our dashboard are optional. This service is separate from Telematric subscription billing. Your utility supplies its own authorized rates; no rates or automatic billing schedules are seeded.

API access

Base: /v1/organizations/{org}/water-billing. Use a backend X-API-Key with water-billing:read, water-billing:write or water-billing:approve. Device credentials are rejected. Dashboard viewers may read; owners/admins may author and review.

Tariffs

POST /tariffs with source_system, external_id, consecutive version, name, effective_from (UTC), currency (three uppercase letters), minor_unit_exponent (0–3), fixed_charge_minor, allow_estimated (boolean) and tiers. Each progressive tier contains up_to_m3 (decimal string) and rate_minor_per_m3 (integer); the final upper bound must be null. Rates use minor currency units per m³, not major currency units per litre. Tariffs are immutable drafts; POST /tariffs/{id}/review with decision published/rejected and a reason. GET endpoints list versions or retrieve an ID.

Activation times increase by tariff code. The next published activation ends the prior window. A charge period must fit one version. Rates cannot be changed inside a previously approved billing period. Fixed charges apply once per consumption record; they are not monthly-prorated. Estimated consumption requires explicit tariff permission.

Draft charges and review

POST /bills with source_system, external_id, consumption_id, consumption_revision and tariff_id. Consumption must be effectively approved with valid evidence. The response includes a draft utility_charge with a versioned source/rate snapshot, exact minor-unit amount and lines. Integer arithmetic rounds aggregate usage half-up once; largest-remainder allocation makes line amounts equal the total. Taxes, arrears, discounts and credits are not calculated.

POST /bills/{id}/review with expected_version, decision approved/voided and a reason. Only valid drafts can be approved; reviews recheck source and tariff validity. One non-void charge is allowed per consumption identity. Corrections and late evidence flag affected charges for reconciliation rather than silently changing amounts. Explicitly void and replace a charge after reviewing its source. GET /bills and /bills/{id} provide current validation state and immutable calculation details.

Own-dashboard and financial integration

GET /exports?after=0&limit=100 returns ordered events, next_cursor, high_watermark and has_more. Events are water.bill.approved, water.bill.reconciliation_required and water.bill.voided. Persist and deduplicate event IDs, process in cursor order, and drain pages through the high-watermark before finalizing a batch. Continue polling for subsequent changes. The feed is scoped to your workspace; it is not a payment confirmation or signed webhook.

Your financial system owns invoice numbering, applicable taxes, balances, payments and refunds. Approval creates a charge instruction; voiding does not automatically cancel an external invoice or refund money. Platform subscriptions are unaffected.

Open the optional utility billing dashboard ↗

Water records & consumption API

#

Bring your existing metering system and use Telematric through your own dashboard.

Water services architecture overview: Telematric provides four specialized water capabilities:
• Water management (water): Real-time IoT sensor telemetry (tank level %, flow LPM, leak detection) requiring Device cloud.
• Water records & consumption (water_data): Master utility entities, zones, sampling points, and reviewed volumetric consumption ledger (m³ or L). Pure API with no IoT hardware required.
• Water metering (water_metering): Derives interval consumption from cumulative meter index/register readings and validates monotonic increments.
• Utility water billing (water_billing): Prices approved consumption against versioned tiered tariffs and exports cursor-based billing event feeds for ERPs (SAP, QuickBooks).

Water records & consumption is independent of Device cloud and native Water metering. Shared customers, sites, utility accounts, service connections, zones and sampling points connect future distribution, billing and laboratory integrations. Utility charge calculation is available through the separate Water billing service; SENAITE integration remains planned.

Shared records

Base: /v1/organizations/{org}/water-data. Use a server-side X-API-Key with water:read for GET and water:write for POST. Create or list /customers, /sites, /accounts, /connections, /zones, /sampling-points and /meters. Reuse existing customer/site IDs. Other records require source_system, external_id and name; accounts reference customer_id, connections reference account_id/site_id and optional zone_id, meters reference connection_id/serial_number/installed_at, and sampling points reference site_id with optional zone_id/connection_id. List responses use records (customers/sites retain their existing list keys) and pagination.

Import approved external consumption

POST /water-data/consumptions with water:write and water:approve. Native Metering and Device cloud subscriptions are not required. Send decimal strings in m3 (six decimal places) or L (three); integer millilitre arithmetic preserves precision. The normalized response exposes volume_m3 and original units.

{
  "source_system": "existing-metering",
  "external_id": "connection-42-2026-09",
  "revision": 1,
  "connection_id": "YOUR_CONNECTION_ID",
  "period_start": "2026-09-01T00:00:00Z",
  "period_end": "2026-10-01T00:00:00Z",
  "value": "12345.125",
  "unit": "L",
  "classification": "measured",
  "approval_status": "approved"
}

Review, corrections and export

Use classification: measured|estimated|corrected and approval_status: draft|approved. Estimates, corrections and revisions after 1 require change_reason. Exact source/reference/revision retries return the existing record; conflicting reuse returns 409. New revisions are consecutive and preserve history. Draft corrections leave the prior valid approved revision effective until replacement approval.

GET /water-data/consumptions?view=approved&limit=25&offset=0 exports effective, valid approved records. The latest view includes exceptions; filter either view by connection_id. GET /consumptions/{id}/revisions reads history. POST /consumptions/{id}/review with expected_revision, decision (approved/rejected) and optional reason; rejection requires a reason and both decisions require water:approve. Approved periods cannot overlap for the same connection. Period ends are exclusive; historical imports are supported.

Optional native metering

Enable Water metering plus Water records to POST /v1/organizations/{org}/water-metering/readings using metering:write. Provide meter_id, source_system, external_id, recorded_at, decimal-string value, unit and kind (regular/reset). POST /water-metering/consumptions with opening_reading_id and closing_reading_id plus source/reference/revision to calculate usage. All evidence must be monotonic, from one meter, with no resets or ambiguous timestamps; no more than 10,000 readings per interval. Extra water:approve scope is required for immediate approval. Late evidence flags derived records for reconciliation and removes them from approved exports until resolved through a new revision.

This ledger does not issue invoices or collect customer payments. Existing Telematric subscription billing is separate. Keep API keys on your backend; your own dashboard can use your backend to access these APIs. Consumption webhooks and bulk imports are not part of this release.

Open the optional water records dashboard ↗

ESP32 SDK

#

Connect classic ESP32 devices with our Arduino / PlatformIO SDK, version 0.2.0.

Persistent telemetry buffering, command handling, verified firmware downloads and explicit boot health confirmation. Tested on classic ESP32 with espressif32@7.0.1 and ArduinoJson 7.4.3.

Download ESP32 SDK · v0.2.0 SHA-256 checksum

Flash and connect through USB

Our Connect ESP32 wizard handles Wi-Fi, device credentials, the hosted OTA endpoint and HTTPS trust configuration. Use desktop Chrome or Edge with a USB data cable and a classic ESP32 development board with 4 MB flash. Create an active gateway under a customer and site in your workspace first.

Download starter factory firmware · Firmware checksum. Flashing replaces the current firmware and configuration; back up your board first. With esptool installed, flash the merged image at address zero:

python -m esptool --chip esp32 --port PORT write_flash 0x0 telematric-esp32dev-1.8.0-factory.bin

Replace PORT with your USB serial port. Or build and flash the source archive’s examples/GettingStarted with PlatformIO. Close your serial monitor, open the wizard, connect USB, choose the gateway and save Wi-Fi settings. Existing device and OTA credentials are replaced only after your explicit acknowledgement. Setup succeeds only after a new reading reaches the cloud and the board reports healthy to the hosted OTA service. The starter sends diagnostic MCU temperature, changes no GPIO outputs and accepts no actuator commands.

Install and connect

  1. Extract the download. Add lib_deps = symlink:///absolute/path/to/TelematricESP32-0.2.0 to your PlatformIO environment. Select the supported ESP32 Arduino platform above.
  2. Register a device in Devices and securely provision its device credential. Firmware uses X-Device-Key; workspace API keys stay on your backend.
  3. Configure your HTTPS API base ending in /v1, its trusted root CA and device credential. Your application supplies Wi-Fi reconnection and synchronized UTC measurement times.
  4. Initialize NVS and DeviceClient, check every return value, enqueue actual measurements, and call device.loop(). See the included README for the C++ example and API contracts.

Buffering and commands

The persistent queue holds eight readings, up to 1,024 JSON bytes each. A full queue rejects new readings without evicting old ones. Retries retain event IDs and original measurement times. Handle rejected records explicitly. Native command polling supports unmapped gateways/sockets with enabled control policy; PowerCell-mapped devices use the backend relay. Command handlers must enforce local interlocks and verify outcomes.

OTA integration

OTA supports PowerCell-compatible collector/socket firmware through Telematric’s hosted HTTPS endpoint. Copy https://app.telematric.com/ota/YOUR_WORKSPACE_ID from Firmware updates and provision only the board-specific OTA token on the device. No customer proxy or workspace API key is needed. Configure a separate HTTPS transport using Authorization: Bearer. Initialize BootGuard and OtaClient, confirm health only after local application diagnostics, and call ota.loop(). Attach device.requireHealthyBoot(guard) when accepting native commands.

A rollback-enabled bootloader and OTA partition layout are required. Two application slots alone do not establish rollback support. Releases require one valid firmware identity marker; see the included README and OTA API reference. Manage compatible releases and deployments in Firmware updates.

This is the first ESP32 SDK release, distributed as source rather than a package-registry release. The production OTA endpoint is hosted by Telematric; hardware provisioning remains your application’s responsibility. Provision trusted certificates and device secrets through your own secure setup process.

Open SDK resources in your dashboard ↗

lims.science laboratory connector

#

Connect an Odoo 19/20 installation with JSON-2 API access from Integrations → lims.science. Supply a dedicated read-only API key, database, company ID and the laboratory's actual sample/result model and field mappings. Verification checks permissions and company isolation before records can be browsed. Installation-specific acceptance is required.

Use GET /v1/organizations/{org}/connectors/limsscience/browse/samples or /browse/results, with limit and offset. API keys need connectors:read and water-labs:read. Settings require connectors:manage and water-labs:manage, or a workspace manager session. Read-only responses include source identity and fetched_at; laboratory approval and result changes stay in the LIMS.

Read or save /connection and POST /verify with expected_revision. Saving invalidates verification. Obtain technical mappings from your installation's /doc page or laboratory administrator. No vendor models are assumed.

Configure lims.science ↗

STM32 embedded SDK

#

STM32duino / PlatformIO source SDK, version 0.1.0. Reference target: Nucleo F401RE.

Bounded telemetry buffering, command execution journaling and serial provisioning. Hardware tests are pending. Supply a board-specific storage driver and verified network transport.

Download STM32 SDK · v0.1.0 SHA-256 checksum

  1. Extract the package and build its offline GettingStarted example using PlatformIO and ArduinoJson 7.4.3.
  2. Implement BankStorage over two independently erasable flash or FRAM regions, then initialize JournalStore. MemoryStore is a volatile demonstration tool.
  3. Initialize your network peripheral. ArduinoClientTransport requires a CA and a connector that performs TLS chain and hostname verification on the same Client stream.
  4. Provision device credentials securely, synchronize UTC time, and enqueue supported measurements.
  5. Check storage and API results. Interrupted command execution reports execution_uncertain; confirm actuator outcomes in your application.
The current browser Connect wizard, factory image and OTA adapter support classic ESP32. STM32 needs manual or factory provisioning and a board-specific bootloader before OTA can be added. No physical STM32 acceptance test has been performed.

Open SDK resources ↗

Available and Active services

#

Available means Telematric offers a functional service that your workspace can subscribe to. It does not grant use. Active means your workspace has subscribed or an administrator has explicitly approved enrollment. Admin approval does not record a payment.

Read GET /v1/organizations/{org}/services. The available flag describes the global catalog; status describes this workspace; access controls use after suspension and dependencies. The subscribed flag identifies verified financial subscriptions. activation_type identifies paid, sandbox or administrator-approved enrollment, and blocked_by lists required services that must be activated.

Sandbox subscriptions are labelled separately and activate development devices while Sandbox mode is selected. Suspended and Unavailable services cannot be used. Coming soon services cannot be activated or purchased. API keys still need the documented scopes.

Service requirements & pricing API

#

Use the same requirements and monthly cost breakdown as the Telematric dashboard. Quotes create no checkout or subscription.

GET /v1/organizations/{org}/billing/quote?service_id=environment&gateway=bachs
X-API-Key: YOUR_WORKSPACE_BILLING_READ_KEY

Requires a workspace key with billing:read or an owner/admin account session. Viewer sessions, device credentials and keys from another workspace cannot access the quote. Merchant payments:read is a separate permission. Keep API keys on your backend.

The version-1 response includes rows for the selected service and its deduplicated requirements, blocked_by, ready, totals, additional, incomplete and selected checkout fields. Each row includes its service access/status and a price with amount_minor, currency, mode, provider and source: saved_subscription|checkout_offer. Existing subscriptions use their original rates.

Group amounts by currency and live/sandbox mode. When incomplete is true, show known subtotals rather than a complete total. A null price is not free. Requirements must be active in the same workspace. For example, USD 25 Device cloud plus USD 10 monitoring gives a USD 35 combined monthly rate, with separate subscriptions.

Quotes are nonbinding and expire after five minutes. Refresh on gateway changes and before checkout. Use the selected service’s expected amount/mode, obtain recurring consent and handle server validation errors. Billing-read keys cannot purchase services: checkout and cancellation continue to require an owner/admin session. Each checkout buys one service; losing a requirement does not automatically cancel dependent renewals.

Returns 401/403 for credential or permission errors, 404 for a foreign workspace key, 409 for unavailable checkout offers, 422 for invalid selections and 429 for quotas. Responses are private and uncached. Browse Services →

Service payments: Bachs & Paystack

#

Workspace owners and administrators can subscribe to Telematric services from Services and manage payments and renewal from Billing. Choose an enabled gateway and review its currency and monthly price: Bachs subscriptions use USD; Paystack uses NGN. Prices are configured separately, with no automatic conversion.

These endpoints require an authenticated account session with owner or administrator access to the workspace. Workspace API keys cannot purchase subscriptions or read billing details. Read checkout_gateways from GET /v1/organizations/{org}/services, then send gateway (bachs or paystack), service_id, accept_recurring: true, expected_amount_minor and expected_mode to POST /v1/organizations/{org}/billing/checkout. Redirect to the returned authorization_url.

On return, send the saved reference to POST /v1/organizations/{org}/billing/verify. The server verifies the provider, workspace, customer, product and paid amount. A browser redirect alone never grants access. GET /v1/organizations/{org}/billing returns subscriptions, pending checkouts and payment history with provider attribution. POST /v1/organizations/{org}/billing/cancel accepts service_id and mode; it stops renewal through the original provider and preserves the verified prepaid period.

Platform administrators configure keys, signing secrets and prices in Administration → Billing, website & security. Secrets stay encrypted on the server. Keep sandbox mode during testing: sandbox transactions activate development devices without requiring admin approval. Bachs webhook endpoint: POST /v1/billing/bachs/webhook. Use Bachs local forwarding for localhost testing. Live and sandbox endpoints require their own signing secrets.

This integration collects payments for Telematric workspace services. It does not collect your utility bills or provide a general merchant payments API for your customers. Existing software connectors and sandbox APIs remain separate.

Bachs webhook setup ↗ · Test Bachs webhooks locally ↗

Connector setup & diagnostics

#

Open Integrations → Software connectors → Connector guide for setup requirements, recorded check results and recovery guidance. Refreshing diagnostics does not contact your source. Run a check or read up to five supported source records explicitly.

GET /v1/organizations/{org}/connectors/{provider}/diagnostics
POST /v1/organizations/{org}/connectors/{provider}/mapping-preview
POST /v1/organizations/{org}/connectors/{provider}/mappings

Requires a workspace manager session, or an API key with connectors:manage and the provider management scope listed in diagnostics. Setup guidance can be read before purchase; checks, source previews and mappings require operational access. Supported profiles: SAP, IBM Maximo, Giswater, SENAITE, Odoo, lims.science and Bachs.

Diagnostics separates configuration revision, access, recorded verification and synchronization evidence. A passed check covers the named operations, not live health or every source permission. Missing synchronization evidence stays unknown. Source settings and credentials remain in the connector settings form.

To preview an identity link, send external_type, external_id, target_type, target_id and expected_connection_revision from diagnostics. Preview checks the current source configuration, target ownership and conflicts without writes or source requests. It does not check that an arbitrary external ID exists.

After explicit confirmation, send the returned proposed fields to /mappings with mapping_confirmed: true and expected_connection_revision. The server rechecks the revision, target and conflicts. On 409, refresh and preview again. Identity links do not import records, translate fields or change your source system.

Start with a connection.

#

Start with synthetic data, then enable the capabilities needed by your application.

01

Create a workspace

Create an account and workspace. Verify your email if requested, then sign in. Create an account →

02

Create an API key

Open API keys, select the scopes your integration needs, and save the one-time secret.

03

Make a request

Verify your key using the context endpoint below. It returns your organization ID, key ID, and scopes.

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/api-key/context" \
  -H "X-API-Key: YOUR_API_KEY"
Replace uppercase placeholders with your own values. Examples use the deployment’s configured application origin as the API host. Requests run from your backend or terminal; this page does not send API calls.

Authentication

#

The right credential for each connection.

CredentialHeaderUse it for
Developer API keyX-API-Key: nv_…Scoped backend integrations within one organization.
Account sessionAuthorization: Bearer …Accounts, organizations, API-key management, and authorized fleet management.
Device credentialX-Device-Key: nd_…A device’s own telemetry and command polling/results.

Developer keys are returned once on creation or rotation. Keep them on your server. Read and write scopes are separate; rotation preserves the original permissions and expiry. Account sessions cannot replace API keys on forecast endpoints.

Use JSON request bodies with Content-Type: application/json. Use HTTPS in production. Organization and device IDs in paths must belong to the authenticated workspace.

GET/v1/api-key/context

Verify an API key and retrieve its organization ID, key ID, and scopes.

Authentication: X-API-Key

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/api-key/context" \
  -H "X-API-Key: YOUR_API_KEY"
API REFERENCE · V1

Find your next endpoint.

Customers

#

Organize end customers inside your workspace. These records do not create accounts or send invitations.

Archive a customer instead of deleting it. Archived customers block new child resources and descendant telemetry.

GET/v1/organizations/{org}/customers

List customers

Required scope: customers:read

Authentication: X-API-Key

Query parameters: limit (default 25, maximum 100) and offset (default 0, maximum 100000). Lists return the collection and pagination with limit, offset, and total.

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/customers" \
  -H "X-API-Key: YOUR_API_KEY"
POST/v1/organizations/{org}/customers

Create customer

Required scope: customers:write

Authentication: X-API-Key

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/customers" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Example customer",
  "email": "operations@example.com",
  "external_id": "customer-42"
}'
GET/v1/organizations/{org}/customers/{id}

Read resource details

Required scope: customers:read

Authentication: X-API-Key

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/customers/{id}" \
  -H "X-API-Key: YOUR_API_KEY"
POST/v1/organizations/{org}/customers/{id}

Update resource fields

Required scope: customers:write; partial update

Authentication: X-API-Key

Sites

#

Group devices by location. Each site belongs to one customer; optional coordinates and energy configurations support specialized forecasts.

Filter site lists with customer_id. A site’s customer and identity cannot be reassigned.

GET/v1/organizations/{org}/sites

List sites

Required scope: sites:read

Authentication: X-API-Key

Query parameters: limit (default 25, maximum 100) and offset (default 0, maximum 100000). Lists return the collection and pagination with limit, offset, and total.

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/sites" \
  -H "X-API-Key: YOUR_API_KEY"
POST/v1/organizations/{org}/sites

Create site

Required scope: sites:write

Authentication: X-API-Key

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/sites" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "customer_id": "CUSTOMER_UUID",
  "name": "Main building"
}'
GET/v1/organizations/{org}/sites/{id}

Read resource details

Required scope: sites:read

Authentication: X-API-Key

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/sites/{id}" \
  -H "X-API-Key: YOUR_API_KEY"
POST/v1/organizations/{org}/sites/{id}

Update resource fields

Required scope: sites:write; partial update

Authentication: X-API-Key

POST/v1/organizations/{org}/sites/{id}/solar/forecast

Generate a saved-site solar forecast

Required scope: Both sites:read and solar:read

Authentication: X-API-Key

Devices

#

Provision and monitor connected devices. Creation returns device metadata and a one-time device_secret. Use kind: other for a general sensor.

Filter device lists with site_id. Supported kinds: inverter, battery_monitor, energy_meter, smart_socket, gateway, other. Set status to disabled to retire a device while retaining history.

GET/v1/organizations/{org}/devices

List devices

Required scope: devices:read

Authentication: X-API-Key

Query parameters: limit (default 25, maximum 100) and offset (default 0, maximum 100000). Lists return the collection and pagination with limit, offset, and total.

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/devices" \
  -H "X-API-Key: YOUR_API_KEY"
POST/v1/organizations/{org}/devices

Create device

Required scope: devices:write

Authentication: X-API-Key

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/devices" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "site_id": "SITE_UUID",
  "name": "Room sensor",
  "kind": "other",
  "external_id": "sensor-001"
}'
GET/v1/organizations/{org}/devices/{id}

Read resource details

Required scope: devices:read

Authentication: X-API-Key

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/devices/{id}" \
  -H "X-API-Key: YOUR_API_KEY"
POST/v1/organizations/{org}/devices/{id}

Update resource fields

Required scope: devices:write; partial update

Authentication: X-API-Key

POST/v1/organizations/{org}/devices/{id}/rotate-credential

Rotate the device credential

Required scope: devices:write

Authentication: X-API-Key

GET/v1/organizations/{org}/devices/{id}/latest

Read resource details

Required scope: devices:read

Authentication: X-API-Key

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/devices/{id}/latest" \
  -H "X-API-Key: YOUR_API_KEY"
GET/v1/organizations/{org}/devices/{id}/readings

Read resource details

Required scope: devices:read

Authentication: X-API-Key

Query parameters: limit (default 25, maximum 100) and offset (default 0, maximum 100000). Lists return the collection and pagination with limit, offset, and total.

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/devices/{id}/readings" \
  -H "X-API-Key: YOUR_API_KEY"

Telemetry

#

Send measurements from a device or a trusted backend.

Each reading requires a unique per-device event_id (1–120 bytes), recorded_at in second-resolution UTC ending in Z, and a nonempty metrics object. Recorded times may be historical or at most five minutes ahead.

Identical event retries return the original reading with duplicate: true and HTTP 200. New readings return 201. Reusing an event ID for different data returns 409.

POST/v1/telemetry/reading

Send a reading using X-Device-Key. Alternatively use X-API-Key with telemetry:write and include device_id. Do not send both credential headers.

Authentication: X-Device-Key

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/telemetry/reading" \
  -H "X-Device-Key: YOUR_DEVICE_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
  "event_id": "sensor-001-reading-0001",
  "recorded_at": "2026-10-23T12:00:00Z",
  "metrics": {
    "temperature_c": 24.5
  }
}'

Supported measurements

MetricRange / type
power_w -1000000000 to 1000000000; signed net power
voltage_v 0–100000
current_a -100000 to 100000; signed current
energy_kwh 0–1000000000; caller's counter/measurement, not an inferred delta
battery_soc_percent 0–100
battery_voltage_v 0–100000
solar_power_w 0–1000000000
frequency_hz 0–1000
temperature_c -100–200
grid_available JSON boolean

Numeric values must be finite. Only the supported metric names are accepted; normalize device-specific measurements to these names and units before sending.

POST/v1/telemetry/batch

Upload 1–100 readings for one device using {"readings":[...]}. Each reading uses the single-reading event_id, recorded_at, and metrics contract. Use X-Device-Key, or X-API-Key with telemetry:write and a top-level device_id. Do not combine credential headers.

Maximum request size: 256 KiB; maximum individual normalized JSON reading: 16 KiB. Each attempted reading counts toward the shared device allowance of 1800 per 15 minutes. API keys consume one request per batch.

A completed request returns HTTP 200 with summary counts and ordered results containing index, status (accepted, duplicate, rejected), and http_status. Successful results include reading_id; rejected results include message. Check every result before deleting buffered data. Each successful record is committed independently.

Retry unchanged event IDs and payloads after a timeout or 503. Accepted retries return duplicate. Conflicting event IDs return 409; invalid records return 422; device rate limits return 429 in results with Retry-After: 900. Split oversized requests. Other valid records can succeed when a record is rejected.

Historical data is retained without replacing newer current readings. UTC timestamps ending Z are required; Unix timestamps are not accepted. No historical alert replay occurs. Scheduled metric alerts use the latest measurement and freshness policy; renewed receipts can affect connectivity alerts.

Alerts

#

Create rules for device_offline, stale_readings, low_battery, or grid_loss. Incidents progress from active to acknowledged to resolved.

Rules accept name, device_id, type, optional threshold_value, freshness_seconds, severity (warning or critical), and enabled. Offline/stale thresholds are 60–86400 seconds, default 300. Low-battery thresholds are 1–100%, default 20. Rule evaluation requires a scheduled worker or an explicit evaluation request.

GET/v1/organizations/{org}/alert-rules

Read or list alerts

Required scope: alerts:read

Authentication: X-API-Key

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/alert-rules" \
  -H "X-API-Key: YOUR_API_KEY"
POST/v1/organizations/{org}/alert-rules

Create or update alerts resources

Required scope: alerts:write

Authentication: X-API-Key

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/alert-rules" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sensor offline",
  "device_id": "DEVICE_UUID",
  "type": "device_offline",
  "threshold_value": 300,
  "severity": "warning",
  "enabled": true
}'
POST/v1/organizations/{org}/alert-rules/{id}

Create or update alerts resources

Required scope: alerts:write

Authentication: X-API-Key

GET/v1/organizations/{org}/alerts

Read or list alerts

Required scope: alerts:read

Authentication: X-API-Key

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/alerts" \
  -H "X-API-Key: YOUR_API_KEY"
GET/v1/organizations/{org}/alerts/{id}

Read or list alerts

Required scope: alerts:read

Authentication: X-API-Key

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/alerts/{id}" \
  -H "X-API-Key: YOUR_API_KEY"
POST/v1/organizations/{org}/alerts/{id}/acknowledge

Create or update alerts resources

Required scope: alerts:write

Authentication: X-API-Key

POST/v1/organizations/{org}/alerts/evaluate

Create or update alerts resources

Required scope: alerts:write

Authentication: X-API-Key

Webhooks

#

Connect alert events to your own HTTPS receiver. Subscriptions support alert.triggered, alert.acknowledged, and alert.resolved.

GET/v1/organizations/{org}/webhooks

Read or list webhooks

Required scope: webhooks:read

Authentication: X-API-Key

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/webhooks" \
  -H "X-API-Key: YOUR_API_KEY"
POST/v1/organizations/{org}/webhooks

Create or update webhooks resources

Required scope: webhooks:write

Authentication: X-API-Key

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/webhooks" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Application events",
  "url": "https://your-app.example/webhooks/telematric",
  "subscriptions": [
    "alert.triggered",
    "alert.resolved"
  ]
}'
POST/v1/organizations/{org}/webhooks/{id}

Create or update webhooks resources

Required scope: webhooks:write

Authentication: X-API-Key

POST/v1/organizations/{org}/webhooks/{id}/rotate-secret

Create or update webhooks resources

Required scope: webhooks:write

Authentication: X-API-Key

GET/v1/organizations/{org}/webhook-deliveries

Read or list webhooks

Required scope: webhooks:read

Authentication: X-API-Key

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/webhook-deliveries" \
  -H "X-API-Key: YOUR_API_KEY"
GET/v1/organizations/{org}/webhook-deliveries/{id}

Read or list webhooks

Required scope: webhooks:read

Authentication: X-API-Key

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/webhook-deliveries/{id}" \
  -H "X-API-Key: YOUR_API_KEY"
POST/v1/organizations/{org}/webhook-deliveries/{id}/replay

Create or update webhooks resources

Required scope: webhooks:write

Authentication: X-API-Key

Verify webhook signatures

Creation and rotation return a one-time signing_secret. Each delivery includes Telematric-Signature: t=UNIX_SECONDS,v1=HEX_HMAC_SHA256. Compute HMAC-SHA256 over the timestamp, a literal dot, and the exact raw request body using the full signing secret. Compare in constant time and reject timestamps outside a five-minute window.

Delivery is at least once. Deduplicate by event ID before applying effects and return a successful response for already accepted events. A running worker and enabled outbound delivery are required; registering a webhook alone does not activate delivery.

Device commands

#

Absolute on/off control for compatible smart_socket and gateway adapters.

Control is disabled by default. Enable supported states through the control endpoint after validating your adapter. Command requests require a unique request_id, desired_state (on or off), and optional ttl_seconds (30–300, default 30).

Retry an identical request ID to retrieve the original command; a changed payload returns 409. Only one pending or acknowledged command is allowed per device. Device-reported completion does not independently verify physical state. PowerCell-mapped devices use their separate backend relay instead of generic device polling.

GET/v1/organizations/{org}/devices/{device}/control

Manage control settings or submit and inspect device commands.

Required scope: devices:read

Authentication: X-API-Key

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/devices/{device}/control" \
  -H "X-API-Key: YOUR_API_KEY"
POST/v1/organizations/{org}/devices/{device}/control

Manage control settings or submit and inspect device commands.

Required scope: devices:write AND devices:control

Authentication: X-API-Key

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/devices/{device}/control" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "enabled": true,
  "allow_on": true,
  "allow_off": true
}'
POST/v1/organizations/{org}/devices/{device}/commands

Manage control settings or submit and inspect device commands.

Required scope: devices:control

Authentication: X-API-Key

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/devices/{device}/commands" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "request_id": "device-order-001",
  "desired_state": "off",
  "ttl_seconds": 30
}'
GET/v1/organizations/{org}/devices/{device}/commands

Manage control settings or submit and inspect device commands.

Required scope: devices:read

Authentication: X-API-Key

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/devices/{device}/commands" \
  -H "X-API-Key: YOUR_API_KEY"
GET/v1/organizations/{org}/devices/{device}/commands/{command}

Manage control settings or submit and inspect device commands.

Required scope: devices:read

Authentication: X-API-Key

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{org}/devices/{device}/commands/{command}" \
  -H "X-API-Key: YOUR_API_KEY"
POST/v1/device/commands/poll

{}

Authentication: X-Device-Key

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/device/commands/poll" \
  -H "X-Device-Key: YOUR_DEVICE_SECRET" \
  -H "Content-Type: application/json" \
  -d '{}'
POST/v1/device/commands/{command}/result

Status and optional failure code

Authentication: X-Device-Key

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/device/commands/{command}/result" \
  -H "X-Device-Key: YOUR_DEVICE_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
  "status": "completed"
}'

Weather & energy

#

Specialized intelligence for energy applications, alongside the core IoT platform.

GET/v1/weather/forecast

Current conditions and hourly forecasts. Requires latitude (-90–90) and longitude (-180–180); days is 1–7, default 7. Preserve provider attribution returned in the response.

Required scope: weather:read

Authentication: X-API-Key

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/weather/forecast?latitude=4.89&longitude=7.13&days=1" \
  -H "X-API-Key: YOUR_API_KEY"
POST/v1/solar/forecast

Model a fixed solar array using coordinates, capacity_kwp, inverter_kw, and optional orientation/loss inputs. The output is an estimate, not measured generation.

Required scope: solar:read

Authentication: X-API-Key

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/solar/forecast" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "latitude": 4.89,
  "longitude": 7.13,
  "days": 7,
  "capacity_kwp": 5,
  "inverter_kw": 4,
  "tilt_degrees": 15,
  "azimuth_degrees": 180,
  "loss_percent": 14,
  "temperature_coefficient": -0.004,
  "noct_c": 45
}'
POST/v1/battery/forecast

Model 1–168 sequential hourly solar/load inputs with a battery configuration. start_at is optional and must be a whole UTC hour. This endpoint uses caller-provided scenarios.

Required scope: battery:read

Authentication: X-API-Key

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/battery/forecast" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "start_at": "2026-10-22T12:00:00Z",
  "battery": {
    "capacity_kwh": 10,
    "initial_soc_percent": 60,
    "reserve_percent": 20,
    "charge_limit_kw": 3,
    "discharge_limit_kw": 3,
    "charge_efficiency": 0.95,
    "discharge_efficiency": 0.95
  },
  "hourly": [
    {
      "solar_kwh": 3,
      "load_kwh": 1
    },
    {
      "solar_kwh": 1,
      "load_kwh": 2
    },
    {
      "solar_kwh": 0,
      "load_kwh": 4,
      "grid_available": true,
      "grid_import_limit_kw": 1
    }
  ]
}'
POST/v1/energy/plan

Combine nested solar and battery settings with load_kw or hourly_load_kw and optional flexible appliances. This computes a plan and never sends device commands.

Required scope: battery:read + solar:read + recommendations:read

Authentication: X-API-Key

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/energy/plan" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "solar": {
    "latitude": 4.89,
    "longitude": 7.13,
    "days": 7,
    "capacity_kwp": 5,
    "inverter_kw": 4,
    "tilt_degrees": 15,
    "azimuth_degrees": 180,
    "loss_percent": 14,
    "temperature_coefficient": -0.004,
    "noct_c": 45
  },
  "battery": {
    "capacity_kwh": 10,
    "initial_soc_percent": 60,
    "reserve_percent": 20,
    "charge_limit_kw": 3,
    "discharge_limit_kw": 3,
    "charge_efficiency": 0.95,
    "discharge_efficiency": 0.95
  },
  "load_kw": 1
}'

Forecast endpoints require developer keys. Weather provider failures return 503; no fabricated weather is returned. Solar and battery outputs are models based on supplied assumptions.

Accounts & API keys

#

Manage identity, workspaces, and integration credentials.

See how we handle data and our customer-data terms for storage, live reads, selected snapshots, training authorization and support-assisted requests.

When verification is required, verify your email before login. Signup returns the current requirement; email delivery and verification policy are separate settings. Passwords must contain 12–72 bytes. Login sessions last 24 hours. Key management requires an owner or admin membership. Key expiry is 1–365 days, default 90; rotation immediately revokes the original key.

POST/v1/auth/signup

Required fields: email, password, display_name, organization_name, country, phone_country_code and phone_number. Creates the account and owner workspace atomically; returns 202 with the current verification requirement. Replace example contact values before use. Where enabled, supply captcha_token from the configured challenge.

Authentication: No authentication

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/auth/signup" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "owner@example.com",
  "password": "REPLACE_WITH_A_STRONG_PASSWORD",
  "display_name": "Your name",
  "organization_name": "Your company",
  "country": "US",
  "phone_country_code": "+1",
  "phone_number": "2025550123"
}'
POST/v1/auth/verify-email

token; verifies email

Authentication: No authentication

POST/v1/auth/resend-verification

email; generic 202 acknowledgement

Authentication: No authentication

POST/v1/auth/login

email, password; returns bearer token and expiry

Authentication: No authentication

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/auth/login" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "owner@example.com",
  "password": "YOUR_PASSWORD"
}'
GET/v1/auth/me

Bearer token; returns safe account fields

Authentication: Authorization: Bearer

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/auth/me" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"
POST/v1/auth/logout

Bearer token; revokes current session

Authentication: Authorization: Bearer

POST/v1/auth/forgot-password

email; generic 202 acknowledgement

Authentication: No authentication

POST/v1/auth/reset-password

token, password; changes password and revokes all sessions

Authentication: No authentication

GET/v1/organizations

Bearer token; lists only accessible active workspaces

Authentication: Authorization: Bearer

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"
POST/v1/organizations

Bearer token and name; creates another owned workspace

Authentication: Authorization: Bearer

GET/v1/organizations/{id}

Bearer token; inaccessible or absent workspaces return 404

Authentication: Authorization: Bearer

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"
GET/v1/api-key-scopes

List supported scope names

Authentication: Authorization: Bearer

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/api-key-scopes" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"
POST/v1/organizations/{id}/api-keys

Create a key

Authentication: Authorization: Bearer

bash
curl -X POST "https://YOUR_TELEMATRIC_HOST/v1/organizations/{id}/api-keys" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Application backend",
  "scopes": [
    "devices:read",
    "devices:write",
    "telemetry:write"
  ],
  "expires_in_days": 90
}'
GET/v1/organizations/{id}/api-keys

List safe key metadata, including revoked keys

Authentication: Authorization: Bearer

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{id}/api-keys" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"
POST/v1/organizations/{id}/api-keys/{keyId}/rotate

Issue replacement and immediately revoke original

Authentication: Authorization: Bearer

POST/v1/organizations/{id}/api-keys/{keyId}/revoke

Revoke a key; repeat revocation is idempotent

Authentication: Authorization: Bearer

GET/v1/organizations/{id}/api-usage

Current UTC month totals, limits, and per-key counts

Authentication: Authorization: Bearer

bash
curl "https://YOUR_TELEMATRIC_HOST/v1/organizations/{id}/api-usage" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

AI & model training

#

Shared training logic. Separate customer data, models, and service versions.

Training is disabled by default. An owner/admin enables services and retention in AI & training. Native telemetry must be explicitly mapped to source devices; customer backends can send scheduled batches. Daily jobs train only eligible snapshots. A trained model must improve on its baseline and active version before promotion.

Supported prediction tasks use fixed service schemas, with separate workspace data, models and policy authorization. Outputs may use trained models, rules or physics; the evaluation gate is not a guarantee of accuracy or savings. Model scope is workspace/service-specific, not automatically one model per site. Battery lifespan and water-usage forecasting are not implemented.

GET/v1/organizations/{org}/ml

Read training policy, sample counts, and feature schemas.

Access: ml:read

POST/v1/organizations/{org}/ml/policy

Authorize training services, retention_days (7–365), and optional telemetry_sources. Owner/admin account session only. Integration keys cannot grant consent.

Access: Owner/admin session

POST/v1/organizations/{org}/ml/batches

Submit batch_id and 1–250 labeled samples. Identical retries are idempotent; changed batch/sample IDs return 409.

Access: ml:write

GET/v1/organizations/{org}/ml/models

Read customer-specific model versions, evaluation metrics, and active models.

Access: ml:read

POST/v1/organizations/{org}/ml/models/{service}/rollback

Restore the previous model for the same customer, service, and policy revision.

Access: ml:write

POST/v1/organizations/{org}/ml/predict/{service}

Predict with your workspace model or an explicitly labeled rule/physics fallback. Service names: load, grid, battery, solar, runtime, ranker.

Access: ml:predict

Training features and labels

Every sample requires service, sample_id, a past/current UTC recorded_at timestamp, features, and target. Feature names must match the service exactly. Classification labels are 0 or 1. Calendar inputs use UTC, with Sunday=0 through Saturday=6; is_weekend is 0 or 1 in training samples. Use pseudonymous sample IDs and exclude customer contact details and secrets.

ServiceFeaturesTarget
loadhour_of_day, day_of_week, is_weekend, temperature_2m, cloud_cover, precipitation_probability, battery_soc_percent, solar_forecast_kwhObserved hourly load, kWh
gridhour_of_day, day_of_week, is_weekend, recent_availability, same_hour_availabilityAvailability: 0 or 1
batteryhour_of_day, day_of_week, is_weekend, battery_soc_percent, power_watts, energy_kwh, voltage, solar_power_watts, load_power_watts, battery_capacity_kwh, efficiencyObserved next-hour SOC, %
solarhour_of_day, day_of_week, is_weekend, baseline_kwh, irradiance_w_m2, temperature_2mMeasured hourly generation, kWh
runtimerated_watts, current_runtime_minutes, typical_runtime_minutes, time_of_day, day_of_weekAbnormal runtime: 0 or 1
rankerappliance_power_kw, runtime_minutes, battery_soc_percent, next_3h_solar_kwh, next_3h_predicted_load_kwh, next_6h_grid_probabilityLabeled usefulness/priority score, 0–10

At least 120 samples spanning seven days are required. Data is split chronologically for training and validation. Unchanged snapshots are skipped. Model promotion, rollback, and training authorization are scoped to one workspace; no shared global model is used.

Turning authorization off stops trained-model use and deletes training samples. Private model-file cleanup is attempted immediately and retried by the daily job. The daily job and the customer’s transfer agent must be scheduled by their operators.

Firmware OTA updates

#

Ship firmware improvements to compatible devices already in the field.

OTA currently supports integrated PowerCell ESP32 collectors (gateways) and sockets using the esp32dev model. Devices need a PowerCell binding, an OTA-capable application image, and an enrolled device credential. Other hardware requires firmware integration.

01

Enroll and upload

Enroll the device, securely provision its returned OTA token, and upload a versioned application firmware.bin using multipart field file. Releases are validated for hardware identity, image size, and SHA-256 integrity.

02

Schedule an update

Schedule a release for a compatible device that reports healthy older firmware. Only one deployment per gateway group can be active. Queued deployments can be cancelled.

03

Track the result

Devices poll for updates, download their authorized binary, and report progress. Success requires a healthy report of the new version after reboot.

GET/v1/organizations/{org}/firmware

List enrolled targets, releases, and deployment outcomes.

Access: firmware:read

POST/v1/organizations/{org}/devices/{id}/firmware/enroll

Enroll or rotate the OTA credential for a bound device; provide hardware_id. Store the returned ota_token securely.

Access: devices:write + firmware:write

POST/v1/organizations/{org}/firmware/releases

Upload application firmware.bin in multipart field file, with optional notes.

Access: firmware:write

POST/v1/organizations/{org}/devices/{id}/firmware/deployments

Schedule an update with JSON release_id.

Access: firmware:write

POST/v1/organizations/{org}/firmware/deployments/{id}/cancel

Cancel a queued deployment.

Access: firmware:write

POST/v1/powercell/firmware/check

Report device identity, installed version, health, and progress; receive an eligible update manifest.

Access: X-Api-Key with firmware:read + X-Powercell-Ota-Token

GET/v1/powercell/firmware/download/{id}

Download the binary authorized for this device and active deployment. The PowerCell adapter translates the manifest compatibility path /api/firmware/download/{id} to this provider endpoint.

Access: X-Api-Key with firmware:read + X-Powercell-Ota-Token

Management writes require an owner/admin session or an appropriately scoped integration key. Keep management keys on your backend and use HTTPS for device traffic. Manage OTA through the API or the Firmware updates dashboard.

Pagination & limits

#

Predictable requests, scoped to your workspace.

Most lists accept limit (default 25, maximum 100) and offset (0–100000). Responses include the collection and pagination with limit, offset, and total.

Default developer-key limits are 60 requests per minute per key and 10,000 requests per organization per UTC calendar month. Deployment settings can change these values. Check the Usage page for your current allowance.

Accepted key authentication reserves one request, including cached responses and subsequent validation/provider failures. Invalid credentials and scope denials do not consume developer quota. Rotating a key does not reset usage.

Errors & response codes

#

Use HTTP status codes to decide what your integration does next.

StatusMeaningNext step
200 / 201Success / resource createdProcess the returned JSON.
202Request acknowledgedFollow the endpoint’s verification or onboarding flow.
400Invalid request or tokenCheck token format and request syntax.
401Missing, invalid, expired, or revoked credentialCheck the credential type and rotate or sign in if necessary.
403Missing scope or access deniedCheck workspace status, membership, and required scopes.
404Resource not found or unavailableConfirm the ID and organization ownership.
409ConflictCheck duplicate event IDs, command state, or resource configuration.
422Validation failedCorrect the request body or query values.
429Rate limit or quota reachedReduce request frequency or inspect your workspace usage.
503Provider or service unavailableRetry with backoff after checking service availability.
JSON · error envelope example
{
  "status": "error",
  "message": "Invalid request."
}

Resumable workspace export

#

Export retained fleet records, native telemetry, water records, selected laboratory/GIS revision history and connector identity links as bounded JSON pages. Use an owner/admin session or a dedicated backend key with exports:read. This grants bulk access to all manifest categories, including customer contact information and retained laboratory results. No paid service activation is required; ordinary request limits still apply.

GET /v1/organizations/{org}/exports
GET /v1/organizations/{org}/exports/telemetry?limit=100

The manifest lists fields, units and exclusions. Save each page and repeat the same category/limit with URL-encoded cursor=next_cursor. Stop at complete: true and a null cursor. Most categories allow up to 100 records and 256 KiB of record data. Laboratory revisions and GIS snapshots allow up to 10 records and 1 MiB. Read category-specific limits and record keys from the manifest; envelope overhead is additional. Tokens expire after 24 hours; authorization is checked on every page. A token alone does not grant access. Deduplicate by the manifest record key when retrying or restarting; consumption and laboratory histories use parent ID plus numeric revision.

Exports are bounded live reads: later arrivals are excluded by an initial server cutoff, while updates/deletions can change subsequent or replayed pages. Telemetry eligibility uses server receipt time; original device timestamps and metric values are preserved. Categories do not share an immutable snapshot. Credentials, configuration secrets and raw audits are excluded.

This initial version is not a complete workspace archive. Water exports preserve original units, source IDs, approval states and all retained consumption revisions. Selected SENAITE result histories preserve precision and publication flags; GIS snapshot histories retain stored CRS and geometry. Source references join through the parent categories. These exports do not fetch live lims.science/source inventories or establish current laboratory approval. Billing, model artifacts and other manifest exclusions remain accessible through supported read APIs or support-assisted export. CSV and wider archive coverage remain planned. Export does not cancel subscriptions or delete data. Ask support@telematric.com for a consistent archive or assistance with request limits.

Disconnect & selected data deletion

#

In Connector guide → Disconnect & retained data, managers can disconnect supported software connectors and forget their saved credentials. History and subscriptions remain separate. No paid activation is required to disconnect.

POST /v1/organizations/{org}/connectors/{provider}/disconnect
{"expected_revision":3,"disconnect_confirmed":true}

Use a manager session or connectors:manage plus the provider management scope. Disconnect increments the configuration revision, clears saved credentials and verification, and releases the allocation. Reconnect requires new credentials and verification; managed labs need the platform team. Already-dispatched requests may finish. Revoke credentials at the vendor for source-side revocation. This does not cancel renewal, stop hosted laboratory infrastructure or affect Telematric’s separate billing gateway.

Workspace owners can preview and permanently delete selected local GIS records with snapshot history, selected SENAITE samples with result history, or identity links. The relevant source must be disconnected first and active synchronization leases must finish. Export first if needed. These actions do not delete source-system records, water installations, subscriptions or unrelated identity links.

POST /v1/organizations/{org}/data-deletions/preview
{"category":"gis_records","record_ids":["YOUR_RECORD_UUID"]}

POST /v1/organizations/{org}/data-deletions/confirm
{"confirmation_token":"YOUR_PREVIEW_TOKEN","delete_confirmed":true,"current_password":"YOUR_CURRENT_PASSWORD"}

GET /v1/organizations/{org}/data-deletions

Deletion requires the owner account session and current password; API keys and administrator/member/viewer sessions cannot authorize it. Preview accepts 1–20 UUIDs and at most 1,000 history rows. Its token expires in ten minutes and binds the owner, workspace, selected records and connector revisions. Changed selections, reconnections and active leases require a fresh preview. Confirmation is transactional; retries return the same receipt. The history endpoint returns the owner’s latest 100 receipts.

Deletion applies to the active database only. Backups, logs, replicas, exported files and vendor copies are separate; backup_erasure_complete remains false. The receipt table is not an independent restore-safe ledger. Keep restored systems offline until the newest deletion and disconnect evidence has been reconciled; if that evidence is unavailable, request operator review. Whole-workspace erasure and automatic backup reconciliation remain support-assisted.

Data handling & customer exit

#

Native telemetry and operational history are stored by Telematric. SAP/Maximo reads are bounded source requests; selected GIS and laboratory records may be retained as snapshots. APIs return the supported records, not a promise of a complete source-system mirror.

Use workspace-scoped APIs and keep source IDs, units, timestamps and provenance in your application. AI training requires explicit workspace/service authorization; disabling it is different from deleting original telemetry.

Stopping renewal, disconnecting a source, revoking a key and deleting retained records are separate actions. Complete workspace archives and erasure beyond the selected local categories remain support-assisted: hello@telematric.com. Do not assume that cancellation erases data, that a backup is an export, or that expiry immediately deletes every stored copy.

Resumable JSON export for the documented retained-data categories is available above; broader archive coverage and retention automation remain roadmap work. Check effective API limits in Usage and platform pricing. Current data-handling controls are described in our privacy policy and terms.

Pre-silicon Studio

Test device behaviour in the browser with six simulation profiles, fault injection, flash/RAM/battery estimates and network buffering. Standalone use requires no account or credentials.

For Telematric telemetry, enter a dedicated development API key with devices:read and telemetry:write, your workspace UUID and a registered development device UUID. Requests follow the same public API permissions and usage limits as your own integration. Saved studio projects contain metadata, never keys.

Telematric OTA is a separate opt-in. It needs firmware:read and an existing supported ESP32 target’s separate OTA token. Virtual tests verify firmware bytes and simulate reboot, health and rollback reporting; they do not execute binaries or test physical flashing. Other backends and OTA tooling remain yours to use.

Open Pre-silicon Studio ↗ · Setup, scopes and limitations →