Skip to main content
a rented number is a real phone number, provisioned through rumik, that an agent answers. rent one from the inventory, connect it to a deployed agent, and callers who dial it get the agent. the same number is the caller id when that agent places calls. numbers are Indian (+91) for now. renting needs a business KYC — once, per account — and is paid from your wallet: the monthly rent up front and the carrier’s per-minute cost of every call, on top of the agent’s own charge.

1. see what renting needs

GET /v1/phone-numbers/requirements says whether the account may rent, which documents the KYC needs, and whether a verified KYC is already on file.
curl
object
eligible and, when false, a reason. mandateRequired is true for a pay-as-you-go account: renting needs an auto-pay mandate, set up in the dashboard’s billing page, so rent and call charges can always be covered.
object[]
the KYC form. every listed type is required — for an Indian business that is a registration certificate and the GST certificate — each with the requiredFields to fill in alongside the file.
object | null
set once the carrier accepted a KYC for this account. further numbers reuse it: skip step 3’s documents and send a plain JSON body.
object
the auto-pay amount a pay-as-you-go account needs: rent plus a reserve, in nanos of the wallet’s currency.

2. pick a number

GET /v1/phone-numbers/available searches the live inventory. filter by a digit pattern (an area prefix like 8046) or a city; page with limit (max 20) and offset.
curl
amounts are nanos (billionths) of the wallet’s currency: 236250000000 nanos INR is ₹236.25 a month. voiceRateNanos is the inbound per-minute carrier rate, outboundRateNanos the outbound one, billed per outboundUnitSeconds.

3. rent it

POST /v1/phone-numbers. two shapes, depending on whether the account’s KYC is already verified.
multipart/form-data: a data field holding the JSON below, and the document files in files, one per entry of documents, in the same order (pdf, jpeg or png, up to 5 MB each).
data
curl
documentTypeId values and the dataFields each needs come from step 1. searchFilters is the search the number came from, so a matching substitute can be bought if the number is taken meanwhile.
renting returns 201 with the rental. the first month’s rent is taken from the wallet right away, then the documents go to the carrier:

4. wait for it

verification takes the carrier a while. poll GET /v1/phone-numbers/{id} (every few seconds is fine) and watch status and timeline: a rejected KYC is fixed with POST /v1/phone-numbers/{id}/resubmit — multipart again, with endUser, documents and every file, since the carrier replaces them wholesale.

5. connect it to an agent

POST /v1/phone-numbers/{id}/agent with the agent’s UUID or handle. from then on callers who dial the number get that agent, and POST /v1/calls for that agent dials from it.
curl
only a deployed agent can take a number (409 agent_not_deployed). an agent answers one number and a number one agent: connecting moves the number off its previous agent. "agentId": null detaches. the agent’s inboundPhoneNumber shows the connection.

renewals and charges

rent is charged again before each renewal (nextRenewalAt). a pay-as-you-go account’s auto-pay mandate tops the wallet up when it is short; if it cannot, the number goes past_due and, past the renewal, telephony is switched off — every number released and pending rentals withdrawn with their prepaid rent refunded. the dashboard’s usage page lists every rent, renewal and per-call carrier charge.

release

POST /v1/phone-numbers/{id}/release gives the number up. it is irreversible, so the body must spell the number:
curl
a rental that never reached active is withdrawn instead and its prepaid rent returned to the wallet.

list

GET /v1/phone-numbers returns every rental on the account, released ones included, with the same fields. next: sip trunks.