# Elemental Machines > LabOps connectivity platform. IoT sensors plus a vendor-agnostic cloud that monitors laboratory > and manufacturing environments — cold storage and freezer health, environmental conditions, > equipment utilization, alerting, calibration and compliance reporting — for life sciences R&D, > biomanufacturing, academia and government facilities. Telemetry is captured at 15-second > resolution and exposed through a public REST API. Generated by API Evangelist on 2026-08-12 from the provider's own published contract. The provider does not publish an llms.txt of its own (https://elementalmachines.com/llms.txt returns HTTP 404). ## What an agent can actually do here The REST API at `https://api.elementalmachines.io` is READ-ONLY apart from the token exchange. There are seventeen operations and no create, update or delete. An agent can read telemetry, statistics, utilization, alerts, users and audit activity. It cannot arm an alert, acknowledge an incident, register a sensor or change any configuration through the public API. Authentication is OAuth 2.0 Resource Owner Password Credentials: POST https://api.elementalmachines.io/oauth/token username, password, client_id, client_secret, grant_type (form-encoded) The resulting token is then passed as an `access_token` QUERY PARAMETER on every call — not as an Authorization header. There is no scope; a token carries everything the user can see. Access is bounded by customer group: another group's machine returns 403, an unknown UUID returns 404. Only one operation answers without a token: `GET /api/status/check.json`. ## Contract - OpenAPI 3.1 (API Evangelist conversion): openapi/elemental-machines-api-openapi.yml - Provider's original Swagger 1.2 resource listing: https://api.elementalmachines.io/docs/api-docs.json - Provider's original per-resource declarations, verbatim: openapi/_original/ - Interactive console: https://api.elementalmachines.io/ ## Operations ### Machines - `GET /api/machines.json` — `machinesIndex` — all machines for the caller - `GET /api/machines/{uuid}.json` — `machinesShow` — one machine ### Telemetry - `GET /api/machines/{machine_uuid}/samples.json` — `machineSamplesIndex` — raw sensor samples over a `from`/`to` epoch window, with `order` and `limit` - `GET /api/machines/{machine_uuid}/sample_stats.json` — `machineSampleStatsIndex` — server-computed min, max, mean and median over a `from`/`to` window ### Utilization - `GET /api/machines/usage/aggregated.json` — `machinesUsageAggregated` - `GET /api/machines/usage/hourly.json` — `machinesUsageHourly` - `GET /api/machines/usage/status.json` — `machinesUsageStatus` All three REQUIRE `customer_group_uuid`, `page` and `per_page`. They accept `time_zone`, `start_work_hour`, `end_work_hour`, `work_days[]`, `start_date`, `end_date`, `location_tags[]`, `equipment_category_tags[]`, `machine_uuids[]`, `sort_by` and `sort_direction`. ### Alerts - `GET /api/machines/{machine_uuid}/alert_logs.json` — `alertLogsIndex` — alert history for a machine - `GET /api/alert_rules.json` — `alertRulesIndex` — configured rules, filterable by `managed_machine_uuid` ### Identity and audit - `GET /api/users.json` — `usersIndex` - `GET /api/users/my.json` — `usersMy` - `GET /api/customer_groups.json` — `customerGroupsIndex` - `GET /api/customer_groups/my.json` — `customerGroupsMy` - `GET /api/user_activities.json` — `userActivitiesIndex` — audit trail, filterable by `customer_group_uuid`, `usage_type`, `action_type`, `from`, `to`, `order`, `limit` ### Platform - `GET /api/release_notes.json` — `releaseNotesIndex` — dated release notes, filterable by `software`, `from_date`, `to_date`; requires `page` and `per_page` - `GET /api/status/check.json` — `statusCheck` — unauthenticated subsystem health - `POST /oauth/token` — `oauthToken` — access token ## Rules an agent should follow 1. Resolve UUIDs before nesting. Call `machinesIndex` and `customerGroupsMy` first; never guess a `machine_uuid` or `customer_group_uuid`. A guess returns 403 (not yours) or 404 (does not exist). 2. Prefer `sample_stats.json` over `samples.json` when you only need aggregates. The server already computes min/max/mean/median; pulling raw 15-second series to average them client-side is waste. 3. Window every time-series read with `from` and `to` epoch integers and set `limit`. There is no next-page token on these endpoints — you advance the window yourself. 4. Always send `page` and `per_page` on the three usage operations and on release notes. They are REQUIRED; omitting them returns 400 "Invalid parameters." 5. Treat 401 as the refresh trigger. Token lifetime is not published, so re-run `/oauth/token` on any 401 and retry once. 6. Use `If-None-Match` when polling. Responses carry a weak ETag with `cache-control: max-age=0, private, must-revalidate`. 7. Log `x-request-id` from every response. It is undocumented but always present, and it is the only handle support can act on. 8. There is no published rate limit and no `Retry-After`. Back off conservatively on your own schedule; no server signal will tell you when you are close. 9. `location_tags[]` takes a single text value per the provider's own note ("e.g. Lab 24"); the multi-value encoding is not published. 10. Do not put the `access_token` anywhere it will be persisted. It is a query parameter with no scope and no documented expiry. ## Errors `400` Invalid parameters. · `401` Not Authorized · `403` Forbidden (wrong customer group) · `404` Not Found. No `429` and no `5xx` are declared. No error body schema is published — there is no error code to branch on beyond the HTTP status. ## Agent surfaces - MCP: a remote MCP server exists at `https://elementalmachines.com/wp-json/mcp/mcp-oauth-server`, but it is a WordPress CONTENT server on the marketing site, not an interface to the LabOps API, and `tools/list` returns 401. It cannot read a freezer temperature. - A2A: no agent card is served on any host. - There is no agent-callable path to the LabOps data. Use the REST API directly. ## Company - Website: https://elementalmachines.com/ - Status: https://status.elementalmachines.io (Atlassian Statuspage; API is a named component) - Support: https://elementalmachines.com/support/ · https://elementalmachines.freshdesk.com/support/solutions · help@elementalmachines.io - News: https://elementalmachines.com/about/news/ - Trial request: https://elementalmachines.com/request-a-trial/ (sales-led; no public pricing) - Compliance: ISO 9001:2015 certified, ISO 17025 calibration, 21 CFR Part 11 / ALCOA+ claimed, GxP ## Profile artifacts authentication/ · scopes/ · conventions/ · errors/ · data-model/ · lifecycle/ · changelog/ · conformance/ · rate-limits/ · plans/ · packages/ · security/ · well-known/ · mcp/ · overlays/ · skills/