Skip to content

Quickstart

Get your first voice agent making a call in a few minutes.

There are two ways to reach a live call. Build the agent in Studio by clicking through the builder, or create it from the API. The steps below take the API route. To do it without writing code, follow How Studio works. Both paths end at the same place: a published agent and a real call.

1. Get your API key

Sign up at studio.rymi.live and copy your API key from the dashboard.

bash
export RYMI_API_KEY="your_api_key_here"

2. Create an agent

Install a client library first (skip if you're using curl):

bash
npm install @rymi/node
bash
pip install rymi

Then create the agent:

bash
curl -X POST https://api.rymi.live/v1/agents \
  -H "Authorization: Bearer $RYMI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Alex - Sales Agent",
    "system_prompt": "You are Alex, a friendly sales assistant for TechCorp. Your goal is to qualify inbound leads by asking about their company size and budget. Be warm, concise, and professional."
  }'
typescript
import { Rymi } from '@rymi/node';

const rymi = new Rymi(); // reads RYMI_API_KEY from the environment

const agent = await rymi.agents.create({
  name: 'Alex - Sales Agent',
  system_prompt:
    'You are Alex, a friendly sales assistant for TechCorp. ' +
    'Your goal is to qualify inbound leads by asking about their company size and budget. ' +
    'Be warm, concise, and professional.'
});
python
from rymi import Rymi

rymi = Rymi()  # reads RYMI_API_KEY from the environment

agent = rymi.agents.create(
    name="Alex - Sales Agent",
    system_prompt=(
        "You are Alex, a friendly sales assistant for TechCorp. "
        "Your goal is to qualify inbound leads by asking about their company size and budget. "
        "Be warm, concise, and professional."
    ),
)

A raw system_prompt is the fastest way to start. Rymi auto-extracts the structured persona and playbook from it. When you want finer control over openers, qualification flow, and objection handling, switch to the structured config.

3. Connect your carrier

bash
curl -X POST https://api.rymi.live/v1/telephony/connect \
  -H "Authorization: Bearer $RYMI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "provider": "twilio",
    "auth_id": "AC...",
    "auth_token": "..."
  }'

Rymi does not buy phone numbers. Provision a number in your carrier account first, then use that provider-owned number as from_number.

4. Optional: register and attach a BYOC number

Register the carrier-owned number in Rymi if you want inbound routing or dashboard assignment:

bash
curl -X POST https://api.rymi.live/v1/numbers \
  -H "Authorization: Bearer $RYMI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "number": "+15551234567" }'
bash
curl -X POST https://api.rymi.live/v1/numbers/+15551234567/attach \
  -H "Authorization: Bearer $RYMI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "agent_id": "YOUR_AGENT_ID" }'

This requires the number to already be registered or synced in Rymi. For outbound-only calls, you can skip this and pass from_number directly.

5. Start an outbound call

bash
curl -X POST https://api.rymi.live/v1/calls \
  -H "Authorization: Bearer $RYMI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "agent_id": "YOUR_AGENT_ID",
    "participants": [
      {
        "transport": "pstn",
        "identity": "+15559990001",
        "from_number": "+15551234567"
      }
    ],
    "variables": { "name": "Alice" }
  }'
typescript
const call = await rymi.calls.create({
  agent_id: agent.id,
  participants: [
    {
      transport: 'pstn',
      identity: '+15559990001',
      from_number: '+15551234567'
    }
  ],
  variables: { name: 'Alice' }
});

console.log(call.id, call.status); // queued
python
call = rymi.calls.create(
    agent_id=agent["id"],
    participants=[
        {
            "transport": "pstn",
            "identity": "+15559990001",
            "from_number": "+15551234567",
        }
    ],
    variables={"name": "Alice"},
)

The call is accepted with 202 and dialed from the queue. Poll GET /v1/calls/:id for status, or register a webhook and let call.completed / call.intelligence.ready come to you.

What's next