Temi RESTful API (1.0.0)

Download OpenAPI specification:

RESTful API for controlling Temi robots in an organization.

Run In Postman

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.

Authentication

Token verification.

Verify access token

Validates the OAT and returns organization, scope, and robot access metadata.

Authorizations:
ApiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "status": "ok",
  • "organizationId": "string",
  • "tokenId": "string",
  • "scopes": [
    ],
  • "robotScope": "all",
  • "serialNumbers": [
    ]
}

Robots

Robot inventory, map locations, and callable contacts.

List robots

Returns PRO robots accessible to this token (identity fields only). BASIC robots are omitted.

Required scope: read:org:info

Authorizations:
ApiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "robots": [
    ]
}

Get robot status

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

  1. Play a sequence whose last action is MOVEMENT to home base.
  2. Poll this endpoint until sequence.status is not start (complete, abort, or absent) and movement.type is idle (or go_to with status: complete and location = home base).
  3. Then send the next room.

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

Authorizations:
ApiKeyAuth
path Parameters
serialNumber
required
string = 11 characters ^[0-9]{11}$
Example: 00123456789

11-digit hardware serial from GET /robots.

Responses

Response samples

Content type
application/json
{
  • "teminame": "Reception",
  • "serialNumber": "00123456789",
  • "status": "online",
  • "movement": {
    },
  • "sequence": {
    },
  • "call": {
    },
  • "battery": {
    }
}

List robot locations

Returns named map locations for a PRO robot. Use these names as extra.locationName in MOVEMENT actions.

Required scope: read:robot:locations

Authorizations:
ApiKeyAuth
path Parameters
serialNumber
required
string = 11 characters ^[0-9]{11}$
Example: 00123456789

11-digit hardware serial from GET /robots.

Responses

Response samples

Content type
application/json
{
  • "serialNumber": "string",
  • "mapId": "string",
  • "mapName": "string",
  • "locations": [
    ]
}

List robot members (callable contacts)

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

Authorizations:
ApiKeyAuth
path Parameters
serialNumber
required
string = 11 characters ^[0-9]{11}$
Example: 00123456789

11-digit hardware serial from GET /robots.

Responses

Response samples

Content type
application/json
{
  • "contacts": [
    ]
}

Sequences

Execute multi-step robot sequences.

Validate a sequence

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

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
serialNumber
required
string = 11 characters ^[0-9]{11}$

11-digit hardware serial from GET /robots.

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 5. Out-of-range values are coerced to the nearest bound; fractional values are rounded to the nearest integer.

fixedVolume
boolean

If true, volume is fixed for the sequence duration.

startFromStep
integer >= 1

Step at which playback begins. Defaults to 1. Must be >= 1 and not beyond the last sequence step.

repeatSequence
integer >= -1

Extra times to run the sequence after the first pass. Use -1 for infinite repeat. Defaults to 0.

object (SequenceStopBy)

Conditions that allow a user to interrupt the sequence.

Responses

Request samples

Content type
application/json
{
  • "serialNumber": "00123456789",
  • "actions": [
    ],
  • "name": "string",
  • "description": "string",
  • "volume": 5,
  • "fixedVolume": true,
  • "startFromStep": 1,
  • "repeatSequence": -1,
  • "stopBy": {
    }
}

Response samples

Content type
application/json
{
  • "status": "valid"
}

Play a sequence

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

  1. GET /robots — select a robot by serialNumber
  2. GET /robots/{serialNumber} — confirm status is online
  3. GET /robots/{serialNumber}/locations — resolve location names for navigation
  4. GET /robots/{serialNumber}/contacts — resolve temiId for calls
  5. POST /sequences/play — submit the sequence with serialNumber
  6. Poll GET /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

  • Every action must include type and either step or startStep/endStep.
  • For a single-step action, set startStep and endStep to the same value (or use step).
  • Sequences must include step 1, with a final action on every consecutive 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.
  • Call destination is the same as Center: 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.
  • Callers should take MOVEMENT location names from GET /robots/{serialNumber}/locations.
  • For 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.
  • Play is rejected with 409 when the robot is in Privacy mode, offline, or busy.

Required scope: action:robot:sequence

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
serialNumber
required
string = 11 characters ^[0-9]{11}$

11-digit hardware serial from GET /robots.

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 5. Out-of-range values are coerced to the nearest bound; fractional values are rounded to the nearest integer.

fixedVolume
boolean

If true, volume is fixed for the sequence duration.

startFromStep
integer >= 1

Step at which playback begins. Defaults to 1. Must be >= 1 and not beyond the last sequence step.

repeatSequence
integer >= -1

Extra times to run the sequence after the first pass. Use -1 for infinite repeat. Defaults to 0.

object (SequenceStopBy)

Conditions that allow a user to interrupt the sequence.

Responses

Request samples

Content type
application/json
Example
{
  • "serialNumber": "00123456789",
  • "actions": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "accepted",
  • "sequenceId": "string",
  • "serialNumber": "string"
}

Stop a running sequence

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

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
sequenceId
required
string non-empty

Run identifier returned by POST /sequences/play.

Responses

Request samples

Content type
application/json
{
  • "sequenceId": "615b14b41a20f8423a7af06a"
}

Response samples

Content type
application/json
{
  • "status": "accepted",
  • "sequenceId": "string",
  • "serialNumber": "string"
}