Skip to main content
ryvo is the official command line for the Ryvo API. Every command is a thin, typed wrapper over a public endpoint, so it can do exactly what your API key allows and nothing more.

Install

Node.js 20 or newer.

Log in

The CLI uses a normal API key. It cannot create keys: the API does not allow it on purpose, so a leaked key can never mint another one. Create a key in the portal under Settings → API keys (app.ryvo.so/configuracion/api-keys) with the fewest scopes you need, then:
ryvo login checks the key with GET /v1/me before saving it. The key is stored in ~/.config/ryvo/config.json (%APPDATA%\ryvo\config.json on Windows) with 0600 permissions where the system supports them. Only the prefix (ryvo_live_abc123...) is ever printed. In CI, containers or with a secrets manager, skip the file and set the key in the environment. RYVO_API_KEY always wins over the saved key:
ryvo logout removes the stored key from this machine. It does not revoke it; revoke it in the portal.

Commands

ryvo <group> --help lists the options of each command. A few examples:

Commands that spend credits

ryvo calls create places a real phone call and ryvo campaigns create launches one call per recipient. Both:
  • ask for confirmation before sending anything. Pass --yes in scripts; without a terminal and without --yes they refuse instead of guessing.
  • always send an Idempotency-Key (a new uuid unless you pass --idempotency-key) and print it, so a retry after a timeout reuses it and never dials twice. See Idempotency.
--recipients takes a JSON array of recipients or a text/CSV file with one E.164 number per line. The real protection is the key’s credit cap, set in the portal.

Pagination

Every list takes --limit (1 to 100) and --cursor. --all follows next_cursor until the last page, 100 items at a time. Without --all, the CLI prints the next cursor when there is more.

The escape hatch: ryvo api

Like gh api: any method and path, with your key, retries and exit codes, printing the raw JSON.
It only accepts paths, never full URLs, so the key is only ever sent to the Ryvo API. In Git Bash, write v1/models without the leading slash (Git Bash rewrites paths that start with /).

JSON output and exit codes

Human tables are the default and may change between versions. For scripts, add --json: it prints the API response exactly as documented in the API reference. With --json, errors are printed to stderr as { "error", "message", "request_id", "exit_code" }. Every error prints the API’s request_id: quote it when you contact us. Requests answered with 429 or 503 are retried up to 3 times, honoring Retry-After (or X-RateLimit-Reset), and never waiting more than a minute. See Rate limits. The exit code comes from the API’s error code, so a script can branch without parsing text: A code the CLI does not know yet falls back to its HTTP status (for example any 402 is 8).

Connect the MCP server

ryvo mcp install adds the Ryvo MCP server (https://mcp.ryvo.so) to your AI client, so the assistant can read your agents, calls and campaigns.
Add --scope project to write the project file instead (.mcp.json, .cursor/mcp.json or .vscode/mcp.json), --config <path> to choose the file, and --dry-run to see the result without writing.
  • It merges: other servers and settings in the file are kept, and a timestamped backup (<file>.bak-20260929T123456Z) is written first. A file with comments is left untouched and the entry is printed for you to paste.
  • The key is never written to the file. Claude Code, Cursor and Windsurf read it from the RYVO_API_KEY environment variable of the client; VS Code asks for it once and stores it encrypted.
Use a read-only key for the MCP (agents:read, calls:read, conversations:read and the other :read scopes), with a credit cap. The assistant reads call transcripts, which are text written by third parties; a key that reads them without supervision should not carry calls:write or campaigns:write. ryvo mcp install warns you when the current key does.