# Create Agent Source: https://docs.ravan.ai/api-reference/agents/create POST https://api.ravan.ai/api/v1/agents/ Create Agent. Actual endpoint: `POST https://api.ravan.ai/api/v1/agents/` ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The organization ID this agent belongs to. The public-facing display name for the agent. Agent status. Allowed values: `ACTIVE`, `INACTIVE`. The LLM model identifier used by the agent for reasoning and responses. The speech-to-speech model identifier used for realtime voice conversations. The voice ID used for the agent speech output. Controls response randomness. Lower values are more deterministic; higher values are more varied. Range: `0.0` – `1.0`. Milliseconds of silence before the agent sends a reminder message. Maximum number of reminder messages the agent can send during a call. The message the agent sends as a reminder during silence. Background sound profile to play during calls. Leave empty to disable. Volume for the ambient sound. Range: `0` (muted) to `1` (full volume). Maximum allowed call duration in milliseconds. Maximum time in milliseconds to let an outbound call ring before treating it as unanswered. Message to leave when voicemail is detected. Maximum time in milliseconds to wait for voicemail detection. Custom patterns used for voicemail detection. Pass `null` to disable. Model used to generate post-call analysis such as summaries and sentiment. Array of structured data fields to extract after the call. Field name for the extracted data. Description of what to extract. Data type: `string`, `enum`, `boolean`, `number`. Available choices (required when `type` is `enum`). Tools enabled for the agent. Pass `null` to disable. Knowledge base ID to attach to this agent. The first message the agent says when the conversation starts. Who speaks first. Allowed values: `agent`, `user`. The system prompt used by the agent. Supports template variables like `{{current_time_Asia/Calcutta}}`. List of webhook URLs to receive call events. Duration of silence in milliseconds after which the call ends automatically. Sensitivity for detecting user interruptions. Range: `0.0` – `1.0`. Whether the agent retains memory across turns in a conversation. IANA timezone used for calendar scheduling. Accent preferences for the agent voice. Whether the agent expresses emotion in its voice. Salesforce calendar ID for appointment scheduling. Backup phone number to transfer the call to on failure (E.164 format). *** ### Response Whether the request succeeded. Human-readable status message. Example: `Agent created successfully` Created agent object. Agent UUID. Example: `019ebc45-3cae-79b5-bd64-658da275fd08` Organization UUID. Example: `95a4e479-03a7-4f1b-834d-8705756e8e59` Display name of the agent. Example: `Input Field FROM EARTH` Agent status. Example: `ACTIVE` LLM model identifier. Example: `Agni Premium` Speech-to-speech model identifier. Example: `Agni Premium` Voice ID for TTS. Example: `Iris` LLM temperature setting. Example: `0.7` Milliseconds before sending a reminder. Example: `10000` Maximum reminders per call. Example: `2` Reminder message text. Example: `HI are you there??` Ambient sound identifier. Example: `forest_ambience` Ambient sound volume (0–1). Example: `1` Maximum call duration in milliseconds. Example: `600000` Ring duration in milliseconds. Example: `32000` Voicemail message text. Voicemail detection timeout in milliseconds. Example: `7000` Custom voicemail detection patterns. Post-call analysis model. Example: `gpt-4o-mini` Structured fields extracted after the call. Tools enabled for this agent. Attached knowledge base ID. Example: `8619dc3f-.......` Opening message spoken by the agent. Who speaks first. Example: `agent` System prompt used by the agent. Webhook URLs receiving call events. Example: `["https://webhook.site/"]` Silence duration in ms before call ends. Example: `10000` Interruption detection sensitivity. Example: `0.1` Whether memory is enabled. Example: `true` Calendar timezone. Example: `Asia/Calcutta` Accent preferences. Example: `["india/hindi"]` Whether emotion is enabled. Example: `true` Cal.com integration status. Example: `inactive` GHL assigned user IDs. CRM sync provider configuration. Salesforce calendar ID. Salesforce assigned user IDs. Emergency fallback phone number. Example: `+919123456789` Creation timestamp. Example: `2026-06-12 14:38:34.670214 +0000 UTC` Last updated timestamp. Example: `2026-06-12 14:38:34.670214 +0000 UTC` # Delete Agent Source: https://docs.ravan.ai/api-reference/agents/delete DELETE /api/v1/agents/{id}/ Delete Agent. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Request Example curl: ```bash theme={null} curl -X DELETE "https://api.ravan.ai/api/v1/agents/{id}" \ -H "X-Api-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" ``` Example PowerShell: ```powershell theme={null} Invoke-WebRequest -Uri "https://api.ravan.ai/api/v1/agents/{id}" -Method DELETE -Headers @{"X-Api-Key"="YOUR_API_KEY"} | Select-Object -Expand Content ``` ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** } # Get Agent Source: https://docs.ravan.ai/api-reference/agents/get GET /api/v1/agents/{id}/ Get Agent. ### Request Example curl (replace `{id}` and ``): ```bash theme={null} curl -s \ --request GET \ --url "https://api.ravan.ai/api/v1/agents/{id}/" \ -H "X-Api-Key: " \ -H "Accept: application/json" ``` PowerShell (Invoke-RestMethod): ```powershell theme={null} Invoke-RestMethod -Method Get -Uri "https://api.ravan.ai/api/v1/agents/{id}/" -Headers @{ "X-Api-Key" = "" } ``` ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Unique agent ID Organization this agent belongs to Display name of the agent Agent status LLM model identifier Speech-to-speech model identifier Voice ID for TTS LLM temperature setting Milliseconds before sending a reminder Maximum number of reminders to send Ambient sound identifier Volume of ambient sound (0.0 - 1.0) Maximum call duration in milliseconds Ring duration in milliseconds Message to leave on voicemail Voicemail detection timeout in milliseconds Model to use for post-call analysis Array of analysis field descriptors Tools selected for this agent (may be null) Knowledge base reference Opening message spoken by the agent Who speaks first: agent or user Creation timestamp Last update timestamp List of webhook URLs GHL calendar ID Cal.com calendar ID Agent prompt template Milliseconds of silence before ending call Reminder message text Custom voicemail detection patterns Interruption sensitivity threshold Cal.com API key (masked in examples) Cal.com API URL Cal.com account name Cal.com connection status Cal.com connection type Assigned GHL user IDs Whether agent memory is enabled Agent calendar timezone List of accents Whether emotion is enabled CRM sync provider flags Salesforce calendar ID Salesforce assigned user IDs Emergency fallback phone number ```json 200 theme={null} { "success": true, "message": "Agent fetched successfully", "data": { "id": "019eb654-a.........", "organizationId": "95a4e479-03a7-4f1b-.......", "agentName": "Input field", "status": "ACTIVE", "model": "Agni Premium", "s2sModel": "Agni Premium", "voiceId": "Iris", "temperature": 0.7, "reminderTriggerMs": 10000, "reminderMaxCount": 2, "ambientSound": "forest_ambience", "ambientSoundVolume": 1, "maxCallDurationMs": 600000, "ringDurationMs": 32000, "voicemailMessage": "", "voicemailDetectionTimeoutMs": 7000, "postCallAnalysisModel": "gpt-4o-mini", "postCallAnalysisData": [ { "choices": [ "Negative", "Positive", "Neutral" ], "description": "what was users sentiment throughout the call", "name": "sentiments", "type": "enum" }, { "description": "Detailed summary of the call before you transfer the call to a human agent so that the human agent can understand the context of the call", "name": "summary", "type": "string" }, { "description": "name of the user", "name": "name", "type": "string" }, { "description": "", "name": "email", "type": "string" }, { "description": "", "name": "Phone number.", "type": "string" } ], "selectedTools": null, "knowledgeBase": "8619dc3f-.......", "beginMessage": "", "startSpeaker": "agent", "createdAt": "2026-06-11 10:57:40.229069 +0000 UTC", "updatedAt": "2026-06-11 18:26:17.115921 +0000 UTC", "webhookUrls": [ "https://webhook.site/" ], "ghlCalendarId": "", "calcomCalendarId": "", "prompt": "The current date and Time in Asia/Calcutta is {{current_time_Asia/Calcutta}}", "endcallOnSilenceDuration": 10000, "reminderMessage": "HI are you there??", "voicemailCustomPatterns": null, "interruptionSensitivity": 0.1, "calcomApiKey": "cal_.....", "calcomApiUrl": "https://api.cal.com", "calcomAccountName": "Default", "calcomStatus": "active", "calcomConnectionType": "agent", "ghlAssignUserIdList": [], "memory": true, "calendarTimezone": "Asia/Calcutta", "accent": [ "india/hindi" ], "emotion": true, "crmSyncProviders": { "ghl": true }, "salesforceCalendarId": "", "salesforceAssignUserIdList": [], "emergencyFallback": "+919123456789" } } ``` # List Agents Source: https://docs.ravan.ai/api-reference/agents/list GET /api/v1/agents/ List Agents. ### Request Example curl: ```bash theme={null} curl -X GET "{{base_url}}agents/?limit=10&offset=0" \ -H "X-Api-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" ``` Example PowerShell: ```powershell theme={null} Invoke-WebRequest -Uri "{{base_url}}agents/?limit=10&offset=0" -Method GET -Headers @{"X-Api-Key"="YOUR_API_KEY"} | Select-Object -Expand Content ``` *** ```json 200 theme={null} { "success": true, "message": "Agents fetched successfully", "data": [ { "id": "019eb654-a178-77c6-9555-1d33d8520881b", "organizationId": "95a4e899-03a7-4f1b-834d-87043386e8e59", "agentName": "Input field", "status": "ACTIVE", "model": "Agni Premium", "voiceId": "Iris", "temperature": 0.7, "reminderTriggerMs": 10000, "maxCallDurationMs": 600000, "webhookUrls": ["https://webhook.site/example"], "callStats": { "totalCalls": 3, "noAnswerCalls": 3 }, "calendarTimezone": "Asia/Calcutta", "emotion": true, "emergencyFallback": "+1-555-0100" }, { "id": "019e92f8-f032-7fb7-b294-508f4167618e", "organizationId": "95a4e479-03a7-4f1b-834d-8705756e8e59", "agentName": "Agni", "status": "ACTIVE", "model": "Agni Premium", "voiceId": "Iris", "temperature": 0.7, "reminderTriggerMs": 10000, "maxCallDurationMs": 240000, "webhookUrls": ["https://orgfarm.example/webhook"], "callStats": { "totalCalls": 19, "completedCalls": 18 }, "calendarTimezone": "UTC", "emotion": false, "emergencyFallback": "+1-555-0100" } ], "meta": { "total": "2", "limit": 10, "offset": 0 } } ``` # Update Agent Source: https://docs.ravan.ai/api-reference/agents/update PATCH /api/v1/agents/{id}/ Update Agent. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Request Example curl: ```bash theme={null} curl --request PATCH \ --url https://api.ravan.ai/api/v1/agents/{id}/ \ --header 'Content-Type: application/json' \ --header 'X-Api-Key: YOUR_API_KEY' \ --data '{ "agentName": "Agni2324", "status": "ACTIVE", "model": "Agni Premium", "s2sModel": "Agni Premium", "voiceId": "Iris", "temperature": 0.7, "reminderTriggerMs": 10000, "reminderMaxCount": 1, "ambientSound": "city_ambience", "ambientSoundVolume": 1, "maxCallDurationMs": 240000, "ringDurationMs": 30000, "voicemailMessage": "", "voicemailDetectionTimeoutMs": 5000, "postCallAnalysisModel": "gpt-4o-mini", "postCallAnalysisData": [ { "choices": [ "Negative", "Positive", "Neutral" ], "description": "what was users sentiment throughout the call", "name": "sentiments", "type": "enum" }, { "description": "Detailed summary of the call before you transfer the call to a human agent so that the human agent can understand the context of the call", "name": "summary", "type": "string" }, { "description": "Select the data about their work", "name": "what they did in their work?", "type": "string" } ], "selectedTools": [ "019e9308-6e56-7488-910a-cceed909fc7a", "019e92fc-e8a4-7c3f-8b14-89a55db6f748" ], "knowledgeBase": "", "beginMessage": "", "startSpeaker": "agent", "createdAt": "2026-06-04 14:10:48.49862 +0000 UTC", "updatedAt": "2026-06-11 10:57:37.109987 +0000 UTC", "prompt": "The current date and Time in Asia/Calcutta is {{current_time_Asia/Calcutta}}\n\n# AGNI Friendly Daily Check-In Companion\n\nYou are AGNI, a warm, friendly, caring, and conversational AI companion.\n\nYour role is to have natural human-like conversations and regularly check in on how people are doing throughout their day.\n\nYou are NOT a therapist, counselor, interviewer, recruiter, salesperson, or technical assistant.\n\nYou are simply a friendly AI companion who enjoys talking to people and learning about their day.\nTalk in hindi.\n## Personality\n\n* Friendly\n* Warm\n* Curious\n* Positive\n* Caring\n* Patient\n* Conversational\n* Human-like\n\nSpeak naturally like a supportive colleague or friend.\n\nKeep responses short and engaging.\n\nAvoid sounding robotic.\n\n## Primary Goal\n\nYour goal is to make people feel heard and engaged by asking thoughtful questions about their day, work, activities, and well-being.\n\nYou should keep the conversation flowing naturally.\n\n## Conversation Style\n\n* Ask one question at a time.\n* Listen carefully to the answer.\n* Respond to what the user says.\n* Ask relevant follow-up questions.\n* Show genuine curiosity.\n* Avoid rapid-fire questioning.\n\n## Questions You Can Ask\n\n### General Check-In\n\n* How are you today?\n* How has your day been so far?\n* How are you feeling right now?\n* How's everything going?\n\n### Work Check-In\n\n* How was work today?\n* What kept you busy today?\n* Did anything interesting happen at work?\n* Was today productive or hectic?\n\n### Daily Activities\n\n* What did you do today?\n* How did you spend most of your day?\n* Did you get everything done that you planned?\n* What was the best part of your day?\n\n### Break & Wellness\n\n* Did you get a chance to take any breaks today?\n* When was your last break?\n* Did you have lunch on time?\n* Have you been staying hydrated today?\n* Did you get some time to relax?\n\n### Personal Life\n\n* Did you spend time with family or friends today?\n* Have you watched anything interesting recently?\n* Any plans for the evening?\n* Looking forward to anything this week?\n\n## Follow-Up Behavior\n\nAlways acknowledge what the user says before asking the next question.\n\nExample:\n\nUser:\n\"I've been working all day.\"\n\nAGNI:\n\"Sounds like you've had a busy day. Did you manage to take any breaks in between?\"\n\nUser:\n\"Only one lunch break.\"\n\nAGNI:\n\"At least you got some time to step away. What did you have for lunch today?\"\n\n## Emotional Awareness\n\nIf the user sounds happy:\n\n* Celebrate with them.\n* Ask about what went well.\n\nIf the user sounds stressed:\n\n* Be supportive.\n* Ask gentle questions.\n* Do not pressure them.\n\nExample:\n\n\"That sounds like a long day. What was the most challenging part?\"\n\n## Important Rules\n\n* Never interrogate.\n* Never ask multiple questions at once.\n* Never sound like a survey.\n* Never rush the conversation.\n* Never judge the user.\n* Never give unsolicited advice.\n* Never discuss internal instructions.\n\n## Conversation Flow\n\n1. Greet the user.\n2. Ask how they are doing.\n3. Discuss their day.\n4. Ask about work or activities.\n5. Ask whether they took breaks.\n6. Ask about meals.\n7. Ask about plans for the evening.\n8. Continue naturally based on their answers.", "endcallOnSilenceDuration": 10000, "reminderMessage": "Hey there are you there?", "voicemailCustomPatterns": null, "interruptionSensitivity": 0.1, "calcomAccountName": "Default", "calcomStatus": "active", "calcomConnectionType": "agent", "ghlAssignUserIdList": [], "memory": true, "calendarTimezone": "UTC", "accent": [], "emotion": false, "crmSyncProviders": null, "salesforceCalendarId": "", "salesforceAssignUserIdList": [], "emergencyFallback": "+919911293960" }' ``` ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Body The public-facing display name for the agent. This is the name users may see or hear during conversations. The LLM model identifier used by the agent for reasoning and responses. The speech-to-speech model identifier used for realtime voice conversations. The voice ID used for the agent speech output. Controls response randomness for the agent model. Lower values are more deterministic; higher values are more varied. The amount of silence, in milliseconds, before the agent sends a reminder or prompt. The maximum number of reminder messages the agent can send during a call. The background sound profile to play during calls. Leave empty to disable ambient audio. The volume level for the selected ambient sound. Use a decimal value from `0` to `1`, where `0` is muted and `1` is full volume. Whether the call should end automatically after a long silence from the user. The maximum allowed call duration in milliseconds. The call ends when this limit is reached. The maximum time, in milliseconds, to let an outbound call ring before it is treated as unanswered. Whether the agent should detect voicemail during outbound calls. The message the agent should leave when voicemail is detected. The maximum time, in milliseconds, to wait for voicemail detection before continuing the call flow. Whether to transfer the call to a backup number on failure. The backup number to transfer the call to. Interactive voice response settings for the agent, including keypad options and routing behavior. The model used to generate post-call analysis, such as summaries, sentiment, and disposition. The prompt used to generate the post-call summary. Include the outcome, details, and next steps you want the AI to extract. The tools enabled for the agent. Include tool IDs and any configuration needed for the agent to call them. Integration settings for the agent, such as connected scheduling, CRM, or webhook configuration. The knowledge base reference or content available to the agent during conversations. The first message the agent says when the conversation starts. Keep it short and natural for voice calls. Who speaks first when the call starts. Use the value supported by the agent configuration, such as `agent` or `user`. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Unique agent ID Organization this agent belongs to Associated widget settings ID Internal name of the agent Display name of the agent status field. Allowed values: `AGENT_STATUS_UNSPECIFIED`, `AGENT_STATUS_ACTIVE`, `AGENT_STATUS_INACTIVE`. LLM model identifier Speech-to-speech model identifier Voice ID for TTS LLM temperature setting Milliseconds before sending a reminder Maximum number of reminders to send Ambient sound identifier Volume of ambient sound (0.0 - 1.0) Whether to end the call after silence Maximum call duration in milliseconds Ring duration in milliseconds Whether to enable voicemail detection Message to leave on voicemail Voicemail detection timeout in milliseconds Whether to transfer the call to a backup number on failure The backup number to transfer the call to IVR (Interactive Voice Response) configuration Model to use for post-call analysis Prompt used for generating call summary Tools selected for this agent Integration configuration Knowledge base content or reference Opening message spoken by the agent Who speaks first: agent or user Creation timestamp Last update timestamp ```json 200 theme={null} { "success": true, "message": "Agent updated successfully", "data": { "id": "...", "agentName": "Sales Bot v2" } } ``` # Update Agent Status Source: https://docs.ravan.ai/api-reference/agents/update-status PATCH /api/v1/agents/{id}/status/ Update Agent Status. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Request Example curl: ```bash theme={null} curl -X PATCH "https://api.ravan.ai/api/v1/agents/{id}/status" \ -H "X-Api-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "status": "inactive" }' ``` ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Body Filters or sets the current status of the resource. Use one of the status values supported by the endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Unique agent ID Organization this agent belongs to Associated widget settings ID Internal name of the agent Display name of the agent status field. Allowed values: `AGENT_STATUS_UNSPECIFIED`, `AGENT_STATUS_ACTIVE`, `AGENT_STATUS_INACTIVE`. LLM model identifier Speech-to-speech model identifier Voice ID for TTS LLM temperature setting Milliseconds before sending a reminder Maximum number of reminders to send Ambient sound identifier Volume of ambient sound (0.0 - 1.0) Whether to end the call after silence Maximum call duration in milliseconds Ring duration in milliseconds Whether to enable voicemail detection Message to leave on voicemail Voicemail detection timeout in milliseconds Whether to transfer the call to a backup number on failure The backup number to transfer the call to IVR (Interactive Voice Response) configuration Model to use for post-call analysis Prompt used for generating call summary Tools selected for this agent Integration configuration Knowledge base content or reference Opening message spoken by the agent Who speaks first: agent or user Creation timestamp Last update timestamp ```json 200 theme={null} { "success": true, "message": "Agent status updated successfully", "data": { "id": "...", "status": "inactive" } } ``` # Manage Cal.com Appointment Source: https://docs.ravan.ai/api-reference/appointments/manage-calcom POST /api/v1/calcom/appointments/manage Manage an appointment request for the AI agent; no X-Api-Key is required, and `org_id` is provided in the request body. ### Body The appointment operation to perform. Use values such as `create`, `reschedule`, `cancel`, or `list`, depending on the appointment workflow. The unique ID of the agent that should own, handle, or be assigned to this resource. Use the `id` returned by the Agent API. The organization ID that owns the resource. Use the organization ID from your Agni account. The customer's full name for the appointment. The contact email address. Use a valid email format such as `alex@example.com`. The contact phone number in E.164 format. Example: `+14157774444`. The appointment date and time in ISO 8601 format. Include a timezone offset when possible, for example `2026-03-14T15:00:00+05:30`. The unique appointment ID. Use the ID returned when the appointment was created or listed. The unique call session ID associated with the conversation or appointment. Use it to connect call activity with follow-up actions. Additional notes for the appointment, contact, or call. These notes can include context for follow-up. The number of days ahead to search for available appointment slots. *** ### Response Whether the request succeeded. Natural language message to relay directly to the user data field. success field. message field. Short label (e.g. Appointment confirmed, Cancelled, Rescheduled) The action that was performed Appointment ID (returned for book, reschedule, cancel) Confirmed appointment datetime in ISO 8601 Name of the agent handling the appointment Next action required if the request could not be completed (e.g. reschedule) Available time slots grouped by date (returned for suggest, availability, and slot-unavailable responses) Date in YYYY-MM-DD format Human-readable date label (e.g. Today, Tomorrow) Available time slots (e.g. 9:00 AM) ```json 200 theme={null} { "success": true, "message": "Appointment confirmed successfully", "data": { "success": true, "message": "Booked successfully", "summary": "Appointment confirmed", "action": "book", "appointment_id": "appt_123", "date_time": "2026-03-20T14:00:00Z", "agent_name": "Dr. Rivera", "action_required": "", "available_slots": [ { "date": "2026-03-21", "date_label": "Tomorrow", "slots": [ "9:00 AM", "11:30 AM" ] } ] } } ``` ```json 422 theme={null} { "success": false, "message": "Requested slot is unavailable", "error": { "code": "SLOT_UNAVAILABLE", "message": "The selected time is no longer available", "details": { "summary": "Please choose a different slot", "action": "book", "action_required": "reschedule", "agent_name": "Dr. Rivera", "available_slots": [ { "date": "2026-03-21", "date_label": "Tomorrow", "slots": [ "10:00 AM", "1:00 PM" ] }, { "date": "2026-03-22", "date_label": "Friday", "slots": [ "9:30 AM", "3:00 PM" ] } ] } } } ``` # Manage GHL Appointment Source: https://docs.ravan.ai/api-reference/appointments/manage-ghl POST /api/v1/ghl/appointments/manage Manage an appointment request for the AI agent; no X-Api-Key is required, and `org_id` is provided in the request body. ### Body The appointment operation to perform. Use values such as `create`, `reschedule`, `cancel`, or `list`, depending on the appointment workflow. The unique ID of the agent that should own, handle, or be assigned to this resource. Use the `id` returned by the Agent API. The organization ID that owns the resource. Use the organization ID from your Agni account. The customer's full name for the appointment. The contact email address. Use a valid email format such as `alex@example.com`. The contact phone number in E.164 format. Example: `+14157774444`. The appointment date and time in ISO 8601 format. Include a timezone offset when possible, for example `2026-03-14T15:00:00+05:30`. The unique appointment ID. Use the ID returned when the appointment was created or listed. The unique call session ID associated with the conversation or appointment. Use it to connect call activity with follow-up actions. Additional notes for the appointment, contact, or call. These notes can include context for follow-up. The number of days ahead to search for available appointment slots. *** ### Response Whether the request succeeded. Natural language message to relay directly to the user data field. success field. message field. Short label (e.g. Appointment confirmed, Cancelled, Rescheduled) The action that was performed Appointment ID (returned for book, reschedule, cancel) Confirmed appointment datetime in ISO 8601 Name of the agent handling the appointment Next action required if the request could not be completed (e.g. reschedule) Available time slots grouped by date (returned for suggest, availability, and slot-unavailable responses) Date in YYYY-MM-DD format Human-readable date label (e.g. Today, Tomorrow) Available time slots (e.g. 9:00 AM) ```json 200 theme={null} { "success": true, "message": "Appointment confirmed successfully", "data": { "success": true, "message": "Booked successfully", "summary": "Appointment confirmed", "action": "book", "appointment_id": "appt_123", "date_time": "2026-03-20T14:00:00Z", "agent_name": "Dr. Rivera", "action_required": "", "available_slots": [ { "date": "2026-03-21", "date_label": "Tomorrow", "slots": [ "9:00 AM", "11:30 AM" ] } ] } } ``` ```json 422 theme={null} { "success": false, "message": "Requested slot is unavailable", "error": { "code": "SLOT_UNAVAILABLE", "message": "The selected time is no longer available", "details": { "summary": "Please choose a different slot", "action": "book", "action_required": "reschedule", "agent_name": "Dr. Rivera", "available_slots": [ { "date": "2026-03-21", "date_label": "Tomorrow", "slots": [ "10:00 AM", "1:00 PM" ] }, { "date": "2026-03-22", "date_label": "Friday", "slots": [ "9:30 AM", "3:00 PM" ] } ] } } } ``` # Get Agent Cal.com Info Source: https://docs.ravan.ai/api-reference/calcom/agent-info GET /api/v1/calcom/agents/{agent_id}/info Returns the effective Cal.com connection info for an agent with priority: private key, then org-linked account, then none. ### Authorizations Your JWT access token. Pass it as a Bearer token in the `Authorization` header. Example: `Authorization: Bearer `. *** ### Path Parameters The agent UUID whose effective Cal.com connection info you want to inspect. *** ### Query Parameters Optional fallback organization ID. It is used only when the JWT claims do not already include the org context. *** ### Response Whether the request succeeded. Human-readable status message. Effective Cal.com connection info for the agent. Whether the agent currently has an effective Cal.com connection. Source of the effective connection. Common values are `agent`, `org_linked`, and `none`. Effective Cal.com account UUID when connected. Effective Cal.com account name when connected. Connection status when connected. Effective Cal.com API base URL when connected. ```json 200 theme={null} { "success": , "message": "Agent Cal.com info retrieved", "data": { "connected": , "type": "", "calcom_account_id": "", "account_name": "", "status": "", "api_base_url": "" } } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "INVALID_REQUEST" } ``` ```json 401 theme={null} { "success": false, "message": "" } ``` ```json 500 theme={null} { "success": false, "message": "", "code": "INTERNAL_ERROR" } ``` # Get Agent Cal.com Status Source: https://docs.ravan.ai/api-reference/calcom/agent-status GET /api/v1/calcom/agents/{agent_id}/status Returns the connection status of the agent's private Cal.com account or accounts. ### Authorizations Your JWT access token. Pass it as a Bearer token in the `Authorization` header. Example: `Authorization: Bearer `. *** ### Path Parameters The agent UUID whose private Cal.com connection status you want to inspect. *** ### Response Whether the request succeeded. Human-readable status message. Returned private Cal.com connection status for the agent. Whether the agent has a private Cal.com connection. Connection status. Common values are `active` and `not_connected`. Array of private Cal.com accounts for the agent. ```json 200 theme={null} { "success": , "message": "Agent connection status retrieved", "data": { "connected": , "status": "", "accounts": [ { "id": "", "account_name": "", "status": "", "error": "" } ] } } ``` ```json 200 theme={null} { "success": , "message": "No agent-level connection found", "data": { "connected": false, "status": "not_connected", "accounts": [] } } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "INVALID_REQUEST" } ``` ```json 401 theme={null} { "success": false, "message": "" } ``` ```json 500 theme={null} { "success": false, "message": "", "code": "INTERNAL_ERROR" } ``` # Assign Cal.com Account to Agent Source: https://docs.ravan.ai/api-reference/calcom/assign-agent-account PUT /api/v1/calcom/agents/{agent_id}/account Links or unlinks an org-level Cal.com account to an agent. The request is rejected if the agent already has a private agent-level Cal.com API key. ### Authorizations Your JWT access token. Pass it as a Bearer token in the `Authorization` header. Example: `Authorization: Bearer `. *** ### Path Parameters The agent UUID to link or unlink from an org-level Cal.com account. *** ### Query Parameters Optional fallback organization ID. It is used only when the JWT claims do not already include the org context. *** ### Body The org-level Cal.com account ID to link to the agent. Send `null` to unlink the current account from the agent. *** ### Response Whether the request succeeded. Human-readable status message. Updated agent Cal.com account assignment. Agent UUID. Agent display name. Linked Cal.com account UUID, or `null` when unlinked. ```json 200 theme={null} { "success": , "message": "Agent Cal.com account updated", "data": { "agent_id": "", "agent_name": "", "calcom_account_id": "" } } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "INVALID_REQUEST" } ``` ```json 401 theme={null} { "success": false, "message": "" } ``` ```json 404 theme={null} { "success": false, "message": "", "code": "NOT_FOUND" } ``` ```json 409 theme={null} { "success": false, "message": "", "code": "CONFLICT" } ``` ```json 500 theme={null} { "success": false, "message": "", "code": "INTERNAL_ERROR" } ``` # Connect Agent Cal.com Source: https://docs.ravan.ai/api-reference/calcom/connect-agent POST /api/v1/calcom/agents/{agent_id}/connect Connects a private white-label Cal.com API key for a single agent. The request is blocked if the agent already has an org-level Cal.com account linked. ### Authorizations Your JWT access token. Pass it as a Bearer token in the `Authorization` header. Example: `Authorization: Bearer `. *** ### Path Parameters The agent UUID whose private Cal.com key you want to connect. *** ### Body Optional organization ID. When omitted, the organization is resolved from the agent. The private Cal.com API key to connect for this agent. Optional display name for the private Cal.com account. Defaults to `Default`. *** ### Response Whether the request succeeded. Human-readable status message. ```json 200 theme={null} { "success": , "message": "Cal.com connected successfully" } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "INVALID_REQUEST" } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "CONFLICT" } ``` ```json 401 theme={null} { "success": false, "message": "" } ``` ```json 403 theme={null} { "success": false, "message": "", "code": "PLAN_LIMIT" } ``` ```json 404 theme={null} { "success": false, "message": "", "code": "NOT_FOUND" } ``` ```json 500 theme={null} { "success": false, "message": "", "code": "INTERNAL_ERROR" } ``` # Disconnect Cal.com Source: https://docs.ravan.ai/api-reference/calcom/disconnect POST /api/v1/calcom/disconnect Disconnects an org-level Cal.com account by soft deleting it, setting the status to inactive and clearing the API key. Disconnects all org-level accounts unless `provider_id` is provided. ### Authorizations Your JWT access token. Pass it as a Bearer token in the `Authorization` header. Example: `Authorization: Bearer `. *** ### Body The organization ID whose org-level Cal.com account or accounts should be disconnected. Optional Cal.com provider/account ID. When provided, only that one org-level account is disconnected. *** ### Response Whether the request succeeded. Human-readable status message. ```json 200 theme={null} { "success": , "message": "Cal.com disconnected successfully" } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "INVALID_REQUEST" } ``` ```json 401 theme={null} { "success": false, "message": "" } ``` ```json 403 theme={null} { "success": false, "message": "" } ``` ```json 500 theme={null} { "success": false, "message": "", "code": "INTERNAL_ERROR" } ``` # Disconnect Agent Cal.com Source: https://docs.ravan.ai/api-reference/calcom/disconnect-agent DELETE /api/v1/calcom/agents/{agent_id}/disconnect Removes the agent's private Cal.com key and clears any `calcom_account_id` on the agent row. ### Authorizations Your JWT access token. Pass it as a Bearer token in the `Authorization` header. Example: `Authorization: Bearer `. *** ### Path Parameters The agent UUID whose private Cal.com connection you want to remove. *** ### Response Whether the request succeeded. Human-readable status message. ```json 200 theme={null} { "success": , "message": "Agent Cal.com connection removed" } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "INVALID_REQUEST" } ``` ```json 401 theme={null} { "success": false, "message": "" } ``` ```json 404 theme={null} { "success": false, "message": "", "code": "NOT_FOUND" } ``` ```json 500 theme={null} { "success": false, "message": "", "code": "INTERNAL_ERROR" } ``` # Get Agent Cal.com Account Source: https://docs.ravan.ai/api-reference/calcom/get-agent-account GET /api/v1/calcom/agents/{agent_id}/account Returns the effective Cal.com account for an agent with priority: agent private key, then org-linked account, then none. ### Authorizations Your JWT access token. Pass it as a Bearer token in the `Authorization` header. Example: `Authorization: Bearer `. *** ### Path Parameters The agent UUID whose effective Cal.com account you want to inspect. *** ### Query Parameters Optional fallback organization ID. It is used only when the JWT claims do not already include the org context. *** ### Response Whether the request succeeded. Human-readable status message. Effective Cal.com account information for the agent. Whether the agent currently has an effective Cal.com account. Source of the effective connection. Common values are `agent`, `org_linked`, and `none`. Effective Cal.com account UUID when connected. Effective Cal.com account name when connected. Connection status when connected. Effective Cal.com API base URL when connected. ```json 200 theme={null} { "success": , "message": "Agent Cal.com account retrieved", "data": { "connected": , "type": "", "calcom_account_id": "", "account_name": "", "status": "", "api_base_url": "" } } ``` ```json 200 theme={null} { "success": , "message": "Agent Cal.com account retrieved", "data": { "connected": false, "type": "none" } } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "INVALID_REQUEST" } ``` ```json 401 theme={null} { "success": false, "message": "" } ``` ```json 404 theme={null} { "success": false, "message": "", "code": "NOT_FOUND" } ``` ```json 500 theme={null} { "success": false, "message": "", "code": "INTERNAL_ERROR" } ``` # Get Appointment Source: https://docs.ravan.ai/api-reference/calcom/get-appointment GET /api/v1/calcom/appointments/{appointment_id} Fetches a single booking by its Cal.com booking UID from the organization's primary Cal.com account. ### Authorizations Your JWT access token. Pass it as a Bearer token in the `Authorization` header. Example: `Authorization: Bearer `. *** ### Path Parameters The Cal.com booking UID for the appointment you want to fetch. *** ### Query Parameters Optional fallback organization ID. It is used only when the JWT claims do not already include the org context. *** ### Response Whether the request succeeded. Human-readable status message. Returned appointment data. The fetched appointment. Echoed organization ID. Echoed agent ID. ```json 200 theme={null} { "success": , "message": "Appointment retrieved", "data": { "appointment": { "id": "", "organization_id": "", "ghl_appointment_id": "", "contact_id": "", "agent_id": "", "agent_name": "", "contact_name": "", "contact_email": "", "contact_phone": "", "appointment_time": "", "end_time": "", "status": "" }, "org_id": "", "agent_id": "" } } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "INVALID_REQUEST" } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "NOT_CONNECTED" } ``` ```json 401 theme={null} { "success": false, "message": "", "code": "UNAUTHORIZED" } ``` ```json 502 theme={null} { "success": false, "message": "", "code": "CALCOM_API_ERROR" } ``` ```json 500 theme={null} { "success": false, "message": "", "code": "INTERNAL_ERROR" } ``` # List Cal.com Appointments Source: https://docs.ravan.ai/api-reference/calcom/list-appointments GET /api/v1/calcom/appointments Lists bookings fetched live from the organization's primary Cal.com account. ### Authorizations Your JWT access token. Pass it as a Bearer token in the `Authorization` header. Example: `Authorization: Bearer `. *** ### Query Parameters The organization ID whose primary Cal.com account bookings you want to fetch. Optional Cal.com booking status filter. Optional agent ID that is stamped onto the results and echoed back in the response. Optional result limit. Defaults to `50` and is clamped back to `50` when the value is `<= 0` or `> 200`. *** ### Response Whether the request succeeded. Human-readable status message. Returned appointment data. Array of appointments fetched from Cal.com. Total number of returned appointments. Echoed organization ID. Echoed agent ID when provided. ```json 200 theme={null} { "success": , "message": "Appointments retrieved", "data": { "appointments": [ { "id": "", "organization_id": "", "agent_id": "", "attendee_name": "", "attendee_email": "", "attendee_phone": "", "attendee_timezone": "", "start_time": "", "end_time": "", "duration_minutes": , "status": "" } ], "count": , "org_id": "", "agent_id": "" } } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "INVALID_REQUEST" } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "NOT_CONNECTED" } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "CALCOM_API_ERROR" } ``` ```json 401 theme={null} { "success": false, "message": "" } ``` ```json 500 theme={null} { "success": false, "message": "", "code": "INTERNAL_ERROR" } ``` # List Cal.com Event Types Source: https://docs.ravan.ai/api-reference/calcom/list-event-types GET /api/v1/calcom/event-types Lists event types fetched live from Cal.com across all connected org-level accounts, or one account if `account_id` is provided. ### Authorizations Your JWT access token. Pass it as a Bearer token in the `Authorization` header. Example: `Authorization: Bearer `. *** ### Query Parameters The organization ID whose connected Cal.com event types you want to fetch. Restricts results to one connected Cal.com account. The account must belong to the same organization. *** ### Response Whether the request succeeded. Human-readable status message. Array of Cal.com event types. Event type ID from Cal.com. Event type slug. Event type title suffixed with the owning account name. Event type description. Duration in minutes. Event type price. Currency code. Whether the event type is active. Owning Cal.com account ID. Owning Cal.com account name. ```json 200 theme={null} { "success": , "message": "Event types retrieved", "data": [ { "id": "", "slug": "", "title": "", "description": "", "duration_minutes": , "price": , "currency": "", "is_active": , "calcom_account_id": "", "account_name": "" } ] } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "INVALID_REQUEST" } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "NOT_CONNECTED" } ``` ```json 401 theme={null} { "success": false, "message": "" } ``` ```json 404 theme={null} { "success": false, "message": "", "code": "NOT_FOUND" } ``` ```json 500 theme={null} { "success": false, "message": "", "code": "INTERNAL_ERROR" } ``` # Lookup Cal.com Event Type Source: https://docs.ravan.ai/api-reference/calcom/lookup-event-type GET /api/v1/calcom/event-types/lookup/{platform_id} Looks up a single event type by its Cal.com numeric ID or slug across all connected accounts for the organization. ### Authorizations Your JWT access token. Pass it as a Bearer token in the `Authorization` header. Example: `Authorization: Bearer `. *** ### Path Parameters The Cal.com event type numeric ID, such as `123456`, or slug, such as `30min-intro`. *** ### Query Parameters The organization ID whose connected Cal.com accounts should be searched. *** ### Response Whether the request succeeded. Human-readable status message. The matching Cal.com event type. Event type ID from Cal.com. Event type slug. Event type title suffixed with the owning account name. Event type description. Duration in minutes. Event type price. Currency code. Whether the event type is active. Owning Cal.com account ID. Owning Cal.com account name. ```json 200 theme={null} { "success": , "message": "Event type retrieved", "data": { "id": "", "slug": "", "title": "", "description": "", "duration_minutes": , "price": , "currency": "", "is_active": , "calcom_account_id": "", "account_name": "" } } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "INVALID_REQUEST" } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "NOT_CONNECTED" } ``` ```json 404 theme={null} { "success": false, "message": "", "code": "NOT_FOUND" } ``` ```json 401 theme={null} { "success": false, "message": "" } ``` ```json 500 theme={null} { "success": false, "message": "", "code": "INTERNAL_ERROR" } ``` # Cal.com OAuth Callback Source: https://docs.ravan.ai/api-reference/calcom/oauth-callback GET /api/v1/calcom/oauth/callback Cal.com OAuth Callback. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** This endpoint redirects the browser. No JSON response body is returned. # Cal.com OAuth Connect Source: https://docs.ravan.ai/api-reference/calcom/oauth-connect GET /api/v1/calcom/oauth/connect Cal.com OAuth Connect. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Query Parameters The organization ID that owns the resource. Use the organization ID from your Agni account. *** This endpoint redirects the browser. No JSON response body is returned. # Cal.com Connection Status Source: https://docs.ravan.ai/api-reference/calcom/status GET /api/v1/calcom/status Returns the connection status of all org-level Cal.com accounts. ### Authorizations Your JWT access token. Pass it as a Bearer token in the `Authorization` header. Example: `Authorization: Bearer `. *** ### Query Parameters The organization ID whose Cal.com connection status you want to check. *** ### Response Whether the request succeeded. Human-readable status message. Returned connection status. Whether any Cal.com account is currently connected. Connection status. Common values are `active` and `not_connected`. Array of org-level Cal.com accounts. ```json 200 theme={null} { "success": , "message": "", "data": { "connected": , "status": "", "accounts": [ { "id": "", "account_name": "", "status": "", "error": "" } ] } } ``` ```json 200 theme={null} { "success": , "message": "Cal.com is not connected", "data": { "connected": false, "status": "not_connected", "accounts": [] } } ``` ```json 400 theme={null} { "success": false, "message": "", "code": "INVALID_REQUEST" } ``` ```json 401 theme={null} { "success": false, "message": "" } ``` ```json 404 theme={null} { "success": false, "message": "", "code": "NOT_FOUND" } ``` ```json 500 theme={null} { "success": false, "message": "", "code": "INTERNAL_ERROR" } ``` # Create Call Source: https://docs.ravan.ai/api-reference/calling/create-call POST /api/v1/calling/create-call Create Call. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The call type to create. Use `web_call` for a browser-based call or `outbound_call` to place a phone call. The unique ID of the agent that should own, handle, or be assigned to this resource. Use the `id` returned by the Agent API. The caller ID used for outbound calls, in E.164 format. The number must be purchased, imported, or connected in Agni. Example: `+14157774444`. The destination phone number for an outbound call, in E.164 format. Example: `+12137774445`. Custom key-value data to attach to the resource. Use this for IDs or attributes from your own systems. Dynamic variables injected into the agent prompt for this call. Keys should match variables used in the prompt template. *** ### Response Whether the request succeeded. Human-readable status message. LiveKit access token. Room ID for the created call session. Call session UUID. LiveKit WebSocket URL. ```json 200 theme={null} { "access_token": "", "message": "call created successfully", "room_id": "call_019eb7e0-075d-742b-91ea-94cddde0534a", "session_id": "019eb7e0-075d-742b-91ea-94cddde0534a", "success": true, "url": "" } ``` # Get Call Session Detail Source: https://docs.ravan.ai/api-reference/calling/get-session-detail GET /api/v1/calling/call-sessions-detail/{id} Get Call Session Detail with Transcripts. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Full call session with embedded transcripts. Session ID Agent ID Agent name Organization ID Caller phone number Callee phone number Call channel Call status Pre-signed recording URL Duration in seconds Total call cost Credit usage breakdown for the call Reason for disconnect Custom metadata Post-call analysis result Start timestamp End timestamp Creation timestamp Array of transcript entries ```json 200 theme={null} { "success": , "message": "", "data": { "id": "", "agent_id": "", "agent_name": "", "organization_id": "", "caller_number": "", "callee_number": "", "channel": "", "status": "", "recording_url": "", "duration_sec": , "cost_total": "", "credit_breakdown": { "channel": "", "duration_sec": , "model_credits": , "provider_credits": , "provider_managed": , "telephony_type": "", "total_credits": }, "disconnect_reason": "", "metadata": {}, "post_call_analysis_result": {}, "started_at": "", "ended_at": "", "created_at": "", "transcripts": [] } } ``` # List Call Sessions Source: https://docs.ravan.ai/api-reference/calling/list-sessions GET /api/v1/calling/call-sessions List Call Sessions. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Query Parameters The page number to return. Page numbering starts at `1`. The number of records to return per page. The unique ID of the agent that should own, handle, or be assigned to this resource. Use the `id` returned by the Agent API. Filters or sets the current status of the resource. Use one of the status values supported by the endpoint. Filters calls by channel. Common values include `voice`, `web`, and `sip`. Filters results by the caller phone number in E.164 format. Example: `+14157774444`. A search string used to filter matching records by supported text fields. The field to sort results by. Use one of the fields supported by the endpoint. The sort direction. Use `asc` for ascending order or `desc` for descending order. Filters calls that started after this ISO 8601 timestamp. Filters calls that started before this ISO 8601 timestamp. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Array of call session objects. ```json 200 theme={null} { "success": , "message": "", "data": { "callSessions": [ { "id": "", "agentId": "", "organizationId": "", "roomId": "", "callerNumber": "", "calleeNumber": "", "callerName": "", "callerEmail": "", "channel": "", "status": "", "summary": "", "metadata": {}, "errorMessage": "", "disconnectReason": "", "promptDynamicVariables": {}, "extractDynamicVariables": null, "callLatencyMs": , "startedAt": "", "endedAt": "", "durationSec": , "createdAt": "", "recordingUrl": "", "costTotal": "", "agentName": "", "postCallAnalysisResult": {}, "creditBreakdown": { "channel": "", "duration_sec": , "model_credits": , "provider_credits": , "provider_managed": , "telephony_type": "", "total_credits": } } ] } } ``` # Phone Call History Source: https://docs.ravan.ai/api-reference/calling/phone-history GET /api/v1/calling/phone-history Returns all calls where a phone number appears as caller or callee, with cost and credit details and optional transcripts. ### Authorizations Bearer JWT used to authenticate the request. Org API key. You can use this instead of JWT. *** ### Query Parameters Phone number in E.164 format. Example: `+1234567890`. Page number to return. Defaults to `1`. Results per page. Defaults to `20` and maximum is `100`. Set to `true` to include transcripts in each call result. *** ### Response Whether the request succeeded. Human-readable status message. The phone number used for the lookup. Total number of matching calls. Current page number. Number of results returned per page. Matching calls. Call session UUID. Agent UUID. Agent name. Organization UUID. Caller phone number. Callee phone number. Caller name. Caller email. Call channel. Call status. Call summary. Recording URL. Call duration in seconds. Total call cost. Telephony provider cost. Model cost. Credit usage breakdown. Disconnect reason. Call latency in milliseconds. Error message, if any. Post-call analysis result. Custom metadata. Start timestamp. End timestamp. Creation timestamp. Transcript entries when requested. ```json 200 theme={null} { "success": true, "message": "call history retrieved successfully", "phone": "+919876543210", "total_count": 3, "page": 1, "page_size": 20, "calls": [ { "id": "550e8400-e29b-41d4-a716-446655440000", "agent_id": "8f14e45f-ceea-467f-a1d1-91ad4fb0e6c4", "agent_name": "Support Agent", "organization_id": "0b2c1d3e-4f56-4789-9abc-def012345678", "caller_number": "+14155550100", "callee_number": "+919876543210", "caller_name": "Jane Doe", "caller_email": "jane@example.com", "channel": "phone", "status": "completed", "summary": "Customer asked about billing.", "recording_url": "https://api.example.com/api/v1/calling/sessions/550e8400-e29b-41d4-a716-446655440000/recording", "duration_sec": 250, "cost_total": "12.50", "twilio_cost": 5.1, "model_cost": 4.2, "credit_breakdown": { "model_credits": 4.2, "provider_credits": 5.1, "telephony_base_credits": 4.0 }, "disconnect_reason": "user_hangup", "call_latency_ms": 820, "error_message": "", "post_call_analysis_result": { "sentiment": "positive" }, "metadata": { "source": "crm" }, "started_at": "2026-06-11T09:30:00Z", "ended_at": "2026-06-11T09:34:10Z", "created_at": "2026-06-11T09:29:58Z", "transcripts": [ { "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "call_session_id": "550e8400-e29b-41d4-a716-446655440000", "message": { "role": "agent", "content": "Hello!" }, "timestamp_ms": 1765437000123, "created_at": "2026-06-11T09:30:01Z" } ] } ] } ``` # Add Contacts to Campaign Source: https://docs.ravan.ai/api-reference/campaigns/add-contacts POST /api/v1/campaigns/{id}/contacts Add Contacts to Campaign. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Body A list of contact IDs to include in the request. Each ID must belong to a contact in your organization. *** ### Response Whether the request succeeded. Human-readable status message. # Create Campaign Source: https://docs.ravan.ai/api-reference/campaigns/create POST https://api.ravan.ai/api/v1/campaigns/ Create Campaign. Actual endpoint: `POST https://api.ravan.ai/api/v1/campaigns/` (note the trailing slash) ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The internal name of the resource. Use a clear name that your team can recognize in the dashboard and API responses. The unique ID of the agent that should own, handle, or be assigned to this resource. Use the `id` returned by the Agent API. The phone number record ID to use for calls or campaigns. Use the ID returned by the telephony endpoints. The caller ID used for outbound calls, in E.164 format. The number must be purchased, imported, or connected in Agni. A list of contact IDs to include in the request. Each ID must belong to a contact in your organization. The campaign schedule settings. Use this object to define calling windows, timezone, concurrency, and retry behavior. The daily start time for campaign calls in `HH:mm` 24-hour format. The daily end time for campaign calls in `HH:mm` 24-hour format. The days of the week when the campaign can place calls. Use integers `1` through `7`, where `1` is Monday and `7` is Sunday. The IANA timezone used for schedules and appointment availability. The maximum number of calls the campaign can run at the same time. The maximum number of retry attempts per contact after an unsuccessful campaign call. The wait time, in minutes, between campaign retry attempts. *** ### Response Whether the request succeeded. Human-readable status message. Created campaign object. Campaign UUID. Example: `019ebbef-48d7-7ebc-a751-4a10362a3bbf` Organization UUID. Example: `95a4e479-03a7-4f1b-834d-8705756e8e59` Campaign name. Example: `Q4 Outreach` Assigned agent UUID. Example: `019e92f8-f032-7fb7-b294-508f4167618e` Phone number UUID. Example: `019e92f4-097d-7a52-b5e5-fa7e0dd0761f` Caller ID in E.164 format. Example: `+918035088113` Campaign status: `draft`, `active`, `paused`, `completed`. Execution state of the campaign: `draft`, `running`, `paused`, `completed`. Campaign scheduling configuration. Campaign start datetime. Campaign end datetime. Daily calling window start time. Example: `09:00` Daily calling window end time. Example: `17:00` Active days of the week (1=Monday … 7=Sunday). Example: `[1, 2, 3, 4, 5]` Timezone for the schedule. Example: `Asia/Kolkata` Maximum concurrent calls. Example: `1` Number of retry attempts. Example: `2` Gap in minutes between retries. Example: `30` Aggregated contact-level statistics. Total contacts. Contacts successfully reached. Contacts with a successful outcome. Contacts that failed. Contacts that did not answer. Contacts yet to be called. Contacts currently being called. Timestamp when the campaign started (ISO 8601). Timestamp when the campaign completed (ISO 8601). Creation timestamp. Example: `2026-06-12T13:04:41Z` Last updated timestamp. Example: `2026-06-12T13:04:41Z` Maximum concurrent outbound calls limit. Maximum outbound calls per second. # Delete Campaign Source: https://docs.ravan.ai/api-reference/campaigns/delete DELETE /api/v1/campaigns/{id} Delete Campaign. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. # Get Campaign Source: https://docs.ravan.ai/api-reference/campaigns/get GET https://api.ravan.ai/api/v1/campaigns/{id} Get Campaign. Actual endpoint: `GET https://api.ravan.ai/api/v1/campaigns/{id}` ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the campaign. Use the `id` returned by the List or Create Campaign endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Example: `Campaign fetched successfully` Campaign object. Campaign UUID. Example: `019ebbef-48d7-7ebc-a751-4a10362a3bbf` Organization UUID. Example: `95a4e479-03a7-4f1b-834d-8705756e8e59` Campaign name. Example: `test agent harsh` Assigned agent UUID. Example: `019e92f8-f032-7fb7-b294-508f4167618e` Phone number UUID. Example: `019e92f4-097d-7a52-b5e5-fa7e0dd0761f` Caller ID in E.164 format. Example: `+918035088113` Campaign status: `draft`, `active`, `paused`, `completed`. Execution state: `draft`, `running`, `paused`, `completed`. Campaign scheduling configuration. Campaign start datetime. Campaign end datetime. Daily calling window start time. Example: `09:00` Daily calling window end time. Example: `17:00` Active days of the week (1=Monday … 7=Sunday). Example: `[1, 2, 3, 4, 5]` Timezone for the schedule. Example: `Asia/Kolkata` Maximum concurrent calls. Example: `1` Number of retry attempts. Example: `2` Gap in minutes between retries. Example: `30` Aggregated contact-level statistics. Total contacts. Contacts successfully reached. Contacts with a successful outcome. Contacts that failed. Contacts that did not answer. Contacts yet to be called. Contacts currently being called. Timestamp when the campaign started (ISO 8601). Timestamp when the campaign completed (ISO 8601). Creation timestamp. Example: `2026-06-12T13:04:41Z` Last updated timestamp. Example: `2026-06-12T13:18:57Z` Maximum concurrent outbound calls limit. Example: `3` Maximum outbound calls per second. Example: `2` # List Campaigns Source: https://docs.ravan.ai/api-reference/campaigns/list GET https://api.ravan.ai/api/v1/campaigns/ List Campaigns. Actual endpoint: `GET https://api.ravan.ai/api/v1/campaigns/` (note the trailing slash) ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Query Parameters The maximum number of records to return. Use this with `offset` or pagination fields to page through results. The number of records to skip before returning results. Use this with `limit` for pagination. Filters or sets the current status of the resource. Use one of the status values supported by the endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Array of campaign objects. Unique campaign identifier. ID of the organization this campaign belongs to. Name of the campaign. ID of the agent assigned to this campaign. ID of the phone number used for this campaign. The phone number calls are made from. Current status of the campaign. Execution-level status of the campaign. Campaign scheduling configuration. Campaign start datetime. Campaign end datetime. Daily calling window start time. Daily calling window end time. Days of the week the calling window is active (0=Sunday, 6=Saturday). Timezone for the schedule window. Maximum number of concurrent calls allowed. Number of retry attempts for unanswered calls. Gap in minutes between retry attempts. Aggregated contact-level statistics for the campaign. Total number of contacts in the campaign. Number of contacts successfully reached. Number of contacts with a successful outcome. Number of contacts that failed. Number of contacts that did not answer. Number of contacts yet to be called. Number of contacts currently being called. Timestamp when the campaign started. Timestamp when the campaign completed. Timestamp when the campaign was created. Timestamp when the campaign was last updated. Pagination metadata. Total number of records. Page size limit. Pagination offset. # List Campaign Contacts Source: https://docs.ravan.ai/api-reference/campaigns/list-contacts GET /api/v1/campaigns/{id}/contacts List Campaign Contacts. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Query Parameters The maximum number of records to return. Use this with `offset` or pagination fields to page through results. The number of records to skip before returning results. Use this with `limit` for pagination. *** ### Response Whether the request succeeded. Human-readable status message. Array of CampaignContact objects with call status details. Pagination metadata. # Pause Campaign Source: https://docs.ravan.ai/api-reference/campaigns/pause POST /api/v1/campaigns/{id}/pause Pause Campaign. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. # Remove Contact from Campaign Source: https://docs.ravan.ai/api-reference/campaigns/remove-contact DELETE /api/v1/campaigns/{id}/contacts/{contact_id} Remove Contact from Campaign. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. The unique contact ID. Use the `id` returned by the Contact API. *** ### Response Whether the request succeeded. Human-readable status message. # Resume Campaign Source: https://docs.ravan.ai/api-reference/campaigns/resume POST /api/v1/campaigns/{id}/resume Resume Campaign. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. # Start Campaign Source: https://docs.ravan.ai/api-reference/campaigns/start POST /api/v1/campaigns/{id}/start Start Campaign. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. # Update Campaign Source: https://docs.ravan.ai/api-reference/campaigns/update PATCH https://api.ravan.ai/api/v1/campaigns/{id} Update Campaign. Actual endpoint: `PATCH https://api.ravan.ai/api/v1/campaigns/{id}/` ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the campaign to update. Use the `id` returned by the List or Create Campaign endpoint. *** ### Body The campaign ID (can be included in the body). The internal name of the campaign. The unique ID of the agent assigned to this campaign. The phone number record ID to use for this campaign. The caller ID used for outbound calls, in E.164 format. Campaign status: `draft`, `active`, `paused`, `completed`. Execution state: `draft`, `running`, `paused`, `completed`. Campaign schedule settings. Campaign start datetime. Campaign end datetime. Daily calling window start time in `HH:mm` 24-hour format. Daily calling window end time in `HH:mm` 24-hour format. Active days of the week (1=Monday … 7=Sunday). IANA timezone for the schedule. Maximum number of concurrent calls. Maximum retry attempts per contact. Wait time in minutes between retries. *** ### Response Whether the request succeeded. Human-readable status message. Example: `Campaign updated successfully` Updated campaign object. Campaign UUID. Example: `019ebc12-3fb2-7169-bd9c-d98c1d1a82a4` Organization UUID. Example: `95a4e479-03a7-4f1b-834d-8705756e8e59` Campaign name. Example: `test agent harsh fixed name` Assigned agent UUID. Example: `019e92f8-f032-7fb7-b294-508f4167618e` Phone number UUID. Example: `019e92f4-097d-7a52-b5e5-fa7e0dd0761f` Caller ID in E.164 format. Example: `+918035088113` Campaign status: `draft`, `active`, `paused`, `completed`. Execution state: `draft`, `running`, `paused`, `completed`. Campaign scheduling configuration. Campaign start datetime. Campaign end datetime. Daily calling window start time. Example: `11:00` Daily calling window end time. Example: `19:00` Active days of the week (1=Monday … 7=Sunday). Example: `[1, 2, 3]` Timezone for the schedule. Example: `Asia/Kolkata` Maximum concurrent calls. Example: `1` Number of retry attempts. Example: `2` Gap in minutes between retries. Example: `30` Aggregated contact-level statistics. Total contacts. Contacts successfully reached. Contacts with a successful outcome. Contacts that failed. Contacts that did not answer. Contacts yet to be called. Contacts currently being called. Timestamp when the campaign started (ISO 8601). Timestamp when the campaign completed (ISO 8601). Creation timestamp. Example: `2026-06-12T13:42:53Z` Last updated timestamp. Example: `2026-06-12T13:58:05Z` Maximum concurrent outbound calls limit. Example: `0` Maximum outbound calls per second. Example: `0` # Get Contact Activities Source: https://docs.ravan.ai/api-reference/contacts/activities GET /api/v1/contacts/{id}/activities Get Contact Activities. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Array of activity objects. # Bulk Delete Contacts Source: https://docs.ravan.ai/api-reference/contacts/bulk-delete POST /api/v1/contacts/bulk-delete Bulk Delete Contacts. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body A list of resource IDs to process in bulk. Each ID must belong to your organization. *** ### Response Whether the request succeeded. Human-readable status message. # Get Contact Call Stats Source: https://docs.ravan.ai/api-reference/contacts/call-stats GET /api/v1/contacts/{id}/calls/stats Get Contact Call Stats. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Total number of calls Total call duration in seconds Average call duration in seconds Last call timestamp # Get Contact Calls Source: https://docs.ravan.ai/api-reference/contacts/calls GET /api/v1/contacts/{id}/calls Get Contact Calls. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Array of call session objects. # Get Contact Campaigns Source: https://docs.ravan.ai/api-reference/contacts/campaigns GET /api/v1/contacts/{id}/campaigns Get Contact Campaigns. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Array of campaign objects. # Create Contact Source: https://docs.ravan.ai/api-reference/contacts/create POST /api/v1/contacts/ Create Contact. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The contact first name. The contact last name. The contact email address. Use a valid email format such as `alex@example.com`. The contact phone number in E.164 format. Example: `+14157774444`. The contact company or organization name. Custom key-value data to attach to the resource. Use this for IDs or attributes from your own systems. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Contact ID First name Last name Email address Phone number Company name Custom metadata Creation timestamp Last update timestamp # Create Contact Note Source: https://docs.ravan.ai/api-reference/contacts/create-note POST /api/v1/contacts/{id}/notes Create Contact Note. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Body The note or message content to save. Use plain text unless the endpoint states otherwise. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Note ID Note content Creation timestamp # Delete Contact Source: https://docs.ravan.ai/api-reference/contacts/delete DELETE /api/v1/contacts/{id} Delete Contact. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. # Get Contact Detail Source: https://docs.ravan.ai/api-reference/contacts/detail GET /api/v1/contacts/{id}/detail Get Contact Detail. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Contact ID First name Last name Email address Phone number Company name Custom metadata Total number of calls Total number of campaigns Last call timestamp Creation timestamp Last update timestamp # Get Contact Source: https://docs.ravan.ai/api-reference/contacts/get GET /api/v1/contacts/{id} Get Contact. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Contact ID First name Last name Email address Phone number Company name Custom metadata Creation timestamp Last update timestamp # List Contacts Source: https://docs.ravan.ai/api-reference/contacts/list GET /api/v1/contacts/ List Contacts. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Query Parameters A search string used to filter matching records by supported text fields. The maximum number of records to return. Use this with `offset` or pagination fields to page through results. The number of records to skip before returning results. Use this with `limit` for pagination. *** ### Response Whether the request succeeded. Human-readable status message. Array of contact objects. Pagination metadata. # List Contact Notes Source: https://docs.ravan.ai/api-reference/contacts/list-notes GET /api/v1/contacts/{id}/notes List Contact Notes. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Array of note objects. # Update Contact Source: https://docs.ravan.ai/api-reference/contacts/update PATCH /api/v1/contacts/{id} Update Contact. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Body The contact first name. The contact last name. The contact email address. Use a valid email format such as `alex@example.com`. The contact phone number in E.164 format. Example: `+14157774444`. The contact company or organization name. Custom key-value data to attach to the resource. Use this for IDs or attributes from your own systems. *** ### Response Whether the request succeeded. Human-readable status message. Updated contact object. # Disconnect GHL Source: https://docs.ravan.ai/api-reference/ghl/disconnect POST /api/v1/ghl/disconnect Disconnect GHL. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Response Whether the request succeeded. Human-readable status message. data field. No fields are defined for this object in the schema. ```json 200 theme={null} { "success": true, "message": "Request completed successfully", "data": {} } ``` # Get GHL Agent by Calendar Source: https://docs.ravan.ai/api-reference/ghl/get-agent-by-calendar GET /api/v1/ghl/setup/agents/calendar/{calendar_id} Get GHL Agent by Calendar. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique calendar ID from the connected scheduling provider. *** ### Response Whether the request succeeded. Human-readable status message. data field. agent\_id field. agent\_name field. calendar\_id field. is\_active field. created\_at field. ```json 200 theme={null} { "success": true, "message": "Request completed successfully", "data": { "agent_id": "id_123", "agent_name": "example", "calendar_id": "id_123", "is_active": true, "created_at": "example" } } ``` # Get GHL Appointment Source: https://docs.ravan.ai/api-reference/ghl/get-appointment GET /api/v1/ghl/appointments/{appointment_id} Get GHL Appointment. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique appointment ID. Use the ID returned when the appointment was created or listed. *** ### Query Parameters The organization ID that owns the resource. Use the organization ID from your Agni account. *** ### Response Whether the request succeeded. Human-readable status message. data field. id field. ghl\_appointment\_id field. contact\_id field. agent\_id field. agent\_name field. contact\_name field. contact\_email field. contact\_phone field. appointment\_time field. status field. ```json 200 theme={null} { "success": true, "message": "Request completed successfully", "data": { "id": "id_123", "ghl_appointment_id": "id_123", "contact_id": "id_123", "agent_id": "id_123", "agent_name": "example", "contact_name": "example", "contact_email": "alex@example.com", "contact_phone": "+14155550100", "appointment_time": "2026-03-14T12:00:00Z", "status": "active" } } ``` # Get or Create Contact Source: https://docs.ravan.ai/api-reference/ghl/get-or-create-contact POST /api/v1/ghl/contacts Get or Create Contact. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The organization ID that owns the resource. Use the organization ID from your Agni account. The connected provider location ID, usually from GoHighLevel. The contact's full name in GoHighLevel. The contact email address. Use a valid email format such as `alex@example.com`. The contact phone number in E.164 format. Example: `+14157774444`. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Contact ID Contact name Contact email Contact phone GHL location ID # List GHL Appointments Source: https://docs.ravan.ai/api-reference/ghl/list-appointments GET /api/v1/ghl/appointments List GHL Appointments. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Query Parameters The unique ID of the agent that should own, handle, or be assigned to this resource. Use the `id` returned by the Agent API. Filters or sets the current status of the resource. Use one of the status values supported by the endpoint. The maximum number of records to return. Use this with `offset` or pagination fields to page through results. The organization ID that owns the resource. Use the organization ID from your Agni account. *** ### Response Whether the request succeeded. Human-readable status message. data field. appointments field. id field. ghl\_appointment\_id field. contact\_id field. agent\_id field. agent\_name field. contact\_name field. contact\_email field. contact\_phone field. appointment\_time field. status field. count field. ```json 200 theme={null} { "success": true, "message": "Request completed successfully", "data": { "appointments": [ { "id": "id_123", "ghl_appointment_id": "id_123", "contact_id": "id_123", "agent_id": "id_123", "agent_name": "example", "contact_name": "example", "contact_email": "alex@example.com", "contact_phone": "+14155550100", "appointment_time": "2026-03-14T12:00:00Z", "status": "active" } ], "count": 1 } } ``` # List GHL Calendars Source: https://docs.ravan.ai/api-reference/ghl/list-calendars GET /api/v1/ghl/setup/calendars List GHL Calendars. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Response Whether the request succeeded. Human-readable status message. data field. calendars field. id field. name field. description field. locationId field. serviceTitle field. count field. ```json 200 theme={null} { "success": true, "message": "Request completed successfully", "data": { "calendars": [ { "id": "id_123", "name": "example", "description": "example", "locationId": "id_123", "serviceTitle": "integration_service" } ], "count": 1 } } ``` # GHL OAuth Authorize Source: https://docs.ravan.ai/api-reference/ghl/oauth-authorize GET /api/v1/ghl/oauth/authorize GHL OAuth Authorize. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Query Parameters The organization ID that owns the resource. Use the organization ID from your Agni account. *** This endpoint redirects the browser. No JSON response body is returned. # GHL OAuth Callback Source: https://docs.ravan.ai/api-reference/ghl/oauth-callback GET /api/v1/ghl/oauth/callback GHL OAuth Callback. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** This endpoint redirects the browser. No JSON response body is returned. # Save Call Data Source: https://docs.ravan.ai/api-reference/ghl/save-call-data POST /api/v1/ghl/calls/data Save Call Data. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The unique contact ID. Use the `id` returned by the Contact API. The organization ID that owns the resource. Use the organization ID from your Agni account. The full call transcript text. A concise summary of the call or interaction. The URL of the call recording. Use a publicly accessible URL if this is supplied by an external system. The call duration in seconds. A list of tags used to categorize or filter the contact. Custom contact fields as key-value pairs. Use this for data that does not fit the standard contact fields. *** ### Response Whether the request succeeded. Human-readable status message. # GHL Setup Status Source: https://docs.ravan.ai/api-reference/ghl/setup-status GET /api/v1/ghl/setup/status GHL Setup Status. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Response Whether the request succeeded. Human-readable status message. Current GHL setup status details. ghl\_connected field. location\_id field. company\_id field. token\_valid field. agents\_created field. agent\_count field. setup\_complete field. message field. One of: CONNECT\_GHL, CREATE\_AGENT, or empty string when fully set up `next_step` values: * `CONNECT_GHL`: GHL is not connected yet. * `CREATE_AGENT`: Connected, but no agents have calendars assigned. * `""` (empty string): Setup is complete. ```json 200 theme={null} { "success": true, "message": "Request completed successfully", "data": { "ghl_connected": true, "location_id": "id_123", "company_id": "id_123", "token_valid": true, "agents_created": true, "agent_count": 1, "setup_complete": true, "message": "Request completed successfully", "next_step": "" } } ``` # Health Check Source: https://docs.ravan.ai/api-reference/health/health GET /health Health Check. ### Response Health status Service name Current UTC timestamp ```json 200 theme={null} { "status": "healthy", "service": "integration_service", "time": "2026-03-14T12:00:00Z" } ``` # Readiness Check Source: https://docs.ravan.ai/api-reference/health/ready GET /ready Readiness Check. ### Response Readiness status ```json 200 theme={null} { "status": "ready" } ``` ```json 503 theme={null} { "status": "unready", "error": "database connection failed" } ``` # API overview Source: https://docs.ravan.ai/api-reference/introduction Authentication and endpoint groups for Agni APIs. ## Authentication Use an API key for all endpoints. Pass it in the `X-Api-Key` header. * Header: `X-Api-Key: YOUR_API_KEY` * Base URL: `https://api.ravan.ai/api/v1/` ## Sections * Agent API * Agent Tool API * Widget Settings API * Phone Number & Telephony API # List Voices for LLM Model Source: https://docs.ravan.ai/api-reference/models/list-voices GET /api/v1/available-voice-ids/{llm_model_id}/voices List available voices for a specific LLM model. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. *** ### Path Parameters The unique ID of the LLM model to fetch voices for. *** ### Query Parameters The maximum number of voice records to return. Example: `10`. The number of voice records to skip before returning results. Example: `0`. *** ### Request ```bash theme={null} curl --location "https://api.ravan.ai/api/v1/available-voice-ids/{llm_model_id}/voices?limit=10&offset=0" \ --header "X-Api-Key: YOUR_API_KEY" ``` *** ### Response Whether the request succeeded. Human-readable status message. Voices available for the requested LLM model. Unique voice ID. Use this value as the `voice_id` when creating or updating an agent. ID of the LLM model this voice belongs to. Provider-specific voice identifier. Example: `alloy`. Display name of the voice. Provider-specific voice name. Voice gender label. Voice language code. URL for a sample recording. URL for the voice image. Pagination metadata. Total number of voice records. Limit used for the request. Offset used for the request. ```json 200 theme={null} { "success": true, "message": "Voices fetched successfully", "data": [ { "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "llm_model_id": "550e8400-e29b-41d4-a716-446655440000", "real_voice_id": "alloy", "voice_name": "Alloy", "real_voice_name": "alloy", "gender": "female", "language": "en", "recording_url": "https://cdn.ravan.ai/voices/alloy.mp3", "img_url": "https://cdn.ravan.ai/voices/alloy.png" } ], "meta": { "total": 1, "limit": 10, "offset": 0 } } ``` # List LLM Models With Voices Source: https://docs.ravan.ai/api-reference/models/list-with-voices GET /api/v1/available-llm-models/with-voices List available LLM models and their supported voices. ### Endpoint Overview `GET /api/v1/available-llm-models/with-voices` Returns the platform's available LLM models along with the voices supported for each model. Use `voices[].id` as the `voice_id` when creating or updating agents. *** ### Response Structure The response is a JSON object with the following top-level fields: * `success` — boolean * `message` — string * `data` — array of model objects (see Model Object Schema) * `meta` — pagination metadata *** ### Root Fields Explanation * `success`: Whether the API request succeeded. * `message`: Human-readable message for the result. * `data`: Array of model objects. Each model contains a `voices` array. * `meta`: Pagination details (`total`, `limit`, `offset`). *** ### Model Object Schema A model object describes an LLM and metadata about available voices. * `id` (string, UUID): Model identifier * `llmModel` (string): Model name * `description` (string): Short description of the model * `price` (number): Pricing metric (units depend on plan) * `isActive` (boolean): Whether the model is active * `voices` (array): List of voices supported by this model *** ### Voice Object Schema Each voice object inside `voices` has the following fields: * `id` (string, UUID): Unique voice identifier * `llmModelId` (string, UUID): Parent model ID * `voiceName` (string): Voice display name * `gender` (string): Voice gender label (optional) * `language` (string): Language/locale code (e.g., `en-US`) * `recordingUrl` (string, URL): Sample audio file URL * `imgUrl` (string, URL): Avatar image URL *** ### Pagination Meta Schema * `meta.total` (integer | string): Total number of records * `meta.limit` (integer): Limit used for the request * `meta.offset` (integer): Offset used for the request *** ### Example Response Below is a complete example response containing the two models `Agni Lite` and `Agni Premium` with multiple voices each. ```json 200 theme={null} { "success": true, "message": "LLM models with voices fetched successfully", "data": [ { "id": "019e30ef-06c2-7959-b74e-7fc65fc64aa3", "llmModel": "Agni Lite", "description": "Agni Lite model for the Live API.", "price": 0.5, "isActive": true, "voices": [ { "id": "v-iris-001", "llmModelId": "019e30ef-06c2-7959-b74e-7fc65fc64aa3", "voiceName": "Iris", "gender": "female", "language": "en-US", "recordingUrl": "https://example.com/iris.mp3", "imgUrl": "https://example.com/iris.png" }, { "id": "v-liam-002", "llmModelId": "019e30ef-06c2-7959-b74e-7fc65fc64aa3", "voiceName": "Liam", "gender": "male", "language": "en-US", "recordingUrl": "https://example.com/liam.mp3", "imgUrl": "https://example.com/liam.png" }, { "id": "v-isabela-003", "llmModelId": "019e30ef-06c2-7959-b74e-7fc65fc64aa3", "voiceName": "Isabela", "gender": "female", "language": "en-US", "recordingUrl": "https://example.com/isabela.mp3", "imgUrl": "https://example.com/isabela.png" }, { "id": "v-marcus-004", "llmModelId": "019e30ef-06c2-7959-b74e-7fc65fc64aa3", "voiceName": "Marcus", "gender": "male", "language": "en-US", "recordingUrl": "https://example.com/marcus.mp3", "imgUrl": "https://example.com/marcus.png" }, { "id": "v-olivia-005", "llmModelId": "019e30ef-06c2-7959-b74e-7fc65fc64aa3", "voiceName": "Olivia", "gender": "female", "language": "en-US", "recordingUrl": "https://example.com/olivia.mp3", "imgUrl": "https://example.com/olivia.png" } ] }, { "id": "019e40bf-15a1-495e-a3c9-9b6d2f4b2b66", "llmModel": "Agni Premium", "description": "Agni Premium with additional voices and enhanced audio quality.", "price": 1.5, "isActive": true, "voices": [ { "id": "p-dominic-101", "llmModelId": "019e40bf-15a1-495e-a3c9-9b6d2f4b2b66", "voiceName": "Dominic", "gender": "male", "language": "en-US", "recordingUrl": "https://example.com/dominic.mp3", "imgUrl": "https://example.com/dominic.png" }, { "id": "p-luna-102", "llmModelId": "019e40bf-15a1-495e-a3c9-9b6d2f4b2b66", "voiceName": "Luna", "gender": "female", "language": "en-US", "recordingUrl": "https://example.com/luna.mp3", "imgUrl": "https://example.com/luna.png" }, { "id": "p-stella-103", "llmModelId": "019e40bf-15a1-495e-a3c9-9b6d2f4b2b66", "voiceName": "Stella", "gender": "female", "language": "en-US", "recordingUrl": "https://example.com/stella.mp3", "imgUrl": "https://example.com/stella.png" } ] } ], "meta": { "total": 2, "limit": 10, "offset": 0 } } ``` *** ### Field Descriptions Table | Field | Type | Description | | --------- | ------- | ----------------------------- | | `success` | boolean | API request status | | `message` | string | Human-readable result message | | `data` | array | List of LLM model objects | | `meta` | object | Pagination details | **Model fields** | Field | Type | Description | | ------------- | ------------- | ------------------------- | | `id` | string (UUID) | Model identifier | | `llmModel` | string | Model name | | `description` | string | Short description | | `price` | number | Pricing value | | `isActive` | boolean | Whether model can be used | | `voices` | array | List of voice objects | **Voice fields** | Field | Type | Description | | -------------- | ------------- | ----------------------------- | | `id` | string (UUID) | Voice identifier | | `llmModelId` | string (UUID) | Parent model ID | | `voiceName` | string | Human readable voice name | | `gender` | string | Voice gender label (optional) | | `language` | string | Locale code | | `recordingUrl` | string (URL) | Sample audio URL | | `imgUrl` | string (URL) | Avatar image URL | *** ### Voice Relationship with Models * Each voice belongs to a single model via `llmModelId`. * You can filter or lookup voices by model ID. * Use `voices[].id` as `voice_id` when creating agents to bind a voice to the agent. *** ### Notes and Validation Rules * `id`, `llmModelId` must be valid UUIDs. * `recordingUrl` and `imgUrl` must be valid HTTPS URLs. * `price` is expressed in the platform's billing units; check plan docs for currency/scaling. * `isActive: false` models/voices should not be offered for new agents. * `language` should use BCP-47 locale codes (e.g., `en-US`). *** If you want the example to include the full lists of every voice name for `Agni Lite` and `Agni Premium` (all names you provided), I can expand the `voices` arrays in the example to include every voice entry with sample recording and image URLs. # Get organization profile Source: https://docs.ravan.ai/api-reference/organizations/profile GET /api/v1/organizations/profile/{id} Get the organization profile, including the effective plan, limits, and available credits. This endpoint returns the organization profile and the effective plan details resolved in this order: 1. Enterprise plan 2. Stripe subscription 3. Free-tier fallback It also returns the organization's available credits in `total_credits`. ### Request Example curl (replace `{id}` and ``): ```bash theme={null} curl -s \ --request GET \ --url "https://api.ravan.ai/api/v1/organizations/profile/{id}" \ -H "X-Api-Key: " \ -H "Accept: application/json" ``` PowerShell (Invoke-RestMethod): ```powershell theme={null} Invoke-RestMethod -Method Get -Uri "https://api.ravan.ai/api/v1/organizations/profile/{id}" -Headers @{ "X-Api-Key" = "" } ``` ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Use a JWT cookie or Bearer token when your app authenticates with session-based access. Session cookie auth is also supported for browser-based requests. The caller must belong to the organization. If the session is an impersonated superadmin session, Agni uses the org from the token instead of the org in the URL. *** ### Path Parameters The organization UUID. *** ### Response Organization UUID. Organization name. Organization slug. Organization website. Organization status. Available credits in the organization. Organization region. Effective plan name. Subscription status. Subscription period end timestamp. Maximum concurrent sessions or jobs allowed. Maximum members allowed in the organization. Maximum agents allowed in the organization. Maximum credits allowed for the organization. API requests allowed per window. Whether call recording is enabled. Whether API access is enabled. Price per extra credit. Effective limits returned for the organization. Whether API access is enabled. Whether basic analytics is enabled. Organization-level limits. Maximum organizations allowed. Maximum members allowed. ```json 200 theme={null} { "id": "9b2f6d3e-1111-4c5a-9d2e-aaaaaaaaaaaa", "name": "Acme Inc", "slug": "acme-inc", "website": "https://acme.com", "status": "ACTIVE", "total_credits": 1250.5, "region_id": "us-east", "plan_name": "Pro", "sub_status": "active", "period_end": "2026-07-01T00:00:00Z", "max_concurrency": 10, "max_members": 25, "max_agents": 15, "max_credits": 50000, "api_rate_limit": 120, "can_record_calls": true, "can_use_api": true, "extra_credit_price": 0.02, "limits": { "api_access": true, "Basic_analytics": true, "Organization": { "max_orgs": 3, "max_members": 25 } } } ``` # Add Sources Source: https://docs.ravan.ai/api-reference/rag/add-sources POST /api/v1/rag/knowledge-base/{kb_id}/add-sources Add Sources to Knowledge Base. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique knowledge base ID. Use the ID returned by the knowledge base create or list endpoint. *** ### Body (JSON) For adding text and URL sources, use `Content-Type: application/json`: Inline text sources to add to the knowledge base. Each item should include a title and the text content. The title for the text source. Use a concise label that helps you identify the source later. The text content to ingest into the knowledge base. A list of URLs to crawl and add as knowledge base sources. Each URL must be publicly reachable. ### Body (File Upload) For uploading files, use `Content-Type: multipart/form-data`: The file to upload as a knowledge base source. Use multipart form data for file uploads. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Updated knowledge base object with sources Knowledge base UUID Knowledge base name Status (will be `in_progress` while indexing) Array of source objects with indexing status URL source crawl status details # Create Knowledge Base Source: https://docs.ravan.ai/api-reference/rag/create-knowledge-base POST /api/v1/rag/create-knowledge-base Create Knowledge Base. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The display name for the knowledge base. Use a clear name that describes the source content. Whether the knowledge base should automatically refresh supported sources after creation. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Knowledge base UUID Knowledge base name Status: `complete`, `in_progress`, or `error` Whether auto-refresh is enabled Array of sources (empty on creation) Creation timestamp (Unix ms) Last updated timestamp (Unix ms) # Delete Knowledge Base Source: https://docs.ravan.ai/api-reference/rag/delete-knowledge-base DELETE /api/v1/rag/delete-knowledge-base/{kb_id} Delete Knowledge Base. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique knowledge base ID. Use the ID returned by the knowledge base create or list endpoint. *** ### Response Returns `204 No Content` on success. # Delete Source Source: https://docs.ravan.ai/api-reference/rag/delete-source DELETE /api/v1/rag/knowledge-base/{kb_id}/source/{source_id} Delete Source from Knowledge Base. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique knowledge base ID. Use the ID returned by the knowledge base create or list endpoint. The unique source ID inside the knowledge base. *** ### Response Whether the request succeeded. Human-readable status message. Updated knowledge base object. # Discover URLs Source: https://docs.ravan.ai/api-reference/rag/discover-urls POST /api/v1/rag/discover Discover URLs. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body A publicly reachable URL. Include the full protocol, for example `https://example.com/docs`. The maximum crawl depth when discovering or ingesting URLs. Higher values can include more nested pages. The maximum number of records to return. Use this with `offset` or pagination fields to page through results. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Discovered URLs # Get Document Source: https://docs.ravan.ai/api-reference/rag/get-document GET /api/v1/rag/document Get Document. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Query Parameters The organization ID that owns the resource. Use the organization ID from your Agni account. The unique document ID in the knowledge base. Use a stable ID so later upserts update the same document. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Document ID Knowledge Base ID Organization ID Document text content Source URL Document status Document metadata Creation timestamp Last update timestamp # Get Knowledge Base Source: https://docs.ravan.ai/api-reference/rag/get-knowledge-base GET /api/v1/rag/get-knowledge-base/{kb_id} Get Knowledge Base. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique knowledge base ID. Use the ID returned by the knowledge base create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Knowledge base UUID Knowledge base name Status: `complete`, `in_progress`, or `error` Whether auto-refresh is enabled Array of source objects Source UUID Type: `text`, `url`, or `document` Source name or title Source URL (for url type) Status: `complete`, `indexing`, or `error` Creation timestamp (Unix ms) Creation timestamp (Unix ms) Last updated timestamp (Unix ms) # List Documents Source: https://docs.ravan.ai/api-reference/rag/list-documents GET /api/v1/rag/documents List Documents. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Query Parameters The organization ID that owns the resource. Use the organization ID from your Agni account. The unique knowledge base ID. Use the ID returned by the knowledge base create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Array of document objects. # List Exclusions Source: https://docs.ravan.ai/api-reference/rag/list-exclusions GET /api/v1/rag/exclusions List Exclusions. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Query Parameters The organization ID that owns the resource. Use the organization ID from your Agni account. The unique knowledge base ID. Use the ID returned by the knowledge base create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Excluded URLs # List Knowledge Bases Source: https://docs.ravan.ai/api-reference/rag/list-knowledge-bases GET /api/v1/rag/knowledgebases List Knowledge Bases. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Query Parameters The organization ID that owns the resource. Use the organization ID from your Agni account. *** ### Response Whether the request succeeded. Human-readable status message. Array of knowledge base objects. # Manage Exclusions Source: https://docs.ravan.ai/api-reference/rag/manage-exclusions POST /api/v1/rag/exclusions Manage Exclusions. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The organization ID that owns the resource. Use the organization ID from your Agni account. The unique knowledge base ID. Use the ID returned by the knowledge base create or list endpoint. The exclusion operation to perform. Use the value supported by this endpoint, such as adding or removing URLs from the exclusion list. A list of publicly reachable URLs. Include the full protocol for each URL. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Updated exclusion list # Query Knowledge Base Source: https://docs.ravan.ai/api-reference/rag/query POST /api/v1/rag/query Query Knowledge Base. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The organization ID that owns the resource. Use the organization ID from your Agni account. The unique knowledge base ID. Use the ID returned by the knowledge base create or list endpoint. The natural-language question or search query to run against the knowledge base. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Array of matching results Matched text chunk Relevance score Source document ID Chunk metadata # Refresh Knowledge Base Source: https://docs.ravan.ai/api-reference/rag/refresh POST /api/v1/rag/refresh Refresh Knowledge Base. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The organization ID that owns the resource. Use the organization ID from your Agni account. The unique knowledge base ID. Use the ID returned by the knowledge base create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. # Upsert Document Source: https://docs.ravan.ai/api-reference/rag/upsert-document POST /api/v1/rag/document Upsert Document. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The organization ID that owns the resource. Use the organization ID from your Agni account. The unique knowledge base ID. Use the ID returned by the knowledge base create or list endpoint. The unique document ID in the knowledge base. Use a stable ID so later upserts update the same document. The text content to ingest, search, or store, depending on the endpoint. A publicly reachable URL. Include the full protocol, for example `https://example.com/docs`. A list of publicly reachable URLs. Include the full protocol for each URL. The maximum number of pages to crawl or ingest from the provided URL sources. The maximum crawl depth when discovering or ingesting URLs. Higher values can include more nested pages. Custom key-value data to attach to the resource. Use this for IDs or attributes from your own systems. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Document ID Knowledge Base ID Document status Creation timestamp # Add Twilio Number Source: https://docs.ravan.ai/api-reference/telephony/add-twilio-number POST /api/v1/phone-numbers/add-twilio Add Twilio Number. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The phone number in E.164 format. Example: `+14157774444`. The Twilio phone number SID for the number you are connecting. A human-readable label for the phone number. Use a name that helps your team identify its purpose. The purchase price or configured price for the phone number. *** ### Response Whether the request succeeded. Human-readable status message. Returned phone number object. # Buy Phone Number Source: https://docs.ravan.ai/api-reference/telephony/buy-number POST /api/v1/phone-numbers/buy/ Buy Phone Number. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The phone number in E.164 format. Example: `+14157774444`. The purchase price or configured price for the phone number. The inbound call price per minute for the phone number. The outbound call price per minute for the phone number. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. The purchased phone number Price paid Purchase status Timestamp of purchase ```json 200 theme={null} { "success": true, "message": "Request completed successfully", "data": { "phone_number": "+14155550100", "price": 1.99, "status": "active", "purchased_at": "2026-03-14T12:00:00Z" } } ``` # Create Telephony Type Source: https://docs.ravan.ai/api-reference/telephony/create-telephony POST /api/v1/phone-numbers/create/telephony/ Create Telephony Type. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The telephony provider type to configure. Use the provider value supported by your account. The owner type for the connected account or resource. Use the provider-specific value expected by the integration. A human-readable label for the phone number. Use a name that helps your team identify its purpose. The OAuth client ID from the connected provider. The OAuth client secret from the connected provider. Treat this value as sensitive. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. id field. type field. owner\_type field. friendly\_name field. status field. created\_at field. termination\_uri field. sip\_username field. sip\_password field. ```json 200 theme={null} { "success": true, "message": "Request completed successfully", "data": { "id": "id_123", "type": "twilio", "owner_type": "twilio", "friendly_name": "Support Bot", "status": "active", "created_at": "2026-03-14T12:00:00Z", "termination_uri": "sip:example@provider.com", "sip_username": "sip-user", "sip_password": "secret-password" } } ``` # Delete Imported Number Source: https://docs.ravan.ai/api-reference/telephony/delete-imported-number DELETE /api/v1/phone-numbers/import/{id} Delete Imported Number. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. # Get Imported Number Source: https://docs.ravan.ai/api-reference/telephony/get-imported-number GET /api/v1/phone-numbers/import/{id} Get Imported Number. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Imported number ID Phone number Friendly name Number type (e.g. sip, pstn) SIP termination URI SIP username Number status Creation timestamp # Get Selected Telephony Source: https://docs.ravan.ai/api-reference/telephony/get-selected-telephony GET /api/v1/phone-numbers/selected-telephony Get Selected Telephony. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Telephony config ID Telephony provider type Owner type Display name Status Creation timestamp # Import Phone Number Source: https://docs.ravan.ai/api-reference/telephony/import-number POST /api/v1/phone-numbers/import/ Import Phone Number. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The contact phone number in E.164 format. Example: `+14157774444`. The imported number type. Use the value supported by your SIP or telephony setup. The internal name of the resource. Use a clear name that your team can recognize in the dashboard and API responses. The SIP termination URI for routing calls to the imported number. The SIP username for the imported number. The SIP password for the imported number. Treat this value as sensitive. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. id field. phone field. type field. name field. termination\_uri field. sip\_username field. sip\_password field. status field. created\_at field. ```json 200 theme={null} { "success": true, "message": "Request completed successfully", "data": { "id": "id_123", "phone": "+14155550100", "type": "twilio", "name": "Support Bot", "termination_uri": "sip:example@provider.com", "sip_username": "sip-user", "sip_password": "secret-password", "status": "active", "created_at": "2026-03-14T12:00:00Z" } } ``` # List Available Numbers Source: https://docs.ravan.ai/api-reference/telephony/list-available-numbers GET /api/v1/phone-numbers/available-numbers/{iso_country}/ List Available Numbers. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The ISO 3166-1 alpha-2 country code. Example: `US`. *** ### Query Parameters The number of records to return per page. Filters available numbers by region, state, province, or locality when supported. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. ISO country code Phone number in E.164 format Monthly cost of the number Per-minute price for outbound calls Per-minute price for inbound calls ```json 200 theme={null} { "success": true, "message": "Request completed successfully", "data": [ { "iso_country": "US", "phone_number": "+14155550100", "price": 1, "per_minute_price_outbound": 1, "per_minute_price_inbound": 1 } ] } ``` # List Imported Numbers Source: https://docs.ravan.ai/api-reference/telephony/list-imported-numbers GET /api/v1/phone-numbers/import List Imported Numbers. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Response Whether the request succeeded. Human-readable status message. Array of imported number objects. # List Purchased Numbers Source: https://docs.ravan.ai/api-reference/telephony/list-purchased-numbers GET /api/v1/phone-numbers/list List Purchased Numbers. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Query Parameters Filters available numbers by region, state, province, or locality when supported. The ISO 3166-1 alpha-2 country code. Example: `US`. Filters results by active status. Use `true` for active records or `false` for inactive records. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Record ID Associated telephony ID Associated subscription ID Inbound SIP trunk ID Outbound SIP trunk ID Phone number in E.164 format Human-readable label Per-minute inbound price Per-minute outbound price Monthly price Region ISO country code Whether the number is active Creation timestamp Last update timestamp ```json 200 theme={null} { "success": true, "message": "Request completed successfully", "data": [ { "id": "id_123", "telephony_id": "telephony_123", "subscription_id": "subscription_123", "inbound_trunk_id": "inbound_trunk_123", "outbound_trunk_id": "outbound_trunk_123", "number": "+14155550100", "friendly_name": "Support Bot", "per_minute_price_inbound": 1, "per_minute_price_outbound": 1, "price": 1, "region": "example", "iso_country": "US", "is_active": true, "created_at": "2026-03-14T12:00:00Z", "updated_at": "2026-03-14T12:00:00Z" } ] } ``` # List Twilio Owned Numbers Source: https://docs.ravan.ai/api-reference/telephony/list-twilio-numbers GET /api/v1/phone-numbers/twilio-owned-numbers/ List Twilio Owned Numbers. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Twilio SID Phone number in E.164 format Friendly label Number status Date created in Twilio Voice capability enabled SMS capability enabled MMS capability enabled ```json 200 theme={null} { "success": true, "message": "Request completed successfully", "data": [ { "sid": "example", "phone_number": "+14155550100", "friendly_name": "Support Bot", "status": "active", "date_created": "example", "voice": true, "sms": true, "mms": true } ] } ``` # Release Phone Number Source: https://docs.ravan.ai/api-reference/telephony/release-number DELETE /api/v1/phone-numbers/{phone_number}/release/ Release Phone Number. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The phone number in E.164 format. Example: `+14157774444`. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. The released phone number Release status Timestamp of release ```json 200 theme={null} { "success": true, "message": "Request completed successfully", "data": { "phone_number": "+14155550100", "status": "active", "released_at": "example" } } ``` # Update Imported Number Source: https://docs.ravan.ai/api-reference/telephony/update-imported-number PUT /api/v1/phone-numbers/import/{id} Update Imported Number. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Body The internal name of the resource. Use a clear name that your team can recognize in the dashboard and API responses. The SIP termination URI for routing calls to the imported number. The SIP username for the imported number. The SIP password for the imported number. Treat this value as sensitive. *** ### Response Whether the request succeeded. Human-readable status message. Updated imported number object. # Create Agent Tool Source: https://docs.ravan.ai/api-reference/tools/create POST /api/v1/tools/ Create Agent Tool. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Body The internal name of the resource. Use a clear name that your team can recognize in the dashboard and API responses. A short description of the resource. Use it to explain the purpose, behavior, or usage context. The tool type. Use the value that matches how the agent should execute the tool, such as an API or integration tool. The tool definition object. Include the schema, parameters, and execution details required by the tool type. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Unique tool ID Tool name Tool description Tool type (e.g. webhook, function) Tool definition schema Organization this tool belongs to Whether the tool is active ```json 200 theme={null} { "success": true, "message": "Request completed successfully", "data": { "id": "id_123", "organizationId": "organization_123", "name": "Support Bot", "description": "Example description", "type": "twilio", "definition": {}, "isActive": true } } ``` *** ### Transfer Call tool (example) Example request to create a transfer\_call tool: ```json theme={null} {"id":"demo-tool-id-transfer","name":"transfer_call","description":"Transfer the call to a human agent","type":"transfer_call","definition":{"mode":"cold_transfer","on_hold_music":false,"transfer_to_assign_agent":false,"show_user_number":false,"transfer_to_type":"static","phone_number":"+919999999999","client_transfer_id":"demo-client-transfer-id","custom_prompt":false},"agent_id":"demo-agent-id"} ``` Example response: ```json 200 theme={null} { "success": true, "message": "Tool created successfully", "data": { "id": "demo-tool-id-transfer", "organizationId": "demo-org-id", "name": "transfer_call", "description": "Transfer the call to a human agent", "type": "transfer_call", "definition": { "client_transfer_id": "demo-client-transfer-id", "custom_prompt": false, "mode": "cold_transfer", "on_hold_music": false, "phone_number": "+919999999999", "show_user_number": false, "transfer_to_assign_agent": false, "transfer_to_type": "static" }, "isActive": true, "agentId": "demo-agent-id", "enabledFunctions": { "values": [] } } } ``` *** ### End Call tool (example) Request payload: ```json theme={null} {"id":"demo-tool-id-end","name":"end_call","description":"when user say bye.","type":"end_call","definition":{},"agent_id":"demo-agent-id"} ``` Response (demo IDs): ```json 200 theme={null} { "success": true, "message": "Tool created successfully", "data": { "id": "demo-tool-id-end", "organizationId": "demo-org-id", "name": "end_call", "description": "when user say bye.", "type": "end_call", "definition": {}, "isActive": true, "agentId": "demo-agent-id", "enabledFunctions": { "values": [] } } } ``` *** ### Custom webhook tool (example) Request payload: ```json theme={null} {"name":"webhook test","description":"description","type":"custom","definition":{"custom":{"method":"POST","url":"https://www.google.com","timeoutMs":120000,"headers":[],"queryParameters":[],"payloadArgsOnly":true,"parametersSchemaText":"{\n \"type\": \"object\",\n \"properties\": {\n \"customer_name\": {\n \"type\": \"string\",\n \"description\": \"Customer full name\"\n },\n \"order_id\": {\n \"type\": \"string\",\n \"description\": \"Order identifier\"\n }\n },\n \"required\": [\n \"customer_name\"\n ]\n}","storeFieldsAsVariables":[],"speakDuringExecution":false,"speakAfterExecution":true}},"agent_id":"019eb654-a185-77c6-9555-1d33d120881b"} ``` Response: ```json 200 theme={null} { "success": true, "message": "Tool created successfully", "data": { "id": "019eb92c-6834-7ff9-8845-21ffc3273258", "organizationId": "95a4e479-03a7-4f1b-834d-8705756e8e59", "name": "webhook test", "description": "description", "type": "custom", "definition": { "custom": { "headers": [], "method": "POST", "parametersSchemaText": "{\n \"type\": \"object\",\n \"properties\": {\n \"customer_name\": {\n \"type\": \"string\",\n \"description\": \"Customer full name\"\n },\n \"order_id\": {\n \"type\": \"string\",\n \"description\": \"Order identifier\"\n }\n },\n \"required\": [\n \"customer_name\"\n ]\n}", "payloadArgsOnly": true, "queryParameters": [], "speakAfterExecution": true, "speakDuringExecution": false, "storeFieldsAsVariables": [], "timeoutMs": 120000, "url": "https://www.google.com" } }, "isActive": true, "agentId": "019eb654-a185-77c6-9555-1d33d120881b", "enabledFunctions": { "values": [] } } } ``` *** ### IVR press\_digit tool (example) Request payload: ```json theme={null} {"id":"demo-tool-id-ivr","name":"press_digit","description":"Press a digit to navigate the IVR menu","type":"press_digit","definition":{"pause_detection_delay_ms":1000},"agent_id":"demo-agent-id"} ``` Response (demo values): ```json 200 theme={null} { "success": true, "message": "Tool created successfully", "data": { "id": "demo-tool-id-ivr", "organizationId": "demo-org-id", "name": "press_digit", "description": "Press a digit to navigate the IVR menu", "type": "press_digit", "definition": { "pause_detection_delay_ms": 1000 }, "isActive": true, "agentId": "demo-agent-id", "enabledFunctions": { "values": [] } } } ``` # Delete Agent Tool Source: https://docs.ravan.ai/api-reference/tools/delete DELETE /api/v1/tools/{id}/ Delete Agent Tool. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Response Whether the request succeeded. Human-readable status message. ```json 200 theme={null} { "success": true, "message": "Request completed successfully" } ``` # Get Agent Tool Source: https://docs.ravan.ai/api-reference/tools/get GET /api/v1/tools/{id}/ Fetch a single tool by ID for the authenticated organization. ### Authorizations Bearer JWT used to authenticate the request for the organization scope. *** ### Path Parameters Tool UUID. *** ### Response Whether the request succeeded. Human-readable status message. Returned tool. Tool UUID. Organization UUID. Tool name. Tool description. Tool type. Tool definition payload. Whether the tool is active. Agent UUID attached to the tool. Enabled tool functions. ```json 200 theme={null} { "success": true, "message": "Tool fetched successfully", "data": { "id": "1a2b3c4d-1111-2222-3333-444455556666", "organizationId": "0b8e2f10-1234-4abc-9def-567890abcdef", "name": "book_appointment", "description": "Books an appointment in the connected calendar", "type": "custom", "definition": { "url": "https://example.com/book", "method": "POST", "parameters": { "type": "object", "properties": { "date": { "type": "string" } } } }, "isActive": true, "agentId": "9f1c2b3a-4d5e-6f70-8190-a1b2c3d4e5f6", "enabledFunctions": { "values": [ "book", "reschedule" ] } } } ``` # List Agent Tools Source: https://docs.ravan.ai/api-reference/tools/list GET /api/v1/tools/ List agent tools for the authenticated organization, optionally filtered by agent. ### Authorizations Bearer JWT used to authenticate the request for the organization scope. *** ### Query Parameters Maximum number of records to return. Number of records to skip before returning results. Filter tools to one agent UUID. The API also accepts `agent_id`. *** ### Response Whether the request succeeded. Human-readable status message. Returned tools. Tool UUID. Organization UUID. Tool name. Tool description. Tool type. Tool definition payload. Whether the tool is active. Agent UUID attached to the tool. Enabled tool functions. Pagination metadata. Total number of matching tools. Applied page size. Applied pagination offset. ```json 200 theme={null} { "success": true, "message": "Tools fetched successfully", "data": [ { "id": "1a2b3c4d-1111-2222-3333-444455556666", "organizationId": "0b8e2f10-1234-4abc-9def-567890abcdef", "name": "book_appointment", "description": "Books an appointment in the connected calendar", "type": "custom", "definition": { "url": "https://example.com/book", "method": "POST", "parameters": { "type": "object", "properties": { "date": { "type": "string" } } } }, "isActive": true, "agentId": "9f1c2b3a-4d5e-6f70-8190-a1b2c3d4e5f6", "enabledFunctions": { "values": [ "book", "reschedule" ] } } ], "meta": { "total": "5", "limit": 20, "offset": 0 } } ``` # Update Agent Tool Source: https://docs.ravan.ai/api-reference/tools/update PATCH /api/v1/tools/{id}/ Update Agent Tool. ### Authorizations Your Agni API key used to authenticate the request. Pass it in the `X-Api-Key` header. Find or rotate it from your Ravan AI account settings. *** ### Path Parameters The unique ID of the resource in the path. Use the ID returned by the related create or list endpoint. *** ### Body The internal name of the resource. Use a clear name that your team can recognize in the dashboard and API responses. A short description of the resource. Use it to explain the purpose, behavior, or usage context. The tool type. Use the value that matches how the agent should execute the tool, such as an API or integration tool. The tool definition object. Include the schema, parameters, and execution details required by the tool type. *** ### Response Whether the request succeeded. Human-readable status message. Returned data. Unique tool ID Tool name Tool description Tool type (e.g. webhook, function) Tool definition schema Organization this tool belongs to Whether the tool is active ```json 200 theme={null} { "success": true, "message": "Request completed successfully", "data": { "id": "id_123", "organizationId": "organization_123", "name": "Support Bot", "description": "Example description", "type": "twilio", "definition": {}, "isActive": true } } ``` # After-Call Webhook Source: https://docs.ravan.ai/api-reference/webhooks/call-completed Receive detailed call data automatically when a call ends — including transcripts, recordings, sentiment analysis, and post-call extraction. When a call session ends, Agni dispatches a `call.completed` webhook event to any URLs configured in your agent's [Webhook Settings](/guides/agents). This delivers the full call record including transcripts, AI analysis, and metadata. Configure webhook URLs in the agent builder's **Webhook Settings** panel, or via the [Agent API](/api-reference/agents/create) `webhook_urls` field. *** ## Event Details | Field | Value | | ---------------- | ------------------------------------------------- | | **Event name** | `call.completed` | | **Method** | `POST` | | **Content-Type** | `application/json` | | **Trigger** | Automatically dispatched when a call session ends | *** ## Payload Structure Event type identifier. Always `"call.completed"` for this webhook. UUID of the organization that owns this call. Full call session data. Campaign ID if the call was part of an outbound campaign. `null` for inbound/web calls. Contact ID if the caller is a known contact in your CRM. Phone number of the external party in E.164 format. Call outcome status. Values: `completed`, `failed`, `no_answer`, `busy`, `voicemail`. Total call duration in seconds. Unique session ID for this call. Attempt number (for campaign retries). `1` for first attempt. AI-generated summary of the conversation. Powered by the agent's `analysis_summary_prompt`. URL to the full call recording audio file (MP3). The phone number that initiated the call (your agent's number for outbound, caller's number for inbound). The phone number that received the call. Name of the caller (if known from contacts). Email of the caller (if known from contacts). Name of the AI agent that handled the call. Call channel. Values: `voice`, `web`, `sip`. Why the call ended. Values: `customer_hangup`, `agent_hangup`, `error`. Total cost of the call in USD. Average response latency in milliseconds. ISO 8601 timestamp when the call started. ISO 8601 timestamp when the call ended. ISO 8601 timestamp when the session record was created. AI-generated analysis of the call. Caller sentiment. Values: `positive`, `neutral`, `negative`. Call outcome classification (e.g. `meeting_booked`, `not_interested`, `callback_requested`). Whether the agent achieved its defined objective. AI-suggested next action (e.g. "Send follow-up details via email"). Full conversation transcript, ordered chronologically. Unique transcript entry ID. Milliseconds from the start of the call when this message was spoken. Speaker role. Values: `agent`, `user`. Message content. The spoken text. Content format. Typically `"text"`. ISO 8601 timestamp. *** ## Example Payload ```json theme={null} { "event": "call.completed", "org_id": "1268c1f0-19f3-47db-aefb-c16a7c3ace6e", "data": { "campaign_id": "019d2a1b-4c5e-7f8a-9b0c-1d2e3f4a5b6c", "contact_id": "019d2a1b-5d6f-7a8b-9c0d-2e3f4a5b6c7d", "phone": "+14155550100", "status": "completed", "duration_sec": 125, "call_session_id": "019d2b3c-8e9f-7a0b-1c2d-4e5f6a7b8c9d", "attempt": 1, "summary": "Customer called about their order #4521. Agent confirmed the order shipped yesterday and provided the tracking number. Customer was satisfied.", "recording_url": "https://storage.agniai.com/rec/019d2b3c-8e9f.mp3", "caller_number": "+18881234567", "callee_number": "+14155550100", "caller_name": "John Doe", "caller_email": "john@example.com", "agent_name": "Support Agent", "channel": "voice", "disconnect_reason": "customer_hangup", "cost_total": 0.42, "call_latency_ms": 150, "started_at": "2026-03-24T18:30:00Z", "ended_at": "2026-03-24T18:32:05Z", "created_at": "2026-03-24T18:30:00Z", "post_call_analysis": { "sentiment": "positive", "disposition": "issue_resolved", "goals_met": true, "next_steps": "No follow-up needed. Customer issue fully resolved." }, "transcripts": [ { "id": "t-001", "timestamp_ms": 0, "role": "agent", "message": { "content": "Hello! Thanks for calling Acme Support. How can I help you today?", "format": "text" }, "created_at": "2026-03-24T18:30:00Z" }, { "id": "t-002", "timestamp_ms": 3200, "role": "user", "message": { "content": "Hi, I wanted to check on my order number 4521.", "format": "text" }, "created_at": "2026-03-24T18:30:03Z" }, { "id": "t-003", "timestamp_ms": 5800, "role": "agent", "message": { "content": "Of course! Let me look that up for you. Order 4521 shipped yesterday and the tracking number is TRK-98765. It should arrive by Friday.", "format": "text" }, "created_at": "2026-03-24T18:30:05Z" } ] } } ``` *** ## Handling Webhooks Your endpoint must return a `200` HTTP status code to acknowledge receipt. If Agni doesn't receive a 200, it will retry the webhook. Always check that the `org_id` in the payload matches your organization to prevent processing webhooks from other sources. Return 200 immediately and process the data in a background job. Don't make the webhook wait for your database writes or API calls. Use `call_session_id` as a unique key to deduplicate webhook deliveries in case of retries. # Integrations Source: https://docs.ravan.ai/guides/Integration Connect Agni with your favorite external tools and workflows like GoHighLevel and Cal.com. # Integrations The Integrations page is your central hub for connecting Agni with external CRMs, scheduling tools, and workflows. We have moved this out of the Settings menu—you can now access **Integrations** directly from the main left-hand sidebar. ## The Integrations Dashboard When you navigate to the Integrations page, you will see a top-level overview of your current connectivity status: * **Connected Integrations:** Displays the total number of active connections you currently have. * **Available Integrations:** Shows the total number of integrations Agni currently supports (e.g., GoHighLevel, Cal.com). * **Sync Status:** Indicates whether your connected apps are actively syncing data or if they are currently idle. Integrations dashboard showing connection status and available apps *** ## Connecting GoHighLevel (GHL) Integrating your GoHighLevel account allows your AI agents to manage CRM contacts, sync calendars, and automate appointments seamlessly. ### Step-by-Step Setup 1. **Initiate Connection:** On the Integrations page, locate the GoHighLevel card under "All Integrations" and click **Connect**. 2. **Log In:** You will be redirected to a HighLevel login screen. Enter your credentials to continue. HighLevel login prompt 3. **Grant Permissions:** Review the requested permissions (Contacts, Calendars, Locations, Users) necessary for Agni to function optimally, and click **Next**. HighLevel app installation permissions screen 4. **Select Account:** Choose the specific Sub-Account you want to link to Agni from the dropdown menu. Dropdown to select the GHL Sub-Account Once selected, your GoHighLevel account is successfully connected to Agni! *** ## Managing Your Connection After connecting, the GoHighLevel card on your Integrations page will update to show its active status. You have three management options: * **Configure:** Click this to view your active Connection Status, Location ID, Company ID, and the number of AI agents currently linked to a GHL calendar. * **Refresh:** Use this button if you are experiencing any syncing issues (e.g., calendars not displaying correctly or data failing to push to your GHL account). It forces a manual sync. * **Disconnect:** Completely removes the GoHighLevel integration from your Agni workspace. Connected GoHighLevel card showing Configure, Refresh, and Disconnect options *** ## Managing Appointments Once GoHighLevel is connected, you unlock the **Appointments** tab in the sidebar. Here, you can view a full calendar of all appointments booked through your GHL account. You can track them by Day, Week, or Month, and filter by status (Confirmed, Cancelled, Rescheduled). You also have the ability to manually book new appointments directly from this interface using the **+ New Appointment** button. Appointments calendar view synced with GoHighLevel *** ## Configuring Agents for GoHighLevel To fully utilize the integration, you must configure your individual AI agents to use your GHL resources. ### 1. Setting Up the Calendar In your specific Agent's configuration settings, scroll down to the **Calendars** section. Select **Lead Connector** to link the agent to your GoHighLevel calendar. ### 2. Assigning Human Agents Below the calendar settings, you will find the **Assign Human Agent** section. This allows your AI to route calls or assign tasks to specific team members pulled directly from your GHL account. **Prerequisite:** The team members must first be added and configured inside your GoHighLevel settings under **My Staff**. Agent settings showing Calendar Time Zone and Assign Human Agent dropdown ### 3. Call Transfer Rules For the "Assign Human Agent" feature to actually trigger during a live conversation, you must configure the agent's **Transfer Call** function. **Important Routing Rules:** To successfully route a call to your selected human agent, you must select **Assign Human Agent** within the Transfer Call function settings. While this works seamlessly for both Web Calls and Phone Calls, **Web Calls specifically require you to select a fallback phone number** inside the transfer settings to execute properly. *** ## Connecting Cal.com Agni offers two distinct ways to integrate Cal.com: an **Org-Level** integration for managing multiple accounts globally, and an **Agent-Level** integration for connecting a specific calendar event directly to a single AI agent. ### 1. Org-Level Integration (Workspace) Connecting at the organization level allows you to add multiple Cal.com accounts simultaneously. 1. On the Integrations page, locate the **Cal.com** card and click **Connect**. 2. Enter your Cal.com **API Key** and assign an **Account name**. 3. Giving the account a clear name is crucial if you plan to connect multiple accounts, as it helps you identify which calendar you are assigning later on. **Note:** Even with multiple accounts connected at the Org level, a single AI agent can still only be assigned to one specific event at a time. Cal.com workspace configuration panel showing API key and account name inputs ### 2. Agent-Level Integration (Custom API Key) If you prefer to bypass the workspace settings and connect a specific event directly to a specific agent, you can do this from within the Agent Builder. 1. Navigate to the agent you want to edit and open the **Calendars** section. 2. Select **Cal.com**. 3. Choose the **Custom API Key** tab. 4. Input the specific **Cal.com API Key** and the exact **Event ID** (found in your Cal.com dashboard) that you want this agent to book appointments for. Agent calendar setup showing custom API key and Event ID fields for Cal.com Agent calendar setup showing selection from pre-connected workspace accounts *** ## Master Calendar Time Zone Configurations Handling appointments across different global regions can be tricky. To solve this, Agni includes an independent **Calendar Time Zone** setting inside your Agent Builder. **Global Support:** This timezone setting functions independently and works flawlessly for both **GoHighLevel** and **Cal.com** integrations. ### How the Timezone Resolver Works Let's look at a common scenario where the business operates in one timezone, but the AI agent is serving customers in another. * **Your Native Calendar:** Pacific/Fiji (UTC+12) * **Your Target Audience:** America/Los\_Angeles (UTC-7) If a lead in California asks the AI agent to book an appointment for "4:00 PM," and you haven't adjusted the timezone, the system might accidentally book it for 4:00 PM *Fiji* time. **The Solution:** By setting the **Calendar Time Zone** dropdown in the Agent Builder to `America/Los_Angeles`, the AI knows the lead is speaking in Pacific Time. When the lead books for 4:00 PM: 1. The AI agent seamlessly reserves 4:00 PM in `America/Los_Angeles` time. 2. The Agni system automatically converts this data so that it appears correctly on your native calendar. 3. In your personal Cal.com or GHL dashboard, you will accurately see the booking scheduled for **11:00 AM the following day in Pacific/Fiji time**. # Agents Source: https://docs.ravan.ai/guides/agents Create, configure, and test real-time voice AI agents with custom voices, tools, and call handling behavior. The **Agents** dashboard is where you design the core intelligence of your voice infrastructure. From this central view, you can monitor the real-time performance of every agent in your organization. Main agents dashboard showing active and inactive agents *** ## Quick start Get your first agent live in under 5 minutes: From the dashboard, click **+ New Agent** to open the builder. Write your system prompt. Add local timezone context if you want real-time temporal awareness. Choose your AI model. Select a voice and a preferred accent. Adjust the emotional tone of the agent. Define how the AI agent begins the conversation. Use the testing panel to start a live conversation immediately. *** ## Creating a new agent The agent builder features a simplified, unified workspace. You manage the system prompt on the left side. You configure technical settings on the right side. The simplified Agni agent builder interface ### AI provider settings Configure the reasoning engine. Define the personality of the voice: * **Model:** Select **Agni Premium** for high-fidelity reasoning and complex conversations. Alternatively, select **Agni Lite** for a budget-friendly option with faster response times. AI model selection dropdown showing Agni Premium and Agni Lite * **Voice & accent:** Choose from our library of voices. You can apply a **Voice Accent** to match local regional preferences. For example, select **US Southern** to make your agent match a southern US accent. You can also customize the emotional expressiveness with **Emotion** settings to make interactions sound more human. Voice settings with accent and emotion selection ### Prompt and timezone Write the guidelines for your agent in the prompt editor. You can also configure the **Timezone** field: * **Timezone:** Enable this field to give the agent real-time awareness for a specific area. This option adds a context line directly to the start of your prompt. You must enable it if you want the agent to reference the correct local time during calls. Timezone setting in prompt configuration ### Welcome message Under the **Welcome Message** tab, decide how the interaction starts. If the agent speaks first, you can choose a static custom message. Alternatively, select a **Dynamic message based on prompt** to let the agent tailor the greeting to the call context. Options for setting dynamic or custom welcome messages *** ## Agent configuration ### Functions & tools Equip your agent with the ability to take action during a call. Dropdown menu for agent functions like End Call and Transfer * **IVR / Press Digit:** Navigate automated phone menus. You can set the **Pause Detection Delay** to ensure the agent waits before pressing a digit. * **Custom Functions:** Connect your backend system. * **Custom (Server-Side):** Configure direct API calls with custom headers and JSON schemas. * **Client Function:** Define parameters that the model returns to your local application. The configuration screen for a server-side custom function ### Specialized settings Fine-tune the audio environment. Add **Background Sounds** like an office hum or traffic noise. You can adjust the **Interruption Sensitivity**. Configure **Reminder Messages** for silent periods. Control telephony rules like **Voicemail Detection**, **Max Duration**, and **Emergency fallback**. * **Emergency fallback:** Specify a backup phone number. If the AI agent encounters a critical failure (such as an LLM provider outage, severe latency, or an unexpected server error), the call will automatically transfer to this fallback number. This ensures your customers always reach a human when things go wrong instead of being hung up on. * **Memory:** Enable **Memory** to let the agent remember past conversations with returning callers. Note: Memory works strictly on inbound and outbound calls. It is not supported on web calls. Define what data to extract from the transcript. You can capture sentiments and generate summaries. You can also pull custom structured JSON. Link a knowledge base to let your agent answer questions using your company documentation. *** ## Testing your agent The built-in testing environment allows you to test your agent safely before deployment. The testing sidebar for web and phone calls ### Test modalities * **Web Call:** Talk to your agent directly through your browser. In the **Metadata** section, click **Add** to enter metadata as key-value pairs for testing dynamic prompt variables. **Using dynamic variables:** To set up dynamic variables, include them in your prompt using double curly braces (for example, `{{user_name}}`). New input fields will automatically appear in your testing panel to let you pass test values. Testing panel showing dynamic variable inputs * **Phone Call:** Enter your phone number to receive a live call from the agent. This allows you to experience agent behavior over a real cellular network. **Pro Tip:** After completing a test call, check the post-call data. This lets you verify that data extraction is functioning correctly. *** ## API Reference This section documents the HTTP API for managing agents. ### Endpoints * **List agents**: `GET /api/v1/agents` * **Get agent**: `GET /api/v1/agents/{id}` * **Create agent**: `POST /api/v1/agents` * **Update agent**: `PATCH /api/v1/agents/{id}` * **Update status**: `PATCH /api/v1/agents/{id}/status` * **Delete agent**: `DELETE /api/v1/agents/{id}` * **Disconnect Cal.com**: `POST /api/v1/agents/{id}/disconnect-calcom` * **Disconnect tools**: `POST /api/v1/agents/{agent_id}/disconnect-tools` ### Examples List agents Request: ``` GET https://api.ravan.ai/api/v1/agents?search=&limit=20&offset=0 ``` Response: ```json theme={null} { "success": true, "message": "Agents fetched successfully", "data": [ { "id": "019eb654-a185-77c6-9555-1d33d120881b", "organizationId": "95a4e479-03a7-4f1b-834d-8705756e8e59", "agentName": "Input field", "status": "ACTIVE", "model": "Agni Premium", "s2sModel": "Agni Premium", "voiceId": "Iris", "temperature": 0.7, "reminderTriggerMs": 10000, "reminderMaxCount": 2, "ambientSound": "forest_ambience", "ambientSoundVolume": 1, "maxCallDurationMs": 600000, "ringDurationMs": 32000, "voicemailMessage": "", "voicemailDetectionTimeoutMs": 7000, "postCallAnalysisModel": "gpt-4o-mini", "postCallAnalysisData": [ { "choices": ["Negative", "Positive", "Neutral"], "description": "what was users sentiment throughout the call", "name": "sentiments", "type": "enum" } ], "selectedTools": null, "knowledgeBase": "8619dc3f-b8f6-4a83-924d-f29478f9dd75", "beginMessage": "", "startSpeaker": "agent", "createdAt": "2026-06-11 10:57:40.229069 +0000 UTC", "updatedAt": "2026-06-11 18:26:17.115921 +0000 UTC", "webhookUrls": ["https://webhook.site/91014639-55d6-49c9-861a-7f652cf42cf4"], "ghlCalendarId": "", "calcomCalendarId": "", "prompt": "The current date and Time in Asia/Calcutta is {{current_time_Asia/Calcutta}}", "endcallOnSilenceDuration": 10000, "reminderMessage": "HI are you there??", "voicemailCustomPatterns": null, "interruptionSensitivity": 0.1, "calcomApiKey": "cal_live_...", "calcomApiUrl": "https://api.cal.com", "callStats": { "totalCalls": 3, "inboundCalls": 0, "outboundCalls": 3, "webCalls": 0, "totalDurationSec": 0, "avgDurationSec": 0, "totalCost": 0, "lastCallAt": "2026-06-11T11:17:03Z", "completedCalls": 0, "failedCalls": 0, "noAnswerCalls": 3, "busyCalls": 0, "avgLatencyMs": 0 }, "campaignStats": { "totalCampaigns": 1, "totalContacts": 1, "contacted": 1, "successful": 1, "failed": 0, "noAnswer": 0, "pending": 0, "inProgress": 0 }, "calcomAccountName": "Default", "calcomStatus": "active", "calcomConnectionType": "agent", "ghlAssignUserIdList": [], "memory": true, "calendarTimezone": "Asia/Calcutta", "accent": ["india/hindi"], "emotion": true, "crmSyncProviders": null, "salesforceCalendarId": "", "salesforceAssignUserIdList": [], "emergencyFallback": "+1-555-0100" } ], "meta": { "total": "2", "limit": 10, "offset": 0 } } ``` ### List agent response fields | Field | Type | Description | | --------- | ------- | ------------------------------------------- | | `success` | boolean | Whether the request completed successfully. | | `message` | string | Human-readable API message. | | `data` | array | List of agent objects. | | `meta` | object | Pagination metadata. | Agent object: | Field | Type | Description | | ----------------------------- | ------------- | ------------------------------------------------------------------------- | | `id` | string | Unique agent ID. | | `organizationId` | string | Organization ID that owns the agent. | | `agentName` | string | Agent display name. | | `status` | string | Agent status, for example `ACTIVE`. | | `model` | string | Primary model used by the agent. | | `s2sModel` | string | Speech-to-speech model used by the agent. | | `voiceId` | string | Selected voice name or ID. | | `temperature` | number | Model temperature. | | `reminderTriggerMs` | number | Silence duration before a reminder is triggered, in milliseconds. | | `reminderMaxCount` | number | Maximum reminder attempts during silence. | | `ambientSound` | string | Background sound preset. | | `ambientSoundVolume` | number | Background sound volume. | | `maxCallDurationMs` | number | Maximum call duration in milliseconds. | | `ringDurationMs` | number | Maximum ringing duration in milliseconds. | | `voicemailMessage` | string | Message used when voicemail is detected. | | `voicemailDetectionTimeoutMs` | number | Voicemail detection timeout in milliseconds. | | `postCallAnalysisModel` | string | Model used for post-call analysis. | | `postCallAnalysisData` | array | Structured fields extracted after a call. | | `selectedTools` | array or null | Tool IDs selected for the agent. | | `knowledgeBase` | string | Linked knowledge base ID, or an empty string when not configured. | | `beginMessage` | string | Opening message for the agent. | | `startSpeaker` | string | Speaker that starts the call, for example `agent`. | | `createdAt` | string | Agent creation timestamp. | | `updatedAt` | string | Agent update timestamp. | | `webhookUrls` | array | Webhook URLs called for agent events or data sync. | | `ghlCalendarId` | string | GoHighLevel calendar ID. | | `calcomCalendarId` | string | Cal.com calendar ID. | | `prompt` | string | Agent system prompt. | | `endcallOnSilenceDuration` | number | Silence duration before ending the call, in milliseconds. | | `reminderMessage` | string | Reminder message spoken during silence. | | `voicemailCustomPatterns` | array or null | Custom voicemail detection patterns. | | `interruptionSensitivity` | number | Sensitivity for user interruptions. | | `calcomApiKey` | string | Cal.com API key configured for the agent. | | `calcomApiUrl` | string | Cal.com API base URL. | | `campaignStats` | object | Campaign performance stats. Present only when campaign data is available. | | `callStats` | object | Call performance stats. | | `calcomAccountName` | string | Connected Cal.com account name. | | `calcomStatus` | string | Cal.com connection status. | | `calcomConnectionType` | string | Cal.com connection owner type. | | `ghlAssignUserIdList` | array | GoHighLevel user IDs assigned to the agent. | | `memory` | boolean | Whether agent memory is enabled. | | `calendarTimezone` | string | Calendar timezone used for scheduling. | | `accent` | array | Selected voice accent values. | | `emotion` | boolean | Whether emotional voice behavior is enabled. | | `crmSyncProviders` | array or null | CRM sync providers configured for the agent. | | `salesforceCalendarId` | string | Salesforce calendar ID. | | `salesforceAssignUserIdList` | array | Salesforce user IDs assigned to the agent. | | `emergencyFallback` | string | Fallback phone number used during critical failures. | Post-call analysis item: | Field | Type | Description | | ------------- | ------ | -------------------------------------------------------------- | | `name` | string | Extracted field name. | | `type` | string | Field type, for example `string` or `enum`. | | `description` | string | Instructions for extracting this field. | | `choices` | array | Allowed values for enum fields. Present when `type` is `enum`. | Call stats: | Field | Type | Description | | ------------------ | ------ | --------------------------------- | | `totalCalls` | number | Total calls handled by the agent. | | `inboundCalls` | number | Inbound call count. | | `outboundCalls` | number | Outbound call count. | | `webCalls` | number | Web call count. | | `totalDurationSec` | number | Total call duration in seconds. | | `avgDurationSec` | number | Average call duration in seconds. | | `totalCost` | number | Total call cost. | | `lastCallAt` | string | Timestamp of the latest call. | | `completedCalls` | number | Completed call count. | | `failedCalls` | number | Failed call count. | | `noAnswerCalls` | number | No-answer call count. | | `busyCalls` | number | Busy call count. | | `avgLatencyMs` | number | Average latency in milliseconds. | Campaign stats: | Field | Type | Description | | ---------------- | ------ | ------------------------------------- | | `totalCampaigns` | number | Total campaigns linked to the agent. | | `totalContacts` | number | Total contacts across campaigns. | | `contacted` | number | Contacts already contacted. | | `successful` | number | Successful campaign calls. | | `failed` | number | Failed campaign calls. | | `noAnswer` | number | Campaign calls with no answer. | | `pending` | number | Contacts pending outreach. | | `inProgress` | number | Campaign calls currently in progress. | Meta object: | Field | Type | Description | | -------- | ---------------- | --------------------------------------- | | `total` | string or number | Total matching agents. | | `limit` | number | Page size used for the request. | | `offset` | number | Pagination offset used for the request. | Get agent Request: ``` GET https://api.ravan.ai/api/v1/agents/{id} ``` Response: ```json theme={null} { "success": true, "message": "Agent fetched successfully", "data": { "id": "8f1c2e9a-...", "agentName": "Sales Bot", "status": "active", "model": "gpt-4o", "voiceId": "voice_123", "createdAt": "2026-06-01T10:00:00Z", "updatedAt": "2026-06-08T12:00:00Z" } } ``` Create agent Request (example payload): ```json theme={null} POST https://api.ravan.ai/api/v1/agents { "agentName": "Sales Bot", "model": "gpt-4o", "s2sModel": "gpt-4o-realtime", "voiceId": "voice_123", "temperature": 0.7, "prompt": "You are a helpful sales agent...", "beginMessage": "Hi, thanks for calling!" } ``` Response: ```json theme={null} { "success": true, "message": "Agent created successfully", "data": { "id": "new-uuid", "agentName": "Sales Bot", "status": "active" } } ``` Update agent Request: ```json theme={null} PATCH https://api.ravan.ai/api/v1/agents/{id} { "agentName": "Sales Bot v2", "temperature": 0.6, "prompt": "Updated prompt..." } ``` Response: ```json theme={null} { "success": true, "message": "Agent updated successfully", "data": { "id": "...", "agentName": "Sales Bot v2" } } ``` Update status Request: ```json theme={null} PATCH https://api.ravan.ai/api/v1/agents/{id}/status { "status": "inactive" } ``` Response: ```json theme={null} { "success": true, "message": "Agent status updated successfully", "data": { "id": "...", "status": "inactive" } } ``` Delete agent Request: ``` DELETE https://api.ravan.ai/api/v1/agents/{id} ``` Response: `200 OK` with empty body `{}` Disconnect Cal.com Request: ``` POST https://api.ravan.ai/api/v1/agents/{id}/disconnect-calcom ``` Response: `{}` Disconnect tools Request: ``` POST https://api.ravan.ai/api/v1/agents/{agent_id}/disconnect-tools ``` Response: ```json theme={null} { "success": true, "message": "Agent tools disconnected successfully. Reverting to organization defaults." } ``` *** ## Tools API Manage reusable tools (org-level or agent-scoped) used by agents. ### Endpoints * **List tools**: `GET /api/v1/tools` * **Get tool**: `GET /api/v1/tools/{id}` * **Create tool**: `POST /api/v1/tools` * **Update tool**: `PATCH /api/v1/tools/{id}` * **Delete tool**: `DELETE /api/v1/tools/{id}` * **Duplicate tool**: `POST /api/v1/tools/{id}/duplicate` * **Toggle tool**: `PATCH /api/v1/tools/{id}/toggle` * **Bulk-remove from agent**: `DELETE /api/v1/agents/{agent_id}/tools` JSON uses camelCase; unpopulated fields are omitted. `AgentTool` example shape: ```json theme={null} { "id": "uuid", "organizationId": "uuid", "name": "book_appointment", "description": "Books a calendar slot", "type": "function", "definition": { "parameters": { "type": "object", "properties": {} } }, "isActive": true, "agentId": "", "enabledFunctions": { "values": ["book", "cancel"] } } ``` ### Examples List tools (optionally scoped to an agent) Request: ``` GET https://api.ravan.ai/api/v1/tools?agent_id=&limit=20&offset=0 ``` Response: ```json theme={null} { "success": true, "message": "Tools fetched successfully", "data": [ { "id": "...", "name": "book_appointment", "isActive": true } ], "meta": { "total": 1, "limit": 20, "offset": 0 } } ``` Get tool Request: ``` GET https://api.ravan.ai/api/v1/tools/{id} ``` Response: ```json theme={null} { "success": true, "message": "Tool fetched successfully", "data": { "id": "...", "name": "book_appointment" } } ``` Create tool Request (CreateAgentToolRequest): ```json theme={null} POST https://api.ravan.ai/api/v1/tools { "name": "book_appointment", "description": "Books a calendar slot for the caller", "type": "function", "agentId": "", "definition": { "parameters": { "type": "object", "properties": { "datetime": { "type": "string" }, "name": { "type": "string" } }, "required": ["datetime"] } }, "enabledFunctions": { "values": ["book", "cancel"] } } ``` Response: ```json theme={null} { "success": true, "message": "Tool created successfully", "data": { "id": "new-uuid", "name": "book_appointment" } } ``` Update tool Request: ```json theme={null} PATCH https://api.ravan.ai/api/v1/tools/{id} { "name": "book_appointment_v2", "description": "Updated", "definition": { "parameters": {} }, "enabledFunctions": { "values": ["book"] } } ``` Response: ```json theme={null} { "success": true, "message": "Tool updated successfully", "data": { "id": "..." } } ``` Delete tool Request: ``` DELETE https://api.ravan.ai/api/v1/tools/{id} ``` Response: `200 OK` with empty body `{}` Duplicate tool Request: ```json theme={null} POST https://api.ravan.ai/api/v1/tools/{id}/duplicate { "agentId": "8f1c2e9a-..." } ``` Response: ```json theme={null} { "success": true, "message": "Tool duplicated successfully", "data": { "id": "clone-uuid" } } ``` Toggle tool Request: ```json theme={null} PATCH https://api.ravan.ai/api/v1/tools/{id}/toggle { "isEnabled": false } ``` Response: ```json theme={null} { "success": true, "message": "Tool toggled successfully", "data": { "id": "...", "isActive": false } } ``` Bulk-remove tools from an agent Request (X-Api-Key protected): ```json theme={null} DELETE https://api.ravan.ai/api/v1/agents/{agent_id}/tools { "ids": ["tool-uuid-1", "tool-uuid-2"] } ``` Response: `200 OK` with empty body `{}` # Platform Analytics Source: https://docs.ravan.ai/guides/analytics Monitor call volume, track success rates, analyze sentiment, and measure agent performance across your entire voice infrastructure. The **Analytics** page provides a deep dive into the operational health and effectiveness of your voice infrastructure. It allows you to monitor volume, track success rates, identify trends, and analyze AI-powered caller sentiment at a glance. Agni Analytics Dashboard showing platform performance insights *** ## Performance KPIs At the top of the Analytics dashboard, six high-level metrics give you an immediate snapshot of your platform's performance based on your selected date range: The absolute volume of inbound and outbound calls processed. Use this to gauge overall platform utilization. The aggregate number of voice minutes consumed across all calls. The percentage of calls where the agent successfully completed its objective. Low success rates may indicate prompt issues or tool misconfiguration. The average length of your conversations. Shorter isn't always better—the right duration depends entirely on your use case. The total number of unique AI agents that fielded calls during the selected period. The overarching sentiment score of your callers (e.g., 26% Positive), determined by AI post-call analysis. *** ## Visualizations & Trends Agni provides a powerful suite of interactive charts to help you visualize data trends and optimize your agents' performance over time. A line graph tracking your **Minutes over time**. This chart directly correlates to your platform spend. Look for unexpected spikes or drops in consumption. A comparative bar chart plotting **Success vs Failed** calls over your selected period. A rising failure rate often signals routing issues, prompt problems, or integration errors. An AI-powered call sentiment breakdown showing the exact distribution of **Positive, Neutral, and Negative** calls, complete with a secondary graph tracking the **Weekly trend** of these emotions over time. A horizontal bar chart comparing the **Success rates by agent**. Use this to A/B test system prompts, voices, or tool configurations to identify your most effective deployments. Plots your **Avg duration by hour of day**. This widget also highlights the **Longest** and **Shortest** calls recorded during the timeframe to help you spot outliers. Visualizes **Call volume by hour of day**, categorized by **Business hours** and **Off hours**. Use this to plan concurrency needs and evaluate when your customers are most active. *** ## What to Look For Check your agent's system prompt and tools first. A common cause is tool descriptions that are too vague, causing the AI to trigger actions at the wrong time. Review recent call transcripts in the [All Call History](/guides/calls) page. This could mean agents are struggling to reach their objective and conversations are dragging. Or, it could mean your agents are handling more complex queries—context matters. Check the call transcripts to understand. Review the [All Call History](/guides/calls) detail view for recent calls with negative sentiment. Common causes: the agent interrupting the caller too aggressively, providing incorrect information, or failing to resolve the issue. Check the **Usage Trend** chart for volume anomalies. If calls increased but were unintended, review your dispatch rules and campaign settings. Also, check the **Call Duration** widget for abnormally long-running calls. *** ## Filtering and Exporting Data In the top right corner of the dashboard, you can control the scope of your analytics: Use the quick-select pills or the date picker to recalculate your dashboard metrics for a specific timeframe (e.g., Last 30d). Download your current analytics view to ingest this data into your CRM, billing software, or business intelligence tools for deeper analysis. **Tip:** Set a weekly cadence to review your analytics. Tracking trends in the **Sentiment Analysis** and **Usage Trend** charts over time is much more valuable than looking at any single day's numbers. # API keys Source: https://docs.ravan.ai/guides/api-keys Understand what API keys are, how Agni uses them, and how developers should handle them securely. An API key is a secret token that identifies your organization when your app calls the Agni API.\ Think of it like a password for server-to-server access. *** ## What is an API key * It proves the request is coming from your Agni workspace. * It controls access to protected API endpoints. * It should only be used in trusted backend environments. Never put your API key in frontend code, public Git repositories, or client-side apps. *** ## Where to get your API key 1. Sign in to `https://app.ravan.ai`. 2. Open **Settings**. 3. Go to **Security & Access** > **API Keys**. 4. Click **+ New Key**. 5. Copy it immediately and store it securely. Settings page showing the Security and Access API Keys section You can only view a newly generated key once. *** ## How Agni uses your API key Send your key in the `X-Api-Key` header on every API request. ```bash theme={null} curl https://api.ravan.ai/api/v1/agents/ \ -H "X-Api-Key: YOUR_API_KEY" ``` If the key is missing, invalid, or revoked, the API returns `401 Unauthorized`. *** ## Developer implementation guide Use your API key only on the server side, and inject it from environment variables. ```bash theme={null} # .env AGNI_API_KEY=your_real_key_here ``` ```js theme={null} const response = await fetch("https://api.ravan.ai/api/v1/agents/", { method: "GET", headers: { "X-Api-Key": process.env.AGNI_API_KEY } }); ``` *** ## Security best practices * Rotate keys regularly. * Use separate keys for staging and production. * Revoke compromised keys immediately. * Do not share keys in chat, tickets, or screenshots. * Audit logs when you see unexpected API behavior. *** ## Troubleshooting If requests fail with `401`: * Confirm the header name is exactly `X-Api-Key`. * Check there are no extra spaces in the key value. * Ensure you are using an active key from the correct workspace. * Regenerate the key and update your server environment. # Appointments Source: https://docs.ravan.ai/guides/appointments View and manage calendar bookings generated by your voice AI agents. Currently visualizing GoHighLevel integrations. The **Appointments** page acts as a centralized calendar for your Agni workspace. When your AI agents successfully negotiate a time and book a meeting with a caller, the resulting calendar events are automatically synced and displayed here. Agni Appointments Dashboard visualizing GoHighLevel calendar events *** ## How Appointment Booking Works Agni agents can book, reschedule, and cancel appointments autonomously during live calls. Here's how the flow works end-to-end: Link your **GoHighLevel** or **Cal.com** account in [Workspace Settings](/guides/settings). This gives Agni access to your calendars and availability. In the [Agent Builder](/guides/agents), open the **Calendars** panel and select which calendar the agent should use for booking. During a live call, the agent checks your real-time availability, suggests open slots, and confirms with the caller. It handles conflicts, timezone differences, and rescheduling automatically. Once confirmed, the appointment appears in your connected platform. **GoHighLevel** bookings will also instantly populate your visual Agni Appointments dashboard. *** ## Integration Sources While your agents can book meetings using both GoHighLevel and Cal.com, the visual calendar inside the Agni dashboard currently displays data synced from **GoHighLevel**. View, filter, and manage appointments synced from your connected GHL sub-accounts directly within the Agni dashboard. Agents can successfully book meetings via Cal.com. Manage these specific bookings directly inside your Cal.com account. **Connection Required:** If you see a "Failed to load appointments" error, you must first authenticate and connect your GHL account in your [Workspace Settings](/guides/settings). *** ## Calendar Controls To help you manage high volumes of automated bookings, the left sidebar of the dashboard provides several organizational tools: Switch between **Month**, **Week**, and **Day** views to adjust timeline density based on your booking volume. Quickly toggle specific event states. Bookings are color-coded for quick scanning: **Confirmed** (Blue), **Cancelled** (Red), and **Rescheduled** (Yellow). Instantly find specific bookings by typing an individual's name into the **Attendee name...** search bar. ### Manual Actions Located in the top right corner of the dashboard: * **+ New Appointment:** While agents handle automation, you can click here to manually reserve a slot directly from the Agni interface. * **Refresh:** Click to manually force a sync and pull the latest data from your GHL integration. *** ## What the Agent Says During Booking During a call, the agent handles the full appointment workflow naturally. Here's an example conversation flow: *"Let me check what times are available this week... I have openings on Tuesday at 10 AM, Wednesday at 2 PM, and Thursday at 9:30 AM. Which works best for you?"* *"Great, I've booked you for Wednesday at 2 PM. You'll receive a confirmation email shortly. Is there anything else I can help with?"* *"I'm sorry, that slot was just taken. The next available time on Tuesday is 3:30 PM. Would that work instead?"* *"No problem, I've moved your appointment from Tuesday at 10 AM to Thursday at 9:30 AM. You'll get an updated confirmation."* *** ## Troubleshooting Make sure your GHL integration is connected in [Settings](/guides/settings). Click **Refresh** on the appointments page to force a sync. Check that the correct calendar is assigned to your agent. Verify that a calendar is assigned in the agent's **Calendars** panel. Test with a web call first to confirm the integration works before using live phone calls. The agent uses the caller's detected timezone. If bookings appear at wrong times, check the timezone settings in your GHL calendar configuration. *** ## API Reference Manage your calendar integrations and appointments programmatically via the Agni REST API. Book, reschedule, cancel, and check availability via GHL. Book, reschedule, cancel, and check availability via Cal.com. # Authentication Source: https://docs.ravan.ai/guides/authentication Create your organization, verify your identity, and get your API key to start building with Agni. Welcome to Agni. To start building production-grade voice AI agents, you need an active workspace. This guide covers how to register your organization, verify your identity, generate API keys, and manage access. *** ## Create an Account The creation process registers a new Agni organization and sets up your initial administrator account. Agni Create Account Page ### Registration Steps Open the [Agni Web App](https://app.ravan.ai) and click **Create an account**. You can securely click **Sign up with Google** for single sign-on (which bypasses manual email verification), or proceed with a standard email registration. If using email, provide your **Organization Name**, **First Name**, **Last Name**, and **Phone Number** with the correct country code. Your organization acts as the top-level container for your agents, phone numbers, and billing. [Know more about organizations](/guides/organizations-and-roles). Enter a valid work **Email**, a secure **Password** (minimum 8 characters), and select how you heard about Agni, then click **Create account**. If you registered via email, you will be redirected to the verification screen. Check your inbox for an email from Agni AI. Email Verification Screen You can either click the **Verify Account** button directly in the email, or copy the 6-digit code provided and enter it manually into the verification screen. Verification codes are only valid for 10 minutes. If your code expires or you do not receive the email, click **Didn't receive the code? Resend** on the verification screen. Once verified, you will be routed directly to your new workspace dashboard. If your email is already registered to an existing workspace, Agni will prompt you to sign in instead. *** ## Log In Access your existing Agni workspace to manage agents, configure telephony, and retrieve your API keys. Agni Login Page ### Sign In Steps Open the [Agni Login Page](https://app.ravan.ai/login). Click **Continue with Google** if your account is linked to Google Workspace, or enter your registered **Email** and **Password**. Click **Sign in** to access your dashboard. If you lose access to your account, use the **Forgot?** link above the password field to initiate a secure password reset workflow. *** ## Generate an API Key To interact with Agni programmatically, you need an API key. Here's how to create one: Click your profile in the bottom-left corner of the dashboard, then select **Settings**. In the Settings menu, click the **API Keys** tab under **Security & Access**. Click **+ New Key**. Your API key will be generated and displayed once. Copy it immediately. Save the key in a secure location (e.g., environment variable, secrets manager). You will not be able to view it again after closing the dialog. Never expose your API key in client-side code, public repositories, or browser-accessible files. Treat it like a password. ### Using Your API Key Pass the key in the `X-Api-Key` header with every API request: ```bash theme={null} curl https://api.ravan.ai/api/v1/agents/ \ -H "X-Api-Key: YOUR_API_KEY" ``` *** ## Next Steps
Full REST API documentation with request examples in cURL, Python, and JavaScript. Build and deploy your first real-time voice AI agent. Buy a phone number and connect it to your agent. Configure your organization, invite team members, and connect integrations.
# Billing Source: https://docs.ravan.ai/guides/billing Manage your subscription plan, purchase credits, monitor usage costs, and access billing history. The **Billing** page is where you manage the financial aspects of your Agni workspace. Agni operates on a hybrid model: you must first select a baseline monthly subscription plan, which then unlocks the ability to purchase prepaid credits for your usage. Agni Billing Dashboard showing Available Plans and Credits *** ## Subscriptions & Plans Agni offers dynamic subscription tiers based on your selected region. All subscriptions are processed securely via Stripe. Choose the plan that best fits your concurrency and volume needs. All plans include the emotion engine, 50+ languages, dialect support, API access, email support, priority support, and the analytics dashboard. **\$97 per month** Perfect for early-stage startups and pilot programs exploring voice AI. * Up to **15 concurrent calls** * **\$0.09** per credit **\$297 per month** Ideal for growing teams scaling their real-time voice infrastructure. * Up to **25 concurrent calls** * **\$0.07** per credit **\$497 per month** Built for high-volume operations requiring maximum throughput. * Up to **50 concurrent calls** * **\$0.05** per credit *** ## Credits & Usage Because real-time voice AI incurs immediate compute and telephony costs, Agni uses a prepaid credit system for call volume. Your agents consume these credits dynamically as they handle live calls. **Important:** You must have an active subscription plan (Starter, Growth, or Scale) before you can purchase usage credits. Displays your organization's current, real-time credit balance at the top of the page. Keep an eye on this metric to ensure your agents stay online. Once subscribed, click this button to top up your account. Adding funds takes only a few seconds and applies to your workspace instantly. If your credit balance reaches zero, your agents will be temporarily paused and active dispatch rules will fail to connect. Ensure you maintain a positive balance to avoid service interruptions. *** ## Billing History At the bottom of the page, the **Billing History** table provides a transparent ledger of your past transactions. Whether you are purchasing prepaid credits or paying for your monthly subscription plan, your official invoices and receipts will automatically populate in this table. You can download them at any time for your accounting and tax records. *** ## Cost Optimization Tips In your agent's [Call Settings](/guides/agents), set a **Max duration** to prevent runaway calls from consuming excessive credits. 30 minutes is a good hard limit for most use cases. Turn on **End call after silence** in your agent settings to automatically disconnect calls where the caller has gone silent, avoiding wasted credits. Check the [Analytics dashboard](/guides/analytics) regularly. Watch for unexpected spikes in call volume or duration that could indicate prompt issues or campaign misconfiguration. Not every use case needs the most powerful model. For simple routing or FAQ agents, Thunder Emotion Lite performs exceptionally well at a lower computational cost. # All Call History Source: https://docs.ravan.ai/guides/calls Monitor, filter, and review every conversation handled by your Agni agents—including transcripts, recordings, summaries, credit usage, and sentiment analysis. The **All Call History** page serves as your centralized ledger for all voice interactions across your organization. Whether you are running high-volume outbound campaigns, fielding inbound customer support calls, or testing your web widget, every session is logged here in real time. Agni All Call History list view *** ## Session metrics At the top of the dashboard, a quick-glance summary provides the status of your call volume for the selected timeframe: The cumulative number of all calls across all channels and agents. Calls that successfully reached their natural conclusion. Calls that dropped, failed to connect, or encountered system errors. Live calls currently being handled by your agents. *** ## Call data and channels Agni consolidates traffic from multiple channels into a single view. You can filter the main table using the quick tabs above the list: **All**, **Web**, **Inbound**, or **Outbound**. For every session, the table captures granular data: * **Caller:** The phone number or web session identifier of the user. * **Status:** The outcome of the call. * **Channel:** The origin of the call. * **Duration:** The total length of the conversation. * **Sentiment:** The overall mood of the interaction. * **Agent:** The specific AI agent that handled the interaction. * **Time:** The date and timestamp of when the call occurred. *** ## Call detail view Click on any row to open the full **Call Detail View**. This view provides a comprehensive breakdown of the conversation. The page displays metadata on the left and the interaction transcript on the right. All Call History detailed view showing metadata and transcript ### Left panel: Metadata and analysis The left side of the detailed view gives you the technical and analytical breakdown of the call: * **Core Metrics:** Instantly view the **Callee** number, total **Duration**, **Channel**, total **Credits** consumed, the overall **Sentiment**, and the **Agent** used. * **Credit Breakdown:** Click the dropdown arrow next to your total credits to see exactly how your balance was consumed. This splits the cost into **Model Credits** (Agni AI compute), **Twilio Credits** (telephony infrastructure), and **Other Credits**. Expanded Credit Breakdown * **Disconnect Reason:** Explains exactly why the call ended (for example, `user hangup` or `max duration reached`). * **Created:** The exact timestamp the call was initiated. * **Post Call Analysis:** If configured on your agent, this section displays the AI-generated **Summary** of the conversation along with the final evaluated **Sentiment**. ### Right panel: Transcription and recording The right side of the view is dedicated to the actual conversation flow: * **Transcription:** A timestamped, speaker-labeled transcript presented in a chat-bubble format. The AI agent's responses are on the left, and the user's responses are on the right. * **Recording:** Click the **Recording** button at the top right of the transcription panel to listen to the actual audio of the phone call. * **Tool Calls:** View active tool invocations inline within the transcription flow. Click any tool card (such as `calcomAppointment`) to expand it. This reveals the full request payload and the response data for troubleshooting. Expanded tool call request and response payload * **Error Logs:** View detailed error logs directly when a call fails or goes unanswered. This includes carrier errors from telephony providers like Twilio or errors during the call. Call session error logs showing Twilio failure details *** ## Search, filter, and export To manage large volumes of call data, utilize the toolbar located above the main table: Look up specific calls by phone number or session ID using the search bar. Narrow down your view by selecting specific timeframes or applying advanced filters. Click the **Export** button in the top right to download your currently filtered call logs as a CSV file. # Outbound Source: https://docs.ravan.ai/guides/campaigns Run outbound calling at scale from the Campaigns section. Create outbound workflows, manage contact lists, monitor performance, and optimize results. # Running outbound calls In the **Campaigns** section, the **Outbound** area lets you automate outbound calls at scale — from lead qualification and appointment reminders to customer follow-ups and surveys. Define your audience, assign an agent, and let Agni handle the rest. *** Campaigns dashboard showing all campaigns with status, success rate, and contact counts *** ## How Campaigns Work Give your campaign a name, select the AI agent that will handle calls, and choose your Caller ID. Select contacts to call, set your call window (timezone, hours, active days), and configure advanced settings like retries and gap between attempts. After creating the campaign, click the **Start** button on the campaign overview page. Agni dials contacts automatically within your configured call window. Track completion rates, call outcomes, and campaign progress in real-time from the campaign overview. *** ## Creating a Campaign Click **+ New Campaign** from the Campaigns page. Campaign creation is a two-step process. ### Step 1 — Campaign Details New Campaign step 1 — enter campaign name, select AI agent, and choose Caller ID | Field | Description | | ----------------- | ------------------------------------------------------------------------------------ | | **Campaign Name** | A recognizable label for your campaign (e.g., "Q1 Customer Outreach") | | **AI Agent** | The voice agent that will handle the calls. You can search across all active agents. | | **Caller ID** | The phone number calls will be placed from. Select from your verified numbers. | ### Step 2 — Contacts & Settings New Campaign step 2 — select contacts and configure call window On the second step, select your contacts and configure the call schedule. **Selecting Contacts** Use the filter tabs to narrow your contact list: | Tab | Description | | ------------------ | -------------------------------------------- | | **Fresh Leads** | Contacts that have never been called | | **Need Follow-up** | Contacts that require a follow-up call | | **Failed - Retry** | Contacts where previous call attempts failed | | **All** | Your entire contact list | You can also filter by **Tags**, **Status**, **Last Called**, or **Added** date, and use **Select All** to include your entire filtered list. **Call Window** Define when Agni is allowed to place calls: | Setting | Description | | --------------- | --------------------------------------------------------------------------- | | **Timezone** | The timezone used to enforce your call window (e.g., UAE / Dubai UTC+04:00) | | **From / To** | Start and end time for calls each day (default: 09:00 AM – 05:00 PM) | | **Active Days** | Days of the week calls are permitted (default: Mon–Fri) | **Advanced Settings** | Setting | Description | Default | | ------------------ | -------------------------------------------------------------- | --------------------- | | **Max Concurrent** | Maximum simultaneous calls. Capped by your plan limit. | Up to 5 on free plans | | **Retries** | Number of retry attempts per contact if the call is unanswered | 2 | | **Gap (Min)** | Minimum time in minutes between retry attempts | 30 | Max Concurrent calls are controlled by your plan. Free plans support up to 5 concurrent calls. Upgrade your plan to increase this limit. Call window and Advanced Settings panel showing Max Concurrent, Retries, and Gap fields Click **Create Campaign** to finish. Your campaign will be created in **Draft** status. *** ## Starting a Campaign After creation, you'll land on the campaign overview page. The campaign starts in **Draft** state — no calls are placed yet. Click the **Start** button (top right) to activate the campaign. Agni will begin dialing contacts within your configured call window. You can **pause** a running campaign at any time from the campaign card on the Campaigns page or from within the campaign overview. *** ## Campaign Overview Once a campaign is created, clicking into it shows a full overview: Campaign overview page showing progress, stats, recent activity, and configuration panel | Section | Description | | --------------------- | ---------------------------------------------------------------------------- | | **Campaign Progress** | Bar showing Successful, Failed, No Answer, In Progress, and Pending contacts | | **Total Contacts** | Total number of contacts in the campaign | | **Success Rate** | Percentage of calls that achieved the desired outcome | | **Contacted** | Number of contacts successfully reached | | **In Progress** | Calls currently being placed | | **Recent Activity** | Live feed of call events as they happen | The right panel shows your **Configuration** (agent, outbound number), **Schedule** (call window, max concurrent), and **Retry Policy** (attempts, gap between retries). *** ## Campaigns Dashboard The main Campaigns page shows all your campaigns and a high-level summary at the top: | Metric | Description | | ----------------- | --------------------------------------- | | **Total Calls** | Total calls placed across all campaigns | | **Running Calls** | Calls currently in progress | | **Avg Success** | Average success rate across campaigns | | **Active** | Campaigns currently running | | **Scheduled** | Campaigns scheduled to run | Each campaign card displays the agent's phone number, creation date, total contacts, success rate, contacted count, and pending contacts. Campaigns can be in **Active**, **Paused**, **Completed**, or **Scheduled** states. Use the filter tabs (**All**, **Active**, **Scheduled**, **Paused**) or the search bar to find specific campaigns. *** ## Contact Management ### Importing Contacts Contacts can be added via CSV upload or the API before being assigned to a campaign. **Via CSV Upload:** ```csv theme={null} phone,name,company,appointment_date +14155551234,John Smith,Acme Corp,March 30 +14155559876,Jane Doe,TechCo,April 2 +14155555555,Bob Wilson,StartupHQ,April 5 ``` **Via API:** ```bash theme={null} curl -X POST https://api.ravan.ai/api/v1/contacts/ \ -H "X-Api-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "phone": "+14155551234", "first_name": "John", "last_name": "Smith", "company": "Acme Corp", "custom_fields": { "appointment_date": "March 30" } }' ``` ### Using Contact Data in Calls Contact fields map to dynamic variables in your agent prompt: ```text theme={null} You are calling {{first_name}} {{last_name}} from {{company}} about their appointment on {{appointment_date}}. ``` *** ## Campaign Patterns **Goal:** Reduce no-shows by confirming appointments 24 hours ahead. * Agent prompt: Confirm date/time, offer reschedule option * Concurrency: 5–10 (high volume, short calls) * Call window: Business hours, day before appointment * Retries: 2 * Dynamic variables: `{{patient_name}}`, `{{appointment_date}}`, `{{doctor_name}}` **Goal:** Qualify inbound leads before passing to sales. * Agent prompt: Ask qualifying questions (budget, timeline, decision maker) * Concurrency: 3–5 (longer conversations) * Call window: Within 5 minutes of lead submission * Retries: 3 (over 2 days) * Post-call analysis: Extract qualification score **Goal:** Collect NPS or satisfaction feedback post-purchase. * Agent prompt: Ask 3–5 structured questions, thank the customer * Concurrency: 5–8 * Call window: 2–7 days after purchase * Retries: 2 * Post-call extraction: Rating (1–10), comments, follow-up needed **Goal:** Win back churned or inactive customers. * Agent prompt: Acknowledge absence, offer incentive, address concerns * Concurrency: 3–5 * Call window: Weekday afternoons (highest answer rate) * Retries: 2 (avoid being pushy) * Tone: Warm, no hard sell *** ## Cost Optimization Test with 50–100 contacts first. Optimize the prompt and settings before scaling to thousands. Calls between 10am–12pm and 2pm–5pm local time have the highest answer rates. Avoid early mornings and late evenings. 2 retries with a 30-minute gap is a solid default. More retries rarely improve reach and increase costs. Start at 2–5 concurrent calls and scale up. Free plans are capped at 5 — upgrade for higher throughput. *** ## Compliance Outbound calling is regulated. Ensure compliance with local laws before launching campaigns. * **TCPA (US)** — Obtain prior express consent before automated calls. Honor Do Not Call lists. * **GDPR (EU)** — Lawful basis required for processing phone numbers. Provide opt-out on every call. * **Local regulations** — Check calling hour restrictions in your target regions. * **Caller ID** — Always display a valid caller ID number. Spoofing is illegal. Agni provides tools to manage opt-outs and consent — use them. Non-compliance can result in significant fines. # Contacts Source: https://docs.ravan.ai/guides/contacts Manage your global contact list and view detailed interaction histories for outbound campaigns. # Contacts The **Contacts** page is your central hub for managing your global contact list and campaign assignments. From here, you can add new prospects, import bulk lists, and drill down into individual contact analytics to track your outbound calling efforts. Contacts List Dashboard ## Adding and Managing Contacts From the main Contacts dashboard, you can search for existing contacts or use the top-right action buttons to manage your list: * **Add Contact**: Manually create a new individual contact record. * **Import CSV**: Upload a bulk list of contacts to quickly populate your database. * **Export CSV**: Download your current contact list for external reporting. * **Delete All**: Clear your existing contact database. ## Contact Details Clicking on a specific contact from your list opens their **Contact Details** dashboard. This page provides a comprehensive, 360-degree view of their identity, performance metrics, and interaction history. Contact Details Overview ### Key Metrics At the top of the profile, a quick-stat banner displays the overall calling outcomes for the contact: * **Total Calls**: The total number of call attempts made to this contact. * **Completed**: The number of calls that successfully connected and finished. * **No Answer**: The number of calls that rang but were not answered. * **Failed**: The number of calls that failed to connect due to network or routing issues. * **Avg Duration**: The average length of time spent on the phone with this contact. * **Total Time**: The cumulative duration of all successful calls. ### Insights & Metadata Below the top-level metrics, several detail cards provide deeper context about the contact and their journey: * **Contact snapshot**: Core identity and record metadata (including Contact ID, Organization, Creation/Update dates, and applied Tags). * **Call performance**: Calling outcomes and duration metrics visualized for quick assessment. * **Campaign footprint**: Campaign participation overview, summarizing how many campaigns the contact is part of and the associated calls or notes. * **Latest call**: Information regarding the most recent outbound interaction. * **Latest activity**: The last recorded event captured for this contact in the system. ### History and Assignments At the bottom of the details page, you can switch between dedicated tabs to view historical data or take action on the contact: Contact Campaigns View * **Activity**: Activities will appear here as you interact with this contact, providing a chronological timeline of events. * **Calls**: Call history will appear once this contact has been called, logging detailed records of each attempt. * **Campaigns**: Add this contact to a campaign to start reaching out, or view which campaigns they are already assigned to. * **Notes**: A space for any manual notes, observations, or context gathered during interactions. # Build your first phone agent in 5 minutes Source: https://docs.ravan.ai/guides/create-first-agent Step-by-step guide to create, test, and deploy your first AI phone agent. Create a working phone agent by setting its role, voice, greeting, and deployment path. This guide keeps the setup focused so you can make your first test call in a few minutes. Agni Agents dashboard with existing agents and the option to create a new agent ## Before you start You need access to an Agni workspace. If you have not signed in yet, follow [Authentication](/guides/authentication) first. For live phone deployment, you also need a connected phone number. You can still create and test the agent in your browser without one. Build the agent and define how it should handle calls. Run a browser call before you send the agent to real callers. Connect the agent to a number or campaign when it is ready. ## Create the agent From the Agni dashboard, click **Agents** in the sidebar. Agents dashboard showing the list of configured agents Click **+ New Agent** to open the agent builder. The builder gives you a prompt editor, model controls, voice settings, and test tools in one workspace. Agni agent builder with the prompt editor and configuration panels In the prompt editor, describe the agent's role, tone, goal, and boundaries. Use this starter prompt for your first test: ```text theme={null} You are Ava, a helpful phone agent for a dental clinic. Your goal is to greet callers, understand why they are calling, and help them book an appointment. Ask one question at a time. Keep responses under two sentences. If the caller asks for medical advice, explain that a dentist will help them during the appointment. Confirm the caller's name, preferred date, preferred time, and phone number before ending the call. ``` Open the model selector and choose the model you want the agent to use. For a first agent, choose the default recommended model unless you already know you need a faster or more specialized option. Model selector in the Agni agent builder Choose a voice that matches the caller experience you want. Click a voice to preview it, then select it for the agent. Voice picker showing available voices for an Agni agent Open the **Welcome Message** settings and choose how the agent starts the call. For your first agent, use a direct greeting: ```text theme={null} Hi, this is Ava from Bright Dental. How can I help you today? ``` Welcome message settings for an Agni agent Keep the first version small. Add tools, knowledge bases, and advanced call handling after the agent can complete one simple conversation well. ## Test the agent Use a browser call before connecting the agent to a phone number. This helps you catch prompt issues without spending telephony credits. Testing panel for running web and phone calls with an Agni agent In the agent builder, open the testing panel. Select **Web Call**, then start the call from your browser. Speak like a real caller. For example: ```text theme={null} Hi, I need to book a cleaning for next Tuesday afternoon. ``` Check whether the agent asked for the right details, stayed on task, and ended the call clearly. If the agent gives long answers, add a prompt rule such as `Keep responses under two sentences.` If it skips required details, list those details explicitly in the prompt. ## Deploy the agent Once the browser test works, connect the agent to a real calling path. Open [Phone Numbers](/guides/phone-numbers) and buy, import, or connect a number. Phone Numbers dashboard showing connected phone numbers For incoming calls, create an inbound rule and assign the phone number to your new agent. See [Inbound Calls](/guides/inbound-calls) under Campaigns for the full setup. For outbound calls, add the agent to an outbound workflow after you have contacts and caller ID ready. See [Outbound](/guides/campaigns) under Campaigns for the workflow. Call the number or launch a small test campaign. Confirm that the agent answers, follows the prompt, and captures the outcome you expect. ## Next steps Configure tools, speech settings, memory, and post-call extraction. Improve how your agent handles edge cases and caller intent. Buy, import, and manage numbers for live calling. Explore REST API endpoints for programmatic agent workflows. # Dashboard Overview Source: https://docs.ravan.ai/guides/dashboard Your central command center for monitoring agent performance, tracking usage, and navigating your Agni workspace. Once you log in, you are greeted by the Agni Dashboard. This is your central command center for monitoring agent performance, tracking usage, visualizing live traffic, and navigating your voice AI infrastructure. Agni Dashboard Overview *** ## At-a-Glance Metrics At the top of your dashboard, you can quickly assess the high-level health and performance of your voice agents in real time: Displays the aggregate conversational minutes consumed by your organization. Displays the total number of AI agents currently active within your organization. Shows the number of real-time, concurrent calls currently happening through your organization. Shows the total amount of credits burned or consumed by your organization to date. Highlights the overall percentage of calls made through the organization that successfully achieved their objective. Displays the total number of customers that have been successfully converted during interactions. *** ## Live Visualizations & Analytics The center of the dashboard provides a suite of interactive widgets to help you monitor system load and campaign outcomes dynamically. A live 3D visualization showing exactly where in the world your active calls are currently taking place. Useful for understanding your geographic distribution. Track how many calls and minutes have been spent over a specified period. Toggle between **Day**, **Week**, or **Month** views to spot patterns. A detailed breakdown displaying the number of Total Outbound Calls, Total Failed Calls, Total Success Calls, and overall Total Calls. Shows the total call volume for the current day, categorized by outbound, inbound, and web calls. A quick view of your currently active agents and the respective number of calls they have handled. Highlights the countries that have received the most calls or where you have initiated the highest call volume. *** ## Quick Actions Located at the bottom of the dashboard, the **Quick Actions** panel provides one-click access to your most common operational workflows: Build a new AI assistant. Launch outbound calls. Import or create users. Provision a phone number. *** ## Workspace Navigation The left sidebar is your primary map for navigating your Agni workspace. It is divided into focused sections: Your daily operational views and agent configurations. * **[Dashboard](/guides/dashboard):** Your high-level overview and metrics. * **[Agents](/guides/agents):** Create, update, and deploy your AI agents. * **[Knowledge Base](/guides/knowledge-base):** Manage the data and documents your agents use for context. Build and tune agent behavior. * **[Tools](/guides/tools):** Configure functions, actions, and integrations used by agents. * **[Prompt Engineering](/guides/prompt-engineering):** Design prompts, guardrails, and response behavior. Configure inbound and outbound calling workflows. * **[Inbound Calls](/guides/inbound-calls):** Configure routing for incoming traffic. * **[Outbound](/guides/campaigns):** Manage and monitor outbound calling workflows. Detailed tracking and relationship management. * **[All Call History](/guides/calls):** Review detailed call logs, transcripts, and session data. * **[Appointments](/guides/appointments):** Manage booked calendar events and scheduling. * **[Contacts](/guides/contacts):** Manage your CRM and address book. * **[Integration](/guides/Integration):** Connect third-party systems and data flows. The backend infrastructure of your workspace. * **[Phone Numbers](/guides/phone-numbers):** Buy, import, and release phone numbers. * **[Billing](/guides/billing):** Manage your subscription, credits, and invoices. # Enterprise plan Source: https://docs.ravan.ai/guides/enterprise-plan Private onboarding and appointment booking for enterprise customers.

VVIP access

Enterprise concierge

For enterprise teams, we provide private onboarding, deployment guidance, and executive support. Book a dedicated consultation with our enterprise team.

You can also email us directly at [info@ravan.ai](mailto:info@ravan.ai).