Request
Use GET /api/customer/v1/data with a site returned by discovery.
| Parameter | Required | Meaning |
|---|---|---|
siteId |
Yes | A site identifier returned by discovery. |
lineId |
No | Narrows the request to one line returned under the site. |
machineId |
No | Narrows the request to one machine. lineId is required when supplied. |
from |
Yes | Inclusive start of the requested interval as an RFC 3339 timestamp with offset. |
to |
Yes | Exclusive end of the interval; it must be later than from. |
tagGuid |
No | Repeat for up to 100 Friendly Tags. Use values returned by discovery. |
aggregationIntervalSeconds |
No | Positive requested bucket width through 86400 seconds. The default is 60 and the effective minimum is applied. |
pageSize |
No | Positive requested number of aggregate points. The effective maximum is applied. |
cursor |
No | Opaque nextCursor from the preceding page. |
This request reads one hour of one Friendly Tag in 60-second buckets:
GET /api/customer/v1/data?siteId=site-1&lineId=line-1&machineId=machine-1&tagGuid=11111111-1111-4111-8111-111111111111&from=2026-09-01T12%3A00%3A00Z&to=2026-09-01T13%3A00%3A00Z&aggregationIntervalSeconds=60&pageSize=1000
Authorization: Bearer <access-token>
Accept: application/json
Success response
The response writes metadata once per logical series and places time-varying
values in points:
{
"aggregation": {
"intervalSeconds": 60,
"method": "timeWeightedLocf"
},
"series": [
{
"siteId": "site-1",
"siteName": "Plant One",
"lineId": "line-1",
"lineName": "Packaging",
"machineId": "machine-1",
"machineName": "Case Packer",
"deviceId": "device-1",
"tagGuid": "11111111-1111-4111-8111-111111111111",
"tagName": "IsRunning",
"dataType": "Bool",
"engineeringUnits": null,
"category": "connection",
"valueMeaning": "percentTimeTrue",
"points": [
{
"timestamp": "2026-09-01T12:00:00Z",
"value": 100,
"minimum": 100,
"maximum": 100,
"sampleCount": 0
}
]
}
],
"nextCursor": null
}
Interpret aggregate values
timeWeightedLocf carries the last known value forward and weights values by
how long they apply within each bucket. A quiet signal does not disappear merely
because it did not publish another observation during the bucket.
| Field | Meaning |
|---|---|
aggregation.intervalSeconds |
Effective bucket width. Read it instead of assuming the requested width was accepted unchanged. |
points[].timestamp |
UTC start of the aggregate bucket. |
valueMeaning: timeWeightedAverage |
value is the time-weighted average for a numeric Friendly Tag. |
valueMeaning: percentTimeTrue |
value is the percentage of known bucket time that a Boolean Friendly Tag was true, from 0 through 100. |
minimum, maximum |
Lowest and highest values represented during the bucket. Boolean values use the 0-through-100 scale. |
sampleCount |
Observations received in the bucket. Zero can still accompany a valid value carried from an earlier observation. |
sampleCount is not a completeness percentage. A logical series is identified
by siteId, lineId, machineId, deviceId, and tagGuid.
Paging and clamping
pageSize counts points, not series envelopes. The same logical series can
appear on more than one page; merge points by series identity and timestamp.
An oversized page size is capped and reported by X-Effective-Page-Size. An
aggregation interval below the permitted minimum is raised and reported by
X-Effective-Aggregation-Interval-Seconds.
Follow nextCursor as described in pagination and data
consistency. A null value completes the
current traversal.
Errors
Malformed or conflicting parameters return 400. Authorization and policy
failures return 401 or 403; rate exhaustion returns 429. See resolve
Customer API errors for corrective actions.