Pre-validate KYC address
Optional early check for the address step of a Tier 4 (end-user identity)
registration: validates a postal address for deliverability BEFORE the full
KYC submit, so it can be corrected before any documents are uploaded. The
full submit (POST /v1/phone-numbers/kyc) re-validates the address,
so this call is purely a fast feedback path and skipping it is safe. Only
the postal address is sent (no documents, no gov-ID fields). A region
(administrative_area) is required by the validator; when it is omitted the
pre-check is skipped and { ok: true, skipped: true } is returned (the
final submit still validates).
API key authentication - use your Zernio API key as a Bearer token
In: header
ISO 3166-1 alpha-2 country code.
2 <= length <= 2City / town.
State / province / region. When omitted, the pre-check is skipped (the final submit still validates).
Response Body
application/json
application/json
application/json
import Zernio from '@zernio/node';const zernio = new Zernio({ apiKey: process.env.ZERNIO_API_KEY });const { data } = await zernio.phonenumbers.validatePhoneNumberKycAddress({ body: { country: 'string', street_address: 'string', locality: 'string', postal_code: 'string', },});console.log(data);{
"ok": true,
"skipped": true
}{
"error": "string",
"type": "string",
"code": "INVALID_FIELD_VALUE",
"param": "address",
"details": {
"addressSuggestions": [
{
"field": "administrative_area",
"label": "State / Province",
"value": "Dublin"
}
]
}
}{
"error": "Unauthorized"
}Upload a porting document POST
Upload ONE porting document (the signed LOA or a recent carrier invoice) and get back its `documentId`, which the port-in create request takes as `loaDocumentId` / `invoiceDocumentId`. PDF, JPEG, or PNG, 10MB max.
List all calls (unified history) GET
Unified call history across ALL of your numbers: both channels (WhatsApp Business Calling + regular phone/PSTN), inbound and outbound, newest first. Unlike `GET /v1/voice/calls` (PSTN-only) and `GET /v1/whatsapp/calls` (one account at a time), this endpoint needs no `accountId` and never requires fanning out one request per number. Any row can be opened channel-agnostically via `GET /v1/calls/{id}` and `GET /v1/calls/{id}/recording`; no branching on `channel` needed. When the counterparty number matches a CRM contact, `contactId` and `contactName` are set. Cursor pagination: pass the returned `nextCursor` as `before` to fetch the next page. `nextCursor` is null on the last page.