Authentication
| Command | Description |
|---|
ravi auth login | Device-code login (RFC 8628) against https://api.ravi.app |
ravi auth logout | Clear stored credentials |
ravi auth status | Show current authentication status |
ravi auth status
Identity management
| Command | Description |
|---|
ravi identity list | List all Identities |
ravi identity create --name "X" | Create a new Identity |
ravi identity use <uuid> | Set this machine’s active identity |
# Create an identity and set it as this machine's active identity
ravi identity create --name "research-agent"
ravi identity use <identity-uuid>
The CLI is one identity per machine. ravi identity use writes the shared ~/.ravi/config.json active identity. It is not how you run many agents. Multiple agents on one host must use the HTTP API with per-identity ravi_id_... keys (or the Cursor Connect plugin).
Identity info
| Command | Description |
|---|
ravi get email | Get the active Identity’s email address |
ravi get phone | Get the active Identity’s phone number |
EMAIL=$(ravi get email | jq -r '.email')
PHONE=$(ravi get phone | jq -r '.phone_number')
Inbox (grouped)
Messages grouped by conversation (SMS) or thread (email).
| Command | Description |
|---|
ravi inbox email | List email threads |
ravi inbox email <thread-id> | View a specific email thread |
ravi inbox email --unread | Email threads with unread messages |
ravi inbox sms | List SMS conversations |
ravi inbox sms <conversation-id> | View a specific SMS conversation |
ravi inbox sms --unread | SMS conversations with unread messages |
# Get unread SMS previews
ravi inbox sms --unread | jq -r '.[].preview'
# Read a specific email thread
ravi inbox email <thread_id> | jq -r '.messages[].text_content'
Messages (flat)
Individual messages without grouping.
| Command | Description |
|---|
ravi message email | List all email messages |
ravi message email <message-id> | View a specific email message |
ravi message email --unread | Unread email messages only |
ravi message sms | List all SMS messages |
ravi message sms <message-id> | View a specific SMS message |
ravi message sms --unread | Unread SMS messages only |
SMS sending
| Command | Description |
|---|
ravi sms send | Send an SMS from the active Identity’s phone number |
Send flags:
| Flag | Required | Description |
|---|
--to | Yes | Recipient phone number in E.164 format (e.g. +15551234567) |
--body | Yes | Message text (plain text only, max 1600 characters) |
# Send a one-time passcode via SMS
ravi sms send --to "+15551234567" --body "Your code is 482910"
# Notify a human approver from a setup script
ravi sms send \
--to "${APPROVER_PHONE}" \
--body "Agent workspace ${WORKSPACE_NAME} is ready at ${WORKSPACE_URL}"
:::note
ravi sms send uses this machine’s active identity phone number. ravi identity use changes that single active identity. For multiple agents on one host, use the HTTP API with per-identity ravi_id_... keys (or the Cursor Connect plugin).
:::
Calls
| Command | Description |
|---|
ravi call --to <e164> | Place an outbound call from the active Identity’s phone number |
ravi call list | List calls |
ravi call transcript <call-id> | Show a call’s transcript |
ravi call hangup <call-id> | Hang up an active call |
# Place a call and capture the call id
CALL_ID=$(ravi call --to "+15551234567" | jq -r '.uuid')
# Fetch the transcript once the call ends
ravi call transcript "$CALL_ID"
Email sending
| Command | Description |
|---|
ravi email compose | Compose and send a new email |
ravi email reply <message-id> | Reply to sender only |
ravi email reply-all <message-id> | Reply to all recipients |
ravi email forward <message-id> | Forward an email |
Compose flags:
| Flag | Required | Description |
|---|
--to | Yes | Recipient email address |
--subject | Yes | Email subject line |
--body | Yes | Email body (HTML supported) |
--cc | No | CC recipients (comma-separated) |
--bcc | No | BCC recipients (comma-separated) |
--attach | No | File to attach (repeatable) |
ravi email compose \
--to "[email protected]" \
--subject "Report" \
--body "<p>See attached.</p>" \
--attach report.pdf
Reply flags: --body (required), --cc, --bcc, --attach (optional)
Passwords
| Command | Description |
|---|
ravi passwords list | List all stored passwords |
ravi passwords get <uuid> | Show a password entry |
ravi passwords create <domain> | Create a new entry |
ravi passwords update <uuid> | Update a password entry |
ravi passwords delete <uuid> | Delete a password entry |
ravi passwords generate | Generate a random password without storing |
Create flags: --username, --password, --generate, --length (default: 16), --no-special, --no-digits, --exclude-chars, --notes
# Auto-generate a password for a domain
ravi passwords create github.com --username "[email protected]"
# Generate without storing
ravi passwords generate --length 32
Secrets
| Command | Description |
|---|
ravi secrets set <key> <value> | Store a secret (creates or updates) |
ravi secrets get <key> | Retrieve a secret by key |
ravi secrets list | List all secret keys |
ravi secrets delete <uuid> | Delete a secret by UUID |
ravi secrets set OPENAI_API_KEY "sk-abc123..."
ravi secrets get OPENAI_API_KEY | jq -r '.value'
ravi secrets list | jq -r '.[].key'
Feedback
| Command | Description |
|---|
ravi feedback "<message>" | Send feedback to the Ravi team |
ravi feedback "Love the CLI, but would like custom domains"
Global flags
| Flag | Description |
|---|
--human | Output in human-readable format. JSON is the default. |
--identity <uuid> | Target one identity for a single command (messages, contacts, passwords, secrets, calls, events). When omitted, this machine’s active identity scopes the request. Not a multi-agent runtime. |
--help | Show help for any command |
--version | Show version information |
The API key is an auth fence — it defines what you’re allowed to touch. The caller chooses the identity. A management key with --identity <uuid> targets one identity; an identity-scoped key is already fenced to its identity, and --identity must match it.