Download OpenAPI specification:
RESTful API for controlling Temi robots in an organization.
Authenticate every request with an Organization Access Token (OAT) in the
x-api-key header. Tokens are scoped; each endpoint requires the permission
noted in its description. Call the production host that matches the
organization: Production (api.robotemi.com) or Production-CN
(api.robotemi.cn).
OpenAPI control requires a PRO (or PRO free-trial) robot, matching launcher
SDK access. GET /robots omits BASIC robots. Robot-scoped endpoints return
403 for BASIC robots. GET /verify is not robot-gated.
Robots are identified by hardware serialNumber in paths and request bodies.
Validates the OAT and returns organization, scope, and robot access metadata.
{- "status": "ok",
- "organizationId": "string",
- "tokenId": "string",
- "scopes": [
- "string"
], - "robotScope": "all",
- "serialNumbers": [
- "00123456789"
]
}Returns identity, presence, and last-known activity for a single PRO robot.
status is online, offline, busy, or privacy.
Privacy is reported even though the robot publishes MQTT presence as offline.
Optional movement, sequence, call, and battery come from retained MQTT
(same topics Center uses). They are omitted when the broker has no payload.
Polling after play
MOVEMENT to home base.sequence.status is not start (complete,
abort, or absent) and movement.type is idle (or go_to with
status: complete and location = home base).START_CALL holds the sequence until the call ends. Meanwhile
call.status is start (ringing or connected). call.hostId is the
meeting host from retained telepresence extra.
Required scope: read:robot:status
| serialNumber required | string = 11 characters ^[0-9]{11}$ Example: 00123456789 11-digit hardware serial from |
{- "teminame": "Reception",
- "serialNumber": "00123456789",
- "status": "online",
- "movement": {
- "type": "go_to",
- "status": "going",
- "location": "home base"
}, - "sequence": {
- "status": "start",
- "name": "Ward round",
- "step": 2,
- "total": 4
}, - "call": {
- "status": "start",
- "hostId": "e033cb9317de7969fa0712237ce199d6"
}, - "battery": {
- "level": 87,
- "isCharging": false
}
}Returns named map locations for a PRO robot. Use these names as
extra.locationName in MOVEMENT actions.
Required scope: read:robot:locations
| serialNumber required | string = 11 characters ^[0-9]{11}$ Example: 00123456789 11-digit hardware serial from |
{- "serialNumber": "string",
- "mapId": "string",
- "mapName": "string",
- "locations": [
- {
- "name": "string"
}
]
}Returns project members of this robot who can receive a START_CALL.
Only root, admin, collaborator, and guest roles with access to this robot
are included. Org/robot contacts who are not members do not appear — add
them as a member in Center first.
name uses the organization Contacts display name when available, otherwise
the member login username.
Each temiId is unique in the list. Use it in START_CALL contactIds.
Required scope: read:robot:contact
| serialNumber required | string = 11 characters ^[0-9]{11}$ Example: 00123456789 11-digit hardware serial from |
{- "contacts": [
- {
- "temiId": "string",
- "name": "string",
- "kind": "member",
- "source": "organization"
}
]
}Validates a sequence request body without persisting or dispatching it. Use this to check action layout, required fields, and resolvable contacts before execution. This endpoint does not check whether the robot is currently online, in Privacy mode, or busy.
Required scope: action:robot:sequence
| serialNumber required | string = 11 characters ^[0-9]{11}$ 11-digit hardware serial from |
required | Array of objects (SequenceAction) non-empty Ordered actions for the robot to execute. |
| name | string Optional sequence name. |
| description | string |
| volume | number [ 1 .. 10 ] Default: 5 Playback volume from 1 (quietest) to 10 (loudest). Defaults to |
| fixedVolume | boolean If true, volume is fixed for the sequence duration. |
| startFromStep | integer >= 1 Step at which playback begins. Defaults to |
| repeatSequence | integer >= -1 Extra times to run the sequence after the first pass.
Use |
object (SequenceStopBy) Conditions that allow a user to interrupt the sequence. |
{- "serialNumber": "00123456789",
- "actions": [
- {
- "type": "MOVEMENT",
- "step": 1,
- "startStep": 1,
- "endStep": 1,
- "finalInEndStep": true,
- "delay": 0,
- "actionId": "string",
- "location": "string",
- "tts": "string",
- "language": "",
- "display": "none",
- "contactIds": [
- "string"
], - "platform": "both",
- "extra": {
- "locationName": "string",
- "speed": "veryLow",
- "onError": "abortSequence",
- "personalLead": false
}
}
], - "name": "string",
- "description": "string",
- "volume": 5,
- "fixedVolume": true,
- "startFromStep": 1,
- "repeatSequence": -1,
- "stopBy": {
- "touchScreen": true,
- "wakeup": true
}
}{- "status": "valid"
}Runs a sequence on a robot. A sequence is an ordered list of actions (navigate, speak, place a video call). The request is accepted asynchronously; the robot executes the sequence after delivery.
Recommended flow
GET /robots — select a robot by serialNumberGET /robots/{serialNumber} — confirm status is onlineGET /robots/{serialNumber}/locations — resolve location names for navigationGET /robots/{serialNumber}/contacts — resolve temiId for callsPOST /sequences/play — submit the sequence with serialNumberGET /robots/{serialNumber} until the sequence finished and the
robot is idle / at home base.Play is accepted only when the robot is online and not in Privacy mode.
Privacy, offline, and busy return 409 with robot_privacy, robot_offline,
or robot_busy. Check status before play.
Path parameters and play/validate bodies use hardware serialNumber only.
Supported action types
| Type | Purpose | Required fields |
|---|---|---|
MOVEMENT |
Navigate to a map location | location or extra.locationName |
SPEAK |
Speak text | tts or extra.tts; optional language, display (none, text, talk) |
START_CALL |
Start a video call | contactIds (unique temiIds); optional per-contact or action-level platform (both, mobile, web, same as Center); occupies a single step |
Compact requests may use step instead of startStep/endStep.
See the minimal example.
Constraints
type and either step or startStep/endStep.startStep and endStep to the same value (or use step).MOVEMENT and SPEAK may share a step. START_CALL must not share a step with MOVEMENT or SPEAK (overlap is rejected).START_CALL must start and end on the same step. finalInEndStep can be omitted; the server always sets it to true.START_CALL requires contactIds (a non-empty array of unique temiIds after trim).
Duplicates are rejected. One id is a 1:1 call; two or more is a group call.mobile (temi phone app), web (temi Center),
or both (phone and Center, default). Each contact may set its own platform;
otherwise the action-level platform applies to every invited person.repeatSequence must be an integer >= -1 (-1 = infinite repeat).startFromStep must be an integer >= 1 and not beyond the last sequence step.MOVEMENT location names from GET /robots/{serialNumber}/locations.SPEAK language: omit or use "" to use the robot's current TTS language.
See SpeakExtra.language for supported locales. If the requested locale is unavailable
on the robot, speech uses the current system TTS.409 when the robot is in Privacy mode, offline, or busy.Required scope: action:robot:sequence
| serialNumber required | string = 11 characters ^[0-9]{11}$ 11-digit hardware serial from |
required | Array of objects (SequenceAction) non-empty Ordered actions for the robot to execute. |
| name | string Optional sequence name. |
| description | string |
| volume | number [ 1 .. 10 ] Default: 5 Playback volume from 1 (quietest) to 10 (loudest). Defaults to |
| fixedVolume | boolean If true, volume is fixed for the sequence duration. |
| startFromStep | integer >= 1 Step at which playback begins. Defaults to |
| repeatSequence | integer >= -1 Extra times to run the sequence after the first pass.
Use |
object (SequenceStopBy) Conditions that allow a user to interrupt the sequence. |
{- "serialNumber": "00123456789",
- "actions": [
- {
- "type": "MOVEMENT",
- "step": 1,
- "location": "Room 12"
}, - {
- "type": "SPEAK",
- "step": 2,
- "tts": "Hello, your robot is here."
}, - {
- "type": "START_CALL",
- "step": 3,
- "contactIds": [
- "<temiId>"
]
}, - {
- "type": "MOVEMENT",
- "step": 4,
- "location": "home base"
}
]
}{- "status": "accepted",
- "sequenceId": "string",
- "serialNumber": "string"
}Stops an OpenAPI sequence that is currently running on a robot. Only the
same Organization Access Token that called POST /sequences/play may stop
that run, using the sequenceId returned from play.
The server confirms the robot is still running that sequence (retained
sequence.sequenceId from GET /robots/{serialNumber}) before dispatching
MQTT stop. This avoids halting a different sequence that started later.
Required scope: action:robot:sequence
| sequenceId required | string non-empty Run identifier returned by |
{- "sequenceId": "615b14b41a20f8423a7af06a"
}{- "status": "accepted",
- "sequenceId": "string",
- "serialNumber": "string"
}