Quickstart
Get building with the Menlo Platform Python SDK in under five minutes.
Get building with the Menlo Platform — no hardware required. The steps below cover programmatic control with the Python SDK.
Just want to drive a robot?
To test-drive a robot in your browser with no setup or code, see the Digital Asimov quickstart.
Get an API key
Sign in at platform.menlo.ai, then go to Settings → API Keys.
Click Create API key, give it a name, and copy the key.
Store your API key somewhere safe. It won't be shown again after you close the dialog.
Install the Python SDK
pip install "menlo-robot-sdk[livekit]"Verify the install:
python -c "import menlo_robot_sdk; print(menlo_robot_sdk.__version__)"Create a virtual robot and drive it
Set your API key as an environment variable, then run this Python script:
export MENLO_API_KEY="sk_live_..."
export MENLO_RCS_URL="https://api.menlo.ai/rcs"import asyncio
import time
from menlo_robot_sdk import AsyncClient, connect
from menlo_robot_sdk.experimental import generate_room_key
async def wait_for_skills(session, timeout_s: float = 180.0):
"""Wait for the browser viewer to join and skills to become available."""
deadline = time.monotonic() + timeout_s
print("Waiting for browser to join...")
while time.monotonic() < deadline:
try:
found = await session.discover_skills()
if found:
return found
except (RuntimeError, TimeoutError):
pass # viewer not joined yet
await asyncio.sleep(2.0)
raise TimeoutError("viewer did not join — is the Chrome tab open?")
async def main():
# Create client with API key from environment
async with AsyncClient() as client:
# Create a virtual robot
created = await client.robots.create(name="my-robot", model="asimov-v0")
robot_id = created.robot.id
print(f"Created robot: {robot_id}")
# Connect to the robot (browser viewer becomes the runtime)
session = await connect(
client,
robot_id,
worker_names=[], # Empty - browser viewer is the runtime
rcw_identity_prefix="simplesim",
join_livekit=True,
)
# Generate a room key for the viewer
key = await generate_room_key(client, robot_id)
print(f"\nOpen in Chrome: https://sim.menlo.ai/?key={key}")
print("(That tab becomes the robot runtime)\n")
# Wait for skills (browser joins as runtime)
skills = await wait_for_skills(session)
print(f"Available skills: {[s.name for s in skills]}")
# Drive the robot forward
result = await session.invoke("set_velocity", {"vx": 0.5, "duration_s": 2.0})
print(f"Action result: {result.status}")
# Clean up
await session.disconnect()
await client.robots.delete(robot_id)
if __name__ == "__main__":
asyncio.run(main())Open the printed URL in Chrome — that tab becomes the robot runtime. The script waits for you to join before proceeding.
More examples
For more examples, including pick-and-place, camera capture, and session management, see the Python SDK reference.
How is this guide?