List a machine's signals
Required scope: signals.read.
Return the raw sensor signals a machine exposes, with the public_id needed to read samples.
A signal is one sensor channel read by the machine, named after the physical quantity it
carries (current, count, product_count, cycle, energy, temperature,
pressure, ...). A machine can expose several signals with the same name; their
display_name tells them apart. Soft-deleted signals and signals without a kind are not listed.
description is in English by default; pass language=es for Spanish. A description with no
translation in the requested language is returned in English.
Path Parameters
The machine's uuid, as returned by GET /v1/machines.
uuidQuery Parameters
Language of each signal's description. Falls back to English.
"en"Value in
- "en"
- "es"
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/machines/497f6eca-6276-4993-bfeb-53cbbbba6f08/signals"{ "machine_uuid": "01748f7c-9688-7abc-8def-0123456789ab", "signals": [ { "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601", "name": "string", "display_name": "string", "description": "string" } ]}Add defects by time POST
Add defective units of a SKU to the shift that machine machineId was running at time, including shifts that have already ended. time is a timestamp within the intended shift. Use this route when you know the machine and such a timestamp, but not the shift id. What a defect is. Defects are counted in defective units of the SKU, not in individual flaws: a unit with three scratches is one defective unit. How defects add up. Each request records an additional quantity of defective units against the entire shift, as a new defects production log of quantity units of the SKU. Quality and OEE metrics are recalculated asynchronously. Requests never replace earlier ones: * Sending quantity: 2 and then quantity: 3 records 5 defective units. * Sending the same request twice records the defects twice, unless both carry the same Idempotency-Key (see below). * A shift listed twice by GET /v1/shifts, from two consecutive ranges, is still one shift: process each id once, or list with match=start. * To undo a call, delete the log it returned with DELETE /v1/production-logs/{id}, which needs the production_logs.delete scope. To see what a shift already has, list its defects with GET /v1/shifts/{shift_id}/defects, which needs shifts.read. Grant both to an integration that reconciles or undoes what it sends; with shifts.update alone it can add defects but not check or remove them. Defects are not attributed to any operator, and they can be added to past shifts, including ones whose production was reviewed. The SKU is given by exactly one of id or name, and it must already be one of your SKUs: these endpoints never create one. The response's sku shows the SKU the defects went to. Errors carry a stable code (see the responses below): * 400 shift_not_found: no shift matches. * 400 shift_not_started: the shift has not started yet. * 400 insufficient_production: the shift does not have enough production of that SKU to hold the defects. * 404 sku_not_found: sku.id or sku.name is not one of your SKUs. * 409 idempotency_key_reused: the Idempotency-Key was already used with a different request. * 409 idempotency_key_in_progress: the original request with that Idempotency-Key is still being processed. Retries and Idempotency-Key. Whether a failed call recorded anything depends on how it failed: * A 4xx response means the request was rejected and nothing was recorded. Fix it and send it again. * A timeout, a dropped connection or a 5xx response leaves the outcome unknown: the request may have been recorded even though you never got the response. Sent again without an Idempotency-Key, it can be recorded twice, so first check whether it was recorded, for example with POST /v1/production-logs/filters. To retry safely instead, send an Idempotency-Key header with a unique value you generate for each request, such as a UUID, and send the same key and the same body on every retry of that request. The key is stored together with what the request recorded, so a retry never records it twice: * If the original request was recorded, the retry records nothing and returns the original response, with the header Idempotent-Replayed: true. * If the original was not recorded, whether it was rejected or failed, the retry is processed as a new request. * Reusing a key with a different request, another body or URL, returns 409. * In the rare case that the original is still being processed, the retry returns 409. Retry again shortly. Keys are scoped to your company, so all of its API keys share them, and each key is kept for 24 hours after the request that recorded it. After that, a request with the same key is processed as a new one, so retry within that window.
Read signal data GET
Return aggregated raw sensor points for one signal. Samples are bucketed before they are returned. The bucket width is agg_period x agg_unit (agg_period=15, agg_unit=m is a 15-minute bucket) and agg_function is how samples inside a bucket are reduced. By default points are returned as a data list of {timestamp, value} objects. Pass transpose=true to get two arrays of equal length instead, timestamps and values, where values[i] belongs to timestamps[i]. It carries the same points in a smaller body. Two limits are enforced and both reject the request rather than truncating the response: the window between start_time and end_time may not exceed 7 days, and a query may not produce more than 12,000 points. The defaults (agg_unit=s, agg_period=1) reach the point ceiling after under three and a half hours, so most callers set them explicitly.