Update a plan (partner-api)
Updates one of your plans. Both PUT and PATCH update partially: a field you leave out keeps its stored value, so you can send just what changes. Same validation as the Plans form in the partner portal, including the per-country name rule (a name already used in one of the plan's resulting countries answers 422) and the Odoo rule (for a plan linked to an Odoo product with price_overridden false, the stored price stands). The Odoo link and the owner cannot be changed.
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; if the reseller rejects it, or the request is canceled, the normal rules apply. A target that was deactivated, deleted or stopped accepting customers from you is ignored at trial end. Re-pointing transfer_partner_id without sending transfer_plan_id drops the stored target plan; send null to clear a field.
A plan of another partner answers 404; a global Voxbi plan answers 403 because it is read only.
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>
This API key is missing a required scope.required_scopesarray<string>
errorsobject
https://cockpit.voxbi.com/api/v1/api/v1/plans/{plan}
curl -X PUT 'https://cockpit.voxbi.com/api/v1/api/v1/plans/{plan}' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
--data '{"price_per_user":11.5,"transfer_partner_id":"550e8400-e29b-41d4-a716-446655440301","transfer_plan_id":"550e8400-e29b-41d4-a716-446655440302","countries":["AT","LU","DE"]}'
const response = await fetch('https://cockpit.voxbi.com/api/v1/api/v1/plans/{plan}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${YOUR_TOKEN}`,
},
body: JSON.stringify({
"price_per_user": 11.5,
"transfer_partner_id": "550e8400-e29b-41d4-a716-446655440301",
"transfer_plan_id": "550e8400-e29b-41d4-a716-446655440302",
"countries": [
"AT",
"LU",
"DE"
]
}),
});
const data = await response.json();
console.log(data);
import requests
response = requests.put('https://cockpit.voxbi.com/api/v1/api/v1/plans/{plan}',
headers={'Authorization': f'Bearer {YOUR_TOKEN}'},
json={
"price_per_user": 11.5,
"transfer_partner_id": "550e8400-e29b-41d4-a716-446655440301",
"transfer_plan_id": "550e8400-e29b-41d4-a716-446655440302",
"countries": [
"AT",
"LU",
"DE"
]
}
)
response.raise_for_status()
data = response.json()
print(data)
<?php
$context = stream_context_create([
'http' => [
'method' => 'PUT',
'header' => "Content-Type: application/json\r\nAuthorization: Bearer YOUR_TOKEN",
'content' => '{
\"price_per_user\": 11.5,
\"transfer_partner_id\": \"550e8400-e29b-41d4-a716-446655440301\",
\"transfer_plan_id\": \"550e8400-e29b-41d4-a716-446655440302\",
\"countries\": [
\"AT\",
\"LU\",
\"DE\"
]
}',
],
]);
$response = file_get_contents('https://cockpit.voxbi.com/api/v1/api/v1/plans/{plan}', false, $context);
$data = json_decode($response, true);
print_r($data);
{ … }
"countries": [ … ]
{ … }
"data": { … }
"features_list": [ … ],
"countries": [ … ],
{ … }
application/json{ … }
"required_scopes": [ … ]
application/json{ … }
application/json{ … }
"errors": { … }
"name": [ … ]
application/json{ … }
30application/json