Renew user plan
curl --request POST \
--url https://app.autocalls.ai/api/white-label/users/{id}/plan/renew \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.autocalls.ai/api/white-label/users/{id}/plan/renew"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.autocalls.ai/api/white-label/users/{id}/plan/renew', 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/users/{id}/plan/renew",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.autocalls.ai/api/white-label/users/{id}/plan/renew"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.autocalls.ai/api/white-label/users/{id}/plan/renew")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.autocalls.ai/api/white-label/users/{id}/plan/renew")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"message": "Plan renewed.",
"data": {
"plan_id": 5,
"name": "Starter",
"source": "manual",
"billing": "monthly",
"included_minutes": 100,
"included_credits": 0,
"minutes_renew_at": "2026-11-03T09:12:05+00:00",
"ends_at": null,
"minutes": "monthly",
"when_short": "wait",
"renewal": {
"status": "ok",
"next_at": "2026-11-03T09:12:05+00:00",
"missing_minutes": 0,
"last_renewed_at": "2026-10-03T09:12:05+00:00",
"prepaid_minutes": null,
"prepaid_until": null
}
}
}
{
"message": "Unauthenticated."
}
{
"message": "You are not an administrator."
}
{
"message": "You do not have access to these settings."
}
{
"message": "User not found."
}
{
"message": "Not enough balance to renew this plan: 11.17 more minutes are needed."
}
{
"message": "Nothing to renew yet: the next renewal is on Nov 2, 2026."
}
{
"message": "This user has no plan given by you."
}
{
"message": "This plan has no minutes to renew."
}
{
"message": "This plan ends on Nov 2, 2026, before its next renewal."
}
{
"message": "Too Many Attempts."
}
White Label
Renew user plan
Run the pending renewal of a plan you gave, right away
POST
/
white-label
/
users
/
{id}
/
plan
/
renew
Renew user plan
curl --request POST \
--url https://app.autocalls.ai/api/white-label/users/{id}/plan/renew \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.autocalls.ai/api/white-label/users/{id}/plan/renew"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.autocalls.ai/api/white-label/users/{id}/plan/renew', 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/users/{id}/plan/renew",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.autocalls.ai/api/white-label/users/{id}/plan/renew"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.autocalls.ai/api/white-label/users/{id}/plan/renew")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.autocalls.ai/api/white-label/users/{id}/plan/renew")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"message": "Plan renewed.",
"data": {
"plan_id": 5,
"name": "Starter",
"source": "manual",
"billing": "monthly",
"included_minutes": 100,
"included_credits": 0,
"minutes_renew_at": "2026-11-03T09:12:05+00:00",
"ends_at": null,
"minutes": "monthly",
"when_short": "wait",
"renewal": {
"status": "ok",
"next_at": "2026-11-03T09:12:05+00:00",
"missing_minutes": 0,
"last_renewed_at": "2026-10-03T09:12:05+00:00",
"prepaid_minutes": null,
"prepaid_until": null
}
}
}
{
"message": "Unauthenticated."
}
{
"message": "You are not an administrator."
}
{
"message": "You do not have access to these settings."
}
{
"message": "User not found."
}
{
"message": "Not enough balance to renew this plan: 11.17 more minutes are needed."
}
{
"message": "Nothing to renew yet: the next renewal is on Nov 2, 2026."
}
{
"message": "This user has no plan given by you."
}
{
"message": "This plan has no minutes to renew."
}
{
"message": "This plan ends on Nov 2, 2026, before its next renewal."
}
{
"message": "Too Many Attempts."
}
When the owner’s balance cannot cover a plan’s renewal, the renewal waits and is tried again every hour (see Renewals). After you top up, this endpoint runs it right away. It is the Renew now button in the Plan action of your administration panel, shown while a renewal is pending.
It is the same renewal as the hourly one. With monthly minutes, the user is topped back up to the plan’s minutes and gets its chat credits again, and the owner’s balance pays for the minutes they used. With yearly minutes, this month’s share comes from the prepaid 12 months, or, once they are over, what is left goes back and the next 12 months are taken. The next renewal is a month after this one.
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. Only users of your platform can be renewed: any other ID, including the owner account, returns 404.
Path Parameters
integer
required
The ID of the user. Administrators can list user IDs with Get platform users.
Response
string
Plan renewed.object
The user’s plan, as in Get user plan
{
"message": "Plan renewed.",
"data": {
"plan_id": 5,
"name": "Starter",
"source": "manual",
"billing": "monthly",
"included_minutes": 100,
"included_credits": 0,
"minutes_renew_at": "2026-11-03T09:12:05+00:00",
"ends_at": null,
"minutes": "monthly",
"when_short": "wait",
"renewal": {
"status": "ok",
"next_at": "2026-11-03T09:12:05+00:00",
"missing_minutes": 0,
"last_renewed_at": "2026-10-03T09:12:05+00:00",
"prepaid_minutes": null,
"prepaid_until": null
}
}
}
{
"message": "Unauthenticated."
}
{
"message": "You are not an administrator."
}
{
"message": "You do not have access to these settings."
}
{
"message": "User not found."
}
{
"message": "Not enough balance to renew this plan: 11.17 more minutes are needed."
}
{
"message": "Nothing to renew yet: the next renewal is on Nov 2, 2026."
}
{
"message": "This user has no plan given by you."
}
{
"message": "This plan has no minutes to renew."
}
{
"message": "This plan ends on Nov 2, 2026, before its next renewal."
}
{
"message": "Too Many Attempts."
}
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 POST https://app.autocalls.ai/api/white-label/users/123/plan/renew \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"

