Identities

What is an Identity?

An Identity is the core abstraction in Ravi. It bundles everything an agent needs to operate on the web:

Identity
├── Email address (auto-generated, receives real email)
├── Phone number (receives SMS, OTPs)
├── Credential vault (E2E-encrypted passwords per service)
├── Secret vault (E2E-encrypted key-value secrets)
└── TOTP secrets (2FA codes for enrolled services)

An Identity is not an Agent. An agent is software; an Identity is the persona it wears. One agent can have multiple Identities. One Identity can be handed between agents.

List Identities

ravi identity list --json
[
  {
    "uuid": "abc-123",
    "name": "research-agent",
    "inbox": "research-agent@in.ravi.app",
    "phone": "+15551234567"
  }
]

Create an Identity

ravi identity create --name "finance-agent" --json

This provisions a new email address, phone number, and empty vaults.

Switch active Identity

ravi identity use finance-agent

All subsequent CLI commands operate against this Identity. You can also use the UUID:

ravi identity use abc-123

Identity resolution

The CLI resolves the active Identity in this order:

  1. .ravi/config.json in the current working directory (project-level override)
  2. ~/.ravi/config.json (global default)
  3. No identity selected (commands that require one will error)

This lets you assign different Identities to different projects by placing a config file in each project root.

Multi-agent setups

Run multiple agents with separate Identities for isolation:

research-agent   → research@in.ravi.app    (newsletters, reports)
scheduler-agent  → calendar@in.ravi.app    (meeting invites)
finance-agent    → invoices@in.ravi.app    (receipts, billing)

Each Identity has its own inbox, credentials, and secrets. One agent’s compromise doesn’t affect another’s data.

Identity scoping

Every API request is scoped to a single Identity via the X-Ravi-Identity header. The CLI and plugins set this automatically based on the active Identity. There is no way to access another Identity’s data without switching to it first.

Next steps