Implementing Lock Actions
How to process lock and unlock requests and send events that confirm the final outcome.
Seam must be able to send lock and unlock commands and receive clear confirmation of what happened. Your API should execute commands quickly, return an immediate status, and emit events that describe how the action occurred.
Lock/unlock command request
Seam calls your API to initiate a lock or unlock operation.
POST https://devicecloud.example.com/locks/<LOCK_ID>/actions
{
"action": "unlock",
"custom_id": "req_98aa221" // optional but recommended, allow custom ID to be included.
}Expected synchronous response
Your API should return an immediate success or failure result indicating whether the command was accepted on your end.
{
"action_id": "act_23423",
"custom_id": "req_98aa221",
"status": "pending",
"lock_id": "lock_491829",
"action": "unlock"
}If the command is rejected immediately due to a known condition:
{
"error_code": "DEVICE_OFFLINE",
"message": "The device is currently offline and cannot accept commands."
}Action completion events
After the device processes the command, your platform should send an event confirming the final result.
Successful unlock event
{
"event_type": "lock.action_completed",
"device_id": "lock_491829",
"action_id": "act_39102",
"custom_id": "req_39102", // be able to trace the action to the event
"action": "unlock",
"status": "success",
"performed_via": "pin_code",
"timestamp": "2025-05-22T10:45:12Z"
}Successful lock event
{
"event_type": "lock.action_completed",
"device_id": "lock_491829",
"action_id": "act_99921",
"custom_id": "req_39102", // be able to trace the action to the event
"action": "lock",
"status": "success",
"performed_via": "mobile_app",
"timestamp": "2025-05-22T10:50:31Z"
}Action attribution
Each event should specify how the operation was performed. This makes it possible to correlate user intent with actual device behavior.
Common values for performed_via:
pin_codemobile_appremote_apibluetooth_keyfob_cardmanual_turn
Example:
{
"performed_via": "fob_card"
}Failure modes
Your API should clearly represent lock failures when the device cannot complete the action.
Examples of device-side failures
lock jammed
bolt obstruction
bolt not fully extended
mechanism error
firmware unable to accept commands
Failure event example
{
"event_type": "lock.action_completed",
"device_id": "lock_491829",
"action_id": "act_39102",
"action": "unlock",
"status": "failed",
"error_code": "LOCK_JAMMED",
"message": "The deadbolt could not retract.",
"timestamp": "2025-05-22T10:46:02Z"
}Synchronous error example
If the failure is detected immediately:
{
"error_code": "BOLT_OBSTRUCTED",
"message": "The lock mechanism is obstructed."
}Last updated
Was this helpful?

