Get one of the partner's plans (partner-api)
Returns one plan your partner can see (its own, or a global Voxbi plan). An id that belongs to another partner, does not exist, or is not a UUID answers 404.
Required scopes: partner-api and partner-plans.
HTTP:
PartnerApiKey
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>
plan
path · string · uuid
*
Plan id (UUID). It must be one of your plans or a global plan, otherwise the answer is `404`.
accept
header · string
example:
application/jsonResponses
Response schema
dataobject
A plan the partner that owns the API key may see: its own plans and the global Voxbi plans.
Plans of other partners are never returned. A plan is offered in the countries listed in
`countries`; an empty list means it is offered in every country (every plan created before
countries existed behaves this way). Money values are decimal strings, never floats.
idstring · uuid
Unique identifier of the plan.
example:
550e8400-e29b-41d4-a716-446655440201namestring
Plan name. Unique per country within your organization, case-insensitive.
example:
Businessdescriptionstring | null
Short description shown to customers.
example:
For growing teamsprice_per_userstring
Monthly price per user, as a decimal string.
example:
9.9000currencystring
ISO 4217 currency code.
example:
EURyearly_discountstring
Discount in percent when billed yearly, as a decimal string.
example:
10.00price_overriddenboolean
For a plan linked to an Odoo product, whether your own price is kept when Odoo syncs. When false the price follows Odoo and cannot be changed through the API.
example:
max_usersinteger | null
Users included. Null means unlimited.
example:
25max_numbersinteger | null
Phone numbers included. Null means unlimited, zero means none.
example:
10numbers_are_fixedboolean
True when `max_numbers` is an exact count rather than a ceiling.
example:
ai_enabledboolean
Recording and AI features included.
example:
1stats_enabledboolean
Statistics included.
example:
1tempus_enabledboolean
Tempus time tracking included.
example:
featuresstring | null
Feature lines as stored, one per line.
example:
Unlimited extensions
Call recordingfeatures_listarray<string>
The same feature lines, split and trimmed, empty lines dropped. Read only.
[]string
is_free_trial_allowedboolean
Whether a signup can start a free trial on this plan.
example:
1free_trial_daysinteger
Length of the free trial in days.
example:
14card_verification_requiredboolean
Customers must verify a payment card.
example:
card_deadline_daysinteger
Days to verify the card.
example:
0card_reminder_days_beforeinteger
Days before the card deadline a reminder is sent.
example:
0kyc_requiredboolean
Customers must complete KYC verification. Cannot be false on a plan that includes phone numbers.
example:
1kyc_deadline_daysinteger
Days to complete KYC.
example:
7kyc_reminder_days_beforeinteger
Days before the KYC deadline a reminder is sent.
example:
2after_deadline_actionstring
What happens when a compliance deadline passes.
enum:
block_services downgrade stayexample:
staydowngrade_to_plan_idstring | null · uuid
The plan customers are moved to when the action is `downgrade`.
downgrade_ceremony_daysinteger | null
Notice period in days before a downgrade.
example:
3transfer_partner_idstring | null · uuid
The reseller a customer is handed to when its trial ends on this plan. Null when unset.
transfer_partner_namestring | null
Name of `transfer_partner_id`.
transfer_plan_idstring | null · uuid
The plan the customer gets at the target reseller. Null when unset (the customer moves without a plan).
transfer_plan_namestring | null
Name of `transfer_plan_id`.
is_activeboolean
Whether the plan is on sale. Customers already on an inactive plan keep it.
example:
1sort_orderinteger
Display order, ascending.
example:
0countriesarray<string>
ISO 3166-1 alpha-2 codes of the countries the plan is offered in, sorted. Empty means every country.
[]string
length: 2–2
signup_urlstring · uri
The public signup link that starts a trial on this plan, to publish on your website.
example:
https://cockpit.voxbi.com/acme/signup/550e8400-e29b-41d4-a716-446655440201customers_countinteger | null
How many of YOUR customers are on the plan now. Never counts another partner's customers on a global plan.
example:
4sourcestring
Where the plan comes from, `manual` or `odoo`.
example:
manualis_globalboolean
True for a Voxbi plan offered to every partner. Global plans are read only.
example:
editableboolean
Whether your key's partner may change or delete the plan.
example:
1created_atstring · date-time
example:
2026-10-01T08:00:00+00:00updated_atstring · date-time
example:
2026-10-29T14:05:00+00:00Unauthenticated. The `Authorization: Bearer <token>` header was missing,
malformed, or names a token that has been revoked or deleted.
Response schema
messagestring
Forbidden. Three different situations share this status, told apart by `message`:
* the token is not a partner API key (a user token, a PBX API key, or any other token);
* the partner is not an active reseller;
* the key lacks a scope the endpoint needs. The body then also lists `required_scopes`.
Response schema
messagestring
Human-readable reason.
example:
This API key is missing a required scope.required_scopesarray<string>
Present on the missing-scope 403 only. Scopes the endpoint needs that the key lacks.
[]string
Not Found. No plan with this id is visible to your partner (a plan of another partner, a nonexistent id and an id that is not a UUID answer the same way).
Response schema
messagestring
Human-readable reason.
example:
This API key is missing a required scope.required_scopesarray<string>
Present on the missing-scope 403 only. Scopes the endpoint needs that the key lacks.
[]string
Too Many Requests. Two budgets apply: 120 requests per minute per API key, and 600 per
minute across all of a partner's keys together. Wait for the number of seconds in the `Retry-After` header before retrying.
Response schema
messagestring
get
https://cockpit.voxbi.com/api/v1/api/v1/plans/{plan}
Base URL
Request sample
curl -X GET 'https://cockpit.voxbi.com/api/v1/api/v1/plans/{plan}' \
-H 'Authorization: Bearer YOUR_TOKEN'
const response = await fetch('https://cockpit.voxbi.com/api/v1/api/v1/plans/{plan}', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${YOUR_TOKEN}`,
},
});
const data = await response.json();
console.log(data);
import requests
response = requests.get('https://cockpit.voxbi.com/api/v1/api/v1/plans/{plan}',
headers={'Authorization': f'Bearer {YOUR_TOKEN}'}
)
response.raise_for_status()
data = response.json()
print(data)
<?php
$context = stream_context_create([
'http' => [
'method' => 'GET',
'header' => "Content-Type: application/json\r\nAuthorization: Bearer YOUR_TOKEN",
],
]);
$response = file_get_contents('https://cockpit.voxbi.com/api/v1/api/v1/plans/{plan}', false, $context);
$data = json_decode($response, true);
print_r($data);
{ … }
"data": { … }
"id": "550e8400-e29b-41d4-a716-446655440201",
"name": "Business",
"description": "For growing teams",
"price_per_user": "9.9000",
"currency": "EUR",
"yearly_discount": "10.00",
"price_overridden": false,
"max_users": 25,
"max_numbers": 10,
"numbers_are_fixed": false,
"ai_enabled": true,
"stats_enabled": true,
"tempus_enabled": false,
"features": "Unlimited extensions
Call recording",
"features_list": [ … ],
"Unlimited extensions",
"Call recording"
],
"is_free_trial_allowed": true,
"free_trial_days": 14,
"card_verification_required": false,
"card_deadline_days": 0,
"card_reminder_days_before": 0,
"kyc_required": true,
"kyc_deadline_days": 7,
"kyc_reminder_days_before": 2,
"after_deadline_action": "stay",
"downgrade_to_plan_id": null,
"downgrade_ceremony_days": 3,
"transfer_partner_id": null,
"transfer_partner_name": null,
"transfer_plan_id": null,
"transfer_plan_name": null,
"is_active": true,
"sort_order": 0,
"countries": [ … ],
"AT",
"LU"
],
"signup_url": "https://cockpit.voxbi.com/acme/signup/550e8400-e29b-41d4-a716-446655440201",
"customers_count": 4,
"source": "manual",
"is_global": false,
"editable": true,
"created_at": "2026-10-01T08:00:00+00:00",
"updated_at": "2026-10-29T14:05:00+00:00"
}
}
{ … }
"message": "Unauthenticated."
}
Content-Type
string
example:
application/json{ … }
"message": "This endpoint requires a partner API key."
}
Content-Type
string
example:
application/json{ … }
"message": "Plan not found."
}
Content-Type
string
example:
application/json{ … }
"message": "Too Many Attempts."
}
Retry-After
integer
Seconds to wait before retrying.
example:
30
Content-Type
string
example:
application/json