Assign operator by time

Assign an operator to the shift that machine machineId was running at start. Use it to record who ran a machine after the shift ended, for example a day later from a planning system. For a live shift at a floor terminal, POST /v1/realtime/{machine_id}/operator is the shorter call.

The operator takes over at start and keeps the machine until the end of the shift, or until a later assignment. If nobody is assigned to the shift yet, the operator covers the whole shift. To record several operators in one shift, send them in chronological order: a start before the shift's latest operator change is rejected. Sending the same assignment again is harmless.

Operator metrics for the shift are recalculated in the background.

Errors:

  • 400: no shift matches, or start is outside the shift, in the future, or before the shift's latest operator change.
  • 403: the shift has production marked as reviewed, which locks it.
  • 404: the operator does not exist in your company.

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

Try it live
POST
/v1/shifts/operator

This endpoint requires authentication — paste a token in the Authorization section below.

curl -X POST "https://example.com/v1/shifts/operator" \  -H "Content-Type: application/json" \  -d '{    "machineId": 12,    "operatorId": 1063,    "start": "2026-10-12T10:00:00Z"  }'
{  "shiftId": 48213,  "machineId": 12,  "operatorId": 1063,  "start": "2026-10-12T10:00:00Z"}

Set shift targets PUT

Set the production target of existing shifts, for upcoming or past days. The body is a JSON **array** of up to 1,000 rows, so a whole plan (or a CSV export of one) fits in one call. Each row names a shift by its machine (`uuid` or `name`), the `date` it starts on in the company's timezone, and its `title` (for example `Morning`). Sending the same values again is harmless: the target is overwritten, not added to. Every row comes back with a `status`, and only `updated` rows changed anything: * `updated`: the shift's target is now `targetQuantity`. * `machineNotFound` / `ambiguousMachine`: no machine, or more than one, matches `machine`. * `shiftNotFound` / `ambiguousShift`: the machine has no shift, or more than one, with that title starting on that date. * `duplicateShift`: another row in the same request points at the same shift, so neither was applied. Targets are read live from the shift, so realtime and shift views show the new value right away. Nothing is recalculated: the target is not an input to OEE.

Assign shift operator POST

Assign an operator to a shift by its id (as returned by `PUT /v1/shifts/targets`), including shifts that have already ended. Without `start`, the operator covers the shift from its start. The operator takes over at `start` and keeps the machine until the end of the shift, or until a later assignment. If nobody is assigned to the shift yet, the operator covers the whole shift. To record several operators in one shift, send them in chronological order: a `start` before the shift's latest operator change is rejected. Sending the same assignment again is harmless. Operator metrics for the shift are recalculated in the background. Errors: * `400`: no shift matches, or `start` is outside the shift, in the future, or before the shift's latest operator change. * `403`: the shift has production marked as reviewed, which locks it. * `404`: the operator does not exist in your company.