curl --request DELETE \
--url https://app.famulor.io/api/v1/platform/users/{user_id}/plan \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"expected_version": 2,
"workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://app.famulor.io/api/v1/platform/users/{user_id}/plan"
payload = {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"expected_version": 2,
"workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.delete(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'DELETE',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
request_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
expected_version: 2,
workspace_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://app.famulor.io/api/v1/platform/users/{user_id}/plan', 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.famulor.io/api/v1/platform/users/{user_id}/plan",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_POSTFIELDS => json_encode([
'request_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'expected_version' => 2,
'workspace_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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.famulor.io/api/v1/platform/users/{user_id}/plan"
payload := strings.NewReader("{\n \"request_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"expected_version\": 2,\n \"workspace_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
req, _ := http.NewRequest("DELETE", 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.delete("https://app.famulor.io/api/v1/platform/users/{user_id}/plan")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"request_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"expected_version\": 2,\n \"workspace_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/platform/users/{user_id}/plan")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"request_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"expected_version\": 2,\n \"workspace_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"status": "active",
"workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version": 2,
"required_credits": 1,
"message": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid API key."
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests. Retry after the indicated delay."
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}End a customer managed plan
Requires live owner/admin membership in the calling credential’s reseller workspace. Existing managed agreements can still be reviewed and ended after Whitelabel entitlement ends; assigning or replacing a plan requires the entitlement. Operates only on that reseller’s customer workspaces, including when the acting user is a platform administrator. Ends the managed plan immediately and returns eligible unused plan and reserve credits to the reseller. Separately purchased customer credits remain unchanged. Supply the current overview version and an idempotency UUID. Required scope: platform:write.
curl --request DELETE \
--url https://app.famulor.io/api/v1/platform/users/{user_id}/plan \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"expected_version": 2,
"workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://app.famulor.io/api/v1/platform/users/{user_id}/plan"
payload = {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"expected_version": 2,
"workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.delete(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'DELETE',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
request_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
expected_version: 2,
workspace_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://app.famulor.io/api/v1/platform/users/{user_id}/plan', 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.famulor.io/api/v1/platform/users/{user_id}/plan",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_POSTFIELDS => json_encode([
'request_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'expected_version' => 2,
'workspace_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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.famulor.io/api/v1/platform/users/{user_id}/plan"
payload := strings.NewReader("{\n \"request_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"expected_version\": 2,\n \"workspace_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
req, _ := http.NewRequest("DELETE", 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.delete("https://app.famulor.io/api/v1/platform/users/{user_id}/plan")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"request_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"expected_version\": 2,\n \"workspace_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/platform/users/{user_id}/plan")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"request_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"expected_version\": 2,\n \"workspace_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"status": "active",
"workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version": 2,
"required_credits": 1,
"message": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid API key."
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests. Retry after the indicated delay."
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
}
}Authorizations
API key (fam_..., created under Settings → API Keys) or an OAuth 2.0 access token (fam_at_...). REST operations also require API Access for the credential's workspace. Keys can be restricted to scopes such as assistants:read, calls:write, campaigns:write, automations:read, dashboards:read, dashboards:write, leads:write, segments:write, loop:read, loop:write, phone_numbers:write, sip_trunks:write, knowledge:write, voices:read, billing:read, billing:write, settings:write, platform:read, platform:write; a *:write scope implies the matching *:read. Automation and dashboard endpoints also accept the legacy calls:* scope. Keys without scope restrictions have full access within the workspace's available capabilities.
Path Parameters
Customer user UUID.
Body
Unique idempotency UUID. Reuse the same UUID only with identical input after an ambiguous response.
Current managed plan version from the overview.
x >= 1Customer workspace UUID. Required when the customer workspace cannot be selected unambiguously.
Response
Managed plan operation result.
Show child attributes
Show child attributes