POST
/api/public/v1/qa-checks

Record 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

PropertyTypeDescription
locationIdstringThe plant.
shiftSessionIdstringThe open session this check belongs to.
unitWeightnumberPounds.
unitVolumenumberCubic feet.
captureValuesarrayThe 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.
operatorEmployeeIdstringWho took it, when known.
operatorInitialsstringAlways kept, even when an employee is attributed — a shared line kiosk records both.
notesstring
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.

Quality → Line Checks
/quality/line-checks
  1. Open Line Checks.
  2. Record a check against the open shift.