Skip to main content
This walkthrough provisions a customer_use sub-account from scratch - create → KYC → number → first call - and is explicit about which credentials to use at each step. Base URL: https://api.vobiz.ai/api/v1

The one rule that prevents most of the confusion

Two credential pairs are in play. Keep them straight:
Rule of thumb: if you are setting up the sub-account, authenticate as the parent. Once it’s live, the sub-account authenticates as itself to use the service.
KYC is not an exception. Sub-account KYC endpoints authenticate with the parent’s X-Auth-ID / X-Auth-Token; the sub-account is identified by {sub_auth_id} in the path.
Path casing is significant. Note /accounts/ and /sub-accounts/ (sub-account CRUD + KYC), /account/ (assign to sub-account), and /Account/ (inventory + purchase + calls). The wrong casing returns 401/404 even with valid credentials.

The flow

1

Create the customer sub-account - parent credentials

A customer that must be KYC’d in its own name is a customer_use sub-account. It requires an email and starts call-blocked until KYC passes.
cURL
Response (201) - save the sub-account’s own credentials; auth_token is shown once:
  • auth_credentials → the sub-account’s key (used in the final step).
  • tokens (JWT) are optional - only for console/dashboard sign-in, not the REST/telephony API.
  • kyc_calls_blocked: true → the sub-account cannot place calls yet.
2

Complete KYC - parent credentials

All KYC endpoints live under /sub-accounts/{sub_auth_id}/kyc/… and authenticate as the parent. Run the documents the entity needs (PAN + GST/CIN for companies; PAN + Aadhaar via DigiLocker for individuals), then poll status.
Verify PAN
Verify GST
Poll status
When kyc_calls_blocked flips to false, the sub-account may place calls. overall_status is the aggregate (not_started / pending / verified / failed); verifications holds the per-document state.
Building the integration first? Use the test-mode mirror at /sub-accounts/test/{sub_auth_id}/kyc/… with magic inputs (TESTSUCCESS0001 → verified, TESTFAIL0001 → failed, TESTPENDING001 → pending). Same parent auth, no real documents, no provider calls.
3

Buy a number - parent credentials

Browse inventory, then purchase. Buying with the parent puts the number in the parent’s pool, ready to assign in the next step. Billing for an SA_ purchase always routes to the parent MA_.
Find a number
Purchase it
Purchasing debits the parent’s balance (setup fee + monthly fee).
4

Link the number to the sub-account - parent credentials

Assign a parent-pool DID to the sub-account. URL-encode + as %2B in the path; name the sub-account in the body via sub_account_id.
cURL
The number now belongs to the sub-account.
Moving a number back to the parent pool is subject to a 15-day cool-off if it had a call in the last 15 days. See Unassign DID.
5

The sub-account places a call - sub-account credentials

Now switch credentials. The sub-account (or your customer) authenticates as itself using the auth_id / auth_token from Step 1.
cURL
This succeeds only when kyc_calls_blocked is false (Step 2 complete).

Alternative: let the sub-account buy its own number

Instead of Steps 3–4, the sub-account can purchase directly with its own auth_id / auth_token (billing still routes to the parent MA_). The number lands directly on the sub-account - no separate assign step:
cURL

Auth cheat-sheet

TL;DR: Parent credentials for setup (Steps 1–4); the sub-account’s own credentials for usage (Step 5 onward).