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.Calls
Place outbound calls and read their status, outcome, transcript, recording and analysis.
List calls
Lists calls, newest first, including calls placed from the console and by campaigns. Filter by agent, campaign, destination, status, outcome and creation time. List entries are the full call object without the transcript; read artifacts from their own endpoints.
Calls appear here as soon as they are accepted. Status and outcome are refreshed as the call
progresses, typically within seconds, occasionally a minute or more behind; settled marks a call
whose details are final.
When you filter by status, a page can hold fewer than limit calls while has_more is true; keep
following next_cursor until it is null.
GET /v1/calls · Operation ID: listCalls
query Parameters
limitMaximum number of objects to return, from 1 to 100. Defaults to 25.
cursorThe next_cursor of the previous page. Send it with exactly the same filters as the request that returned it; a changed filter set is 400 invalid_cursor.
created_afterOnly objects created at or after this time (RFC 3339, UTC).
created_beforeOnly objects created before this time (RFC 3339, UTC).
agent_id^agent_[A-Za-z0-9_-]…Only calls handled by this agent.
campaign_id^cmp_[A-Za-z0-9_-]{1…Only calls placed by this campaign.
to^\+[1-9][0-9]{7,14}$Only calls to this number (E.164).
statusOnly calls in this status.
outcomeOnly ended calls with this outcome.
List calls › Responses
A page of calls.
Place a call
Places one outbound call from an agent to a phone number. The call runs after the request returns:
the response is 202 Accepted with the call in queued status.
What 202 means. The call passed every check (agent readiness, account, balance and spend
limits, the do-not-call list, consent, calling hours and the per-number daily limit) and is being
started. It does not mean anyone has answered.
Follow the call with the call.ended and call.settled webhooks, or poll
GET /v1/calls/{call_id}. In rare cases the start is never confirmed; the call then ends with
outcome: failed and end_reason: not_confirmed within about two minutes and is not charged.
Retries. Idempotency-Key is optional. With a key, a retry with the same key returns the original
response and never places a second call, even if the first response was lost. Without one, a retry places
another call: if a response was lost, list calls by to and created_after before retrying.
Caller number. Without phone_number_id, the agent's outbound number is used; when the agent
has several, send phone_number_id.
Variables. variables are passed to the agent for this call. When to matches a contact, the
contact's name and custom fields are added as variables too (your values win).
Charges. Live calls are charged per started minute of talk time at your workspace rate, from the workspace balance. A call that is not answered is not charged.
POST /v1/calls · Operation ID: createCall
Headers
Idempotency-Key^[\x21-\x7E]+$Optional. A unique key for this operation, 1 to 255 printable ASCII characters with no spaces (a UUID v4 is ideal). With it, a retry of the same request (same key, same body) returns the stored answer and never runs the action twice; reuse the same key for every retry, it is kept for 24 hours. Without it, every request runs: a retry after a timeout can repeat the action, so check the state with a GET before retrying.
Place a call › Request Body
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.
Place a call › Responses
The call was accepted and is queued. Its id is final; follow it by webhook or polling.
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.
Retrieve a call
Returns one call with its status, outcome, timing, cost and the readiness of its artifacts.
Poll it (no more than every few seconds) or, better, use webhooks. outcome, duration_seconds,
billable_minutes and cost can still change until settled is true.
GET /v1/calls/{call_id} · Operation ID: getCall
path Parameters
call_id^call_[A-Za-z0-9_-]{… · requiredThe call id (call_...).
Retrieve a call › Responses
The 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.