Skip to content

Agents

Agents are the reusable voice personas that power calls. Each agent stores its prompt, persona/playbook structure, provider routing, post-call defaults, and feature flags.

List Agents

http
GET /v1/agents

Returns a paginated list of agents for the authenticated tenant.

Query Parameters

ParameterTypeDefaultDescription
limitinteger50Max records to return (max 200)
offsetinteger0Records to skip

Example Request

bash
curl "https://api.rymi.live/v1/agents?limit=10&offset=0" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response 200

json
{
  "agents": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "Priya - Sales Specialist",
      "voice": "Aoede",
      "llm_provider": "gemini",
      "llm_model": "gemini-2.5-flash",
      "agent_role": "operator",
      "language": "en-US",
      "created_at": "2026-03-01T10:00:00Z"
    }
  ],
  "total": 1,
  "offset": 0,
  "limit": 10
}

Errors

StatusMeaning
401Missing or invalid API key

Model and Voice Catalog

http
GET /v1/agents/llm-options

Returns the tenant-visible model catalog and voice list available for agent configuration. Use this to populate dropdowns and pickers before creating or updating agents.

Example Request

bash
curl https://api.rymi.live/v1/agents/llm-options \
  -H "Authorization: Bearer YOUR_API_KEY"

Response 200

json
{
  "models": [
    { "id": "gemini-2.5-flash", "provider_id": "google" },
    { "id": "gpt-4o-mini", "provider_id": "openai" }
  ],
  "voices": [
    { "id": "Aoede", "provider": "google", "name": "Aoede" },
    { "id": "21m00Tcm4TlvDq8ikWAM", "provider": "elevenlabs", "name": "Rachel" }
  ]
}

Agent Roles

Agents use an agent role to select their default STT, LLM, TTS, routing mode, and fallback stack. Set it with agent_role on create or update.

The top role is executive across the UI, API, and routing rules.

RoleAPI ValueBest ForDefault Behavior
OperatoroperatorSimple call handling, FAQs, lead capture, remindersCost-efficient standard pipeline with fallback providers
SpecialistspecialistSales, support, qualification, domain-specific workflowsHigher-accuracy STT, complexity-aware LLM routing, Google Gemini Pro TTS; ElevenLabs available as premium override
ExecutiveexecutiveComplex conversations, realtime behavior, high-value interactionsRealtime-capable routing with premium fallback stack

Provider selection is snapshotted into provider_config. Passing an explicit provider_config.tiers override lets advanced users control primary and fallback providers per agent role.


Create Agent

http
POST /v1/agents

Request Body

FieldTypeRequiredDefaultDescription
namestringYesHuman-readable agent name (max 100 characters)
system_promptstringNoRaw system prompt. If you omit persona and playbook, Rymi can extract structure from this prompt
voicestringNoRole defaultTTS voice ID from GET /v1/agents/llm-options
languagestring or nullNonull (auto-detect)Preferred start language locale (e.g., en-US, hi-IN). Use null for auto
agent_rolestringNooperatoroperator, specialist, executive, or concierge
llm_providerstringNoRole defaultgemini, openai, anthropic, or sarvam
llm_modelstringNoRole defaultModel ID for the active agent role
stt_providerstringNoRole defaultSpeech-to-text provider
stt_modelstringNoRole defaultSTT model ID
tts_providerstringNoRole defaultText-to-speech provider
tts_modelstringNoRole defaultTTS model ID
personaPersona objectNoStructured role, tone, audience, and voice config
playbookPlaybook objectNoOpener, qualification flow, scripts, CTA, and escalation rules
advancedAdvanced objectNoRuntime tuning (endpointing, turn timing)
featuresFeatures objectNoFeature flags (recording, transcription)
post_callPost-call objectNoDefault post-call intelligence config
provider_configobjectNoExplicit routing role config override

Persona Object

FieldTypeDescription
rolestringAgent's role description (e.g., "Insurance sales specialist")
tonestringCommunication tone (e.g., "friendly", "professional", "empathetic")
audiencestringTarget audience description
voiceConfigobjectVoice settings: { "voiceId": "Aoede", "language": "en-US" }
personalitystringPersonality traits and behavioral notes
constraintsstring[]Behavioral constraints (e.g., ["Never discuss competitor pricing"])

Playbook Object

FieldTypeDescription
openerstringOpening message the agent uses to start the conversation
qualificationobjectQualification flow with questions (string[]) and criteria (string[])
scriptsobjectNamed script sections keyed by scenario (e.g., { "objection_handling": "..." })
ctastringPrimary call-to-action the agent drives toward
escalationobjectEscalation rules: { "trigger": "...", "action": "transfer" | "end_call" }
closingstringClosing message or sign-off script

Advanced Object

FieldTypeDefaultDescription
endpointing_thresholdnumber0.5Silence threshold (seconds) before the agent considers the user done speaking
turn_timeoutnumber10Max seconds the agent waits for user input before prompting
interruption_policystring"allow""allow" or "block" — whether the user can interrupt the agent mid-speech

Features Object

FieldTypeDefaultDescription
recordingbooleantrueEnable call recording
transcriptionbooleantrueEnable real-time transcription

Post-call Object

FieldTypeDefaultDescription
summary.enabledbooleantrueGenerate a summary after each call
summary.promptstringCustom instructions for the summary LLM (e.g. "highlight objections")
structured_extraction.json_schemaobjectJSON Schema defining the structured data to extract from the transcript
structured_extraction.promptstringCustom instructions for the extraction LLM (auto-generated from schema if omitted)
evaluation.rubricstringNumbered list of quality criteria for call scoring
model.providerstringLLM provider for post-call analysis: gemini or openai. Defaults to platform setting
model.modelstringSpecific model ID (e.g. gemini-2.5-flash, gpt-4o-mini). Defaults to platform setting

Example — Minimal

bash
curl -X POST https://api.rymi.live/v1/agents \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Support Agent"
  }'

Example — Full Configuration

bash
curl -X POST https://api.rymi.live/v1/agents \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Priya - Sales Specialist",
    "system_prompt": "You are Priya, a friendly insurance sales agent who speaks Hindi with a Delhi accent.",
    "voice": "Aoede",
    "language": "hi-IN",
    "agent_role": "specialist",
    "llm_provider": "gemini",
    "llm_model": "gemini-2.5-flash",
    "persona": {
      "role": "Insurance sales specialist",
      "tone": "friendly",
      "audience": "Hindi-speaking consumers in North India",
      "voiceConfig": { "voiceId": "Aoede", "language": "hi-IN" },
      "personality": "Warm, patient, and persuasive",
      "constraints": ["Never guarantee claim approval", "Always disclose policy terms"]
    },
    "playbook": {
      "opener": "Namaste! Main Priya hoon, Acme Insurance se. Kaise madad kar sakti hoon?",
      "qualification": {
        "questions": ["What type of coverage are you looking for?", "How many family members need coverage?"],
        "criteria": ["Has expressed interest in health insurance", "Is the primary decision maker"]
      },
      "cta": "Book a follow-up call with our advisor",
      "escalation": { "trigger": "Customer requests supervisor", "action": "transfer" },
      "closing": "Thank you for your time! We will send the policy details to your email."
    },
    "advanced": {
      "endpointing_threshold": 0.6,
      "turn_timeout": 12,
      "interruption_policy": "allow"
    },
    "features": {
      "recording": true,
      "transcription": true
    },
    "post_call": {
      "recording": { "enabled": true },
      "summary": { "enabled": true },
      "structured_extraction": {
        "json_schema": {
          "type": "object",
          "properties": {
            "interested_plan": { "type": "string" },
            "family_size": { "type": "integer" },
            "booked_followup": { "type": "boolean" }
          }
        }
      },
      "evaluation": {
        "criteria": "Did the agent successfully qualify the lead and book a follow-up?"
      }
    }
  }'

Response 201

json
{
  "status": "created",
  "id": "550e8400-e29b-41d4-a716-446655440000"
}

Errors

StatusMeaning
400Validation error (missing name, invalid agent_role, etc.)
401Missing or invalid API key
402Insufficient credits

Get Agent

http
GET /v1/agents/:id

Returns the full agent configuration including the compiled prompt.

Path Parameters

ParameterTypeDescription
iduuidAgent ID

Example Request

bash
curl https://api.rymi.live/v1/agents/550e8400-e29b-41d4-a716-446655440000 \
  -H "Authorization: Bearer YOUR_API_KEY"

Response 200

json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Priya - Sales Specialist",
  "voice": "Aoede",
  "language": "hi-IN",
  "persona": {
    "role": "Insurance sales specialist",
    "tone": "friendly",
    "audience": "Hindi-speaking consumers in North India",
    "voiceConfig": { "voiceId": "Aoede", "language": "hi-IN" }
  },
  "playbook": {
    "opener": "Namaste! Main Priya hoon, Acme Insurance se.",
    "cta": "Book a follow-up call with our advisor"
  },
  "compiled_prompt": "You are Priya...",
  "llm_provider": "gemini",
  "llm_model": "gemini-2.5-flash",
  "agent_role": "specialist",
  "provider_config": {
    "active_role": "specialist"
  },
  "post_call": {
    "recording": { "enabled": true },
    "summary": { "enabled": true }
  },
  "created_at": "2026-03-01T10:00:00Z"
}

Errors

StatusMeaning
401Missing or invalid API key
404Agent not found for this tenant

Update Agent

http
PUT /v1/agents/:id

Pass only the fields you want to change. Unspecified fields remain unchanged.

Path Parameters

ParameterTypeDescription
iduuidAgent ID

Request Body

Accepts the same fields as Create Agent. All fields are optional.

Example Request

bash
curl -X PUT https://api.rymi.live/v1/agents/550e8400-e29b-41d4-a716-446655440000 \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "system_prompt": "Updated instructions for handling renewals...",
    "agent_role": "specialist",
    "post_call": {
      "summary": { "enabled": true },
      "structured_extraction": {
        "json_schema": {
          "type": "object",
          "properties": {
            "renewal_confirmed": { "type": "boolean" }
          }
        }
      }
    }
  }'

Response 200

json
{
  "status": "updated"
}

Errors

StatusMeaning
400Validation error
401Missing or invalid API key
404Agent not found for this tenant

Clone Agent

http
POST /v1/agents/:id/clone

Creates a duplicate of an existing agent. The clone gets " (Copy)" appended to its name and is otherwise identical — same persona, playbook, advanced config, post-call settings, and provider stack. The original is unchanged.

Path Parameters

ParameterTypeDescription
iduuidAgent ID to clone

Example Request

bash
curl -X POST https://api.rymi.live/v1/agents/550e8400-e29b-41d4-a716-446655440000/clone \
  -H "Authorization: Bearer YOUR_API_KEY"

Response 201

json
{
  "status": "created",
  "id": "7f3e9a12-b4c1-41f2-a890-556677889900"
}

Errors

StatusMeaning
401Missing or invalid API key
403Agent belongs to a different tenant
404Agent not found

List Agent Calls

http
GET /v1/agents/:id/calls

Returns a paginated list of calls made with a specific agent. Useful for per-agent performance monitoring and debugging.

Path Parameters

ParameterTypeDescription
iduuidAgent ID

Query Parameters

ParameterTypeDefaultDescription
limitinteger50Max records to return (max 200)
offsetinteger0Records to skip
statusstringAll statusesFilter by call status: queued, ringing, in_progress, completed, or failed

Example Request

bash
curl "https://api.rymi.live/v1/agents/550e8400-e29b-41d4-a716-446655440000/calls?limit=20&status=completed" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response 200

json
{
  "calls": [
    {
      "id": "call_abc123",
      "agent_id": "550e8400-e29b-41d4-a716-446655440000",
      "status": "completed",
      "started_at": "2026-03-01T10:00:00Z",
      "ended_at": "2026-03-01T10:05:00Z",
      "bill_duration": 300,
      "total_cost": 0.30
    }
  ],
  "total": 1,
  "offset": 0,
  "limit": 20,
  "agent_id": "550e8400-e29b-41d4-a716-446655440000"
}

Errors

StatusMeaning
401Missing or invalid API key
403Publishable keys cannot access call history, or agent does not belong to you
404Agent not found

Delete Agent

http
DELETE /v1/agents/:id

WARNING

Deleting an agent cascade-deletes all associated number mappings. Active calls using this agent are not affected.

Path Parameters

ParameterTypeDescription
iduuidAgent ID

Example Request

bash
curl -X DELETE https://api.rymi.live/v1/agents/550e8400-e29b-41d4-a716-446655440000 \
  -H "Authorization: Bearer YOUR_API_KEY"

Response 200

json
{
  "status": "deleted",
  "id": "550e8400-e29b-41d4-a716-446655440000"
}

Errors

StatusMeaning
401Missing or invalid API key
404Agent not found for this tenant

Generate Agent Draft

http
POST /v1/agents/generate

Describe your ideal agent in plain English and Rymi generates a draft persona/playbook bundle plus a compiled prompt preview. Studio clients can also send the current draft and opt into clarifying questions before generation.

Request Body

FieldTypeRequiredDefaultDescription
promptstringYesNatural-language description of the agent you want
modestringNocreatecreate for a new agent or edit to refine an existing config
allow_clarifying_questionsbooleanNofalseWhen true, Rymi may return questions instead of generating a weak draft
options.voicestringNoPreferred voice ID or name
options.llm_providerstringNoPreferred LLM provider hint
options.llm_modelstringNoPreferred model hint
current_configobjectNoCurrent agent config snapshot for edit mode

Example — Create Mode

bash
curl -X POST https://api.rymi.live/v1/agents/generate \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A friendly female sales agent who speaks Hindi with a Delhi accent and can sell insurance plans",
    "options": {
      "llm_provider": "gemini",
      "voice": "Aoede"
    },
    "mode": "create",
    "allow_clarifying_questions": false
  }'

Response 200 — Generated

json
{
  "generated": true,
  "draft": {
    "name": "Delhi Insurance Sales Agent",
    "voice": "Aoede",
    "llm_provider": "gemini",
    "persona": {
      "role": "Insurance sales specialist",
      "tone": "friendly",
      "audience": "Hindi-speaking consumers in North India"
    },
    "playbook": {
      "opener": "Namaste! Main aapki insurance needs mein madad kar sakti hoon.",
      "cta": "Book a follow-up with our advisor"
    }
  },
  "compiled_prompt_preview": "You are a friendly female sales agent..."
}

Response 200 — Clarifying Questions

If allow_clarifying_questions is true and the brief is too thin:

json
{
  "generated": false,
  "clarifying_questions": [
    "What primary action should the agent drive toward?",
    "How should we know the call was successful?"
  ],
  "quality_gates": {
    "blockers": ["Primary CTA is missing."],
    "warnings": ["Audience context is thin."]
  }
}

Example — Edit Mode

bash
curl -X POST https://api.rymi.live/v1/agents/generate \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Make the tone more formal and add an escalation rule for angry customers",
    "mode": "edit",
    "current_config": {
      "name": "Support Agent",
      "persona": { "role": "Customer support", "tone": "friendly" },
      "playbook": { "opener": "Hi! How can I help?" }
    }
  }'

Errors

StatusMeaning
400Missing prompt or invalid mode
401Missing or invalid API key
500Generation failed

Configuration Reference

The canonical agent payload shape. Every field is optional on PUT /v1/agents/:id (partial updates). On POST /v1/agents only name is required.

Top-level Fields

FieldTypeDefaultDescription
namestringrequiredDisplay name for the agent
voicestring"Aoede"Voice ID (use GET /v1/agents/llm-options for available voices)
languagestring"en-US"BCP-47 language code
agent_rolestring"operator"One of operator, specialist, executive, concierge
llm_providerstring"gemini"Conversation LLM: gemini, openai, anthropic, sarvam
llm_modelstring"gemini-2.5-flash"Model ID for the conversation LLM
stt_providerstringSpeech-to-text provider override
stt_modelstringSTT model override
tts_providerstringText-to-speech provider override
tts_modelstringTTS model override

persona Object

Who the agent is, how it sounds, and what it knows.

FieldTypeDescription
rolestringJob title (e.g. "Sales Specialist")
audienceDescriptionstringWho the agent talks to
toneOverridestringSpeaking style (e.g. "warm and concise")
companyNamestringCompany name injected into the system prompt
companyWebsitestringCompany website URL
companyDescriptionstringWhat the company does
knowledgeBasestring[]URLs or text passages the agent references
successCriteriastring[]What a successful call looks like
voiceConfig.bargeInEnabledbooleanWhether the caller can interrupt mid-sentence
callerPersonasobject[]Caller type variants: { type, approach }

playbook Object

Conversation flow, objections, scripts, and call-to-action.

FieldTypeDescription
openerstringFirst thing the agent says
qualificationFlowobject[]Questions and what to listen for: { question, listensFor }
requiredSlotsobject[]Data to collect: { name, description, required }
objectionHandlersobject[]How to handle pushback: { trigger, response }
scriptsobject[]Canned responses for specific situations: { title, when, content }
closingCTAstringPrimary call-to-action at end of call
fallbackCTAstringFallback if primary CTA fails
escalationRulestringWhen/how to escalate to a human

advanced Object

Runtime, speech, and safety configuration.

FieldTypeDefaultDescription
maxCallDurationnumber1800Max call length in seconds
maxTurnLengthnumber60Max agent speaking time per turn (seconds)
silencePromptDelaynumber8Seconds of silence before nudging the caller
postSilenceHangupnumber15Seconds of silence before hanging up
replyDelaynumber0Milliseconds to pause before responding
startSpeakingPhrasingstring"agent_greets"agent_greets or wait_for_user
startSpeakingThresholdnumberVAD sensitivity for when agent starts speaking
stopSpeakingThresholdnumberVAD sensitivity for when caller stops speaking
resumeAfterInterruptionbooleantrueResume interrupted sentence after caller stops
smartEndpointingbooleantrueAI-powered end-of-turn detection
waitAfterSentencenumberms to wait after a sentence ends
waitAfterNoPunctuationnumberms to wait when no sentence-ending punctuation
waitAfterNumbersnumberms to wait after numbers (they often continue)
stt_confidence_thresholdnumberMinimum confidence to accept a transcription
stt_numeral_formattingbooleantrueFormat numbers as numerals in transcript
stt_profanity_filterbooleanfalseFilter profanity from transcript
stt_keywordsstringComma-separated keywords to boost STT accuracy
offLimitsTopicsstringTopics the agent must never discuss
prohibitedClaimsstringClaims the agent must never make

features Object

FieldTypeDefaultDescription
recording_enabledbooleanfalseRecord both sides of each call
transcription_enabledbooleantrueTranscribe and store each call
require_consentbooleantrueAnnounce recording at call start

post_call Object

FieldTypeDefaultDescription
summary.enabledbooleantrueGenerate a call summary
summary.promptstringCustom summary instructions
structured_extraction.json_schemaobjectJSON Schema for data extraction
structured_extraction.promptstringCustom extraction instructions (auto-generated if omitted)
evaluation.rubricstringNumbered scoring criteria
model.providerstringgemini or openai for post-call LLM
model.modelstringModel ID for post-call LLM

Validate Publish

POST /v1/agents/validate-publish

Check whether an agent is ready to go live. Returns a validation report without persisting any changes.

Body

FieldTypeDescription
agent_iduuidOptional. Merge validation with a persisted agent's config
namestringAgent name to validate
voicestringVoice ID to validate
personaobjectPersona config
playbookobjectPlaybook config

Example

bash
curl -X POST https://api.rymi.live/v1/agents/validate-publish \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"agent_id": "550e8400-e29b-41d4-a716-446655440000"}'

Apply Changes

POST /v1/agents/apply-changes

Validates and resolves a flat key/value change-set against the AgentConfig field registry. Enforces field types, edit-mode blocklist, and implies rules. Does not persist — follow up with PUT /v1/agents/:id.

Body

FieldTypeDescription
currentConfigobjectThe agent's current flat config
changesarray[{key, value}] field changes to apply
modestring"create" or "edit"
lenientbooleanSkip unknown-field hard-fail (not recommended)

Example

bash
curl -X POST https://api.rymi.live/v1/agents/apply-changes \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "currentConfig": {"name": "Support", "voice": "Aoede"},
    "changes": [{"key": "voice", "value": "Charon"}],
    "mode": "edit"
  }'

Response

json
{
  "valid": true,
  "config": { "name": "Support", "voice": "Charon" },
  "applied": [{ "key": "voice", "value": "Charon" }]
}

Enrich Company

POST /v1/agents/enrich-company

Uses AI with Google Search grounding to generate a company description from a website URL, suitable for an agent's persona.

Body

FieldTypeDescription
companyNamestringCompany name
websiteUrlstringCompany website URL

Example

bash
curl -X POST https://api.rymi.live/v1/agents/enrich-company \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"companyName": "Acme Corp", "websiteUrl": "https://acme.example.com"}'

Response

json
{
  "enriched": true,
  "companyDescription": "Acme Corp is a leading provider of...",
  "knowledgeBase": []
}