← Back to home

What is i3X?

i3X — the Industrial Information Interoperability eXchange — is a REST/JSON API standard for industrial data, initiated by CESMII, the US Smart Manufacturing Institute. It gives web, cloud, and AI developers a simple, vendor-neutral HTTP surface over structured industrial information.

Why another industrial API?

Industrial data overwhelmingly lives behind OPC UA — the established, richly-modeled substrate for cross-vendor data exchange on the factory floor. But consuming OPC UA requires an OPC UA SDK, binary protocols, and domain expertise that most web and cloud teams don't have. i3X closes that gap: plain HTTPS, JSON payloads, JSON Schema typed models, and Server-Sent Events for streaming. Any developer who can call fetch() can consume industrial data.

i3X is not a replacement for OPC UA — it is a web-native surface on top of it. The information model DNA is shared, which is what makes a faithful automated translation possible.

How OPC UA maps to i3X

OPC UAi3XMeaning
ObjectassetA container — machine, sensor, subsystem
VariablepropertyA data point — temperature, speed, state
MethodactionAn operation — Start, Stop, Brew
NamespacenamespaceLogical scope for types and instances
ObjectTypeobjectTypeSchema with a JSON Schema definition
ReferencerelationshipTyped link between objects

One standout i3X feature is the decomposable asset model: query any asset and receive its entire internal state — all child properties, recursively — in a single REST call. No walking the address space node by node.

See it on the wire

Two examples against a live portal instance. $BASE and $TOKEN are the endpoint URL and bearer token shown on your dashboard instance card.

Read an asset — all of it — in one call

maxDepth: 0means "recurse to infinite depth": the response carries the value, quality, and timestamp of every child property of the asset.

curl -X POST $BASE/v1/objects/value \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"elementIds": ["<elementId-from-/v1/objects>"], "maxDepth": 0}'

# → {
#     "isComposition": true,
#     "value": null,
#     "quality": "Good",
#     "timestamp": "2026-07-18T20:41:03Z",
#     "components": {
#       "SpindleSpeed": { "value": 12000, "quality": "Good", "timestamp": "..." },
#       "FeedRate":     { "value": 500,   "quality": "Good", "timestamp": "..." }
#     }
#   }

Subscribe to value changes — polling, without losing changes

i3X polling is not"read the current value in a loop". The server keeps a real OPC UA subscription open to the underlying server and stages every change into numbered batches on your behalf. Your client polls at its own pace and acknowledges what it has processed — changes that happen between two polls are queued, not lost.

Step 1 — create a subscription (cache the returned subscriptionId):

curl -X POST $BASE/v1/subscriptions \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"clientId": "my-app"}'

# → { "clientId": "my-app", "subscriptionId": "sub-1f3c..." }

Step 2 — register the elements to monitor:

curl -X POST $BASE/v1/subscriptions/register \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "clientId": "my-app",
    "subscriptionId": "sub-1f3c...",
    "elementIds": ["<elementId>"],
    "maxDepth": 1
  }'

Step 3 — poll with sync. Each call does two things at once: it acknowledges the batches you already processed (every batch with sequenceNumber ≤ your lastSequenceNumber is discarded server-side) and returns all batches still pending:

curl -X POST $BASE/v1/subscriptions/sync \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"clientId": "my-app", "subscriptionId": "sub-1f3c...", "lastSequenceNumber": 41}'

# → [ { "sequenceNumber": 42,
#       "updates": [ { "elementId": "...", "value": 12050,
#                      "quality": "Good", "timestamp": "..." } ] },
#     { "sequenceNumber": 43, "updates": [ ... ] } ]
# next call: pass "lastSequenceNumber": 43 to acknowledge these

If your client polls too slowly and the staging queue overflows, the server answers 206 instead of 200 so you know updates were dropped — poll faster or register fewer elements. And when you'd rather be pushed than poll, the same subscription can be consumed as a live Server-Sent Events stream via /v1/subscriptions/stream. Full details in the interactive docs at $BASE/v1/docs, or follow the getting-started guide.

Who is behind i3X?

i3X is an initiative of CESMII — The Smart Manufacturing Institute (see i3x.dev), with a public specification and an official conformance test suite. Sterfive — the company behind the node-opcua open-source OPC UA stack and an OPC Foundation Corporate Member — maintains node-i3x, an i3X 1.0 Compatible implementation (52 required conformance checks, 0 failures) that translates any OPC UA server into an i3X REST API.

Try i3X live, free

This portal exists so you can answer "how does i3X handle X?" with a live experiment instead of reading specs. Connect your own OPC UA server — or use our public demo server preloaded with DI, Robotics, MachineVision, PackML, and Machinery companion spec content — and get a private i3X REST endpoint in seconds.

Go deeper