Automatize o WhatsApp oficial de ponta a ponta.

A API do Noz deixa bots, agentes de IA e a sua plataforma fazerem tudo o que a tela faz: ver a saúde de números, WABAs e BMs, vincular número novo numa BM, criar, editar e vincular templates, disparar campanhas e receber cada evento por webhook.

72endpoints
23novos para automação
JSONREST + MCP
  o que precisa de mim agora?
# retrato da conta, do pior para o melhor
curl https://hml.prismkg.com/api/v1/overview \
  -H "Authorization: Bearer $NOZ_TOKEN"

{ "data": {
  "numbers": { "total": 12, "good": 9, "bad": 1 },
  "needs_action": [{
    "type": "number", "name": "Vendas 3",
    "label": "Qualidade baixa", "code": "qualidade_red",
    "next_action": "Parar 7 dias, só responder"
  }]
} }
Nenhum endpoint com “”.

Autenticação

Gere um token em Configurações → API e MCP. Ele vale para a conta (empresa) em que foi criado: tudo o que a API devolve e muda fica dentro dessa conta. Envie em todas as chamadas, menos /api/v1/health. O valor aparece uma vez só; o Noz guarda apenas o hash.

export NOZ_TOKEN=noz_seu_token
curl https://hml.prismkg.com/api/v1/channels -H "Authorization: Bearer $NOZ_TOKEN"
1

URL base

https://hml.prismkg.com/api/v1

2

Formato

Corpo em JSON com Content-Type: application/json; a resposta também é JSON.

3

Auditoria

Toda escrita feita pela API entra na Auditoria da conta, com o nome do token.

Respostas e erros

Sucesso vem em data. Erro vem com message em português, pronto para o bot repetir a quem opera, e às vezes com detalhes (missing, invalid_channels, problems).

StatusQuando
200 / 201Deu certo (201 quando criou algo).
401Token ausente ou inválido.
403A ação exige um nível de acesso maior.
404Não existe nesta conta (de outra conta também dá 404).
422Dado inválido ou regra do negócio (número com formato errado, template com problema, PIN curto).
429Limite do grupo de envio esgotado em 24h.
502A Meta ou a Infobip recusaram; o motivo vem em message.
Envio iniciado pelo negócio (template, campanha, iniciar conversa) é barrado em número com qualidade vermelha e em conta suspensa. Responder conversa aberta continua liberado.

Guia: bot que vincula número numa BM

O gateway de números (onde o bot aluga o chip e lê o SMS) fica do lado do bot. O Noz cuida da Meta: cria o número na WABA, pede o código, confirma, registra com o PIN e já traz os layouts da conta.

  1. Escolher a WABAGET /wabas?health=good e use uma com has_credential: true. Para saber se a BM dela está boa, GET /bms/{id}.
  2. Alugar o número no gatewayDo lado do bot. Guarde o número sem o 55 (DDD + 8 ou 9 dígitos).
  3. Criar na WABAPOST /wabas/{waba}/numbers com phone e verified_name. A Meta manda o código por SMS. Guarde o channel_id.
  4. Ler o código no gateway e confirmarPOST /channels/{id}/verify-code. Com active: true, o número já está registrado. Sem SMS? POST /channels/{id}/request-code com "method":"VOICE".
  5. Se pedir PINpin_required: true → POST /channels/{id}/register com o PIN de 6 dígitos.
  6. Conferir e usarGET /channels/{id}/health deve dizer Operando. Faltou template? POST /templates/{id}/channels.
# 3) cria o número na WABA e pede o SMS
curl -X POST https://hml.prismkg.com/api/v1/wabas/104857600/numbers \
  -H "Authorization: Bearer $NOZ_TOKEN" -H "Content-Type: application/json" \
  -d '{"phone":"11988887777","verified_name":"Loja Atendimento"}'
# => {"data":{"channel_id":31,"code_requested":true,...}}

# 4) código lido no gateway
curl -X POST https://hml.prismkg.com/api/v1/channels/31/verify-code \
  -H "Authorization: Bearer $NOZ_TOKEN" -H "Content-Type: application/json" \
  -d '{"code":"123456"}'
# => {"data":{"active":true,"pin_required":false,...}}

Receber eventos

Cadastre um webhook por número (POST /channels/{id}/webhooks). Cada entrega traz X-Noz-Signature: sha256=<hex>, o HMAC-SHA256 do corpo cru com o seu secret. Responda 2xx rápido; outro status agenda nova tentativa.

EventoQuandodata
message.receivedMensagem recebida de um contatoconversation_id, contact, message
message.sentMensagem enviada (API, bot ou atendente)conversation_id, contact, message
message.ackEntregue, lida ou falhoumessage_id, ack, ack_label
template.statusA Meta aprovou ou rejeitou um template do númeroname, event, status, reason
session.statusO número conectou ou caiustatus, previous_status, phone
// Node.js
const expected = 'sha256=' + crypto.createHmac('sha256', process.env.NOZ_WEBHOOK_SECRET).update(rawBody).digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(req.header('X-Noz-Signature') || ''), Buffer.from(expected))) return res.sendStatus(401);

// PHP
$ok = hash_equals('sha256=' . hash_hmac('sha256', $raw, getenv('NOZ_WEBHOOK_SECRET')), $_SERVER['HTTP_X_NOZ_SIGNATURE'] ?? '');

Saúde e visão geral

O retrato da conta para um bot decidir o que fazer: números, BMs e WABAs boas ou ruins, e a lista do que precisa de ação, já ordenada do pior para o melhor. Os rótulos são os mesmos chips da tela (curtos e podem mudar); para automação use o code, que é estável.

GET /api/v1/overview novo

Visão geral da conta

Contagem de números (bons, atenção, ruins e por rótulo), BMs por situação, WABAs sem número ou sem credencial e a lista needs_action.

Requisição
curl "https://hml.prismkg.com/api/v1/overview" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"numbers":{"total":12,"good":9,"attention":2,"bad":1,"by_label":{"Operando":9,"Qualidade baixa":1}},
  "bms":{"total":4,"good":3,"attention":0,"bad":1},
  "wabas":{"total":5,"without_numbers":1,"without_credential":0,"with_recent_failure":0},
  "needs_action":[{"type":"number","id":7,"name":"Vendas 3","tone":"bad","label":"Qualidade baixa","code":"qualidade_red","next_action":"Parar 7 dias, só responder"}]}}
GET /api/v1/channels/{id}/health novo

Saúde de um número

O chip de saúde (rótulo, próxima ação, grupo), a cor da Meta, o tier, o can_send e o uso do limite de 24h (o da BM quando o número divide o teto).

ParâmetroDescrição
id*
integercaminho
Id do número (canal).
Requisição
curl "https://hml.prismkg.com/api/v1/channels/{id}/health" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"id":7,"phone":"5511988887777","quality":"RED","quality_label":"Vermelha","tier":"TIER_1K","can_send":"AVAILABLE",
  "health":{"good":false,"tone":"bad","label":"Qualidade baixa","code":"qualidade_red","next_action":"Parar 7 dias, só responder","group":"meta","limit_24h":1000,"sent_24h":312,"available":688}}}

WABAs e BMs

Contas do WhatsApp (WABA) e portfólios (BM) da conta, com os números de cada uma, situação, verificação do negócio, pagamento e envios. Use health=good|bad|attention para filtrar.

GET /api/v1/wabas novo

Listar WABAs

Cada WABA com a BM, se há credencial para criar números nela, layouts por status, última falha ao subir número e a saúde de cada número.

ParâmetroDescrição
health
stringquery
good, bad ou attention.
Requisição
curl "https://hml.prismkg.com/api/v1/wabas" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":"104857600","name":"Loja WhatsApp","bm":{"id":3,"meta_business_id":"88112233","name":"Loja","status":"em_uso"},
  "has_credential":true,"active_numbers":2,"numbers_count":2,"templates":{"approved":14,"rejected":1},
  "last_failure":null,"health":{"status":"good","label":"Todos os números operando"},"numbers":[{"id":7,"phone":"5511988887777","health":{"good":true,"label":"Operando"}}]}]}
GET /api/v1/wabas/{waba} novo

Ver uma WABA

ParâmetroDescrição
waba*
stringcaminho
Id da WABA na Meta.
Requisição
curl "https://hml.prismkg.com/api/v1/wabas/{waba}" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"id":"104857600","name":"Loja WhatsApp","bm":{"id":3,"meta_business_id":"88112233","name":"Loja","status":"em_uso"},
  "has_credential":true,"active_numbers":2,"numbers_count":2,"templates":{"approved":14,"pending":1},"last_failure":null,
  "health":{"status":"good","label":"Todos os números operando"},
  "numbers":[{"id":7,"name":"Vendas 1","phone":"5511988887777","status":"WORKING","quality":"GREEN","tier":"TIER_1K","can_send":"AVAILABLE",
    "health":{"good":true,"tone":"ok","label":"Operando","next_action":null,"limit_24h":1000,"sent_24h":120,"available":880}}]}}
GET /api/v1/bms novo

Listar BMs

Situação que vale agora (a do cadastro ou a pior dos números), motivo da queda, verificação, pagamento, faixa, WABAs, números e envios 24h/7d/30d.

ParâmetroDescrição
health
stringquery
good, bad ou attention.
group
stringquery
uso, problema, aguardando, sem_numero ou fora.
Requisição
curl "https://hml.prismkg.com/api/v1/bms" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":3,"name":"Loja","meta_business_id":"88112233","good":false,
  "situation":{"tone":"warn","label":"Pagamento","code":"pagamento","detail":"1 de 2: Vendas 1","group":"problema"},
  "status":"em_uso","tier":"2K","verification":"verificada","payment":"sem","fall":null,
  "wabas":[{"id":"104857600","name":"Loja WhatsApp","active_numbers":2,"has_credential":true}],
  "sends":{"last_24h":840,"last_7d":5120,"last_30d":20400,"delivered_30d":19870,"read_30d":12011,"failed_30d":96},"numbers":[]}]}
GET /api/v1/bms/{id} novo

Ver uma BM

Igual à lista, mais o consumo de 30 dias e o histórico do cadastro.

ParâmetroDescrição
id*
integercaminho
Id da BM no Noz.
Requisição
curl "https://hml.prismkg.com/api/v1/bms/{id}" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"id":3,"name":"Loja","meta_business_id":"88112233","good":true,
  "situation":{"tone":"ok","label":"Na Infobip","detail":null,"group":"uso"},"status":"em_uso","tier":"TIER_1K","verification":"verificada","payment":"ok",
  "fall":null,"wabas":[{"id":"104857600","name":"Loja WhatsApp","active_numbers":2,"has_credential":true}],
  "sends":{"last_24h":120,"last_7d":900,"last_30d":3500,"delivered_30d":3300,"read_30d":2100,"failed_30d":45},"numbers":[],
  "spend_30d":{"custo":312.5,"volume":3500,"dias":30},
  "history":[{"at":"2026-09-30 14:00:00","by":"Ana","action":"editou","field":"status","from":"aguardando","to":"em_uso"}]}}
POST /api/v1/bms/{id}/sync novo

Sincronizar BM com a Meta

Relê os números de cada WABA (traz os novos, aponta os que sumiram), a verificação, o pagamento e a saúde, e refaz a situação. Devolve a BM atualizada.

ParâmetroDescrição
id*
integercaminho
Id da BM.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/bms/{id}/sync" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"message":"Loja: 2 número(s) lido(s) na Meta, 2 podendo enviar. A BM está em uso.","created_numbers":[],"missing_numbers":[],"bm":{"id":3,"good":true}}}
POST /api/v1/bms/{id}/payment-check novo

Verificar pagamento da BM

Pergunta à Meta agora. Pagamento OK libera os números travados por pagamento sem esperar o cooldown.

ParâmetroDescrição
id*
integercaminho
Id da BM.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/bms/{id}/payment-check" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"message":"Pagamento OK na Meta; 2 número(s) liberado(s).","bm":{"id":3,"name":"Loja","good":true,"payment":"ok"}}}

Vincular número novo

O bot aluga o número no gateway dele, cria o número numa WABA da conta, lê o código que chegou por SMS ou ligação e confirma. O Noz registra na Cloud API com o PIN guardado (ou o padrão) e o número herda os layouts da conta.

POST /api/v1/wabas/{waba}/numbers novo

Criar número na WABA

Mesmo fluxo do "+ Número" da tela. Já pede o código (SMS por padrão). Número brasileiro é DDD + 8 ou 9 dígitos, sem o 55.

ParâmetroDescrição
waba*
stringcaminho
WABA da conta com credencial (has_credential = true em GET /wabas).
phone*
stringcorpo
Número sem o DDI, ex.: 11988887777.
verified_name*
stringcorpo
Nome de exibição (mín. 3 caracteres).
cc
stringcorpo
DDI, padrão 55.
method
stringcorpo
SMS (padrão), VOICE ou NONE (não pede o código agora).
same_group
booleancorpo
Entra no mesmo grupo de envio do número que emprestou a credencial.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/wabas/{waba}/numbers" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"phone":"11988887777","verified_name":"Loja Atendimento","method":"SMS"}'
Resposta · 200
{"data":{"message":"Número 5511988887777 criado na conta Loja WhatsApp. Herdou 14 layouts da conta. Código enviado por SMS para o número. ...","channel_id":31,"phone":"5511988887777","code_requested":true,"bm_id":3}}
POST /api/v1/channels/{id}/request-code novo

Pedir o código de novo

ParâmetroDescrição
id*
integercaminho
Id do número.
method
stringcorpo
SMS (padrão) ou VOICE.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/channels/{id}/request-code" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"method":"VOICE"}'
Resposta · 200
{"data":{"message":"A Meta vai ligar para o número com o código."}}
POST /api/v1/channels/{id}/verify-code novo

Confirmar o código

Confirma o código e já registra com o PIN. Se o PIN não passar, volta 200 com active = false e pin_required = true: chame /register.

ParâmetroDescrição
id*
integercaminho
Id do número.
code*
stringcorpo
Código de 6 dígitos (traço e espaço são ignorados).
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/channels/{id}/verify-code" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"code":"123456"}'
Resposta · 200
{"data":{"message":"Telefone verificado e número ativado na Cloud API.","active":true,"pin_required":false}}
POST /api/v1/channels/{id}/register novo

Registrar com o PIN

Registra na Cloud API com o PIN de 6 dígitos da verificação em duas etapas e guarda o PIN cifrado.

ParâmetroDescrição
id*
integercaminho
Id do número.
pin*
stringcorpo
6 dígitos.
set_pin
booleancorpo
Define este PIN antes de registrar.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/channels/{id}/register" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"pin":"246810"}'
Resposta · 200
{"data":{"message":"Número ativado na Cloud API.","active":true,"pin_required":false}}
GET /api/v1/channels/{id}/registration novo

Situação do registro na Meta

Em que etapa o número está (código verificado, status, nome em análise) e se já há PIN guardado.

ParâmetroDescrição
id*
integercaminho
Id do número.
Requisição
curl "https://hml.prismkg.com/api/v1/channels/{id}/registration" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"channel_id":31,"pending_activation":false,"pin_saved":true,
  "meta":{"status":"CONNECTED","code_verification":"VERIFIED","platform":"CLOUD_API","display":"+55 11 98888-7777","verified_name":"Loja Atendimento","name_status":"APPROVED","throughput":"STANDARD"}}}

Números

Os números (canais) da conta. A lista já traz a saúde de cada um.

GET /api/v1/channels

Listar números

ParâmetroDescrição
health
stringquery
good, bad ou attention.
Requisição
curl "https://hml.prismkg.com/api/v1/channels" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":7,"name":"Vendas 1","phone":"5511988887777","status":"WORKING","official":true,"connected":true,
  "phone_number_id":"123456789012345","waba_id":"104857600","quality":"GREEN","tier":"TIER_1K","can_send":"AVAILABLE",
  "daily_limit":null,"warmup_started_at":null,"campaign_daily_cap":500,"created_at":"2026-05-02 10:11:12",
  "health":{"good":true,"tone":"ok","label":"Operando","next_action":null,"limit_24h":1000,"sent_24h":120,"available":880}}]}
GET /api/v1/channels/{id}

Ver um número

ParâmetroDescrição
id*
integercaminho
Id do número.
Requisição
curl "https://hml.prismkg.com/api/v1/channels/{id}" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"id":7,"name":"Vendas 1","phone":"5511988887777","status":"WORKING","official":true,"connected":true,
  "quality":"GREEN","tier":"TIER_1K","can_send":"AVAILABLE","daily_limit":null,"campaign_daily_cap":500,
  "health":{"good":true,"tone":"ok","label":"Operando","next_action":null,"limit_24h":1000,"sent_24h":120,"available":880}}}
PATCH /api/v1/channels/{id}

Atualizar nome e limites

ParâmetroDescrição
name
stringcorpo
Nome interno (2 a 120).
daily_limit
integercorpo
Teto de envios automáticos em 24h (0/null = global).
campaign_daily_cap
integercorpo
Teto de campanha em 24h (0/null = pelo tier).
warmup_started_at
stringcorpo
Início da rampa de aquecimento (data; vazio = criação).
Requisição
curl -X PATCH "https://hml.prismkg.com/api/v1/channels/{id}" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"daily_limit":800}'
Resposta · 200
{"data":{"id":7,"name":"Vendas 1","phone":"5511988887777","status":"WORKING","official":true,"connected":true,
  "quality":"GREEN","tier":"TIER_1K","can_send":"AVAILABLE","daily_limit":800,"campaign_daily_cap":500,"warmup_started_at":null}}
DELETE /api/v1/channels/{id}

Remover número

ParâmetroDescrição
id*
integercaminho
Id do número.
Requisição
curl -X DELETE "https://hml.prismkg.com/api/v1/channels/{id}" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"id":7,"deleted":true}}
POST /api/v1/channels/{id}/sync novo

Sincronizar número

Relê na Meta (qualidade, tier, can_send) ou, na Infobip, os templates do sender. Devolve o número com a saúde nova.

ParâmetroDescrição
id*
integercaminho
Id do número.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/channels/{id}/sync" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"message":"Número sincronizado com a Meta.",
  "channel":{"id":7,"phone":"5511988887777","status":"WORKING","quality":"GREEN","tier":"TIER_1K","can_send":"AVAILABLE",
    "health":{"good":true,"tone":"ok","label":"Operando","next_action":null,"limit_24h":1000,"sent_24h":120,"available":880}}}}
POST /api/v1/channels/{id}/payment-check novo

Verificar pagamento do número

Confere na Meta o pagamento da BM do número; paid = true libera o envio travado por pagamento.

ParâmetroDescrição
id*
integercaminho
Id do número.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/channels/{id}/payment-check" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"message":"Pagamento da BM está OK.","paid":true}}
POST /api/v1/channels/official

Conectar número oficial com credenciais

Para quem já tem phone_number_id e token. Guarda os segredos cifrados e valida na hora.

ParâmetroDescrição
name*
stringcorpo
Nome interno.
phone_number_id*
stringcorpo
Id do número na Meta.
access_token*
stringcorpo
Token permanente.
waba_id
stringcorpo
Id da WABA.
app_secret
stringcorpo
Segredo do app (assinatura do webhook).
verify_token
stringcorpo
Token de verificação do webhook.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/channels/official" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Vendas oficial","phone_number_id":"123456789012345","waba_id":"098765432109876","access_token":"EAAG..."}'
Resposta · 201
{"data":{"id":31,"name":"Vendas oficial","phone":"5511988887777","status":"WORKING","official":true,"connected":true,"waba_id":"098765432109876"},
  "verification":{"ok":true,"status":"WORKING","display_phone_number":"+55 11 98888-7777","verified_name":"Loja","quality_rating":"GREEN"},
  "webhook":{"ok":true,"mensagem":"Webhook: app inscrito na WABA."}}
GET /api/v1/channels/{id}/official

Configuração oficial e webhook

ParâmetroDescrição
id*
integercaminho
Id do número.
Requisição
curl "https://hml.prismkg.com/api/v1/channels/{id}/official" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"id":31,"name":"Vendas oficial","status":"WORKING","phone":"5511988887777","phone_number_id":"123456789012345","waba_id":"098765432109876",
  "verify_token":"noz-a1b2c3d4e5","access_token_set":true,"app_secret_set":false,
  "webhook":{"url":"https://SEU_DOMINIO/webhooks/whatsapp","verify_token":"noz-a1b2c3d4e5","fields":["messages"]}}}
PATCH /api/v1/channels/{id}/official

Atualizar credenciais

Segredos em branco mantêm os atuais.

ParâmetroDescrição
id*
integercaminho
Id do número.
Requisição
curl -X PATCH "https://hml.prismkg.com/api/v1/channels/{id}/official" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"id":31,"name":"Vendas oficial","status":"WORKING","official":true,"connected":true},
  "verification":{"ok":true,"status":"WORKING","display_phone_number":"+55 11 98888-7777","verified_name":"Loja","quality_rating":"GREEN"}}
POST /api/v1/channels/{id}/verify

Testar a credencial

Credencial recusada também volta 200, com ok = false e o erro.

ParâmetroDescrição
id*
integercaminho
Id do número.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/channels/{id}/verify" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"ok":true,"status":"WORKING","display_phone_number":"+55 11 98888-7777","verified_name":"Loja","quality_rating":"GREEN"}}
GET /api/v1/channels/{id}/templates

Templates na WABA do número (direto da Meta)

Só os aprovados, lidos na hora.

ParâmetroDescrição
id*
integercaminho
Id do número.
Requisição
curl "https://hml.prismkg.com/api/v1/channels/{id}/templates" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"name":"boas_vindas","language":"pt_BR","category":"UTILITY","body":"Oi {{1}}! Seu pedido {{2}} foi confirmado.","params":2,
  "header":null,"buttons":[{"type":"url","text":"Acompanhar","url":"https://loja.com/p/{{1}}","example":"1234"}]}]}

Templates (layouts)

A biblioteca de templates da conta e o vínculo de cada um com os números. Vincular = submeter à Meta (ou Infobip) naquele número; o status de aprovação chega pelo webhook e por /sync.

GET /api/v1/templates

Listar templates

Com o status de aprovação em cada número.

Requisição
curl "https://hml.prismkg.com/api/v1/templates" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":10,"name":"Boas-vindas","meta_name":"boas_vindas","kind":"official","category":"utility","language":"pt_BR",
  "body":"Oi {{1}}! Seu pedido {{2}} foi confirmado.","header_type":null,"header_text":null,"has_media_header":false,"buttons":[],
  "var_map":{"1":{"field":"nome"},"2":{"field":"pedido"}},"channels":[{"channel_id":7,"status":"approved","rejection_reason":null}]}]}
POST /api/v1/templates

Criar template

ParâmetroDescrição
name*
stringcorpo
Nome na biblioteca.
body*
stringcorpo
Corpo com {{1}}, {{2}}…
category
stringcorpo
marketing (padrão), utility ou authentication.
language
stringcorpo
Padrão pt_BR.
meta_name
stringcorpo
Nome fixo na Meta (^[a-z0-9_]+$).
header_text
stringcorpo
Cabeçalho de texto.
footer_text
stringcorpo
Rodapé.
buttons
arraycorpo
Botões.
var_map
objectcorpo
Variável → coluna da audiência ({"1":{"field":"nome","default":"cliente"}}).
submit_channels
arraycorpo
Números para já vincular.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/templates" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Boas-vindas","category":"utility","body":"Oi {{1}}! Seu pedido {{2}} foi confirmado.","var_map":{"1":{"field":"nome"},"2":{"field":"pedido"}},"submit_channels":[7,8]}'
Resposta · 201
{"data":{"id":10,"meta_name":"boas_vindas","submitted":[{"channel_id":7,"ok":true,"error":null},{"channel_id":8,"ok":true,"error":null}]}}
GET /api/v1/templates/matrix novo

Matriz números × templates

Status da réplica em cada célula (null = não vinculado) e quantos números faltam por template.

ParâmetroDescrição
group_id
integerquery
Só os números de um grupo de envio.
Requisição
curl "https://hml.prismkg.com/api/v1/templates/matrix" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"templates":[{"id":10,"name":"Boas-vindas","missing_channels":1}],
  "channels":[{"id":7,"name":"Vendas 1","templates":{"10":"approved"}},{"id":8,"name":"Vendas 2","templates":{"10":null}}]}}
GET /api/v1/templates/{id} novo

Ver um template

Texto, botões, variáveis, problemas que a Meta recusaria (problems) e o status em cada número.

ParâmetroDescrição
id*
integercaminho
Id do template.
Requisição
curl "https://hml.prismkg.com/api/v1/templates/{id}" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"id":10,"name":"Boas-vindas","meta_name":"boas_vindas","origin":"noz","category":"utility","language":"pt_BR",
  "header_type":null,"header_text":null,"has_media_header":false,"body":"Oi {{1}}! Seu pedido {{2}} foi confirmado.","footer_text":null,"buttons":[],
  "var_map":{"1":{"field":"nome"},"2":{"field":"pedido"}},"auto_replicate":false,"problems":[],"channels_by_status":{"approved":1,"pending":1},
  "channels":[{"channel_id":7,"name":"Vendas 1","phone":"5511988887777","engine":"cloud","waba_id":"104857600","status":"approved",
    "rejection_reason":null,"meta_template_name":"boas_vindas","updated_at":"2026-10-01 09:00:00"}],
  "created_at":"2026-09-01 10:00:00","updated_at":"2026-10-01 09:00:00"}}
PATCH /api/v1/templates/{id} novo

Editar template

Parcial: mande só o que muda. Para levar o texto novo a quem já tem, chame /channels com "update": true.

ParâmetroDescrição
id*
integercaminho
Id do template.
name, body, category, language, header_type, header_text, footer_text, buttons, var_map, meta_name
mixedcorpo
Campos do template.
auto_replicate
booleancorpo
Replica sozinho para número novo da conta.
Requisição
curl -X PATCH "https://hml.prismkg.com/api/v1/templates/{id}" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"body":"Oi {{1}}, seu pedido {{2}} saiu para entrega.","auto_replicate":true}'
Resposta · 200
{"data":{"id":10,"name":"Boas-vindas","meta_name":"boas_vindas","category":"utility","language":"pt_BR",
  "body":"Oi {{1}}, seu pedido {{2}} saiu para entrega.","auto_replicate":true,"problems":[],"channels_by_status":{"approved":2},"channels":[]}}
DELETE /api/v1/templates/{id} novo

Remover template

Tira da biblioteca e apaga na Meta em cada WABA. Se a Meta recusar, nada sai e volta 502 com o motivo.

ParâmetroDescrição
id*
integercaminho
Id do template.
Requisição
curl -X DELETE "https://hml.prismkg.com/api/v1/templates/{id}" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"id":10,"deleted":true,"deleted_in_wabas":2,"left_in_wabas_without_access":0}}
POST /api/v1/templates/{id}/duplicate novo

Duplicar

ParâmetroDescrição
id*
integercaminho
Id do template.
quantity
integercorpo
Quantas cópias (padrão 1).
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/templates/{id}/duplicate" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"quantity":3}'
Resposta · 201
{"data":[{"id":11,"name":"Boas-vindas (cópia)","meta_name":"boas_vindas_copia"}]}
POST /api/v1/templates/{id}/channels novo

Vincular a números

Submete o template em cada número. Número de outra conta ou sem WABA volta 422 com invalid_channels.

ParâmetroDescrição
id*
integercaminho
Id do template.
channels*
arraycorpo
Ids dos números.
update
booleancorpo
Edita o que já está na Meta em vez de criar.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/templates/{id}/channels" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"channels":[7,8,9]}'
Resposta · 200
{"data":{"submitted":2,"failed":1,"results":[{"channel_id":7,"ok":true,"error":null},{"channel_id":9,"ok":false,"error":"..."}]}}
POST /api/v1/templates/{id}/replicate-missing novo

Completar os números que faltam

Se todos já têm, volta submitted = 0 e a mensagem "Todos os números já têm este template.".

ParâmetroDescrição
id*
integercaminho
Id do template.
group_id
integercorpo
Só os números de um grupo.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/templates/{id}/replicate-missing" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"submitted":2,"failed":0,"results":[{"channel_id":8,"ok":true,"error":null},{"channel_id":9,"ok":true,"error":null}]}}
POST /api/v1/templates/{id}/channels/{channelId}/reactivate novo

Reativar num número

Template DESATIVADO/pausado no número: sobe uma nova versão (_v2, _v3…) com o texto atual e o número passa a usá-la quando aprovar.

ParâmetroDescrição
id*
integercaminho
Id do template.
channelId*
integercaminho
Id do número.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/templates/{id}/channels/{channelId}/reactivate" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"nome":"boas_vindas_v2","message":"Nova versão \"boas_vindas_v2\" enviada para análise. Quando aprovar, este número passa a disparar por ela."}}
POST /api/v1/templates/{id}/sync

Sincronizar status de aprovação

ParâmetroDescrição
id*
integercaminho
Id do template.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/templates/{id}/sync" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"synced_channels":3}}
POST /api/v1/templates/{id}/submit

Submeter a todos os números oficiais

Sem "channels", usa todos os números Cloud com WABA.

ParâmetroDescrição
id*
integercaminho
Id do template.
channels
arraycorpo
Ids dos números.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/templates/{id}/submit" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"submitted":[{"channel_id":7,"ok":true,"error":null},{"channel_id":8,"ok":false,"error":"..."}]}}

Mensagens e conversas

Envio 1 a 1 (texto dentro da janela de 24h, template para iniciar conversa, mídia por URL) e leitura do Inbox. Envio iniciado pelo negócio respeita a trava de qualidade vermelha e de conta suspensa.

POST /api/v1/messages

Enviar mensagem

ParâmetroDescrição
to*
stringcorpo
Telefone com DDI (ou chat_id).
channel_id
integercorpo
Número que envia.
text
stringcorpo
Texto livre.
template
objectcorpo
{name, language?, params?, button_param?, header_url?}
media
objectcorpo
{type, url, filename?} + caption.
preview_text
stringcorpo
Texto renderizado só para o histórico.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/messages" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"to":"5511999999999","channel_id":7,"template":{"name":"boas_vindas","language":"pt_BR","params":["Ana","1234"]}}'
Resposta · 201
{"data":{"id":9001,"conversation_id":55,"to":"5511999999999@c.us","type":"template","text":"Oi Ana! Seu pedido 1234 foi confirmado.",
  "channel_id":7,"wa_message_id":"wamid.HBgMNTUxMTk5...","header":null}}
GET /api/v1/conversations

Listar conversas

As 100 mais recentes.

Requisição
curl "https://hml.prismkg.com/api/v1/conversations" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":55,"unread_count":2,"last_message_at":"2026-10-08 09:12:00","last_message_preview":"Obrigado!",
  "contact_name":"Ana","wa_id":"5511999999999@c.us","channel_name":"Vendas 1","channel_id":7}]}
GET /api/v1/conversations/{id}/messages

Mensagens da conversa

ParâmetroDescrição
id*
integercaminho
Id da conversa.
limit
integerquery
Até 200 (padrão 50).
before
integerquery
Mais antigas que este id.
Requisição
curl "https://hml.prismkg.com/api/v1/conversations/{id}/messages" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":9001,"direction":"out","type":"image","body":"Confira","media_src":"/api/v1/messages/9001/media","media_name":"promo.jpg",
  "ack":3,"error_code":null,"error":null,"created_at":"2026-10-08 09:10:00","time":"09:10"}]}
GET /api/v1/messages/{id}/media

Baixar mídia recebida

ParâmetroDescrição
id*
integercaminho
Id da mensagem.
Requisição
curl "https://hml.prismkg.com/api/v1/messages/{id}/media" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
HTTP 200 com o arquivo em binário (não é JSON)
Content-Type: image/jpeg   (o tipo da mídia)
Cache-Control: private, max-age=3600

Campanhas e relatórios

Disparo em massa por template aprovado, distribuído entre números. Limites da Meta (por BM), do grupo e de cada número valem sozinhos.

GET /api/v1/campaigns

Listar campanhas

Requisição
curl "https://hml.prismkg.com/api/v1/campaigns" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":12,"name":"Julho","status":"running","send_mode":"template","category":"marketing","template_id":10,"audience_id":8,
  "scheduled_at":null,"stats":{"queued":100,"sent":400,"delivered":380,"read":200,"failed":5,"total":1085}}]}
POST /api/v1/campaigns

Criar campanha

ParâmetroDescrição
name*
stringcorpo
Nome.
template_id
integercorpo
Template.
channels
arraycorpo
Ids ou {channel_id, weight, daily_cap}.
var_map
objectcorpo
Variável → coluna; "btn:0" = sufixo do botão de URL.
audience_id
integercorpo
Audiência existente.
start
booleancorpo
Já dispara (precisa de audiência).
scheduled_at
stringcorpo
Agendamento.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/campaigns" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Julho","template_id":10,"var_map":{"1":{"field":"nome"}},"channels":[{"channel_id":7,"weight":2},{"channel_id":8,"weight":1}]}'
Resposta · 201
{"data":{"id":12,"name":"Julho","status":"draft","send_mode":"template","category":"marketing","template_id":10,"audience_id":null,
  "scheduled_at":null},"warnings":[]}
GET /api/v1/campaigns/{id}

Ver campanha e progresso

ParâmetroDescrição
id*
integercaminho
Id da campanha.
Requisição
curl "https://hml.prismkg.com/api/v1/campaigns/{id}" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"id":12,"name":"Julho","status":"running","send_mode":"template","category":"marketing","template_id":10,"audience_id":8,
  "scheduled_at":null,"stats":{"queued":100,"sent":400,"delivered":380,"read":200,"failed":5,"total":1085}}}
POST /api/v1/campaigns/{id}/recipients

Adicionar destinatários

ParâmetroDescrição
id*
integercaminho
Id da campanha.
recipients*
arraycorpo
[{phone, vars?, button_param?}]
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/campaigns/{id}/recipients" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"recipients":[{"phone":"5511999999999","vars":{"nome":"Ana"}}]}'
Resposta · 201
{"data":{"added":1,"valid":1,"excluded_ignored":0,"audience_id":8}}
POST /api/v1/campaigns/{id}/start

Disparar

ParâmetroDescrição
id*
integercaminho
Id da campanha.
scheduled_at
stringcorpo
Agendar.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/campaigns/{id}/start" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"queued":250,"status":"running"}}
POST /api/v1/campaigns/{id}/pause

Pausar

ParâmetroDescrição
id*
integercaminho
Id da campanha.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/campaigns/{id}/pause" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"status":"paused"}}
POST /api/v1/campaigns/{id}/resend

Reenviar falhas

ParâmetroDescrição
id*
integercaminho
Id da campanha.
target_channel_id
integercorpo
Reenviar por outro número.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/campaigns/{id}/resend" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"requeued":5,"channel_switched":false,"retomou":true,"status":"running"}}
GET /api/v1/reports/campaigns

Relatório por campanha

ParâmetroDescrição
de, ate
datequery
Período (AAAA-MM-DD).
campanha, canal, grupo, template, audiencia, status, q
stringquery
Filtros da tela.
format
stringquery
csv baixa o arquivo.
Requisição
curl "https://hml.prismkg.com/api/v1/reports/campaigns" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":12,"campanha":"Julho","situacao":"running","categoria":"marketing","template":"Boas-vindas","criada_em":"2026-10-01 10:00:00",
  "total":1000,"fila":100,"enviados":880,"entregues":850,"lidos":400,"falhas":20,"ignorados":0,"canais":2,
  "primeiro_envio":"2026-10-01 10:05:00","ultimo_envio":"2026-10-02 18:00:00"}],
  "totals":{"campanhas":"1","total":"1000","enviados":"880","entregues":"850","lidos":"400","falhas":"20","fila":"100","ignorados":"0"},
  "filters":{"de":"2026-10-01"}}
GET /api/v1/reports/campaign-messages

Relatório mensagem a mensagem

ParâmetroDescrição
limit, offset
integerquery
Paginação (limit até 1000).
format
stringquery
csv traz o filtro inteiro.
Requisição
curl "https://hml.prismkg.com/api/v1/reports/campaign-messages" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":777,"campaign_id":12,"campanha":"Julho","template":"Boas-vindas","channel_id":7,"canal":"Vendas 1","canal_telefone":"5511988887777",
  "telefone":"5511999999999","variaveis":"{\"nome\":\"Ana\"}","status":"delivered","tentativas":1,"provider_message_id":"wamid.HBg...",
  "meta_error_code":null,"erro":null,"enviada_em":"2026-10-01 10:05:00","entregue_em":"2026-10-01 10:05:04","lida_em":null,"segundos_ate_entrega":4}],
  "meta":{"total":1000,"limit":100,"offset":0,"has_more":true},"filters":{}}

Grupos de envio

Um pool de números (ex.: "PicPay") com limite próprio em 24h. A integração escolhe o grupo em vez de número por número.

GET /api/v1/groups

Listar grupos

Limite, enviado em 24h, disponível agora e layouts em comum.

Requisição
curl "https://hml.prismkg.com/api/v1/groups" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":3,"name":"PicPay","color":"#3b82f6","numbers_count":3,"send_limit_24h":600,"sent_24h":150,"available_now":450,
  "templates":[{"id":10,"name":"Boas-vindas","language":"pt_BR"}]}]}
GET /api/v1/groups/{id}

Ver grupo e números

ParâmetroDescrição
id*
integercaminho
Id do grupo.
Requisição
curl "https://hml.prismkg.com/api/v1/groups/{id}" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"id":3,"name":"PicPay","color":"#3b82f6","numbers_count":3,"send_limit_24h":600,"sent_24h":150,"available_now":450,
  "templates":[{"id":10,"name":"Boas-vindas","language":"pt_BR"}],
  "numbers":[{"id":7,"name":"Vendas 1","phone":"5511988887777","engine":"cloud","status":"WORKING","health":"Operando","can_send":true,"available":180}]}}
GET /api/v1/groups/{id}/templates

Templates aprovados em todos os números

ParâmetroDescrição
id*
integercaminho
Id do grupo.
Requisição
curl "https://hml.prismkg.com/api/v1/groups/{id}/templates" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":10,"name":"Boas-vindas","meta_name":"boas_vindas","category":"utility","language":"pt_BR",
  "body":"Oi {{1}}! Seu pedido {{2}} foi confirmado.","variables":2,"header_type":null,"has_media_header":false,"buttons":[],
  "var_map":{"1":{"field":"nome"},"2":{"field":"pedido"}}}]}
POST /api/v1/groups/{id}/campaigns

Campanha pelo grupo

ParâmetroDescrição
id*
integercaminho
Id do grupo.
template_id*
integercorpo
Template.
recipients*
arraycorpo
Destinatários.
mode
stringcorpo
all (padrão) ou sequential.
start
booleancorpo
Padrão true.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/groups/{id}/campaigns" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Outubro","template_id":10,"mode":"all","var_map":{"1":{"field":"nome"}},"recipients":[{"phone":"5511999999999","vars":{"nome":"Ana"}}]}'
Resposta · 201
{"data":{"id":13,"name":"Outubro","status":"running","group_id":3,"template_id":10,"numbers":3,"mode":"all",
  "recipients":{"added":1,"valid":1,"excluded_ignored":0,"audience_id":9},"queued":1,"scheduled_at":null},"warnings":[]}
POST /api/v1/groups/{id}/messages

Mensagem pelo melhor número do grupo

ParâmetroDescrição
id*
integercaminho
Id do grupo.
to*
stringcorpo
Telefone.
template_id*
integercorpo
Template.
params
arraycorpo
Variáveis.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/groups/{id}/messages" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"to":"5511999999999","template_id":10,"params":["Ana"]}'
Resposta · 201
{"data":{"id":9002,"conversation_id":56,"to":"5511999999999@c.us","type":"template","text":"Oi Ana! ...",
  "channel_id":8,"wa_message_id":"wamid.HBgMNTUxMTk5...","header":null}}

Webhooks de saída

O Noz faz POST na sua URL a cada evento do número (mensagem recebida, ack, status). Cada entrega é assinada com HMAC-SHA256 (veja "Receber eventos").

GET /api/v1/channels/{id}/webhooks

Webhooks do número

ParâmetroDescrição
id*
integercaminho
Id do número.
Requisição
curl "https://hml.prismkg.com/api/v1/channels/{id}/webhooks" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":5,"channel_id":7,"url":"https://minha-plataforma.com/webhooks/noz","events":["message.received","message.ack"],
  "active":true,"last_success_at":"2026-10-07 22:00:00","last_error":null,"created_at":"2026-09-01 10:00:00"}]}
POST /api/v1/channels/{id}/webhooks

Cadastrar webhook

O secret volta uma única vez.

ParâmetroDescrição
id*
integercaminho
Id do número.
url*
stringcorpo
HTTPS da sua plataforma.
events*
arraycorpo
message.received, message.sent, message.ack, template.status, session.status.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/channels/{id}/webhooks" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://minha-plataforma.com/webhooks/noz","events":["message.received","message.ack"]}'
Resposta · 201
{"data":{"id":5,"channel_id":7,"url":"https://minha-plataforma.com/webhooks/noz","events":["message.received","message.ack"],
  "active":true,"last_success_at":null,"last_error":null,"created_at":"2026-10-08 10:00:00","secret":"whsec_..."}}
GET /api/v1/webhooks/{id}

Ver webhook

ParâmetroDescrição
id*
integercaminho
Id do webhook.
Requisição
curl "https://hml.prismkg.com/api/v1/webhooks/{id}" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"id":5,"channel_id":7,"url":"https://minha-plataforma.com/webhooks/noz","events":["message.received","message.ack"],
  "active":true,"last_success_at":"2026-10-07 22:00:00","last_error":null,"created_at":"2026-09-01 10:00:00"}}
PATCH /api/v1/webhooks/{id}

Atualizar webhook

ParâmetroDescrição
id*
integercaminho
Id do webhook.
url, events, active
mixedcorpo
O que muda.
Requisição
curl -X PATCH "https://hml.prismkg.com/api/v1/webhooks/{id}" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"active":false}'
Resposta · 200
{"data":{"id":5,"channel_id":7,"url":"https://minha-plataforma.com/webhooks/noz","events":["message.received","message.ack"],
  "active":false,"last_success_at":"2026-10-07 22:00:00","last_error":null,"created_at":"2026-09-01 10:00:00"}}
DELETE /api/v1/webhooks/{id}

Remover webhook

ParâmetroDescrição
id*
integercaminho
Id do webhook.
Requisição
curl -X DELETE "https://hml.prismkg.com/api/v1/webhooks/{id}" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"id":5,"deleted":true}}
GET /api/v1/webhooks/{id}/deliveries

Histórico de entregas

ParâmetroDescrição
id*
integercaminho
Id do webhook.
Requisição
curl "https://hml.prismkg.com/api/v1/webhooks/{id}/deliveries" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":321,"event":"message.received","status":"delivered","attempts":1,"next_attempt_at":null,"last_status_code":200,
  "last_error":null,"created_at":"2026-10-08 09:00:00","delivered_at":"2026-10-08 09:00:01"}]}
POST /api/v1/webhooks/{id}/test

Enviar um ping

ParâmetroDescrição
id*
integercaminho
Id do webhook.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/webhooks/{id}/test" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"queued":true}}

Contatos

Consentimento (opt-in/opt-out). Quem saiu não recebe campanha.

POST /api/v1/contacts/consent

Registrar opt-in ou opt-out

ParâmetroDescrição
to*
stringcorpo
Telefone (ou wa_id).
opt_out*
booleancorpo
true = saiu.
source
stringcorpo
Origem (padrão api).
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/contacts/consent" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"to":"5511999999999","opt_out":true,"source":"bot"}'
Resposta · 200
{"data":{"wa_id":"5511999999999@c.us","opted_out":true}}

Infobip

Para quem envia direto na Infobip e quer o retorno no Noz.

GET /api/v1/infobip/webhook

URL de notifyUrl da conta

Requisição
curl "https://hml.prismkg.com/api/v1/infobip/webhook" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"notify_url":"https://SEU_DOMINIO/webhooks/infobip/TOKEN_DA_CONTA","fixed_url":"https://SEU_DOMINIO/webhooks/infobip",
  "observacao":"Use notify_url em \"notifyUrl\" no envio ..."}}
GET /api/v1/infobip/events

Eventos recebidos da Infobip

ParâmetroDescrição
message_id
stringquery
Um ou vários, separados por vírgula.
kind, phone
stringquery
Filtros.
since_id, limit
integerquery
Paginação (limit até 1000).
Requisição
curl "https://hml.prismkg.com/api/v1/infobip/events" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":880,"channel_id":7,"kind":"delivery","message_id":"abc-123","phone":"5511999999999","summary":"Entregue",
  "status":"DELIVERED","error_code":0,"error":"NO_ERROR","created_at":"2026-10-08 09:00:00"}],"meta":{"count":1,"limit":200}}

Wiki

Páginas em Markdown da base de conhecimento, inclusive o que o bot de atendimento consulta.

GET /api/v1/wiki

Listar páginas

Sem o conteúdo; public_url é null nas páginas privadas.

Requisição
curl "https://hml.prismkg.com/api/v1/wiki" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":4,"title":"Política de trocas","slug":"politica-de-trocas","category_id":2,"visibility":"public","bot_knowledge":true,
  "excerpt":"Você tem 30 dias.","public_url":"https://SEU_DOMINIO/w/loja/politica-de-trocas","created_at":"2026-09-01 10:00:00","updated_at":"2026-10-01 10:00:00"}]}
GET /api/v1/wiki/categories

Listar categorias

Requisição
curl "https://hml.prismkg.com/api/v1/wiki/categories" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":[{"id":2,"name":"Atendimento","slug":"atendimento","position":1}]}
GET /api/v1/wiki/{id}

Ver página

ParâmetroDescrição
id*
integercaminho
Id da página.
Requisição
curl "https://hml.prismkg.com/api/v1/wiki/{id}" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"id":4,"title":"Política de trocas","slug":"politica-de-trocas","category_id":2,"visibility":"public","bot_knowledge":true,
  "excerpt":"Você tem 30 dias.","public_url":"https://SEU_DOMINIO/w/loja/politica-de-trocas","content":"## Trocas\n\nVocê tem **30 dias**.",
  "created_at":"2026-09-01 10:00:00","updated_at":"2026-10-01 10:00:00"}}
POST /api/v1/wiki

Criar página

ParâmetroDescrição
title*
stringcorpo
Título.
content
stringcorpo
Markdown.
category_id
integercorpo
Categoria.
visibility
stringcorpo
private (padrão) ou public.
bot_knowledge
booleancorpo
O bot usa como conhecimento.
Requisição
curl -X POST "https://hml.prismkg.com/api/v1/wiki" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title":"Política de trocas","content":"## Trocas\n\nVocê tem **30 dias**.","visibility":"public","bot_knowledge":true}'
Resposta · 201
{"data":{"id":4,"title":"Política de trocas","slug":"politica-de-trocas","category_id":null,"visibility":"public","bot_knowledge":true,
  "excerpt":"Você tem 30 dias.","public_url":"https://SEU_DOMINIO/w/loja/politica-de-trocas","content":"## Trocas\n\nVocê tem **30 dias**.",
  "created_at":"2026-10-08 10:00:00","updated_at":"2026-10-08 10:00:00"}}
PUT /api/v1/wiki/{id}

Atualizar página

ParâmetroDescrição
id*
integercaminho
Id da página.
Requisição
curl -X PUT "https://hml.prismkg.com/api/v1/wiki/{id}" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title":"Política de trocas e devoluções"}'
Resposta · 200
{"data":{"id":4,"title":"Política de trocas e devoluções","slug":"politica-de-trocas","visibility":"public","bot_knowledge":true,
  "content":"## Trocas\n\nVocê tem **30 dias**.","updated_at":"2026-10-08 11:00:00"}}
DELETE /api/v1/wiki/{id}

Remover página

ParâmetroDescrição
id*
integercaminho
Id da página.
Requisição
curl -X DELETE "https://hml.prismkg.com/api/v1/wiki/{id}" \
  -H "Authorization: Bearer $NOZ_TOKEN"
Resposta · 200
{"data":{"id":4,"deleted":true}}

Sistema

Saúde da API (sem token) e o servidor MCP para agentes de IA (Claude e outros clientes MCP), com o mesmo token.

GET /api/v1/health

API no ar

Público, sem token.

Requisição
curl "https://hml.prismkg.com/api/v1/health"
Resposta · 200
{"ok":true,"service":"noz","version":"v1"}
POST /api/mcp

Servidor MCP (JSON-RPC 2.0)

initialize, tools/list e tools/call. Configure o cliente MCP com a URL https://SEU_DOMINIO/api/mcp e o header Authorization.

Requisição
curl -X POST "https://hml.prismkg.com/api/mcp" \
  -H "Authorization: Bearer $NOZ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Resposta · 200
{"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"list_channels",
  "description":"Lista os canais/números de WhatsApp da conta (id, nome, telefone, status, motor).","inputSchema":{"type":"object","properties":{}}}]}}