Going live
Live calling is a code path, not a date. Ask the API what is in the way and it will tell you, one blocker at a time.
On your account
- Business verification. Kleos completes this with you. Until it is done, live keys cannot be created.
- The reseller agreement. Signed once, recorded against your account.
- A funded balance. Calls draw from it. You will be warned before it runs out.
- Approval. Kleos flips your account to live. Your console checklist shows all four.
On each customer
Some things cannot be cleared once for everyone — they depend on where the customer is and what the agent will say. Ask per customer:
GET /v1/customers/{id}/readinessEvery blocker comes back as a stable code with a human message. Show the message, branch on the code.
| Code | Meaning |
|---|---|
emporos_not_live | Your account is still in test mode. |
kyb_incomplete | Business verification is not finished. |
agreement_unsigned | The reseller agreement is not signed. |
insufficient_balance | The account has no usable balance. |
human_speech_gate_closed | Kleos has not certified its own delivery in this customer's calling language. |
no_number_in_country | No Kleos number exists for the customer's country yet. |
script_uncertified | This customer's call script has not passed certification. |
customer_not_attested | This customer has not accepted the calling terms yet. Mint an onboarding link and send it to them. |
The one thing you cannot do for them
customer_not_attested clears in exactly one way: your customer opens a link and accepts the calling terms themselves. Mint it with POST /v1/customers/{id}/onboarding_link, send it however you already talk to them, and the page it opens carries your name, your logo and your colour. Kleos is not mentioned on it.
You cannot tick this on their behalf, and there is no admin who can. Calls go out in your customer's name, which makes them the caller under every calling rule that matters — and a consent attestation entered by somebody else is not evidence of anything on the day it is asked for. The link expires, and minting a new one replaces the old.
Why Kleos refuses things you did not ask about
Two of those blockers are ours, not yours. human_speech_gate_closed means Kleos has not yet proved, for that customer's calling language, that its own delivery is good enough to put in front of a stranger — and script_uncertified means the words this customer's agent would say have not passed review yet. Neither can be waived by an API parameter or by a Kleos admin clicking something, in test mode or in live.
This is the part of the arrangement worth understanding before you sell it: Kleos will refuse to make a call it is not ready to make, on your customer's behalf, even when you have paid for it. The readiness endpoint exists so that refusal never arrives as a surprise.
Countries and languages
A customer's country decides three things: which calling rules apply, which language the agent speaks, and which number Kleos needs to have. A country Kleos has not opened yet reports no_number_in_country — the honest answer, and one your onboarding can act on rather than discovering mid-campaign.
Better still, ask before there is a customer to ask about: GET /v1/coverage answers the same question per country, at quoting time. See Where you can sell.