https://voice-api.relationsai.com/v1 with a rai_test_ key, which never places a real call. It works once the API is enabled for your workspace (private preview: support@relationsai.com). Your key stays in this tab's memory; live keys are refused.Schemas
Agent
id^agent_[A-Za-z0-9_-]… · requiredAgent id (agent_...).
objectAlways agent.
livemodeMode of the key that read it. Agents are shared configuration, readable in both modes.
nameAgent name.
descriptionWhat the agent is for, as written in the console. Null when not set.
statusWhether the agent is switched on in the console. active agents can place calls; paused and draft agents cannot. Open enum: unknown values mean the agent cannot be assumed callable.
publishedTrue when the agent has a published version that calls use. Null when the publication state could not be read right now; use the readiness endpoint for a definite answer.
published_versionNumber of the published version, when known.
is_defaultTrue for the workspace's default agent.
sampleTrue only for the built-in Sample agent that exists in test mode.
created_atWhen the agent was created.
updated_atWhen the agent's configuration last changed, when known.
AgentList
objectAlways list.
has_moreTrue when more objects exist after this page.
next_cursorPass as cursor (with the same filters) to fetch the next page. Null on the last page.
Agents on this page.
AgentReadiness
objectAlways agent_readiness.
livemodeMode of the key that asked.
agent_idThe agent checked.
readyTrue when reasons is empty.
Every reason the agent cannot place calls. Empty when ready.
checked_atWhen the check ran.
AgentReadinessReason
codeMachine-readable reason. Open enum: agent_paused (switched off in the console), agent_not_connected (setup not finished: open the agent in the console and save it once), agent_not_published (no published version, or its live version is paused), no_outbound_number (no outbound number assigned to the agent), calling_not_configured (no telephony account or number in the workspace), telephony_disconnected, account_inactive (trial ended or account suspended), spend_limit_reached, insufficient_balance.
messageWhat to do about it, for an operator.
ArtifactState
statepending, ready, absent or failed. Open enum.
Call
id^call_[A-Za-z0-9_-]{… · requiredCall id (call_...).
objectAlways call.
livemodetrue for a live call, false for a simulated test-mode call.
statusWhere the call is in its lifecycle. Open enum. unknown means the state could not be confirmed for an unusually long time; it is not a success.
outcomeHow the call ended. Null until status is ended. completed: answered and a conversation took place. no_response: answered but nobody spoke (this includes most voicemail greetings). no_answer, busy: not answered. failed: could not be connected. unknown: the result could not be determined. Open enum.
end_reasonWhy the call ended. Null until status is ended. hangup: a normal end of a connected call. no_answer, busy, invalid_number, network_error: the call was not connected for that reason. insufficient_balance: ended because the workspace balance ran out. not_confirmed: the start was never confirmed, so the call is treated as failed and is not charged (whether the number briefly rang cannot be known). refused: the call was refused before it started. unknown. Open enum.
directionAlways outbound today. Open enum.
sourceapi (placed with POST /v1/calls), console, or campaign. Open enum.
agent_idThe agent that handled the call. Null only if the agent was deleted.
campaign_idThe campaign that placed the call, if any.
phone_number_idThe workspace number the call was placed from, once known.
fromThe caller number shown to the person called (E.164), once known. Null when not known in full.
toThe number called (E.164), always in full. Null only for some calls recorded before 2026-08-14 whose number was stored partially at the time; a partial number is never shown in place of a full one.
Your own key-value data, stored with the object and returned as sent. Up to 16 keys; keys up to 40 characters (letters, digits, _, -, .), values strings up to 500 characters. Never sent to the person called and never used by the agent. Do not put secrets here.
created_atWhen the call was accepted.
ended_atWhen the call ended.
duration_secondsTalk time in seconds once known. Final when settled is true.
billable_minutesMinutes charged (whole minutes, rounded up). Zero for calls that are not charged. Final when settled is true.
What the workspace was charged for this call. Null until known; always zero in test mode.
Readiness of each artifact of the call. pending: not ready yet. ready: available from its endpoint. absent: there is none for this call (for example a call that was not answered has no recording). failed: it could not be produced. Open enum.
settledTrue when outcome, duration, artifacts and charge are all final.
settled_atWhen the call settled.
CallAnalysis
objectAlways call_analysis.
livemodeMode of the call.
call_idThe call.
stateOverall state: pending while any part is still being produced, ready when every part has finished (a part may still be failed), absent when the call produced nothing to analyse. Open enum.
simulatedTrue for a test-mode fixture.
A short written summary of the conversation.
Fields the agent is configured (in the console) to extract from the conversation.
goal_metWhether the call met the agent's goal, when the agent is configured to report it. Null otherwise.
CallArtifacts
State of one call artifact.
State of one call artifact.
State of one call artifact.
CallCreateRequest
agent_id^agent_[A-Za-z0-9_-]… · requiredThe agent that makes the call (agent_...). It must be ready (see the agent readiness endpoint).
to^\+[1-9][0-9]{7,14}$ · requiredThe number to call, in E.164 format (a plus, then 8 to 15 digits, the first not 0).
phone_number_id^pn_[A-Za-z0-9_-]{1,…The workspace number to call from (pn_...). Optional: by default the agent's outbound number is used. Required when the agent has more than one outbound number.
Values the agent can use in the conversation, for example {"first_name": "Asha"}. Up to 50 keys; keys are lowercase letters, digits and _, starting with a letter, up to 64 characters; values are strings up to 500 characters. If the destination matches a contact, the contact's name and custom fields are added automatically; values here take precedence.
Your own key-value data, stored with the object and returned as sent. Up to 16 keys; keys up to 40 characters (letters, digits, _, -, .), values strings up to 500 characters. Never sent to the person called and never used by the agent. Do not put secrets here.
CallEvent
id^evt_[A-Za-z0-9_-]{1… · requiredEvent id (evt_...). The same event can be delivered more than once; use this to discard duplicates.
objectAlways event.
typeThe call event type.
created_atWhen the event happened.
livemodeMode of the event.
api_versionVersion of the payload format, a date. Today 2026-10-21.
Event data.
CallList
objectAlways list.
has_moreTrue when more objects exist after this page.
next_cursorPass as cursor (with the same filters) to fetch the next page. Null on the last page.
Calls on this page.
CallRecording
objectAlways call_recording.
livemodeMode of the call.
call_idThe call.
statepending, ready, absent (no recording exists for this call) or failed. Open enum.
simulatedTrue for the short synthetic audio file used in test mode.
urlShort-lived link to the audio. Null unless state is ready.
expires_atWhen url stops working.
content_typeMedia type of the audio, for example audio/ogg or audio/mpeg (audio/wav for test-mode audio). Null when not known in advance; the download's Content-Type is authoritative.
CallTranscript
objectAlways call_transcript.
livemodeMode of the call.
call_idThe call.
statepending, ready, absent (nothing was said or the call was not connected) or failed. turns is empty unless ready. Open enum.
simulatedTrue for a test-mode fixture transcript.
Turns in the order they were spoken.
Campaign
id^cmp_[A-Za-z0-9_-]{1… · requiredCampaign id (cmp_...).
objectAlways campaign.
livemodetrue for a live campaign, false for a test-mode campaign.
nameCampaign name.
agent_idThe agent that makes the calls. Null if the agent was deleted; the campaign cannot start until one is set.
statusdraft (never started), running, paused, stopped, completed (the run finished), failed (the run ended in failure), unknown. Open enum.
Which actions the campaign allows in its current status.
concurrency_limitMost calls the campaign places at the same time. Lowered at start to the plan maximum (limits.campaign_max_concurrency on the workspace). Campaigns created in the console can hold a higher value than the API accepts on a write.
The spend at which the campaign is paused. When the campaign's spend reaches the cap the campaign is paused. The check runs about every 15 minutes, so spend can exceed the cap by the calls placed in that time. Null for no cap.
recipient_countBefore the first start, the recipients added to the campaign. From a start on, the recipients that run calls: recipients left out by compliance screening at that start are not counted.
Call counts for the current or latest run. A call is counted in in_progress until it ends, and only then in connected, no_answer or failed. Updated as calls end; can lag by up to a minute.
What the current or latest run has cost so far. Always zero in test mode, which never charges.
run_numberHow many runs the campaign has had. 0 before the first start.
created_atWhen the campaign was created.
dnc_screeningenforced (numbers on the do-not-call list are left out at every start and block a resume) or disabled_in_console (a person switched screening off for this campaign in the console; the API refuses to start or resume it with 409 campaign_dnc_override_enabled). Read-only. Open enum.
CampaignCapabilities
startPOST .../start is allowed.
pausePOST .../pause is allowed.
resumePOST .../resume is allowed.
stopPOST .../stop is allowed.
updatePATCH is allowed.
add_recipientsPOST .../recipients is allowed.
CampaignCreateRequest
nameCampaign name.
agent_id^agent_[A-Za-z0-9_-]… · requiredThe agent that makes the calls.
concurrency_limitMost simultaneous calls. Defaults to 1. Lowered at start to the plan maximum.
The spend at which the campaign is paused. When the campaign's spend reaches the cap the campaign is paused. The check runs about every 15 minutes, so spend can exceed the cap by the calls placed in that time. Omit or null for no cap.
contact_idsContacts to add as recipients now. You can also add them later, while the campaign is draft.
CampaignEvent
id^evt_[A-Za-z0-9_-]{1… · requiredEvent id (evt_...). The same event can be delivered more than once; use this to discard duplicates.
objectAlways event.
typeThe campaign event type.
created_atWhen the event happened.
livemodeMode of the event.
api_versionVersion of the payload format, a date. Today 2026-10-21.
Event data.
CampaignList
objectAlways list.
has_moreTrue when more objects exist after this page.
next_cursorPass as cursor (with the same filters) to fetch the next page. Null on the last page.
Campaigns on this page.
CampaignProgress
callsCalls placed.
connectedEnded calls that were answered.
no_answerEnded calls that were not answered or were busy.
failedEvery other ended call (it could not be connected, or it ended with an outcome that is not known).
in_progressCalls not yet ended.
CampaignRecipient
id^rcp_[A-Za-z0-9_-]{1… · requiredRecipient id (rcp_...).
objectAlways campaign_recipient.
livemodeMode of the campaign.
campaign_idThe campaign.
contact_idThe contact.
phone_numberThe number that is (or was) called.
statuspending (not yet called in this run), in_progress, completed (called; see outcome), failed (every attempt failed), suppressed (left out by compliance screening, see suppression_reason), cancelled (the run stopped before reaching them), unknown. Open enum. In live mode a recipient left out by screening at start is not recorded per recipient yet: it shows pending while the run is open and unknown once the run has ended. Test mode records it as suppressed.
attemptsCall attempts made in this run.
last_call_idThe most recent call to this recipient, if any.
outcomeOutcome of the most recent call, using the call outcome values. Null if not called yet.
suppression_reasonWhy the recipient was left out, when status is suppressed. Open enum dnc_listed, consent_required, contact_daily_limit_reached, unknown.
CampaignRecipientList
objectAlways list.
has_moreTrue when more objects exist after this page.
next_cursorPass as cursor (with the same filters) to fetch the next page. Null on the last page.
Recipients on this page.
CampaignRecipientsAddRequest
contact_idsContacts to add. Contacts already in the campaign are skipped, not duplicated.
CampaignRecipientsAddResult
objectAlways campaign_recipients_added.
livemodeMode of the campaign.
campaign_idThe campaign.
addedRecipients newly added by this request (contacts already in the campaign are not counted).
recipient_countTotal recipients in the campaign now.
CampaignUpdateRequest
nameCampaign name.
agent_id^agent_[A-Za-z0-9_-]…The agent that makes the calls.
concurrency_limitMost simultaneous calls.
The spend at which the campaign is paused, or null to remove the cap. When the campaign's spend reaches the cap the campaign is paused. The check runs about every 15 minutes, so spend can exceed the cap by the calls placed in that time.
Contact
id^ct_[A-Za-z0-9_-]{1,… · requiredContact id (ct_...).
objectAlways contact.
livemodetrue for a live contact, false for a test-mode contact.
phone_numberThe contact's number. E.164 for contacts created through this API; contacts created earlier in the console may hold the number in the format it was entered.
nameDisplay name.
languagePreferred language, as free text or a language code.
country_codeCountry code as entered, for example IN.
consent_grantedWhether the contact has consented to be called. When the workspace requires consent (a console compliance setting), calls to a contact without consent are refused. Setting this through the API records that consent was given; only set it when it really was. Consent is never recorded on a contact that is on the do-not-call list: it stays false there, and removing the entry does not restore it.
do_not_callTrue when the contact's number is on the do-not-call list. Read-only here: manage it with the do-not-call endpoints. Adding a number to the list also withdraws the contact's consent.
Values of the workspace's custom fields for this contact, by field name. Fields are defined in the console.
created_atWhen the contact was created. Null for some contacts created before this was recorded.
ContactCreateRequest
phone_numberThe contact's number in E.164 format.
nameDisplay name.
languagePreferred language.
country_codeCountry code, for example IN.
consent_grantedSet to true only when the person has consented to be called. Recorded with the time and the API as its source.
Custom field values by field name. Each key must be a custom field defined in the console; an unknown name is 422 custom_field_not_found. Values are strings up to 500 characters. On update, a null value clears that field and omitted fields are left unchanged.
ContactList
objectAlways list.
has_moreTrue when more objects exist after this page.
next_cursorPass as cursor (with the same filters) to fetch the next page. Null on the last page.
Contacts on this page.
ContactUpdateRequest
phone_numberNew number in E.164 format. Must not belong to another contact.
nameDisplay name. Null clears it.
languagePreferred language. Null clears it.
country_codeCountry code. Null clears it.
consent_grantedTrue records that consent was given; false records that it was withdrawn.
Custom field values by field name. Each key must be a custom field defined in the console; an unknown name is 422 custom_field_not_found. Values are strings up to 500 characters. On update, a null value clears that field and omitted fields are left unchanged.
ContactUpsertRequest
phone_numberThe contact's number in E.164 format. Identifies the contact.
nameDisplay name. Null clears it.
languagePreferred language. Null clears it.
country_codeCountry code. Null clears it.
consent_grantedSet to true only when the person has consented to be called; false records withdrawal. Omit to leave unchanged.
Custom field values by field name. Each key must be a custom field defined in the console; an unknown name is 422 custom_field_not_found. Values are strings up to 500 characters. On update, a null value clears that field and omitted fields are left unchanged.
CustomFieldValues
DeletedObject
idId of the deleted object.
objectType of the deleted object, for example contact.
livemodetrue for live mode, false for test mode.
deletedAlways true.
DncEntry
id^dnc_[A-Za-z0-9_-]{1… · requiredEntry id (dnc_...).
objectAlways dnc_entry.
livemodeMode of the entry. Test-mode entries apply only to test-mode calls.
phone_numberThe number.
contact_idThe contact with this number, if there is one.
created_atWhen the number was added to the list. Recorded in test mode; null in live mode, where the time is not stored yet.
DncEntryCreateRequest
phone_numberThe number in E.164 format.
DncEntryList
objectAlways list.
has_moreTrue when more objects exist after this page.
next_cursorPass as cursor (with the same filters) to fetch the next page. Null on the last page.
Entries on this page.
Error
The error.
EventBase
id^evt_[A-Za-z0-9_-]{1… · requiredEvent id (evt_...). The same event can be delivered more than once; use this to discard duplicates.
objectAlways event.
typeAn event type. Open enum; new types can be added.
created_atWhen the event happened.
livemodeMode of the event.
api_versionVersion of the payload format, a date. Today 2026-10-21.
ExtractedField
nameField name as configured on the agent.
typeDeclared type of the field, for example string, number, boolean. Open enum.
stateready, pending, absent (not mentioned in the call) or failed. Open enum.
valueThe extracted value, typed per type. Null unless state is ready.
ListMeta
objectAlways list.
has_moreTrue when more objects exist after this page.
next_cursorPass as cursor (with the same filters) to fetch the next page. Null on the last page.
Metadata
Money
amountAmount in the minor unit of currency. Never negative.
currency^[A-Z]{3}$ · requiredISO 4217 currency code. Open enum; today always INR.
MoneyInput
amountAmount in the minor unit of currency (for INR, paise). At least 1.
currencyISO 4217 code. Must be INR today.
PhoneNumber
id^pn_[A-Za-z0-9_-]{1,… · requiredPhone number id (pn_...).
objectAlways phone_number.
livemodeMode of the key that read it. Numbers are shared configuration, readable in both modes.
number^\+[1-9][0-9]{7,14}$ · requiredThe number in E.164 format.
labelLabel given in the console, if any.
statusactive numbers can be used. pending numbers are still being set up. Open enum.
What the number supports.
inbound_agent_idThe agent of this workspace that answers calls to this number, if any.
outbound_agent_idsAgents of this workspace that call from this number.
sampleTrue only for the built-in sample number that exists in test mode.
PhoneNumberList
objectAlways list.
has_moreTrue when more objects exist after this page.
next_cursorPass as cursor (with the same filters) to fetch the next page. Null on the last page.
Phone numbers on this page.
RateLimitClass
per_key_per_minuteRequests per minute allowed for one key.
per_workspace_per_minuteRequests per minute allowed across all keys of the workspace in this mode.
TranscriptTurn
indexPosition of the turn, from 0.
speakeragent or caller (the person called). Open enum.
textWhat was said.
start_msStart of the turn in milliseconds from the start of the call, when known.
end_msEnd of the turn in milliseconds from the start of the call, when known.
WebhookDelivery
id^wd_[A-Za-z0-9_-]{1,… · requiredDelivery id (wd_...).
objectAlways webhook_delivery.
livemodeMode of the event.
webhook_endpoint_idThe endpoint.
event_idThe event delivered (evt_...). Also sent as the RelationsAI-Event-Id header.
event_typeAn event type. Open enum; new types can be added.
statuspending (first attempt not made yet), retrying (failed, another attempt is scheduled), succeeded (your server answered 2xx), failed (every attempt failed). Open enum.
attemptsAttempts made so far.
last_attempt_atWhen the last attempt was made.
next_attempt_atWhen the next attempt is scheduled, if any.
response_statusHTTP status of your server's last answer, if it answered.
duration_msHow long the last attempt took.
errorWhy the last attempt failed: timeout (no answer in 10 seconds), connection_failed (including a host name that did not resolve in time), tls_error, blocked_destination (the URL resolved to a non-public address), http_error (a non-2xx answer), signing_failed (RelationsAI could not sign the delivery; nothing was sent, the attempt still counts, and the delivery fails after its last attempt like any other; contact support if it persists). Null if it succeeded. Open enum.
created_atWhen the delivery was created.
WebhookDeliveryList
objectAlways list.
has_moreTrue when more objects exist after this page.
next_cursorPass as cursor (with the same filters) to fetch the next page. Null on the last page.
Deliveries on this page.
WebhookEndpoint
id^we_[A-Za-z0-9_-]{1,… · requiredEndpoint id (we_...).
objectAlways webhook_endpoint.
livemodeThe endpoint receives events of this mode only.
urlWhere events are delivered.
descriptionYour note about the endpoint.
eventsEvent types delivered to this endpoint. The test event is delivered on request regardless of this list.
statusenabled endpoints receive deliveries; disabled ones do not. Open enum.
secret_last4Last four characters of the current signing secret, to tell secrets apart.
created_atWhen the endpoint was created.
updated_atWhen the endpoint was last changed.
The most recent delivery attempt, or null if none yet.
WebhookEndpointCreateRequest
url^https:// · requiredMust start with https://; any other scheme is refused with 400 validation_error (issue invalid_format) before the URL is checked. Then: port 443 only, no user name or password, not a RelationsAI host, and the host must resolve only to public internet addresses, otherwise 422 webhook_url_not_allowed. Checked when created, when changed, and again on every delivery.
eventsEvent types to deliver. webhook_endpoint.test cannot be subscribed to (the test operation always delivers it).
descriptionYour note about the endpoint.
WebhookEndpointList
objectAlways list.
has_moreTrue when more objects exist after this page.
next_cursorPass as cursor (with the same filters) to fetch the next page. Null on the last page.
Endpoints on this page.
WebhookEndpointUpdateRequest
url^https://Must start with https://; any other scheme is refused with 400 validation_error (issue invalid_format) before the URL is checked. Then: port 443 only, no user name or password, not a RelationsAI host, and the host must resolve only to public internet addresses, otherwise 422 webhook_url_not_allowed. Checked when created, when changed, and again on every delivery.
descriptionYour note about the endpoint. Null clears it.
eventsEvent types to deliver. Replaces the current list. webhook_endpoint.test cannot be subscribed to (the test operation always delivers it).
statusenabled or disabled.
WebhookEndpointWithSecret
id^we_[A-Za-z0-9_-]{1,… · requiredEndpoint id (we_...).
objectAlways webhook_endpoint.
livemodeThe endpoint receives events of this mode only.
urlWhere events are delivered.
descriptionYour note about the endpoint.
eventsEvent types delivered to this endpoint. The test event is delivered on request regardless of this list.
statusenabled endpoints receive deliveries; disabled ones do not. Open enum.
secret_last4Last four characters of the current signing secret, to tell secrets apart.
created_atWhen the endpoint was created.
updated_atWhen the endpoint was last changed.
The most recent delivery attempt, or null if none yet.
secret^whsec_[A-Za-z0-9_-]… · requiredThe signing secret (whsec_...), shown only in the first response to the create or rotate request. null on an idempotent replay of that request (same Idempotency-Key): the secret is stored only encrypted and is never returned again. If it was lost, rotate the secret.
WebhookEventType
An event type. Open enum; new types can be added.
WebhookSecretRotateRequest
grace_period_hoursHours during which every delivery carries two signatures, one per secret, so you can deploy the new secret without dropping events. 0 retires every previous secret immediately (always allowed, also during a grace period). A value above 0 during a running grace period keeps the oldest secret still signing until its original grace end and discards the one in between.
WebhookSubscribableEventType
An event type an endpoint can subscribe to. Open enum; new types can be added. webhook_endpoint.test is not in this list: it cannot be subscribed to, and is delivered only by POST /v1/webhook-endpoints/{webhook_endpoint_id}/test, to that endpoint, whatever its subscriptions.
WebhookTestEvent
id^evt_[A-Za-z0-9_-]{1… · requiredEvent id (evt_...). The same event can be delivered more than once; use this to discard duplicates.
objectAlways event.
typeAlways webhook_endpoint.test.
created_atWhen the event happened.
livemodeMode of the event.
api_versionVersion of the payload format, a date. Today 2026-10-21.
Event data.
Workspace
id^ws_[A-Za-z0-9_-]{1,… · requiredWorkspace id (ws_...).
objectAlways workspace.
livemodetrue when the key is a live key, false for a test key.
nameWorkspace name as shown in the console.
timezoneIANA timezone of the workspace. Calling hours (if enabled in the console) are evaluated in it.
currency^[A-Z]{3}$ · requiredCurrency calls are charged in (ISO 4217). Open enum; today always INR.
The API key this request was authenticated with. The secret itself is never returned.
What this workspace can do through the API. A false here means the feature is not offered today, so a client can adapt instead of discovering it from errors.
Limits that apply to this key and workspace in the key's mode.
WorkspaceApiKey
id^key_[A-Za-z0-9_-]{1… · requiredKey id (key_...). Shown in the console next to the key.
nameThe name given to the key when it was created.
environmenttest for rai_test_ keys, live for rai_live_ keys.
scopesScopes this key can use right now: the scopes it was created with, limited to what its creator's current role allows.
created_atWhen the key was created.
expires_atWhen the key stops working. Null for a test key created without expiry.
WorkspaceCapabilities
campaign_pauseRunning campaigns can be paused.
campaign_resumePaused campaigns can be resumed (continuing the same run).
call_ringing_statusCalls report a separate ringing status. When false, a call goes from queued straight to in_progress or ended.
live_transcriptTranscripts can be read while a call is in progress. When false, transcripts are available after the call ends.
sentiment_analysisCall analysis includes sentiment. When false, analysis has a summary, extracted fields and the goal outcome only.
end_callCalls can be hung up through the API.
agent_editingAgents can be created or edited through the API. When false, use the console.
inbound_callsInbound calls appear in the call list.
webhooksWebhook endpoints can be created and events are delivered.
WorkspaceLimits
Requests per minute by rate-limit class. Each operation shows its class as x-rate-limit-class.
daily_call_limitCalls this workspace may place through the API per UTC day in live mode. Null in test mode, which has no daily cap.
campaign_max_concurrencyMost simultaneous calls a campaign can run with on the workspace's plan. A higher concurrency_limit is lowered to this at start.