Update default limits
curl --request PATCH \
--url https://app.autocalls.ai/api/white-label/default-limits \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"allow_free_accounts": true,
"free_account_extra_minutes_cost": 123,
"limits": {}
}
'import requests
url = "https://app.autocalls.ai/api/white-label/default-limits"
payload = {
"allow_free_accounts": True,
"free_account_extra_minutes_cost": 123,
"limits": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({allow_free_accounts: true, free_account_extra_minutes_cost: 123, limits: {}})
};
fetch('https://app.autocalls.ai/api/white-label/default-limits', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.autocalls.ai/api/white-label/default-limits",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'allow_free_accounts' => true,
'free_account_extra_minutes_cost' => 123,
'limits' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.autocalls.ai/api/white-label/default-limits"
payload := strings.NewReader("{\n \"allow_free_accounts\": true,\n \"free_account_extra_minutes_cost\": 123,\n \"limits\": {}\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://app.autocalls.ai/api/white-label/default-limits")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"allow_free_accounts\": true,\n \"free_account_extra_minutes_cost\": 123,\n \"limits\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.autocalls.ai/api/white-label/default-limits")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"allow_free_accounts\": true,\n \"free_account_extra_minutes_cost\": 123,\n \"limits\": {}\n}"
response = http.request(request)
puts response.read_body{
"message": "Default limits updated.",
"data": {
"allow_free_accounts": true,
"free_account_extra_minutes_cost": 0.25,
"minimum_minute_cost": 0.09,
"currency": "USD",
"limits": {
"assistants": 2,
"campaigns": 1,
"cloned_voices": 0,
"knowledgebases": 1,
"mid_call_tools": 1,
"parallel_calls": 1,
"automation_runs": 500,
"own_numbers": 1,
"web_widget": false,
"secondary_languages": true,
"automation_platform": true,
"calendar_integrations": true,
"custom_dashboards": false,
"ai_prompt_editor": true,
"flow_builder": true,
"ai_connector": true
}
}
}
{
"message": "Unauthenticated."
}
{
"message": "You are not an administrator."
}
{
"message": "You do not have access to these settings."
}
{
"message": "Default limits apply only while allow_free_accounts is on.",
"errors": {
"limits": ["Default limits apply only while allow_free_accounts is on."]
}
}
{
"message": "The free account extra minutes cost field must be at least 0.09.",
"errors": {
"free_account_extra_minutes_cost": ["The free account extra minutes cost field must be at least 0.09."]
}
}
{
"message": "The limits field must be an object with only the supported keys.",
"errors": {
"limits": ["The limits field must be an object with only the supported keys."]
}
}
{
"message": "Too Many Attempts."
}
White Label
Update default limits
Update the free account settings and default limits of your white label platform
PATCH
/
white-label
/
default-limits
Update default limits
curl --request PATCH \
--url https://app.autocalls.ai/api/white-label/default-limits \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"allow_free_accounts": true,
"free_account_extra_minutes_cost": 123,
"limits": {}
}
'import requests
url = "https://app.autocalls.ai/api/white-label/default-limits"
payload = {
"allow_free_accounts": True,
"free_account_extra_minutes_cost": 123,
"limits": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({allow_free_accounts: true, free_account_extra_minutes_cost: 123, limits: {}})
};
fetch('https://app.autocalls.ai/api/white-label/default-limits', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.autocalls.ai/api/white-label/default-limits",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'allow_free_accounts' => true,
'free_account_extra_minutes_cost' => 123,
'limits' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.autocalls.ai/api/white-label/default-limits"
payload := strings.NewReader("{\n \"allow_free_accounts\": true,\n \"free_account_extra_minutes_cost\": 123,\n \"limits\": {}\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://app.autocalls.ai/api/white-label/default-limits")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"allow_free_accounts\": true,\n \"free_account_extra_minutes_cost\": 123,\n \"limits\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.autocalls.ai/api/white-label/default-limits")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"allow_free_accounts\": true,\n \"free_account_extra_minutes_cost\": 123,\n \"limits\": {}\n}"
response = http.request(request)
puts response.read_body{
"message": "Default limits updated.",
"data": {
"allow_free_accounts": true,
"free_account_extra_minutes_cost": 0.25,
"minimum_minute_cost": 0.09,
"currency": "USD",
"limits": {
"assistants": 2,
"campaigns": 1,
"cloned_voices": 0,
"knowledgebases": 1,
"mid_call_tools": 1,
"parallel_calls": 1,
"automation_runs": 500,
"own_numbers": 1,
"web_widget": false,
"secondary_languages": true,
"automation_platform": true,
"calendar_integrations": true,
"custom_dashboards": false,
"ai_prompt_editor": true,
"flow_builder": true,
"ai_connector": true
}
}
}
{
"message": "Unauthenticated."
}
{
"message": "You are not an administrator."
}
{
"message": "You do not have access to these settings."
}
{
"message": "Default limits apply only while allow_free_accounts is on.",
"errors": {
"limits": ["Default limits apply only while allow_free_accounts is on."]
}
}
{
"message": "The free account extra minutes cost field must be at least 0.09.",
"errors": {
"free_account_extra_minutes_cost": ["The free account extra minutes cost field must be at least 0.09."]
}
}
{
"message": "The limits field must be an object with only the supported keys.",
"errors": {
"limits": ["The limits field must be an object with only the supported keys."]
}
}
{
"message": "Too Many Attempts."
}
This endpoint changes how your platform treats users who do not have a subscription plan: whether they can use your platform, the price per minute they pay, and their default limits. Send only the keys you want to change: everything you leave out stays as it is. The response returns all the values after the change, in the same format as Get default limits.
All of these except
This endpoint is available to the account owner (with an active plan) and to team members with Billing Access. Other users receive a 403 Forbidden error and nothing is saved.
Request Body
boolean
true lets users use your platform without a subscription plannumber
The price per minute for users without a subscription plan, in your currency. Up to 2 decimals, and at least
minimum_minute_cost from Get default limits, which is your own cost per minute rounded up to the cent. A new price can take up to 15 minutes to apply to every user.object
The default limits to change, keyed as in Limits. Limits you leave out stay unchanged. Count limits take an integer from
-1 to 100000 (-1 means unlimited, 0 means none). Boolean limits take true or false.Limits can only be changed while allow_free_accounts is on, either already or in the same request. Otherwise the request returns 422 and nothing is saved.Response
string
Success message
object
All your free account settings and default limits after the change, in the same format as Get default limits
{
"message": "Default limits updated.",
"data": {
"allow_free_accounts": true,
"free_account_extra_minutes_cost": 0.25,
"minimum_minute_cost": 0.09,
"currency": "USD",
"limits": {
"assistants": 2,
"campaigns": 1,
"cloned_voices": 0,
"knowledgebases": 1,
"mid_call_tools": 1,
"parallel_calls": 1,
"automation_runs": 500,
"own_numbers": 1,
"web_widget": false,
"secondary_languages": true,
"automation_platform": true,
"calendar_integrations": true,
"custom_dashboards": false,
"ai_prompt_editor": true,
"flow_builder": true,
"ai_connector": true
}
}
}
{
"message": "Unauthenticated."
}
{
"message": "You are not an administrator."
}
{
"message": "You do not have access to these settings."
}
{
"message": "Default limits apply only while allow_free_accounts is on.",
"errors": {
"limits": ["Default limits apply only while allow_free_accounts is on."]
}
}
{
"message": "The free account extra minutes cost field must be at least 0.09.",
"errors": {
"free_account_extra_minutes_cost": ["The free account extra minutes cost field must be at least 0.09."]
}
}
{
"message": "The limits field must be an object with only the supported keys.",
"errors": {
"limits": ["The limits field must be an object with only the supported keys."]
}
}
{
"message": "Too Many Attempts."
}
How default limits work
- Default limits apply to your users who do not have a subscription plan, and only while
allow_free_accountsis on. Users with a plan get the limits of their plan. - Limits you set for a single user with Update user settings take priority over both.
- Turning
allow_free_accountsoff keeps the default limits you set. They apply again when you turn it back on.
Limits
| Key | Type | What it limits |
|---|---|---|
assistants | count | AI assistants the user can create |
campaigns | count | Outbound campaigns |
cloned_voices | count | Cloned voices |
knowledgebases | count | Knowledge bases |
mid_call_tools | count | Mid-call tools (Tools & MCP) |
parallel_calls | count | Calls running at the same time |
automation_runs | count | Automation runs per month |
own_numbers | count | Own phone numbers the user can add |
web_widget | boolean | Web widget |
secondary_languages | boolean | Secondary languages for assistants |
automation_platform | boolean | Automation platform |
calendar_integrations | boolean | Calendar integrations |
custom_dashboards | boolean | Custom dashboards |
ai_prompt_editor | boolean | AI prompt editor |
flow_builder | boolean | Flow builder |
ai_connector | boolean | Connect AI, the connector for ChatGPT and Claude |
calendar_integrations can also be set for a single user with Update user settings.
Partial updates
- Keys you leave out stay unchanged, and so do the limits you leave out of
limits. - An unknown top-level field returns 422 with “The X field is not supported.”, and an unknown key inside
limitsreturns 422 with “The limits field must be an object with only the supported keys.”. In both cases nothing is saved, not even the valid parts of the request. - Send only the keys you want to change.
Rate limit
The platform settings, default limits, user settings and plan endpoints share a limit of 60 requests per minute for each account. Above it they return429, and the Retry-After response header tells you how many seconds to wait.
Example
curl -X PATCH https://app.autocalls.ai/api/white-label/default-limits \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"allow_free_accounts": true,
"free_account_extra_minutes_cost": 0.25,
"limits": {
"assistants": 2,
"parallel_calls": 1,
"web_widget": false
}
}'

