PhoneNumber (search the carrier catalog and buy) and Number (manage numbers you own); Vobiz folds both into a single phone_numbers resource backed by an inventory model — you buy by E.164 from Vobiz’s pre-provisioned stock. Note the two big behavioural gaps: there is no port-in, and a 15-day DID cool-off applies on sub-account moves.
Plivo → Vobiz mapping
| Operation | Plivo (endpoint / Python SDK) | Vobiz (endpoint / Python SDK) |
|---|---|---|
| Search available numbers | GET /v1/Account/{auth_id}/PhoneNumber/ · client.numbers.search(country_iso, type, pattern, ...) | GET /api/v1/Account/{auth_id}/inventory/numbers · client.phone_numbers.list_inventory_numbers(auth_id, country=, search=) |
| Buy / rent a number | POST /v1/Account/{auth_id}/PhoneNumber/{number}/ · client.numbers.buy(number, app_id, ...) | POST /api/v1/Account/{auth_id}/numbers/purchase-from-inventory · client.phone_numbers.purchase_from_inventory(auth_id, e164, currency=) |
| List owned numbers | GET /v1/Account/{auth_id}/Number/ · client.numbers.list(...) | GET /api/v1/Account/{auth_id}/numbers · client.phone_numbers.list_numbers(auth_id, limit=, offset=) |
| Get one number’s details | GET /v1/Account/{auth_id}/Number/{number}/ · client.numbers.get(number) | No dedicated endpoint — read the item from list_numbers (see gaps) |
| Update a number (app, alias, subaccount) | POST /v1/Account/{auth_id}/Number/{number}/ · client.numbers.update(number, app_id=, subaccount=, alias=) | Per-action endpoints — assign_number_to_trunk / assign_did_to_subaccount |
| Release / unrent a number | DELETE /v1/Account/{auth_id}/Number/{number}/ · client.numbers.delete(number) | DELETE /api/v1/Account/{auth_id}/numbers/{e164} · client.phone_numbers.unrent_number(auth_id, e164) |
| Attach number to an app / route inbound | update(number, app_id=...) (Plivo Application) | POST /api/v1/Account/{auth_id}/numbers/{phone_number}/assign · client.phone_numbers.assign_number_to_trunk(auth_id, phone_number, trunk_group_id) |
| Detach inbound routing | update(number, app_id="") | DELETE /api/v1/Account/{auth_id}/numbers/{phone_number}/assign · client.phone_numbers.unassign_number_from_trunk(auth_id, phone_number) |
| Assign a number to a sub-account | update(number, subaccount=...) | POST /api/v1/account/{auth_id}/numbers/{e164}/assign-subaccount · client.phone_numbers.assign_did_to_subaccount(auth_id, e164, sub_account_id) |
| Remove a number from a sub-account | update(number, subaccount="") | DELETE /api/v1/account/{auth_id}/numbers/{e164}/assign-subaccount · client.phone_numbers.unassign_did_from_subaccount(auth_id, e164, force=) |
| Port a number in | Manual port-in (console / LOA, no self-serve REST) | No equivalent — Vobiz does not support port-in (see below) |
Before / after: buy a number
Plivo POSTs to the specific{number} path and can attach a Plivo Application at buy time. Vobiz POSTs the E.164 (with the leading +) to a single purchase-from-inventory endpoint, which debits setup_fee + monthly_fee from your balance (for an SA_ sub-account, the parent MA_ is charged). After purchase the number is owned but not yet routed — assign it to a trunk before it takes inbound calls.
Plivo
Vobiz
Key differences & gotchas
- E.164 formatting is inconsistent across endpoints.
purchase_from_inventorytakes the number with the leading+in the body;unrent_numbertakes it without the+in the path; trunk/sub-account assignment endpoints take it URL-encoded (%2B14155551234). - Routing is by trunk, not by Application. There is no
app_idon a Vobiz number — inbound routing is an explicitassign/unassignto atrunk_group_id(a UUID), and a freshly purchased number routes nowhere until you assign it. - 15-day DID cool-off on sub-account moves.
unassign_did_from_subaccountreturns409 did_cool_off_in_effectif the DID took a call in the last 15 days; never-used DIDs move immediately, and admins can bypass withforce=true. - Sub-account assignment uses a lowercase
accountpath (/api/v1/account/...), unlike the capital-Accountof every other number endpoint — the SDK hides this, but raw HTTP callers must match the casing.
What has no Vobiz equivalent
- Number porting (port-in). You cannot port or transfer a Plivo number to Vobiz — there is no port-in flow via API or console. Treat the migration as a fresh provision: buy new Vobiz numbers, re-point your flows, run in parallel, then release the Plivo numbers. See Phone numbers (you can’t port from Plivo).
- Get-one-number endpoint. No
GET .../numbers/{e164}detail call — read the number’s fields from thelist_numberspage (each item carries the full object). - CNAM / alias / 10DLC & toll-free registration fields on the number. The Vobiz number resource carries none of Plivo’s editable
cnam,alias,compliance_application_id, or 10DLC/toll-free attributes; compliance is handled out-of-band. - Plivo
numbers.create(add carrier/hosted numbers). No equivalent — every Vobiz number originates from its managed inventory.