Call settings
Call recording is the same setting as Settings › Compliance › Call recordings in the app. Who rings for incoming calls has no screen in the app: set it here. Reading them needs the send_sms permission. Only the account owner or an admin can change call recording, and changing who rings needs manage_phones. Every route below answers 403 permission_denied when the key’s user lacks the permission it needs, and 500 internal_error when we couldn’t read or save the setting: nothing changed, so retry in a minute.
# Get call recording settings
Whether your account records calls, and whether the recording notice plays. These rules apply to every recorded call: Ready Dialer, click-to-call and calls to your numbers. Needs the send_sms permission.
Returns
data.record_callsboolean Record calls. false means no call on the account is recorded.
data.record_every_callboolean Every call is recorded: the Ready Dialer’s Record switch is locked on for your team.
data.dual_speakerboolean Dual-speaker recording: each side of a recorded call is kept and transcribed on its own, and the transcript names who said each line. false (the default) keeps one mixed recording.
data.noticeboolean Both people hear the recording notice before a call is recorded.
data.signedobject | null When the notice is off: name and at, who signed the notice waiver and when.
data.attestationobject The waiver statement to show before turning the notice off: version, text and min_name_chars, the shortest name we accept.
data.can_editboolean Whether this key may change them.
curl "https://api.tryready.com/v1/call-settings/recording" \
-H "X-API-Key: $READY_API_KEY"
const res = await fetch('https://api.tryready.com/v1/call-settings/recording', {
headers: {
'X-API-Key': process.env.READY_API_KEY,
},
});
const json = await res.json().catch(() => ({}));
if (!res.ok || json.success === false) {
throw new Error(`${res.status}${json.error_code || json.code ? ' ' + (json.error_code || json.code) : ''}: ${json.error || json.message || res.statusText}`);
}
import os, requests
r = requests.get(
"https://api.tryready.com/v1/call-settings/recording",
headers={"X-API-Key": os.environ["READY_API_KEY"]},
timeout=30,
)
data = r.json() if r.headers.get("content-type", "").startswith("application/json") else {}
if not r.ok or data.get("success") is False:
raise RuntimeError(f'{r.status_code} {data.get("error_code") or data.get("code") or ""}: {data.get("error") or data.get("message") or r.reason}')
Returns:
{
"success": true,
"data": {
"record_calls": true,
"record_every_call": false,
"dual_speaker": false,
"notice": true,
"signed": null,
"attestation": {
"version": "2026-10-14",
"text": "I confirm my reps will tell every caller the call is recorded, and my business is responsible for getting their consent.",
"min_name_chars": 2
},
"can_edit": true
}
}
# Change call recording settings
Send only what you want to change. Turning record_calls off also turns off record_every_call. To turn the notice off you sign the waiver: send attest: true and your full name. We keep a record of each change to the notice. Only the account owner or an admin can change these. Returns the settings as saved, without can_edit.
Parameters
record_callsboolean Record calls on this account.
record_every_callboolean Lock every team member’s Record switch on.
dual_speakerboolean Keep each side of a recorded call on its own, with a transcript that names who said each line.
noticeboolean Play the recording notice. false needs attest and name.
attestboolean true: you agree to the statement in attestation.text.
namestring The full name of the person signing. Up to 120 characters.
Errors
HTTP Code When
400 attestation_requirednotice: false without attest: true and a name.
400 nothing_to_changeThe body has none of the settings above.
403 OWNER_ONLYThe key is not for the account owner or an admin.
curl -X PUT "https://api.tryready.com/v1/call-settings/recording" \
-H "X-API-Key: $READY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"record_calls": true,
"record_every_call": true
}'
const res = await fetch('https://api.tryready.com/v1/call-settings/recording', {
method: 'PUT',
headers: {
'X-API-Key': process.env.READY_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"record_calls": true,
"record_every_call": true
}),
});
const json = await res.json().catch(() => ({}));
if (!res.ok || json.success === false) {
throw new Error(`${res.status}${json.error_code || json.code ? ' ' + (json.error_code || json.code) : ''}: ${json.error || json.message || res.statusText}`);
}
import os, requests
r = requests.put(
"https://api.tryready.com/v1/call-settings/recording",
headers={"X-API-Key": os.environ["READY_API_KEY"]},
json={
"record_calls": True,
"record_every_call": True
},
timeout=30,
)
data = r.json() if r.headers.get("content-type", "").startswith("application/json") else {}
if not r.ok or data.get("success") is False:
raise RuntimeError(f'{r.status_code} {data.get("error_code") or data.get("code") or ""}: {data.get("error") or data.get("message") or r.reason}')
Returns:
{
"success": true,
"data": {
"record_calls": true,
"record_every_call": true,
"dual_speaker": false,
"notice": true,
"signed": null,
"attestation": {
"version": "2026-10-14",
"text": "I confirm my reps will tell every caller the call is recorded, and my business is responsible for getting their consent.",
"min_name_chars": 2
}
}
}
# Get who rings for incoming calls
Who the Ready Dialer rings when a lead calls one of your numbers. Needs the send_sms permission.
Returns
data.modeenum everyone: every team member who is online. last_caller: the team member who last called that lead rings first.
curl "https://api.tryready.com/v1/call-settings/inbound-routing" \
-H "X-API-Key: $READY_API_KEY"
const res = await fetch('https://api.tryready.com/v1/call-settings/inbound-routing', {
headers: {
'X-API-Key': process.env.READY_API_KEY,
},
});
const json = await res.json().catch(() => ({}));
if (!res.ok || json.success === false) {
throw new Error(`${res.status}${json.error_code || json.code ? ' ' + (json.error_code || json.code) : ''}: ${json.error || json.message || res.statusText}`);
}
import os, requests
r = requests.get(
"https://api.tryready.com/v1/call-settings/inbound-routing",
headers={"X-API-Key": os.environ["READY_API_KEY"]},
timeout=30,
)
data = r.json() if r.headers.get("content-type", "").startswith("application/json") else {}
if not r.ok or data.get("success") is False:
raise RuntimeError(f'{r.status_code} {data.get("error_code") or data.get("code") or ""}: {data.get("error") or data.get("message") or r.reason}')
Returns:
{
"success": true,
"data": {
"mode": "everyone"
}
}
# Change who rings for incoming calls
Needs the manage_phones permission. The first time an account saves this, missed-call text-back starts on only if one of your missed-call automations already sends a text.
Parameters
modeenum Required everyone or last_caller.
Errors
HTTP Code When
400 invalid_fieldmode is missing or not one of the two above.
curl -X PUT "https://api.tryready.com/v1/call-settings/inbound-routing" \
-H "X-API-Key: $READY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mode": "last_caller"
}'
const res = await fetch('https://api.tryready.com/v1/call-settings/inbound-routing', {
method: 'PUT',
headers: {
'X-API-Key': process.env.READY_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"mode": "last_caller"
}),
});
const json = await res.json().catch(() => ({}));
if (!res.ok || json.success === false) {
throw new Error(`${res.status}${json.error_code || json.code ? ' ' + (json.error_code || json.code) : ''}: ${json.error || json.message || res.statusText}`);
}
import os, requests
r = requests.put(
"https://api.tryready.com/v1/call-settings/inbound-routing",
headers={"X-API-Key": os.environ["READY_API_KEY"]},
json={
"mode": "last_caller"
},
timeout=30,
)
data = r.json() if r.headers.get("content-type", "").startswith("application/json") else {}
if not r.ok or data.get("success") is False:
raise RuntimeError(f'{r.status_code} {data.get("error_code") or data.get("code") or ""}: {data.get("error") or data.get("message") or r.reason}')
Returns:
{
"success": true,
"data": {
"mode": "last_caller"
}
}
# Get my Record switch
Where the Ready Dialer’s Record switch starts for the key’s own user. The account’s recording settings still win: with Record calls off nothing is recorded, and with every call recorded the switch is locked on. Needs the send_sms permission.
Returns
data.record_callsboolean | null null until it’s first saved.
curl "https://api.tryready.com/v1/call-settings/my-recording" \
-H "X-API-Key: $READY_API_KEY"
const res = await fetch('https://api.tryready.com/v1/call-settings/my-recording', {
headers: {
'X-API-Key': process.env.READY_API_KEY,
},
});
const json = await res.json().catch(() => ({}));
if (!res.ok || json.success === false) {
throw new Error(`${res.status}${json.error_code || json.code ? ' ' + (json.error_code || json.code) : ''}: ${json.error || json.message || res.statusText}`);
}
import os, requests
r = requests.get(
"https://api.tryready.com/v1/call-settings/my-recording",
headers={"X-API-Key": os.environ["READY_API_KEY"]},
timeout=30,
)
data = r.json() if r.headers.get("content-type", "").startswith("application/json") else {}
if not r.ok or data.get("success") is False:
raise RuntimeError(f'{r.status_code} {data.get("error_code") or data.get("code") or ""}: {data.get("error") or data.get("message") or r.reason}')
Returns:
{
"success": true,
"data": {
"record_calls": true
}
}
# Set my Record switch
Saves where the key’s own user’s Record switch starts in the Ready Dialer. Needs the send_sms permission.
Parameters
record_callsboolean Required Start with Record on or off.
curl -X PUT "https://api.tryready.com/v1/call-settings/my-recording" \
-H "X-API-Key: $READY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"record_calls": true
}'
const res = await fetch('https://api.tryready.com/v1/call-settings/my-recording', {
method: 'PUT',
headers: {
'X-API-Key': process.env.READY_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"record_calls": true
}),
});
const json = await res.json().catch(() => ({}));
if (!res.ok || json.success === false) {
throw new Error(`${res.status}${json.error_code || json.code ? ' ' + (json.error_code || json.code) : ''}: ${json.error || json.message || res.statusText}`);
}
import os, requests
r = requests.put(
"https://api.tryready.com/v1/call-settings/my-recording",
headers={"X-API-Key": os.environ["READY_API_KEY"]},
json={
"record_calls": True
},
timeout=30,
)
data = r.json() if r.headers.get("content-type", "").startswith("application/json") else {}
if not r.ok or data.get("success") is False:
raise RuntimeError(f'{r.status_code} {data.get("error_code") or data.get("code") or ""}: {data.get("error") or data.get("message") or r.reason}')
Returns:
{
"success": true,
"data": {
"record_calls": true
}
}