Create a plan (partner-api)
Creates a plan owned by your partner, with the same validation as the Plans form in the partner portal. At least one country is required: choose where the plan is offered. Plans are unique per country: you cannot create a plan whose name (case-insensitive) is already used in one of the chosen countries; the 422 names the clashing countries.
Optional trial-end hand-over: transfer_partner_id (a reseller that accepts customers from you) and transfer_plan_id (a plan it can sell). When a customer's trial ends on this plan, Cockpit opens a pending transfer request to that reseller instead of applying the normal trial-end rules.
The Odoo product link (external_plan_id) and the owning partner cannot be set through the API.
Required scopes: partner-api and partner-plans-write.
Partner API key. A bearer token that a Reseller Admin generates in the partner
portal under Settings, API keys. It belongs to the reseller partner, not to a
person, and carries the scopes ticked at creation time. Send it on every request as
Authorization: Bearer <partner_api_key>.
Every response is confined to the partner the key belongs to. Keep the key secret and call the API from your server only, never from a browser app.
- HTTP Authorization Scheme
bearer- Bearer format
Bearer <partner_api_key>
application/jsonRequest body · required · application/json
Businesscountriesarray<string>
For growing teamsUnlimited extensions
Call recording9.9EUR10251011114300172block_services downgrade staystay10Responses
dataobject
550e8400-e29b-41d4-a716-446655440201BusinessFor growing teams9.9000EUR10.00251011Unlimited extensions
Call recordingfeatures_listarray<string>
11400172block_services downgrade staystay310countriesarray<string>
https://cockpit.voxbi.com/acme/signup/550e8400-e29b-41d4-a716-4466554402014manual12026-10-01T08:00:00+00:002026-10-29T14:05:00+00:00This API key is missing a required scope.required_scopesarray<string>
errorsobject
https://cockpit.voxbi.com/api/v1/api/v1/plans
curl -X POST 'https://cockpit.voxbi.com/api/v1/api/v1/plans' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
--data '{"name":"Business","countries":["AT","LU"],"description":"For growing teams","transfer_partner_id":"550e8400-e29b-41d4-a716-446655440301","transfer_plan_id":"550e8400-e29b-41d4-a716-446655440302","features":"Unlimited extensions\nCall recording","price_per_user":9.9,"currency":"EUR","yearly_discount":10,"max_users":25,"max_numbers":10,"ai_enabled":true,"stats_enabled":true,"is_free_trial_allowed":true,"free_trial_days":14,"kyc_required":true,"kyc_deadline_days":7,"kyc_reminder_days_before":2,"card_deadline_days":0,"card_reminder_days_before":0,"after_deadline_action":"stay","is_active":true}'
const response = await fetch('https://cockpit.voxbi.com/api/v1/api/v1/plans', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${YOUR_TOKEN}`,
},
body: JSON.stringify({
"name": "Business",
"countries": [
"AT",
"LU"
],
"description": "For growing teams",
"transfer_partner_id": "550e8400-e29b-41d4-a716-446655440301",
"transfer_plan_id": "550e8400-e29b-41d4-a716-446655440302",
"features": "Unlimited extensions\nCall recording",
"price_per_user": 9.9,
"currency": "EUR",
"yearly_discount": 10,
"max_users": 25,
"max_numbers": 10,
"ai_enabled": true,
"stats_enabled": true,
"is_free_trial_allowed": true,
"free_trial_days": 14,
"kyc_required": true,
"kyc_deadline_days": 7,
"kyc_reminder_days_before": 2,
"card_deadline_days": 0,
"card_reminder_days_before": 0,
"after_deadline_action": "stay",
"is_active": true
}),
});
const data = await response.json();
console.log(data);
import requests
response = requests.post('https://cockpit.voxbi.com/api/v1/api/v1/plans',
headers={'Authorization': f'Bearer {YOUR_TOKEN}'},
json={
"name": "Business",
"countries": [
"AT",
"LU"
],
"description": "For growing teams",
"transfer_partner_id": "550e8400-e29b-41d4-a716-446655440301",
"transfer_plan_id": "550e8400-e29b-41d4-a716-446655440302",
"features": "Unlimited extensions\nCall recording",
"price_per_user": 9.9,
"currency": "EUR",
"yearly_discount": 10,
"max_users": 25,
"max_numbers": 10,
"ai_enabled": true,
"stats_enabled": true,
"is_free_trial_allowed": true,
"free_trial_days": 14,
"kyc_required": true,
"kyc_deadline_days": 7,
"kyc_reminder_days_before": 2,
"card_deadline_days": 0,
"card_reminder_days_before": 0,
"after_deadline_action": "stay",
"is_active": true
}
)
response.raise_for_status()
data = response.json()
print(data)
<?php
$context = stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/json\r\nAuthorization: Bearer YOUR_TOKEN",
'content' => '{
\"name\": \"Business\",
\"countries\": [
\"AT\",
\"LU\"
],
\"description\": \"For growing teams\",
\"transfer_partner_id\": \"550e8400-e29b-41d4-a716-446655440301\",
\"transfer_plan_id\": \"550e8400-e29b-41d4-a716-446655440302\",
\"features\": \"Unlimited extensions\\nCall recording\",
\"price_per_user\": 9.9,
\"currency\": \"EUR\",
\"yearly_discount\": 10,
\"max_users\": 25,
\"max_numbers\": 10,
\"ai_enabled\": true,
\"stats_enabled\": true,
\"is_free_trial_allowed\": true,
\"free_trial_days\": 14,
\"kyc_required\": true,
\"kyc_deadline_days\": 7,
\"kyc_reminder_days_before\": 2,
\"card_deadline_days\": 0,
\"card_reminder_days_before\": 0,
\"after_deadline_action\": \"stay\",
\"is_active\": true
}',
],
]);
$response = file_get_contents('https://cockpit.voxbi.com/api/v1/api/v1/plans', false, $context);
$data = json_decode($response, true);
print_r($data);
{ … }
"countries": [ … ],
{ … }
"data": { … }
"features_list": [ … ],
"countries": [ … ],
{ … }
application/json{ … }
"required_scopes": [ … ]
application/json{ … }
"errors": { … }
"name": [ … ]
application/json{ … }
30application/json