A valid request URL is required to generate request examples{
"deviceId": "<string>",
"stopped": true,
"penLifted": true,
"at": "<string>",
"pending": true,
"reason": "<string>"
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}{
"error": {
"code": "unauthorized",
"reason": "missing_credentials",
"hint": "<string>"
}
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}{
"error": {
"code": "payload_too_large",
"message": "<string>"
}
}{
"error": {
"code": "rate_limited",
"message": "<string>"
}
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}Stop a robot arm now
Halt the arm driving this phone: its queued gestures are dropped, the motion in progress is cancelled and the pen is lifted. It does not wait behind the gesture it interrupts, and it does not lock the device: gestures sent afterwards run as usual. Safe to repeat. It is delivered whenever the arm’s controller can be reached, even when the arm is not ready to act: a stop never waits for readiness.
Robot-driven phones only, and only where capabilities.actions.stop is true; any other device, and an arm whose controller has no stop, answers 400. A gesture that was running when the stop landed answers action_outcome_unknown: look at the screen before acting again. Gated like a live view: a signed-in person with devices:act whose organisation holds a lease on the device.
Hosted deployments only. A local checkout does not mount this route, so calling it there is a 404.
A valid request URL is required to generate request examples{
"deviceId": "<string>",
"stopped": true,
"penLifted": true,
"at": "<string>",
"pending": true,
"reason": "<string>"
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}{
"error": {
"code": "unauthorized",
"reason": "missing_credentials",
"hint": "<string>"
}
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}{
"error": {
"code": "payload_too_large",
"message": "<string>"
}
}{
"error": {
"code": "rate_limited",
"message": "<string>"
}
}{
"error": {
"code": "backend_resolution_failed",
"message": "<string>",
"retryable": true
}
}Authorizations
The control surface credential. Send Authorization: Bearer <token>.
Two kinds of token are accepted and they are told apart by shape, not by a separate header. A token beginning pbk_ is an org scoped API key, whose public half and secret half are generated together and of which only a hash of the secret is ever stored; anything else is treated as an OAuth 2.1 access token and verified against the authorization server's keys.
Both resolve to the same context: an org, a principal and a set of scopes. Nothing downstream branches on which channel you used, with one deliberate exception, key management, which requires a signed-in person so that a key can never mint another key.
Scopes are enforced when MCP tools are REGISTERED rather than when they are called, so a tool your credential cannot use is absent from tools/list rather than refused mid gesture.
Path Parameters
The deviceId from a listing.
Response
The stop reached the arm. Read stopped, pending and reason for what it managed.
The device that was stopped.
Whether the arm stopped. False when its controller took the request but could not finish yet; then pending is true and reason says why. An arm that did not answer at all is an error, not a false here.
Whether the arm reports it lifted the pen, or null when it did not say.
When the arm stopped, on the arm's clock, or null when it did not say.
True when the arm's controller was still busy when it answered: the stop is taken and the arm may still be settling for a moment. False otherwise.
Why the stop did not finish, when the arm says: coordinates_invalid, controller_not_idle, lift_failed or motion_busy today. Read any other value as a generic failure to stop. Absent when the stop finished.