{"info":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","description":"<html><head></head><body><p>Postman collection for Bear Robotics Public REST API v1.3. This collection includes all unary (non-streaming) endpoints defined in the BearAPI v1.3 service.</p>\n<h3 id=\"api-version-information\">API Version Information</h3>\n<ul>\n<li><p><strong>API Version</strong>: v1.3</p>\n</li>\n<li><p><strong>Endpoints</strong>: 23 endpoints (7 endpoints from v1.0 + 11 additional endpoints in v1.1 + 2 additional endpoints in v1.2 + 3 additional endpoints in v1.3)</p>\n</li>\n</ul>\n<p>Bear Cloud API v1.3 is designed to be <strong>backward compatible</strong> with v1.2, v1.1, and v1.0. However, some endpoints require specific robot software versions (Servi 26.02, Carti 26.02, AMR 26.02 for full support).</p>\n<h3 id=\"v13-changes\">v1.3 Changes</h3>\n<p><strong>New Endpoints (3):</strong></p>\n<ul>\n<li><p><code>CreateMissionBatch</code> - Atomically create multiple missions in a single request</p>\n</li>\n<li><p><code>AppendMissionBatch</code> - Atomically append multiple missions to the end of the mission queue</p>\n</li>\n<li><p><code>ClearMissionStatus</code> - Clear the robot's mission status</p>\n</li>\n</ul>\n<p><strong>Updated Endpoints:</strong></p>\n<ul>\n<li><p><code>GetRobotStatus</code> - Added <code>navigation_state</code> field (carries the robot's stuck state)</p>\n</li>\n<li><p><code>GetMap</code> - Added <code>md5_checksum</code> field in <code>MapImageFileInfo</code> for integrity verification (CRC32C <code>checksum</code> is deprecated)</p>\n</li>\n</ul>\n<p><strong>Streaming RPCs (not included in this collection):</strong> <code>SubscribeNavigationStatus</code>, <code>SubscribeOnlineStatus</code>, and the now fleet-capable <code>SubscribeEmergencyStopStatus</code> are streaming endpoints and are documented in the API reference rather than this REST collection.</p>\n<h3 id=\"overview\">Overview</h3>\n<p>This collection provides a comprehensive set of endpoints for interacting with Bear Robotics robots via REST API v1.3. It covers:</p>\n<ul>\n<li><p><strong>Mission Commands</strong>: Create, append, update, and manage robot missions (includes v1.3 additions: CreateMissionBatch, AppendMissionBatch, ClearMissionStatus)</p>\n</li>\n<li><p><strong>Maps &amp; Locations</strong>: Retrieve maps, locations, and destination information</p>\n</li>\n<li><p><strong>Localization &amp; Navigation</strong>: Control robot positioning and navigation</p>\n</li>\n<li><p><strong>Robot Status</strong>: Monitor robot connectivity and operational states (includes v1.3 addition: navigation_state on GetRobotStatus)</p>\n</li>\n<li><p><strong>Robot System</strong>: System information and OS-level commands</p>\n</li>\n<li><p><strong>Fleet Management</strong>: Manage multiple robots and locations</p>\n</li>\n<li><p><strong>Servi-Specific Extensions</strong>: Tray calibration for Servi robots</p>\n</li>\n<li><p><strong>Carti-Specific Extensions</strong>: Conveyor control for Carti robots</p>\n</li>\n</ul>\n<h3 id=\"included-endpoints\">Included Endpoints</h3>\n<p><strong>v1.0 endpoints (7 endpoints):</strong></p>\n<ul>\n<li><p><code>/v1/mission/append</code> - AppendMission</p>\n</li>\n<li><p><code>/v1/mission/create</code> - CreateMission</p>\n</li>\n<li><p><code>/v1/mission/update</code> - UpdateMission</p>\n</li>\n<li><p><code>/v1/robot/charge</code> - ChargeRobot</p>\n</li>\n<li><p><code>/v1/current-map/get</code> - GetCurrentMap</p>\n</li>\n<li><p><code>/v1/robot/localize</code> - LocalizeRobot</p>\n</li>\n<li><p><code>/v1/robot-ids/list</code> - ListRobotIDs</p>\n</li>\n</ul>\n<p><strong>v1.1 additional endpoints (11 endpoints):</strong></p>\n<ul>\n<li><p><code>/v1/location-info/get</code> - GetLocationInfo</p>\n</li>\n<li><p><code>/v1/map/get</code> - GetMap</p>\n</li>\n<li><p><code>/v1/map/switch</code> - SwitchMap</p>\n</li>\n<li><p><code>/v1/pose/set</code> - SetPose</p>\n</li>\n<li><p><code>/v1/robot-state/get</code> - GetRobotStatus</p>\n</li>\n<li><p><code>/v0/robot-system-info/get</code> - GetRobotSystemInfo</p>\n</li>\n<li><p><code>/v1/system-command/run</code> - RunSystemCommand</p>\n</li>\n<li><p><code>/v1/available-locations/get</code> - GetAvailableLocations</p>\n</li>\n<li><p><code>/v1/trays/calibrate</code> - CalibrateTrays</p>\n</li>\n<li><p><code>/v1/conveyor-index/get</code> - GetConveyorIndex</p>\n</li>\n<li><p><code>/v1/conveyor/control</code> - ControlConveyor</p>\n</li>\n</ul>\n<p><strong>v1.2 additional endpoints (2 endpoints):</strong></p>\n<ul>\n<li><p><code>/v1/mission-workflow/create</code> - CreateMissionWorkflow</p>\n</li>\n<li><p><code>/v1/goal/skip</code> - SkipGoal</p>\n</li>\n</ul>\n<p><strong>v1.3 additional endpoints (3 endpoints):</strong></p>\n<ul>\n<li><p><code>/v1/mission/create-batch</code> - CreateMissionBatch</p>\n</li>\n<li><p><code>/v1/mission/append-batch</code> - AppendMissionBatch</p>\n</li>\n<li><p><code>/v1/mission-status/clear</code> - ClearMissionStatus</p>\n</li>\n</ul>\n<h3 id=\"important-setup\">Important Setup</h3>\n<p><strong>Required Collection Variables:</strong></p>\n<ul>\n<li><p><code>base_url</code>: API Base URL (e.g., <a href=\"https://api.bearrobotics.ai\">https://api.bearrobotics.ai</a>)</p>\n</li>\n<li><p><code>auth_url</code>: Authentication server URL (e.g., <a href=\"https://api-auth.bearrobotics.ai\">https://api-auth.bearrobotics.ai</a>)</p>\n</li>\n<li><p><code>robot_id</code>: Robot ID to use for API requests</p>\n</li>\n</ul>\n<p><strong>Authentication Variables:</strong></p>\n<ul>\n<li><strong>API Key Method</strong>: <code>api_key</code>, <code>api_secret</code>, <code>scope</code></li>\n</ul>\n<h3 id=\"getting-started\">Getting Started</h3>\n<ol>\n<li><p>Set the required Collection Variables in the Collection Variables tab</p>\n</li>\n<li><p>Call the authentication endpoint to obtain a JWT token (token is automatically saved to <code>bearer_token</code>)</p>\n</li>\n<li><p>Use the <code>bearer_token</code> in subsequent API requests</p>\n</li>\n</ol>\n<h3 id=\"documentation\">Documentation</h3>\n<p>For detailed API documentation, refer to the Bear Robotics API documentation:</p>\n<ul>\n<li>Public API Documentation: <a href=\"https://cloud.api.bearrobotics.ai/\">https://cloud.api.bearrobotics.ai/</a></li>\n</ul>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"44195110","collectionId":"8e12a638-445e-4a8d-ba11-23d9544d65ec","publishedId":"2sBXwto8ex","public":true,"customColor":{"top-bar":"D7F2FF","right-sidebar":"001D51","highlight":"15B7FF"},"publishDate":"2026-06-15T02:17:18.000Z"},"item":[{"name":"Authentication","item":[{"name":"Get JWT Token (API Key)","event":[{"listen":"prerequest","script":{"id":"260b6c4e-862d-486e-af1f-d9abfa97f90b","exec":["// Debug: Check if required variables are set","const apiKey = pm.collectionVariables.get('api_key');","const apiSecret = pm.collectionVariables.get('api_secret');","const scope = pm.collectionVariables.get('scope');","const authUrl = pm.collectionVariables.get('auth_url');","","console.log('=== Authentication Debug Info ===');","console.log('auth_url:', authUrl || 'NOT SET');","console.log('api_key:', apiKey ? apiKey.substring(0, 10) + '...' : 'NOT SET');","console.log('api_secret:', apiSecret ? '***SET***' : 'NOT SET');","console.log('scope:', scope);","","if (!apiKey || !apiSecret) {","    console.error('ERROR: api_key or api_secret is not set in Collection Variables!');","    console.error('Please set these variables in the Collection Variables tab.');","}","if (!authUrl) {","    console.error('ERROR: auth_url is not set!');","}"],"type":"text/javascript","packages":{},"requests":{}}},{"listen":"test","script":{"id":"b2cea6f0-b97c-449c-9da2-415b685a266f","exec":["// Automatically save token to collection variable","if (pm.response.code === 200) {","    const response = pm.response.json();","    if (response.token) {","        pm.collectionVariables.set('bearer_token', response.token);","        console.log('Token saved to collection variable: bearer_token');","        console.log('Token preview:', response.token.substring(0, 50) + '...');","    } else {","        // If response is plain text token","        const token = pm.response.text();","        pm.collectionVariables.set('bearer_token', token);","        console.log('Token saved to collection variable: bearer_token');","        console.log('Token preview:', token.substring(0, 50) + '...');","    }","} else {","    // Error handling","    console.error('Authentication failed with status:', pm.response.code);","    const responseText = pm.response.text();","    console.error('Response:', responseText);","    ","    if (pm.response.code === 401) {","        console.error('');","        console.error('Possible causes:');","        console.error('1. Invalid API Key or Secret');","        console.error('2. API Key/Secret not set in Collection Variables');","        console.error('3. Wrong scope (must match the scope issued with your API key)');","        console.error('4. API Key account not properly configured');","        console.error('');","        console.error('Check the following:');","        console.error('- Collection Variables > api_key');","        console.error('- Collection Variables > api_secret');","        console.error('- Collection Variables > scope (the scope issued with your API key)');","        console.error('- Collection Variables > auth_url (should be https://api-auth.bearrobotics.ai)');","    } else if (pm.response.code === 400) {","        console.error('');","        console.error('Possible causes:');","        console.error('1. Missing required fields (api_key, secret, or scope)');","        console.error('2. Malformed request body');","    } else if (pm.response.code === 429) {","        console.error('');","        console.error('Rate limit exceeded. Please wait before trying again.');","    }","}"],"type":"text/javascript","packages":{},"requests":{}}}],"id":"df42818e-e8fa-42be-8958-e478f9437f33","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"api_key\": \"\",\n  \"secret\": \"\",\n  \"scope\": \"\"\n}"},"url":"/authorizeApiAccess","description":"<p>Get JWT token using API Key and Secret.</p>\n<p>The <code>api_key</code>, <code>secret</code>, and <code>scope</code> are all issued together with your Bear Robotics credentials JSON file. Use the exact values provided to you — <code>scope</code> is a fixed value tied to your credentials and is <strong>not</strong> a literal like \"Bear\".</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"required-variables-set-in-collection-variables-tab\">Required Variables (set in Collection Variables tab)</h5>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Variable</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>api_key</code></td>\n<td><code>string</code></td>\n<td>Your API key (required)</td>\n</tr>\n<tr>\n<td><code>api_secret</code></td>\n<td><code>string</code></td>\n<td>Your API secret (required)</td>\n</tr>\n<tr>\n<td><code>scope</code></td>\n<td><code>string</code></td>\n<td>The scope issued with your API key (required)</td>\n</tr>\n<tr>\n<td><code>auth_url</code></td>\n<td><code>string</code></td>\n<td>Authentication server URL (<a href=\"https://api-auth.bearrobotics.ai\">https://api-auth.bearrobotics.ai</a>)</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"request-body\">Request Body</h5>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>api_key</code></td>\n<td><code>string</code></td>\n<td>Your API key</td>\n</tr>\n<tr>\n<td><code>secret</code></td>\n<td><code>string</code></td>\n<td>Your API secret</td>\n</tr>\n<tr>\n<td><code>scope</code></td>\n<td><code>string</code></td>\n<td>The scope issued with your API key</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"api_key\": \"your-api-key\",\n  \"secret\": \"your-api-secret\",\n  \"scope\": \"your-scope\"\n}\n\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"response-body\">Response Body</h5>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td><code>string</code></td>\n<td>JWT bearer token for API authentication</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"token\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n}\n\n</code></pre>\n<p><strong>Note</strong>: The token will be automatically saved to the <code>bearer_token</code> collection variable upon successful response.</p>\n<h3 id=\"how-api-key-authentication-works\">How API Key Authentication Works</h3>\n<ul>\n<li><p>The API key, secret, and scope are submitted to the authentication server</p>\n</li>\n<li><p>The server validates the credentials</p>\n</li>\n<li><p>A JWT token is returned upon successful authentication</p>\n</li>\n<li><p>Tokens typically expire after 1 hour. Cache and reuse the token across requests; refresh it periodically (e.g., every 30 minutes) rather than requesting a new token per API call.</p>\n</li>\n</ul>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Error Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>Missing required fields (api_key, secret, or scope), or a malformed request body.</td>\n</tr>\n<tr>\n<td>401</td>\n<td><code>UNAUTHENTICATED</code></td>\n<td>Invalid API Key or Secret. Verify credentials are correctly set in Collection Variables.</td>\n</tr>\n<tr>\n<td>401</td>\n<td><code>UNAUTHENTICATED</code></td>\n<td>Wrong scope. Ensure the scope matches the value issued with your API key.</td>\n</tr>\n<tr>\n<td>401</td>\n<td><code>UNAUTHENTICATED</code></td>\n<td>API Key account not properly configured.</td>\n</tr>\n<tr>\n<td>429</td>\n<td><code>RESOURCE_EXHAUSTED</code></td>\n<td>Rate limit exceeded for <strong>token issuance</strong> (this <code>authorizeApiAccess</code> endpoint only): 20 requests per 5 minutes per API key + IP, and 100 requests per 10 minutes per IP. Cache and reuse the JWT instead of requesting a new token on every call.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"troubleshooting\">Troubleshooting</h3>\n<p><strong>For 401 errors:</strong></p>\n<ol>\n<li><p>Verify <code>api_key</code> and <code>api_secret</code> are correctly set in Collection Variables</p>\n</li>\n<li><p>Ensure the <code>scope</code> matches the value issued with your API key (it is a fixed credential value, not a literal like \"Bear\")</p>\n</li>\n<li><p>Confirm your API key and secret are correct</p>\n</li>\n<li><p>Verify the auth_url is correct (<a href=\"https://api-auth.bearrobotics.ai\">https://api-auth.bearrobotics.ai</a>)</p>\n</li>\n<li><p>Check the Postman Console (View &gt; Show Postman Console) for detailed error messages</p>\n</li>\n</ol>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["authorizeApiAccess"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"df42818e-e8fa-42be-8958-e478f9437f33"}],"id":"2c8b9b98-e0e2-4c21-885f-2efaa93add7c","description":"<p>Authentication endpoints for obtaining JWT tokens.</p>\n<h3 id=\"authentication-method\">Authentication Method</h3>\n<p><strong>API Key/Secret</strong>: Use <code>api_key</code> and <code>secret</code> to obtain JWT tokens for Bear Robotics Public REST API.</p>\n<h3 id=\"important-notes\">Important Notes</h3>\n<ul>\n<li>Set the required variables (<code>api_key</code>, <code>api_secret</code>, <code>scope</code>, <code>auth_url</code>) in the Collection Variables tab before using the authentication endpoint</li>\n<li>The token will be automatically saved to <code>bearer_token</code> variable after successful authentication</li>\n<li>Tokens typically expire after 1 hour</li>\n</ul>\n<h3 id=\"how-api-key-authentication-works\">How API Key Authentication Works</h3>\n<p>The API key, secret, and scope are submitted to the authentication server. The server validates the credentials. A JWT token is returned upon successful authentication.</p>\n","_postman_id":"2c8b9b98-e0e2-4c21-885f-2efaa93add7c","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}}},{"name":"Mission","item":[{"name":"AppendMission","id":"08bf2176-2386-457f-8394-d682e9787840","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer ","description":"<p>Bearer token for authentication</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\",\n  \"mission\": {\n    \"baseMission\": {\n      \"navigateMission\": {\n        \"goal\": {\n          \"destinationId\": \"dest-123\"\n        }\n      }\n    }\n  }\n}"},"url":"/v1/mission/append","description":"<p>Appends a mission to the end of the mission queue.</p>\n<p>Use this when a mission is currently running; otherwise, prefer CreateMission. Missions are executed in the order they are appended.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot that will receive this command.</p>\n<h5 id=\"mission-mission-required\">mission <code>Mission</code> <code>required</code></h5>\n<p>Universal wrapper for mission types. Only one mission type may be set at a time.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field (<em>oneof</em>)</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>base_mission</code></td>\n<td><code>BaseMission</code></td>\n<td>Base missions are applicable to all robot families</td>\n</tr>\n<tr>\n<td><code>servi_mission</code></td>\n<td><code>servi.Mission</code></td>\n<td>Servi missions are specific to the Servi robot family</td>\n</tr>\n<tr>\n<td><code>carti_mission</code></td>\n<td><code>carti.Mission</code></td>\n<td>Carti missions are specific to the Carti robot family</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\",\n  \"mission\": {\n    \"baseMission\": {\n      \"navigateMission\": {\n        \"goal\": {\n          \"destinationId\": \"dest-123\"\n        }\n      }\n    }\n  }\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"mission_id-string\">mission_id <code>string</code></h5>\n<p>The ID of the mission created.</p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"missionId\": \"cbd47ab1-df21-479e-9f72-677b81ab55b0\"\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>FAILED_PRECONDITION</code></td>\n<td>There is no mission in the mission queue. Client should first create the initial mission, and only use Append for queuing additional missions.</td>\n</tr>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>The client supplied a request with invalid format. This covers sending empty requests, invalid goals, goals that do not match mission type, and other format errors. Client should update their usage to have correctly formatted requests with valid goals for the missions as defined in documentation.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>The request failed to execute due to internal error in mission system. Client should retry appending the mission.</td>\n</tr>\n<tr>\n<td><code>DEADLINE_EXCEEDED</code></td>\n<td>The request was sent internally, but timed out waiting for confirmation response of request being accepted. Client should retry appending the mission.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","mission","append"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"08bf2176-2386-457f-8394-d682e9787840"},{"name":"AppendMissionBatch","id":"060e4459-b54a-4265-915c-126383721696","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer ","description":"<p>Bearer token for authentication</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\",\n  \"missions\": [\n    {\n      \"baseMission\": {\n        \"navigateMission\": {\n          \"goal\": {\n            \"destinationId\": \"table-1\"\n          }\n        }\n      }\n    },\n    {\n      \"baseMission\": {\n        \"navigateMission\": {\n          \"goal\": {\n            \"destinationId\": \"table-2\"\n          }\n        }\n      }\n    }\n  ]\n}"},"url":"/v1/mission/append-batch","description":"<p>Atomically appends multiple missions to the end of the mission queue.</p>\n<p>All missions are appended contiguously in the request order. Missions can be appended even when other missions are already queued.</p>\n<p><strong>Note</strong>: This call is <strong>atomic</strong> — if any mission in the batch fails validation or append, <strong>no</strong> missions are appended.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot that will receive this command.</p>\n<h5 id=\"missions-repeated-mission-required\">missions <code>repeated Mission</code> <code>required</code></h5>\n<p>The list of missions to append, in execution order. Each entry is the same <code>Mission</code> wrapper used by CreateMission. Only one mission type may be set per entry.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field (<em>oneof</em>)</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>base_mission</code></td>\n<td><code>BaseMission</code></td>\n<td>Base missions are applicable to all robot families</td>\n</tr>\n<tr>\n<td><code>servi_mission</code></td>\n<td><code>servi.Mission</code></td>\n<td>Servi missions are specific to the Servi robot family</td>\n</tr>\n<tr>\n<td><code>carti_mission</code></td>\n<td><code>carti.Mission</code></td>\n<td>Carti missions are specific to the Carti robot family</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\",\n  \"missions\": [\n    {\n      \"baseMission\": {\n        \"navigateMission\": {\n          \"goal\": {\n            \"destinationId\": \"table-1\"\n          }\n        }\n      }\n    },\n    {\n      \"baseMission\": {\n        \"navigateMission\": {\n          \"goal\": {\n            \"destinationId\": \"table-2\"\n          }\n        }\n      }\n    }\n  ]\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"mission_ids-repeated-string\">mission_ids <code>repeated string</code></h5>\n<p>The IDs of the missions appended, in the same order as the request.</p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"missionIds\": [\n    \"f842c8ac-62de-412e-90fb-bf37022db2f4\",\n    \"a1b2c3d4-5e6f-7890-abcd-ef1234567890\"\n  ]\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>FAILED_PRECONDITION</code></td>\n<td>There is no mission in the mission queue. Client should first create the initial mission, and only use Append (or AppendBatch) for queuing additional missions.</td>\n</tr>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>The client supplied a request with invalid format. This covers empty requests, an empty <code>missions</code> list, invalid goals, goals that do not match mission type, and other format errors. Since the call is atomic, a single invalid mission causes the entire batch to be rejected.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>The request failed to execute due to internal error in mission system. Client should retry appending the batch.</td>\n</tr>\n<tr>\n<td><code>DEADLINE_EXCEEDED</code></td>\n<td>The request was accepted but timed out waiting for the robot to confirm. Client should retry appending the batch.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","mission","append-batch"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"060e4459-b54a-4265-915c-126383721696"},{"name":"ChargeRobot","id":"69a1cf96-92d3-4e22-a60b-6808e7cfcb86","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer "}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\"\n}"},"url":"/v1/robot/charge","description":"<p>Create a mission to go charge a robot regardless of battery state.</p>\n<p><code>ChargeRobot</code> is a special type of mission. Use this command to instruct the robot to begin charging, regardless of its current battery level. This command is only supported on robots equipped with a contact-based charging dock.</p>\n<p>You can use SubscribeBatteryStatus to monitor the charging process.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot that will receive this command.</p>\n<h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\"\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"mission_id-string\">mission_id <code>string</code></h5>\n<p>The ID of the mission created. Since this command is a special type of mission, its execution state is also available in response messages from SubscribeMissionStatus.</p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"missionId\": \"mission-xyz-001\"\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>FAILED_PRECONDITION</code></td>\n<td>The robot is already executing a mission. The current mission must be canceled before issuing this command.</td>\n</tr>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>Robots without a compatible dock will return an INVALID_ARGUMENT error.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>The request failed to execute due to internal error in mission system. Client should retry creating the mission.</td>\n</tr>\n<tr>\n<td><code>DEADLINE_EXCEEDED</code></td>\n<td>The request was sent internally, but timed out waiting for confirmation response of request being accepted. Client should retry creating the mission.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","robot","charge"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"69a1cf96-92d3-4e22-a60b-6808e7cfcb86"},{"name":"CreateMission","id":"b2c9cd26-2dbe-42aa-8e54-531aa745096e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer "}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\",\n  \"mission\": {\n    \"baseMission\": {\n      \"navigateMission\": {\n        \"goal\": {\n          \"destinationId\": \"dest-123\"\n        }\n      }\n    }\n  }\n}"},"url":"/v1/mission/create","description":"<p>Send a robot on a mission of specified type.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot that will receive this command.</p>\n<h5 id=\"mission-mission-required\">mission <code>Mission</code> <code>required</code></h5>\n<p>Universal wrapper for mission types. Only one mission type may be set at a time.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field (<em>oneof</em>)</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>base_mission</code></td>\n<td><code>BaseMission</code></td>\n<td>Base missions are applicable to all robot families</td>\n</tr>\n<tr>\n<td><code>servi_mission</code></td>\n<td><code>servi.Mission</code></td>\n<td>Servi missions are specific to the Servi robot family</td>\n</tr>\n<tr>\n<td><code>carti_mission</code></td>\n<td><code>carti.Mission</code></td>\n<td>Carti missions are specific to the Carti robot family</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\",\n  \"mission\": {\n    \"baseMission\": {\n      \"navigateMission\": {\n        \"goal\": {\n          \"destinationId\": \"dest-123\"\n        }\n      }\n    }\n  }\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"mission_id-string\">mission_id <code>string</code></h5>\n<p>The ID of the mission created.</p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"missionId\": \"cbd47ab1-df21-479e-9f72-677b81ab55b0\"\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>FAILED_PRECONDITION</code></td>\n<td>The robot is already executing another mission. <code>CreateMission</code> is only valid if there is no running mission on the target robot, with its state in one of the terminal states (Cancelled, Succeeded, Failed, Default).</td>\n</tr>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>The client supplied a request with invalid format. This covers sending empty requests, invalid goals, goals that do not match mission type, and other format errors. Client should update their usage to have correctly formatted requests with valid goals for the missions as defined in documentation.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>The request failed to execute due to internal error in mission system. Client should retry creating the mission.</td>\n</tr>\n<tr>\n<td><code>DEADLINE_EXCEEDED</code></td>\n<td>The request was sent internally, but timed out waiting for confirmation response of request being accepted. Client should retry creating the mission.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","mission","create"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"b2c9cd26-2dbe-42aa-8e54-531aa745096e"},{"name":"CreateMissionBatch","id":"a00fbd54-6a47-4fb1-99da-83290597f817","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer ","description":"<p>Bearer token for authentication</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\",\n  \"missions\": [\n    {\n      \"baseMission\": {\n        \"navigateMission\": {\n          \"goal\": {\n            \"destinationId\": \"pickup_zone\"\n          }\n        }\n      }\n    },\n    {\n      \"baseMission\": {\n        \"navigateMission\": {\n          \"goal\": {\n            \"destinationId\": \"drop_zone\"\n          }\n        }\n      }\n    }\n  ]\n}"},"url":"/v1/mission/create-batch","description":"<p>Atomically creates multiple missions in a single request.</p>\n<p>The created missions are queued contiguously in the order they appear in the request, and the returned mission IDs match that order.</p>\n<p><strong>Note</strong>: This call is <strong>atomic</strong> — if any mission in the batch fails validation or creation, <strong>no</strong> missions are created.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot that will receive this command.</p>\n<h5 id=\"missions-repeated-mission-required\">missions <code>repeated Mission</code> <code>required</code></h5>\n<p>The list of missions to create, in execution order. Each entry is the same <code>Mission</code> wrapper used by CreateMission. Only one mission type may be set per entry.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field (<em>oneof</em>)</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>base_mission</code></td>\n<td><code>BaseMission</code></td>\n<td>Base missions are applicable to all robot families</td>\n</tr>\n<tr>\n<td><code>servi_mission</code></td>\n<td><code>servi.Mission</code></td>\n<td>Servi missions are specific to the Servi robot family</td>\n</tr>\n<tr>\n<td><code>carti_mission</code></td>\n<td><code>carti.Mission</code></td>\n<td>Carti missions are specific to the Carti robot family</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\",\n  \"missions\": [\n    {\n      \"baseMission\": {\n        \"navigateMission\": {\n          \"goal\": {\n            \"destinationId\": \"pickup_zone\"\n          }\n        }\n      }\n    },\n    {\n      \"baseMission\": {\n        \"navigateMission\": {\n          \"goal\": {\n            \"destinationId\": \"drop_zone\"\n          }\n        }\n      }\n    }\n  ]\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"mission_ids-repeated-string\">mission_ids <code>repeated string</code></h5>\n<p>The IDs of the missions created, in the same order as the request.</p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"missionIds\": [\n    \"cbd47ab1-df21-479e-9f72-677b81ab55b0\",\n    \"d6637a14-5f6b-43f6-bd86-cc1871a8322e\"\n  ]\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>FAILED_PRECONDITION</code></td>\n<td>Another mission is running or queued, or the robot is unable to start a mission. <code>CreateMissionBatch</code> is only valid if there is no running or queued mission on the target robot.</td>\n</tr>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>The client supplied a request with invalid format. This covers empty requests, an empty <code>missions</code> list, invalid goals, goals that do not match mission type, and other format errors. Since the call is atomic, a single invalid mission causes the entire batch to be rejected.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>The request failed to execute due to internal error in mission system. Client should retry creating the batch.</td>\n</tr>\n<tr>\n<td><code>DEADLINE_EXCEEDED</code></td>\n<td>The request was accepted but timed out waiting for the robot to confirm. Client should retry creating the batch.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","mission","create-batch"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"a00fbd54-6a47-4fb1-99da-83290597f817"},{"name":"UpdateMission","id":"fe785727-ee43-44bf-8f07-9258b6de3641","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer "}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\",\n  \"missionCommand\": {\n    \"missionId\": \"f842c8ac-62de-412e-90fb-bf37022db2f4\",\n    \"command\": \"COMMAND_CANCEL\"\n  }\n}"},"url":"/v1/mission/update","description":"<p>Issues a command to control or update the current mission (e.g., pause, cancel).</p>\n<p>We currently do not support updating missions in mission queue. Attempting to send UpdateMission command to a queued mission will result in <code>NOT_FOUND</code> error.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot that will receive this command.</p>\n<h5 id=\"mission_command-missioncommand-required\">mission_command <code>MissionCommand</code> <code>required</code></h5>\n<p>Command to update the state of an active mission.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>mission_id</code></td>\n<td><code>string</code> <code>required</code></td>\n<td>The ID of the mission to control.</td>\n</tr>\n<tr>\n<td><code>command</code></td>\n<td><code>Command</code> <em>enum</em> <code>required</code></td>\n<td>Command to update the state of an active mission.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"command-enum\">Command <code>enum</code></h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Number</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>COMMAND_UNKNOWN</td>\n<td>0</td>\n<td>Default value. This should never be used explicitly. It means the <code>command</code> field is not set</td>\n</tr>\n<tr>\n<td>COMMAND_CANCEL</td>\n<td>1</td>\n<td>Cancel this mission.</td>\n</tr>\n<tr>\n<td>COMMAND_PAUSE</td>\n<td>2</td>\n<td>Pause this mission.</td>\n</tr>\n<tr>\n<td>COMMAND_RESUME</td>\n<td>3</td>\n<td>Resume a paused mission.</td>\n</tr>\n<tr>\n<td>COMMAND_FINISH</td>\n<td>4</td>\n<td>Mark the mission as completed.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\",\n  \"missionCommand\": {\n    \"missionId\": \"f842c8ac-62de-412e-90fb-bf37022db2f4\",\n    \"command\": \"COMMAND_PAUSE\"\n  }\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<p><em>(No fields defined)</em></p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>FAILED_PRECONDITION</code></td>\n<td>The robot is either not on a mission, or the command is invalid for the robot's current state. For example, mission in terminal state (Cancelled, Succeeded, Failed) can't be updated.</td>\n</tr>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>The client supplied a request with invalid format. This covers sending empty requests, invalid commands, incorrect mission ID, and other format errors. Client should update their usage to have correctly formatted requests with valid commands, and ensure the mission id matches the currently running mission.</td>\n</tr>\n<tr>\n<td><code>NOT_FOUND</code></td>\n<td>Attempting to send UpdateMission command to a queued mission will result in NOT_FOUND error.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>The request failed to execute due to internal error in mission system. Client should retry.</td>\n</tr>\n<tr>\n<td><code>DEADLINE_EXCEEDED</code></td>\n<td>The request was sent internally, but timed out waiting for confirmation response of request being accepted. Client should retry.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","mission","update"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"fe785727-ee43-44bf-8f07-9258b6de3641"},{"name":"CreateMissionWorkflow","id":"594708e5-b330-4603-b0a3-372d51cb2e07","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer ","description":"<p>Bearer token for authentication</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\",\n  \"missionWorkflow\": {\n    \"serviWorkflow\": {\n      \"delivery\": {\n        \"goals\": [\n          {\n            \"destinationId\": \"table-1\"\n          },\n          {\n            \"destinationId\": \"table-2\"\n          }\n        ]\n      }\n    }\n  }\n}"},"url":"/v1/mission-workflow/create","description":"<p>Creates a new mission workflow that mirrors touchscreen presets, including automatic return point selection.</p>\n<p>This call will fail if:</p>\n<ul>\n<li>The robot is already executing another mission. Returns a FAILED_PRECONDITION error.</li>\n<li>The requested workflow is not compatible with the robot's type or current state. Returns an INVALID_ARGUMENT error.</li>\n</ul>\n<p>Returns the list of mission_ids for the created missions if successful.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot that will receive this command.</p>\n<h5 id=\"mission_workflow-missionworkflow-required\">mission_workflow <code>MissionWorkflow</code> <code>required</code></h5>\n<p>Workflows mirror touchscreen behavior and presets (including automatic return selection).</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field (<em>oneof</em>)</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>servi_workflow</code></td>\n<td><code>servi.MissionWorkflow</code></td>\n<td>Servi workflows are specific to the Servi robot family.</td>\n</tr>\n<tr>\n<td><code>carti_workflow</code></td>\n<td><code>carti.MissionWorkflow</code></td>\n<td>Carti workflows are specific to the Carti robot family.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"servi-workflow-types\">Servi Workflow Types</h5>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field (<em>oneof</em>)</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>delivery</code></td>\n<td><code>DeliveryWorkflow</code></td>\n<td>Workflow for delivery missions (Serving, Table option)</td>\n</tr>\n<tr>\n<td><code>delivery_patrol</code></td>\n<td><code>DeliveryPatrolWorkflow</code></td>\n<td>Workflow for delivery patrol missions (Serving, Patrol option)</td>\n</tr>\n<tr>\n<td><code>bussing</code></td>\n<td><code>BussingWorkflow</code></td>\n<td>Workflow for bussing missions (Bussing, Table option)</td>\n</tr>\n<tr>\n<td><code>bussing_patrol</code></td>\n<td><code>BussingPatrolWorkflow</code></td>\n<td>Workflow for bussing patrol missions (Bussing, Patrol option)</td>\n</tr>\n<tr>\n<td><code>birthday</code></td>\n<td><code>BirthdayWorkflow</code></td>\n<td>Workflow for Birthday Mission (Birthday Mode)</td>\n</tr>\n<tr>\n<td><code>hosting</code></td>\n<td><code>HostingWorkflow</code></td>\n<td>Workflow for hosting missions (Hosting, Restaurant option)</td>\n</tr>\n<tr>\n<td><code>hosting_patrol</code></td>\n<td><code>HostingPatrolWorkflow</code></td>\n<td>Workflow for hosting patrol missions (Hosting, Patrol option)</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"carti-workflow-types\">Carti Workflow Types</h5>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field (<em>oneof</em>)</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>traverse</code></td>\n<td><code>TraverseWorkflow</code></td>\n<td>Workflow for traverse missions (Table option)</td>\n</tr>\n<tr>\n<td><code>traverse_patrol</code></td>\n<td><code>TraversePatrolWorkflow</code></td>\n<td>Workflow for traverse patrol missions (Patrol option)</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-request-example-servi-delivery-workflow\">JSON Request Example (Servi Delivery Workflow)</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\",\n  \"missionWorkflow\": {\n    \"serviWorkflow\": {\n      \"delivery\": {\n        \"goals\": [\n          {\n            \"destinationId\": \"table-1\"\n          },\n          {\n            \"destinationId\": \"table-2\"\n          }\n        ]\n      }\n    }\n  }\n}\n</code></pre>\n<h5 id=\"json-request-example-carti-traverse-workflow\">JSON Request Example (Carti Traverse Workflow)</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"carti-001\",\n  \"missionWorkflow\": {\n    \"cartiWorkflow\": {\n      \"traverse\": {\n        \"goals\": [\n          {\n            \"destinationId\": \"room-a\"\n          },\n          {\n            \"pose\": {\n              \"xMeters\": 5.2,\n              \"yMeters\": 3.1,\n              \"headingRadians\": 1.57\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"mission_ids-repeated-string\">mission_ids <code>repeated string</code></h5>\n<p>List of mission IDs for the created missions.</p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"missionIds\": [\n    \"mission-001\",\n    \"mission-002\"\n  ]\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>FAILED_PRECONDITION</code></td>\n<td>The robot is already executing another mission.</td>\n</tr>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>The requested workflow is not compatible with the robot's type or current state.</td>\n</tr>\n<tr>\n<td><code>PERMISSION_DENIED</code></td>\n<td>Attempting to create a workflow for a <code>robot_id</code> you don't own. Tips: check the spelling of the <code>robot_id</code> value.</td>\n</tr>\n<tr>\n<td><code>NOT_FOUND</code></td>\n<td>The specified robot ID does not exist or is not accessible.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>Internal server error occurred while processing the request.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","mission-workflow","create"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"594708e5-b330-4603-b0a3-372d51cb2e07"},{"name":"SkipGoal","id":"f54d3365-a45c-4a45-88fa-506fe9cbc357","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer ","description":"<p>Bearer token for authentication</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\"\n}"},"url":"/v1/goal/skip","description":"<p>Moves to the next destination in the current mission.</p>\n<p>This call will fail if:</p>\n<ul>\n<li>The robot is not on a mission. Returns a FAILED_PRECONDITION error.</li>\n<li>The request could not be delivered to the robot or the operation failed. Returns an INTERNAL error.</li>\n</ul>\n<p>Returns the mission_id of the current mission where the goal was skipped.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot that will skip the current goal.</p>\n<h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\"\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"mission_id-string\">mission_id <code>string</code></h5>\n<p>The unique identifier of the mission where the goal was skipped.</p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"missionId\": \"mission-xyz-001\"\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>FAILED_PRECONDITION</code></td>\n<td>The robot is not on a mission.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>The request could not be delivered to the robot or the operation failed.</td>\n</tr>\n<tr>\n<td><code>PERMISSION_DENIED</code></td>\n<td>Attempting to skip goal for a <code>robot_id</code> you don't own. Tips: check the spelling of the <code>robot_id</code> value.</td>\n</tr>\n<tr>\n<td><code>NOT_FOUND</code></td>\n<td>The specified robot ID does not exist or is not accessible.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","goal","skip"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"f54d3365-a45c-4a45-88fa-506fe9cbc357"},{"name":"ClearMissionStatus","id":"b5c32f51-acc9-4c07-8133-80966b725e9a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer ","description":"<p>Bearer token for authentication</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\"\n}"},"url":"/v1/mission-status/clear","description":"<p>Clears the robot's mission status, removing the missions reported by SubscribeMissionStatus.</p>\n<p>Use this to reset the mission queue once all missions have reached a terminal state.</p>\n<p><strong>Warning</strong>: This call will fail if the robot is on a <strong>running</strong> or <strong>paused</strong> mission. Cancel or finish the active mission before clearing.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot whose mission status will be cleared.</p>\n<h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\"\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"mission_ids-repeated-string\">mission_ids <code>repeated string</code></h5>\n<p>The unique identifiers of the cleared missions.</p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"missionIds\": [\n    \"f842c8ac-62de-412e-90fb-bf37022db2f4\",\n    \"d6637a14-5f6b-43f6-bd86-cc1871a8322e\"\n  ]\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>FAILED_PRECONDITION</code></td>\n<td>The robot is on a running or paused mission. The mission must reach a terminal state (Cancelled, Succeeded, Failed) before its status can be cleared.</td>\n</tr>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>The client supplied a request with invalid format. This covers empty <code>robot_id</code> and other format errors.</td>\n</tr>\n<tr>\n<td><code>PERMISSION_DENIED</code></td>\n<td>Attempting to clear mission status for a <code>robot_id</code> you don't own.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>The request failed to execute due to internal error in mission system. Client should retry.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","mission-status","clear"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"b5c32f51-acc9-4c07-8133-80966b725e9a"}],"id":"049407f3-9e6f-4f93-bf66-4db070a651e7","description":"<p>Basic mission-related operations (includes v1.3 additions: CreateMissionBatch, AppendMissionBatch, ClearMissionStatus)</p>\n","_postman_id":"049407f3-9e6f-4f93-bf66-4db070a651e7","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}}},{"name":"Locations & Map","item":[{"name":"GetCurrentMap","id":"5b85d832-9b00-43c6-8c0e-82633e7b55f6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer "}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\"\n}"},"url":"/v1/current-map/get","description":"<p>Retrieves the current map used by the robot.</p>\n<p>The returned map includes annotations and destinations, which can be used in mission destination, localization goals, and navigation.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The robot ID used to request the map currently loaded on the robot.</p>\n<h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\"\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"map-map\">map <code>Map</code></h5>\n<p>Map represents a navigable map used by robots, including metadata and associated annotations.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>map_id</code></td>\n<td><code>string</code></td>\n<td>Unique identifier for the map. e.g., \"9578\"</td>\n</tr>\n<tr>\n<td><code>created_time</code></td>\n<td><code>Timestamp</code></td>\n<td>Indicating when the map was created.</td>\n</tr>\n<tr>\n<td><code>modified_time</code></td>\n<td><code>Timestamp</code></td>\n<td>Indicating the last time the map was modified.</td>\n</tr>\n<tr>\n<td><code>display_name</code></td>\n<td><code>string</code></td>\n<td>Display name of the map, matching the name used in Bear Universe. e.g., \"ITCT SEOUL\"</td>\n</tr>\n<tr>\n<td><code>annotation</code></td>\n<td><code>Annotation</code></td>\n<td>Annotation associated with this map, defining specific areas and destinations.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"map\": {\n    \"mapId\": \"map-01\",\n    \"createdTime\": \"2025-03-28T12:00:00Z\",\n    \"modifiedTime\": \"2025-04-01T09:45:00Z\",\n    \"displayName\": \"Main Floor Map\",\n    \"annotation\": {\n      \"annotationId\": \"annot-123\",\n      \"displayName\": \"Service Area Zones\",\n      \"createdTime\": \"2025-03-30T10:15:00Z\",\n      \"destinations\": {\n        \"Loading Dock 1\": {\n          \"destinationId\": \"Loading Dock 1\",\n          \"displayName\": \"Loading Dock 1\"\n        }\n      }\n    }\n  }\n}\n</code></pre>\n<p><strong>Note</strong>: This API communicates directly with the robot. image_url may be empty, as the robot does not serve rendered images.</p>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>NOT_FOUND</code></td>\n<td>The annotation (of the requested map) does not exist.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>Communication failure with the robot.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","current-map","get"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"5b85d832-9b00-43c6-8c0e-82633e7b55f6"},{"name":"GetLocationInfo","id":"887fa163-a83e-49a2-acbb-3519a02a4b75","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer ","description":"<p>Bearer token for authentication</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"locationId\": \"\"\n}"},"url":"/v1/location-info/get","description":"<p>Retrieves information about a specific location by its ID.</p>\n<p>The location includes metadata such as floors, sections, and their associated maps.</p>\n<p><strong>Note</strong>: This does not require robot connectivity.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"location_id-string-required\">location_id <code>string</code> <code>required</code></h5>\n<p>The location_id is a 4 character alphanumeric identifier for the location. e.g., \"3R0A\"</p>\n<h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"locationId\": \"3R0A\"\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"location-location\">location <code>Location</code></h5>\n<p>Location represents a physical space where robots operate, containing floors, sections, and maps.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>location_id</code></td>\n<td><code>string</code></td>\n<td>A 4 character alphanumeric identifier for the location. e.g., \"3R0A\"</td>\n</tr>\n<tr>\n<td><code>created_time</code></td>\n<td><code>Timestamp</code></td>\n<td>Timestamp indicating when the location was created.</td>\n</tr>\n<tr>\n<td><code>modified_time</code></td>\n<td><code>Timestamp</code></td>\n<td>Timestamp indicating the last time the location was modified.</td>\n</tr>\n<tr>\n<td><code>display_name</code></td>\n<td><code>string</code></td>\n<td>Display name of the location, matching the name shown in Universe. e.g., \"City Deli &amp; Grill\", \"KNTH\"</td>\n</tr>\n<tr>\n<td><code>floors</code></td>\n<td>map&lt;<code>int32</code>, <code>Floor</code>&gt;</td>\n<td>Map of floors in the location, keyed by their floor level. The floor level is any non-negative integer starting from 0.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"location\": {\n    \"locationId\": \"3R0A\",\n    \"createdTime\": \"2025-03-28T12:00:00Z\",\n    \"modifiedTime\": \"2025-04-01T09:45:00Z\",\n    \"displayName\": \"Main Office Building\",\n    \"floors\": {\n      \"0\": {\n        \"displayName\": \"Ground Floor\",\n        \"sections\": [\n          {\n            \"displayName\": \"Lobby Area\",\n            \"currentMapId\": \"map-lobby-001\"\n          }\n        ]\n      }\n    }\n  }\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>NOT_FOUND</code></td>\n<td>The location with the specified ID does not exist.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>Internal server error occurred while processing the request.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","location-info","get"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"887fa163-a83e-49a2-acbb-3519a02a4b75"},{"name":"GetMap","id":"57e8178b-f32b-46e2-bf17-fd975fb856af","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer ","description":"<p>Bearer token for authentication</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"mapId\": \"\"\n}"},"url":"/v1/map/get","description":"<p>Retrieves a saved map by map_id from the cloud.</p>\n<p>Use this to fetch a stored map from the cloud database.</p>\n<p><strong>Note</strong>: This does not require robot connectivity.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"map_id-string-required\">map_id <code>string</code> <code>required</code></h5>\n<p>The unique identifier of the map to retrieve.</p>\n<h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"mapId\": \"map-001\"\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"map-map\">map <code>Map</code></h5>\n<p>Map represents a navigable map used by robots, including metadata and associated annotations.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>map_id</code></td>\n<td><code>string</code></td>\n<td>Unique identifier for the map. e.g., \"9578\"</td>\n</tr>\n<tr>\n<td><code>created_time</code></td>\n<td><code>Timestamp</code></td>\n<td>Indicating when the map was created.</td>\n</tr>\n<tr>\n<td><code>modified_time</code></td>\n<td><code>Timestamp</code></td>\n<td>Indicating the last time the map was modified.</td>\n</tr>\n<tr>\n<td><code>display_name</code></td>\n<td><code>string</code></td>\n<td>Display name of the map, matching the name used in Bear Universe. e.g., \"ITCT SEOUL\"</td>\n</tr>\n<tr>\n<td><code>annotation</code></td>\n<td><code>Annotation</code></td>\n<td>Annotation associated with this map, defining specific areas and destinations.</td>\n</tr>\n<tr>\n<td><code>image_download_info</code></td>\n<td><code>MapImageDownloadInfo</code></td>\n<td>Information for downloading the map image, including signed URL and file metadata. This field is typically populated by the cloud service.</td>\n</tr>\n<tr>\n<td><code>origin</code></td>\n<td><code>Origin</code></td>\n<td>Origin of the map relative to the map frame.</td>\n</tr>\n<tr>\n<td><code>resolution</code></td>\n<td><code>float</code></td>\n<td>Resolution of the map in meters per pixel.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"mapimagefileinfo\">MapImageFileInfo</h5>\n<p>Contains metadata about the map image file for integrity verification (nested under <code>image_download_info.file_info</code>).</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>checksum</code></td>\n<td><code>uint32</code></td>\n<td><strong>[Deprecated]</strong> CRC32C checksum of the map image file. Use <code>md5_checksum</code> instead.</td>\n</tr>\n<tr>\n<td><code>size</code></td>\n<td><code>int64</code></td>\n<td>Size of the map image file in bytes.</td>\n</tr>\n<tr>\n<td><code>md5_checksum</code></td>\n<td><code>string</code></td>\n<td><strong>(v1.3)</strong> MD5 checksum represented as a 32-character lowercase hexadecimal string. Use this to verify the integrity of the downloaded map image.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"map\": {\n    \"mapId\": \"map-001\",\n    \"createdTime\": \"2025-03-28T12:00:00Z\",\n    \"modifiedTime\": \"2025-04-01T09:45:00Z\",\n    \"displayName\": \"Office Floor Plan\",\n    \"annotation\": {\n      \"annotationId\": \"annot-001\",\n      \"displayName\": \"Office Zones\",\n      \"destinations\": {}\n    },\n    \"imageDownloadInfo\": {\n      \"fileInfo\": {\n        \"checksum\": 1234567890,\n        \"size\": 2048576,\n        \"md5Checksum\": \"9e107d9d372bb6826bd81d3542a419d6\"\n      },\n      \"downloadUrl\": {\n        \"url\": \"https://storage.googleapis.com/maps/map-001.png?signature=...\",\n        \"expiresAt\": \"2025-04-01T12:00:00Z\"\n      }\n    },\n    \"origin\": {\n      \"xM\": 0.0,\n      \"yM\": 0.0,\n      \"yawRadians\": 0.0\n    },\n    \"resolution\": 0.05\n  }\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>NOT_FOUND</code></td>\n<td>The map with the specified ID does not exist.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>Internal server error occurred while processing the request.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","map","get"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"57e8178b-f32b-46e2-bf17-fd975fb856af"},{"name":"SwitchMap","id":"e572da50-c57e-44b2-a172-de507260a071","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer ","description":"<p>Bearer token for authentication</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\",\n  \"mapSelector\": {\n    \"floorLevel\": 1,\n    \"sectionIndex\": 0\n  }\n}"},"url":"/v1/map/switch","description":"<p>Switch the robot's current map to a specified map.</p>\n<p>The request must specify the floor level and section index of the desired map.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot that will switch maps.</p>\n<h5 id=\"map_selector-mapselector-required\">map_selector <code>MapSelector</code> <code>required</code></h5>\n<p>Specifies which map to switch to.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>floor_level</code></td>\n<td><code>int32</code></td>\n<td>Positive integer floor level begins at 1.</td>\n</tr>\n<tr>\n<td><code>section_index</code></td>\n<td><code>int32</code></td>\n<td>Non-negative integer section index begins at 0.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\",\n  \"mapSelector\": {\n    \"floorLevel\": 1,\n    \"sectionIndex\": 0\n  }\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"map_id-string\">map_id <code>string</code></h5>\n<p>The ID of the new map that the robot is now using.</p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"mapId\": \"map-lobby-001\"\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>No matching map found for the specified floor level and section index.</td>\n</tr>\n<tr>\n<td><code>NOT_FOUND</code></td>\n<td>The robot with the specified ID does not exist.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","map","switch"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"e572da50-c57e-44b2-a172-de507260a071"}],"id":"ddf05ea2-4af6-4c42-bbad-056272ab91e0","description":"<p>Operations for fetching and setting location and map settings</p>\n","_postman_id":"ddf05ea2-4af6-4c42-bbad-056272ab91e0","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}}},{"name":"Localization & Navigation","item":[{"name":"LocalizeRobot","id":"829a65b6-966a-47bc-b61b-dcdfbb4861d9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer "}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\",\n  \"goal\": {\n    \"destinationId\": \"dest-123\"\n  }\n}"},"url":"/v1/robot/localize","description":"<p>Localizes the robot to a known pose or destination.</p>\n<p>If the request is accepted, subscribe to SubscribeLocalizationStatus to track localization progress.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot that the localization command is sent to.</p>\n<h5 id=\"goal-goal-required\">goal <code>Goal</code> <code>required</code></h5>\n<p>Goal represents a target destination or pose for the robot to localize to.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field (<em>oneof</em>)</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>destination_id</code></td>\n<td><code>string</code></td>\n<td>Unique identifier for the destination.</td>\n</tr>\n<tr>\n<td><code>pose</code></td>\n<td><code>Pose</code></td>\n<td>Pose of the robot on the map.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"pose\">Pose</h5>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>x_meters</code></td>\n<td><code>float</code></td>\n<td>X-coordinate in meters within the map.</td>\n</tr>\n<tr>\n<td><code>y_meters</code></td>\n<td><code>float</code></td>\n<td>Y-coordinate in meters within the map.</td>\n</tr>\n<tr>\n<td><code>heading_radians</code></td>\n<td><code>float</code></td>\n<td>The heading of the robot in radians. Ranges from -π to π, where 0.0 points along the positive x-axis.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\",\n  \"goal\": {\n    \"destinationId\": \"dest-123\"\n  }\n}\n</code></pre>\n<p>or</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\",\n  \"goal\": {\n    \"pose\": {\n      \"xMeters\": 2.5,\n      \"yMeters\": 1.8,\n      \"headingRadians\": 1.57\n    }\n  }\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<p><em>(No fields defined)</em></p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>Invalid request parameters. Tips: check that <code>robot_id</code> is not empty and <code>goal</code> is not nil.</td>\n</tr>\n<tr>\n<td><code>PERMISSION_DENIED</code></td>\n<td>Attempting to localize a <code>robot_id</code> you don't own. Tips: check the spelling of the <code>robot_id</code>.</td>\n</tr>\n<tr>\n<td><code>FAILED_PRECONDITION</code></td>\n<td>While the robot is localizing, any subsequent requests to localize the robot will return an error until the process is completed.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>Communication failure with the robot.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","robot","localize"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"829a65b6-966a-47bc-b61b-dcdfbb4861d9"},{"name":"SetPose","id":"bbe710b0-66b8-4563-8d8e-25750d88d020","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer ","description":"<p>Bearer token for authentication</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\",\n  \"pose\": {\n    \"xMeters\": 2.5,\n    \"yMeters\": 1.8,\n    \"headingRadians\": 1.57\n  }\n}"},"url":"/v1/pose/set","description":"<p>Sets the robot's current pose to a specified position and orientation.</p>\n<p>Unlike LocalizeRobot, the robot will not attempt to verify whether the pose that is set aligns with its camera view.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot to set the pose for.</p>\n<h5 id=\"pose-pose-required\">pose <code>Pose</code> <code>required</code></h5>\n<p>The new pose for the robot.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>x_meters</code></td>\n<td><code>float</code></td>\n<td>X-coordinate in meters within the map.</td>\n</tr>\n<tr>\n<td><code>y_meters</code></td>\n<td><code>float</code></td>\n<td>Y-coordinate in meters within the map.</td>\n</tr>\n<tr>\n<td><code>heading_radians</code></td>\n<td><code>float</code></td>\n<td>The heading of the robot in radians. Ranges from -π to π, where 0.0 points along the positive x-axis.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\",\n  \"pose\": {\n    \"xMeters\": 2.5,\n    \"yMeters\": 3.0,\n    \"headingRadians\": 1.57\n  }\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<p><em>(No fields defined)</em></p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>PERMISSION_DENIED</code></td>\n<td>Attempting to set pose for a <code>robot_id</code> you don't own. Tips: check the spelling of the <code>robot_id</code> value.</td>\n</tr>\n<tr>\n<td><code>NOT_FOUND</code></td>\n<td>The specified robot ID does not exist or is not accessible.</td>\n</tr>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>The specified pose is invalid or out of bounds.</td>\n</tr>\n<tr>\n<td><code>UNAVAILABLE</code></td>\n<td>The robot is offline and cannot set pose.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","pose","set"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"bbe710b0-66b8-4563-8d8e-25750d88d020"}],"id":"2a429061-565c-48bf-b705-02691527e03b","description":"<p>Low-level endpoints for robot pose and localization</p>\n","_postman_id":"2a429061-565c-48bf-b705-02691527e03b","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}}},{"name":"Robot Status","item":[{"name":"GetRobotStatus","id":"eab10a4c-62c1-45f9-97a7-293b1facce36","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer "}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\"\n}"},"url":"/v1/robot-state/get","description":"<p>Get the latest robot state.</p>\n<p>Robot state includes connectivity and operational states.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot to get status for.</p>\n<h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\"\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"robot_state-robotstate\">robot_state <code>RobotState</code></h5>\n<p>The current robot state including connectivity, battery, emergency stop, mission, pose, error information, velocity, navigation state, and type-specific states.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>connection</code></td>\n<td><code>RobotConnection</code></td>\n<td>Connection state of the robot.</td>\n</tr>\n<tr>\n<td><code>battery</code></td>\n<td><code>BatteryState</code></td>\n<td>Battery state of the robot.</td>\n</tr>\n<tr>\n<td><code>emergency_stop</code></td>\n<td><code>EmergencyStopState</code></td>\n<td>Emergency stop state of the robot.</td>\n</tr>\n<tr>\n<td><code>mission</code></td>\n<td><code>MissionState</code></td>\n<td>Mission state of the robot.</td>\n</tr>\n<tr>\n<td><code>pose</code></td>\n<td><code>Pose</code></td>\n<td>Current pose of the robot.</td>\n</tr>\n<tr>\n<td><code>error_codes</code></td>\n<td><code>ErrorCodes</code></td>\n<td>Error codes returned by the robot.</td>\n</tr>\n<tr>\n<td><code>typed_status</code></td>\n<td><em>oneof</em></td>\n<td>Robot type-specific state information. Only one type may be set at a time.</td>\n</tr>\n<tr>\n<td><code>twist</code></td>\n<td><code>Twist</code></td>\n<td>Linear and angular velocity of the robot. Omitted when not reported by the robot.</td>\n</tr>\n<tr>\n<td><code>navigation_state</code></td>\n<td><code>NavigationState</code></td>\n<td><strong>(v1.3)</strong> Navigation-related state of the robot, including whether it is currently stuck.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"typed_status-oneof\">typed_status <code>oneof</code></h5>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>servi_state</code></td>\n<td><code>ServiState</code></td>\n<td>Populated when the robot type is a Servi. Contains tray states.</td>\n</tr>\n<tr>\n<td><code>carti_state</code></td>\n<td><code>CartiState</code></td>\n<td>Populated when the robot type is a Carti. Contains optional conveyor state.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"twist\">Twist</h5>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>linear_velocity</code></td>\n<td><code>float</code></td>\n<td>The desired speed to drive up to in meters-per-second (m/s). Positive value for forward, negative for reverse.</td>\n</tr>\n<tr>\n<td><code>angular_velocity</code></td>\n<td><code>float</code></td>\n<td>The desired rate of rotation in radians-per-second (rad/s). Positive for clockwise, negative for counter-clockwise.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"navigationstate-v13\">NavigationState <code>(v1.3)</code></h5>\n<p>Represents navigation-related state for the robot.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>stuck_state</code></td>\n<td><code>StuckState</code></td>\n<td>Whether the robot is currently stuck (unable to make navigation progress) and, when known, the reason.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"stuckstate-v13\">StuckState <code>(v1.3)</code></h5>\n<p>Whether the robot is currently unable to make navigation progress, and the reason for it when known. \"Stuck\" is a transient, recoverable navigation condition (e.g., obstruction, restricted area), distinct from a mission failure.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>state</code></td>\n<td><code>State</code> <em>enum</em></td>\n<td>Current stuck state of the robot.</td>\n</tr>\n<tr>\n<td><code>reason</code></td>\n<td><code>Reason</code> <em>enum</em></td>\n<td>Reason the robot is stuck. Only meaningful when <code>state</code> is <code>STATE_STUCK</code>; otherwise expect <code>REASON_UNKNOWN</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h6 id=\"stuckstatestate-enum\">StuckState.State <code>enum</code></h6>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Number</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>STATE_UNKNOWN</td>\n<td>0</td>\n<td>Default unset value. Treat as an error if received.</td>\n</tr>\n<tr>\n<td>STATE_NOT_STUCK</td>\n<td>1</td>\n<td>The robot is operating normally and not stuck.</td>\n</tr>\n<tr>\n<td>STATE_STUCK</td>\n<td>2</td>\n<td>The robot is unable to make navigation progress. See <code>reason</code> for the cause when available.</td>\n</tr>\n</tbody>\n</table>\n</div><h6 id=\"stuckstatereason-enum\">StuckState.Reason <code>enum</code></h6>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Number</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>REASON_UNKNOWN</td>\n<td>0</td>\n<td>No reason reported. Set when <code>state</code> != <code>STATE_STUCK</code>, or when the upstream stack did not provide a discrete cause.</td>\n</tr>\n<tr>\n<td>REASON_PATH_BLOCKED</td>\n<td>1</td>\n<td>The planned path is blocked at runtime by a dynamic obstacle.</td>\n</tr>\n<tr>\n<td>REASON_DESTINATION_OBSTRUCTED</td>\n<td>2</td>\n<td>The destination cell is occupied by an obstacle. Reserved for future use; not currently emitted by the robot.</td>\n</tr>\n<tr>\n<td>REASON_DESTINATION_UNREACHABLE</td>\n<td>3</td>\n<td>No feasible path exists to the destination. Reserved for future use; not currently emitted by the robot.</td>\n</tr>\n<tr>\n<td>REASON_INSIDE_RESTRICTED_AREA</td>\n<td>4</td>\n<td>The robot is inside a restricted/annotated area it cannot leave (e.g., a no-go zone it was placed into).</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotState\": {\n    \"connection\": {\n      \"state\": \"STATE_CONNECTED\"\n    },\n    \"battery\": {\n      \"chargePercent\": 85,\n      \"state\": \"STATE_CHARGING\",\n      \"chargeMethod\": \"CHARGE_METHOD_CONTACT\"\n    },\n    \"emergencyStop\": {\n      \"emergency\": \"EMERGENCY_DISENGAGED\",\n      \"buttonPressed\": \"EMERGENCY_DISENGAGED\"\n    },\n    \"mission\": {\n      \"missionId\": \"mission-123\",\n      \"state\": \"STATE_RUNNING\"\n    },\n    \"pose\": {\n      \"xMeters\": 1.5,\n      \"yMeters\": 2.8,\n      \"headingRadians\": 0.78\n    },\n    \"errorCodes\": {\n      \"codes\": [\"E001\", \"E042\"]\n    },\n    \"twist\": {\n      \"linearVelocity\": 0.5,\n      \"angularVelocity\": 0.1\n    },\n    \"navigationState\": {\n      \"stuckState\": {\n        \"state\": \"STATE_NOT_STUCK\",\n        \"reason\": \"REASON_UNKNOWN\"\n      }\n    },\n    \"serviState\": {\n      \"trayStates\": {}\n    }\n  }\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>Invalid request parameters. Tips: check that <code>robot_id</code> is not empty.</td>\n</tr>\n<tr>\n<td><code>PERMISSION_DENIED</code></td>\n<td>Attempting to get status for a <code>robot_id</code> you don't own. Tip: check the spelling of the <code>robot_id</code> value.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>Communication failure with the robot.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","robot-state","get"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"eab10a4c-62c1-45f9-97a7-293b1facce36"}],"id":"35603a71-fefb-4b35-a162-2500d1b17d84","description":"<p>Queries for real-time robot status data (includes v1.3 addition: navigation_state on GetRobotStatus)</p>\n","_postman_id":"35603a71-fefb-4b35-a162-2500d1b17d84","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}}},{"name":"Robot System","item":[{"name":"GetRobotSystemInfo","id":"e32fa697-b65c-41d8-919f-f6f0bf8a793a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer "}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\"\n}"},"url":"/v0/robot-system-info/get","description":"<p>Get the overall robot system information, including software version, robot family, robot ID, and display name.</p>\n<p>The system info tends to be static and does not change often.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot to retrieve system information for.</p>\n<h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\"\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"system_info-systeminfo\">system_info <code>SystemInfo</code></h5>\n<p>Contains system-level information about the robot.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>software_version</code></td>\n<td><code>string</code></td>\n<td>The distribution version currently installed and running on the robot.</td>\n</tr>\n<tr>\n<td><code>robot_family</code></td>\n<td><code>RobotFamily</code> <em>enum</em></td>\n<td>The classification or family of the robot.</td>\n</tr>\n<tr>\n<td><code>robot_id</code></td>\n<td><code>string</code></td>\n<td>Unique identifier for the robot.</td>\n</tr>\n<tr>\n<td><code>display_name</code></td>\n<td><code>string</code></td>\n<td>A user-friendly name for the robot, typically used for display purposes.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"systemInfo\": {\n    \"softwareVersion\": \"servi-24.03\",\n    \"robotFamily\": \"ROBOT_FAMILY_SERVI_PLUS\",\n    \"robotId\": \"pennybot-abc123\",\n    \"displayName\": \"Main Kitchen\"\n  }\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>Invalid request parameters. Tips: check that <code>robot_id</code> is not empty.</td>\n</tr>\n<tr>\n<td><code>PERMISSION_DENIED</code></td>\n<td>Attempting to retrieve system information for a <code>robot_id</code> you don't own. Tips: check the spelling of the <code>robot_id</code> value.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>Internal server error occurred while processing the request.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v0","robot-system-info","get"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"e32fa697-b65c-41d8-919f-f6f0bf8a793a"},{"name":"RunSystemCommand","id":"097afcdb-e466-4ea5-a31d-311cd265affd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer "}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\",\n  \"systemCommand\": {\n    \"reboot\": {\n      \"type\": \"TYPE_SOFTWARE_ONLY\"\n    }\n  }\n}"},"url":"/v1/system-command/run","description":"<p>Execute a OS-level command on a robot.</p>\n<p>Note: When rebooting or shutting down the robot, a response will return immediately to acknowledge the request but may take several minutes before the robot reconnects (for reboot) or powers off (for shutdown).</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot that will receive this command.</p>\n<h5 id=\"system_command-systemcommand-required\">system_command <code>SystemCommand</code> <code>required</code></h5>\n<p>The system command to execute on the robot.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field (<em>oneof</em>)</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>reboot</code></td>\n<td><code>Reboot</code></td>\n<td>Reboot the robot with specified type.</td>\n</tr>\n<tr>\n<td><code>shutdown</code></td>\n<td><code>Shutdown</code></td>\n<td>Shut down the robot system. Pass in an empty Shutdown message to initiate a shutdown.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"reboot\">Reboot</h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>type</code></td>\n<td><code>Type</code> <em>enum</em></td>\n<td>The type of reboot to perform.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"type-enum\">Type <code>enum</code></h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Number</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>TYPE_UNKNOWN</td>\n<td>0</td>\n<td>Default value. This should never be used explicitly.</td>\n</tr>\n<tr>\n<td>TYPE_SOFTWARE_ONLY</td>\n<td>1</td>\n<td>Perform an OS-level reboot without powering off hardware devices.</td>\n</tr>\n<tr>\n<td>TYPE_WITH_HARDWARE</td>\n<td>2</td>\n<td>Perform a full power-cycle including hardware devices.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"shutdown\">Shutdown</h4>\n<p>Empty message. Pass an empty object <code>{}</code> to initiate a shutdown.</p>\n<h5 id=\"json-request-example-reboot\">JSON Request Example (Reboot)</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\",\n  \"systemCommand\": {\n    \"reboot\": {\n      \"type\": \"TYPE_SOFTWARE_ONLY\"\n    }\n  }\n}\n</code></pre>\n<h5 id=\"json-request-example-shutdown\">JSON Request Example (Shutdown)</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-abc123\",\n  \"systemCommand\": {\n    \"shutdown\": {}\n  }\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<p><em>(No fields defined)</em></p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>PERMISSION_DENIED</code></td>\n<td>Attempting to execute system command for a <code>robot_id</code> you don't own. Tips: check the spelling of the <code>robot_id</code> value.</td>\n</tr>\n<tr>\n<td><code>NOT_FOUND</code></td>\n<td>The specified robot ID does not exist or is not accessible.</td>\n</tr>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>The system command is invalid or not supported.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>The request failed to execute due to internal error. Client should retry the command.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","system-command","run"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"097afcdb-e466-4ea5-a31d-311cd265affd"}],"id":"d436a09a-b905-42d0-adbd-800d5441e900","description":"<p>System-level operations and Queries for static robot configurations</p>\n","_postman_id":"d436a09a-b905-42d0-adbd-800d5441e900","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}}},{"name":"Fleet Management","item":[{"name":"ListRobotIDs","id":"48d09f0a-4d3a-4a3e-96e9-071b25f11287","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer "}],"body":{"mode":"raw","raw":"{\n  \"filter\": {\n    \"locationId\": \"\"\n  }\n}"},"url":"/v1/robot-ids/list","description":"<p>Retrieves a list of robot IDs the user has access to, filtered by optional criteria.</p>\n<p>The list includes all known robots, regardless of their current connection state.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"filter-robotfilter-required\">filter <code>RobotFilter</code> <code>required</code></h5>\n<p><code>RobotFilter</code> defines the conditions for selecting robots. All specified fields are combined using an <strong>AND</strong> condition.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>location_id</code></td>\n<td><code>string</code></td>\n<td>An empty location_id returns all robots assigned to all locations created and owned by API key user.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"filter\": {\n    \"locationId\": \"1D9X\"\n  }\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<p>A response message has 2 fields:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>total_robots</code></td>\n<td><code>int32</code></td>\n<td>Total number of robots.</td>\n</tr>\n<tr>\n<td><code>robot_ids</code></td>\n<td>List of <code>string</code></td>\n<td>This might not have all the robot IDs if there are too many. It will have all the robot IDs if the number of <code>robot_ids</code> is same as <code>total_robots</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"totalRobots\": 5,\n  \"robotIds\": [\n    \"pennybot-abc123\",\n    \"pennybot-def456\",\n    \"pennybot-ghi789\",\n    \"pennybot-jkl012\",\n    \"pennybot-mno345\"\n  ]\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>Invalid API key or request parameters.</td>\n</tr>\n<tr>\n<td><code>PERMISSION_DENIED</code></td>\n<td>Attempting to retrieve Robot IDs with a <code>location_id</code> you don't own. Tips: check the spelling of all <code>location_id</code> values.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>Internal server error occurred while processing the request.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","robot-ids","list"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"48d09f0a-4d3a-4a3e-96e9-071b25f11287"},{"name":"GetAvailableLocations","id":"a39e89ab-ab20-4f9e-9daa-b0c65ac0c124","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer ","description":"<p>Bearer token for authentication</p>\n"}],"body":{"mode":"raw","raw":"{}"},"url":"/v1/available-locations/get","description":"<p>Returns a map of locations the user has access to.</p>\n<p>The map consists of the location ID (key) paired with its human-readable name (value).</p>\n<h3 id=\"request\">Request</h3>\n<p><em>(No fields required)</em></p>\n<h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"locations-mapstring-string\">locations <code>map&lt;string, string&gt;</code></h5>\n<p>A mapping of location ID (key) with its corresponding, human-readable location name. e.g. { \"1D9X\": \"785_Platform\" }</p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"locations\": {\n    \"1D9X\": \"785_Platform\",\n    \"3R0A\": \"Main Office Building\",\n    \"5K2B\": \"Warehouse Facility\"\n  }\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>Internal server error occurred while processing the request.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","available-locations","get"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"a39e89ab-ab20-4f9e-9daa-b0c65ac0c124"}],"id":"07ba2d1f-e107-41af-bd3d-3a47c1d8d407","description":"<p>Fleet-level operations</p>\n","_postman_id":"07ba2d1f-e107-41af-bd3d-3a47c1d8d407","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}}},{"name":"Servi","item":[{"name":"CreateMission","id":"abf17b52-ebf9-4658-b3e6-1b1617b1dbe2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer "}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\",\n  \"mission\": {\n    \"serviMission\": {\n      \"navigateMission\": {\n        \"goal\": {\n          \"destinationId\": \"dest-123\"\n        }\n      }\n    }\n  }\n}"},"url":"/v1/mission/create","description":"<p>Use the shared <code>CreateMission</code> endpoint to send missions for Servi robots. Servi-specific missions must be sent using the appropriate request message format.</p>\n<p>Note: When sending a Servi mission, <code>servi.Feedback</code> and <code>ServiType</code> are returned in SubscribeMissionStatus response message.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot that will receive this command.</p>\n<h5 id=\"mission-mission-required\">mission <code>Mission</code> <code>required</code></h5>\n<p>Universal wrapper for mission types. Only one mission type may be set at a time.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field (<em>oneof</em>)</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>servi_mission</code></td>\n<td><code>servi.Mission</code></td>\n<td>Servi missions are specific to the Servi robot family.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"servi_mission-servimission\">servi_mission <code>servi.Mission</code></h5>\n<p>Use the field <code>servi_mission</code> to create and send a servi mission. Current API version supports 6 types of Servi mission.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field (<em>oneof</em>)</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>delivery_mission</code></td>\n<td><code>DeliveryMission</code></td>\n<td>Create a servi mission of type <code>Delivery</code>.</td>\n</tr>\n<tr>\n<td><code>bussing_mission</code></td>\n<td><code>BussingMission</code></td>\n<td>Create a servi mission of type <code>Bussing</code>.</td>\n</tr>\n<tr>\n<td><code>delivery_patrol_mission</code></td>\n<td><code>DeliveryPatrolMission</code></td>\n<td>Create a servi mission of type <code>DeliveryPatrol</code>.</td>\n</tr>\n<tr>\n<td><code>bussing_patrol_mission</code></td>\n<td><code>BussingPatrolMission</code></td>\n<td>Create a servi mission of type <code>BussingPatrol</code>.</td>\n</tr>\n<tr>\n<td><code>navigate_mission</code></td>\n<td><code>NavigateMission</code></td>\n<td>Create a servi mission of type <code>Navigate</code>.</td>\n</tr>\n<tr>\n<td><code>navigate_auto_mission</code></td>\n<td><code>NavigateAutoMission</code></td>\n<td>Create a servi mission of type <code>NavigateAuto</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-456efg\",\n  \"mission\": {\n    \"serviMission\": {\n      \"navigateMission\": {\n        \"goal\": {\n          \"destinationId\": \"dest-123\"\n        }\n      }\n    }\n  }\n}\n\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"mission_id-string\">mission_id <code>string</code></h5>\n<p>The ID of the mission created.</p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"missionId\": \"cbd47ab1-df21-479e-9f72-677b81ab55b0\"\n}\n\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>Invalid request parameters or this command is being sent to a non-Servi family robot. Tips: check that <code>robot_id</code> is not empty, <code>mission</code> is not null, or the robot is a Servi family robot.</td>\n</tr>\n<tr>\n<td><code>PERMISSION_DENIED</code></td>\n<td>Attempting to create a mission for a <code>robot_id</code> you don't own. Tips: check the spelling of the <code>robot_id</code> value.</td>\n</tr>\n<tr>\n<td><code>NOT_FOUND</code></td>\n<td>The specified robot ID does not exist or is not accessible.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>Internal server error occurred while processing the request.</td>\n</tr>\n<tr>\n<td><code>FAILED_PRECONDITION</code></td>\n<td>The robot is already executing another mission. This command is valid if current mission is in terminal state (Cancelled, Succeeded, Failed).</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","mission","create"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"abf17b52-ebf9-4658-b3e6-1b1617b1dbe2"},{"name":"CalibrateTrays","id":"f975533b-0add-4f43-8c8f-1d59ced68108","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer ","description":"<p>Bearer token for authentication</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\",\n  \"selector\": {\n    \"trayNames\": [\"top\", \"middle\"]\n  }\n}"},"url":"/v1/trays/calibrate","description":"<p>Calibrates the trays on the robot.</p>\n<p>Only applicable for tray-equipped robots (e.g., Servi, Servi Plus).</p>\n<p>Calibrates all trays if no tray names are provided.\nReturns an INVALID_ARGUMENT error and rejects the request if any tray name is invalid.\nReturns an empty response on success.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot to calibrate trays on.</p>\n<h5 id=\"selector-servitrayselector-required\">selector <code>servi.TraySelector</code> <code>required</code></h5>\n<p>Selector to specify which trays to calibrate.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>tray_names</code></td>\n<td><em>repeated</em> <code>string</code></td>\n<td>List of tray names to calibrate. If empty, calibrates all trays.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"pennybot-456efg\",\n  \"selector\": {\n    \"trayNames\": [\"top\", \"middle\"]\n  }\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<p><em>(No fields defined)</em></p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>This command is being sent to a non-Servi robot, or any tray name is invalid.</td>\n</tr>\n<tr>\n<td><code>PERMISSION_DENIED</code></td>\n<td>Attempting to calibrate trays for a <code>robot_id</code> you don't own. Tips: check the spelling of the <code>robot_id</code> value.</td>\n</tr>\n<tr>\n<td><code>NOT_FOUND</code></td>\n<td>The specified robot ID does not exist.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>Internal server error occurred while processing the request.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","trays","calibrate"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"f975533b-0add-4f43-8c8f-1d59ced68108"}],"id":"0bce91ae-2893-4de9-8cf0-4317a8177cdd","description":"<p>Servi-specific operations</p>\n","_postman_id":"0bce91ae-2893-4de9-8cf0-4317a8177cdd","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}}},{"name":"Carti","item":[{"name":"CreateMission","id":"85f03bc0-82f9-44c0-9471-ead8878bf056","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer "}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\",\n  \"mission\": {\n    \"cartiMission\": {\n      \"traverseMission\": {\n        \"goals\": [\n          {\n            \"destinationId\": \"room-a\"\n          },\n          {\n            \"pose\": {\n              \"xMeters\": 5.2,\n              \"yMeters\": 3.1,\n              \"headingRadians\": 1.57\n            }\n          }\n        ],\n        \"params\": {}\n      }\n    }\n  }\n}"},"url":"/v1/mission/create","description":"<p>Use the shared <code>CreateMission</code> endpoint to send missions for Carti robots. Carti-specific missions must be sent using the appropriate request message format.</p>\n<p>Note: When sending a Carti mission, <code>carti.Feedback</code> and <code>CartiType</code> are returned in SubscribeMissionStatus response message.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot that will receive this command.</p>\n<h5 id=\"mission-mission-required\">mission <code>Mission</code> <code>required</code></h5>\n<p>Universal wrapper for mission types. Only one mission type may be set at a time.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field (<em>oneof</em>)</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>carti_mission</code></td>\n<td><code>carti.Mission</code></td>\n<td>Carti missions are specific to the Carti robot family.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"carti_mission-cartimission\">carti_mission <code>carti.Mission</code></h5>\n<p>Use the field <code>carti_mission</code> to create and send a mission. Current API version supports 4 types of Carti missions.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field (<em>oneof</em>)</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>traverse_mission</code></td>\n<td><code>TraverseMission</code></td>\n<td>Create a carti mission of type <code>Traverse</code>.</td>\n</tr>\n<tr>\n<td><code>traverse_patrol_mission</code></td>\n<td><code>TraversePatrolMission</code></td>\n<td>Create a carti mission of type <code>TraversePatrol</code>.</td>\n</tr>\n<tr>\n<td><code>navigate_mission</code></td>\n<td><code>NavigateMission</code></td>\n<td>Create a carti mission of type <code>Navigate</code>.</td>\n</tr>\n<tr>\n<td><code>navigate_auto_mission</code></td>\n<td><code>NavigateAutoMission</code></td>\n<td>Create a carti mission of type <code>NavigateAuto</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"carti-001\",\n  \"mission\": {\n    \"cartiMission\": {\n      \"traverseMission\": {\n        \"goals\": [\n          {\n            \"destinationId\": \"room-a\"\n          },\n          {\n            \"pose\": {\n              \"xMeters\": 5.2,\n              \"yMeters\": 3.1,\n              \"headingRadians\": 1.57\n            }\n          }\n        ],\n        \"params\": {}\n      }\n    }\n  }\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"mission_id-string\">mission_id <code>string</code></h5>\n<p>The ID of the mission created.</p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"missionId\": \"mission-abc123\"\n}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>Invalid request parameters or this command is being sent to a non-Carti family robot. Tips: check that <code>robot_id</code> is not empty, <code>mission</code> is not null, or the robot is a Carti family robot.</td>\n</tr>\n<tr>\n<td><code>PERMISSION_DENIED</code></td>\n<td>Attempting to create a mission for a <code>robot_id</code> you don't own. Tips: check the spelling of the <code>robot_id</code> value.</td>\n</tr>\n<tr>\n<td><code>NOT_FOUND</code></td>\n<td>The specified robot ID does not exist or is not accessible.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>Internal server error occurred while processing the request.</td>\n</tr>\n<tr>\n<td><code>FAILED_PRECONDITION</code></td>\n<td>The robot is already executing another mission. This command is valid if current mission is in terminal state (Cancelled, Succeeded, Failed).</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","mission","create"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"85f03bc0-82f9-44c0-9471-ead8878bf056"},{"name":"GetConveyorIndex","id":"e2de8bf8-53ac-4067-9eb4-0bad459ff97e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer ","description":"<p>Bearer token for authentication</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\"\n}"},"url":"/v1/conveyor-index/get","description":"<p>Retrieves the configured conveyor indexes for the robot.</p>\n<p>Indexes represent logical positions, not physical installation:</p>\n<ul>\n<li>Carti 100 (vertical): INDEX_1ST = uppermost conveyor</li>\n<li>Carti 600 (horizontal): INDEX_1ST = front facing conveyor</li>\n</ul>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot.</p>\n<h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"\"\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<h5 id=\"indexes-repeated-int32\">indexes <code>repeated int32</code></h5>\n<p>List of conveyor indexes.</p>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>Robot is not a Carti family robot.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","conveyor-index","get"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"e2de8bf8-53ac-4067-9eb4-0bad459ff97e"},{"name":"ControlConveyor","id":"1c572db6-c95c-4954-b55a-f0d2e2b0aef6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer ","description":"<p>Bearer token for authentication</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"robotId\": \"\",\n  \"commands\": [\n    {\n      \"index\": 1,\n      \"command\": \"COMMAND_CONVEYOR_MOTOR_STOP\"\n    }\n  ]\n}"},"url":"/v1/conveyor/control","description":"<p>Controls conveyor motor operations for the specified conveyor indexes.</p>\n<p>This call allows manual control of conveyor motors for clockwise/counter-clockwise rotation or stop commands.</p>\n<p><strong>Note</strong>: These endpoints are only available for Carti robot family. Attempting to run conveyor commands on a non-Carti robot will result in an INVALID_ARGUMENT error.</p>\n<ul>\n<li>Carti 100: CW = right, CCW = left (X-axis rotation)</li>\n<li>Carti 600: CW = front→rear, CCW = rear→front (Y-axis rotation)</li>\n</ul>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"robot_id-string-required\">robot_id <code>string</code> <code>required</code></h5>\n<p>The ID of the robot that will receive this command.</p>\n<h5 id=\"commands-repeated-carticonveyormotorcommand-required\">commands <code>repeated carti.ConveyorMotorCommand</code> <code>required</code></h5>\n<p>List of conveyor motor commands to execute.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Message Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>index</code></td>\n<td><code>int32</code></td>\n<td>The target conveyor to control.</td>\n</tr>\n<tr>\n<td><code>command</code></td>\n<td><code>CommandConveyorMotor</code> <em>enum</em></td>\n<td>The motor command to execute.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"commandconveyormotor-enum\">CommandConveyorMotor <code>enum</code></h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Number</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>COMMAND_CONVEYOR_MOTOR_UNKNOWN</td>\n<td>0</td>\n<td>Default value. This should never be used explicitly.</td>\n</tr>\n<tr>\n<td>COMMAND_CONVEYOR_MOTOR_STOP</td>\n<td>1</td>\n<td>Stop the conveyor.</td>\n</tr>\n<tr>\n<td>COMMAND_CONVEYOR_MOTOR_CW</td>\n<td>2</td>\n<td>Rotate the conveyor clockwise.</td>\n</tr>\n<tr>\n<td>COMMAND_CONVEYOR_MOTOR_CCW</td>\n<td>3</td>\n<td>Rotate the conveyor counter-clockwise.</td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"json-request-example\">JSON Request Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"robotId\": \"carti-001\",\n  \"commands\": [\n    {\n      \"index\": 1,\n      \"command\": \"COMMAND_CONVEYOR_MOTOR_CW\"\n    },\n    {\n      \"index\": 2,\n      \"command\": \"COMMAND_CONVEYOR_MOTOR_STOP\"\n    }\n  ]\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<p><em>(No fields defined)</em></p>\n<h5 id=\"json-response-example\">JSON Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{}\n</code></pre>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>ErrorCode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>INVALID_ARGUMENT</code></td>\n<td>This command is being sent to a non-Carti family robot, or one or more conveyor indexes are not installed on the robot.</td>\n</tr>\n<tr>\n<td><code>NOT_FOUND</code></td>\n<td>The specified robot ID does not exist or is not accessible.</td>\n</tr>\n<tr>\n<td><code>INTERNAL</code></td>\n<td>Internal server error occurred while processing the request.</td>\n</tr>\n<tr>\n<td><code>FAILED_PRECONDITION</code></td>\n<td>The robot is in an error state that prevents conveyor control.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}},"urlObject":{"path":["v1","conveyor","control"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"1c572db6-c95c-4954-b55a-f0d2e2b0aef6"}],"id":"7eb962e8-2df6-4c94-832a-021b17d2eb13","description":"<p>Carti-specific operations</p>\n","_postman_id":"7eb962e8-2df6-4c94-832a-021b17d2eb13","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","id":"8e12a638-445e-4a8d-ba11-23d9544d65ec","name":"Bear Robotics Public REST API v1.3","type":"collection"}}}],"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]}},"event":[{"listen":"prerequest","script":{"type":"text/javascript","requests":{},"exec":["// Optional: Auto-refresh token if expired","// Uncomment the following code to enable automatic token refresh","// Note: This requires api_key, api_secret, and scope to be set","","/*","const bearerToken = pm.collectionVariables.get('bearer_token');","const apiKey = pm.collectionVariables.get('api_key');","const apiSecret = pm.collectionVariables.get('api_secret');","const scope = pm.collectionVariables.get('scope');","","// Only auto-refresh if using API key method and token is missing/expired","if (apiKey && apiSecret && (!bearerToken || bearerToken === '')) {","    // Token refresh logic would go here","    // For now, user should manually call the authentication endpoint","}","*/"],"id":"9a1cd3ed-bc1e-4273-a65f-ad710c1c8953"}},{"listen":"test","script":{"type":"text/javascript","packages":{},"requests":{},"exec":[""],"id":"d3f74515-3c12-40d0-aac2-bddf24717dcd"}}],"variable":[{"key":"base_url","value":"","description":"API Base URL (e.g., https://api.bearrobotics.ai for Production)"},{"key":"auth_url","value":"","description":"API Authentication Server URL (e.g., https://api-auth.bearrobotics.ai for Production)"},{"key":"robot_id","value":"","description":"Robot ID to use for API requests (set this once and it will be used across all requests)"},{"key":"location_id","value":"","description":"Location ID to use for location-related requests (e.g., GetLocationInfo)"},{"key":"map_id","value":"","description":"Map ID to use for map-related requests (e.g., GetMap)"},{"key":"bearer_token","value":"","description":"JWT Bearer token (automatically set after authentication, or set manually)"},{"key":"api_key","value":"","description":"API Key for authentication (optional, if using API Key method)"},{"key":"api_secret","value":"","description":"API Secret for authentication (required for API Key method)"},{"key":"scope","value":"","description":"Authentication scope issued with your API key (a fixed credential value, e.g., \"your-scope\")"}]}