POST
/api/public/v1/qa-checksRecord a QA line check
Submit the measurements; the shift session’s spec decides the outcome. There is deliberately no `status` field to send — a check is in or out of tolerance because of what the spec says, not what the caller claims. An out-of-tolerance result fans an alert out across channels **after** the write commits, so a failed alert never costs the operator their capture. A signed-off session takes no more checks: reopen it or start a new one.
Required scope
The access token must carry this scope. A token missing it gets 403 Forbidden. Grant them to an API client under Settings → Company → API, and to a teammate under Employee → Permissions.
quality:checks:write
Request Body
| Property | Type | Description |
|---|---|---|
locationId | string | The plant. |
shiftSessionId | string | The open session this check belongs to. |
unitWeight | number | Pounds. |
unitVolume | number | Cubic feet. |
captureValues | array | The plant's own station fields, as `{ fieldId, numberValue }`, `{ fieldId, textValue }` or `{ fieldId, booleanValue }` — the last being a pass/fail test, where true is a pass. Pass/fail tests live here too: seal and drop used to be fixed fields on this endpoint and are now whatever the plant configured. A field marked required is rejected when missing; an id that isn't this plant's, or doesn't apply to the product being run, is ignored. |
operatorEmployeeId | string | Who took it, when known. |
operatorInitials | string | Always kept, even when an employee is attributed — a shared line kiosk records both. |
notes | string |
POSTExample request
curl
curl -X POST "https://www.pxb.app/api/public/v1/qa-checks" \
-H "Authorization: Bearer your_access_token" \
-H "Content-Type: application/json" \
-d '{
"locationId": "loc_abc123",
"shiftSessionId": "qss_3300",
"unitWeight": 32.9,
"unitVolume": 2.01,
"captureValues": [
{
"fieldId": "qcf_0001",
"numberValue": 612
},
{
"fieldId": "qcf_0002",
"booleanValue": true
}
],
"operatorInitials": "DR"
}'200Example response
json
{
"message": "Check recorded!",
"content": {
"check": {
"id": "qck_5522",
"locationId": "loc_abc123",
"shiftSessionId": "qss_3300",
"recordedAt": "2026-08-29T14:15:00.000Z",
"unitWeight": 32.9,
"unitVolume": 2.01,
"operatorEmployeeId": "emp_44f1",
"operatorInitials": "DR",
"notes": null,
"status": "OUT_OF_TOLERANCE",
"outOfToleranceReasons": [
"weight_high"
],
"createdAt": "2026-08-29T14:15:00.000Z"
}
}
}400Example response
json
{
"message": "This shift has been signed off — reopen or start a new one."
}In the console
The same thing done by hand, for anyone comparing the API against the screen they already use.