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
--yesin scripts; without a terminal and without--yesthey 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.
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.
--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_KEYenvironment variable of the client; VS Code asks for it once and stores it encrypted.