Skip to documentation
Openshelf

Openshelf LB Local API

v1.0.0

Last updated UTC · OpenAPI JSON

Local device API for engineers working on inventory, robot control, calibration, and diagnostics. All application routes, including engineering and development operations, are documented here. Cloud integrators should use the Cloud API.

Connect and authenticate

Base URL: http://<device-ip>:8000, using the device’s IP address on your network (for example, http://192.168.1.50:8000). Append the documented /api/... path. Log in with JSON email/PIN at POST /api/auth/login/json, then send Authorization: Bearer <access_token>. User tokens can also be passed as ?token= for streaming/image clients; prefer the header where possible. A header token takes precedence over a query token. The scoped relay service credential is accepted only by the inventory, command, status/event, and printing routes that declare it; it must be sent in the header. Development authentication settings may select an auto-user. Documentation describes the authenticated contract; startup settings do not remove routes from the schema.

Role permissions are checked in addition to authentication. Item access levels can further restrict retrieval. Public operations have no security requirement in this schema; first-run operations additionally enforce onboarding state.

Commands and errors

Inventory edits do not move hardware. Submit a command or bin workflow for physical movement, save its identifier, and observe its terminal result. Acceptance is not completion. Some engineering GET operations can start work; read their descriptions before use. Use the physical emergency stop for immediate safety-critical stopping.

Errors use detail, either text, a structured object (usually message and code), or validation details. Preserve X-Correlation-ID when reporting failures; callers can supply this header to correlate requests. A 503 indicates an unavailable dependency, not necessarily a stopped robot. Check state before retrying a mutation.

Lengths and coordinates are millimeters unless stated otherwise; masses are grams. Shelf/cell indices are zero-based. Operating mode is selected at startup, not through this API.

Authentication

  • UserBearer — http bearer

    User token from JSON login. Selected routes also accept the scoped relay service token in this header.

  • UserQueryToken — apiKey in query (token)

    User access token for clients unable to set headers. Service credentials are not accepted here.

auth

User login, token refresh, and session identity. Logout does not revoke tokens.

get /api/auth/experience

Read the automatic lock-screen experience

Use cards for up to three active users and identifier entry for four or more.

Responses

200 Successful Response

application/json · LoginExperienceResponse

Name Type Description
active_user_count required
integer —
mode required
string —

one of "cards", "identifier"

post /api/auth/login/json

Log in with an identity and PIN

Exchange email, name, assigned barcode, or scan token plus PIN for tokens.

Request body required application/json

Name Type Description
email
string(email) | null —
identifier
string | null —
pin required
string —
scan_token
string | null —

Responses

200 Successful Response

application/json · TokenResponse

Name Type Description
access_token required
string —
expires_in required
integer

Access-token lifetime in seconds from issuance

refresh_token required
string —
token_type
string —

default "bearer"

429 Command queue capacity exceeded; retry after the indicated delay

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/auth/logout

Acknowledge user logout

Returns a logout acknowledgment for the authenticated user. Tokens are not revoked or blacklisted by this endpoint; the client must discard its access and refresh tokens.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · MessageResponse

Name Type Description
message required
string

Operation acknowledgment

get /api/auth/me

Read the authenticated user

Returns the active user, current role permissions, and optional access level. This is the account selected by authentication, including the configured development auto-user when that fallback is active.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · openshelf_os_server__routers__auth__UserResponse

Name Type Description
access_level
string | null —
email required
string —
first_name required
string —
id required
integer —
is_active required
boolean —
last_name required
string —
permissions required
array<string> —
role required
string —
post /api/auth/refresh

Refresh a user access token

Exchanges a valid refresh token for a new access token using the current user role/access settings. Returns the same refresh token, not a rotated token. Expired tokens and inactive or absent users return 401.

Request body required application/json

Name Type Description
refresh_token required
string —

Responses

200 Successful Response

application/json · TokenResponse

Name Type Description
access_token required
string —
expires_in required
integer

Access-token lifetime in seconds from issuance

refresh_token required
string —
token_type
string —

default "bearer"

get /api/auth/scans

Stream signed login scan tokens

Stream short-lived signed tokens for new scanner events without exposing barcodes.

Responses

200 Short-lived signed login scan tokens encoded as JSON in SSE data frames.

text/event-stream · string

get /api/auth/users

List users for the small-account card login experience

Return active non-system users only while the card experience applies.

Responses

200 Successful Response

application/json · array<PublicUserResponse>

Name Type Description
accessLevel
map<string, string> | null —
email required
string —
firstName required
string —
lastName required
string —
role required
map<string, string> —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

system

Device identity, operating mode, startup policy, and process restart.

get /api/health

Check OS and robot initialization

Public health check. Reports the operating mode and robot initialization state. Returns 503 with a degraded body when initialization has failed, including when the mock runtime is unavailable. A healthy process may report a disabled robot; inspect robot_status and robot_phase before requesting motion.

Responses

200 Operation result

application/json · HealthResponse

Name Type Description
mode required
string —
robot_error
string | null —
robot_error_type
string | null —
robot_phase
string | null —
robot_status required
string —
status required
string —
503 Robot initialization failed or mock runtime unavailable

application/json · HealthResponse

Name Type Description
mode required
string —
robot_error
string | null —
robot_error_type
string | null —
robot_phase
string | null —
robot_status required
string —
status required
string —
get /api/system/home-on-init

Read startup homing policy

Requires robot:control. Returns whether initialization is configured to home the robot; does not move hardware.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · HomeOnInitResponse

Name Type Description
home_on_init required
boolean —
put /api/system/home-on-init

Set startup homing policy

Requires robot:control. Persists whether robot initialization should home hardware. Does not home the robot immediately.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
home_on_init required
boolean —

Responses

200 Successful Response

application/json · HomeOnInitResponse

Name Type Description
home_on_init required
boolean —
get /api/system/info

Read device identity and network address

Read device identity, alias, release, and network address.

Public device discovery information. device_alias is the operator-assigned alias staged by provisioning, or null when the device has none. release_sha and release_branch identify the release the device is running, staged by the on-device sync scripts, or null when unknown. lan_ip is the IPv4 address of wlan0, or null when that interface cannot be read. This endpoint does not establish robot readiness.

Responses

200 Operation result

application/json · SystemInfoResponse

Name Type Description
device_alias required
string | null —
device_id required
string —
lan_ip required
string | null —
release_branch required
string | null —
release_sha required
string | null —
get /api/system/mode

Read the operating mode

Returns the current production, development, demo, or mock mode. Mode is selected at process startup; the API has no mode-changing endpoint. Use the repository startup tooling to change it.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · ModeResponse

Name Type Description
mode required
string —
post /api/system/restart

Request an API restart

Schedules a process exit so the container supervisor can restart the service. The response is sent before the restart; active connections can then close. Does not change the operating mode. Reconnect and check health before resuming work.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · RestartResponse

Name Type Description
message required
string —

robot

Command lifecycle, status/events, and low-level hardware diagnostics. Engineering operations can move hardware or change safety behavior.

post /api/robot/clear_commands

Clear queued robot commands

Removes waiting commands through the worker; requires robot:control. An active bin workflow or laser calibration prevents this mutation. Read durable command results to reconcile interrupted work.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · SuccessResponse

Name Type Description
message
string —

default "success"

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/robot/commands

Queue a robot command

Returns a durable command_id and current state after admission, not after physical completion. Poll /api/robot/commands/{command_id} for the result or subscribe to /api/robot/events before submitting. The status stream is not a command receipt.

For store/retrieve commands, reuse the same request_id and payload after an uncertain submission. Identical replays return the existing record; a different payload returns 409. Records and idempotency are retained for seven days. A terminal failure requires a new ID for a new attempt. Interrupted commands are failed at startup rather than replayed.

Create inventory first, then submit {"command":"store_item","request_id":"store-001","item":{"barcode":"880000000001"}}. New command-enrolled items require positive complete dimensions; include a name for compatibility with mock mode. Existing items use stored dimensions and mass: update inventory before submitting if these must change. Accepted enrollment survives execution failure.

To choose the destination cell, add a top-level location ({"side":"front_module","shelf_idx":0,"cell_idx":0}). The cell must exist in the storage grid, be available, and fit the item; a live bin home stays reserved and is reported unavailable. Omitting location keeps automatic allocation, and demo mode keeps its configured cell mapping.

For retrieval, read the item first and supply its location (side, zero-based shelf_idx, cell_idx). Bin-managed items require the bin workflow. Clear the IO box before retrieving. Home when home_required is reported. An item reserved by a tray interaction returns 409, as does a store or retrieval whose barcode or cell is already targeted by a queued or running command (target_in_flight); a full queue returns 429 with Retry-After.

Mock mode supports only store/retrieve, with one FIFO worker and simulated completion. Hardware modes also accept the engineering commands in the schema. A queued stop is not an emergency stop; use the physical emergency stop for immediate safety-critical stopping.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
command
"stop" —

default "stop"

command
"initialize" —

default "initialize"

command
"idle" —

default "idle"

axes
array<string> | null —
command
"home" —

default "home"

command
"move" —

default "move"

coordinate required
AxisCoordinate —
s
integer —

default 0

x required
number —
y required
number —
z_offset
number —

default 0

barcode
string | null —
command
"retrieve_item" —

default "retrieve_item"

location
object | null

Current item location. Required by the retrieval endpoint; bin homes cannot be retrieved directly.

cell_idx
integer

Zero-based cell index

shelf_idx
integer

Zero-based shelf index

side
string —

one of "front_module", "back_module"

request_id
string | null

Idempotency ID retained for seven days. Reuse only with the same payload.

command
"store_item" —

default "store_item"

item
object | null

Existing inventory barcode, or new item enrollment. Hardware also supports anonymous dimension-based storage; mock requires barcode, name and dimensions. Existing inventory mass/dimensions take precedence.

access_level_id
integer | null —
barcode
string

Inventory barcode

dimensions
object

Positive millimeter dimensions

height
number —
length
number —
width
number —
full_net_weight
number | null

Full contents reference in grams

metadata
object —
name
string

New item display name

net_weight
number | null

Contents grams; requires tare and excludes weight

tare_weight
number | null

Empty-container grams

weight
number | null

Gross grams; mutually exclusive with net_weight

location
object | null

Requested destination cell. Must exist, be available, and fit the item. Storage bin homes are reserved and cannot be requested; demo mode keeps its configured cell mapping.

cell_idx
integer

Zero-based cell index

shelf_idx
integer

Zero-based shelf index

side
string —

one of "front_module", "back_module"

request_id
string | null

Idempotency ID retained for seven days. Reuse only with the same payload.

Responses

200 Successful Response

application/json · CommandAcceptedResponse

Name Type Description
command_id required
string —
message required
"success" —
status required
string —

one of "queued", "running", "succeeded", "failed"

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Idempotency conflict or command precondition failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

429 The active command queue is full

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/robot/commands/{command_id}

Read a durable command result

Available for mock and hardware command records. result is null before a terminal result is persisted and may contain a command-specific success or failure payload afterward. Unknown or expired IDs return 404. For measurement semantics, see the storage group; a successful retrieval does not guarantee a weight reading.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
command_id required
path
string

Command identifier returned when the command was accepted.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · CommandLifecycleResponse

Name Type Description
command required
string —
command_id required
string —
completed_at required
string(date-time) | null —
created_at required
string(date-time) —
request_id required
string | null —
result required
object | null —
started_at required
string(date-time) | null —
status required
string —

one of "queued", "running", "succeeded", "failed"

404 Robot command not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/robot/debug/door

Operate the IO box door

Directly opens, closes, or homes the IO door using the action query parameter. Runs under the manual-motion guard and cannot interrupt an active bin workflow. Hardware failures return 503.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
action required
query
string —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · DoorOperationResponse

Name Type Description
action required
string —

one of "open", "close", "home"

success required
boolean —
post /api/robot/debug/io-box

Simulate IO-box occupancy

Mock mode only: sets the simulated scale's occupied flag and pushes a status update, so a kiosk can walk through placing an item in the IO box without hardware. The robot clears it when it takes the item for a store. Hardware modes return 409.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
occupied required
boolean

Whether the simulated IO-box scale reports an item

Responses

200 Successful Response

application/json · SuccessResponse

Name Type Description
message
string —

default "success"

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/robot/debug/motors

List configured motors

Lists motor identifiers and configuration used by the diagnostic routes. Use returned identifiers as motor_name; this endpoint does not command motion.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · MotorsResponse

Name Type Description
init_components required
array<InitComponentResponse> —
component required
string —
detail required
string —
phase required
string —
reason required
string | null —
updated_at required
number —
init_phase required
string —
io required
array<object>

Configured IO motors and their diagnostic identifiers

tool required
array<object>

Configured tool motors and their diagnostic identifiers

post /api/robot/debug/motors/probe

Probe motor responsiveness

Performs diagnostic position reads without commanding movement. Returns busy=true and a reason instead of probing when commands, manual motion, or demo cycling own the robot. Each result reports responsiveness independently.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · MotorProbeResponse

Name Type Description
busy
boolean —

default false

reason
string | null —
results
array<MotorProbeResult> —
error
string | null —
motor_name required
string —
position_mm
number | null —
responsive required
boolean —
post /api/robot/debug/motors/{motor_name}/clear

Clear a motor alarm

Clears the hardware alarm and matching worker crash state, then refreshes status. This does not home the motor. Unknown names return 404; a failed hardware operation returns 503.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
motor_name required
path
string

Motor identifier returned by the motor diagnostics endpoint.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · MotorOperationResponse

Name Type Description
motor required
string —
position_mm
number | null

Requested target, when this is a move

success required
boolean —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/robot/debug/motors/{motor_name}/crash

Inject a motor crash

Engineering fault-injection endpoint that sets the selected motor's crash state. The worker can react as it would to a real crash. Unknown motor names return 404.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
motor_name required
path
string

Motor identifier returned by the motor diagnostics endpoint.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · MotorOperationResponse

Name Type Description
motor required
string —
position_mm
number | null

Requested target, when this is a move

success required
boolean —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/robot/debug/motors/{motor_name}/home

Home one motor

Runs the selected motor's homing operation with manual-motion guards. This moves hardware and may also position the tool for safe rotation. skip_pre_home_approach=true is restricted to the Y axis in development mode. Unknown names return 404; motion that another operation already holds returns 409.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
motor_name required
path
string

Motor identifier returned by the motor diagnostics endpoint.

skip_pre_home_approach
query
boolean —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · MotorOperationResponse

Name Type Description
motor required
string —
position_mm
number | null

Requested target, when this is a move

success required
boolean —
400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/robot/debug/motors/{motor_name}/move

Move one motor to a position

Moves the selected motor to position_mm using the manual-motion guard. Rotation may require associated stage positioning. Unknown names return 404; motion that another operation already holds returns 409; hardware failures return 503.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
motor_name required
path
string

Motor identifier returned by the motor diagnostics endpoint.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
position_mm required
number

Target position in millimeters

Responses

200 Operation result

application/json · MotorOperationResponse

Name Type Description
motor required
string —
position_mm
number | null

Requested target, when this is a move

success required
boolean —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/robot/debug/power

Inspect switched power rails

Read the four switched power rails.

Reports what each rail feeds, the axes that lose their encoder reference when it is cut, and the current output state. powered is null when the rail cannot be read. Cut power only through the rail cycle operation: driving the output directly drops the drives without reconfiguring or re-homing the axes that lose their reference.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · PowerRailsResponse

Name Type Description
hold_seconds required
number

How long a cycle cuts the rail before restoring power

rails required
array<PowerRailStatus> —
axes required
array<string>

Motors that lose their encoder reference when this rail is cut

gripper required
boolean

Whether the gripper servo drops with this rail

powered required
boolean | null

Current rail state; null when it cannot be read

rail required
string

GPIO output identifier of the switched rail

supplies required
string

Hardware that loses power when this rail is cut

post /api/robot/debug/power/{rail}/cycle

Power-cycle a switched rail

Cut a switched rail for a few seconds, then restore it.

Drive parameters that only latch at power-on need this -- any DI/DO function change stays inert until its drive restarts. Returns once power is back; the hardware is still booting, so re-home the axes it dropped before moving. An active command or queued work returns 409; a tray workflow that is idle between steps does not block the cycle.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
rail required
path
string —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · PowerCycleResponse

Name Type Description
axes_needing_home required
array<string>

Axes that must be re-homed before further motion

rail required
string —
success required
boolean —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/robot/debug/scale

Read live scale registers

Reads current scale weight in grams, stability/validity flags, decimal position, and raw registers. This is live telemetry, not a command-correlated result or inventory update. Mock mode returns a deterministic 350-gram reading. A disabled scale returns 404; communication failure returns 503.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · ScaleReadingResponse

Name Type Description
decimal_position required
integer —
raw_registers required
map<string, integer> —
status required
map<string, boolean | integer> —
weight_grams required
number

Live gross scale reading in grams

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/robot/debug/scale/calibration/params

Read scale calibration parameters

Reads physical scale range, calibration weight, precision, and division settings. These settings belong to the hardware scale, not inventory container-mass fields.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · ScaleCalibrationParameters

Name Type Description
calibration_weight required
integer

Known calibration weight in grams

division required
integer —
full_scale required
integer

Scale range in grams

precision required
integer —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/robot/debug/scale/calibration/params

Write scale calibration parameters

Writes the supplied range, known weight, precision, and division to the physical scale. Inspect success in the response. An active bin workflow prevents mutation; this does not update item mass.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
calibration_weight required
integer

Known calibration weight in grams

division
integer

Division value

min 1 · default 1

full_scale required
integer

Full scale value in grams (e.g., 6000 for 6kg)

precision
integer

Decimal precision (0-3)

min 0 · max 3 · default 1

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/robot/debug/scale/calibration/status

Read scale calibration status

Reads the physical scale calibration status through the worker. A disabled scale returns 404; unavailable hardware or a failed read returns 503.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · ScaleCalibrationStatusResponse

Name Type Description
raw required
integer —
weight_ok required
boolean —
zero_ok required
boolean —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/robot/debug/scale/calibration/tare

Tare the physical scale

Sets the scale tare and returns a success flag. This changes the scale reading baseline; it does not set an inventory item's tare_weight. An active bin workflow prevents mutation.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/robot/debug/scale/calibration/weight

Calibrate with a known weight

Runs span calibration using the configured known calibration weight. Place the reference weight on the scale before calling. An active bin workflow prevents mutation; this does not change inventory mass.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · ScaleCalibrationResult

Name Type Description
error
string | null —
status
ScaleCalibrationStatusResponse | null —
raw required
integer —
weight_ok required
boolean —
zero_ok required
boolean —
success required
boolean —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/robot/debug/scale/calibration/zero

Calibrate the scale zero point

Runs the hardware zero-calibration operation. Prepare the scale according to the engineering calibration procedure before calling. An active bin workflow prevents mutation. The response reports the hardware calibration result.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · ScaleCalibrationResult

Name Type Description
error
string | null —
status
ScaleCalibrationStatusResponse | null —
raw required
integer —
weight_ok required
boolean —
zero_ok required
boolean —
success required
boolean —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/robot/debug/scanner/scan

Inject a barcode scan event

Publishes a label_scanned event as if the scanner had read barcode; requires robot:control. Available in mock mode as well as hardware modes. The event can advance a waiting bin workflow, so this is not a read-only scanner test.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
barcode required
string —

min length 1

Responses

200 Successful Response

application/json · SuccessResponse

Name Type Description
message
string —

default "success"

get /api/robot/debug/scanner/status

Read scanner diagnostics

Reports scanner connection and enabled state from the initialized worker. This does not trigger a hardware scan. Requires an authenticated user and an enabled robot.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · ScannerStatusResponse

Name Type Description
connected required
boolean —
enabled required
boolean —
get /api/robot/events

Stream robot events and command results

Server-Sent Events; each event carries an id: line with its durable log seq and a data: frame with the event JSON. Events include terminal command results, scanner events, bin-workflow updates, and inventory_changed notices after storage API writes (refetch inventory on these); dispatch by command, message, or kind, rather than assuming every frame is a completion.

A fresh subscription starts live at the top of the log and receives no earlier events. Reconnect with the Last-Event-ID header set to the last id: you processed and the stream replays every event above that seq before resuming live, so a disconnect loses no events. Explicit replay of the log is available at /api/robot/events/log?since=<seq>. An event is forwarded only once its log row is committed; inventory changes commit before the event is forwarded. A terminal result includes command_id; use durable command polling to reconcile after long outages. weight, when present, is the cycle's gross reading in grams, not container net mass; both store and retrieve cycles supply it when a scale reading is available. A cursor above the log top (e.g. after a database reset or from another device) is clamped to the top: the stream starts live at the top and the gap is visible in the log. User tokens can be supplied through the bearer header or ?token=.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Durable robot events in SSE frames: an `id:` line carries the event's log `seq`, the `data:` frame the event JSON. Command, scanner, safety and workflow events share this stream.

text/event-stream · string

get /api/robot/events/log

Replay the durable robot event log

Returns events with seq > since, oldest first, at most limit per page. since=0 reads from the start of the log; after a page, request the next with since=next_since until next_since reaches latest_seq for a complete catch-up. next_since stays since for an empty page. This is the reconciliation path for /api/robot/events subscribers after a disconnect.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
since
query
integer

Exclusive lower bound on the event log seq; only events with a higher seq are returned.

limit
query
integer

Maximum number of records to return.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · RobotEventLogResponse

Name Type Description
events required
array<RobotEventLogEntry> —
command_id required
string | null —
created_at required
string(date-time) —
payload required
object —
seq required
integer —
latest_seq required
integer —
next_since required
integer —
post /api/robot/gripper

Grip or release directly

Performs an immediate authenticated gripper operation using the state query parameter. Changes physical hardware. Blocked while laser auto-calibration runs or another operation holds the manual-motion guard.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
state required
query
string —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · SuccessResponse

Name Type Description
message
string —

default "success"

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/robot/safety/acknowledge

Acknowledge a cleared safety interruption

Acknowledges the worker safety guard once every interruption source is either clear or one an acknowledgement is enough to clear, such as a weight change that leaves the scale reading permanently shifted. Returns 409 with active_sources while a source that has to clear physically remains active. This does not bypass sensors or home the robot.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · SuccessResponse

Name Type Description
message
string —

default "success"

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/robot/safety/override

Set the safety guard bypass

Engineering control requiring robot:control. bypass=true disables the worker safety guard; false restores it. Returns the resulting safety state. This changes physical safety behavior and must only be used in a controlled engineering procedure.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
bypass required
boolean —

Responses

200 Operation result

application/json · SafetyStatus

Name Type Description
active
boolean —

default false

active_sources
array<string> —
awaiting_ack
boolean —

default false

bypassed
boolean —

default false

can_acknowledge
boolean —

default false

component_bypasses
map<string, boolean> —
interruption_id
integer —

default 0

last_changed_at
string | null —
motion_blocked
boolean —

default false

sources
map<string, object> —
post /api/robot/safety/override/component

Set a component safety bypass

Engineering control requiring robot:control. Changes bypass for light_curtain, cabinet_doors or weight_change and returns the resulting safety state. Restore the component after the controlled diagnostic procedure.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
bypass required
boolean —
component required
string —

one of "light_curtain", "cabinet_doors", "weight_change"

Responses

200 Operation result

application/json · SafetyStatus

Name Type Description
active
boolean —

default false

active_sources
array<string> —
awaiting_ack
boolean —

default false

bypassed
boolean —

default false

can_acknowledge
boolean —

default false

component_bypasses
map<string, boolean> —
interruption_id
integer —

default 0

last_changed_at
string | null —
motion_blocked
boolean —

default false

sources
map<string, object> —
post /api/robot/start

Start the robot worker

Starts worker processing; requires robot:control. This is a worker lifecycle operation, not command submission. Returns 409 while laser auto-calibration is active and 503 if the robot is unavailable.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · SuccessResponse

Name Type Description
message
string —

default "success"

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/robot/status

Stream robot status

Server-Sent Events (text/event-stream). Each data: value is a JSON status snapshot with top-level mode; initialization progress may appear before the worker is ready. Database item locations are overlaid on storage occupancy. Subscribe for current state rather than durable command outcomes.

Supports bearer authentication or the user access token in ?token= for clients unable to set headers. Sends heartbeat comments while connected. Reconnect to obtain current status; the stream does not provide historical replay. Mock mode uses the same transport with simulated hardware state.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Live JSON status snapshots in SSE data frames. Heartbeat comments are not JSON.

text/event-stream · string

post /api/robot/stop

Shut down the robot worker

Waits for worker shutdown; requires robot:control. This differs from submitting a queued stop command and is not a physical emergency stop. Unavailable during laser auto-calibration.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · SuccessResponse

Name Type Description
message
string —

default "success"

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

storage

Inventory, occupancy, bin workflows, and robot grid geometry are distinct. Item CRUD changes database records; commands move physical items. Database locations supply occupancy for the robot status stream. Bin home locations require bin workflows, not direct retrieval commands.

post /api/storage/bin-workflows

Start a bin storage workflow

Chooses storage for the requested item and operation. A storage_mode=direct response with workflow=null means no tray workflow was started; submit an ordinary command separately. A tray result starts delivery to the IO box. Retrieval requires access to every item in that bin. Clear the IO box first; a tray or item already in use, or an unavailable robot worker, returns 409.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
barcode required
string —
operation required
string —

pattern ^(store|retrieve)$

storage_mode
string | null —

Responses

200 Operation result

application/json · BinWorkflowStartResponse

Name Type Description
storage_mode required
string —

one of "direct", "bin"

workflow required
BinWorkflowResponse | null —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/storage/bin-workflows/active

Get Active Bin Workflow

List unfinished take, place, and return interactions. Outside trays do not reserve the robot; completed interactions are omitted, and so are import trays, which the import screen drives.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · BinWorkflowsResponse

Name Type Description
workflows required
array<BinWorkflowResponse> —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
get /api/storage/bin-workflows/interrupted

Get Crash Interrupted Bin Workflows

List tray motions a crash or emergency stop interrupted whose tray is still marked outside. The crash dialog names these trays and their home cells so the operator can put them back.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · BinWorkflowsResponse

Name Type Description
workflows required
array<BinWorkflowResponse> —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
post /api/storage/bin-workflows/interrupted/recover

Recover Crash Interrupted Bin Workflows

Mark trays from interrupted motions as home after the operator confirmed them on their shelves in the crash dialog. An interrupted return records the contents confirmed before it started. Does not move hardware. A tray whose state conflicts with being home stays outside and is listed as unresolved.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · TrayCrashRecoveryResponse

Name Type Description
recovered required
array<BinWorkflowResponse> —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
unresolved required
array<UnresolvedTrayRecovery> —
error required
string

Why the tray stays outside; return it by scanning its barcode

workflow required
BinWorkflowResponse —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
post /api/storage/bin-workflows/returns

Begin Tray Return

Resolve a tray barcode and open contents selection without moving hardware. Known contents are selected by default; an item just taken out is listed but unselected. An already stored tray returns 409.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
barcode required
string —

min length 1 · max length 255

Responses

200 Operation result

application/json · BinWorkflowEnvelope

Name Type Description
workflow required
BinWorkflowResponse | null —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/storage/bin-workflows/{workflow_id}/close

Close Tray Workflow

Finish a take or place instruction and leave its tray outside. Closing a return dialog cancels that return without changing contents or moving hardware. No IO occupancy is required.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
workflow_id required
path
string

Identifier of the bin workflow to inspect or operate on.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · BinWorkflowEnvelope

Name Type Description
workflow required
BinWorkflowResponse | null —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/storage/bin-workflows/{workflow_id}/store

Store Returned Tray

Submit selected known contents and return the tray from the IO bay to its shelf. Requires an occupied IO bay and an available, homed robot. Repeated submission of the same selection does not repeat motion.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
workflow_id required
path
string

Identifier of the bin workflow to inspect or operate on.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
confirmed_item_ids required
array<integer> —

Responses

200 Operation result

application/json · BinWorkflowEnvelope

Name Type Description
workflow required
BinWorkflowResponse | null —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/storage/bins

List storage bins

Synchronizes configured bins into the database, then returns bin state and contents. A configured bin barcode already assigned to an item returns 409. Aggregate gross_weight includes the bin and all its contents; it is exposed only at home and is not an individual item mass.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · BinsResponse

Name Type Description
bins required
array<BinResponse> —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/storage/bins/tray

Mark a cell as a multi-item tray home

Create a storage bin homed at a cell, making it a multi-item tray.

The tray's inner dimensions default to the cell's own dimensions and its max_items is derived from rows * columns. The cell must not already be a tray home, and the barcode must be unreserved by another tray or item.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
side required
query
StorageModuleSide —
shelf_idx required
query
integer

Zero-based shelf index.

cell_idx required
query
integer

Zero-based cell index within the shelf.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
barcode required
string —

min length 1 · max length 255

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

delete /api/storage/bins/tray

Remove a cell's multi-item tray

Remove the storage bin homed at a cell, freeing the cell.

The tray must be empty and at home with no in-flight workflow; otherwise it is refused. The bin is dropped from the config, the source of truth, and its database row is deactivated on re-sync.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
side required
query
StorageModuleSide —
shelf_idx required
query
integer

Zero-based shelf index.

cell_idx required
query
integer

Zero-based cell index within the shelf.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

put /api/storage/bins/tray-layout

Update a storage bin's compartment layout

Redefine the rows/columns compartment grid of the tray homed at a cell.

Writes the tray's compartment_layout (and its derived max_items) into the config, which is the source of truth, then re-syncs the database. The tray must be empty, at home, and have no in-flight workflow; otherwise the change is refused.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
side required
query
StorageModuleSide —
shelf_idx required
query
integer

Zero-based shelf index.

cell_idx required
query
integer

Zero-based cell index within the shelf.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/storage/grid

Read the robot storage grid

Returns the robot storage-grid structure and calibration data. This is separate from item-location database records; use the status stream for database-overlaid occupancy.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · StorageGrid

Name Type Description
back_module
array<Shelf> —
cells required
array<Cell> —
calibration_point required
CalibrationCoordinate | null —
s
integer —

default 0

x required
number —
y required
number —
z_captured_at_stage_mm
number | null —
z_offset
number —

default 0

cell_idx
integer —

min 0 · default 0

dimensions required
Dimensions —
height required
number —
length required
number —
width required
number —
is_manual
boolean —

default false

item required
CellItem | null —
barcode
string | null —
data
map<string, string | integer | number | object | array<any>> | null —
dimensions required
Dimensions —
height required
number —
length required
number —
width required
number —
weight
number | null —
status required
CellStatus —

one of "occupied", "available", "maintenance", "disabled"

divider_width
number —

default 8

shelf_idx
integer —

min 0 · default 0

filename
string —

default ""

front_module
array<Shelf> —
cells required
array<Cell> —
calibration_point required
CalibrationCoordinate | null —
s
integer —

default 0

x required
number —
y required
number —
z_captured_at_stage_mm
number | null —
z_offset
number —

default 0

cell_idx
integer —

min 0 · default 0

dimensions required
Dimensions —
height required
number —
length required
number —
width required
number —
is_manual
boolean —

default false

item required
CellItem | null —
barcode
string | null —
data
map<string, string | integer | number | object | array<any>> | null —
dimensions required
Dimensions —
height required
number —
length required
number —
width required
number —
weight
number | null —
status required
CellStatus —

one of "occupied", "available", "maintenance", "disabled"

divider_width
number —

default 8

shelf_idx
integer —

min 0 · default 0

500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

put /api/storage/grid/cell

Update a cell in the robot grid

Update calibration point, status, and/or dimensions for one robot-grid cell.

Omitted fields keep the cell's current values, so a partial payload updates only what it carries. x, y, and z_offset are applied together and create the cell's calibration point when it has none.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
side required
query
StorageModuleSide —
shelf_idx required
query
integer

Zero-based shelf index.

cell_idx required
query
integer

Zero-based cell index within the shelf.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
dimensions
DimensionsPayload | null

Cell width, height, and length in millimeters; omit to keep the current dimensions.

height required
number —
length required
number —
width required
number —
is_manual
boolean | null

Whether the calibration is locked (manual); omit to keep the current value.

status
string | null

Cell status: available, occupied, maintenance, or disabled.

x
number | null

Calibration x in millimeters; provide x, y, and z_offset together.

y
number | null

Calibration y in millimeters; provide x, y, and z_offset together.

z_offset
number | null

Calibration z offset in millimeters; provide x, y, and z_offset together.

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/storage/grid/cell

Add a cell to the robot grid

Adds one cell at the next free index to the selected shelf, cloning geometry from existing cells where available, without moving hardware.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
side required
query
StorageModuleSide —
shelf_idx required
query
integer

Zero-based shelf index.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

delete /api/storage/grid/cell

Delete a cell from the robot grid

Deletes one side/shelf/cell from the persisted grid, without moving hardware. Reconcile item occupancy separately before changing storage geometry.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
side required
query
StorageModuleSide —
shelf_idx required
query
integer

Zero-based shelf index.

cell_idx required
query
integer

Zero-based cell index within the shelf.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

put /api/storage/grid/cells

Update multiple cells in the robot grid (atomic)

Atomically apply updates to multiple robot-grid cells.

Every cell is resolved and every payload validated before anything is mutated, and the grid is saved once at the end. If any cell is missing or any payload is invalid, the whole request fails and nothing is changed.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
side required
query
StorageModuleSide —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
cells required
array<GridCellBatchItem> —
cell_idx required
integer —
dimensions
DimensionsPayload | null

Cell width, height, and length in millimeters; omit to keep the current dimensions.

height required
number —
length required
number —
width required
number —
is_manual
boolean | null

Whether the calibration is locked (manual); omit to keep the current value.

shelf_idx required
integer —
status
string | null

Cell status: available, occupied, maintenance, or disabled.

x
number | null

Calibration x in millimeters; provide x, y, and z_offset together.

y
number | null

Calibration y in millimeters; provide x, y, and z_offset together.

z_offset
number | null

Calibration z offset in millimeters; provide x, y, and z_offset together.

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/storage/grid/shelf

Add a shelf to the robot grid

Adds one shelf at the next free index with a single cell, cloning geometry from the side's existing shelves where available, without moving hardware.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
side required
query
StorageModuleSide —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

delete /api/storage/grid/shelf

Delete a shelf from the robot grid

Deletes the selected side/shelf and its cells from the persisted grid, without retrieving physical contents. This engineering operation changes storage geometry, not item inventory.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
side required
query
StorageModuleSide —
shelf_idx required
query
integer

Zero-based shelf index.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/storage/items

List inventory records

Returns an offset page, total count, and matching X-Total-Count, X-Limit, and X-Skip headers. Records include access-based can_retrieve, current mass, and direct or bin-derived locations. A bin home location is not directly retrievable: use the bin workflow when bin is non-null.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
skip
query
integer

Number of records to skip before returning results.

limit
query
integer

Maximum number of records to return.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · InventoryPage

Name Type Description
items required
array<ItemWithLocations> —
access_level_id required
integer | null —
barcode required
string —
bin
object | null

Bin membership and aggregate state; null for direct inventory

can_retrieve required
boolean —
created_at required
string —
dimensions required
map<string, number> —
full_net_weight
number | null

Full contents reference in grams; independent of current contents

id required
integer —
locations required
array<object>

Direct database locations, plus the bin home location when binned; use the bin workflow for binned items

metadata
object —
name required
string —
net_weight
number | null

Gross minus tare in grams, or null if unknown or gross is below tare

tare_weight
number | null

Known empty-container mass in grams

updated_at required
string —
weight required
number | null —
limit required
integer —
skip required
integer —
total required
integer —
post /api/storage/items

Create or update an inventory record

Creates a record or updates the existing barcode. This does not move the item or assign physical occupancy. New records require valid dimensions; values are millimeters and masses are grams. Both metadata and item_metadata inputs are accepted; responses use metadata.

To enroll an opened container, supply tare_weight, net_weight, and optionally full_net_weight; gross becomes tare plus net. Do not supply both weight and net_weight, even if one is null. See the storage group for mass persistence rules. Prefer POST /api/storage/items/update for partial edits to existing records. Reserved bin barcodes and, for a non-admin, size or access-level changes to a bin member return 409/403, and such a change returns 409 while the robot moves the bin. Any other bin interaction holding the item does not block the edit; conflicting state is rejected when that interaction completes.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
access_level_id
integer | null —
barcode required
string —
dimensions
map<string, number> | null

Positive width, height, and length in millimeters; required when enrolling a new item.

full_net_weight
number | null

Mass in grams. Omit to preserve; null clears this reference.

item_metadata
object | null

Arbitrary item metadata; metadata is also accepted as an input alias. Replaces the object when supplied.

name required
string —

max length 255

net_weight
number | null

Contents mass in grams; requires known tare. Mutually exclusive with weight. Null clears current gross/net.

tare_weight
number | null

Mass in grams. Omit to preserve; null clears this reference.

weight
number | null

Gross mass in grams. Do not combine with net_weight; null does not clear stored gross.

Responses

200 Successful Response

application/json · ItemWithLocations

Name Type Description
access_level_id required
integer | null —
barcode required
string —
bin
object | null

Bin membership and aggregate state; null for direct inventory

can_retrieve required
boolean —
created_at required
string —
dimensions required
map<string, number> —
full_net_weight
number | null

Full contents reference in grams; independent of current contents

id required
integer —
locations required
array<object>

Direct database locations, plus the bin home location when binned; use the bin workflow for binned items

metadata
object —
name required
string —
net_weight
number | null

Gross minus tare in grams, or null if unknown or gross is below tare

tare_weight
number | null

Known empty-container mass in grams

updated_at required
string —
weight required
number | null —
400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/storage/items/delete

Delete an inventory record

Takes the barcode in the request body. Deletes the item and its database location records; it does not physically retrieve it. An admin deleting a bin member also removes its bin membership; for everyone else the membership blocks the deletion. An unfinished bin interaction blocks deletion for everyone. Finished bin interactions keep the item's barcode and name in their record. Use this low-level endpoint only after reconciling physical occupancy. A missing record returns 404.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
barcode required
string —

min length 1 · max length 255

Responses

200 Operation result

application/json · MessageResponse

Name Type Description
message required
string

Operation acknowledgment

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/storage/items/locations/add

Assign an inventory location

Takes the barcode and the zero-based side/shelf/cell of the location in the request body. Adds database occupancy for an item without moving hardware. Occupied cells and incompatible bin state are rejected. Tray homes are usable while their tray is away; the tray's return then reports the occupied home instead. The status stream overlays these database locations on the grid.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
barcode required
string —

min length 1 · max length 255

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

Responses

200 Successful Response

application/json · ItemWithLocations

Name Type Description
access_level_id required
integer | null —
barcode required
string —
bin
object | null

Bin membership and aggregate state; null for direct inventory

can_retrieve required
boolean —
created_at required
string —
dimensions required
map<string, number> —
full_net_weight
number | null

Full contents reference in grams; independent of current contents

id required
integer —
locations required
array<object>

Direct database locations, plus the bin home location when binned; use the bin workflow for binned items

metadata
object —
name required
string —
net_weight
number | null

Gross minus tare in grams, or null if unknown or gross is below tare

tare_weight
number | null

Known empty-container mass in grams

updated_at required
string —
weight required
number | null —
400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/storage/items/locations/remove

Remove an inventory location

Takes the barcode and the zero-based side/shelf/cell of the location in the request body. This does not move hardware or remove the storage-grid cell. Use only when physical occupancy has already been reconciled.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
barcode required
string —

min length 1 · max length 255

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

Responses

200 Successful Response

application/json · ItemWithLocations

Name Type Description
access_level_id required
integer | null —
barcode required
string —
bin
object | null

Bin membership and aggregate state; null for direct inventory

can_retrieve required
boolean —
created_at required
string —
dimensions required
map<string, number> —
full_net_weight
number | null

Full contents reference in grams; independent of current contents

id required
integer —
locations required
array<object>

Direct database locations, plus the bin home location when binned; use the bin workflow for binned items

metadata
object —
name required
string —
net_weight
number | null

Gross minus tare in grams, or null if unknown or gross is below tare

tare_weight
number | null

Known empty-container mass in grams

updated_at required
string —
weight required
number | null —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/storage/items/lookup

Read an item and its storage state

The barcode travels in the request body, so every customer barcode is addressable. Returns the inventory record, computed retrieval access, locations, and optional bin membership. Read this before moving an item. net_weight is derived from known gross and tare; it is null when gross is below tare or either value is missing. A missing record returns 404.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
barcode required
string —

min length 1 · max length 255

Responses

200 Successful Response

application/json · ItemWithLocations

Name Type Description
access_level_id required
integer | null —
barcode required
string —
bin
object | null

Bin membership and aggregate state; null for direct inventory

can_retrieve required
boolean —
created_at required
string —
dimensions required
map<string, number> —
full_net_weight
number | null

Full contents reference in grams; independent of current contents

id required
integer —
locations required
array<object>

Direct database locations, plus the bin home location when binned; use the bin workflow for binned items

metadata
object —
name required
string —
net_weight
number | null

Gross minus tare in grams, or null if unknown or gross is below tare

tare_weight
number | null

Known empty-container mass in grams

updated_at required
string —
weight required
number | null —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/storage/items/update

Update selected inventory fields

Takes the barcode and the fields to change in the request body. Omitted mass fields retain their values. net_weight=null clears gross and derived net; tare_weight=null or full_net_weight=null clears that reference. Legacy weight=null does not clear gross. Supplying both weight and net_weight returns 422. Setting net requires a known tare, either stored or supplied.

Changing tare alone preserves gross and recomputes net. Metadata replaces the object when provided. A size or access-level change to a bin member is admin-only (403 bin_item_edit_requires_admin) and may be applied while the bin is home or outside, but not while the robot moves it (409). Returns 404 for an absent barcode. These edits do not move hardware.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
access_level_id
integer | null —
barcode required
string —

min length 1 · max length 255

dimensions
map<string, number> | null

Positive width, height, and length in millimeters; required when enrolling a new item.

full_net_weight
number | null

Mass in grams. Omit to preserve; null clears this reference.

item_metadata
object | null

Arbitrary item metadata; metadata is also accepted as an input alias. Replaces the object when supplied.

name
string | null —
net_weight
number | null

Contents mass in grams; requires known tare. Mutually exclusive with weight. Null clears current gross/net.

tare_weight
number | null

Mass in grams. Omit to preserve; null clears this reference.

weight
number | null

Gross mass in grams. Do not combine with net_weight; null does not clear stored gross.

Responses

200 Successful Response

application/json · ItemWithLocations

Name Type Description
access_level_id required
integer | null —
barcode required
string —
bin
object | null

Bin membership and aggregate state; null for direct inventory

can_retrieve required
boolean —
created_at required
string —
dimensions required
map<string, number> —
full_net_weight
number | null

Full contents reference in grams; independent of current contents

id required
integer —
locations required
array<object>

Direct database locations, plus the bin home location when binned; use the bin workflow for binned items

metadata
object —
name required
string —
net_weight
number | null

Gross minus tare in grams, or null if unknown or gross is below tare

tare_weight
number | null

Known empty-container mass in grams

updated_at required
string —
weight required
number | null —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/storage/locations

List storage cell records

Returns database cell records, optionally filtered by zero-based shelf and cell index. These records are separate from the robot storage-grid file and item-location occupancy.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
shelf_idx
query
integer | null

Filter by shelf index

cell_idx
query
integer | null

Filter by cell index

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · array<StorageCellResponse>

Name Type Description
capacity required
DimensionsPayload

Dimensions in millimeters (width, height, length).

height required
number —
length required
number —
width required
number —
cell_idx required
integer —
created_at required
string —
id required
integer —
shelf_idx required
integer —
status required
string —
updated_at required
string —
put /api/storage/locations/{shelf_idx}/{cell_idx}

Update a storage cell record

Updates database status or capacity for the selected cell. Capacity accepts a dimension object or a width×height×length string using x separators. Valid states are available, occupied, maintenance, and disabled. This does not move hardware or rewrite the robot grid.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
shelf_idx required
path
integer

Zero-based shelf index.

cell_idx required
path
integer

Zero-based cell index within the shelf.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
capacity
string | DimensionsPayload | null —
height required
number —
length required
number —
width required
number —
status
string | null —

Responses

200 Successful Response

application/json · StorageCellResponse

Name Type Description
capacity required
DimensionsPayload

Dimensions in millimeters (width, height, length).

height required
number —
length required
number —
width required
number —
cell_idx required
integer —
created_at required
string —
id required
integer —
shelf_idx required
integer —
status required
string —
updated_at required
string —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

import-jobs

Relay-created inventory imports. The device owns each job; the kiosk walks it unit by unit (measure, print, scan, store) and fills trays with small units. One job runs at a time.

post /api/import-jobs

Create an import job

Expands each row into quantity units in row order and assigns label barcodes: the row barcode for the first unit, generated unique barcodes for the rest. The kiosk shows the job after the next PIN unlock. Rejects a second running job (409 import_active), barcodes already on the device (409 barcodes_exist, listed in detail.errors), and invalid rows (422 invalid_rows, per row and field). At most 5000 units per job. Nothing moves until an operator starts the first step.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
filename
string | null —
rows required
array<ImportRow> —

min items 1

access_level
string | integer | null

Access level name or id

barcode
string | null

Label barcode for the first unit; the device generates the rest, and all of them when omitted.

expires_at
string | null

Expiry date, YYYY-MM-DD

full_net_weight
number | null

Full contents reference in grams

height
number | null

Known item height in millimetres; the kiosk skips measuring it

length
number | null

Known item length in millimetres; the kiosk skips measuring it

metadata
object

Custom item metadata

name required
string —

min length 1 · max length 255

net_weight
number | null

Contents mass in grams; requires tare_weight

quantity
integer —

min 1 · max 5000 · default 1

row_number
integer | null

Source CSV row, for reporting

small
boolean

Placed in a tray compartment instead of its own cell

default false

tare_weight
number | null

Container mass in grams

width
number | null

Known item width in millimetres; the kiosk skips measuring it

Responses

200 Operation result

application/json · ImportJobEnvelope

Name Type Description
job required
ImportJobResponse | null —
cancel_source required
string | null —
completed_at required
string | null —
counts required
ImportCounts —
in_progress required
integer —
loaded required
integer —
pending required
integer —
skipped required
integer —
total required
integer —
created_at required
string —
filename required
string | null —
id required
string —
in_progress required
array<ImportUnitResponse> —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

skipped required
array<ImportUnitResponse>

Skipped units

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

state required
string —

one of "active", "cancelling", "completed", "cancelled"

step
ImportStepResponse | null

The kiosk's next step

error
string | null —
kind required
string

unit: measure and store one item; tray: fill a tray with small items; waiting: the robot is still storing

one of "unit", "tray", "waiting"

phase
string | null —
reason
string | null

Why the step departs from the usual flow (a small item stored on its own, or no tray to fetch); the kiosk shows it for the operator to acknowledge

unit
ImportUnitResponse | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

units
array<ImportUnitResponse> | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

workflow
BinWorkflowResponse | null —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
units
array<ImportUnitResponse> | null

Every unit, when requested

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

updated_at required
string —
409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/import-jobs/active

Read the running import job

Returns the active or cancelling job with progress counts and the kiosk's next step, or job: null. Command results that arrived without an event are applied first, so a restarted kiosk resumes where it left off.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · ImportJobEnvelope

Name Type Description
job required
ImportJobResponse | null —
cancel_source required
string | null —
completed_at required
string | null —
counts required
ImportCounts —
in_progress required
integer —
loaded required
integer —
pending required
integer —
skipped required
integer —
total required
integer —
created_at required
string —
filename required
string | null —
id required
string —
in_progress required
array<ImportUnitResponse> —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

skipped required
array<ImportUnitResponse>

Skipped units

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

state required
string —

one of "active", "cancelling", "completed", "cancelled"

step
ImportStepResponse | null

The kiosk's next step

error
string | null —
kind required
string

unit: measure and store one item; tray: fill a tray with small items; waiting: the robot is still storing

one of "unit", "tray", "waiting"

phase
string | null —
reason
string | null

Why the step departs from the usual flow (a small item stored on its own, or no tray to fetch); the kiosk shows it for the operator to acknowledge

unit
ImportUnitResponse | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

units
array<ImportUnitResponse> | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

workflow
BinWorkflowResponse | null —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
units
array<ImportUnitResponse> | null

Every unit, when requested

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

updated_at required
string —
get /api/import-jobs/{job_id}

Read an import job

Returns state, counts (loaded, skipped, in progress, pending), the skipped units, and the units in progress; units=true adds every unit. Finished jobs stay readable for their summary; pending units of a cancelled job were never loaded.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
job_id required
path
string —
units
query
boolean

Include every unit

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · ImportJobEnvelope

Name Type Description
job required
ImportJobResponse | null —
cancel_source required
string | null —
completed_at required
string | null —
counts required
ImportCounts —
in_progress required
integer —
loaded required
integer —
pending required
integer —
skipped required
integer —
total required
integer —
created_at required
string —
filename required
string | null —
id required
string —
in_progress required
array<ImportUnitResponse> —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

skipped required
array<ImportUnitResponse>

Skipped units

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

state required
string —

one of "active", "cancelling", "completed", "cancelled"

step
ImportStepResponse | null

The kiosk's next step

error
string | null —
kind required
string

unit: measure and store one item; tray: fill a tray with small items; waiting: the robot is still storing

one of "unit", "tray", "waiting"

phase
string | null —
reason
string | null

Why the step departs from the usual flow (a small item stored on its own, or no tray to fetch); the kiosk shows it for the operator to acknowledge

unit
ImportUnitResponse | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

units
array<ImportUnitResponse> | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

workflow
BinWorkflowResponse | null —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
units
array<ImportUnitResponse> | null

Every unit, when requested

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

updated_at required
string —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/import-jobs/{job_id}/cancel

Cancel an import job

Never interrupts motion. The job becomes cancelling and offers no new units; loaded units stay. A tray out for the import is handed over as an ordinary outside tray: its placed units count as loaded and it is returned with the usual tray barcode scan. From the relay, a measured unit that was not yet submitted can still be stored or skipped; from the kiosk it is released. The job becomes cancelled once no store or tray motion is running. Repeated calls are harmless.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
job_id required
path
string —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · ImportJobEnvelope

Name Type Description
job required
ImportJobResponse | null —
cancel_source required
string | null —
completed_at required
string | null —
counts required
ImportCounts —
in_progress required
integer —
loaded required
integer —
pending required
integer —
skipped required
integer —
total required
integer —
created_at required
string —
filename required
string | null —
id required
string —
in_progress required
array<ImportUnitResponse> —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

skipped required
array<ImportUnitResponse>

Skipped units

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

state required
string —

one of "active", "cancelling", "completed", "cancelled"

step
ImportStepResponse | null

The kiosk's next step

error
string | null —
kind required
string

unit: measure and store one item; tray: fill a tray with small items; waiting: the robot is still storing

one of "unit", "tray", "waiting"

phase
string | null —
reason
string | null

Why the step departs from the usual flow (a small item stored on its own, or no tray to fetch); the kiosk shows it for the operator to acknowledge

unit
ImportUnitResponse | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

units
array<ImportUnitResponse> | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

workflow
BinWorkflowResponse | null —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
units
array<ImportUnitResponse> | null

Every unit, when requested

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

updated_at required
string —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/import-jobs/{job_id}/tray/place

Place a small unit in the tray

Creates the item with the measured height and a footprint taken from its import row, falling back per axis to the tray's compartment footprint where the row gives no width or length, and records it in the next free compartment, returned as unit.compartment. Print and scan its label before calling. A unit whose planned size fits no compartment of this tray returns 409 unit_wrong_tray before any item is created. One measured taller than the compartment is not placed: it stays pending with that height for a taller tray, or is stored on its own when no tray takes it, and notice says which. A full tray returns 409 tray_full; return it to continue with another tray.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
job_id required
path
string —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
height required
number

Measured item height in millimeters

> 0

unit_id required
integer —

Responses

200 Operation result

application/json · ImportStepResult

Name Type Description
job required
ImportJobResponse —
cancel_source required
string | null —
completed_at required
string | null —
counts required
ImportCounts —
in_progress required
integer —
loaded required
integer —
pending required
integer —
skipped required
integer —
total required
integer —
created_at required
string —
filename required
string | null —
id required
string —
in_progress required
array<ImportUnitResponse> —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

skipped required
array<ImportUnitResponse>

Skipped units

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

state required
string —

one of "active", "cancelling", "completed", "cancelled"

step
ImportStepResponse | null

The kiosk's next step

error
string | null —
kind required
string

unit: measure and store one item; tray: fill a tray with small items; waiting: the robot is still storing

one of "unit", "tray", "waiting"

phase
string | null —
reason
string | null

Why the step departs from the usual flow (a small item stored on its own, or no tray to fetch); the kiosk shows it for the operator to acknowledge

unit
ImportUnitResponse | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

units
array<ImportUnitResponse> | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

workflow
BinWorkflowResponse | null —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
units
array<ImportUnitResponse> | null

Every unit, when requested

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

updated_at required
string —
notice
string | null

What the machine did on its own during this call (a skip, or a unit leaving the tray), for the operator

unit
ImportUnitResponse | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/import-jobs/{job_id}/tray/return

Return the import tray

Ends filling and stores the tray with every item it holds. Requires the tray in the IO box and an idle, homed robot. Its units become loaded when the return succeeds; a failed return can be retried with this call. A stopped import's tray is returned with the usual tray barcode scan instead.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
job_id required
path
string —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · ImportStepResult

Name Type Description
job required
ImportJobResponse —
cancel_source required
string | null —
completed_at required
string | null —
counts required
ImportCounts —
in_progress required
integer —
loaded required
integer —
pending required
integer —
skipped required
integer —
total required
integer —
created_at required
string —
filename required
string | null —
id required
string —
in_progress required
array<ImportUnitResponse> —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

skipped required
array<ImportUnitResponse>

Skipped units

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

state required
string —

one of "active", "cancelling", "completed", "cancelled"

step
ImportStepResponse | null

The kiosk's next step

error
string | null —
kind required
string

unit: measure and store one item; tray: fill a tray with small items; waiting: the robot is still storing

one of "unit", "tray", "waiting"

phase
string | null —
reason
string | null

Why the step departs from the usual flow (a small item stored on its own, or no tray to fetch); the kiosk shows it for the operator to acknowledge

unit
ImportUnitResponse | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

units
array<ImportUnitResponse> | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

workflow
BinWorkflowResponse | null —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
units
array<ImportUnitResponse> | null

Every unit, when requested

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

updated_at required
string —
notice
string | null

What the machine did on its own during this call (a skip, or a unit leaving the tray), for the operator

unit
ImportUnitResponse | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/import-jobs/{job_id}/tray/start

Fetch a tray for small units

Plans every pending small unit of the next unit's access level onto home trays with a free compartment (or room under max_items): each unit goes to the tray with the smallest compartments that take its planned size (rotated if that helps) and still have room, among equal compartments the roomiest tray first, and units that fit the fewest trays choose first. Delivers the tray planned for the next unit to the IO box; the step offers the units planned for that tray, and the rest wait for a later tray. Requires an empty IO box and an idle, homed robot. When the plan leaves the next unit without a tray, nothing moves or is skipped: 409 trays_outside when a tray is out, else 409 no_tray_free; the step's reason says the same, and the operator skips the unit to continue. A small unit no tray compartment takes at all is offered as a unit step instead.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
job_id required
path
string —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · ImportStepResult

Name Type Description
job required
ImportJobResponse —
cancel_source required
string | null —
completed_at required
string | null —
counts required
ImportCounts —
in_progress required
integer —
loaded required
integer —
pending required
integer —
skipped required
integer —
total required
integer —
created_at required
string —
filename required
string | null —
id required
string —
in_progress required
array<ImportUnitResponse> —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

skipped required
array<ImportUnitResponse>

Skipped units

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

state required
string —

one of "active", "cancelling", "completed", "cancelled"

step
ImportStepResponse | null

The kiosk's next step

error
string | null —
kind required
string

unit: measure and store one item; tray: fill a tray with small items; waiting: the robot is still storing

one of "unit", "tray", "waiting"

phase
string | null —
reason
string | null

Why the step departs from the usual flow (a small item stored on its own, or no tray to fetch); the kiosk shows it for the operator to acknowledge

unit
ImportUnitResponse | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

units
array<ImportUnitResponse> | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

workflow
BinWorkflowResponse | null —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
units
array<ImportUnitResponse> | null

Every unit, when requested

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

updated_at required
string —
notice
string | null

What the machine did on its own during this call (a skip, or a unit leaving the tray), for the operator

unit
ImportUnitResponse | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/import-jobs/{job_id}/units/{unit_id}/begin

Measure a unit and create its item

Creates the inventory record with the measured dimensions so its label can be printed and scanned. Then submit store_item with the unit's request_id; the unit becomes loaded when that command succeeds. When no free cell fits, nothing changes and 409 no_cell_fits lets the operator choose another size or skip. A small unit is accepted only when no tray compartment takes it. Calling again before storing updates the dimensions. Units load in CSV order.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
job_id required
path
string —
unit_id required
path
integer —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
dimensions required
UnitDimensions —
height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

Responses

200 Operation result

application/json · ImportStepResult

Name Type Description
job required
ImportJobResponse —
cancel_source required
string | null —
completed_at required
string | null —
counts required
ImportCounts —
in_progress required
integer —
loaded required
integer —
pending required
integer —
skipped required
integer —
total required
integer —
created_at required
string —
filename required
string | null —
id required
string —
in_progress required
array<ImportUnitResponse> —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

skipped required
array<ImportUnitResponse>

Skipped units

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

state required
string —

one of "active", "cancelling", "completed", "cancelled"

step
ImportStepResponse | null

The kiosk's next step

error
string | null —
kind required
string

unit: measure and store one item; tray: fill a tray with small items; waiting: the robot is still storing

one of "unit", "tray", "waiting"

phase
string | null —
reason
string | null

Why the step departs from the usual flow (a small item stored on its own, or no tray to fetch); the kiosk shows it for the operator to acknowledge

unit
ImportUnitResponse | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

units
array<ImportUnitResponse> | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

workflow
BinWorkflowResponse | null —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
units
array<ImportUnitResponse> | null

Every unit, when requested

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

updated_at required
string —
notice
string | null

What the machine did on its own during this call (a skip, or a unit leaving the tray), for the operator

unit
ImportUnitResponse | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/import-jobs/{job_id}/units/{unit_id}/skip

Skip a unit

The operator leaves it unloaded. The item created for a measured unit is deleted. A unit whose store was submitted, or that is already in a tray, cannot be skipped.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
job_id required
path
string —
unit_id required
path
integer —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · ImportStepResult

Name Type Description
job required
ImportJobResponse —
cancel_source required
string | null —
completed_at required
string | null —
counts required
ImportCounts —
in_progress required
integer —
loaded required
integer —
pending required
integer —
skipped required
integer —
total required
integer —
created_at required
string —
filename required
string | null —
id required
string —
in_progress required
array<ImportUnitResponse> —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

skipped required
array<ImportUnitResponse>

Skipped units

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

state required
string —

one of "active", "cancelling", "completed", "cancelled"

step
ImportStepResponse | null

The kiosk's next step

error
string | null —
kind required
string

unit: measure and store one item; tray: fill a tray with small items; waiting: the robot is still storing

one of "unit", "tray", "waiting"

phase
string | null —
reason
string | null

Why the step departs from the usual flow (a small item stored on its own, or no tray to fetch); the kiosk shows it for the operator to acknowledge

unit
ImportUnitResponse | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

units
array<ImportUnitResponse> | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

workflow
BinWorkflowResponse | null —
bin required
BinResponse —
active required
boolean —
available_volume required
number

Remaining volume in cubic millimeters

barcode required
string —
compartment_dimensions
StorageBinDimensionsSettings | null

Compartment dimensions in millimeters: the inner width and length less the 2 mm dividers, split evenly by columns and rows, and the full inner height; null for an undivided bin.

height required
number —

> 0

length required
number —

> 0

width required
number —

> 0

compartment_layout
CompartmentLayoutSettings | null

Equal-sized compartment rows and columns; null for an undivided bin.

columns required
integer —

min 1 · max 32

rows required
integer —

min 1 · max 32

gross_weight required
number | null

Bin plus contents in grams; only available at home

home_location required
ItemLocationCreate

Request payload for assigning a location to an item.

cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

id required
integer —
inner_dimensions required
map<string, number> —
item_count required
integer —
items required
array<BinItemSummary> —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
max_item_dimensions required
map<string, number> —
max_items required
integer —
status required
string —
used_volume required
number

Occupied volume in cubic millimeters

compartment
integer | null

Persisted target compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when no target is assigned or the bin is undivided.

contents
array<BinContentsResponse> | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

confirmed required
boolean —
id required
integer —
name required
string —
created_at required
string —
error required
string | null —
history required
array<object> —
id required
string —
item required
BinItemSummary | null —
barcode required
string —
compartment
integer | null

Compartment number, starting at 1 at the top left, left-to-right then top-to-bottom at IO; null when unassigned or the bin is undivided.

id required
integer —
name required
string —
operation required
string

store, retrieve, or return

resolution required
object | null —
state required
string

Current tray interaction state

updated_at required
string —
units
array<ImportUnitResponse> | null

Every unit, when requested

access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

updated_at required
string —
notice
string | null

What the machine did on its own during this call (a skip, or a unit leaving the tray), for the operator

unit
ImportUnitResponse | null —
access_level_id required
integer | null —
barcode required
string —
bin_id required
integer | null —
compartment required
integer | null —
dimensions required
map<string, number> | null —
error required
string | null

Last store or tray return failure

expires_at required
string | null —
id required
integer —
item_id required
integer | null —
name required
string —
planned_dimensions
map<string, number> | null

Width, height and length in millimetres given by the import file (any subset)

position required
integer

Zero-based load order

request_id required
string | null

Use as the store_item request_id for a measured unit

row_number required
integer | null —
small required
boolean —
stage required
string | null

Progress of an in-progress unit

status required
string —

one of "pending", "in_progress", "loaded", "skipped"

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

printer

Barcode labels and printer diagnostics. Mock printing produces no physical label.

post /api/print

Print a barcode label

Requires printer:print or the relay service credential. Takes the barcode in the request body, so every customer barcode is printable. The device renders it as a Code 128 label; mock mode simulates printing without a physical artifact. This operation has no idempotency key; a retry may print another label. A printer write failure returns 503.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
barcode required
string —

min length 1 · max length 255 · pattern ^[\x20-\x7E]+$

Responses

200 Successful Response

application/json · PrintLabelResponse

Name Type Description
barcode required
string —
message required
string —
printed required
boolean —
422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/print/config

Read printer feed settings

Returns configured feed distance in printer dots. Does not print a label.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · PrinterFeedConfig

Name Type Description
feed_dots required
integer —

min 0 · max 128

put /api/print/config

Set printer feed distance

Requires printer:print. Persists the feed distance used after printing. This updates configuration without printing a test label.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
feed_dots required
integer —

min 0 · max 128

Responses

200 Successful Response

application/json · PrinterFeedConfig

Name Type Description
feed_dots required
integer —

min 0 · max 128

get /api/print/status

Read printer diagnostics

Reports connectivity, health, and printer error flags. A disconnected or unhealthy printer can still return HTTP 200; inspect the body. Mock mode reports simulated=true and does not contact hardware.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · PrinterStatusResponse

Name Type Description
auto_recoverable_error
boolean —

default false

connected required
boolean —
cover_open
boolean —

default false

cutter_error
boolean —

default false

enabled required
boolean —
error
string | null —
healthy required
boolean —
paper_near_end
boolean —

default false

paper_out
boolean —

default false

recoverable_error
boolean —

default false

simulated
boolean —

default false

unrecoverable_error
boolean —

default false

chemicals

Authenticated CAS Common Chemistry search and detail lookup.

get /api/chemicals/{cas_number}

Read a chemical by CAS number

Looks up one CAS registry number. Invalid numbers return 422, absent records 404, and upstream unavailability 503 with Retry-After: 5. Requires authentication.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
cas_number required
path
string

CAS Registry Number to look up.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · ChemicalDetail

Name Type Description
cas_number required
string —
name required
string —
source_url required
string —
synonyms required
array<string> —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

422 Request validation failed

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

cabinet

Physical cabinet doors and latch outputs.

post /api/cabinet/release

Control cabinet latch release

Requires storage:access. Sets the physical latch output to release or passive and returns updated door/latch state. Unconfigured GPIO returns 409; hardware failures return 503. Blocked during automatic laser calibration.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
action required
query
string —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · CabinetReleaseResponse

Name Type Description
action required
string —

one of "passive", "release"

doors required
CabinetDoorState —
bottom_closed required
boolean —
bottom_open required
boolean —
closed required
boolean —
open required
boolean —
top_closed required
boolean —
top_open required
boolean —
latches required
CabinetLatchState —
bottom_engaged required
boolean —
bottom_released required
boolean —
engaged required
boolean —
released required
boolean —
top_engaged required
boolean —
top_released required
boolean —
success required
boolean —
409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/cabinet/status

Read cabinet doors and latches

Reports cabinet GPIO door/latch state. configured=false means this hardware is not configured, rather than a closed-door guarantee. Requires authentication and an enabled robot.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · CabinetStatusResponse

Name Type Description
configured
boolean —

default true

doors
CabinetDoorState | null —
bottom_closed required
boolean —
bottom_open required
boolean —
closed required
boolean —
open required
boolean —
top_closed required
boolean —
top_open required
boolean —
latches
CabinetLatchState | null —
bottom_engaged required
boolean —
bottom_released required
boolean —
engaged required
boolean —
released required
boolean —
top_engaged required
boolean —
top_released required
boolean —

camera

Camera discovery and live MJPEG streams.

get /api/camera

List available cameras

Returns configured camera IDs and status for selecting a stream. Requires a user token. Use a returned ID with the camera streaming endpoint.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · CamerasResponse

Name Type Description
cameras required
array<CameraInfo> —
consumers required
integer —
has_frame required
boolean —
id required
string —
online required
boolean —
running required
boolean —
type required
string —
get /api/camera/{camera_id}

Stream camera frames

Returns an MJPEG stream (multipart/x-mixed-replace; boundary=frame) with JPEG frames. Starts the selected stream and releases it on disconnect. Unknown IDs return 404; no available frames or camera failures return 503. A user token may be sent through ?token= for image clients.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
camera_id required
path
string

Camera identifier returned by camera discovery.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Multipart JPEG frames; each part has Content-Type: image/jpeg.

multipart/x-mixed-replace; boundary=frame · string(binary)

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

iobox-sizer

IO-box sizing, observations, and empty-box calibration.

post /api/iobox/sizer/calibration/camera-blank

Capture the empty-box camera reference

Requires robot:control. Captures the camera blank used by sizing and returns its stored path. Prepare an empty IO box before calling; this changes calibration data.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · SizerBlankFrameResponse

Name Type Description
blank_frame_path required
string —
success required
boolean —
post /api/iobox/sizer/calibration/tof-blank

Calibrate empty-box distance sensors

Requires robot:control. Samples the empty IO box, persists blank distance values, and reloads the sizer configuration. Prepare an empty box first; unavailable sensors return 503.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body application/json

Name Type Description
samples
integer —

min 1 · max 100 · default 5

Responses

200 Operation result

application/json · SizerBlankDistancesResponse

Name Type Description
success required
boolean —
tof_blank_mm required
array<number> —
get /api/iobox/sizer/config

Read IO sizer configuration

Returns the active IO sizer configuration, including sensor and calibration settings. Requires authentication.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · IOBoxSizerConfig

Name Type Description
calibration
IOBoxSizerCalibrationConfig —
apply_depth_compensation
boolean —

default false

mm_per_px_x
number | null —
mm_per_px_y
number | null —
tof_blank_mm
array<number | null> —
camera
IOBoxSizerCameraConfig —
buffer_size
integer —

> 0 · default 1

device
string | integer —

default "/dev/video0"

flip_horizontal
boolean —

default true

fps
integer —

> 0 · default 100

height
integer —

> 0 · default 720

width
integer —

> 0 · default 1280

detection
IOBoxSizerDetectionConfig —
blank_frame_path
string —

default "data/iobox_sizer/blank_frame.png"

contour_selection
string —

one of "largest", "center" · default "largest"

diff_threshold
integer —

min 0 · max 255 · default 15

hsv_s_max
integer —

min 0 · max 255 · default 55

hsv_v_min
integer —

min 0 · max 255 · default 170

min_area_px
integer —

> 0 · default 500

mode
string —

one of "brightness", "rectangle", "difference", "circle" · default "brightness"

roi_height
integer —

> 0 · default 360

roi_width
integer —

> 0 · default 640

roi_x
integer —

min 0 · default 320

roi_y
integer —

min 0 · default 180

white_rgb_min
array<any> —

min items 3 · max items 3 · default [200,200,200]

enabled
boolean —

default false

history
IOBoxSizerHistoryConfig —
debug_image_dir
string —

default "data/iobox_sizer/captures"

max_recent_results
integer —

> 0 · default 200

save_debug_images
boolean —

default false

measure_on_store
boolean —

default true

observer_mode_enabled
boolean —

default true

store_measurement_timeout_s
number —

> 0 · default 2

tof
IOBoxSizerToFConfig —
aggregation
string —

one of "median", "mean", "nearest", "farthest" · default "median"

channels
array<integer> —
distance_mode
integer | null —
ftdi_url
string —

min length 1 · default "ftdi://ftdi:232h/1"

mux_address
integer —

min 0 · max 127 · default 112

preferred_sensor_index
integer | null —
read_timeout_s
number —

> 0 · default 0.5

roi_center
integer | null —
roi_height
integer | null —
roi_width
integer | null —
sample_interval_ms
integer —

min 0 · max 1000 · default 0

samples
integer —

min 1 · max 25 · default 1

sensor_address
integer —

min 0 · max 127 · default 41

timing_budget_ms
integer —

> 0 · default 200

put /api/iobox/sizer/config

Replace IO sizer configuration

Requires robot:control. Persists the supplied complete sizer configuration and reloads it, returning the new configuration and status. This is a replacement rather than a partial patch.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
calibration
IOBoxSizerCalibrationConfig —
apply_depth_compensation
boolean —

default false

mm_per_px_x
number | null —
mm_per_px_y
number | null —
tof_blank_mm
array<number | null> —
camera
IOBoxSizerCameraConfig —
buffer_size
integer —

> 0 · default 1

device
string | integer —

default "/dev/video0"

flip_horizontal
boolean —

default true

fps
integer —

> 0 · default 100

height
integer —

> 0 · default 720

width
integer —

> 0 · default 1280

detection
IOBoxSizerDetectionConfig —
blank_frame_path
string —

default "data/iobox_sizer/blank_frame.png"

contour_selection
string —

one of "largest", "center" · default "largest"

diff_threshold
integer —

min 0 · max 255 · default 15

hsv_s_max
integer —

min 0 · max 255 · default 55

hsv_v_min
integer —

min 0 · max 255 · default 170

min_area_px
integer —

> 0 · default 500

mode
string —

one of "brightness", "rectangle", "difference", "circle" · default "brightness"

roi_height
integer —

> 0 · default 360

roi_width
integer —

> 0 · default 640

roi_x
integer —

min 0 · default 320

roi_y
integer —

min 0 · default 180

white_rgb_min
array<any> —

min items 3 · max items 3 · default [200,200,200]

enabled
boolean —

default false

history
IOBoxSizerHistoryConfig —
debug_image_dir
string —

default "data/iobox_sizer/captures"

max_recent_results
integer —

> 0 · default 200

save_debug_images
boolean —

default false

measure_on_store
boolean —

default true

observer_mode_enabled
boolean —

default true

store_measurement_timeout_s
number —

> 0 · default 2

tof
IOBoxSizerToFConfig —
aggregation
string —

one of "median", "mean", "nearest", "farthest" · default "median"

channels
array<integer> —
distance_mode
integer | null —
ftdi_url
string —

min length 1 · default "ftdi://ftdi:232h/1"

mux_address
integer —

min 0 · max 127 · default 112

preferred_sensor_index
integer | null —
read_timeout_s
number —

> 0 · default 0.5

roi_center
integer | null —
roi_height
integer | null —
roi_width
integer | null —
sample_interval_ms
integer —

min 0 · max 1000 · default 0

samples
integer —

min 1 · max 25 · default 1

sensor_address
integer —

min 0 · max 127 · default 41

timing_budget_ms
integer —

> 0 · default 200

Responses

200 Operation result

application/json · SizerConfigResponse

Name Type Description
config required
IOBoxSizerConfig —
calibration
IOBoxSizerCalibrationConfig —
apply_depth_compensation
boolean —

default false

mm_per_px_x
number | null —
mm_per_px_y
number | null —
tof_blank_mm
array<number | null> —
camera
IOBoxSizerCameraConfig —
buffer_size
integer —

> 0 · default 1

device
string | integer —

default "/dev/video0"

flip_horizontal
boolean —

default true

fps
integer —

> 0 · default 100

height
integer —

> 0 · default 720

width
integer —

> 0 · default 1280

detection
IOBoxSizerDetectionConfig —
blank_frame_path
string —

default "data/iobox_sizer/blank_frame.png"

contour_selection
string —

one of "largest", "center" · default "largest"

diff_threshold
integer —

min 0 · max 255 · default 15

hsv_s_max
integer —

min 0 · max 255 · default 55

hsv_v_min
integer —

min 0 · max 255 · default 170

min_area_px
integer —

> 0 · default 500

mode
string —

one of "brightness", "rectangle", "difference", "circle" · default "brightness"

roi_height
integer —

> 0 · default 360

roi_width
integer —

> 0 · default 640

roi_x
integer —

min 0 · default 320

roi_y
integer —

min 0 · default 180

white_rgb_min
array<any> —

min items 3 · max items 3 · default [200,200,200]

enabled
boolean —

default false

history
IOBoxSizerHistoryConfig —
debug_image_dir
string —

default "data/iobox_sizer/captures"

max_recent_results
integer —

> 0 · default 200

save_debug_images
boolean —

default false

measure_on_store
boolean —

default true

observer_mode_enabled
boolean —

default true

store_measurement_timeout_s
number —

> 0 · default 2

tof
IOBoxSizerToFConfig —
aggregation
string —

one of "median", "mean", "nearest", "farthest" · default "median"

channels
array<integer> —
distance_mode
integer | null —
ftdi_url
string —

min length 1 · default "ftdi://ftdi:232h/1"

mux_address
integer —

min 0 · max 127 · default 112

preferred_sensor_index
integer | null —
read_timeout_s
number —

> 0 · default 0.5

roi_center
integer | null —
roi_height
integer | null —
roi_width
integer | null —
sample_interval_ms
integer —

min 0 · max 1000 · default 0

samples
integer —

min 1 · max 25 · default 1

sensor_address
integer —

min 0 · max 127 · default 41

timing_budget_ms
integer —

> 0 · default 200

status required
SizerStatusResponse —
available required
boolean —
camera required
IOBoxSizerCameraConfig —
buffer_size
integer —

> 0 · default 1

device
string | integer —

default "/dev/video0"

flip_horizontal
boolean —

default true

fps
integer —

> 0 · default 100

height
integer —

> 0 · default 720

width
integer —

> 0 · default 1280

enabled required
boolean —
last_error required
string | null —
last_error_type required
string | null —
last_measurement_time required
string | null —
measure_on_store required
boolean —
observer_mode_enabled required
boolean —
tof_channels required
array<integer> —
success required
boolean —
get /api/iobox/sizer/frame.jpg

Read an IO sizer JPEG frame

Captures the current sizer camera frame and returns JPEG bytes. Does not return JSON on success. Unavailable hardware returns 503; encoding failure returns 500.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 JPEG camera frame bytes.

image/jpeg · string(binary)

500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/iobox/sizer/measure

Measure the IO box contents

Captures a sizing measurement and returns dimensions and observation details. Does not enroll or move an inventory item. Unavailable sensors return 503 with a structured error.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · SizerMeasurementResponse

Name Type Description
measurement required
IOBoxSizerMeasurement —
calibration_warnings
array<string> —
center_x
number | null —
center_y
number | null —
debug_image_path
string | null —
depth_delta_mm
number | null —
depth_mm
number | null —
detected required
boolean —
dimensions_mm
IOBoxSizerDimensions | null —
height required
number —
length
number | null —
width required
number —
duration_ms required
integer —
frame_height required
integer —
frame_width required
integer —
height_px
integer | null —
mode required
string —

one of "brightness", "rectangle", "difference", "circle"

sensor_channel
integer | null —
sensor_index
integer | null —
timestamp
string(date-time) —
tof_readings
array<IOBoxSizerToFReading> —
depth_delta_mm
number | null —
depth_mm
number | null —
error
string | null —
sensor_channel required
integer —
sensor_index required
integer —
width_px
integer | null —
success required
boolean —
get /api/iobox/sizer/status

Read IO sizer status

Reports IO-box sizing availability, configuration state, and latest measurement status. Does not start a measurement. Requires authentication.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · SizerStatusResponse

Name Type Description
available required
boolean —
camera required
IOBoxSizerCameraConfig —
buffer_size
integer —

> 0 · default 1

device
string | integer —

default "/dev/video0"

flip_horizontal
boolean —

default true

fps
integer —

> 0 · default 100

height
integer —

> 0 · default 720

width
integer —

> 0 · default 1280

enabled required
boolean —
last_error required
string | null —
last_error_type required
string | null —
last_measurement_time required
string | null —
measure_on_store required
boolean —
observer_mode_enabled required
boolean —
tof_channels required
array<integer> —

calibration

Engineering calibration. Coordinates are millimeters unless stated otherwise. Motion requires available hardware and exclusive access; saves may persist configuration and move hardware. These routes are documented in every operating mode, not guaranteed available in every mode.

post /api/calibration/abort

Abort manual calibration and home the tool

Homes the tool and refreshes worker status. This recovery action itself moves hardware and is not an emergency stop. Automatic laser calibration must be aborted through its own endpoint.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/grip-probe

Read the gripper's object detection across z offsets at a cell

Engineering diagnostic for finding a cell's working z window. At each z the tool extends empty as a pick does, splays the fingers and records what the gripper reports, then closes the fingers before retracting, so a tray is never withdrawn or dragged. Each z must lie within 5mm of the cell's stored z. Moves hardware; does not save calibration.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

z_offsets required
array<number> —

min items 1 · max items 24

Responses

200 Successful Response

application/json · array<GripProbePoint>

Name Type Description
current required
integer —
gripped required
boolean —
object required
string —
position required
integer —
state required
string —
z_offset required
number —
400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/home_tool_motors

Home the tool stage and gripper

Homes the stage and gripper motors, refreshes worker status, and returns remaining homing requirements. This moves hardware and is unavailable during automatic laser calibration.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · CalibrationStatusResponse

Name Type Description
needs_home required
boolean —
needs_home_axes
array<string> —
needs_home_reason
string | null —
409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/calibration/iobox

Read IO box pickup calibration

Returns configured low/high pickup and multi-item tray coordinates and tool extensions in millimeters. Does not move hardware.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · IOBoxPositionResponse

Name Type Description
multi_item_stage_extension required
number

Position or extension in millimeters

multi_item_x required
number

Position or extension in millimeters

multi_item_y required
number

Position or extension in millimeters

multi_item_z_extension required
number

Position or extension in millimeters

pickup_high_x required
number

Position or extension in millimeters

pickup_high_y required
number

Position or extension in millimeters

pickup_low_x required
number

Position or extension in millimeters

pickup_low_y required
number

Position or extension in millimeters

stage_extension required
number

Position or extension in millimeters

warnings
array<string> | null —
z_extension required
number

Position or extension in millimeters

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/calibration/iobox/door

Read IO door travel limits

Returns configured closed/open positions in millimeters. Reading these limits does not move the door.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · IOBoxDoorPositionResponse

Name Type Description
close required
number —
open required
number —
409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/iobox/door/move

Test an IO door position

Moves the physical door to the selected open/closed position using the supplied travel values. Returns the target position in millimeters. Save separately to persist the tested limits.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
close required
number —

min 0 · max 1000

open required
number —

max 1000 · > 0

position required
string —

one of "close", "open"

Responses

200 Operation result

application/json · DoorMoveResponse

Name Type Description
position required
string —

one of "close", "open"

position_mm required
number —
success required
boolean —
400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/iobox/door/save

Save IO door travel limits

Persists the supplied closed/open positions in the active configuration. Use the move endpoint to test physical travel before saving.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
close required
number —

min 0 · max 1000

open required
number —

max 1000 · > 0

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/iobox/jog

Jog an IO pickup position

Moves the selected low, high, or multi-item axis by signed delta millimeters. Pickup low and high share one Z and stage extension; the multi-item pose has its own. Updates in-memory calibration; call the IO save endpoint to persist changes.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
axis required
string —

one of "x", "y", "z", "stage"

delta required
number

Signed displacement in millimeters

position required
string —

one of "low", "high", "multi_item"

Responses

200 Successful Response

application/json · IOBoxPositionResponse

Name Type Description
multi_item_stage_extension required
number

Position or extension in millimeters

multi_item_x required
number

Position or extension in millimeters

multi_item_y required
number

Position or extension in millimeters

multi_item_z_extension required
number

Position or extension in millimeters

pickup_high_x required
number

Position or extension in millimeters

pickup_high_y required
number

Position or extension in millimeters

pickup_low_x required
number

Position or extension in millimeters

pickup_low_y required
number

Position or extension in millimeters

stage_extension required
number

Position or extension in millimeters

warnings
array<string> | null —
z_extension required
number

Position or extension in millimeters

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/iobox/move

Move to an IO pickup position

Opens the IO door, faces the tool forward, and moves to the configured low, high, or multi-item point. Updates the in-memory IO calibration state returned by the endpoint.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
position required
query
string —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · IOBoxPositionResponse

Name Type Description
multi_item_stage_extension required
number

Position or extension in millimeters

multi_item_x required
number

Position or extension in millimeters

multi_item_y required
number

Position or extension in millimeters

multi_item_z_extension required
number

Position or extension in millimeters

pickup_high_x required
number

Position or extension in millimeters

pickup_high_y required
number

Position or extension in millimeters

pickup_low_x required
number

Position or extension in millimeters

pickup_low_y required
number

Position or extension in millimeters

stage_extension required
number

Position or extension in millimeters

warnings
array<string> | null —
z_extension required
number

Position or extension in millimeters

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/iobox/save

Save IO pickup calibration

Persists pickup coordinates and extensions, then closes/homes the tool and homes the IO door. This save operation also moves hardware; a homing failure can occur after configuration has been written.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
multi_item_stage_extension required
number

Position or extension in millimeters

multi_item_x required
number

Position or extension in millimeters

multi_item_y required
number

Position or extension in millimeters

multi_item_z_extension required
number

Position or extension in millimeters

pickup_high_x required
number

Position or extension in millimeters

pickup_high_y required
number

Position or extension in millimeters

pickup_low_x required
number

Position or extension in millimeters

pickup_low_y required
number

Position or extension in millimeters

stage_extension required
number

Position or extension in millimeters

z_extension required
number

Position or extension in millimeters

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/iobox/test

Test the IO pickup sequence

Executes the configured low-to-high pickup sequence and retracts the tool. with_gripper=true also operates the gripper. This moves physical hardware using the current in-memory calibration.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
with_gripper
query
boolean —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/iobox/test/multi-item

Test the multi-item tray cycle

With a tray waiting in the IO box, releases the gripper, moves to the multi-item pose, extends, grips the tray, retracts it into the tool, then extends again, releases it, and retracts empty. This moves physical hardware using the current in-memory calibration.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/jog

Jog the active calibration position

Moves the selected axis by signed delta millimeters and updates the in-memory calibration position. Move to a cell or position first; otherwise returns 400. Changes are not persisted until saved.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
axis required
string —

one of "x", "y", "z", "stage"

delta required
number

Signed displacement in millimeters

Responses

200 Successful Response

application/json · PositionResponse

Name Type Description
slide_extension required
number

Position or extension in millimeters

warnings
array<string> | null —
x required
number

Position or extension in millimeters

y required
number

Position or extension in millimeters

z_offset required
number

Position or extension in millimeters

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/laser/abort

Abort automatic laser calibration

Requests cancellation of the active automatic calibration session and returns its snapshot. A state conflict returns 409; inspect the snapshot before starting another operation.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · LaserAutoCalibrationSnapshot

Name Type Description
angle_results
array<LaserAutoCalibrationAngleResult> —
alpha_deg required
number —
capture_y_mm required
number —
line_angle_deg required
number —
max_abs_residual_mm required
number —
method
"stage_stall" —

default "stage_stall"

previous_rotation_deg required
number —
rms_residual_mm required
number —
sample_count required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

stage_position_mm
number | null —
updated_rotation_deg required
number —
back_candidate_count
integer —

default 0

back_detected_cell_count
integer —

default 0

back_scouted_shelf_count
integer —

default 0

back_stage_extension_mm
number | null —
bounds
ScanBounds | null —
x_max required
number —
x_min required
number —
y_max required
number —
y_min required
number —
candidate_count
integer —

default 0

current_side
StorageModuleSide | null —
current_stage
string | null —
detected_cell_count
integer —

default 0

detected_cells
array<LaserAutoCalibrationCell> —
cell_idx required
integer —
center_x_mm required
number —
center_y_mm required
number —
height_mm required
number —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

tool_x_mm required
number —
tool_y_mm required
number —
wall_depth_mm
number | null —
width_mm required
number —
error
string | null —
error_detail
LaserAutoCalibrationError | null —
correlation_id
string | null —
diagnostic_snapshot
object | null —
error required
string —
error_type required
string —
fault_context
object | null —
phase
string | null —
run_id
string | null —
front_candidate_count
integer —

default 0

front_detected_cell_count
integer —

default 0

front_scouted_shelf_count
integer —

default 0

front_stage_extension_mm
number | null —
reference_offset_results
array<LaserAutoCalibrationReferenceOffset> —
applied
boolean —

default false

configured_offset_x_mm
number | null —
configured_offset_y_mm
number | null —
intercept_mm
number | null —
offset_x_mm required
number —
offset_y_mm required
number —
persisted
boolean —

default false

sample_count required
integer —
samples
array<LaserAutoCalibrationReferenceOffsetSample> —
cell_idx required
integer —
delta_x_mm required
number —
delta_y_mm required
number —
derived_intercept_mm
number | null —
detected_x_mm required
number —
detected_y_mm required
number —
manual_x_mm required
number —
manual_y_mm required
number —
shelf_idx required
integer —
wall_depth_mm
number | null —
side required
StorageModuleSide —

one of "front_module", "back_module"

skipped
array<string> —
slope_per_mm
number —

default 0

spread_x_mm required
number —
spread_y_mm required
number —
requested_scope
LaserAutoCalibrationScope —
cell_idx
integer | null —
hold_y_enabled
boolean —

default true

include_angle_calibration
boolean —

default true

include_extension_calibration
boolean —

default true

mode
string —

one of "all", "both", "side", "shelf", "cell" · default "all"

shelf_idx
integer | null —
side
StorageModuleSide | null —
run_id
string | null —
scouted_shelf_count
integer —

default 0

session_id
string | null —
shelf_candidates
array<LaserAutoCalibrationCandidate> —
row_count
integer —

default 1

shelf_idx
integer | null —
side required
StorageModuleSide —

one of "front_module", "back_module"

wall_depth_mm
number | null —
wall_sample_count
integer —

default 0

x_max required
number —
x_min required
number —
y_max required
number —
y_min required
number —
shelf_edges
array<LaserAutoCalibrationShelfEdge> —
side required
StorageModuleSide —

one of "front_module", "back_module"

x_mm required
number —
y_mm required
number —
stage_detail
object —
started_at
string | null —
state
string —

one of "idle", "starting", "running", "applying", "completed", "failed", "cancelled" · default "idle"

updated_at
string | null —
409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/calibration/laser/read

Read laser distance

Returns the current laser distance in millimeters. Requires an initialized robot; a failed read returns 503. Does not start an automatic calibration session.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · LaserReadingResponse

Name Type Description
distance_mm required
number —
409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/calibration/laser/status

Read automatic calibration progress

Returns the current automatic laser-calibration snapshot, including scope and progress. Does not start or abort a session.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · LaserAutoCalibrationSnapshot

Name Type Description
angle_results
array<LaserAutoCalibrationAngleResult> —
alpha_deg required
number —
capture_y_mm required
number —
line_angle_deg required
number —
max_abs_residual_mm required
number —
method
"stage_stall" —

default "stage_stall"

previous_rotation_deg required
number —
rms_residual_mm required
number —
sample_count required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

stage_position_mm
number | null —
updated_rotation_deg required
number —
back_candidate_count
integer —

default 0

back_detected_cell_count
integer —

default 0

back_scouted_shelf_count
integer —

default 0

back_stage_extension_mm
number | null —
bounds
ScanBounds | null —
x_max required
number —
x_min required
number —
y_max required
number —
y_min required
number —
candidate_count
integer —

default 0

current_side
StorageModuleSide | null —
current_stage
string | null —
detected_cell_count
integer —

default 0

detected_cells
array<LaserAutoCalibrationCell> —
cell_idx required
integer —
center_x_mm required
number —
center_y_mm required
number —
height_mm required
number —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

tool_x_mm required
number —
tool_y_mm required
number —
wall_depth_mm
number | null —
width_mm required
number —
error
string | null —
error_detail
LaserAutoCalibrationError | null —
correlation_id
string | null —
diagnostic_snapshot
object | null —
error required
string —
error_type required
string —
fault_context
object | null —
phase
string | null —
run_id
string | null —
front_candidate_count
integer —

default 0

front_detected_cell_count
integer —

default 0

front_scouted_shelf_count
integer —

default 0

front_stage_extension_mm
number | null —
reference_offset_results
array<LaserAutoCalibrationReferenceOffset> —
applied
boolean —

default false

configured_offset_x_mm
number | null —
configured_offset_y_mm
number | null —
intercept_mm
number | null —
offset_x_mm required
number —
offset_y_mm required
number —
persisted
boolean —

default false

sample_count required
integer —
samples
array<LaserAutoCalibrationReferenceOffsetSample> —
cell_idx required
integer —
delta_x_mm required
number —
delta_y_mm required
number —
derived_intercept_mm
number | null —
detected_x_mm required
number —
detected_y_mm required
number —
manual_x_mm required
number —
manual_y_mm required
number —
shelf_idx required
integer —
wall_depth_mm
number | null —
side required
StorageModuleSide —

one of "front_module", "back_module"

skipped
array<string> —
slope_per_mm
number —

default 0

spread_x_mm required
number —
spread_y_mm required
number —
requested_scope
LaserAutoCalibrationScope —
cell_idx
integer | null —
hold_y_enabled
boolean —

default true

include_angle_calibration
boolean —

default true

include_extension_calibration
boolean —

default true

mode
string —

one of "all", "both", "side", "shelf", "cell" · default "all"

shelf_idx
integer | null —
side
StorageModuleSide | null —
run_id
string | null —
scouted_shelf_count
integer —

default 0

session_id
string | null —
shelf_candidates
array<LaserAutoCalibrationCandidate> —
row_count
integer —

default 1

shelf_idx
integer | null —
side required
StorageModuleSide —

one of "front_module", "back_module"

wall_depth_mm
number | null —
wall_sample_count
integer —

default 0

x_max required
number —
x_min required
number —
y_max required
number —
y_min required
number —
shelf_edges
array<LaserAutoCalibrationShelfEdge> —
side required
StorageModuleSide —

one of "front_module", "back_module"

x_mm required
number —
y_mm required
number —
stage_detail
object —
started_at
string | null —
state
string —

one of "idle", "starting", "running", "applying", "completed", "failed", "cancelled" · default "idle"

updated_at
string | null —
409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/calibration/laser/stream

Start or observe automatic laser calibration

This GET can start physical motion. With the default subscribe_only=false, starts or joins an automatic calibration session for the supplied scope. Set subscribe_only=true to observe without starting one. Conflicting scopes or a busy robot return 409; invalid scope returns 400.

Returns Server-Sent Events with JSON calibration snapshots. A client disconnect unsubscribes that client; use the abort endpoint to stop the session. Do not infer cancellation from a closed connection. Optional scope parameters select cells, both sides, or the angle/extension calibration phases. hold_y_enabled=false parks Y on its brake between moves instead of holding it energised for the session. Every run frames its offsets from the hand-calibrated bottom-left cell of the sides it covers and returns 400 before moving when one of those cells is missing or not marked manual, or when a side or module run has no z source (z stall probe, a reference cell whose z was saved with its stage extension, or a z model pinned to the live Z_EXTENSION_PLACE).

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
side
query
StorageModuleSide | null —
shelf_idx
query
integer | null

Zero-based shelf index.

cell_idx
query
integer | null

Zero-based cell index within the shelf.

mode
query
string | null —
include_angle_calibration
query
boolean | null —
include_extension_calibration
query
boolean | null —
hold_y_enabled
query
boolean | null —
subscribe_only
query
boolean —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Automatic calibration snapshots encoded as JSON in SSE data frames. GET may start motion unless subscribe_only=true.

text/event-stream · string

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/calibration/laser/z-stall

Read the grip edge z setting

Returns whether automatic calibration sets each cell's z from where the gripper starts to grip it. The setting belongs to the machine (robot.grid.scan.z_stall_anchor_enabled, named for the contact probe it replaced), not to a run.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · LaserZStallSetting

Name Type Description
enabled required
boolean —
post /api/calibration/laser/z-stall

Save the grip edge z setting

Persists robot.grid.scan.z_stall_anchor_enabled. When enabled, every later automatic calibration that holds the bottom-left reference cell steps each cell's z until the gripper grips it and sets the cell's z just past that edge. Returns 409 while automatic calibration runs. Does not move.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
enabled required
boolean —

Responses

200 Successful Response

application/json · LaserZStallSetting

Name Type Description
enabled required
boolean —
409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/move

Move to a cell calibration point

Moves the tool to the selected side and zero-based shelf/cell calibration point. Returns the current calibration position. A cell without a point returns 400. Starts the position context used by subsequent jog operations.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

Responses

200 Successful Response

application/json · PositionResponse

Name Type Description
slide_extension required
number

Position or extension in millimeters

warnings
array<string> | null —
x required
number

Position or extension in millimeters

y required
number

Position or extension in millimeters

z_offset required
number

Position or extension in millimeters

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/move/position

Move to a calibration coordinate

Moves the tool to the supplied coordinate in millimeters and establishes the calibration position context. The response may include warnings for adjusted coordinates. Requires available hardware and exclusive manual-motion access.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
side required
StorageModuleSide —

one of "front_module", "back_module"

x required
number

Position or extension in millimeters

y required
number

Position or extension in millimeters

z_offset
number —

default 0

Responses

200 Successful Response

application/json · PositionResponse

Name Type Description
slide_extension required
number

Position or extension in millimeters

warnings
array<string> | null —
x required
number

Position or extension in millimeters

y required
number

Position or extension in millimeters

z_offset required
number

Position or extension in millimeters

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/calibration/rotation

Read tool orientation positions

Returns the configured front/back rotation positions used by the tool. Does not rotate hardware.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · RotationAnglesResponse

Name Type Description
back required
number —
front required
number —
409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/rotation/rotate

Test tool rotation

Rotates to the requested angle, clamped to the configured motor limits. Positions the stage as needed for rotation and restores its safe X position. Does not persist front/back calibration. Blocked by the rotation clearance guard (e.g. the tool is extended) with a 409 that names the unsafe axis; a misconfigured machine returns 400.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
angle required
query
number —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/rotation/save

Save tool orientation positions

Persists the front/back rotation values in the active configuration. Test rotation separately before saving.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
back required
number —
front required
number —

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/save

Save a cell calibration point

Persists coordinates, optional status, manual marker, and dimensions for the selected cell. Tray homes allow coordinate, manual-marker, status, and dimension updates. Invalid status returns 400.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
cell_idx required
integer —
dimensions
Dimensions | null

Cell width, height, and length in millimeters; omit to keep the current dimensions.

height required
number —
length required
number —
width required
number —
is_manual
boolean | null —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

status
string | null —
x required
number

Position or extension in millimeters

y required
number

Position or extension in millimeters

z_offset required
number

Position or extension in millimeters

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/calibration/shelf

Read shelf stage extensions

Returns configured front/back shelf extension distances in millimeters. Does not move the stage.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · ShelfStageExtensionResponse

Name Type Description
back required
number —
front required
number —
409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/shelf/save

Save shelf stage extensions

Persists front/back extension distances after checking the configured stage limit. Does not execute a test move.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
back required
number —
front required
number —

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/stage/move

Test a stage extension

Moves the stage toward the requested position in millimeters, applying configured limits. Returns the actual target and any warnings. Does not persist shelf extension settings.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
position required
number —

Responses

200 Operation result

application/json · StageMoveResponse

Name Type Description
position required
number

Applied target in millimeters

warnings required
array<string> | null —
409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/calibration/status

Read calibration readiness

Reports whether homing is required and which axes need it. Does not home or move the robot. Use this before a calibration procedure.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · CalibrationStatusResponse

Name Type Description
needs_home required
boolean —
needs_home_axes
array<string> —
needs_home_reason
string | null —
409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/calibration/storage

Read the calibration grid

Returns the storage grid used by calibration, including per-cell calibration points. This is geometry, not a command result or a live inventory snapshot.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · StorageGrid

Name Type Description
back_module
array<Shelf> —
cells required
array<Cell> —
calibration_point required
CalibrationCoordinate | null —
s
integer —

default 0

x required
number —
y required
number —
z_captured_at_stage_mm
number | null —
z_offset
number —

default 0

cell_idx
integer —

min 0 · default 0

dimensions required
Dimensions —
height required
number —
length required
number —
width required
number —
is_manual
boolean —

default false

item required
CellItem | null —
barcode
string | null —
data
map<string, string | integer | number | object | array<any>> | null —
dimensions required
Dimensions —
height required
number —
length required
number —
width required
number —
weight
number | null —
status required
CellStatus —

one of "occupied", "available", "maintenance", "disabled"

divider_width
number —

default 8

shelf_idx
integer —

min 0 · default 0

filename
string —

default ""

front_module
array<Shelf> —
cells required
array<Cell> —
calibration_point required
CalibrationCoordinate | null —
s
integer —

default 0

x required
number —
y required
number —
z_captured_at_stage_mm
number | null —
z_offset
number —

default 0

cell_idx
integer —

min 0 · default 0

dimensions required
Dimensions —
height required
number —
length required
number —
width required
number —
is_manual
boolean —

default false

item required
CellItem | null —
barcode
string | null —
data
map<string, string | integer | number | object | array<any>> | null —
dimensions required
Dimensions —
height required
number —
length required
number —
width required
number —
weight
number | null —
status required
CellStatus —

one of "occupied", "available", "maintenance", "disabled"

divider_width
number —

default 8

shelf_idx
integer —

min 0 · default 0

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/test

Test a cell pick or place

Runs the selected cell gripper test on physical hardware. Optional lift requests a bounded pick/lift/place test. Tray homes are supported; disabled or maintenance cells are rejected. This tests motion without saving new calibration coordinates. To queue many cells without depending on the browser tab staying active, use the cell test queue.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
lift
query
number | null —
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/test/cycle

Test an IO transfer cycle

Runs the IO pick/place cycle for the selected calibration cell. Tray homes are supported; disabled or maintenance cells are rejected. This moves the tool through the IO box; use only with the physical setup prepared for the test. Does not save calibration. To queue many cells without depending on the browser tab staying active, use the cell test queue.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
cell_idx required
integer —
shelf_idx required
integer —
side required
StorageModuleSide —

one of "front_module", "back_module"

Responses

200 Operation result

application/json · BooleanSuccess

Name Type Description
success required
boolean

Operation result; inspect even when HTTP status is 200

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/calibration/test/queue

Read the calibration test queue state

Returns the current or most recent queue snapshot; state is idle until the first queue starts on this process. Clients resuming a backgrounded or reloaded page use this to catch up between calibration_test_queue events.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · TestQueueSnapshot

Name Type Description
completed
integer —

default 0

current
TestQueueCell | null —
cell_idx required
integer —

min 0

shelf_idx required
integer —

min 0

error
string | null —
failed
TestQueueCell | null —
cell_idx required
integer —

min 0

shelf_idx required
integer —

min 0

job_id
string | null —
mode
string | null —
side
string | null —
started_at
string | null —
state
string —

one of "idle", "running", "completed", "failed", "cancelled" · default "idle"

total
integer —

default 0

updated_at
string | null —
post /api/calibration/test/queue

Start a server-side calibration test queue

Walks the given cells one at a time in the given order on the server, running the quick or cycle test for each, and stops at the first failure. Progress and the terminal state are published as calibration_test_queue events on /api/robot/events; the current state is also readable at GET /api/calibration/test/queue. Requires robot:control; returns 409 while another test queue is running.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
cells required
array<TestQueueCell> —

min items 1 · max items 256

cell_idx required
integer —

min 0

shelf_idx required
integer —

min 0

lift
number | null

Optional pick/lift/place height in millimeters for quick mode

mode required
string —

one of "quick", "cycle"

side required
StorageModuleSide —

one of "front_module", "back_module"

Responses

200 Successful Response

application/json · TestQueueSnapshot

Name Type Description
completed
integer —

default 0

current
TestQueueCell | null —
cell_idx required
integer —

min 0

shelf_idx required
integer —

min 0

error
string | null —
failed
TestQueueCell | null —
cell_idx required
integer —

min 0

shelf_idx required
integer —

min 0

job_id
string | null —
mode
string | null —
side
string | null —
started_at
string | null —
state
string —

one of "idle", "running", "completed", "failed", "cancelled" · default "idle"

total
integer —

default 0

updated_at
string | null —
400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/calibration/test/queue/abort

Abort the calibration test queue

Requests cancellation before the next cell; the cell currently moving finishes first, matching the single-cell tests. The queue publishes a cancelled terminal event once it stops. Requires robot:control; returns 409 when no queue is running.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · TestQueueSnapshot

Name Type Description
completed
integer —

default 0

current
TestQueueCell | null —
cell_idx required
integer —

min 0

shelf_idx required
integer —

min 0

error
string | null —
failed
TestQueueCell | null —
cell_idx required
integer —

min 0

shelf_idx required
integer —

min 0

job_id
string | null —
mode
string | null —
side
string | null —
started_at
string | null —
state
string —

one of "idle", "running", "completed", "failed", "cancelled" · default "idle"

total
integer —

default 0

updated_at
string | null —
409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

demo

Authenticated demonstration-cycle control. Requires configured cells and robot hardware.

post /api/demo/cycle/start

Start the demonstration cycle

Starts background motion through the configured demo cell map. Requires an authenticated user and available hardware. Missing cells return 400; an already running demo or conflicting motion returns 409. Acceptance does not mean the cycle has finished.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · SuccessResponse

Name Type Description
message
string —

default "success"

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/demo/cycle/status

Read demonstration progress

Reports whether the background demo is running, its current cell index, and configured cell count. Does not start or stop motion.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · DemoCycleStatusResponse

Name Type Description
current_cell_index
integer | null —
is_running required
boolean —
total_cells
integer | null —
409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/demo/cycle/stop

Request demonstration stop

Requests the running demo cycle to stop. Returns 409 when no demo is running. Poll demo status for completion; this is not a physical emergency stop.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · SuccessResponse

Name Type Description
message
string —

default "success"

409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

wifi

NetworkManager wireless configuration on the device.

post /api/wifi/connect

Connect and persist Wi-Fi

Requires robot:control. Creates a pending NetworkManager connection, activates it, and writes boot Wi-Fi configuration on success. Failure rolls back the pending connection. Changing networks may disconnect the requesting client.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
password required
string —
ssid required
string —

Responses

200 Successful Response

application/json · WifiConnectResponse

Name Type Description
message required
string —
ssid required
string —
success required
boolean —
400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

502 Invalid or failed dependency response

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/wifi/networks

Scan available Wi-Fi networks

Scans using NetworkManager and returns visible SSIDs, signal, security, and active-network markers. Requires authentication; this can take longer than a cached status read.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · WifiNetworkList

Name Type Description
networks required
array<WifiNetwork> —
in_use required
boolean —
security required
string —
signal required
integer —
ssid required
string —
500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

502 Invalid or failed dependency response

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/wifi/status

Read Wi-Fi connection state

Returns the active wireless SSID, signal, and IP when available. Requires authentication. A disconnected state is represented in the body.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · WifiStatus

Name Type Description
connected required
boolean —
ip
string | null —
signal
integer | null —
ssid
string | null —
500 Internal failure; retain the correlation ID for diagnosis

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

onboarding

Initial network and administrator setup. Public mutations are restricted by first-run state.

post /api/onboarding/admin-user

Create the first administrator

Public only while onboarding is pending. Creates the initial administrator using the provisioned admin role. When the pending installation already holds exactly the requested administrator - the wizard created it and never reached /complete - the retry resets that account's PIN instead of failing, so an interrupted setup can be finished. Returns 409 when a different regular user exists and 403 after onboarding is complete.

Request body required application/json

Name Type Description
email required
string(email) —
first_name
string —

default "Admin"

last_name
string —

default "User"

pin required
string —

Responses

200 Successful Response

application/json · openshelf_os_server__routers__users__UserResponse

Name Type Description
access_level_id
integer | null —
access_level_name
string | null —
created_at required
string —
email required
string —
first_name required
string —
has_login_barcode required
boolean —
id required
integer —
is_active required
boolean —
last_name required
string —
role_id required
integer —
role_name required
string —
updated_at required
string —
409 Operation conflicts with current state

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/onboarding/complete

Complete first-run setup

Requires users:write. Marks onboarding complete, disabling the public first-run mutation endpoints. Returns needs_onboarding=false.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · OnboardingStatus

Name Type Description
needs_onboarding required
boolean —
get /api/onboarding/status

Read first-run setup state

Public endpoint indicating whether onboarding is pending. The check ensures onboarding state exists; it is not a robot health check. A corrupt state file returns 503.

Responses

200 Successful Response

application/json · OnboardingStatus

Name Type Description
needs_onboarding required
boolean —
post /api/onboarding/wifi/connect

Connect Wi-Fi during first-run setup

Public only while onboarding is pending. Activates the supplied connection and persists it on success. Changing the device network can disconnect this client; failures roll back the pending connection.

Request body required application/json

Name Type Description
password required
string —
ssid required
string —

Responses

200 Successful Response

application/json · WifiConnectResponse

Name Type Description
message required
string —
ssid required
string —
success required
boolean —
get /api/onboarding/wifi/networks

Scan Wi-Fi during first-run setup

Public only while onboarding is pending. Scans for wireless networks; after setup, use the authenticated Wi-Fi endpoint.

Responses

200 Successful Response

application/json · WifiNetworkList

Name Type Description
networks required
array<WifiNetwork> —
in_use required
boolean —
security required
string —
signal required
integer —
ssid required
string —
get /api/onboarding/wifi/status

Read Wi-Fi during first-run setup

Public only while onboarding is pending. Returns the active wireless connection state; after setup, use the authenticated Wi-Fi endpoint.

Responses

200 Successful Response

application/json · WifiStatus

Name Type Description
connected required
boolean —
ip
string | null —
signal
integer | null —
ssid
string | null —

users

User administration. All routes require users:read; writes/deletes require their additional permission.

get /api/users

List managed users

Returns an offset page of non-system users with optional active-state and role filters. Requires users:read; the total reflects the same filters.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
offset
query
integer

Number of records to skip before returning results.

limit
query
integer

Maximum number of records to return.

is_active
query
boolean | null —
role_id
query
integer | null

Role identifier.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · UserListResponse

Name Type Description
limit required
integer —
offset required
integer —
total required
integer —
users required
array<openshelf_os_server__routers__users__UserResponse> —
access_level_id
integer | null —
access_level_name
string | null —
created_at required
string —
email required
string —
first_name required
string —
has_login_barcode required
boolean —
id required
integer —
is_active required
boolean —
last_name required
string —
role_id required
integer —
role_name required
string —
updated_at required
string —
post /api/users

Create a user

Requires both users:read and users:write. PINs contain exactly four digits and are stored hashed. Email must be unique; role and optional access level must exist. Invalid references or duplicate email return 400.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
access_level_id
integer | null —
email required
string(email) —
first_name required
string —
last_name required
string —
pin required
string —
role_id required
integer —

Responses

200 Successful Response

application/json · openshelf_os_server__routers__users__UserResponse

Name Type Description
access_level_id
integer | null —
access_level_name
string | null —
created_at required
string —
email required
string —
first_name required
string —
has_login_barcode required
boolean —
id required
integer —
is_active required
boolean —
last_name required
string —
role_id required
integer —
role_name required
string —
updated_at required
string —
400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/users/login-barcode/resolve

Resolve a scanned login barcode to a managed user

Resolve an exact assigned barcode without exposing barcode values in responses.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
login_barcode required
string —

min length 1 · max length 64

Responses

200 Successful Response

application/json · openshelf_os_server__routers__users__UserResponse

Name Type Description
access_level_id
integer | null —
access_level_name
string | null —
created_at required
string —
email required
string —
first_name required
string —
has_login_barcode required
boolean —
id required
integer —
is_active required
boolean —
last_name required
string —
role_id required
integer —
role_name required
string —
updated_at required
string —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/users/{user_id}

Read a managed user

Requires users:read. Returns role/access-level details for a non-system user. Absent and system users return 404.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
user_id required
path
integer

User identifier.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · openshelf_os_server__routers__users__UserResponse

Name Type Description
access_level_id
integer | null —
access_level_name
string | null —
created_at required
string —
email required
string —
first_name required
string —
has_login_barcode required
boolean —
id required
integer —
is_active required
boolean —
last_name required
string —
role_id required
integer —
role_name required
string —
updated_at required
string —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

put /api/users/{user_id}

Update a managed user

Requires both users:read and users:write. Supplied non-null values update the account; PIN replacement is hashed. Null or omitted values are not a general field-clearing mechanism. System users are excluded.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
user_id required
path
integer

User identifier.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
access_level_id
integer | null —
email
string(email) | null —
first_name
string | null —
is_active
boolean | null —
last_name
string | null —
pin
string | null —
role_id
integer | null —

Responses

200 Successful Response

application/json · openshelf_os_server__routers__users__UserResponse

Name Type Description
access_level_id
integer | null —
access_level_name
string | null —
created_at required
string —
email required
string —
first_name required
string —
has_login_barcode required
boolean —
id required
integer —
is_active required
boolean —
last_name required
string —
role_id required
integer —
role_name required
string —
updated_at required
string —
400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

delete /api/users/{user_id}

Deactivate a user

Requires both users:read and users:delete. Soft-deletes a non-system account by setting is_active=false; it does not erase the user or audit history. Deactivating your own account returns 400.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
user_id required
path
integer

User identifier.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · MessageResponse

Name Type Description
message required
string

Operation acknowledgment

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

patch /api/users/{user_id}

Update a managed user

Requires both users:read and users:write. Supplied non-null values update the account; PIN replacement is hashed. Null or omitted values are not a general field-clearing mechanism. System users are excluded.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
user_id required
path
integer

User identifier.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
access_level_id
integer | null —
email
string(email) | null —
first_name
string | null —
is_active
boolean | null —
last_name
string | null —
pin
string | null —
role_id
integer | null —

Responses

200 Successful Response

application/json · openshelf_os_server__routers__users__UserResponse

Name Type Description
access_level_id
integer | null —
access_level_name
string | null —
created_at required
string —
email required
string —
first_name required
string —
has_login_barcode required
boolean —
id required
integer —
is_active required
boolean —
last_name required
string —
role_id required
integer —
role_name required
string —
updated_at required
string —
400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

post /api/users/{user_id}/login-barcode/print

Rotate and print a user's login barcode

Replace any prior assignment, persist it, then print the new barcode.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
user_id required
path
integer

User identifier.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · LoginBarcodePrintResponse

Name Type Description
assigned required
boolean —
has_login_barcode required
boolean —
printed required
boolean —
replaced required
boolean —
user_id required
integer —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

roles

Role administration. All routes require roles:read; writes/deletes require their additional permission.

get /api/roles

List roles and user counts

Requires roles:read. Lists permission strings and the number of assigned users for each role. Counts include inactive users.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · array<RoleResponse>

Name Type Description
created_at required
string —
id required
integer —
name required
string —
permissions required
array<string> —
updated_at required
string —
user_count required
integer —
post /api/roles

Create a role

Requires roles:read and roles:write. Stores the permission list as supplied. Duplicate role names return 400.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
name required
string —
permissions required
array<string> —

Responses

200 Successful Response

application/json · RoleResponse

Name Type Description
created_at required
string —
id required
integer —
name required
string —
permissions required
array<string> —
updated_at required
string —
user_count required
integer —
400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/roles/{role_id}

Read a role

Requires roles:read. Returns its permissions and assigned-user count. An unknown role ID returns 404.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
role_id required
path
integer

Role identifier.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · RoleResponse

Name Type Description
created_at required
string —
id required
integer —
name required
string —
permissions required
array<string> —
updated_at required
string —
user_count required
integer —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

put /api/roles/{role_id}

Update a role

Requires roles:read and roles:write. A supplied permission list replaces the existing list. Null or omitted fields are unchanged; duplicate names return 400.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
role_id required
path
integer

Role identifier.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
name
string | null —
permissions
array<string> | null —

Responses

200 Successful Response

application/json · RoleResponse

Name Type Description
created_at required
string —
id required
integer —
name required
string —
permissions required
array<string> —
updated_at required
string —
user_count required
integer —
400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

delete /api/roles/{role_id}

Delete an unused role

Requires roles:read and roles:delete. Roles assigned to any user, including inactive users, cannot be deleted and return 400. An absent role returns 404.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
role_id required
path
integer

Role identifier.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Operation result

application/json · MessageResponse

Name Type Description
message required
string

Operation acknowledgment

400 Invalid operation or device configuration

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

access_levels

Access levels used to decide item retrieval permissions.

get /api/access_levels

List access levels

Returns the configured access levels used by users and inventory retrieval checks. Requires authentication. Assign access-level IDs through the user and item endpoints.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · array<AccessLevelResponse>

Name Type Description
created_at required
string —
id required
integer —
name required
string —
updated_at required
string —

audit

Request audit history and integrity verification. Requires audit:read.

get /api/audit/logs

Query request audit records

Requires audit:read. Returns an offset page filtered by inclusive date bounds, user, endpoint substring, HTTP method, response status, or exact correlation ID. Use correlation IDs to relate requests to command activity; audit records are not a replacement for command polling.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
user_id
query
integer | null

Filter by user ID

date_from
query
string(date-time) | null

Start date (ISO format)

date_to
query
string(date-time) | null

End date (ISO format)

endpoint
query
string | null

Filter by API endpoint

method
query
string | null

Filter by HTTP method

status_code
query
integer | null

Filter by response status

correlation_id
query
string | null

Filter by exact correlation ID

limit
query
integer

Max results

offset
query
integer

Pagination offset

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · AuditLogListResponse

Name Type Description
limit required
integer —
logs required
array<AuditLogResponse> —
command_records required
array<object> | null —
correlation_id required
string | null —
endpoint required
string —
error_message required
string | null —
id required
integer —
ip_address required
string | null —
method required
string —
request_body required
object | null —
request_duration_ms required
integer | null —
response_body required
object | null —
response_status required
integer —
timestamp required
string —
user_agent required
string | null —
user_email required
string | null —
user_id required
integer | null —
offset required
integer —
total required
integer —
get /api/audit/logs/{log_id}

Read one audit record

Requires audit:read. Returns captured request/response context and related command records. An absent log ID returns 404.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
log_id required
path
integer

Audit log entry identifier.

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · AuditLogResponse

Name Type Description
command_records required
array<object> | null —
correlation_id required
string | null —
endpoint required
string —
error_message required
string | null —
id required
integer —
ip_address required
string | null —
method required
string —
request_body required
object | null —
request_duration_ms required
integer | null —
response_body required
object | null —
response_status required
integer —
timestamp required
string —
user_agent required
string | null —
user_email required
string | null —
user_id required
integer | null —
404 Resource or configured hardware not found

application/json · ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

get /api/audit/verify

Verify protected audit records

Requires audit:read. Checks stored linkage, hashes, and HMACs for protected entries in the inclusive sequence range. The ok field reports integrity; verification failure is returned in the body rather than as an HTTP error. Unprotected legacy entries are excluded.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
from_seq
query
integer | null

Start seq_no (inclusive)

to_seq
query
integer | null

End seq_no (inclusive)

token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Responses

200 Successful Response

application/json · AuditVerifyResponse

Name Type Description
checked required
integer —
first_error_seq required
integer | null —
message required
string | null —
ok required
boolean —

report

Operator-submitted diagnostics with runtime context.

post /api/report_error

Submit an operator error report

Captures the supplied message with user, robot, system, and available camera context. Sends it to Sentry when enabled and initialized for this mode. An ok acknowledgment does not guarantee remote delivery.

Requires UserBearer, UserQueryToken authentication.

Parameters

Name Type Description
token
query
string | null

User access token for streaming/image clients. A bearer header takes precedence. Relay service credentials are header-only.

Request body required application/json

Name Type Description
message required
string —

Responses

200 Successful Response

application/json · ReportErrorResponse

Name Type Description
status required
string —

telemetry

Cumulative device counters.

get /api/telemetry

Read cumulative device telemetry

Public counters for robot cycles and motor movement time in seconds. Does not start hardware sampling or reset counters.

Responses

200 Successful Response

application/json · TelemetryResponse

Name Type Description
cycle_count required
integer —
motor_movement_seconds required
number —

Errors

These responses are shared by most operations, so they are listed here once instead of on each operation.

Status Meaning Body Returned by
401 Authentication required or token invalid ErrorResponse 152 of 163
403 Permission or operating-state restriction ErrorResponse 118 of 163
422 Validation Error HTTPValidationError 137 of 163
503 Required hardware or service is unavailable ErrorResponse 83 of 163

ErrorResponse

Name Type Description
detail required
string | object | array<any>

Text, an operation-specific error object, or request validation errors.

HTTPValidationError

Name Type Description
detail
array<ValidationError> —
ctx
object —
input
any —
loc required
array<string | integer> —
msg required
string —
type required
string —