HTTP API v1
Acesso programático a números de telefone, chamadas, SMS, caixas postais e funcionalidades de IA. JSON via HTTPS. Idempotente onde importa. Nenhum SDK obrigatório, mas fornecemos 5.
Introdução
A API do NoKYCNumber é organizada em torno de REST. Usamos URLs orientadas a recursos previsíveis, aceitamos e retornamos corpos codificados em JSON e usamos códigos de resposta HTTP padrão, autenticação e verbos.
URL base
https://api.nokycnumber.com/v1/Todas as requisições devem ser feitas via HTTPS. Chamadas via HTTP simples falharão com 301 Moved Permanently. Requisições sem autenticação falharão com 401 Unauthenticated.
Convenção JSON
- Todas as requisições com corpo usam
Content-Type: application/json. Corpos codificados como formulário são rejeitados com415. - Os timestamps são retornados como strings ISO-8601 UTC (
2026-04-26T14:23:00Z) e aceitos no mesmo formato. - Os números de telefone são retornados em E.164 com um
+inicial (+33647189022) e formatados emdisplayquando relevante. - Os IDs de objeto têm prefixo do recurso:
num_,call_,sms_,vm_,whk_,evt_.
Autenticação
Autentique com uma chave bearer emitida pelo seu painel em Configurações → Chaves de API. Existem dois tipos de chave:
sk_live_…— segredo do servidor. Leitura/escrita completa. Nunca exponha no código do cliente.pk_live_…— chave pública. Reservada por enquanto; ainda não usada por nenhum endpoint.
Formato do header
Authorization: Bearer sk_live_5f3a8b2c4d1e9f6a7b8c2d1e9f6a7b8c
Content-Type: application/json
NoKYC-Version: 2026-04-01Use o header NoKYC-Version para fixar uma versão específica da superfície da API (veja Versionamento). Quando omitido, o padrão fixado da sua conta é usado.
Escopos
As chaves são emitidas com um dos três escopos:
| Escopo | Métodos permitidos | Caso de uso |
|---|---|---|
read | GET | Relatórios, dashboards de monitoramento. |
read_write | GET · POST · PATCH | A maioria das integrações server-side. |
admin | Todos incluindo DELETE | Automação de provisionamento, gerenciamento de conta. |
As chaves podem ser rotacionadas a qualquer momento. Chaves antigas permanecem válidas por 5 minutos após a rotação para permitir deploy sem interrupção.
Erros
A API usa códigos de status HTTP convencionais. 2xx significa sucesso, 4xx significa um problema com sua requisição, 5xx significa que cometemos um erro e gostaríamos de saber.
Envelope de erro
{
"error": {
"type": "invalid_request_error",
"code": "parameter_missing",
"message": "Required parameter `country` is missing.",
"param": "country",
"request_id": "req_8a4c2f1e9b3d4a7c"
}
}Códigos de status
| Código | Significado |
|---|---|
200 | OK · requisição bem-sucedida |
201 | Created · recurso criado |
204 | No Content · recurso excluído, nenhum corpo retornado |
400 | Bad Request · JSON malformado ou parâmetro obrigatório ausente |
401 | Unauthenticated · chave de API inválida, ausente ou revogada |
402 | Payment Required · saldo da conta insuficiente para a ação |
403 | Forbidden · chave sem escopo para esta operação |
404 | Not Found · recurso não existe ou pertence a outra conta |
409 | Conflict · chave de idempotência reutilizada com parâmetros diferentes |
422 | Unprocessable · erro semântico (ex.: país não suportado) |
429 | Too Many Requests · veja Limites de taxa |
500 – 503 | Problema de servidor / serviço · seguro tentar novamente com backoff |
Tipos de erro
invalid_request_error— entrada malformada, campos ausentes, formato inválido.authentication_error— problema com a chave.authorization_error— problema de escopo.rate_limit_error— diminua o ritmo.api_error— erro nosso. Pode tentar novamente.resource_error— o estado do recurso impede a operação (ex.: tentar fazer uma chamada de um número pausado).upstream_error— operadora ou parceiro não respondeu a tempo.
Toda resposta de erro inclui um request_id. Sempre registre-o — é a única forma de nosso suporte correlacionar sua chamada com o rastreamento interno.
Paginação
Os endpoints de listagem usam paginação por cursor unidirecional. Retornam até limit objetos (padrão 25, máx. 100) e um boolean has_more. Para buscar a próxima página, passe o id do último objeto como starting_after.
curl https://api.nokycnumber.com/v1/numbers?limit=10 \
-H "Authorization: Bearer sk_live_…"{
"object": "list",
"url": "/v1/numbers",
"data": [
{ "id": "num_8a4c2f1e9b3d", "object": "number", "number": "+33647189022", … },
{ "id": "num_2k7m9p3w8x4t", "object": "number", "number": "+12025550143", … }
],
"has_more": true,
"next_cursor": "num_2k7m9p3w8x4t"
}As listas são ordenadas com os objetos criados mais recentemente primeiro. Paginação reversa via ending_before não é suportada — use o cursor para paginar.
Idempotência
Requisições POST que alteram estado aceitam um header Idempotency-Key. Deduplicamos na chave por 24 horas, retornando a resposta em cache para novas tentativas. Use um UUID por operação lógica.
POST /v1/sms HTTP/1.1
Authorization: Bearer sk_live_…
Idempotency-Key: 9b3d4a7c-8a4c-2f1e-9b3d-4a7c8a4c2f1e
Content-Type: application/json
{ "from": "num_8a4c2f1e9b3d", "to": "+33612345678", "body": "Hello" }Repetir a mesma chave com conteúdo de corpo diferente retorna 409 Conflict com idempotency_key_mismatch.
Chaves de idempotência não são obrigatórias, mas são fortemente recomendadas para qualquer operação que custe dinheiro (chamadas, SMS, compra de números). Sem uma, uma nova tentativa de rede pode cobrar em dobro.
Limites de taxa
Por padrão, cada chave de API está limitada a 100 requisições por minuto. Clientes de alto volume podem solicitar aumento ao suporte. Os limites são aplicados por chave, não por IP.
Headers de resposta
X-Rate-Limit-Limit: 100
X-Rate-Limit-Remaining: 73
X-Rate-Limit-Reset: 1745672460
Retry-After: 8Quando você excede o limite, recebe 429 Too Many Requests com um header Retry-After em segundos. Backoff linear de até 4 tentativas é recomendado; se persistir, solicite um limite maior.
Tolerância a picos
O limitador é um token bucket — picos curtos acima de 100 rpm são tolerados desde que a média móvel de 60 segundos permaneça abaixo do limite.
Versionamento
As versões da API têm datas (2026-04-01). Mudanças incompatíveis são lançadas como nova versão datada; adições compatíveis vão para a versão atual. Fixe uma versão com o header NoKYC-Version.
Compatibilidade
- Oferecemos suporte a cada versão por pelo menos 24 meses após o próximo lançamento.
- Avisos de depreciação são enviados por e-mail aos titulares de conta com 90 dias de antecedência.
- Um header de resposta
NoKYC-Deprecationavisa quando você está usando uma versão desatualizada.
Versão atual: 2026-04-01.
Números
Um número representa uma linha telefônica virtual que você controla. Os números estão vinculados a um país e a um tipo (mobile ou landline) e têm um período de cobrança.
/v1/numbers
Listar todos os números da sua conta. Retorna uma lista paginada de objetos number.
| Field | Tipo | Description |
|---|---|---|
limit opcional | integer | 1–100, padrão 25. |
starting_after opcional | string | Cursor para paginação. |
country opcional | string | Filtrar por código de país ISO-2 (ex.: fr). |
type opcional | string | Filtrar por mobile ou landline. |
status opcional | string | Filtrar por active, paused ou released. |
curl https://api.nokycnumber.com/v1/numbers?country=fr&type=mobile \
-H "Authorization: Bearer sk_live_…"{
"object": "list",
"data": [
{
"id": "num_8a4c2f1e9b3d",
"object": "number",
"number": "+33647189022",
"display": "+33 6 47 18 90 22",
"country": "fr",
"type": "mobile",
"tier": "standard",
"status": "active",
"billing_period": "yearly",
"renews_at": "2027-04-26T11:23:00Z",
"ai_enabled": true,
"created_at": "2026-04-26T11:23:00Z"
}
],
"has_more": false,
"next_cursor": null
}/v1/numbers/available
Buscar no inventário números disponíveis em um determinado país e tipo. Use o id retornado ao chamar POST /v1/numbers.
| Field | Tipo | Description |
|---|---|---|
country obrigatório | string | Código de país ISO-2. |
type obrigatório | string | mobile ou landline. |
tier opcional | string | standard (padrão) ou premium. |
pattern opcional | string | Filtro opcional de substring nos dígitos locais, ex.: "77". |
limit opcional | integer | 1–50, padrão 10. |
curl "https://api.nokycnumber.com/v1/numbers/available?country=fr&type=mobile&tier=premium&limit=5" \
-H "Authorization: Bearer sk_live_…"{
"object": "list",
"data": [
{ "id": "navail_2k7m9p3w8x4t", "number": "+33611112222", "display": "+33 6 11 11 22 22", "tier": "premium", "pattern": "double-repeat", "price_usd_per_month": 11.98 },
{ "id": "navail_4n2v8j1q6h7y", "number": "+33612345678", "display": "+33 6 12 34 56 78", "tier": "premium", "pattern": "sequential", "price_usd_per_month": 11.98 }
],
"expires_at": "2026-04-26T11:33:00Z"
}Os números disponíveis ficam reservados por 10 minutos. Após o prazo, o mesmo id pode ser atribuído a outro usuário.
/v1/numbers
Ative um novo número a partir de um ID de reserva. Debita o período configurado do saldo da sua conta.
| Field | Tipo | Description |
|---|---|---|
available_id obrigatório | string | Um id navail_… de /v1/numbers/available. |
billing_period obrigatório | string | monthly, quarterly, ou yearly. |
addons opcional | array | Add-ons de IA a ativar, ex.: ["ai-pickup","ai-trans"]. |
webhook_url opcional | string | Endpoint que receberá eventos com escopo de número. |
curl https://api.nokycnumber.com/v1/numbers \
-H "Authorization: Bearer sk_live_…" \
-H "Idempotency-Key: 9b3d4a7c-8a4c-2f1e-9b3d-4a7c8a4c2f1e" \
-d '{
"available_id": "navail_2k7m9p3w8x4t",
"billing_period": "yearly",
"addons": ["ai-pickup"]
}'{
"id": "num_8a4c2f1e9b3d",
"object": "number",
"number": "+33611112222",
"display": "+33 6 11 11 22 22",
"country": "fr",
"type": "mobile",
"tier": "premium",
"status": "active",
"billing_period": "yearly",
"renews_at": "2027-04-26T11:23:00Z",
"ai_enabled": true,
"created_at": "2026-04-26T11:23:00Z"
}/v1/numbers/{id}
Recuperar um único número por id.
curl https://api.nokycnumber.com/v1/numbers/num_8a4c2f1e9b3d \
-H "Authorization: Bearer sk_live_…"/v1/numbers/{id}
Atualizar campos mutáveis de um número. Use POST /v1/numbers/{id}/renew para estender o período.
| Field | Tipo | Description |
|---|---|---|
auto_renew opcional | boolean | Ativar/desativar renovação automática ao final do período. |
webhook_url opcional | string | Substituir o destino de webhook com escopo de número. |
addons opcional | array | Substituir o conjunto ativo de add-ons de IA. |
on_off opcional | object | Defina horários silenciosos / janelas de desligamento. Veja Configuração de IA. |
/v1/numbers/{id}
Liberar um número. O número volta ao inventário ao final do período e pode ser reatribuído a outro cliente. Retorna 204 No Content.
curl -X DELETE https://api.nokycnumber.com/v1/numbers/num_8a4c2f1e9b3d \
-H "Authorization: Bearer sk_live_…"Números liberados não podem ser recuperados. Recomendamos pausar primeiro via PATCH com { "status": "paused" } caso queira recuperá-lo.
Chamadas
Uma chamada é uma sessão de voz originada em um dos seus números. Chamadas de saída são feitas via POST /v1/calls; chamadas de entrada são espelhadas no seu webhook e também podem ser consultadas via API.
/v1/callsFazer uma chamada de saída de um dos seus números.
| Field | Tipo | Description |
|---|---|---|
from obrigatório | string | Um id num_ que você possui. |
to obrigatório | string | Destino E.164, ex.: +33612345678. |
recording_enabled opcional | boolean | Padrão false. Gravações são armazenadas por 30 dias. |
callerid_mask opcional | string | "hide", "rotate", ou qualquer número E.164 que você possua. |
metadata opcional | object | JSON arbitrário retornado em webhooks para a chamada. |
curl https://api.nokycnumber.com/v1/calls \
-H "Authorization: Bearer sk_live_…" \
-d '{
"from": "num_8a4c2f1e9b3d",
"to": "+33612345678",
"callerid_mask": "rotate"
}'{
"id": "call_2k7m9p3w8x4t",
"object": "call",
"from": "num_8a4c2f1e9b3d",
"from_e164": "+33647189022",
"to": "+33612345678",
"status": "ringing",
"direction": "outbound",
"started_at": "2026-04-26T11:24:01Z",
"answered_at": null,
"ended_at": null,
"duration_sec": 0,
"recording_url": null,
"cost_usd": null
}/v1/callsListar chamadas. Filtrar por number, direction, status ou created_after / created_before.
/v1/calls/{id}Recuperar uma única chamada.
/v1/calls/{id}/hangupEncerrar forçadamente uma chamada em andamento. Idempotente.
Mensagens SMS
Enviar e recuperar SMS. Mensagens longas são auto-segmentadas conforme as regras GSM-03.38 / UCS-2; a resposta mostra a contagem real de segmentos para cobrança.
/v1/smsEnviar um SMS de um dos seus números.
| Field | Tipo | Description |
|---|---|---|
from obrigatório | string | Um id num_ que você possui. |
to obrigatório | string | Destino E.164. |
body obrigatório | string | Corpo da mensagem. Máximo 1.600 caracteres (10 segmentos). |
send_at opcional | string | Timestamp futuro ISO-8601 para agendar a entrega. |
media_urls opcional | array | Até 5 URLs de imagem/vídeo. Apenas MMS — funciona em países com suporte. |
curl https://api.nokycnumber.com/v1/sms \
-H "Authorization: Bearer sk_live_…" \
-H "Idempotency-Key: 9b3d4a7c-8a4c-2f1e-9b3d-4a7c8a4c2f1e" \
-d '{
"from": "num_8a4c2f1e9b3d",
"to": "+33612345678",
"body": "Bonjour. Your code is 482917."
}'{
"id": "sms_4n2v8j1q6h7y",
"object": "sms",
"from_e164": "+33647189022",
"to": "+33612345678",
"body": "Bonjour. Your code is 482917.",
"direction": "outbound",
"segments": 1,
"status": "queued",
"created_at": "2026-04-26T11:24:50Z",
"delivered_at": null,
"cost_usd": 0.012
}/v1/smsListar mensagens. Filtrar por number, direction, status.
/v1/sms/{id}Recuperar uma única mensagem incluindo status de entrega por segmento.
Caixas postais
As caixas postais são armazenadas, transcritas e traduzidas automaticamente. As URLs de áudio são pré-assinadas e expiram 1 hora após a emissão.
/v1/voicemailsListar caixas postais. Paginação idêntica a outros endpoints de listagem.
/v1/voicemails/{id}Recuperar uma única caixa postal com transcrição e URL de áudio.
{
"id": "vm_5p3w8x4t9k2m",
"object": "voicemail",
"number_id": "num_8a4c2f1e9b3d",
"from_e164": "+33612345678",
"received_at": "2026-04-26T11:25:42Z",
"duration_sec": 27,
"audio_url": "https://files.nokycnumber.com/vm/5p3w8x4t9k2m.mp3?expires=1745676342&sig=…",
"transcript": {
"text": "Bonjour, c'est Marc. Rappelez-moi quand vous pouvez.",
"language": "fr",
"translation_en": "Hello, this is Marc. Call me back when you can.",
"summary": "Marc asks for a callback.",
"sentiment": "neutral"
}
}Tanto translation_en quanto summary requerem o add-on ai-summary.
/v1/voicemails/{id}Excluir permanentemente uma caixa postal e seu arquivo de áudio. Retorna 204 No Content.
Configuração de IA
Cada número pode executar um agente de IA que atende chamadas quando você não atende, triagem de chamadas desconhecidas, resumo de caixas postais ou tradução de conversas ao vivo. Configure por número via o sub-recurso de IA.
/v1/numbers/{id}/aiRecuperar a configuração de IA atual de um número.
{
"object": "ai_config",
"number_id": "num_8a4c2f1e9b3d",
"addons": ["ai-pickup", "ai-summary"],
"auto_pickup": {
"enabled": true,
"after_rings": 4,
"script": "I'm unavailable right now. Leave your name, the reason for the call, and a callback number.",
"language": "auto",
"voice": "neutral_fr"
},
"screening": { "enabled": false },
"translator": { "enabled": false, "target_language": "en" },
"voicemail_summary": { "enabled": true, "include_sentiment": true }
}/v1/numbers/{id}/aiAtualizar uma ou mais funcionalidades de IA. Cada bloco é opcional; apenas os campos presentes são atualizados.
Vozes
Vozes disponíveis: neutral_en, neutral_fr, neutral_es, neutral_de, neutral_jp, warm_en, warm_fr. Vozes clonadas personalizadas para empresas sob consulta.
Conta
Ler dados da conta: saldo, estatísticas de uso, webhooks configurados.
/v1/accountRecuperar sua conta.
{
"object": "account",
"email_hash": "9b3d4a7c8a4c2f1e",
"balance_usd": 47.32,
"default_country": "fr",
"active_numbers": 3,
"monthly_call_minutes": 412,
"monthly_sms_segments": 1820,
"created_at": "2026-04-12T09:15:00Z"
}/v1/account/usageDetalhamento de uso do período atual. Passe period=last_30d ou period=last_90d.
Webhooks
Assine eventos da sua conta ou de números específicos. Fazemos POST de um evento JSON no seu endpoint e tentamos novamente até 5 vezes com backoff exponencial em 24 horas.
Envelope de evento
{
"id": "evt_3d4a7c8a4c2f",
"object": "event",
"type": "sms.received",
"created": "2026-04-26T11:25:42Z",
"livemode": true,
"data": { "object": { "id": "sms_…", … } },
"request_id": "req_8a4c2f1e9b3d4a7c"
}Verificação de assinatura
Cada requisição carrega um header X-NoKYC-Signature no formato t=<ts>,v1=<hex>. A assinatura é HMAC-SHA256 de <ts>.<raw_body> usando o segredo de assinatura do endpoint. Rejeite qualquer requisição com mais de 5 minutos.
# Pseudocode
ts, v1 = parse(header)
if abs(now - ts) > 300: reject
expected = hmac_sha256(secret, f"{ts}.{body}")
if not constant_time_eq(expected, v1): rejectEndpoints
/v1/webhook_endpointsRegistrar um novo endpoint de webhook. Retorna o segredo de assinatura uma vez; guarde-o.
| Field | Tipo | Description |
|---|---|---|
url obrigatório | string | URL HTTPS para a qual enviaremos eventos via POST. |
enabled_events obrigatório | array | Lista de assinatura, ex.: ["sms.received","call.completed"]. Use ["*"] para todos. |
description opcional | string | Nota livre para seu próprio controle. |
/v1/webhook_endpointsListar seus endpoints.
/v1/webhook_endpoints/{id}Remover um endpoint. Retorna 204.
Tipos de evento
| Evento | Disparado quando |
|---|---|
number.activated | Um novo número foi provisionado e está pronto. |
number.renewed | Renovação do período bem-sucedida. |
number.paused | O número entrou no estado pausado por janela de on/off. |
number.released | Número liberado permanentemente de volta ao inventário. |
call.initiated | Chamada de saída realizada. |
call.answered | A outra parte atendeu. |
call.completed | Chamada encerrada (qualquer motivo). |
call.recorded | Gravação concluída e disponível. |
sms.received | SMS recebido chegou ao seu número. |
sms.sent | SMS de saída aceito pela operadora. |
sms.delivered | Confirmação de entrega pela operadora recebida. |
sms.failed | Operadora rejeitou — verifique failure_code. |
voicemail.created | Nova caixa postal gravada e transcrita. |
ai.pickup | O atendimento automático por IA atendeu uma chamada. |
account.balance_low | O saldo caiu abaixo do seu limite configurado. |
Schemas de objeto
number
{
"id": "string · num_…",
"object": "string · constant \"number\"",
"number": "string · E.164",
"display": "string · pretty-printed",
"country": "string · ISO-2",
"type": "enum · mobile | landline",
"tier": "enum · standard | premium",
"tier_pattern": "string | null · double-repeat | sequential | mirror | round | …",
"status": "enum · active | paused | released",
"billing_period": "enum · monthly | quarterly | yearly",
"renews_at": "string · ISO-8601 UTC",
"auto_renew": "boolean",
"addons": "array · ai-pickup | ai-screen | ai-summary | ai-trans",
"ai_enabled": "boolean",
"metadata": "object | null",
"created_at": "string · ISO-8601 UTC"
}call
{
"id": "string · call_…",
"object": "string · constant \"call\"",
"from": "string · num_…",
"from_e164": "string · E.164",
"to": "string · E.164",
"direction": "enum · inbound | outbound",
"status": "enum · queued | ringing | in_progress | completed | failed | no_answer | busy",
"started_at": "string · ISO-8601 UTC",
"answered_at": "string | null",
"ended_at": "string | null",
"duration_sec": "integer",
"recording_url": "string | null · pre-signed, expires in 1h",
"cost_usd": "number | null"
}sms
{
"id": "string · sms_…",
"object": "string · constant \"sms\"",
"from": "string · num_…",
"from_e164": "string · E.164",
"to": "string · E.164",
"body": "string",
"media_urls": "array · up to 5",
"direction": "enum · inbound | outbound",
"segments": "integer · 1–10",
"status": "enum · queued | sent | delivered | failed | undelivered",
"failure_code": "string | null",
"created_at": "string · ISO-8601 UTC",
"delivered_at": "string | null",
"cost_usd": "number | null"
}SDKs oficiais
A HTTP API é a fonte de verdade, mas esses SDKs fornecem bindings tipados, novas tentativas, idempotência e verificação de webhook prontos para uso.
-
node
npm install @nokycnumber/sdk -
python
pip install nokycnumber -
go
go get github.com/nokycnumber/sdk-go -
php
composer require nokycnumber/sdk -
ruby
gem install nokycnumber