Integração no seu sistema

Catálogo completo de endpoints

92 operações explicadas: finalidade, autenticação, campos, resposta, erros e referências oficiais.

Antes de usar as rotas operacionais, o proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A consulta de formato e dígitos não verifica identidade nem situação na Receita. Sem o cadastro, a API retorna 409 partner_registration_required. Depois, antes de criar clientes, instâncias ou sessões, configure, valide e salve seu endpoint global. Consulte get-partner-onboarding-status para conferir a liberação. Depois comece por cadastrar o cliente, criar a instância e obter connect_url e consultar a conexão. As rotas da página Connect e o monitoramento de disponibilidade são referências opcionais: a página oficial já executa a autorização.

Clientes

Cadastrar, pesquisar, corrigir, mesclar e inativar empresas do seu sistema.

POSTCadastrar ou atualizar cliente
upsert-partner-customer

Registra o cliente final do assinante usando external_customer_id como ligação com o CRM, ERP ou SaaS de origem. Se a chave ainda não existe nesse parceiro, cria um cadastro; se já existe, atualiza os dados fornecidos e preserva os opcionais omitidos. O cadastro do cliente não significa que um número de WhatsApp foi conectado: essa etapa vem pela criação da instância e pelo Embedded Signup.

Quando usar

Use na sincronização inicial de clientes ou quando o sistema de origem precisar atualizar nome, e-mail, telefone, conta externa e metadados sem gerar clientes duplicados.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Para criar um cliente novo: Webhook global habilitado, primário e com verificação GET salva. A HookCloud envia hub.mode=subscribe, hub.verify_token e hub.challenge=1234; seu servidor deve conferir o token e responder HTTP 200 com somente 1234 em texto puro. Testar sem salvar não libera cadastros. Ative também o POST na mesma URL para receber eventos.
  • Definir uma chave externa estável que não mude quando o nome ou e-mail do cliente mudar.
  • Para criar um cadastro novo, a cobrança precisa permitir novas operações; a implementação permite atualizar um cliente existente durante pendência de cobrança.

Autenticação e permissão

Partner API Key ativa com customers.write ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=upsert-partner-customer
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "external_customer_id": "cliente-001",
  "customer_name": "Nome do cliente"
}

O que preencher em cada campo

external_customer_idstring · Obrigatório

Chave do cliente no seu sistema, de 1 a 200 caracteres. É única dentro do parceiro; reutilizar a chave representa o mesmo cliente.

Exemplo: crm-cliente-001

customer_namestring · Obrigatório

Nome de 2 a 200 caracteres. O normalizador também reconhece name, prefira o campo canônico customer_name.

Exemplo: Comércio Exemplo

customer_emailstring ou null · Opcional

E-mail cadastral válido, até 320 caracteres. Omitir preserva o atual; null ou texto vazio limpa o valor. Não é o destinatário das mensagens WhatsApp.

Exemplo: cliente@example.com

customer_phonestring ou null · Opcional

Telefone cadastral de 6 a 40 caracteres, aceitando dígitos, +, parênteses, espaço, ponto e hífen. Esse campo não registra um número na Meta.

Exemplo: +55 21 99999-0000

external_account_idstring ou null · Opcional

Vínculo opcional a uma conta/empresa do sistema externo, até 200 caracteres. Pode ser limpo com null; account_id é alias aceito pelo normalizador.

Exemplo: conta-001

metadataobject JSON · Opcional

Dados adicionais definidos pelo seu sistema. Campo opcional: pode ser omitido e não altera o ambiente da API nem a cobrança. Ao enviar o objeto, ele substitui os metadados anteriores; ao omitir, preserva o existente. Arrays não são aceitos.

Exemplo: {"segmento":"varejo","origem":"crm"}

Como ler a resposta

HTTP 201 indica criação e HTTP 200 indica reaproveitamento. O corpo contém ok, reused, partner_id, partner_customer_id, external_customer_id, dados cadastrais, metadata, status, archived e warnings. Guarde partner_customer_id para chamadas com UUID; continue usando external_customer_id para reconciliar com o seu banco. reused não informa que existe conexão Meta.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 409 partner_webhook_verification_required: configure, valide e salve o webhook em Endpoints/update-partner-webhook-endpoint antes de tentar criar cliente, instância ou sessão. A validação avulsa não libera a operação. Consulte get-partner-onboarding-status.
  • 400 missing_customer_fields: faltou chave externa/nome ou o nome está fora do limite.
  • 400 invalid_customer_email/invalid_customer_phone: formato cadastral inválido.
  • 409 customer_data_erased/customer_already_merged: use o cadastro de destino ou siga o tratamento de dados; não recrie automaticamente sob a mesma chave.
  • Bloqueios de cobrança podem impedir a criação de um cliente novo.
  • 409 billing_sync_required: o período de cobrança ou trial confirmado expirou e precisa ser reconciliado. O proprietário deve abrir Assinatura no Portal e clicar em Atualizar para consultar a Stripe; se persistir, procurar o suporte. Não repita novas criações automaticamente. Isso não confirma recusa do cartão nem desconecta números já ativos.

Depois desta chamada

  • Criar o primeiro número com create-customer-instance.
  • Consultar get-partner-customer para conferir o cadastro e seus vínculos.

Regras desta operação

  • Não use o número de telefone como única chave do cliente se ele puder mudar.
  • Esta operação não reativa automaticamente um cadastro cancelado nem desfaz mesclagem.
  • Metadados enviados não são mesclados chave a chave; mande o objeto final desejado.
  • O estado autoritativo da configuração vem de get-partner-onboarding-status. URL presente ou token configurado, isoladamente, não confirmam GET validado. Atualizações de um cliente já existente não são tratadas como novo cadastro.
GETLista apenas clientes do parceiro autenticado.
list-partner-customers

Retorna uma visão paginada dos clientes pertencentes ao parceiro autenticado, incluindo resumos calculados a partir das instâncias. A lista serve para conciliar o cadastro externo com o Partner e identificar clientes cancelados, mesclados ou com dados eliminados quando esses filtros forem habilitados.

Quando usar

Use para montar uma lista no seu painel, procurar um cliente e executar reconciliações periódicas sem conhecer previamente o UUID interno.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Usar credencial do parceiro correto.
  • Percorrer as páginas até o total retornado, em vez de assumir que a primeira resposta contém todos os clientes.

Autenticação e permissão

Partner API Key ativa com customers.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=list-partner-customers&page=1&page_size=20
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

pageinteger · Opcional

Página de resultados, iniciando em 1; padrão 1 e máximo 1.000.000.

Exemplo: 1

page_sizeinteger · Opcional

Quantidade por página; padrão 50, mínimo 1 e máximo 200. Na última página pode haver menos itens.

Exemplo: 20

searchstring · Opcional

Pesquisa parcial em nome, e-mail, telefone e external_customer_id. É texto de busca, não expressão SQL.

Exemplo: Comércio

statusstring · Opcional

Filtra por igualdade no status cadastrado, por exemplo active. O handler não impõe um enum fechado para esse filtro; consulte os estados reais retornados pelo cadastro.

Exemplo: active

include_mergedboolean ou texto booleano · Opcional

Padrão false. true, 1, yes ou sim incluem cadastros mesclados; false mantém a lista focada nos cadastros não mesclados.

Exemplo: false

include_erasedboolean ou texto booleano · Opcional

Padrão false. Habilita a presença de registros com pii_erased; não restaura nem expõe dados pessoais que já foram eliminados.

Exemplo: false

Como ler a resposta

Retorna ok, items, page, page_size, total e pages. Os itens incluem os campos cadastrais selecionados, marcas de arquivamento/mesclagem/eliminação e resumo das instâncias. total é a contagem do filtro completo, não o tamanho de items. pages é no mínimo 1 mesmo quando a lista está vazia. Reaproveite o id do item em customer_id e o external_customer_id na sincronização.

Receba as próximas mudanças por webhook

Depois de consultar ou configurar esta operação, seu sistema pode receber os eventos abaixo. Abra para entender o POST recebido, cada campo e o que atualizar no seu cadastro.

Documentação dos payloads recebidos

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 invalid_pagination: page ou page_size não é inteiro no intervalo permitido.
  • Falhas de consulta retornam customer_operation_failed; não trate uma resposta de erro como lista vazia.
  • 413 customer_instance_expansion_too_large: a expansão de instâncias desta resposta ultrapassa 20.000 números. A resposta não fornece totais parciais. Reduza page_size na listagem de clientes e consulte os números por list-partner-instances, filtrando customer_id e usando page/page_size.

Depois desta chamada

  • Abrir get-partner-customer para o cadastro escolhido.
  • Usar get-partner-customer-history para trilha completa de alterações.

Regras desta operação

  • include_merged e include_erased só alteram visibilidade da lista.
  • Clientes criados enquanto a paginação é percorrida podem deslocar posições; deduplique por id na reconciliação.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
  • A expansão de instances é lida em páginas internas para não truncar no limite de uma consulta ao banco. O orçamento por resposta é de 20.000 instâncias; para grandes integrações, prefira list-partner-instances paginado. Leituras em páginas não representam um snapshot transacional: deduplique por id e reconcilie alterações concorrentes pelos eventos.
  • Uma importação deve guardar id + partner_id + external_customer_id, preservar archived/merged_into_customer_id/pii_erased e percorrer todas as páginas. Não recrie clientes por nome/telefone e não reative registros arquivados. A resposta desta lista não inclui partner_id na raiz: confira cada item. customers.write não concede customers.read implicitamente.
GETConsulta cliente e suas instâncias.
get-partner-customer

Carrega um cliente com o resumo de suas instâncias, os 50 registros de alteração mais recentes e o estado de risco Meta associado ao cadastro. É a consulta de detalhe que permite reunir o cadastro comercial e a situação operacional sem revelar o token Meta.

Quando usar

Use depois de localizar um cliente por chave externa ou antes de executar uma edição, mesclagem ou reconciliação de números.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Conhecer customer_id/partner_customer_id ou external_customer_id pertencente ao parceiro.

Autenticação e permissão

Partner API Key ativa com customers.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-partner-customer&external_customer_id=cliente-001
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

customer_idstring UUID · Obrigatório usar uma alternativa: customer_id, partner_customer_id ou external_customer_id.

Identificador interno do cadastro no Partner. Não é o código do seu CRM nem um número de telefone.

Exemplo: 11111111-1111-4111-8111-111111111111

partner_customer_idstring UUID · Alternativa a customer_id.

Alias do identificador interno; use um único seletor por chamada para deixar inequívoco qual cliente será consultado ou alterado.

Exemplo: 11111111-1111-4111-8111-111111111111

external_customer_idstring · Alternativa aos UUIDs internos.

Chave estável do cliente no sistema do assinante. A busca é sempre restrita ao parceiro autenticado.

Exemplo: crm-cliente-001

Como ler a resposta

O corpo contém ok, customer, history e meta_risk_state. customer traz o cadastro resumido e seus vínculos; history inclui action, changed_fields, before_data, after_data, reason, ator, metadata e data. meta_risk_state pode ser null. Guarde customer.id e customer.updated_at quando disponíveis; o timestamp pode ser usado como expected_updated_at na edição. customer_risk contém a política individual do cliente: ban_count_30d, red_count_30d, limits={ban:20,red:5}, window_days=30, block_new_connections, reasons, next_exit_at, next_unlock_at e a cobertura histórica. Os limites bloqueiam novas conexões desse cliente, mesmo com vagas no pacote, sem desligar números existentes. Atualize seu cache com hookcloud.customer.risk_updated e reconcilie pela Partner API.

Receba as próximas mudanças por webhook

Depois de consultar ou configurar esta operação, seu sistema pode receber os eventos abaixo. Abra para entender o POST recebido, cada campo e o que atualizar no seu cadastro.

Documentação dos payloads recebidos

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 para ausência de identificador utilizável.
  • 404 customer_not_found quando o cadastro não está disponível ao parceiro autenticado.
  • 413 customer_instance_expansion_too_large: a expansão de instâncias desta resposta ultrapassa 20.000 números. A resposta não fornece totais parciais. Reduza page_size na listagem de clientes e consulte os números por list-partner-instances, filtrando customer_id e usando page/page_size.

Depois desta chamada

  • Usar update-partner-customer com expected_updated_at para evitar sobrescrever edição concorrente.
  • Consultar get-partner-customer-history para páginas além dos 50 registros recentes.

Regras desta operação

  • before_data e after_data podem conter dados cadastrais: mantenha o resultado em telas/rotinas autorizadas.
  • A consulta não atualiza automaticamente os dados do número na Meta.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
  • A expansão de instances é lida em páginas internas para não truncar no limite de uma consulta ao banco. O orçamento por resposta é de 20.000 instâncias; para grandes integrações, prefira list-partner-instances paginado. Leituras em páginas não representam um snapshot transacional: deduplique por id e reconcilie alterações concorrentes pelos eventos.
GETConsulta histórico de alterações do cliente.
get-partner-customer-history

Lista o histórico de mudanças de um cliente em páginas, com os valores anteriores e posteriores registrados pelas operações auditadas. Diferentemente da consulta de detalhe, não limita a navegação aos 50 registros mais recentes.

Quando usar

Use em uma tela de auditoria, na investigação de mudança cadastral ou para explicar qual operação moveu/mesclou um cliente.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Identificar o cliente dentro do parceiro.
  • Ter finalidade de consulta aos dados de antes/depois, pois podem conter informações pessoais.

Autenticação e permissão

Partner API Key ativa com customers.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-partner-customer-history&external_customer_id=cliente-001&page=1&page_size=20
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

customer_idstring UUID · Obrigatório usar uma alternativa: customer_id, partner_customer_id ou external_customer_id.

Identificador interno do cadastro no Partner. Não é o código do seu CRM nem um número de telefone.

Exemplo: 11111111-1111-4111-8111-111111111111

partner_customer_idstring UUID · Alternativa a customer_id.

Alias do identificador interno; use um único seletor por chamada para deixar inequívoco qual cliente será consultado ou alterado.

Exemplo: 11111111-1111-4111-8111-111111111111

external_customer_idstring · Alternativa aos UUIDs internos.

Chave estável do cliente no sistema do assinante. A busca é sempre restrita ao parceiro autenticado.

Exemplo: crm-cliente-001

pageinteger · Opcional

Página de resultados, iniciando em 1; padrão 1 e máximo 1.000.000.

Exemplo: 1

page_sizeinteger · Opcional

Quantidade por página; padrão 50, mínimo 1 e máximo 200. Na última página pode haver menos itens.

Exemplo: 20

Como ler a resposta

Retorna ok, customer_id, items, total, page e page_size. Cada item contém id, action, changed_fields, before_data, after_data, reason, actor_user_id, actor_source, metadata e created_at. Para a página seguinte, incremente page mantendo os mesmos filtros; este endpoint não retorna pages.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 404 customer_not_found se o seletor não resolver um cadastro acessível.
  • 400 invalid_pagination para valores de paginação inválidos.

Depois desta chamada

  • Comparar changed_fields e reason com a alteração solicitada no seu sistema.
  • Consultar get-partner-customer para o estado atual.

Regras desta operação

  • O histórico explica alterações registradas; não é um mecanismo de desfazer operação.
  • Não copie dados de before_data para reverter automaticamente uma mesclagem ou eliminação.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
POSTAltera dados cadastrais; aceita changes ou campos planos; ID externo permanece imutável. Emite evento e histórico.
update-partner-customer

Edita apenas nome, e-mail e telefone de um cliente existente, com suporte a controle de concorrência e idempotência. A operação é adequada para formulários de edição: recebe o conjunto de mudanças, registra histórico e, quando houve alteração, emite o evento hookcloud.partner.customer.updated. A chave externa e os identificadores técnicos permanecem imutáveis.

Quando usar

Use quando um cadastro já existe e é necessário alterar dados pessoais de maneira explícita, preservando o vínculo com o sistema de origem.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Consultar o cliente antes de editar para obter seu identificador e updated_at.
  • Enviar ao menos um dos três campos editáveis; deixar campos fora de changes preserva os valores atuais.

Autenticação e permissão

Partner API Key ativa com customers.write ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=update-partner-customer
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json",
  "Idempotency-Key": "UUID_UNICO_PARA_ESTA_ALTERACAO"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "external_customer_id": "cliente-001",
  "changes": {
    "customer_name": "Cliente da integração atualizado"
  },
  "reason": "Teste de API"
}

O que preencher em cada campo

customer_idstring UUID · Obrigatório usar uma alternativa: customer_id, partner_customer_id ou external_customer_id.

Identificador interno do cadastro no Partner. Não é o código do seu CRM nem um número de telefone.

Exemplo: 11111111-1111-4111-8111-111111111111

partner_customer_idstring UUID · Alternativa a customer_id.

Alias do identificador interno; use um único seletor por chamada para deixar inequívoco qual cliente será consultado ou alterado.

Exemplo: 11111111-1111-4111-8111-111111111111

external_customer_idstring · Alternativa aos UUIDs internos.

Chave estável do cliente no sistema do assinante. A busca é sempre restrita ao parceiro autenticado.

Exemplo: crm-cliente-001

changesobject JSON · Obrigatório fornecer ao menos um campo editável, neste objeto ou em formato plano.

Agrupa customer_name, customer_email e customer_phone. O formato aninhado é preferível para separar identificadores das alterações.

Exemplo: {"customer_name":"Comércio Exemplo Atualizado"}

changes.customer_namestring · Opcional individualmente; ao menos um campo editável é necessário.

Novo nome de 2 a 200 caracteres. Não pode ser esvaziado.

Exemplo: Comércio Exemplo Atualizado

changes.customer_emailstring ou null · Opcional

Novo e-mail válido; null limpa o campo. O processamento cadastral limita o texto a 320 caracteres.

Exemplo: novo@example.com

changes.customer_phonestring ou null · Opcional

Novo telefone cadastral, formato de 6 a 40 caracteres; null limpa o valor.

Exemplo: +55 21 98888-0000

expected_updated_atstring data/hora ISO 8601 · Opcional

Valor atualizado retornado pela última leitura. Se outro processo alterou o cliente depois, a gravação é recusada com conflito.

Exemplo: 2026-09-11T10:00:00Z

reasonstring · Opcional

Justificativa humana para histórico/auditoria; nas operações estruturais e de edição o tratamento utiliza até 500 caracteres. Não coloque segredos nesse texto.

Exemplo: Correção cadastral solicitada pelo cliente

idempotency_keystring · Opcional

Identifica uma tentativa lógica de alteração, com 8 a 200 caracteres. Também pode ser enviado no cabeçalho Idempotency-Key, que tem precedência. Reutilize a mesma chave apenas ao repetir o mesmo corpo da mesma operação.

Exemplo: edicao-crm-cliente-001-v2

Como ler a resposta

Retorna ok e o resultado da transação, incluindo changed e changed_fields quando aplicáveis, o cadastro atualizado e immutable_fields com external_customer_id e instance_key. changed=false indica ausência de alteração efetiva. Releia o cliente após sucesso para continuar trabalhando com o updated_at atual.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 immutable_customer_fields: tentativa de editar status, metadata, external_customer_id ou identificadores proibidos.
  • 400 invalid_customer_name/invalid_customer_email/invalid_customer_phone: dados inválidos.
  • 409 customer_changed_since_last_read: recarregue os dados antes de reaplicar uma alteração intencional.
  • 409 customer_data_erased/customer_already_merged: o cadastro não permite essa edição.
  • 400 invalid_idempotency_key: a chave precisa ter 8 a 200 caracteres; reutilização incompatível é bloqueada pelo controle de idempotência.

Depois desta chamada

  • Atualizar o estado do formulário com o cadastro confirmado.
  • Consultar histórico para verificar os campos alterados.

Regras desta operação

  • metadata não é editável aqui; use o contrato de upsert quando precisar atualizar metadados.
  • Não mude expected_updated_at para um valor inventado para contornar um conflito.
  • Repetir com a mesma idempotency_key deve preservar exatamente a intenção e o corpo originais.
POSTRemover a foto opcional e voltar às iniciais do cliente.
remove-partner-customer-avatar

Retira a imagem associada ao cadastro do cliente. Nome, external_customer_id, instâncias, conexões, cobrança e histórico permanecem intactos.

Quando usar

Use quando o cliente solicitar remoção da foto ou quando a imagem não deve mais ser exibida.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Cliente existente e pertencente ao parceiro autenticado.
  • API Key com customers.write ou membro owner/admin/developer autorizado.

Autenticação e permissão

Partner API Key ativa com customers.write ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=remove-partner-customer-avatar
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "customer_id": "UUID_DO_CLIENTE"
}

O que preencher em cada campo

customer_idUUID · Obrigatório

UUID do cadastro retornado pela Partner API. Não é o external_customer_id nem o ID do número na Meta.

Exemplo: UUID_DO_CLIENTE

Como ler a resposta

Após a confirmação, avatar_url fica vazio/nulo e o Portal volta a mostrar as iniciais. Uma URL assinada emitida anteriormente pode ter duração residual até o vencimento; não a trate como endereço permanente.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 403/404: verifique escopo, função e vínculo do cliente.
  • Em erro de rede, consulte o cadastro antes de repetir.

Depois desta chamada

  • Limpe o avatar do cache do seu sistema e use as iniciais do cliente.

Regras desta operação

  • Não exclui o cliente nem o número de WhatsApp.
  • Não use essa operação para modificar a foto comercial mantida pela Meta.
POSTAdicionar ou substituir a foto opcional de um cliente.
upload-partner-customer-avatar

Salva uma foto opcional para identificar o cliente na lista do Portal e no agrupamento de instâncias. É uma foto cadastral privada na HookCloud, independente da imagem do perfil comercial do WhatsApp.

Quando usar

Use após cadastrar o cliente ou quando ele solicitar uma troca de foto. O cadastro funciona normalmente sem imagem.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Cliente existente e pertencente ao parceiro autenticado.
  • API Key com customers.write ou membro owner/admin/developer autorizado.

Autenticação e permissão

Partner API Key ativa com customers.write ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=upload-partner-customer-avatar
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}
Body de arquivo

Envie multipart/form-data com customer_id (UUID do cliente) e file (arquivo binário JPG, PNG ou WebP estático, até 2 MiB, 4096 pixels por lado e 16 megapixels). Imagens animadas não são aceitas. Não envie JSON, URL pública, base64, messaging_product ou token Meta. Deixe sua biblioteca HTTP criar o Content-Type multipart e seu boundary.

O que preencher em cada campo

customer_idUUID · Obrigatório

UUID do cadastro retornado pela Partner API. Não é o external_customer_id nem o ID do número na Meta.

Exemplo: UUID_DO_CLIENTE

filearquivo binário multipart · Obrigatório

JPEG, PNG ou WebP estático de até 2 MiB (2.097.152 bytes), até 4096 pixels por lado e no máximo 16.000.000 pixels no total. Os limites são simultâneos. O servidor verifica o conteúdo binário: declarar outro MIME não converte o arquivo. SVG, animações e arquivos vazios são recusados.

Exemplo: foto-cliente.png

partner_idUUID · Somente contexto administrativo autorizado

O parceiro é derivado da autenticação normal. A administração pode informar o parceiro selecionado; uma API Key não ganha acesso a outro parceiro ao preencher este campo.

Exemplo: UUID_DO_PARCEIRO

Como ler a resposta

O retorno e as consultas de cliente fornecem avatar_url, avatar_url_expires_at e avatar_updated_at. A URL é assinada e temporária, com duração aproximada de cinco minutos; para renová-la consulte novamente o cliente. Não armazene a URL como identificador permanente nem compartilhe o link publicamente.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400: confira customer_id e o arquivo enviado.
  • 403/404: confira função, escopo e vínculo do cliente; não tente contornar alterando partner_id.
  • Arquivo vazio, maior que 2 MiB, animado, acima de 4096 pixels por lado/16 megapixels ou com formato binário incompatível: escolha uma imagem estática dentro dos limites.

Depois desta chamada

  • Atualize o avatar exibido com o retorno; em falha de carregamento, mostre as iniciais.
  • Se o cadastro já foi salvo e só a foto falhou, repita somente o envio da foto para o mesmo customer_id. Não recrie o cliente nem a instância.

Regras desta operação

  • Não configurar Content-Type multipart manualmente sem boundary; a biblioteca HTTP o cria.
  • O arquivo não é enviado à Meta. A foto não ocupa vaga de número nem muda a saúde ou o nome aprovado.
POSTTransfere instâncias do cliente de origem ao destino e arquiva origem como mesclada. Operação estrutural.
merge-partner-customers

Consolida dois cadastros duplicados do mesmo parceiro. A origem perde o papel de cadastro operacional principal, suas instâncias são vinculadas ao destino e o registro de origem é marcado como mesclado. A operação preserva as instance_keys e não transforma o ID externo da origem no ID externo do destino; o sistema externo deve registrar essa equivalência.

Quando usar

Use quando dois registros do seu CRM passaram a representar a mesma empresa e a consolidação foi decidida pelo responsável pelo cadastro.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Origem e destino distintos, ambos do mesmo parceiro.
  • Destino ativo e apto a receber instâncias; cadastros já mesclados ou com dados eliminados exigem tratamento específico.
  • Conferir a lista de instâncias antes da operação.

Autenticação e permissão

Partner API Key ativa com customers.write ou *. Se optar por JWT, as funções permitidas são owner, admin.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=merge-partner-customers
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json",
  "Idempotency-Key": "UUID_UNICO_PARA_ESTA_ALTERACAO"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "source_customer_id": "SOURCE_CUSTOMER_ID",
  "target_customer_id": "TARGET_CUSTOMER_ID",
  "reason": "Teste de mesclagem"
}

O que preencher em cada campo

source_customer_idstring UUID · Obrigatório

Cliente duplicado que deixará de ser o cadastro operacional. Todas as instâncias desse cadastro fazem parte da consolidação.

Exemplo: 11111111-1111-4111-8111-111111111111

target_customer_idstring UUID · Obrigatório

Cliente que permanecerá como destino operacional. Deve ser diferente da origem.

Exemplo: 22222222-2222-4222-8222-222222222222

reasonstring · Opcional

Justificativa humana para histórico/auditoria; nas operações estruturais e de edição o tratamento utiliza até 500 caracteres. Não coloque segredos nesse texto.

Exemplo: Correção cadastral solicitada pelo cliente

idempotency_keystring · Opcional

Identifica uma tentativa lógica de alteração, com 8 a 200 caracteres. Também pode ser enviado no cabeçalho Idempotency-Key, que tem precedência. Reutilize a mesma chave apenas ao repetir o mesmo corpo da mesma operação.

Exemplo: edicao-crm-cliente-001-v2

Como ler a resposta

Retorna ok, source_customer_id, target_customer_id, moved_instance_ids (array dos UUIDs movidos), moved_instances (quantidade), source_external_customer_id e target_external_customer_id, além de external_customer_id_immutable=true e instance_keys_unchanged=true. Reaproveite target_customer_id como referência operacional no sistema externo. Confirme a associação final consultando get-partner-customer do destino e, se necessário, inclua cadastros mesclados na listagem para localizar a origem.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 invalid_merge_payload: IDs ausentes ou fora do formato UUID.
  • 400 merge_same_customer: origem e destino iguais.
  • 404 source_customer_not_found/target_customer_not_found: um cadastro não pertence ao contexto acessível.
  • 409 source_customer_already_merged/target_customer_already_merged/target_customer_inactive/customer_data_erased: estado incompatível.

Depois desta chamada

  • Atualizar no CRM a referência ao cliente de destino.
  • Listar instâncias do destino e verificar histórico/evento hookcloud.partner.customer.merged.

Regras desta operação

  • Não existe operação pública para desfazer mesclagem; trate como decisão estrutural.
  • Não use mesclagem apenas para mover um único número: existe uma operação específica para isso.
POSTEncerra o cliente em etapas duráveis: números, autorizações e parcerias comerciais elegíveis.
deactivate-partner-customer

Inicia ou continua uma solicitação durável de encerramento para esse cliente, com lotes limitados e progresso consultável. Primeiro desliga as instâncias e autorizações pertencentes ao cliente, agrupando os números que compartilham WABA ou autorização quando o alcance seguro é comprovado. Depois avalia as relações empresariais HookCloud–portfólio do cliente. A retirada comercial só ocorre com inventário completo, exclusividade e confirmação independente; relações usadas por outros clientes, parceiros, produtos ou ativos são preservadas.

Quando usar

Chame após o seu sistema confirmar o cancelamento ou término definitivo da assinatura do cliente. Cancelamento agendado para o fim do período, atraso temporário ou falha isolada de cobrança não são, por si só, ordem de encerramento definitivo.

Referência oficial Meta: Números, registro e permissões · Webhooks da Cloud API · Meta: relação empresarial entre provedor e cliente

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Revisar todas as instâncias do cliente antes de confirmar.
  • Garantir que o encerramento desse cliente, e não apenas de um número, foi a ação pretendida.

Autenticação e permissão

Partner API Key ativa com customers.write ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=deactivate-partner-customer
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "external_customer_id": "cliente-001",
  "reason": "Encerramento de teste"
}

O que preencher em cada campo

customer_idstring UUID · Obrigatório usar uma alternativa: customer_id, partner_customer_id ou external_customer_id.

Identificador interno do cadastro no Partner. Não é o código do seu CRM nem um número de telefone.

Exemplo: 11111111-1111-4111-8111-111111111111

partner_customer_idstring UUID · Alternativa a customer_id.

Alias do identificador interno; use um único seletor por chamada para deixar inequívoco qual cliente será consultado ou alterado.

Exemplo: 11111111-1111-4111-8111-111111111111

external_customer_idstring · Alternativa aos UUIDs internos.

Chave estável do cliente no sistema do assinante. A busca é sempre restrita ao parceiro autenticado.

Exemplo: crm-cliente-001

reasonstring · Opcional

Motivo do encerramento, usado no arquivamento e auditoria. Se omitido, o backend utiliza a justificativa padrão de cancelamento pelo parceiro.

Exemplo: Encerramento do contrato do cliente

Como ler a resposta

POST retorna HTTP 202 com status=cancel_pending, archived=false enquanto houver processamento, confirmação ou ação necessária. HTTP 200 com status=canceled, archived=true indica conclusão do job. O envelope contém ok, partner_id, partner_customer_id, external_customer_id e offboarding; o POST também pode informar used_slots e slot_limit. offboarding traz job_id, generation, status, phase, technical, commercial, technical_complete, commercial_complete, all_relationships_removed e issues[]. Uma parceria compartilhada aparece em commercial.preserved_shared e não em commercial.removed. Consulte GET get-customer-offboarding para acompanhar o registro local; esse GET não consulta a Meta nem executa remoções. O POST repetido para o mesmo cliente retoma a mesma solicitação, respeitando as intenções já gravadas: uma escrita ambígua não é repetida. A vaga de cada número só é liberada após sua confirmação técnica; o cadastro do cliente só é arquivado quando a fase comercial também tem resultado terminal.

Campos retornados que atualizam o painel

status / archivedstring / boolean

Estado do cadastro: cancel_pending/false enquanto houver etapa pendente; canceled/true apenas quando todo o encerramento terminou. Uma parceria preservada por compartilhamento é resultado terminal válido, sem afirmar sua remoção.

offboarding.job_id / generationUUID

Identificam a solicitação durável e sua versão. Guarde job_id. O POST repetido para esse cliente continua a mesma solicitação; não crie outro cliente ou envie IDs Meta para forçar a operação.

offboarding.status / phasestring

status: requested, processing, pending, action_required ou completed. phase: technical (desligar números e autorizações), commercial (conferir/retirar relações empresariais) ou completed. HTTP 202 é recebimento/processamento, não confirmação de retirada.

offboarding.technicalobject

total conta instâncias do cliente; confirmed, pending e action_required separam as que já concluíram, aguardam confirmação ou precisam de uma ação. Os grupos internos de WABA/autorização não são uma contagem adicional de números.

offboarding.commercialobject

total conta relações entre o portfólio HookCloud e os portfólios identificados do cliente. removed tem ausência confirmada na Meta; preserved_shared foi preservada por outra dependência; not_applicable não exige retirada; pending e action_required ainda não são conclusão.

offboarding.technical_complete / commercial_complete / all_relationships_removedboolean

Os dois primeiros indicam conclusão de cada fase. all_relationships_removed só é true se todas as relações identificadas tiverem ausência confirmada. Pode ser false em um encerramento completed quando alguma parceria foi corretamente preservada.

offboarding.issues[]array

Explicações legíveis das pendências ou preservações: code identifica o motivo estável, message explica a situação, scope indica technical/commercial/customer. operation_id, instance_id ou client_business_id, quando presentes, referem-se apenas a este encerramento. Não contém tokens nem dados de outros clientes.

Erros e como agir

  • 404 customer_not_found: o cadastro não pertence ao parceiro autenticado ou não existe.
  • 409 customer_offboarding_connection_inflight: uma conexão desse cliente ainda está em conclusão; confira seu resultado antes de iniciar o encerramento.
  • 409 customer_offboarding_scope_limit: o escopo ultrapassou o orçamento de segurança desta execução; solicite orientação da HookCloud, sem dividir clientes ou omitir números para contornar a proteção.
  • offboarding.issues[].code=customer_cleanup_scope_limit: um grupo de números que compartilha WABA ou autorização não pôde concluir a conferência inicial dentro de 40 leituras na Meta ou 45 segundos. O job fica action_required e não repete esse trabalho automaticamente. A HookCloud precisa avaliar uma forma segura de organizar o encerramento; não tente contornar a proteção criando novos clientes ou desconectando uma autorização compartilhada por conta própria.
  • 409 customer_offboarding_not_configured: falta configuração administrativa necessária para criar a solicitação; a HookCloud precisa concluir essa configuração.
  • Um resultado pending ou action_required dentro do job não deve ser tratado como encerramento concluído. Leia issues[].message e acompanhe pelo GET local.

Depois desta chamada

  • Guardar offboarding.job_id e consultar get-customer-offboarding usando o mesmo cliente.
  • Atualizar seu painel pelos estados e explicações do job. Os eventos por instância continuam úteis, mas não significam que a parceria comercial inteira foi retirada.
  • Consultar as vagas efetivamente liberadas antes de reduzir o pacote.
  • Em action_required, seguir a orientação explícita recebida; não remover manualmente aplicativos ou parceria empresarial ampla para tentar acelerar.

Regras desta operação

  • POST, PATCH e DELETE usam corpo JSON e fazem encerramento lógico; não apagam o histórico nem excluem contas Meta.
  • Não envie WABA, business_id, tokens, manifestos, flags de exclusividade ou permissões no body. A HookCloud deriva o alcance a partir do cliente autenticado e confirma as dependências.
  • A relação comercial tem alcance de portfólio, não de telefone. Uma outra conexão do mesmo parceiro, de outro parceiro ou de outro produto HookCloud pode exigir sua preservação. Histórico comprovadamente desligado não conta como dependência ativa.
  • Nenhuma varredura automática encerra clientes antigos apenas porque já estavam canceled. Esta operação nasce da solicitação explícita atual.
  • Durante o encerramento, novas conexões, movimentações, mesclagem e reativação que alterariam seu alcance são bloqueadas. Reativar o cadastro após conclusão não reconecta os números automaticamente.
  • Sua plataforma deve verificar e autenticar o evento de cobrança do seu cliente e então chamar esta API. A Stripe da HookCloud administra o contrato do parceiro com a HookCloud; não conhece automaticamente a assinatura do seu cliente final.
GETConsulta o progresso e as pendências do encerramento do cliente.
get-customer-offboarding

Lê a solicitação de encerramento já registrada pela HookCloud, com progresso técnico, situação das parcerias e explicações legíveis. Use esse resultado para acompanhar o ex-cliente no seu painel sem consultar a Meta diretamente.

Quando usar

Depois de solicitar deactivate-partner-customer, enquanto houver processamento ou para conferir o resultado final.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • Conhecer o customer_id ou external_customer_id do cliente no parceiro autenticado.
  • Ter solicitado o encerramento por deactivate-partner-customer.

Autenticação e permissão

Partner API Key ativa com customers.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-customer-offboarding&external_customer_id=cliente-001
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

customer_idstring UUID · Obrigatório usar uma alternativa: customer_id, partner_customer_id ou external_customer_id.

Identificador interno do cadastro no Partner. Não é o código do seu CRM nem um número de telefone.

Exemplo: 11111111-1111-4111-8111-111111111111

partner_customer_idstring UUID · Alternativa a customer_id.

Alias do identificador interno; use um único seletor por chamada para deixar inequívoco qual cliente será consultado ou alterado.

Exemplo: 11111111-1111-4111-8111-111111111111

external_customer_idstring · Alternativa aos UUIDs internos.

Chave estável do cliente no sistema do assinante. A busca é sempre restrita ao parceiro autenticado.

Exemplo: crm-cliente-001

job_idstring UUID · Opcional

Solicitação retornada no POST. Use junto do seletor do mesmo cliente para consultar uma execução específica; não permite acessar outro parceiro.

Exemplo: 55555555-5555-4555-8555-555555555555

Como ler a resposta

Retorna HTTP 200 com ok, partner_id, partner_customer_id, external_customer_id, status, archived e offboarding. status é o estado do cliente; offboarding.status é o estado do processamento. O resumo e os campos têm o mesmo significado do POST. A consulta não inicia nem retoma escritas remotas. Ausência de job não significa que os números foram desligados.

Campos retornados que atualizam o painel

status / archivedstring / boolean

Estado do cadastro: cancel_pending/false enquanto houver etapa pendente; canceled/true apenas quando todo o encerramento terminou. Uma parceria preservada por compartilhamento é resultado terminal válido, sem afirmar sua remoção.

offboarding.job_id / generationUUID

Identificam a solicitação durável e sua versão. Guarde job_id. O POST repetido para esse cliente continua a mesma solicitação; não crie outro cliente ou envie IDs Meta para forçar a operação.

offboarding.status / phasestring

status: requested, processing, pending, action_required ou completed. phase: technical (desligar números e autorizações), commercial (conferir/retirar relações empresariais) ou completed. HTTP 202 é recebimento/processamento, não confirmação de retirada.

offboarding.technicalobject

total conta instâncias do cliente; confirmed, pending e action_required separam as que já concluíram, aguardam confirmação ou precisam de uma ação. Os grupos internos de WABA/autorização não são uma contagem adicional de números.

offboarding.commercialobject

total conta relações entre o portfólio HookCloud e os portfólios identificados do cliente. removed tem ausência confirmada na Meta; preserved_shared foi preservada por outra dependência; not_applicable não exige retirada; pending e action_required ainda não são conclusão.

offboarding.technical_complete / commercial_complete / all_relationships_removedboolean

Os dois primeiros indicam conclusão de cada fase. all_relationships_removed só é true se todas as relações identificadas tiverem ausência confirmada. Pode ser false em um encerramento completed quando alguma parceria foi corretamente preservada.

offboarding.issues[]array

Explicações legíveis das pendências ou preservações: code identifica o motivo estável, message explica a situação, scope indica technical/commercial/customer. operation_id, instance_id ou client_business_id, quando presentes, referem-se apenas a este encerramento. Não contém tokens nem dados de outros clientes.

Erros e como agir

  • 404 customer_not_found: cliente não encontrado no parceiro.
  • 404 customer_offboarding_not_found: não há solicitação correspondente para esse cliente.

Depois desta chamada

  • Se completed, apresentar o encerramento concluído e distinguir relações removidas das preservadas por compartilhamento.
  • Se pending, acompanhar o processamento sem disparar várias solicitações concorrentes.
  • Se action_required, mostrar issues[].message e seguir a orientação antes de continuar; não inferir sucesso pelo tempo decorrido. Em customer_cleanup_scope_limit, a HookCloud precisa avaliar o grupo: o GET não reinicia a conferência e não há repetição automática desse grupo.

Regras desta operação

  • O GET usa somente dados locais e pode ser armazenado em cache por alguns segundos.
  • Não confunda commercial.preserved_shared com erro: uma relação corretamente preservada pode ser resultado final do encerramento.
  • Não use all_relationships_removed para decidir se a vaga de um número está livre; confira a conclusão técnica e os dados de capacidade.
POSTReativa cadastro permitido; não reconecta automaticamente credencial Meta removida.
reactivate-partner-customer

Reabre um cadastro cancelado elegível, removendo o arquivamento e definindo status=active. A operação atua no cliente comercial; não recupera tokens revogados, não reinscreve callbacks e não executa um novo Embedded Signup.

Quando usar

Use quando uma empresa retoma o atendimento após um cancelamento que já foi concluído.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • O cadastro não pode estar mesclado nem com dados pessoais eliminados.
  • Se estiver cancel_pending, concluir a desconexão pendente antes de reativar.

Autenticação e permissão

Partner API Key ativa com customers.write ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=reactivate-partner-customer
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "external_customer_id": "cliente-001",
  "reason": "Retomar teste"
}

O que preencher em cada campo

customer_idstring UUID · Obrigatório usar uma alternativa: customer_id, partner_customer_id ou external_customer_id.

Identificador interno do cadastro no Partner. Não é o código do seu CRM nem um número de telefone.

Exemplo: 11111111-1111-4111-8111-111111111111

partner_customer_idstring UUID · Alternativa a customer_id.

Alias do identificador interno; use um único seletor por chamada para deixar inequívoco qual cliente será consultado ou alterado.

Exemplo: 11111111-1111-4111-8111-111111111111

external_customer_idstring · Alternativa aos UUIDs internos.

Chave estável do cliente no sistema do assinante. A busca é sempre restrita ao parceiro autenticado.

Exemplo: crm-cliente-001

reasonstring · Opcional

Motivo de retomada, registrado nos campos de reativação e na auditoria.

Exemplo: Cliente retomou o contrato

Como ler a resposta

Retorna ok, partner_id, partner_customer_id, external_customer_id, status=active e archived=false. Esses campos confirmam a reabertura cadastral, não a conexão de WhatsApp. Use get-partner-customer para escolher quais instâncias precisam de nova conexão.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 404 customer_not_found: cliente não acessível.
  • 409 customer_unavailable: mesclado ou com dados eliminados.
  • 409 customer_deactivation_pending: desligamento anterior ainda precisa ser concluído.

Depois desta chamada

  • Consultar o cliente e listar as instâncias.
  • Gerar uma sessão adequada com create-connect-session ou criar uma nova instância, conforme o estado encontrado.

Regras desta operação

  • status=active do cliente e status=connected da instância são estados diferentes.
  • Não restaure credencial Meta antiga a partir de logs para evitar o fluxo de reconexão.

Números e conexão

Criar um número, abrir a Meta, reconectar e consultar a saúde ou o histórico.

POSTCriar número e gerar link de conexão
create-customer-instance

Cria uma instância para um número do cliente. A HookCloud gera uma instance_key imutável; não preencha esse campo. O nome inicial serve até a Meta aprovar o nome de exibição. Depois, instance_name acompanha automaticamente o nome aprovado da Meta.

Quando usar

Use após upsert-partner-customer, quando quiser acrescentar um número a um cliente existente ou reaproveitar explicitamente a mesma instância.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Webhook global habilitado, primário e com verificação GET salva. A HookCloud envia hub.mode=subscribe, hub.verify_token e hub.challenge=1234; seu servidor deve conferir o token e responder HTTP 200 com somente 1234 em texto puro. Testar sem salvar não libera cadastros. Ative também o POST na mesma URL para receber eventos.
  • Cliente existente, ativo e elegível para novas conexões.
  • Cobrança e controles de risco devem permitir a criação; a capacidade efetiva é confirmada pela lógica de conexão.

Autenticação e permissão

Partner API Key ativa com instances.write ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=create-customer-instance
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json",
  "Idempotency-Key": "UUID_UNICO_PARA_ESTA_ALTERACAO"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "external_customer_id": "cliente-001",
  "instance_name": "Instância de teste",
  "create_connect_session": true
}

O que preencher em cada campo

partner_customer_idstring UUID · Obrigatório escolher partner_customer_id ou external_customer_id.

UUID do cliente ao qual o número pertence.

Exemplo: 11111111-1111-4111-8111-111111111111

external_customer_idstring · Alternativa ao UUID do cliente.

Chave do cliente já existente no sistema externo; essa rota não cria o cadastro de cliente.

Exemplo: crm-cliente-001

instance_namestring · Opcional · nome provisório

Nome provisório da instância. Quando name_status confirmar aprovação, o nome verificado da Meta passa a ser o nome canônico, atualizado automaticamente.

Exemplo: WhatsApp principal

create_connect_sessionboolean · Opcional

Padrão true. false cria/reaproveita apenas o cadastro, sem gerar link nessa chamada.

Exemplo: true

metadataobject JSON · Opcional

Metadados da instância. Em reaproveitamento, omitir preserva o objeto anterior; fornecer substitui pelo objeto enviado.

Exemplo: {"origem":"erp"}

webhook_contextobject JSON · Opcional

Contexto de integração associado à instância para o sistema do assinante. Não é a URL do endpoint nem substitui sua configuração.

Exemplo: {"filial_id":"001"}

onboarding_modestring · Opcional

Rótulo do modo de onboarding armazenado na instância; o padrão é embedded_signup. Não há enum fechado validado neste handler.

Exemplo: embedded_signup

return_urlstring URL · Opcional

Destino de retorno ao sistema do assinante. A sessão criada por esta rota grava null se omitido; a página pode aplicar os defaults do parceiro ao consultar.

Exemplo: https://sistema.example.com/clientes/001

cancel_urlstring URL · Opcional

Destino após cancelamento da jornada. Omitir deixa o valor da sessão vazio.

Exemplo: https://sistema.example.com/conexao/cancelada

success_urlstring URL · Opcional

Destino específico de sucesso. Deve apontar para uma página sua que consulte o estado confirmado da instância.

Exemplo: https://sistema.example.com/conexao/concluida

error_urlstring URL · Opcional

Destino específico para erro na conexão. A página deve explicar como retomar o fluxo sem repetir indiscriminadamente o registro Meta.

Exemplo: https://sistema.example.com/conexao/erro

ttl_hoursnumber · Opcional

Validade do link em horas, como número finito positivo entre 1/60 de hora (1 minuto) e 168 horas (7 dias). Omissão, null ou valor não positivo utiliza a duração padrão configurada, com fallback de 24 horas. Texto, números não finitos e valores positivos inferiores a 1/60 de hora ou acima de 168 retornam 400 invalid_ttl_hours antes de criar registros. Guarde connect_expires_at como prazo exato e gere uma nova sessão quando necessário.

Exemplo: 24

connect_session_metadataobject JSON · Opcional

Campo listado no catálogo, mas atualmente ignorado por esta rota: o helper grava metadados internos, como motivo e instance_key. Para gravar metadados próprios de sessão, use create-connect-session com metadata.

Exemplo: {"origem":"portal"}

Idempotency-Key / idempotency_keystring · header preferencial ou body · Opcional, fortemente recomendado

Use de 8 a 200 caracteres e uma chave estável para cada criação. Repita a mesma chave no mesmo endpoint, com o mesmo corpo: a API devolve o status e o resultado originais, inclusive o mesmo link e sua validade, sem criar outra sessão. Corpo diferente retorna 409 idempotency_key_reused. O header tem preferência sobre idempotency_key do body. Outra chave representa uma nova operação; não a use para repetir uma tentativa após timeout. Não é um identificador Meta nem um comando de edição.

Exemplo: UUID_UNICO_PARA_ESTE_NUMERO

Como ler a resposta

Retorna HTTP 201 para criação ou 200 para reaproveitamento, com reused, partner_customer_id, external_customer_id, instance_id, instance_key, instance_name, verified_name, effective_business_name, name_source, status, occupies_slot, slot_state, used_slots e slot_limit. Se create_connect_session=true, também retorna connect_session_id, connect_url e connect_expires_at; caso contrário, esses campos ficam null. Guarde instance_id/instance_key e entregue connect_url ao usuário que fará a autorização. Em repetição idempotente, o status HTTP e o corpo originais são preservados (inclusive reused, connect_url e connect_expires_at). Essa resposta representa a criação original; consulte get-partner-instance para o estado atual. O link não tem sua validade prorrogada pela repetição.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 409 partner_webhook_verification_required: configure, valide e salve o webhook em Endpoints/update-partner-webhook-endpoint antes de tentar criar cliente, instância ou sessão. A validação avulsa não libera a operação. Consulte get-partner-onboarding-status.
  • 400 missing_instance_fields: faltou a identificação do cliente.
  • 404 customer_not_found: crie o cadastro antes.
  • 409 customer_inactive: cliente inativo/arquivado.
  • Erros de cobrança/risco podem impedir iniciar uma nova conexão.
  • 400 instance_key_server_managed: não defina uma chave nova; a HookCloud gera e devolve a chave.
  • 423 meta_risk_customer_blocked: o cliente atingiu a política BAN/RED ou revisão manual; leia customer_risk. Vagas livres do parceiro não removem a trava. Não recadastre o cliente para contornar o histórico.
  • 409 idempotency_key_reused: mesma chave com corpo diferente; para repetir, use o corpo original. Para editar dados, use a operação de atualização correspondente.
  • 409 operation_in_progress: a primeira chamada com essa chave está em processamento; aguarde e repita a mesma requisição.
  • 409 idempotency_result_unavailable: a operação anterior ficou interrompida ou seu resultado não pôde ser recuperado. Consulte a instância antes de iniciar outra operação; não gere outra chave automaticamente.
  • 503 idempotency_result_pending: a criação pode ter sido concluída, mas o armazenamento da resposta falhou. Confira o cadastro antes de iniciar uma nova operação.
  • 409 billing_sync_required: o período de cobrança ou trial confirmado expirou e precisa ser reconciliado. O proprietário deve abrir Assinatura no Portal e clicar em Atualizar para consultar a Stripe; se persistir, procurar o suporte. Não repita novas criações automaticamente. Isso não confirma recusa do cartão nem desconecta números já ativos.
  • 400 invalid_ttl_hours: envie ttl_hours como número finito; se positivo, entre 1/60 de hora (1 minuto) e 168 horas (7 dias), nunca texto ou Infinity. Omissão, null ou valor não positivo usa o padrão configurado (fallback 24h). A rejeição ocorre antes de criar registros.

Depois desta chamada

  • Abrir connect_url no navegador do responsável pelo negócio.
  • Após concluir, consultar get-partner-instance para confirmar status e IDs Meta.

Regras desta operação

  • Com a mesma Idempotency-Key e o mesmo corpo, repetir a criação não gera outro link. Se o link original expirar, use create-connect-session para a mesma instância.
  • connect_session_metadata não é persistido aqui na implementação atual.
  • O cadastro de uma instância pendente não equivale a conexão operacional nem a entrega de mensagens.
  • Reservas técnicas novas e seguras têm TTL de 15 minutos, com limpeza na próxima solicitação de reserva. GET e passagem do tempo não liberam a vaga por si só. Reservas legadas, números em uso, callback ativo/incerto, configuração parcial e operação remota processing/needs_review permanecem protegidos. Não é carência de cobrança.
  • Guarde instance_id e instance_key retornados. Para reconectar, reutilize a instância existente via create-connect-session; não crie uma nova a cada tentativa. A chave é gerada pelo servidor.
  • Uma instance_key já existente pode ser usada apenas para reaproveitar a mesma instância por compatibilidade. Não se aceita uma chave personalizada nova.
  • Após timeout, repita a mesma Idempotency-Key no mesmo endpoint e com o mesmo corpo, ou consulte as instâncias antes de criar. Não troque de endpoint ou de chave durante a repetição. Sem essa chave, uma nova chamada pode criar outra instância. Para renovar um link vencido ou reconectar, use create-connect-session com a instância persistida.
  • O estado autoritativo da configuração vem de get-partner-onboarding-status. URL presente ou token configurado, isoladamente, não confirmam GET validado. Atualizações de um cliente já existente não são tratadas como novo cadastro.
  • Toda instância nova registra o evento instance.created para entrega ao webhook. As duas rotas seguem esta regra; reaproveitamento e replay idempotente não geram outra ocorrência. Deduplique entregas por event_id. data.connect_url pode ser null se não foi solicitada sessão, se ela falhou ou se a entrega ocorreu antes do link ficar disponível; use a resposta HTTP ou create-connect-session sem recriar a instância.
POSTCriar instância pelo cadastro interno
create-partner-instance

Cria uma instância para um número do cliente. A HookCloud gera uma instance_key imutável; não preencha esse campo. O nome inicial serve até a Meta aprovar o nome de exibição. Depois, instance_name acompanha automaticamente o nome aprovado da Meta.

Quando usar

Use em uma integração que recebe cliente e primeiro número juntos e quer obter um link de conexão em uma única operação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Webhook global habilitado, primário e com verificação GET salva. A HookCloud envia hub.mode=subscribe, hub.verify_token e hub.challenge=1234; seu servidor deve conferir o token e responder HTTP 200 com somente 1234 em texto puro. Testar sem salvar não libera cadastros. Ative também o POST na mesma URL para receber eventos.
  • Assinatura elegível, cliente não arquivado e controles operacionais liberados.

Autenticação e permissão

Partner API Key ativa com instances.write ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=create-partner-instance
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json",
  "Idempotency-Key": "UUID_UNICO_PARA_ESTA_ALTERACAO"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "external_customer_id": "cliente-001",
  "customer_name": "Cliente de teste combinado",
  "create_connect_session": true
}

O que preencher em cada campo

external_customer_idstring · Obrigatório

Chave externa estável do cliente, até 200 caracteres.

Exemplo: crm-cliente-001

customer_namestring · Opcional · nome provisório

Nome cadastral de 2 a 200 caracteres.

Exemplo: Comércio Exemplo

instance_namestring · Opcional · nome provisório

Nome provisório da instância. Quando name_status confirmar aprovação, o nome verificado da Meta passa a ser o nome canônico, atualizado automaticamente.

Exemplo: WhatsApp principal

customer_emailstring ou null · Opcional

E-mail cadastral válido de até 320 caracteres. A versão atual normaliza os dados com o cliente existente para preservar opcionais omitidos.

Exemplo: cliente@example.com

customer_phonestring ou null · Opcional

Telefone cadastral, de 6 a 40 caracteres em formato aceito; não configura o número na Meta.

Exemplo: +55 21 99999-0000

external_account_idstring ou null · Opcional

Vínculo opcional a uma conta externa, até 200 caracteres.

Exemplo: conta-001

customer_metadataobject JSON · Opcional

Metadados do cliente, distintos do contexto da instância. Fornecer um objeto define o conjunto desejado; omitidos são preservados na atualização do cliente existente.

Exemplo: {"segmento":"varejo"}

webhook_contextobject JSON · Opcional

Contexto associado à instância. Diferentemente de customer_metadata, no reaproveitamento dessa rota o contexto da instância pode ser substituído por {} quando omitido; forneça o contexto desejado.

Exemplo: {"filial_id":"001"}

create_connect_sessionboolean · Opcional

Padrão true. false evita gerar nova sessão nessa chamada.

Exemplo: true

return_urlstring URL · Opcional

Destino de retorno ao sistema do assinante. Quando omitido, esta rota pode usar default_return_url do parceiro.

Exemplo: https://sistema.example.com/clientes/001

cancel_urlstring URL · Opcional

Destino após cancelamento da jornada. Pode herdar default_cancel_url do parceiro.

Exemplo: https://sistema.example.com/conexao/cancelada

success_urlstring URL · Opcional

Destino específico de sucesso. Deve apontar para uma página sua que consulte o estado confirmado da instância.

Exemplo: https://sistema.example.com/conexao/concluida

error_urlstring URL · Opcional

Destino específico para erro na conexão. A página deve explicar como retomar o fluxo sem repetir indiscriminadamente o registro Meta.

Exemplo: https://sistema.example.com/conexao/erro

ttl_hoursnumber · Opcional

Validade do link em horas, como número finito positivo entre 1/60 de hora (1 minuto) e 168 horas (7 dias). Omissão, null ou valor não positivo utiliza a duração padrão configurada, com fallback de 24 horas. Texto, números não finitos e valores positivos inferiores a 1/60 de hora ou acima de 168 retornam 400 invalid_ttl_hours antes de criar registros. Guarde connect_expires_at como prazo exato e gere uma nova sessão quando necessário.

Exemplo: 24

connect_session_metadataobject JSON · Opcional

Metadados próprios da nova sessão, gravados quando a geração de sessão está habilitada. Esse campo é efetivamente utilizado nesta rota combinada.

Exemplo: {"origem":"crm"}

Idempotency-Key / idempotency_keystring · header preferencial ou body · Opcional, fortemente recomendado

Use de 8 a 200 caracteres e uma chave estável para cada criação. Repita a mesma chave no mesmo endpoint, com o mesmo corpo: a API devolve o status e o resultado originais, inclusive o mesmo link e sua validade, sem criar outra sessão. Corpo diferente retorna 409 idempotency_key_reused. O header tem preferência sobre idempotency_key do body. Outra chave representa uma nova operação; não a use para repetir uma tentativa após timeout. Não é um identificador Meta nem um comando de edição.

Exemplo: UUID_UNICO_PARA_ESTE_NUMERO

Como ler a resposta

Retorna reused, partner_customer_id, external_customer_id, instance_id, instance_key, instance_name, status, occupies_slot, slot_state, display_phone_number, verified_name, quality_rating, used_slots, slot_limit e os dados opcionais de connect_session. HTTP 201 significa nova instância; 200 significa reaproveitamento. O campo warnings pode indicar um fallback aplicado. Use instance_id para as consultas posteriores. Em repetição idempotente, o status HTTP e o corpo originais são preservados (inclusive reused, connect_url e connect_expires_at). Essa resposta representa a criação original; consulte get-partner-instance para o estado atual. O link não tem sua validade prorrogada pela repetição.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 409 partner_webhook_verification_required: configure, valide e salve o webhook em Endpoints/update-partner-webhook-endpoint antes de tentar criar cliente, instância ou sessão. A validação avulsa não libera a operação. Consulte get-partner-onboarding-status.
  • 400 invalid_payload: faltaram os valores finais necessários à criação.
  • 403 partner_without_live_subscription: o backend não encontrou assinatura elegível.
  • Erros de validação cadastral e bloqueios de cobrança/risco podem interromper a operação.
  • 400 instance_key_server_managed: não defina uma chave nova; a HookCloud gera e devolve a chave.
  • 423 meta_risk_customer_blocked: o cliente atingiu a política BAN/RED ou revisão manual; leia customer_risk. Vagas livres do parceiro não removem a trava. Não recadastre o cliente para contornar o histórico.
  • 409 idempotency_key_reused: mesma chave com corpo diferente; para repetir, use o corpo original. Para editar dados, use a operação de atualização correspondente.
  • 409 operation_in_progress: a primeira chamada com essa chave está em processamento; aguarde e repita a mesma requisição.
  • 409 idempotency_result_unavailable: a operação anterior ficou interrompida ou seu resultado não pôde ser recuperado. Consulte a instância antes de iniciar outra operação; não gere outra chave automaticamente.
  • 503 idempotency_result_pending: a criação pode ter sido concluída, mas o armazenamento da resposta falhou. Confira o cadastro antes de iniciar uma nova operação.
  • 409 billing_sync_required: o período de cobrança ou trial confirmado expirou e precisa ser reconciliado. O proprietário deve abrir Assinatura no Portal e clicar em Atualizar para consultar a Stripe; se persistir, procurar o suporte. Não repita novas criações automaticamente. Isso não confirma recusa do cartão nem desconecta números já ativos.
  • 400 invalid_ttl_hours: envie ttl_hours como número finito; se positivo, entre 1/60 de hora (1 minuto) e 168 horas (7 dias), nunca texto ou Infinity. Omissão, null ou valor não positivo usa o padrão configurado (fallback 24h). A rejeição ocorre antes de criar registros.

Depois desta chamada

  • Entregar connect_url ao cliente e concluir o Embedded Signup.
  • Usar get-partner-customer e get-partner-instance para conferir separadamente os dois recursos.

Regras desta operação

  • Não é alias de create-customer-instance: o cadastro do cliente também participa da operação.
  • Para uma edição pontual, use a operação específica e reduza efeitos sobre nome/contexto da instância.
  • Guarde instance_id e instance_key retornados. Para reconectar, reutilize a instância existente via create-connect-session; não crie uma nova a cada tentativa. A chave é gerada pelo servidor.
  • Uma instance_key já existente pode ser usada apenas para reaproveitar a mesma instância por compatibilidade. Não se aceita uma chave personalizada nova.
  • Após timeout, repita a mesma Idempotency-Key no mesmo endpoint e com o mesmo corpo, ou consulte as instâncias antes de criar. Não troque de endpoint ou de chave durante a repetição. Sem essa chave, uma nova chamada pode criar outra instância. Para renovar um link vencido ou reconectar, use create-connect-session com a instância persistida.
  • A repetição idempotente devolve o mesmo link, sem renovar a expiração. Para gerar um link novo, use create-connect-session com a instância existente.
  • O estado autoritativo da configuração vem de get-partner-onboarding-status. URL presente ou token configurado, isoladamente, não confirmam GET validado. Atualizações de um cliente já existente não são tratadas como novo cadastro.
  • Toda instância nova registra o evento instance.created para entrega ao webhook. As duas rotas seguem esta regra; reaproveitamento e replay idempotente não geram outra ocorrência. Deduplique entregas por event_id. data.connect_url pode ser null se não foi solicitada sessão, se ela falhou ou se a entrega ocorreu antes do link ficar disponível; use a resposta HTTP ou create-connect-session sem recriar a instância.
GETLista instâncias do parceiro, opcionalmente filtradas por cliente e status.
list-partner-instances

Lista os números/instâncias do parceiro em páginas, incluindo os IDs Meta e a situação local de capacidade e callback. A consulta pode ser filtrada por cliente e é a forma de conciliar todas as instâncias sem revelar suas credenciais.

Quando usar

Use para preencher seletores de número, localizar uma instância após reconexão ou comparar a capacidade ocupada com o cadastro externo.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Referência oficial Meta: Limites compartilhados do portfólio Meta · BSUID e usernames comerciais

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Credencial com acesso às instâncias do parceiro.
  • Se filtrar por cliente, o cadastro precisa pertencer ao mesmo parceiro.

Autenticação e permissão

Partner API Key ativa com instances.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=list-partner-instances&page=1&page_size=20
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

pageinteger · Opcional

Página, padrão 1; mínimo 1 e máximo 1.000.000.

Exemplo: 1

page_sizeinteger · Opcional

Tamanho da página, padrão 50; de 1 a 200.

Exemplo: 20

customer_idstring UUID · Opcional

Limita a lista ao cliente indicado; pode ser substituído por partner_customer_id ou external_customer_id.

Exemplo: 11111111-1111-4111-8111-111111111111

partner_customer_idstring UUID · Opcional

Alias de customer_id para o filtro; use uma forma de identificação por vez.

Exemplo: 11111111-1111-4111-8111-111111111111

external_customer_idstring · Opcional

Filtra pelo cliente com essa chave externa dentro do parceiro.

Exemplo: crm-cliente-001

statusstring · Opcional

Estados aceitos pelo filtro: created, pending_signup, connected, paused, inactive, canceled ou error.

Exemplo: connected

Como ler a resposta

Retorna ok, partner_id, items, total, page, page_size e pages. Cada item contém id, vínculos de parceiro/cliente, instance_key, nome, status, display_phone_number, verified_name, meta_phone_number_id, meta_waba_id, quality_rating, name_status, remote_callback_status, occupies_slot, slot_state e datas. Reaproveite items[].id como instance_id; meta_phone_number_id vira phone_number_id nas consultas Graph/Partner que usam esse nome. Atualização de28/09/2026: leia connection_health e os campos separados connection_status, authorization_status, callback_status, inventory_state, meta_account_state, messaging_capability, business_verification, meta_payment, evidence, issues e allowed_actions. A fotografia deve trazer data/fonte/completude; unknown não equivale a false. ready_to_operate permanece conservador. Apenas 141006 com prova completa da WABA exata mantém inventory_state=active, mas messaging_capability.state=blocked e ready_to_operate=false podem continuar. Não recalcular esses estados no seu sistema. operation informa id,kind,status,started_at,finished_at,lease_until,result_code e steps; observation_scope separa current de historical. processing não confirma conclusão; needs_review pede reconciliação sem repetir a ação. request_id no JSON e X-Request-ID no cabeçalho permitem rastrear esta requisição; não são chaves de idempotência. instance_name acompanha o nome aprovado; name_status identifica a aprovação e evidence.checked_at informa a observação. Use o mesmo GET de instância para atualizar seu painel; não precisa de uma rota exclusiva de nome. A sincronização automática é eventual, com cadência controlada e backoff; não é uma leitura em tempo real a cada tela. meta_business_name e meta_waba_name identificam o portfólio e a WABA, quando informados pela Meta; meta_synced_at e os metadados meta_sync indicam a sincronização. Eventos hookcloud.instance.updated notificam mudanças desses dados. customer_risk contém a política individual do cliente: ban_count_30d, red_count_30d, limits={ban:20,red:5}, window_days=30, block_new_connections, reasons, next_exit_at, next_unlock_at e a cobertura histórica. Os limites bloqueiam novas conexões desse cliente, mesmo com vagas no pacote, sem desligar números existentes. Atualize seu cache com hookcloud.customer.risk_updated e reconcilie pela Partner API. Pagamento: meta_payment.status confirmed exige fonte de pagamento identificada na WABA; no_issue_detected significa consulta completa sem pendência, sem confirmar método. action_required preserva pendências e unknown informa falta de evidência atual. method_presence pode ser identified, not_confirmed ou unknown; nenhuma destas respostas expõe cartão ou identificador financeiro. business_verification informa a verificação empresarial explícita e separada do nome aprovado. Confira checked_at/source e acompanhe hookcloud.instance.health_updated. Perfil opcional: meta_profile.messaging_limit e meta_profile.username trazem status, valor, fonte, checked_at, stale e unavailable_reason. O limite moderno é compartilhado pelo portfólio em 24 horas móveis, não saldo disponível. Username reserved não confirma uso ativo; estado ausente permanece null. O cache desses campos é de até 6 horas, independente da evidência de saúde. Mudanças materiais são enviadas em hookcloud.instance.health_updated; mudança apenas de timestamp não gera novo evento. first_connected_at informa a primeira conexão registrada da identidade de número dentro do parceiro; null significa histórico não confirmado. Reconexão e movimentação dentro do mesmo parceiro não reiniciam essa data. Consulte o significado completo nos campos de resposta. Registro do número: phone.status PENDING, PENDING_REGISTRATION ou UNVERIFIED na identidade atual não confirma disponibilidade de envio, mesmo que a WABA informe AVAILABLE. Sem bloqueio, limitação ou restrição real prioritária, connection_health.state e messaging_capability.state ficam unknown, messaging_capability.reason=meta_registration_not_confirmed, ready_to_operate=false e inventory_state=attention. O status técnico connected pode permanecer. issues mantém o código meta_phone_not_confirmed_connected. Exiba “Confirmação pendente na Meta”; não conclua banimento, não desconecte nem crie outro vínculo automaticamente. A regra financeira de 141006 não transforma registro pendente em inventário pronto. Essa classificação usa a evidência já armazenada e não acrescenta GET à Meta; acompanhe o webhook e as datas, sem polling extra. panel_category é a categoria de exibição calculada pela HookCloud: active, processing, verification_pending, account_alert, restricted, banned, callback_review, attention ou disconnected. O Portal reúne históricos confirmados em Substituídos, com o subtipo no próprio card; não há abas separadas de Transferidos ou Encerrados. connection_history registra trocas de identidade confirmadas, com status superseded e subtype meta_identity_replacement. Uma reconexão normal pode atualizar os IDs automaticamente quando a nova autorização e a consulta à Meta comprovam o mesmo número, com o vínculo anterior encerrado. Mover uma instância entre clientes, reconectar sem mudança de IDs ou apenas observar um telefone igual não cria histórico de substituição. Não derive banimento de pagamento, RED ou erro técnico. A categoria não altera vagas nem permissões: use allowed_actions e occupies_slot. Após desconexão concluída, status legado permanece canceled, connection_status é inactive e observation_scope é historical. Falha de callback ou de credencial, isoladamente, não é histórico de desconexão. meta_link distingue vínculo removido confirmado de acesso não confirmado; connection_history lista identidades antigas substituídas, sem duplicar a instância atual ou capacidade. Leia o significado de cada campo abaixo. Uma remoção assinada deixa a instância canceled, o vínculo inativo, envio unavailable e capacidade liberada localmente, sem declarar callback removido nem token global revogado.

Nesta listagem, os campos da instância abaixo ficam dentro de cada objeto de items[]. O request_id pertence à resposta HTTP completa; total, page, page_size e pages descrevem a paginação.

Campos retornados que atualizam o painel

instance_id / idUUID

Identificador da instância na HookCloud. O GET individual usa instance_id; cada item da listagem usa id. Guarde esse vínculo com o cliente do seu sistema.

instance_keystring

Chave imutável criada pela HookCloud. Reutilize a chave retornada para a mesma instância; não gere uma chave nova para reconectar.

items[].first_connected_atdata ISO 8601 UTC | null

Primeira evidência registrada e ainda disponível de conexão técnica confirmada para o mesmo meta_phone_number_id dentro deste parceiro. Data ISO 8601 em UTC, ou null se não houver evidência suficiente. Reconexões e movimentações/mesclas entre clientes do mesmo parceiro preservam essa data; outro número Meta ou outro parceiro não herda o histórico. Campo somente de leitura: não use created_at, data de criação do cliente ou connected_at como substitutos. Não afirma a primeira conexão de toda a vida do número, nem envio liberado.

connection_generationUUID | null

Identifica a geração da conexão, não uma sequência numérica. Se um evento trouxer outra geração, consulte o GET antes de atualizar para não aplicar dados de uma conexão antiga.

instance_name / verified_name / name_statusstring | null

Nome apresentado, nome verificado pela Meta e situação da aprovação. Nome aprovado não equivale a empresa verificada.

quality_ratingstring | null

Qualidade informada pela Meta, como GREEN, YELLOW ou RED. UNKNOWN/nulo significa falta de classificação, não qualidade positiva nem banimento.

meta_business_id / meta_business_namestring | null

Identidade e nome do portfólio empresarial associado. Não são o UUID do cliente HookCloud.

connection_healthobject

Diagnóstico normalizado da conexão. Preserve os estados separados e sua evidência; não deduza tudo a partir de status=connected.

connection_health.business_verificationobject

Situação de verificação empresarial com fonte e data. verified confirma a verificação empresarial observada; not_verified é observação negativa; pending indica análise pendente; unknown não comprova ausência de verificação.

connection_health.meta_payment.statusstring

confirmed: fonte de cobrança identificada; no_issue_detected: sem pendência na leitura, sem confirmação de método; action_required: pendência explícita; unknown: sem evidência atual suficiente. Não são estados da assinatura HookCloud.

connection_health.meta_payment.method_presencestring

identified: fonte de cobrança identificada; not_confirmed: método não confirmado; unknown: informação indisponível. Não expõe cartão, saldo ou identificador financeiro nem garante sucesso de envio.

connection_health.meta_payment.checked_at / observed_at / source / stale / unavailable_reasondata ISO | string | boolean | null

Data da consulta/observação, origem, indicação de evidência antiga e motivo de indisponibilidade. Falta de permissão não comprova ausência de cartão.

connection_health.messaging_capability / issues / allowed_actionsobject | array

Possibilidade de envio observada, pendências e ações permitidas no diagnóstico. Consuma a classificação do servidor sem converter toda pendência em banimento. Registro pendente: state=unknown e reason=meta_registration_not_confirmed não são banimento nem envio disponível; preserve issues e allowed_actions do servidor.

connection_health.ready_to_operateboolean

Diagnóstico conservador de operação. status=connected sozinho confirma a etapa técnica e não substitui este diagnóstico. Mesmo true não garante aceitação de todo envio futuro pela Meta.

customer_riskobject | null

Política do cliente final: contagens BAN/RED, limites, janela, bloqueio de novas conexões e datas projetadas. Vagas do pacote não anulam esse bloqueio; conexões existentes são preservadas.

operationobject | null

Última operação, estado e resultado. processing não confirma término; needs_review exige conferir o resultado remoto antes de repetir uma alteração.

request_idstring

Identificador desta requisição para rastrear problemas com o suporte. Não identifica evento nem substitui Idempotency-Key.

meta_profile / connection_health.meta_profileobject

Perfil opcional com messaging_limit e username. São informações independentes da saúde e da assinatura. GET individual e refresh incluem meta_profile na projeção da instância; na lista está em cada items[]. Cada fato tem data e fonte próprias. Payload antigo sem esse objeto exige exibição neutra, sem inventar limite ou username.

meta_profile.messaging_limit.status / tierstring | null

status=available confirma uma faixa observada; unavailable significa que não foi possível confirmar. tier é a faixa Meta, como TIER_2K ou TIER_UNLIMITED. Não é consumo nem saldo de mensagens disponíveis; null não significa zero ou ilimitado.

meta_profile.messaging_limit.scope / sourcestring | null

business_portfolio + graph_phone_portfolio_limit: campo moderno whatsapp_business_manager_messaging_limit, compartilhado pelos números do portfólio, para usuários únicos fora da janela de atendimento em 24 horas móveis. phone_legacy + graph_phone_legacy_limit: fallback antigo identificado, sem criar capacidade extra. Não multiplique a faixa pela quantidade de números; TIER_UNLIMITED não elimina rate limits e políticas.

meta_profile.username.status / value / lifecycle_statusstring | null

status=available confirma o texto observado em value. lifecycle_status é approved, reserved ou null. Reservado não é ativo/aprovado; texto disponível com estado null deve mostrar situação não confirmada. Username comercial não é o BSUID do destinatário e não substitui recipient no envio.

meta_profile.messaging_limit e username: checked_at / source / stale / unavailable_reasondata ISO | string | boolean | null

Data e origem de cada leitura, validade e motivo de indisponibilidade. Cache de até 6 horas para a identidade/geração exata, inclusive resultado indisponível. stale=true neutraliza positivos; permission_error, field_unavailable, rate_limited e timeout não comprovam ausência do dado. Não recupere valores antigos de metadata para mostrar estado atual.

messaging_limit_tier / business_username / business_username_statusstring | null

Aliases de compatibilidade derivados do meta_profile atual. messaging_limit_tier pode conter o limite moderno do portfólio apesar do nome legado: leia scope/source no objeto completo. Quando não há evidência atual, os aliases ficam nulos; business_username_status não é inferido como ativo a partir do texto.

connection_health.messaging_capability.reasonstring | null

Motivo da classificação de envio. meta_registration_not_confirmed indica PENDING, PENDING_REGISTRATION ou UNVERIFIED no número observado. Sem bloqueio, limitação ou restrição real prioritária, saúde e envio ficam unknown, ready_to_operate=false e inventory_state=attention; status=connected continua sendo apenas vínculo técnico. Não trate WABA AVAILABLE, nome aprovado ou cartão cadastrado como confirmação do registro desse número. O diagnóstico existente meta_phone_not_confirmed_connected continua em issues.

panel_category / connection_health.panel_categorystring

panel_category é a categoria de exibição calculada pela HookCloud: active, processing, verification_pending, account_alert, restricted, banned, callback_review, attention ou disconnected. superseded, transferred e terminated ficam reservadas a um histórico de ciclo de vida explicitamente persistido; o Partner não cria essas situações ao simplesmente mover um número para outro cliente. Não derive banimento de pagamento, RED ou erro técnico. A categoria não altera vagas nem permissões: use allowed_actions e occupies_slot. Após desconexão concluída, status legado permanece canceled, connection_status é inactive e observation_scope é historical. Falha de callback ou de credencial, isoladamente, não é histórico de desconexão.

meta_linkobject

Estado do acesso ao vínculo Meta: removed exige webhook Meta assinado e validado para a identidade/geração atual; access_unconfirmed é falha Graph de acesso ao ativo, sem prova de remoção; unknown não tem confirmação. reason, confirmed_at e source explicam a evidência. removed usa source=signed_meta_webhook e connection_generation. access_unconfirmed usa source=graph e checked_at, com confirmed_at=null. Erros Graph 100/33/190 isolados não confirmam remoção nem BAN.

connection_history[]array de objetos somente de leitura (até 50)

Identidades anteriores substituídas explicitamente após conclusão. Cada item contém id, status=superseded, subtype=meta_identity_replacement, connection_generation anterior, successor_generation, phone_number_id, waba_id, business_id, display_phone_number, verified_name, connected_at, superseded_at e reason=explicit_meta_identity_replacement. IDs/nome/datas sem evidência podem ser null. Não contém credenciais, não é instância ativa, não ocupa nova vaga e não recebe ações. O histórico completo é preservado no registro de auditoria; esta projeção pública é limitada a 50 itens.

application_webhookobject | null

Callback individual preparado pela rota configure-partner-instance-webhook. scope=instance, url, status=configured/active/needs_review, applied e datas verified_at/configured_at/applied_at. Não contém o token. applied confirma configuração remota da identidade atual, não entrega/processamento pelo seu sistema; null indica ausência de override individual válido.

Receba as próximas mudanças por webhook

Depois de consultar ou configurar esta operação, seu sistema pode receber os eventos abaixo. Abra para entender o POST recebido, cada campo e o que atualizar no seu cadastro.

Documentação dos payloads recebidos

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 invalid_customer_id: filtro de UUID inválido.
  • 404 customer_not_found: cliente do filtro não acessível.
  • 400 invalid_instance_status: filtro fora dos estados aceitos.
  • 400 invalid_pagination: paginação inválida.

Depois desta chamada

  • Consultar get-partner-instance para detalhes.
  • Usar o ID correto da instância em atualização, token ou nova sessão.

Regras desta operação

  • A lista não consulta a Graph API em tempo real.
  • Instância paused ainda pode ocupar vaga; use occupies_slot/slot_state e a situação de desligamento.
  • O sistema externo é controlado pelo assinante. HookCloud confirma sua conexão/configuração e expõe evidências; callback ativo não garante recebimento/processamento no sistema externo. Não repetir POSTs para atualizar saúde. A atualização deve usar refresh-partner-instance-meta respeitando cooldown/retorno da API.
  • Use os campos adicionais sem remover os campos antigos ao atualizar seu consumidor. Não trate UNKNOWN de qualidade como GREEN, nem pagamento desconhecido como sem cartão. Guia: https://developers.hookcloud.app/connection-health.html
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
  • Prefira webhooks e o GET local para atualizar o painel. Limite e username usam cache opcional de até 6 horas; refreshed_at da consulta geral não substitui checked_at de cada observação.
  • As informações opcionais indisponíveis ficam neutras e não tornam a conexão bloqueada nem liberada. Não use valores antigos em metadata para preencher o que a Meta não confirmou na identidade atual.
  • Não marque Desconectado, BAN ou Substituído a partir de erro Graph genérico, pagamento, qualidade RED ou coincidência do telefone. Aguarde o estado calculado e a evidência da identidade atual. Histórico substituído é somente leitura, sob a mesma instance_key.
  • Para importar números existentes, guarde items[].id, partner_id e partner_customer_id e reutilize a instância; não chame create-customer-instance para cada importação. A lista tem dados de saúde e perfil, mas o link whatsapp_manager_url é fornecido pelo GET individual get-partner-instance. Reconciliação e reconexão não devem consumir uma nova vaga.
GETConsultar conexão e saúde do número
get-partner-instance

Consolida o estado de uma instância: cadastro, cliente, conexão WhatsApp, dados Meta, callback, risco, sessões recentes e capacidade. É o principal ponto de verificação após o Embedded Signup. A consulta mostra se existe credencial ativa, mas não retorna o token em texto. Também fornece whatsapp_manager_url para implementar o botão WhatsApp Manager no painel do seu assinante.

Quando usar

Use depois de conectar, antes de enviar pela Graph API e durante diagnóstico de número, callback ou ocupação de capacidade.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Referência oficial Meta: Limites compartilhados do portfólio Meta · BSUID e usernames comerciais

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Conhecer exatamente um dos identificadores suportados.
  • Distinguir UUID interno, instance_key e phone_number_id da Meta.

Autenticação e permissão

Partner API Key ativa com instances.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-partner-instance&instance_key=cliente-001-whatsapp-principal
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

instance_idstring UUID · Uma alternativa; envie exatamente uma: instance_id ou instance_key ou phone_number_id.

UUID retornado pelo Partner ao criar a instância. Não use o código externo do cliente neste campo.

Exemplo: 33333333-3333-4333-8333-333333333333

instance_keystring · Alternativa ao UUID interno.

Chave estável da instância no sistema externo. O backend normaliza para minúsculas; uma mesma chave não pode representar números de clientes diferentes.

Exemplo: crm-cliente-001-whatsapp-1

phone_number_idstring de dígitos · Alternativa às chaves do Partner.

ID técnico do número comercial na Meta. Não é o telefone exibido nem o BSUID do destinatário.

Exemplo: 100000000000001

meta_phone_number_idstring de dígitos · Opcional

Alias de phone_number_id. Prefira o nome canônico nos parâmetros da chamada e não envie os dois com valores diferentes.

Exemplo: 100000000000001

Como ler a resposta

Retorna instance_id/instance_key, nomes interno e oficial, status, occupies_slot/slot_state, phone_number_id, waba_id, meta_business_id, graph_version, URLs de envio e WhatsApp Manager, sinais de credencial, estado de callback, erros, datas, customer, connection, recent_connect_sessions, used_slots e slot_limit. Guarde phone_number_id e waba_id para operações Meta; use a existência de credencial e o estado connected como sinais separados. recent_connect_sessions mostra até cinco sessões e não revela tokens de link. Atualização de28/09/2026: leia connection_health e os campos separados connection_status, authorization_status, callback_status, inventory_state, meta_account_state, messaging_capability, business_verification, meta_payment, evidence, issues e allowed_actions. A fotografia deve trazer data/fonte/completude; unknown não equivale a false. ready_to_operate permanece conservador. Apenas 141006 com prova completa da WABA exata mantém inventory_state=active, mas messaging_capability.state=blocked e ready_to_operate=false podem continuar. Não recalcular esses estados no seu sistema. operation informa id,kind,status,started_at,finished_at,lease_until,result_code e steps; observation_scope separa current de historical. processing não confirma conclusão; needs_review pede reconciliação sem repetir a ação. request_id no JSON e X-Request-ID no cabeçalho permitem rastrear esta requisição; não são chaves de idempotência. instance_name acompanha o nome aprovado; name_status identifica a aprovação e evidence.checked_at informa a observação. Use o mesmo GET de instância para atualizar seu painel; não precisa de uma rota exclusiva de nome. A sincronização automática é eventual, com cadência controlada e backoff; não é uma leitura em tempo real a cada tela. meta_business_name e meta_waba_name identificam o portfólio e a WABA, quando informados pela Meta; meta_synced_at e os metadados meta_sync indicam a sincronização. Eventos hookcloud.instance.updated notificam mudanças desses dados. customer_risk contém a política individual do cliente: ban_count_30d, red_count_30d, limits={ban:20,red:5}, window_days=30, block_new_connections, reasons, next_exit_at, next_unlock_at e a cobertura histórica. Os limites bloqueiam novas conexões desse cliente, mesmo com vagas no pacote, sem desligar números existentes. Atualize seu cache com hookcloud.customer.risk_updated e reconcilie pela Partner API. Pagamento: meta_payment.status confirmed exige fonte de pagamento identificada na WABA; no_issue_detected significa consulta completa sem pendência, sem confirmar método. action_required preserva pendências e unknown informa falta de evidência atual. method_presence pode ser identified, not_confirmed ou unknown; nenhuma destas respostas expõe cartão ou identificador financeiro. business_verification informa a verificação empresarial explícita e separada do nome aprovado. Confira checked_at/source e acompanhe hookcloud.instance.health_updated. Perfil opcional: meta_profile.messaging_limit e meta_profile.username trazem status, valor, fonte, checked_at, stale e unavailable_reason. O limite moderno é compartilhado pelo portfólio em 24 horas móveis, não saldo disponível. Username reserved não confirma uso ativo; estado ausente permanece null. O cache desses campos é de até 6 horas, independente da evidência de saúde. Mudanças materiais são enviadas em hookcloud.instance.health_updated; mudança apenas de timestamp não gera novo evento. first_connected_at informa a primeira conexão registrada da identidade de número dentro do parceiro; null significa histórico não confirmado. Reconexão e movimentação dentro do mesmo parceiro não reiniciam essa data. Consulte o significado completo nos campos de resposta. Registro do número: phone.status PENDING, PENDING_REGISTRATION ou UNVERIFIED na identidade atual não confirma disponibilidade de envio, mesmo que a WABA informe AVAILABLE. Sem bloqueio, limitação ou restrição real prioritária, connection_health.state e messaging_capability.state ficam unknown, messaging_capability.reason=meta_registration_not_confirmed, ready_to_operate=false e inventory_state=attention. O status técnico connected pode permanecer. issues mantém o código meta_phone_not_confirmed_connected. Exiba “Confirmação pendente na Meta”; não conclua banimento, não desconecte nem crie outro vínculo automaticamente. A regra financeira de 141006 não transforma registro pendente em inventário pronto. Essa classificação usa a evidência já armazenada e não acrescenta GET à Meta; acompanhe o webhook e as datas, sem polling extra. panel_category é a categoria de exibição calculada pela HookCloud: active, processing, verification_pending, account_alert, restricted, banned, callback_review, attention ou disconnected. O Portal reúne históricos confirmados em Substituídos, com o subtipo no próprio card; não há abas separadas de Transferidos ou Encerrados. connection_history registra trocas de identidade confirmadas, com status superseded e subtype meta_identity_replacement. Uma reconexão normal pode atualizar os IDs automaticamente quando a nova autorização e a consulta à Meta comprovam o mesmo número, com o vínculo anterior encerrado. Mover uma instância entre clientes, reconectar sem mudança de IDs ou apenas observar um telefone igual não cria histórico de substituição. Não derive banimento de pagamento, RED ou erro técnico. A categoria não altera vagas nem permissões: use allowed_actions e occupies_slot. Após desconexão concluída, status legado permanece canceled, connection_status é inactive e observation_scope é historical. Falha de callback ou de credencial, isoladamente, não é histórico de desconexão. meta_link distingue vínculo removido confirmado de acesso não confirmado; connection_history lista identidades antigas substituídas, sem duplicar a instância atual ou capacidade. Leia o significado de cada campo abaixo. Uma remoção assinada deixa a instância canceled, o vínculo inativo, envio unavailable e capacidade liberada localmente, sem declarar callback removido nem token global revogado. HTTP 202 com disconnect_status=awaiting_user e meta_disconnect.status=action_required pode aparecer em solicitações legadas. O campo status preserva o estado técnico real, por exemplo connected. Não marque concluído nem libere a vaga. Se safe_to_recheck=true e recheck_mode=resume_hookcloud_integration, ofereça Retomar desconexão automática, repetindo deactivate-partner-instance para a mesma instance_id/instance_key, operação e geração. Esse modo permite confirmar a rota e desativar o acesso local sem exigir o celular nem revogar um grant compartilhado. O nome legado action_required=disconnect_in_whatsapp_business_app não deve prevalecer sobre message/instructions e recheck_mode atuais. read_only continua significando conferência de uma intenção existente, sem repetir DELETE; retry_safe_preflight é compatibilidade com uma recusa anterior à intenção e pode iniciar as primeiras escritas autorizadas. Sem safe_to_recheck, acompanhe o GET local e os eventos; não repita automaticamente. No GET, disconnect_cleanup (também em connection_health) descreve a conclusão persistida. status=completed, scope=hookcloud_integration e proof_source=phone_callback_removed_local_access_disabled confirmam a retirada da rota do número e a desativação do acesso local. Confira connection_generation, operation_id, confirmed_at, callback.status=removed, local_authorization=disabled e token_revocation.status=local_disabled. remote_authorization=preserved_shared e token_revocation.remote_status=preserved_shared informam que a autorização Meta foi preservada para manter outras conexões; unknown/unconfirmed não afirmam revogação. commercial_relationship.status=unchanged separa a parceria comercial. O contrato anterior scope=app_authorization e proof_source=grant_revoked_readback continua válido quando houve revogação comprovada: token_revocation.status=confirmed_invalid. Campos ausentes ou null não confirmam essas ações. Não são expostos token, segredo ou titular do token.

Nesta consulta individual, os identificadores ficam na raiz da resposta. Os campos de saúde abaixo usam connection_health; parte deles também é retornada na raiz por compatibilidade.

Campos retornados que atualizam o painel

whatsapp_manager_urlstring URI HTTPS ou null

URL HTTPS para o botão Abrir WhatsApp Manager no painel do seu sistema. Campo na raiz da resposta, composto pelos IDs Meta disponíveis; null quando nenhum identificador está disponível. O cliente usa o próprio login e permissões da Meta. Não inclui tokens, não concede acesso nem comprova conexão/saúde. Oculte o botão quando ausente/null; reutilize o link sem refresh ou GET à Meta apenas para exibi-lo.

instance_id / idUUID

Identificador da instância na HookCloud. O GET individual usa instance_id; cada item da listagem usa id. Guarde esse vínculo com o cliente do seu sistema.

instance_keystring

Chave imutável criada pela HookCloud. Reutilize a chave retornada para a mesma instância; não gere uma chave nova para reconectar.

first_connected_atdata ISO 8601 UTC | null

Primeira evidência registrada e ainda disponível de conexão técnica confirmada para o mesmo meta_phone_number_id dentro deste parceiro. Data ISO 8601 em UTC, ou null se não houver evidência suficiente. Reconexões e movimentações/mesclas entre clientes do mesmo parceiro preservam essa data; outro número Meta ou outro parceiro não herda o histórico. Campo somente de leitura: não use created_at, data de criação do cliente ou connected_at como substitutos. Não afirma a primeira conexão de toda a vida do número, nem envio liberado.

connection_generationUUID | null

Identifica a geração da conexão, não uma sequência numérica. Se um evento trouxer outra geração, consulte o GET antes de atualizar para não aplicar dados de uma conexão antiga.

instance_name / verified_name / name_statusstring | null

Nome apresentado, nome verificado pela Meta e situação da aprovação. Nome aprovado não equivale a empresa verificada.

quality_ratingstring | null

Qualidade informada pela Meta, como GREEN, YELLOW ou RED. UNKNOWN/nulo significa falta de classificação, não qualidade positiva nem banimento.

meta_business_id / meta_business_namestring | null

Identidade e nome do portfólio empresarial associado. Não são o UUID do cliente HookCloud.

connection_healthobject

Diagnóstico normalizado da conexão. Preserve os estados separados e sua evidência; não deduza tudo a partir de status=connected.

connection_health.business_verificationobject

Situação de verificação empresarial com fonte e data. verified confirma a verificação empresarial observada; not_verified é observação negativa; pending indica análise pendente; unknown não comprova ausência de verificação.

connection_health.meta_payment.statusstring

confirmed: fonte de cobrança identificada; no_issue_detected: sem pendência na leitura, sem confirmação de método; action_required: pendência explícita; unknown: sem evidência atual suficiente. Não são estados da assinatura HookCloud.

connection_health.meta_payment.method_presencestring

identified: fonte de cobrança identificada; not_confirmed: método não confirmado; unknown: informação indisponível. Não expõe cartão, saldo ou identificador financeiro nem garante sucesso de envio.

connection_health.meta_payment.checked_at / observed_at / source / stale / unavailable_reasondata ISO | string | boolean | null

Data da consulta/observação, origem, indicação de evidência antiga e motivo de indisponibilidade. Falta de permissão não comprova ausência de cartão.

connection_health.messaging_capability / issues / allowed_actionsobject | array

Possibilidade de envio observada, pendências e ações permitidas no diagnóstico. Consuma a classificação do servidor sem converter toda pendência em banimento. Registro pendente: state=unknown e reason=meta_registration_not_confirmed não são banimento nem envio disponível; preserve issues e allowed_actions do servidor.

connection_health.ready_to_operateboolean

Diagnóstico conservador de operação. status=connected sozinho confirma a etapa técnica e não substitui este diagnóstico. Mesmo true não garante aceitação de todo envio futuro pela Meta.

customer_riskobject | null

Política do cliente final: contagens BAN/RED, limites, janela, bloqueio de novas conexões e datas projetadas. Vagas do pacote não anulam esse bloqueio; conexões existentes são preservadas.

operationobject | null

Última operação, estado e resultado. processing não confirma término; needs_review exige conferir o resultado remoto antes de repetir uma alteração.

request_idstring

Identificador desta requisição para rastrear problemas com o suporte. Não identifica evento nem substitui Idempotency-Key.

meta_profile / connection_health.meta_profileobject

Perfil opcional com messaging_limit e username. São informações independentes da saúde e da assinatura. GET individual e refresh incluem meta_profile na projeção da instância; na lista está em cada items[]. Cada fato tem data e fonte próprias. Payload antigo sem esse objeto exige exibição neutra, sem inventar limite ou username.

meta_profile.messaging_limit.status / tierstring | null

status=available confirma uma faixa observada; unavailable significa que não foi possível confirmar. tier é a faixa Meta, como TIER_2K ou TIER_UNLIMITED. Não é consumo nem saldo de mensagens disponíveis; null não significa zero ou ilimitado.

meta_profile.messaging_limit.scope / sourcestring | null

business_portfolio + graph_phone_portfolio_limit: campo moderno whatsapp_business_manager_messaging_limit, compartilhado pelos números do portfólio, para usuários únicos fora da janela de atendimento em 24 horas móveis. phone_legacy + graph_phone_legacy_limit: fallback antigo identificado, sem criar capacidade extra. Não multiplique a faixa pela quantidade de números; TIER_UNLIMITED não elimina rate limits e políticas.

meta_profile.username.status / value / lifecycle_statusstring | null

status=available confirma o texto observado em value. lifecycle_status é approved, reserved ou null. Reservado não é ativo/aprovado; texto disponível com estado null deve mostrar situação não confirmada. Username comercial não é o BSUID do destinatário e não substitui recipient no envio.

meta_profile.messaging_limit e username: checked_at / source / stale / unavailable_reasondata ISO | string | boolean | null

Data e origem de cada leitura, validade e motivo de indisponibilidade. Cache de até 6 horas para a identidade/geração exata, inclusive resultado indisponível. stale=true neutraliza positivos; permission_error, field_unavailable, rate_limited e timeout não comprovam ausência do dado. Não recupere valores antigos de metadata para mostrar estado atual.

messaging_limit_tier / business_username / business_username_statusstring | null

Aliases de compatibilidade derivados do meta_profile atual. messaging_limit_tier pode conter o limite moderno do portfólio apesar do nome legado: leia scope/source no objeto completo. Quando não há evidência atual, os aliases ficam nulos; business_username_status não é inferido como ativo a partir do texto.

connection_health.messaging_capability.reasonstring | null

Motivo da classificação de envio. meta_registration_not_confirmed indica PENDING, PENDING_REGISTRATION ou UNVERIFIED no número observado. Sem bloqueio, limitação ou restrição real prioritária, saúde e envio ficam unknown, ready_to_operate=false e inventory_state=attention; status=connected continua sendo apenas vínculo técnico. Não trate WABA AVAILABLE, nome aprovado ou cartão cadastrado como confirmação do registro desse número. O diagnóstico existente meta_phone_not_confirmed_connected continua em issues.

panel_category / connection_health.panel_categorystring

panel_category é a categoria de exibição calculada pela HookCloud: active, processing, verification_pending, account_alert, restricted, banned, callback_review, attention ou disconnected. superseded, transferred e terminated ficam reservadas a um histórico de ciclo de vida explicitamente persistido; o Partner não cria essas situações ao simplesmente mover um número para outro cliente. Não derive banimento de pagamento, RED ou erro técnico. A categoria não altera vagas nem permissões: use allowed_actions e occupies_slot. Após desconexão concluída, status legado permanece canceled, connection_status é inactive e observation_scope é historical. Falha de callback ou de credencial, isoladamente, não é histórico de desconexão.

meta_linkobject

Estado do acesso ao vínculo Meta: removed exige webhook Meta assinado e validado para a identidade/geração atual; access_unconfirmed é falha Graph de acesso ao ativo, sem prova de remoção; unknown não tem confirmação. reason, confirmed_at e source explicam a evidência. removed usa source=signed_meta_webhook e connection_generation. access_unconfirmed usa source=graph e checked_at, com confirmed_at=null. Erros Graph 100/33/190 isolados não confirmam remoção nem BAN.

connection_history[]array de objetos somente de leitura (até 50)

Identidades anteriores substituídas explicitamente após conclusão. Cada item contém id, status=superseded, subtype=meta_identity_replacement, connection_generation anterior, successor_generation, phone_number_id, waba_id, business_id, display_phone_number, verified_name, connected_at, superseded_at e reason=explicit_meta_identity_replacement. IDs/nome/datas sem evidência podem ser null. Não contém credenciais, não é instância ativa, não ocupa nova vaga e não recebe ações. O histórico completo é preservado no registro de auditoria; esta projeção pública é limitada a 50 itens.

disconnect_actionobject / null

HTTP 202 com disconnect_status=awaiting_user e meta_disconnect.status=action_required pode aparecer em solicitações legadas. O campo status preserva o estado técnico real, por exemplo connected. Não marque concluído nem libere a vaga. Se safe_to_recheck=true e recheck_mode=resume_hookcloud_integration, ofereça Retomar desconexão automática, repetindo deactivate-partner-instance para a mesma instance_id/instance_key, operação e geração. Esse modo permite confirmar a rota e desativar o acesso local sem exigir o celular nem revogar um grant compartilhado. O nome legado action_required=disconnect_in_whatsapp_business_app não deve prevalecer sobre message/instructions e recheck_mode atuais. read_only continua significando conferência de uma intenção existente, sem repetir DELETE; retry_safe_preflight é compatibilidade com uma recusa anterior à intenção e pode iniciar as primeiras escritas autorizadas. Sem safe_to_recheck, acompanhe o GET local e os eventos; não repita automaticamente.

disconnect_cleanup / connection_health.disconnect_cleanupobject ou null

No GET, disconnect_cleanup (também em connection_health) descreve a conclusão persistida. status=completed, scope=hookcloud_integration e proof_source=phone_callback_removed_local_access_disabled confirmam a retirada da rota do número e a desativação do acesso local. Confira connection_generation, operation_id, confirmed_at, callback.status=removed, local_authorization=disabled e token_revocation.status=local_disabled. remote_authorization=preserved_shared e token_revocation.remote_status=preserved_shared informam que a autorização Meta foi preservada para manter outras conexões; unknown/unconfirmed não afirmam revogação. commercial_relationship.status=unchanged separa a parceria comercial. O contrato anterior scope=app_authorization e proof_source=grant_revoked_readback continua válido quando houve revogação comprovada: token_revocation.status=confirmed_invalid. Campos ausentes ou null não confirmam essas ações. Não são expostos token, segredo ou titular do token.

application_webhookobject | null

Callback individual preparado pela rota configure-partner-instance-webhook. scope=instance, url, status=configured/active/needs_review, applied e datas verified_at/configured_at/applied_at. Não contém o token. applied confirma configuração remota da identidade atual, não entrega/processamento pelo seu sistema; null indica ausência de override individual válido.

Receba as próximas mudanças por webhook

Depois de consultar ou configurar esta operação, seu sistema pode receber os eventos abaixo. Abra para entender o POST recebido, cada campo e o que atualizar no seu cadastro.

Documentação dos payloads recebidos

Botão “Abrir WhatsApp Manager” no seu painel

Use get-partner-instance para obter whatsapp_manager_url na raiz da resposta e oferecer o mesmo acesso que existe no Portal HookCloud. Não é necessário criar um endpoint exclusivo, revelar o token Meta ou iniciar outra conexão.

  1. No backend do seu sistema, consulte GET ?route=get-partner-instance&instance_id=UUID_DA_INSTANCIA com a autenticação Partner API e o escopo instances.read. Use apenas um identificador por consulta.
  2. Verifique se a pessoa autenticada no seu sistema tem acesso àquele cliente e número antes de devolver os dados ao navegador. A Partner API Key permanece no seu backend.
  3. Leia whatsapp_manager_url. Ela contém os identificadores Meta disponíveis do portfólio, WABA e/ou número. Use a URL retornada, sem acrescentar tokens ou reconstruí-la a partir do telefone ou BSUID.
  4. Se houver uma URL válida, mostre o botão abaixo. Se vier null, ausente ou inválida, mantenha o botão oculto e remova o link anterior. Não abra um endereço de outro cliente como alternativa.

O clique abre uma nova aba na Meta. O usuário precisa entrar com sua própria conta Facebook e ter permissão no portfólio/WABA correspondente; esse link não faz login automático nem concede acesso. Dependendo da sessão, a Meta pode pedir login ou seleção da empresa.

A presença do link não confirma que o número está conectado, saudável ou autorizado para envio. Para esses estados, leia connection_health. A consulta da instância usa dados armazenados na HookCloud; reutilize a URL no seu painel. Não chame refresh-partner-instance-meta nem a Graph API só para renderizar o botão.

HTML — botão inicialmente oculto
<a id="abrir-whatsapp-manager"
   target="_blank"
   rel="noopener noreferrer"
   hidden>
  Abrir WhatsApp Manager
</a>
JavaScript — usar a URL retornada pelo seu backend
function atualizarBotaoWhatsAppManager(dadosDaInstancia) {
  const botao = document.getElementById('abrir-whatsapp-manager');
  if (!botao) return;

  // Remova qualquer URL anterior ao trocar de cliente ou instância.
  botao.hidden = true;
  botao.removeAttribute('href');

  const endereco = dadosDaInstancia?.whatsapp_manager_url;
  if (typeof endereco !== 'string' || !endereco.trim()) return;

  try {
    const url = new URL(endereco);
    if (url.origin !== 'https://business.facebook.com') return;
    if (url.username || url.password) return;

    botao.href = url.href;
    botao.hidden = false;
  } catch {
    // URL indisponível ou inválida: mantenha o botão oculto.
  }
}

// Após seu backend devolver os dados autorizados da instância:
// atualizarBotaoWhatsAppManager(dadosDaInstancia);

Inclua o HTML no card do número e execute atualizarBotaoWhatsAppManager(dadosDaInstancia) após carregar a resposta autorizada. O exemplo usa um único botão; em uma lista, use uma referência própria por card, sem repetir o mesmo id. A consulta autenticada acontece no seu backend: nenhum segredo HookCloud ou Meta deve ser colocado neste JavaScript do navegador.

Guia do botão WhatsApp Manager

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 missing_identifier: faltou seletor.
  • 400 multiple_identifiers: enviou mais de uma alternativa.
  • 400 invalid_instance_id: usou um código externo onde era necessário UUID.
  • 404 instance_not_found: recurso não acessível à credencial.

Depois desta chamada

  • Se os dados oficiais parecerem desatualizados, executar refresh-partner-instance-meta.
  • Para operações Graph, obtenha o token autorizado pela rota reveal-partner-instance-meta-token.
  • Usar whatsapp_manager_url no botão Abrir WhatsApp Manager do seu painel; consulte o exemplo HTML/JavaScript desta chamada.

Regras desta operação

  • meta_access_token_available não é o token.
  • phone_number_id identifica seu número comercial; não use esse ID como recipient das mensagens.
  • Não trate uma URL de envio retornada como comprovação de entrega.
  • O sistema externo é controlado pelo assinante. HookCloud confirma sua conexão/configuração e expõe evidências; callback ativo não garante recebimento/processamento no sistema externo. Não repetir POSTs para atualizar saúde. A atualização deve usar refresh-partner-instance-meta respeitando cooldown/retorno da API.
  • Use os campos adicionais sem remover os campos antigos ao atualizar seu consumidor. Não trate UNKNOWN de qualidade como GREEN, nem pagamento desconhecido como sem cartão. Guia: https://developers.hookcloud.app/connection-health.html
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
  • Prefira webhooks e o GET local para atualizar o painel. Limite e username usam cache opcional de até 6 horas; refreshed_at da consulta geral não substitui checked_at de cada observação.
  • As informações opcionais indisponíveis ficam neutras e não tornam a conexão bloqueada nem liberada. Não use valores antigos em metadata para preencher o que a Meta não confirmou na identidade atual.
  • Não marque Desconectado, BAN ou Substituído a partir de erro Graph genérico, pagamento, qualidade RED ou coincidência do telefone. Aguarde o estado calculado e a evidência da identidade atual. Histórico substituído é somente leitura, sob a mesma instance_key.
GETConsultar histórico de saúde e gerações da instância
get-partner-instance-history

Consulta as observações de saúde da instância, separadas por generation. Reconectar ou trocar o vínculo não transforma evidência antiga em estado atual. Esta consulta não chama a Graph API.

Quando usar

Use para investigar mudanças entre conexões ou explicar por que uma observação anterior difere do estado de agora.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Chave do parceiro com instances.read ou JWT autorizado. A instância precisa pertencer ao parceiro autenticado.

Autenticação e permissão

Partner API Key ativa com instances.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-partner-instance-history&instance_id=UUID_DA_INSTANCIA&page=1&page_size=25
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

instance_idUUID · Obrigatório

Identificador exato da instância no Partner. Não use o Phone Number ID aqui.

Exemplo: 00000000-0000-4000-8000-000000000001

pageinteger · Opcional

Página a consultar, começando em 1. Repita a consulta até cobrir total.

Exemplo: 1

page_sizeinteger · Opcional

Quantidade de observações por página; máximo 200. O exemplo usa 25.

Exemplo: 25

Como ler a resposta

HTTP 200: schema_version partner-health-v2, instance_id, connection_generation atual, items com id/generation/operation_id/health/created_at, total/page/page_size. history_complete é false; coverage observations_since_deployment informa que não existe backfill de todo o passado. health usa o mesmo contrato de estados separados do get-partner-instance.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 para identificador/paginação inválidos; 401/403 quando autenticação ou escopo não permitem; 404 quando a instância não está acessível.

Depois desta chamada

  • Compare generation e created_at com a conexão atual. Leia get-partner-instance para a observação vigente.
  • Para uma consulta externa recente use refresh-partner-instance-meta explicitamente, respeitando autorização e cooldown.

Regras desta operação

  • Nenhuma alteração na Meta ou no sistema externo do assinante é feita por este GET. Não apresente RED/BAN antigo como restrição atual.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
POSTConsulta Graph API e atualiza metadados locais do número.
refresh-partner-instance-meta

Consulta a saúde e os dados oficiais do número na Graph API com a credencial da instância e grava a observação no Partner. Dados opcionais de limite e username têm cache próprio e podem ser reutilizados nesta atualização; consulte checked_at de cada fato, sem tratar refreshed_at como nova leitura de todos os campos.

Quando usar

Use após a aprovação/alteração do nome na Meta ou quando precisar atualizar informações oficiais vistas no painel.

Referência oficial Meta: Números, registro e permissões · Webhooks da Cloud API · Limites compartilhados do portfólio Meta · BSUID e usernames comerciais

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Instância com credencial Meta utilizável e phone_number_id.
  • Enviar exatamente um identificador; múltiplos seletores são rejeitados para evitar identidade ambígua.

Autenticação e permissão

Partner API Key ativa com instances.write ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=refresh-partner-instance-meta
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "instance_key": "cliente-001-whatsapp-principal"
}

O que preencher em cada campo

instance_idstring UUID · Uma alternativa: instance_id ou instance_key ou phone_number_id.

UUID retornado pelo Partner ao criar a instância. Não use o código externo do cliente neste campo.

Exemplo: 33333333-3333-4333-8333-333333333333

instance_keystring · Alternativa ao UUID interno.

Chave estável da instância no sistema externo. O backend normaliza para minúsculas; uma mesma chave não pode representar números de clientes diferentes.

Exemplo: crm-cliente-001-whatsapp-1

phone_number_idstring de dígitos · Alternativa às chaves do Partner.

ID técnico do número comercial na Meta. Não é o telefone exibido nem o BSUID do destinatário.

Exemplo: 100000000000001

meta_phone_number_idstring de dígitos · Opcional

Alias de phone_number_id. Prefira o nome canônico nos parâmetros da chamada e não envie os dois com valores diferentes.

Exemplo: 100000000000001

Como ler a resposta

Retorna instance_id, instance_key, instance_name, verified_name/meta_verified_name, effective_business_name, name_source, display_phone_number, quality_rating, name_status, code_verification_status, IDs Meta, whatsapp_manager_url, meta_phone_number_details e refreshed_at. Use refreshed_at para mostrar quando ocorreu a consulta e get-partner-instance para a visão operacional completa. Atualização de28/09/2026: leia connection_health e os campos separados connection_status, authorization_status, callback_status, inventory_state, meta_account_state, messaging_capability, business_verification, meta_payment, evidence, issues e allowed_actions. A fotografia deve trazer data/fonte/completude; unknown não equivale a false. ready_to_operate permanece conservador. Apenas 141006 com prova completa da WABA exata mantém inventory_state=active, mas messaging_capability.state=blocked e ready_to_operate=false podem continuar. Não recalcular esses estados no seu sistema. operation informa id,kind,status,started_at,finished_at,lease_until,result_code e steps; observation_scope separa current de historical. processing não confirma conclusão; needs_review pede reconciliação sem repetir a ação. request_id no JSON e X-Request-ID no cabeçalho permitem rastrear esta requisição; não são chaves de idempotência. instance_name acompanha o nome aprovado; name_status identifica a aprovação e evidence.checked_at informa a observação. Use o mesmo GET de instância para atualizar seu painel; não precisa de uma rota exclusiva de nome. A sincronização automática é eventual, com cadência controlada e backoff; não é uma leitura em tempo real a cada tela. meta_business_name e meta_waba_name identificam o portfólio e a WABA, quando informados pela Meta; meta_synced_at e os metadados meta_sync indicam a sincronização. Eventos hookcloud.instance.updated notificam mudanças desses dados. Pagamento: meta_payment.status confirmed exige fonte de pagamento identificada na WABA; no_issue_detected significa consulta completa sem pendência, sem confirmar método. action_required preserva pendências e unknown informa falta de evidência atual. method_presence pode ser identified, not_confirmed ou unknown; nenhuma destas respostas expõe cartão ou identificador financeiro. business_verification informa a verificação empresarial explícita e separada do nome aprovado. Confira checked_at/source e acompanhe hookcloud.instance.health_updated. Perfil opcional: meta_profile.messaging_limit e meta_profile.username trazem status, valor, fonte, checked_at, stale e unavailable_reason. O limite moderno é compartilhado pelo portfólio em 24 horas móveis, não saldo disponível. Username reserved não confirma uso ativo; estado ausente permanece null. O cache desses campos é de até 6 horas, independente da evidência de saúde. Mudanças materiais são enviadas em hookcloud.instance.health_updated; mudança apenas de timestamp não gera novo evento. first_connected_at informa a primeira conexão registrada da identidade de número dentro do parceiro; null significa histórico não confirmado. Reconexão e movimentação dentro do mesmo parceiro não reiniciam essa data. Consulte o significado completo nos campos de resposta. Registro do número: phone.status PENDING, PENDING_REGISTRATION ou UNVERIFIED na identidade atual não confirma disponibilidade de envio, mesmo que a WABA informe AVAILABLE. Sem bloqueio, limitação ou restrição real prioritária, connection_health.state e messaging_capability.state ficam unknown, messaging_capability.reason=meta_registration_not_confirmed, ready_to_operate=false e inventory_state=attention. O status técnico connected pode permanecer. issues mantém o código meta_phone_not_confirmed_connected. Exiba “Confirmação pendente na Meta”; não conclua banimento, não desconecte nem crie outro vínculo automaticamente. A regra financeira de 141006 não transforma registro pendente em inventário pronto. Essa classificação usa a evidência já armazenada e não acrescenta GET à Meta; acompanhe o webhook e as datas, sem polling extra. panel_category é a categoria de exibição calculada pela HookCloud: active, processing, verification_pending, account_alert, restricted, banned, callback_review, attention ou disconnected. O Portal reúne históricos confirmados em Substituídos, com o subtipo no próprio card; não há abas separadas de Transferidos ou Encerrados. connection_history registra trocas de identidade confirmadas, com status superseded e subtype meta_identity_replacement. Uma reconexão normal pode atualizar os IDs automaticamente quando a nova autorização e a consulta à Meta comprovam o mesmo número, com o vínculo anterior encerrado. Mover uma instância entre clientes, reconectar sem mudança de IDs ou apenas observar um telefone igual não cria histórico de substituição. Não derive banimento de pagamento, RED ou erro técnico. A categoria não altera vagas nem permissões: use allowed_actions e occupies_slot. Após desconexão concluída, status legado permanece canceled, connection_status é inactive e observation_scope é historical. Falha de callback ou de credencial, isoladamente, não é histórico de desconexão.

O retorno inclui a projeção atual da instância e connection_health. O perfil opcional aparece em ambos; seus timestamps são independentes de refreshed_at. Esta chamada produz uma consulta remota de saúde e escrita local, não apenas uma leitura do cache.

Campos retornados que atualizam o painel

whatsapp_manager_urlstring URI HTTPS ou null

URL HTTPS para o botão Abrir WhatsApp Manager no painel do seu sistema. Campo na raiz da resposta, composto pelos IDs Meta disponíveis; null quando nenhum identificador está disponível. O cliente usa o próprio login e permissões da Meta. Não inclui tokens, não concede acesso nem comprova conexão/saúde. Oculte o botão quando ausente/null; reutilize o link sem refresh ou GET à Meta apenas para exibi-lo.

refreshed_at / operation_id / connection_healthdata ISO | UUID | object

Data da nova consulta de saúde, operação que a realizou e diagnóstico normalizado. Isso não indica que cada informação opcional foi consultada de novo: limite e username podem continuar no cache de até 6 horas.

meta_profile / connection_health.meta_profileobject

Perfil opcional com messaging_limit e username. São informações independentes da saúde e da assinatura. GET individual e refresh incluem meta_profile na projeção da instância; na lista está em cada items[]. Cada fato tem data e fonte próprias. Payload antigo sem esse objeto exige exibição neutra, sem inventar limite ou username.

first_connected_atdata ISO 8601 UTC | null

Primeira evidência registrada e ainda disponível de conexão técnica confirmada para o mesmo meta_phone_number_id dentro deste parceiro. Data ISO 8601 em UTC, ou null se não houver evidência suficiente. Reconexões e movimentações/mesclas entre clientes do mesmo parceiro preservam essa data; outro número Meta ou outro parceiro não herda o histórico. Campo somente de leitura: não use created_at, data de criação do cliente ou connected_at como substitutos. Não afirma a primeira conexão de toda a vida do número, nem envio liberado.

meta_profile.messaging_limit.status / tierstring | null

status=available confirma uma faixa observada; unavailable significa que não foi possível confirmar. tier é a faixa Meta, como TIER_2K ou TIER_UNLIMITED. Não é consumo nem saldo de mensagens disponíveis; null não significa zero ou ilimitado.

meta_profile.messaging_limit.scope / sourcestring | null

business_portfolio + graph_phone_portfolio_limit: campo moderno whatsapp_business_manager_messaging_limit, compartilhado pelos números do portfólio, para usuários únicos fora da janela de atendimento em 24 horas móveis. phone_legacy + graph_phone_legacy_limit: fallback antigo identificado, sem criar capacidade extra. Não multiplique a faixa pela quantidade de números; TIER_UNLIMITED não elimina rate limits e políticas.

meta_profile.username.status / value / lifecycle_statusstring | null

status=available confirma o texto observado em value. lifecycle_status é approved, reserved ou null. Reservado não é ativo/aprovado; texto disponível com estado null deve mostrar situação não confirmada. Username comercial não é o BSUID do destinatário e não substitui recipient no envio.

meta_profile.messaging_limit e username: checked_at / source / stale / unavailable_reasondata ISO | string | boolean | null

Data e origem de cada leitura, validade e motivo de indisponibilidade. Cache de até 6 horas para a identidade/geração exata, inclusive resultado indisponível. stale=true neutraliza positivos; permission_error, field_unavailable, rate_limited e timeout não comprovam ausência do dado. Não recupere valores antigos de metadata para mostrar estado atual.

messaging_limit_tier / business_username / business_username_statusstring | null

Aliases de compatibilidade derivados do meta_profile atual. messaging_limit_tier pode conter o limite moderno do portfólio apesar do nome legado: leia scope/source no objeto completo. Quando não há evidência atual, os aliases ficam nulos; business_username_status não é inferido como ativo a partir do texto.

connection_health.messaging_capability.reasonstring | null

Motivo da classificação de envio. meta_registration_not_confirmed indica PENDING, PENDING_REGISTRATION ou UNVERIFIED no número observado. Sem bloqueio, limitação ou restrição real prioritária, saúde e envio ficam unknown, ready_to_operate=false e inventory_state=attention; status=connected continua sendo apenas vínculo técnico. Não trate WABA AVAILABLE, nome aprovado ou cartão cadastrado como confirmação do registro desse número. O diagnóstico existente meta_phone_not_confirmed_connected continua em issues.

panel_category / connection_health.panel_categorystring

panel_category é a categoria de exibição calculada pela HookCloud: active, processing, verification_pending, account_alert, restricted, banned, callback_review, attention ou disconnected. superseded, transferred e terminated ficam reservadas a um histórico de ciclo de vida explicitamente persistido; o Partner não cria essas situações ao simplesmente mover um número para outro cliente. Não derive banimento de pagamento, RED ou erro técnico. A categoria não altera vagas nem permissões: use allowed_actions e occupies_slot. Após desconexão concluída, status legado permanece canceled, connection_status é inactive e observation_scope é historical. Falha de callback ou de credencial, isoladamente, não é histórico de desconexão.

application_webhookobject | null

Callback individual preparado pela rota configure-partner-instance-webhook. scope=instance, url, status=configured/active/needs_review, applied e datas verified_at/configured_at/applied_at. Não contém o token. applied confirma configuração remota da identidade atual, não entrega/processamento pelo seu sistema; null indica ausência de override individual válido.

Receba as próximas mudanças por webhook

Depois de consultar ou configurar esta operação, seu sistema pode receber os eventos abaixo. Abra para entender o POST recebido, cada campo e o que atualizar no seu cadastro.

Documentação dos payloads recebidos

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 single_identifier_required: informe exatamente um seletor de instância.
  • 404 instance_not_found.
  • 409 meta_phone_number_id_missing: conexão ainda não tem ID Meta.
  • 409 health_observation_commit_failed: a observação não pôde ser gravada; releia o estado antes de repetir.
  • Erros de credencial/Graph podem aparecer como unexpected_error com detalhes.
  • 429 health_refresh_rate_limited: aguarde o cooldown de 30 segundos.
  • 409 stale_connection_generation/instance_operation_in_progress/operation_lease_lost: houve operação concorrente ou geração mudou. Releia antes de repetir.
  • 409 health_evidence_changed: evidência de risco mudou durante a consulta. Releia o estado e respeite o cooldown antes de nova atualização.

Depois desta chamada

  • Atualizar o painel com os nomes/qualidade confirmados.
  • Consultar o erro Meta antes de repetir uma chamada que falhou.

Regras desta operação

  • É uma escrita local e uma chamada remota, apesar de parecer apenas atualização visual.
  • Não altera oficialmente o nome da empresa na Meta nem realiza novo registro de número.
  • O sistema externo é controlado pelo assinante. HookCloud confirma sua conexão/configuração e expõe evidências; callback ativo não garante recebimento/processamento no sistema externo. Não repetir POSTs para atualizar saúde. A atualização deve usar refresh-partner-instance-meta respeitando cooldown/retorno da API.
  • Use os campos adicionais sem remover os campos antigos ao atualizar seu consumidor. Não trate UNKNOWN de qualidade como GREEN, nem pagamento desconhecido como sem cartão. Guia: https://developers.hookcloud.app/connection-health.html
  • Prefira webhooks e o GET local para atualizar o painel. Limite e username usam cache opcional de até 6 horas; refreshed_at da consulta geral não substitui checked_at de cada observação.
  • As informações opcionais indisponíveis ficam neutras e não tornam a conexão bloqueada nem liberada. Não use valores antigos em metadata para preencher o que a Meta não confirmou na identidade atual.
  • Atualização manual não invalida todos os caches: dados empresariais são reutilizados por até 24 horas, pagamento por até 6 horas (24 horas após permission_error) e limite/username por até 6 horas. Eventos pertinentes afetam somente seu domínio, com piso de 15 minutos entre leituras desse domínio. Falhas transitórias podem ter reavaliação após 5 minutos, sempre sujeita ao backoff e ao orçamento global de leitura da Meta.
POSTAjustar o nome provisório da instância
update-partner-instance-label

Ajusta o nome provisório antes da aprovação pela Meta. Depois da aprovação, instance_name acompanha o nome verificado e não pode divergir dele. Não muda o nome na Meta; solicite essa mudança no WhatsApp Manager.

Quando usar

Use para renomear um canal internamente, por exemplo WhatsApp Vendas ou WhatsApp Suporte.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Instância existente do parceiro.
  • Nome interno não vazio de até 160 caracteres.

Autenticação e permissão

Partner API Key ativa com instances.write ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=update-partner-instance-label
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "instance_key": "cliente-001-whatsapp-principal",
  "instance_name": "Nome interno atualizado"
}

O que preencher em cada campo

instance_idstring UUID · Uma alternativa: instance_id ou instance_key.

UUID retornado pelo Partner ao criar a instância. Não use o código externo do cliente neste campo.

Exemplo: 33333333-3333-4333-8333-333333333333

instance_keystring · Alternativa ao UUID interno.

Chave estável da instância no sistema externo. O backend normaliza para minúsculas; uma mesma chave não pode representar números de clientes diferentes.

Exemplo: crm-cliente-001-whatsapp-1

instance_namestring · Obrigatório

Novo nome interno, de 1 a 160 caracteres após limpeza de espaços.

Exemplo: WhatsApp Vendas

labelstring · Opcional

Alias de instance_name. Prefira o campo canônico na sua integração.

Exemplo: WhatsApp Vendas

aliasstring · Opcional

Outra forma compatível de enviar o apelido; não é o username reservado da Meta.

Exemplo: WhatsApp Vendas

Como ler a resposta

Retorna a instância e seu nome canônico. Se existir nome aprovado na Meta, esse nome prevalece. Guarde verified_name, name_status e name_source para explicar a origem no seu painel.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 missing_identifier/missing_instance_name: ausência de recurso ou nome.
  • 400 instance_name_too_long: mais de 160 caracteres.
  • 404 instance_not_found.
  • 500 instance_label_update_failed: falha ao gravar a alteração.
  • 409 instance_name_managed_by_meta: o nome aprovado da Meta é canônico; não pode ser substituído por um nome diferente no Partner.

Depois desta chamada

  • Atualizar o nome interno no seu seletor de canais.
  • Se precisar conferir o nome oficial, usar refresh-partner-instance-meta.

Regras desta operação

  • Não altera username, perfil comercial nem display name aprovado pela Meta.
  • Não renomeia a chave instance_key.
  • Não use esta rota para substituir um nome já aprovado na Meta por um apelido local. O seu sistema pode manter um apelido próprio separado.
POSTRetorna credencial Meta sensível e registra auditoria. Evitar salvar resultado no histórico do seu sistema.
reveal-partner-instance-meta-token

Retorna a credencial Meta em texto para uso autorizado no backend do assinante, junto aos IDs do número/WABA e à versão Graph. É a ponte entre a gestão de conexão do Partner e as chamadas diretas à Graph API. Use o meta_access_token retornado no header Authorization da chamada Graph seguinte.

Quando usar

Use quando o backend precisa executar uma operação Graph com a credencial da instância, ou para diagnosticar a credencial com autorização adequada.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Instância conectada com credencial disponível e acesso operacional permitido.
  • Scope específico instances.credentials.read para API key, ou role JWT autorizada.
  • Ambiente do backend deve tratar o retorno como segredo.

Autenticação e permissão

Partner API Key ativa com instances.credentials.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=reveal-partner-instance-meta-token
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "instance_key": "cliente-001-whatsapp-principal"
}

O que preencher em cada campo

instance_idstring UUID · Uma alternativa; envie exatamente uma: instance_id ou instance_key ou phone_number_id.

UUID retornado pelo Partner ao criar a instância. Não use o código externo do cliente neste campo.

Exemplo: 33333333-3333-4333-8333-333333333333

instance_keystring · Alternativa ao UUID interno.

Chave estável da instância no sistema externo. O backend normaliza para minúsculas; uma mesma chave não pode representar números de clientes diferentes.

Exemplo: crm-cliente-001-whatsapp-1

phone_number_idstring de dígitos · Alternativa às chaves do Partner.

ID técnico do número comercial na Meta. Não é o telefone exibido nem o BSUID do destinatário.

Exemplo: 100000000000001

meta_phone_number_idstring de dígitos · Opcional

Alias de phone_number_id. Prefira o nome canônico nos parâmetros da chamada e não envie os dois com valores diferentes.

Exemplo: 100000000000001

idstring UUID · Opcional

Alias de instance_id neste endpoint de revelação. Não combine com outro seletor.

Exemplo: 33333333-3333-4333-8333-333333333333

Como ler a resposta

Retorna meta_access_token e access_token com a mesma credencial, além de instance_id/instance_key, phone_number_id/meta_phone_number_id, meta_waba_id/waba_id, app_id, graph_version, token_type, token_hint, expires_at, credential_updated_at, nomes e URLs de envio/gestão. Use meta_access_token somente no cabeçalho Bearer da Graph API. Confira se os IDs retornados pertencem à instância que você pretende usar antes de enviar.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 missing_identifier/multiple_identifiers/invalid_instance_id para seleção inválida.
  • 403 para scope/role insuficiente ou bloqueio operacional.
  • 404 instance_not_found.
  • Ausência ou falha de credencial impede o retorno; não prossiga para a Graph com token vazio.
  • 409 integration_disconnect_unconfirmed ou grant_disconnect_unconfirmed: desconexão em confirmação; a credencial não pode ser revelada. Após a conclusão, instance_not_connected impede revelação e o segredo local foi removido. Não faça retry automático nem use cópias antigas do token.

Depois desta chamada

  • Executar a operação Meta pretendida com os IDs correspondentes à credencial.
  • Descartar o token de saídas públicas e logs que não precisam dele.

Regras desta operação

  • Nunca devolver o token ao cliente final em página pública.
  • Não confundir token Meta com API key do Partner, JWT de login ou token do link de conexão.
  • Os aliases reveal-meta-access-token e get-partner-instance-meta-token resolvem o mesmo handler; não são credenciais diferentes.
  • Ao desconectar a integração, cesse o uso de qualquer token já copiado. Uma autorização Meta compartilhada pode continuar válida para outras instâncias; desativação e retirada do segredo na HookCloud não revogam essas cópias externas.
  • Execute somente no servidor. Não grave credenciais no JavaScript entregue ao navegador, localStorage, banco de mensagens, exportação, prompt de IA ou telemetria. Confira partner_id, instance_id, phone_number_id e waba_id da resposta antes da chamada Graph; os escopos são exatos e instances.read não permite revelar credenciais.
  • Antes de despachar uma fila antiga, confira status, cliente, IDs Meta e connection_generation pelo GET local. A geração é um UUID opaco: autorizações novas não devem reutilizar filas, janelas ou credenciais de uma conexão anterior.

Aliases aceitos: reveal-meta-access-token, get-partner-instance-meta-token. Prefira o nome do exemplo.

POSTDesconecta o número com confirmação; o resultado pode concluir, aguardar confirmação ou exigir ação do titular.
deactivate-partner-instance

Solicita o desligamento de um único número, preservando os demais. Para número exclusivo da Cloud API, confirma callback e desregistro. Na coexistência com WhatsApp Business no celular, a Meta não permite /deregister. Quando o escopo da autorização for comprovadamente exclusivo e a Meta permitir a revogação, a HookCloud confirma a remoção do callback, da inscrição do app e a invalidação da autorização. Sem essa prova, não anuncia sucesso: mantém a vaga e apresenta confirmação pendente ou o passo manual no aplicativo.

Quando usar

Use para retirar um número específico de um cliente, preservando os demais números e o cadastro da empresa.

Referência oficial Meta: Números, registro e permissões · Webhooks da Cloud API · Meta: coexistência e desconexão no aplicativo (Offboarding) · Meta: revogação de permissões e invalidação do token de usuário · Meta: Facebook Login for Business e tokens de integração empresarial · Meta: inscrição de aplicativos nos eventos da WABA

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Confirmar a instância correta antes de desligar.
  • Ter acesso à credencial remota necessária para concluir a revogação/desconexão.
  • Solicite primeiro na HookCloud. Aguarde o resultado e siga as instruções retornadas. Não remova previamente a parceria comercial, pois isso pode impedir a conferência do desligamento. O sistema não presume que um token funciona para apenas um número.

Autenticação e permissão

Partner API Key ativa com instances.write ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=deactivate-partner-instance
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "instance_key": "cliente-001-whatsapp-principal",
  "reason": "Encerramento de teste"
}

O que preencher em cada campo

instance_idstring UUID · Uma alternativa: instance_id ou instance_key.

UUID retornado pelo Partner ao criar a instância. Não use o código externo do cliente neste campo.

Exemplo: 33333333-3333-4333-8333-333333333333

instance_keystring · Alternativa ao UUID interno.

Chave estável da instância no sistema externo. O backend normaliza para minúsculas; uma mesma chave não pode representar números de clientes diferentes.

Exemplo: crm-cliente-001-whatsapp-1

reasonstring · Opcional

Motivo do desligamento, gravado na auditoria e no estado da instância.

Exemplo: Número encerrado pelo cliente

Como ler a resposta

Em sucesso retorna ok, instance_id, instance_key, status=canceled, occupies_slot=false, slot_state=released, remote_callback, meta_disconnect, used_slots e slot_limit. A conclusão gera instance.canceled e notificação no sininho, deduplicadas. O cronômetro não confirma remoção nem libera capacidade. Para números coexistentes, meta_disconnect.status=completed, proof_source=phone_callback_removed_local_access_disabled, remote_cleanup_scope=hookcloud_integration e technical_disconnect_confirmed=true significam Desconectado da HookCloud. callback.status=removed confirma a retirada da rota; local_authorization=disabled e local_credential.status=disabled_and_purged confirmam que o acesso local foi desativado e o segredo removido do armazenamento da instância. No POST, token_revocation.status=not_attempted confirma que a revogação global não foi executada; remote_authorization=preserved_shared (ou unknown) distingue a autorização Meta remanescente. No GET, token_revocation.status=local_disabled é a leitura normalizada da desativação local; remote_status=preserved_shared (ou unconfirmed) não equivale a revoked. business_relationship.status=preserved significa que a parceria comercial pode continuar visível no portfólio Meta. remote_cleanup_confirmed=false é correto: esta prova não declara deregistro nem revogação global. Não é obrigatório desconectar o WhatsApp Business no celular para encerrar a integração HookCloud. A revogação global não é tentada quando pode afetar outros números. O caminho anterior grant_revoked_readback, com escopo app_authorization, continua representando revogação realmente confirmada; não transforme uma prova na outra. HTTP 202 com disconnect_status=confirming, safe_to_recheck=true e meta_disconnect.status=pending indica que ainda falta confirmação. O estado real e a capacidade permanecem; a mesma operação pode ser retomada sem repetir seus DELETEs ou outra escrita de resultado incerto. get-partner-instance apenas lê o estado armazenado; não realiza conferência remota. Em confirming, uma etapa posterior ainda não intentada pode ser executada pela primeira vez após as verificações de segurança. Não faça polling de POSTs. HTTP 202 com disconnect_status=awaiting_user e meta_disconnect.status=action_required pode aparecer em solicitações legadas. O campo status preserva o estado técnico real, por exemplo connected. Não marque concluído nem libere a vaga. Se safe_to_recheck=true e recheck_mode=resume_hookcloud_integration, ofereça Retomar desconexão automática, repetindo deactivate-partner-instance para a mesma instance_id/instance_key, operação e geração. Esse modo permite confirmar a rota e desativar o acesso local sem exigir o celular nem revogar um grant compartilhado. O nome legado action_required=disconnect_in_whatsapp_business_app não deve prevalecer sobre message/instructions e recheck_mode atuais. read_only continua significando conferência de uma intenção existente, sem repetir DELETE; retry_safe_preflight é compatibilidade com uma recusa anterior à intenção e pode iniciar as primeiras escritas autorizadas. Sem safe_to_recheck, acompanhe o GET local e os eventos; não repita automaticamente. No GET, disconnect_cleanup (também em connection_health) descreve a conclusão persistida. status=completed, scope=hookcloud_integration e proof_source=phone_callback_removed_local_access_disabled confirmam a retirada da rota do número e a desativação do acesso local. Confira connection_generation, operation_id, confirmed_at, callback.status=removed, local_authorization=disabled e token_revocation.status=local_disabled. remote_authorization=preserved_shared e token_revocation.remote_status=preserved_shared informam que a autorização Meta foi preservada para manter outras conexões; unknown/unconfirmed não afirmam revogação. commercial_relationship.status=unchanged separa a parceria comercial. O contrato anterior scope=app_authorization e proof_source=grant_revoked_readback continua válido quando houve revogação comprovada: token_revocation.status=confirmed_invalid. Campos ausentes ou null não confirmam essas ações. Não são expostos token, segredo ou titular do token. Após PARTNER_REMOVED assinado e validado, o contrato instance.meta_link_removed permanece separado: consulte meta_link.state=removed e a mesma geração. O GET pode não trazer operation depois de arquivada. Não confunda desligamento da integração com exclusão da conta WhatsApp, retirada de parceiros ou encerramento completo da coexistência na Meta.

Campos retornados que atualizam o painel

disconnect_status / action_requiredstring · HTTP 202

confirming: confirmação pendente. awaiting_user pode ser legado retomável; siga message/instructions e recheck_mode=resume_hookcloud_integration sem exigir o celular. HTTP 202 não libera a vaga.

statusstring

Estado técnico atual, por exemplo connected. O campo não passa a action_required no retorno da solicitação.

meta_disconnect.status / operation_id / connection_generationstring / UUID

completed: conclusão comprovada dentro do escopo declarado; pending: falta confirmação; action_required: solicitação anterior retomável quando permitido. operation_id e connection_generation vinculam o resultado à tentativa exata.

occupies_slot / slot_stateboolean / string

A vaga permanece ocupada enquanto falta a confirmação. HTTP 202 e tempo decorrido não liberam capacidade.

message / instructionsstring / array de strings

Explicação e passos para o titular. Apresente no seu painel e mantenha o acompanhamento pelos eventos HookCloud e pelo GET local.

meta_disconnect.proof_source / technical_disconnect_confirmed / remote_cleanup_confirmedstring / boolean

phone_callback_removed_local_access_disabled + hookcloud_integration + technical_disconnect_confirmed=true confirma retirada da rota e desativação local, com grant Meta preservado ou desconhecido. grant_revoked_readback + app_authorization continua comprovando revogação efetiva. remote_cleanup_confirmed=false não afirma deregistro ou retirada comercial.

safe_to_recheckboolean · HTTP 202

Permite uma ação explícita na mesma solicitação. Em confirming, confere as etapas já intentadas sem repetir suas escritas e pode prosseguir com a primeira execução de etapas posteriores ainda não solicitadas. Em awaiting_user, leia recheck_mode para distinguir read_only de retry_safe_preflight. Não equivale, sozinho, a uma garantia de consulta somente de leitura.

disconnect_cleanup (GET)object ou null

No GET, disconnect_cleanup (também em connection_health) descreve a conclusão persistida. status=completed, scope=hookcloud_integration e proof_source=phone_callback_removed_local_access_disabled confirmam a retirada da rota do número e a desativação do acesso local. Confira connection_generation, operation_id, confirmed_at, callback.status=removed, local_authorization=disabled e token_revocation.status=local_disabled. remote_authorization=preserved_shared e token_revocation.remote_status=preserved_shared informam que a autorização Meta foi preservada para manter outras conexões; unknown/unconfirmed não afirmam revogação. commercial_relationship.status=unchanged separa a parceria comercial. O contrato anterior scope=app_authorization e proof_source=grant_revoked_readback continua válido quando houve revogação comprovada: token_revocation.status=confirmed_invalid. Campos ausentes ou null não confirmam essas ações. Não são expostos token, segredo ou titular do token.

recheck_modestring · HTTP 202 awaiting_user

Quando safe_to_recheck=true, leia também recheck_mode na resposta ou em disconnect_action. read_only significa que já existe uma intenção de revogação: depois da ação indicada, o mesmo POST consulta seu resultado sem repetir DELETE. retry_safe_preflight significa que a tentativa anterior parou antes de uma intenção de revogação: um novo POST explícito reavalia as condições de segurança na mesma operação/geração e pode iniciar o desligamento técnico se elas agora forem comprovadas. Nesse segundo modo podem ocorrer as primeiras escritas autorizadas; não o apresente como consulta somente de leitura. Sem safe_to_recheck, acompanhe o evento/GET local e não improvise uma repetição.

meta_disconnect.local_authorization / remote_authorization / token_revocationstring / object

No POST, local_authorization=disabled e local_credential.status=disabled_and_purged confirmam desativação local e retirada do segredo; token_revocation.status=not_attempted não executa revogação Meta. remote_authorization=preserved_shared preserva o grant para outros números; unknown não confirma revogação. No GET, disconnect_cleanup.token_revocation.status=local_disabled é a normalização desse estado. Credenciais já copiadas para sistemas externos não são invalidadas pela desativação local: o integrador deve cessar seu uso.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 404 instance_not_found.
  • 409 remote_callback_removal_failed: callback remoto não foi removido.
  • 409 meta_send_access_revocation_failed / meta_waba_unsubscribe_failed / meta_access_token_revocation_failed: desligamento remoto incompleto.
  • 409 meta_credential_missing_for_hard_disconnect: falta a credencial necessária; a vaga continua contando.

Depois desta chamada

  • Se retornar HTTP 202, mantenha a capacidade ocupada e siga safe_to_recheck/recheck_mode e as instruções atuais, sem repetir automaticamente.
  • Ofereça Retomar desconexão automática para resume_hookcloud_integration e Conferir desconexão para confirmação pendente. Use a mesma instância/operação/geração; uma resposta antiga não pode concluir uma nova conexão.
  • Após status=canceled, occupies_slot=false e slot_state=released, mostre Desconectado da HookCloud e o alcance real de disconnect_cleanup. Confira o GET antes de reduzir pacotes.
  • Se a operação continuar incerta sem ação permitida, encaminhe operation_id e o diagnóstico ao suporte, sem credenciais.

Regras desta operação

  • DELETE precisa de corpo JSON e não apaga fisicamente o cadastro.
  • Um erro não deve ser interpretado como autorização para reduzir a capacidade.
  • Existe fallback legado por external_customer_id no código de mutação, mas o contrato do sistema usa instance_id/instance_key para evitar ambiguidade entre vários números.
  • A remoção de parceria confirmada por webhook Meta assinado tem contrato próprio: instance.meta_link_removed. Ela desabilita a autorização local e libera a vaga do vínculo exato, mas não afirma callback removido ou deregistro executado. Erros Graph genéricos não acionam essa conclusão.
  • Uma operação genericamente failed, needs_review ou stale não autoriza repetir uma mutação remota. Siga safe_to_recheck e recheck_mode quando explicitamente retornados: read_only consulta a intenção; retry_safe_preflight pode iniciar a primeira tentativa segura após recusa anterior ao registro de intenção. Um passo já intentado nunca recebe novo DELETE por essa conferência. Tempo decorrido nunca libera vaga.
  • Callback, autorização do aplicativo e parceria comercial são vínculos distintos. A desconexão técnica não promete remover a empresa HookCloud do portfólio Meta. A retirada ampla de uma relação comercial pode afetar outros números ou ativos entre essas empresas.
  • DELETE /me/permissions revoga uma autorização de aplicativo/usuário; a documentação genérica não garante suporte a todo BISU. A desconexão local da HookCloud não depende dessa revogação quando a autorização é compartilhada: preserve o grant e exponha a prova hookcloud_integration. Não declare revoked sem confirmação independente.
  • A desconexão individual não remove a parceria comercial. O encerramento do cliente por deactivate-partner-customer avalia essa retirada separadamente, preservando relações compartilhadas. O endpoint comercial business/clients seleciona a relação inteira entre dois portfólios, sem seletor de telefone, e pode afetar outros ativos compartilhados entre essas empresas. Ele não é equivalente à revogação da autorização do app.
POSTMove associação de cliente preservando conexão Meta e instance_key.
move-partner-instance-to-customer

Corrige o vínculo de uma única instância para outro cliente do mesmo parceiro. A transferência preserva a instance_key e a conexão Meta; não dispara novo Embedded Signup nem altera o número comercial. É a opção adequada quando o cadastro foi associado à empresa errada.

Quando usar

Use para reorganizar um número entre clientes do mesmo parceiro sem mesclar todos os cadastros.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Instância e cliente de destino pertencentes ao mesmo parceiro.
  • Destino ativo e disponível para receber a instância.
  • Conferir o vínculo atual antes de transferir.

Autenticação e permissão

Partner API Key ativa com instances.write ou *. Se optar por JWT, as funções permitidas são owner, admin.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=move-partner-instance-to-customer
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json",
  "Idempotency-Key": "UUID_UNICO_PARA_ESTA_ALTERACAO"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "instance_id": "UUID_DA_INSTANCIA",
  "target_customer_id": "TARGET_CUSTOMER_ID",
  "reason": "Teste de transferência"
}

O que preencher em cada campo

instance_idstring UUID · Obrigatório

UUID da instância a transferir; a rota não usa instance_key como seletor.

Exemplo: 33333333-3333-4333-8333-333333333333

target_customer_idstring UUID · Obrigatório

UUID do cliente de destino. Não use external_customer_id nesse campo.

Exemplo: 22222222-2222-4222-8222-222222222222

reasonstring · Opcional

Motivo de correção, tratado até 500 caracteres e registrado em histórico/evento.

Exemplo: Correção do vínculo da filial

idempotency_keystring · Opcional

Chave de 8 a 200 caracteres para repetir a mesma transferência; o cabeçalho Idempotency-Key também é aceito e prevalece.

Exemplo: mover-instancia-001-v1

Como ler a resposta

Retorna ok, instance_id, instance_key, source_customer_id, target_customer_id, source_external_customer_id e target_external_customer_id, mais instance_key_unchanged=true e meta_connection_unchanged=true. O evento hookcloud.partner.instance.moved registra a mudança. Reaproveite target_customer_id no vínculo do seu sistema e consulte get-partner-instance para obter o customer final confirmado.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 invalid_instance_move_payload: IDs inválidos.
  • 404 instance_not_found/target_customer_not_found.
  • 409 instance_already_on_target_customer: vínculo já corresponde ao destino.
  • 409 target_customer_unavailable/target_customer_inactive: cadastro não pode receber a instância.

Depois desta chamada

  • Atualizar o vínculo no sistema externo.
  • Conferir a instância e os históricos dos clientes envolvidos.

Regras desta operação

  • Não transfere números entre parceiros diferentes.
  • Preservar conexão Meta não significa trocar a titularidade empresarial da WABA; a operação reorganiza o cadastro interno.
POSTGera link temporário para conexão, reconexão ou substituição explícita de identidade Meta.
create-connect-session

Gera uma nova sessão temporária para conectar ou reconectar uma instância existente. O link contém um token exclusivo dessa jornada, diferente da API key do parceiro. Na reconexão normal, se a Meta devolver novos IDs para o mesmo número, a HookCloud verifica a autorização e atualiza o vínculo automaticamente, preservando instance_id e instance_key. O Portal não solicita IDs técnicos para essa atualização.

Quando usar

Use para fornecer um novo link após expiração, cancelamento ou necessidade de reconexão. Envie mode=reconnect para a instância existente e deixe o responsável concluir o Embedded Signup normalmente. Não é preciso conhecer os novos IDs Meta nem escolher uma ação separada de substituição.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Webhook global habilitado, primário e com verificação GET salva. A HookCloud envia hub.mode=subscribe, hub.verify_token e hub.challenge=1234; seu servidor deve conferir o token e responder HTTP 200 com somente 1234 em texto puro. Testar sem salvar não libera cadastros. Ative também o POST na mesma URL para receber eventos.
  • Instância existente, cliente ativo e controles de cobrança/risco/registro liberados.
  • Para atualizar automaticamente IDs de uma conexão anterior, o vínculo antigo deve ter encerramento confirmado, capacidade liberada e nenhuma operação incerta em andamento.
  • A nova autorização deve permitir que a HookCloud confirme diretamente na Meta o mesmo número completo, o vínculo com a WABA e o portfólio empresarial. Nome ou telefone enviados pelo navegador não são prova.
  • O modo replace permanece como compatibilidade avançada da API: exige expected_connection_generation e replacement_target exatos. Não é necessário para a reconexão normal do mesmo número.

Autenticação e permissão

Partner API Key ativa com instances.write ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=create-connect-session
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "instance_key": "cliente-001-whatsapp-principal",
  "mode": "connect"
}

O que preencher em cada campo

instance_idstring UUID · Uma alternativa: instance_id ou instance_key.

UUID retornado pelo Partner ao criar a instância. Não use o código externo do cliente neste campo.

Exemplo: 33333333-3333-4333-8333-333333333333

instance_keystring · Alternativa ao UUID interno.

Chave estável da instância no sistema externo. O backend normaliza para minúsculas; uma mesma chave não pode representar números de clientes diferentes.

Exemplo: crm-cliente-001-whatsapp-1

modestring · Opcional

connect inicia uma conexão; reconnect retoma a instância existente. Se os IDs Meta mudaram, a HookCloud pode atualizá-los automaticamente após nova autorização e prova do mesmo número com vínculo anterior encerrado. O modo avançado replace permanece compatível e exige expected_connection_generation e replacement_target. Gerar o link não conclui a conexão.

Exemplo: reconnect

expected_connection_generationstring UUID · Somente no modo avançado legado replace; não envie na reconexão normal.

UUID opaco da geração atual retornado por get-partner-instance. Não é um contador; envie o valor exato lido. Se a geração mudar, releia o estado e peça confirmação antes de criar outra substituição.

Exemplo: 55555555-5555-4555-8555-555555555555

replacement_targetobject JSON · Somente no modo avançado legado replace; não envie na reconexão normal.

Destino exato: meta_waba_id e meta_phone_number_id são strings de 5 a 30 dígitos; meta_business_id é opcional e, se informado, também deve corresponder. A empresa selecionada no Embedded deve corresponder ao destino autorizado. Mesmo telefone visível não prova a mesma identidade.

Exemplo: {"meta_waba_id":"100000000000002","meta_phone_number_id":"100000000000003","meta_business_id":"100000000000004"}

return_urlstring URL · Opcional

Destino de retorno ao sistema do assinante. Quando omitido, esta rota pode usar default_return_url do parceiro.

Exemplo: https://sistema.example.com/clientes/001

cancel_urlstring URL · Opcional

Destino após cancelamento da jornada. Pode herdar default_cancel_url do parceiro.

Exemplo: https://sistema.example.com/conexao/cancelada

success_urlstring URL · Opcional

Destino específico de sucesso. Deve apontar para uma página sua que consulte o estado confirmado da instância.

Exemplo: https://sistema.example.com/conexao/concluida

error_urlstring URL · Opcional

Destino específico para erro na conexão. A página deve explicar como retomar o fluxo sem repetir indiscriminadamente o registro Meta.

Exemplo: https://sistema.example.com/conexao/erro

ttl_hoursnumber · Opcional

Validade do link em horas, como número finito positivo entre 1/60 de hora (1 minuto) e 168 horas (7 dias). Omissão, null ou valor não positivo utiliza a duração padrão configurada, com fallback de 24 horas. Texto, números não finitos e valores positivos inferiores a 1/60 de hora ou acima de 168 retornam 400 invalid_ttl_hours antes de criar registros. Guarde connect_expires_at como prazo exato e gere uma nova sessão quando necessário.

Exemplo: 24

metadataobject JSON · Opcional

Metadados próprios da sessão. O servidor acrescenta/sobrescreve mode, requested_mode, reconnect e requested_at para refletir a decisão efetiva.

Exemplo: {"origem":"crm","atendimento_id":"001"}

Como ler a resposta

HTTP 201 com ok, instance_id, connect_session_id, connect_url e expires_at. Envie connect_url ao titular para concluir a autorização na Meta. Quando novos IDs são confirmados para o mesmo número, o backend preserva instance_id/instance_key, grava o histórico anterior e emite instance.identity_replaced com reason=automatic_same_phone_identity_replacement. O GET passa a trazer os novos IDs. No modo avançado replace, reason=explicit_meta_identity_replacement. Abrir ou gerar o link não confirma nenhuma troca; uma jornada incompleta não fabrica histórico.

Receba as próximas mudanças por webhook

Depois de consultar ou configurar esta operação, seu sistema pode receber os eventos abaixo. Abra para entender o POST recebido, cada campo e o que atualizar no seu cadastro.

Documentação dos payloads recebidos

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 409 partner_webhook_verification_required: configure, valide e salve o webhook em Endpoints/update-partner-webhook-endpoint antes de tentar criar cliente, instância ou sessão. A validação avulsa não libera a operação. Consulte get-partner-onboarding-status.
  • 400 missing_identifier.
  • 404 instance_not_found.
  • 429 meta_registration_rate_limited: aguarde a liberação indicada; gerar links repetidos não remove o bloqueio Meta.
  • Bloqueios do cliente, de risco, cobrança ou capacidade podem impedir nova sessão.
  • 423 meta_risk_customer_blocked: o cliente atingiu a política BAN/RED ou revisão manual; leia customer_risk. Vagas livres do parceiro não removem a trava. Não recadastre o cliente para contornar o histórico.
  • 400 invalid_replacement_request: geração ausente/inválida ou IDs do destino inválidos.
  • 409 replacement_requires_confirmed_disconnect: o vínculo anterior ainda não tem encerramento confirmado; desconecte e reconcilie antes de substituir.
  • 409 stale_connection_generation ou replacement_authorization_stale: a identidade mudou; consulte a instância, sem reutilizar a autorização antiga.
  • 409 replacement_identity_unchanged: o destino é a mesma identidade; utilize reconexão.
  • 409 replacement_target_mismatch: a seleção Meta não corresponde à autorização. Não tente outro número silenciosamente.
  • 409 instance_operation_in_progress: existe uma operação concorrente; aguarde e consulte seu resultado.
  • 409 billing_sync_required: o período de cobrança ou trial confirmado expirou e precisa ser reconciliado. O proprietário deve abrir Assinatura no Portal e clicar em Atualizar para consultar a Stripe; se persistir, procurar o suporte. Não repita novas criações automaticamente. Isso não confirma recusa do cartão nem desconecta números já ativos.
  • 400 invalid_ttl_hours: envie ttl_hours como número finito; se positivo, entre 1/60 de hora (1 minuto) e 168 horas (7 dias), nunca texto ou Infinity. Omissão, null ou valor não positivo usa o padrão configurado (fallback 24h). A rejeição ocorre antes de criar registros.
  • 409 replacement_phone_mismatch: a Meta confirmou outro número. Use uma nova instância para outro número; a reconexão automática preserva a identidade do titular atual.
  • 409 replacement_phone_unconfirmed ou replacement_business_unconfirmed: a nova autorização não forneceu prova suficiente do número ou portfólio. Confira as permissões e retome com uma nova sessão; não altere IDs manualmente para contornar a verificação.

Depois desta chamada

  • Crie a sessão normal com instance_key e mode=reconnect e abra connect_url no navegador.
  • Conclua a autorização do mesmo número na Meta. A HookCloud verifica novos IDs e aplica a atualização quando necessário.
  • Reconcilie pelo get-partner-instance e atualize seu cache com os IDs retornados. Se houve troca de identidade, deduplique instance.identity_replaced por event_id e confira connection_generation.

Regras desta operação

  • A geração de um link não valida o número nem conclui OAuth.
  • Reconectar a mesma instância que já ocupa uma vaga não consome outra vaga. Uma instância desconectada que já liberou a capacidade só volta a ocupá-la se houver vaga disponível. A cobrança, o risco e a identidade continuam sendo verificados.
  • Se a conclusão informar number_capacity_check_unavailable ou connection_update_in_progress, consulte o estado da instância e da sessão antes de tentar novamente. Esses erros não confirmam falta de vagas; não oriente a compra de outro pacote. Após etapas concluídas na Meta, não repita a autorização OAuth para tentar atualizar o resultado.
  • Não compartilhe connect_url em logs públicos: ele contém uma capacidade temporária.
  • URLs de retorno devem ser destinos controlados pela integração, sem dados sensíveis desnecessários na query.
  • Reservas técnicas novas e seguras têm TTL de 15 minutos, com limpeza na próxima solicitação de reserva. GET e passagem do tempo não liberam a vaga por si só. Reservas legadas, números em uso, callback ativo/incerto, configuração parcial e operação remota processing/needs_review permanecem protegidos. Não é carência de cobrança.
  • metadata não autoriza substituir nem escrever o histórico. A autorização é criada no servidor, vinculada ao parceiro, cliente, instância, sessão, geração anterior e destino exato. Erro ou timeout após uma escrita exige consultar o resultado antes de repetir.
  • O estado autoritativo da configuração vem de get-partner-onboarding-status. URL presente ou token configurado, isoladamente, não confirmam GET validado. Atualizações de um cliente já existente não são tratadas como novo cadastro.
  • A atualização automática não troca um número por outro, não retira números de outro cliente e não contorna BAN/RED, cobrança, capacidade ou desconexão remota incerta. O histórico permanece somente leitura.

Webhooks e endpoints

Validar o endereço do seu sistema, trocar o destino e acompanhar a migração.

GETConferir liberação inicial do parceiro
get-partner-onboarding-status

Informa a confirmação da contratação, a conclusão do cadastro obrigatório do proprietário e a validação salva do webhook global. A resposta contém apenas estados de liberação, sem CPF, CNPJ, nome ou celular. Use os booleanos para orientar a ativação; a autorização final continua sendo conferida no servidor.

Quando usar

Na entrada no painel e após cada etapa: assinatura, cadastro do proprietário ou webhook salvo/revalidado. A consulta usa dados locais e não chama a Graph API ou a Receita Federal.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • Partner API Key com webhook.read ou login de membro owner/admin/developer do mesmo parceiro.

Autenticação e permissão

Partner API Key ativa com webhook.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-partner-onboarding-status
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

Esta operação não exige campos adicionais. A identidade do parceiro vem da autenticação.

Como ler a resposta

Retorna ok, partner_id, checkout_confirmed, registration_required, registration_complete, can_configure_webhook, webhook_required, webhook_validated, can_create_customer, can_create_instance e webhook. Use os booleanos explicitamente; em falha ou ausência de resposta, não considere a operação liberada. Contas existentes ou internas já habilitadas comercialmente não precisam de outro cartão, mas também devem preencher os dados obrigatórios.

Campos retornados que atualizam o painel

checkout_confirmedboolean

A confirmação comercial registrada já permite o acesso/operação segundo as regras da conta. Um retorno à página de sucesso da Stripe não muda esse campo sozinho.

registration_requiredboolean

Sempre true: o proprietário deve informar no Portal os dados obrigatórios de pessoa física ou jurídica. Essa etapa não pode ser concluída por Partner API Key.

registration_completeboolean

Confirma que os dados obrigatórios foram salvos com formato e dígitos verificadores aceitos. Não comprova identidade, titularidade, existência do documento ou situação ativa na Receita; não é uma análise manual concluída.

can_configure_webhookboolean

Liberação para iniciar a etapa do webhook global. Não presuma true apenas porque a contratação foi confirmada; o cadastro obrigatório também precisa estar concluído.

webhook_requiredboolean

Indica que novos cadastros dependem da configuração do webhook.

webhook_validatedboolean

Existe evidência de GET validado para a URL atualmente salva, habilitada e primária. Não comprova POST.

can_create_customer / can_create_instanceboolean

Permissão atual do servidor para oferecer cada criação. Não substitui a verificação de capacidade, risco, cliente e assinatura ao executar a operação.

webhookobject

Resumo da URL e do estado de validação. Sem verify token ou segredo de assinatura. GET validado não significa que o receptor POST processa eventos.

access_basisinternal_lifetime | stripe

Origem comercial considerada pelo servidor. internal_lifetime identifica conta interna previamente liberada; o cliente não pode escolher esse acesso pela consulta.

webhook.url / status / verified_atstring ou null / enum / ISO 8601 ou null

URL e evidência salvas. status=verified, verification_required ou not_configured. verified_at só representa a validação do GET, não a última entrega POST.

webhook.verification_challenge / post_delivery_verifiedstring / boolean

1234 é o desafio diagnóstico da HookCloud. post_delivery_verified permanece false: a leitura não comprova processamento de eventos pelo seu receptor.

Erros e como agir

  • 401/403: confira autenticação, escopo e vínculo com o parceiro.
  • Falha na consulta não deve ser tratada como liberação; mantenha novos cadastros bloqueados e permita tentar a leitura novamente.

Depois desta chamada

  • Se a contratação não estiver confirmada, abra Assinatura e aguarde a confirmação da Stripe.
  • Se registration_complete=false, o proprietário deve entrar no Portal e concluir o cadastro: PF com nome completo, celular e CPF; PJ com razão social, CNPJ, nome completo do responsável e celular. Uma API key não pode substituir esse preenchimento.
  • Se webhook_validated=false, abra Endpoints ou use update-partner-webhook-endpoint com o GET preparado e o token correto.
  • Ative o POST na mesma URL e valide eventos reais no seu sistema; depois crie clientes e instâncias quando can_create_* permitir.

Regras desta operação

  • Esta é uma consulta armazenada na HookCloud: não faz chamadas à Meta e não testa o webhook em cada leitura.
  • Não use polling rápido. Releia ao abrir o painel, ao concluir uma etapa ou depois de uma alteração.
  • Um token salvo ou teste GET avulso bem-sucedido não substitui a evidência de validação persistida para o endpoint atual.
  • Não envie verify token, API key ou dados de cartão para o navegador do cliente final.
POSTDefinir webhook de uma instância
configure-partner-instance-webhook

Define um callback próprio para uma única instância. O destino precisa passar pela verificação GET e ter o POST preparado. A configuração individual é preservada na conclusão e reconexão do Connect e nas migrações do webhook global; não troca a URL dos outros números nem do endpoint primário.

Quando usar

Use somente quando um número precisa entregar seus eventos Meta a uma aplicação diferente do webhook global. Para o fluxo comum com um único receptor do seu SaaS, mantenha o webhook global.

Referência oficial Meta: Webhooks da Cloud API · Números comerciais na Meta

Antes de começar

  • Backend autenticado com Partner API Key e escopo exato webhook.write; membros do Portal precisam ser owner/admin. O acesso operacional e o cliente ativo são conferidos.
  • A instância deve estar conectada/pausada, encerrada com vaga liberada ou ainda não autorizada sem phone_number_id; uma operação pendente ou estado incerto impede a mudança.
  • Prepare HTTPS público com GET e POST, sem redirecionamento. O GET confere hub.mode=subscribe e hub.verify_token, e devolve somente hub.challenge em texto puro.
  • Antes de aceitar POSTs, estabeleça com a HookCloud a autenticação disponível para sua integração. O callback recebe mensagens/status diretamente da Meta; esta rota não entrega o App Secret do app nem cria um relay público assinado com segredo do parceiro.

Autenticação e permissão

Partner API Key ativa com webhook.write ou *. Se optar por JWT, as funções permitidas são owner, admin.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=configure-partner-instance-webhook
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "instance_id": "UUID_DA_INSTANCIA",
  "webhook_url": "https://integracao.example.com/webhooks/whatsapp",
  "meta_verify_token": "TOKEN_DE_VERIFICACAO_FICTICIO"
}

O que preencher em cada campo

partner_idUUID · Opcional para Partner API Key; obrigatório para administração

A identidade do parceiro é resolvida pela credencial. Quando informado, precisa coincidir com o parceiro autorizado.

Exemplo: 11111111-1111-4111-8111-111111111111

instance_idUUID · Obrigatório

UUID da instância existente do parceiro. Esta rota não aceita instance_key ou external_customer_id como seletor e não cria um número.

Exemplo: 33333333-3333-4333-8333-333333333333

webhook_urlURL HTTPS · Obrigatório

Destino público do número. Não pode conter fragmento, credenciais embutidas, host privado ou porta não permitida. O verificador não segue redirecionamentos. Essa troca afeta os próximos eventos Meta do número; preserve o receptor anterior enquanto trata entregas já em trânsito.

Exemplo: https://integracao.example.com/webhooks/whatsapp

meta_verify_tokenstring · Obrigatório

Mesmo token aceito no desafio GET do seu servidor: de 1 a 512 caracteres, sem espaços ou controles. É armazenado cifrado e não volta na resposta. Não valida POST nem equivale ao token Meta, Partner API Key ou segredo HMAC.

Exemplo: TOKEN_DE_VERIFICACAO_FICTICIO

Como ler a resposta

HTTP 200 retorna {ok:true,instance_id,application_webhook:{scope:"instance",url,verified_at,configured_at,status,applied,applied_at}}; pode incluir unchanged:true quando a mesma configuração já estava válida. configured e applied:false significam destino preparado para uma conexão futura. active e applied:true confirmam aplicação à identidade atual. needs_review informa resultado remoto não confirmado. Não retorna partner_id na raiz, token de verificação ou segredo HMAC. Consulte get-partner-instance para conferir a identidade, connection_generation e application_webhook.

Campos retornados que atualizam o painel

application_webhookobject

scope=instance; url é o destino específico. status pode ser configured, active ou needs_review. applied só é true quando configuração e callback ativo da identidade atual coincidem.

application_webhook.verified_at / configured_at / applied_atdata ISO 8601 | null

Datas distintas da verificação GET, persistência da configuração e aplicação remota. applied_at pode ser null enquanto não aplicado.

Erros e como agir

  • 400 invalid_instance_id ou invalid_meta_verify_token: confira UUID e token.
  • 404 instance_not_found: a instância não pertence ao parceiro autorizado ou não existe.
  • 409 instance_operation_in_progress, application_webhook_connection_uncertain ou stale_connection_generation: reconcilie a operação/identidade antes de tentar novamente.
  • 409 application_webhook_remote_unconfirmed ou 503 application_webhook_configuration_failed: o resultado pode ser incerto; consulte a instância e a operação antes de repetir.
  • 422 webhook_verification_failed: HTTPS ou desafio GET não confirmado. Erros específicos de URL também podem ser retornados.
  • 403 webhook_management_forbidden: membro sem papel owner/admin; API Key requer webhook.write.

Depois desta chamada

  • Leia get-partner-instance e confirme application_webhook.applied=true após a conclusão da conexão.
  • Associe os eventos Meta por metadata.phone_number_id e, quando aplicável, entry.id/WABA; confira se pertencem à identidade atual.
  • Persista os eventos com deduplicação antes de responder 2xx; não considere o GET bem-sucedido uma prova de entrega do POST.

Regras desta operação

  • Não use esta rota para mudar o webhook global do parceiro. Para isso existe update-partner-webhook-endpoint.
  • Idempotency-Key não é um contrato de repetição desta rota. A mesma configuração confirmada pode retornar unchanged:true; timeout, operação processing ou needs_review exige reconciliação, sem retry cego.
  • As migrações globais ignoram instâncias que possuem configuração individual válida. Não existe nesta rota uma operação de remoção do override; não invente DELETE ou envie URL vazia para voltar ao global.
  • O verify token é apenas do GET. X-Hub-Signature-256 é calculada pela Meta com o App Secret, que não é fornecido ao assinante. A presença desse cabeçalho não prova autenticidade para um receptor sem o verificador apropriado.
  • Eventos normalizados HookCloud, como hookcloud.instance.health_updated e hookcloud.meta.template.updated, continuam seguindo as inscrições do endpoint global; configurar o callback individual não migra esses eventos para o novo receptor.
GETConsulta endpoint e situação da migração sem segredo de assinatura/token de verificação.
get-partner-webhook-endpoint

Consulta a configuração do endpoint primário do parceiro e o resumo da migração de callbacks. A resposta foi desenhada para leitura operacional e omite o token de verificação, o segredo de assinatura e cabeçalhos personalizados. Permite descobrir se falta configurar o destino antes de fornecer links de conexão aos clientes.

Quando usar

Use na inicialização da integração, antes de gerar sessões e para acompanhar o estado geral após uma troca de URL.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Credencial de leitura do endpoint do parceiro; não é preciso informar partner_id na operação normal.

Autenticação e permissão

Partner API Key ativa com webhook.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-partner-webhook-endpoint
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

Esta operação não exige campos adicionais. A identidade do parceiro vem da autenticação.

Como ler a resposta

Retorna ok, partner_id e endpoint. endpoint=null significa que não há endpoint disponível. Quando existe, inclui id, name, url, enabled, is_primary, migration_status, current_migration_id, previous_url, contagens total/concluída/falha/pendente, última migração/erro e meta_verify_token_configured. Guarde current_migration_id para consultar os itens detalhados.

Receba as próximas mudanças por webhook

Depois de consultar ou configurar esta operação, seu sistema pode receber os eventos abaixo. Abra para entender o POST recebido, cada campo e o que atualizar no seu cadastro.

Documentação dos payloads recebidos

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 500 webhook_endpoint_lookup_failed: falha de leitura.
  • Bloqueios de autenticação/scope não devem ser tratados como endpoint ausente.

Depois desta chamada

  • Se endpoint=null, validar e cadastrar o endpoint.
  • Se houver migração pendente/falha, consultar get-partner-webhook-migration antes de trocar a URL novamente.
  • Para autorizar botões de novo cadastro, use get-partner-onboarding-status; não deduza autorização apenas da existência de URL ou meta_verify_token_configured.

Regras desta operação

  • meta_verify_token_configured=true apenas confirma existência do segredo; não revela seu valor.
  • Ter URL cadastrada não comprova que o sistema externo processa todos os tipos de eventos.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
POSTEnvia challenge GET ao endpoint externo, sem persistir a configuração; pode retornar token de verificação.
validate-partner-webhook-endpoint

Executa um desafio HTTP GET contra a URL informada no padrão Meta: hub.mode=subscribe, hub.verify_token e hub.challenge=1234. O destino compara o token e devolve HTTP 200 com somente 1234 em texto puro. O servidor do assinante deve devolver qualquer hub.challenge válido recebido, não fixar sempre 1234. Essa rota não salva a configuração nem libera criação de clientes, instâncias ou novas sessões.

Quando usar

Use antes do primeiro cadastro de endpoint ou para testar um novo destino enquanto a URL atual continua configurada.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Endpoint público HTTPS que aceite GET de verificação.
  • Implementar comparação de hub.verify_token com o segredo acordado e resposta textual do challenge.
  • O destino precisa responder em até 10 segundos, com corpo limitado a 4096 bytes e sem redirect.

Autenticação e permissão

Partner API Key ativa com webhook.write ou *. Se optar por JWT, as funções permitidas são owner, admin.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=validate-partner-webhook-endpoint
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "webhook_url": "WEBHOOK_URL",
  "meta_verify_token": "WEBHOOK_VERIFY_TOKEN"
}

O que preencher em cada campo

webhook_urlstring URL HTTPS · Obrigatório

URL pública que receberá as verificações e eventos da integração. Precisa usar HTTPS, sem usuário/senha embutidos, porta padrão 443 e sem host/IP privado bloqueado. A verificação não segue redirects.

Exemplo: https://integracao.example.com/webhook/meta

meta_verify_tokenstring · Opcional

Segredo de verificação comparado pelo endpoint ao receber hub.verify_token. Se omitido, reutiliza o existente ou gera um novo; não enviar texto vazio. Não é access token Meta nem segredo de assinatura HMAC dos eventos.

Exemplo: TOKEN_DE_VERIFICACAO_FICTICIO

Como ler a resposta

Retorna ok, partner_id, webhook_url normalizada, meta_verify_token e verification. verification contém ok, status_code, duration_ms e challenge_verified=true. Preserve o mesmo verify token para a etapa de atualização, principalmente se ele foi gerado automaticamente; sucesso aqui não persiste o endpoint. O diagnóstico identifica GET, challenge=1234, challenge_verified=true e post_delivery_verified=false: o GET não comprova que o POST esteja recebendo ou persistindo eventos.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 webhook_url_required: URL não informada.
  • 400 meta_verify_token_required: foi fornecido token vazio.
  • 422 webhook_endpoint_validation_failed: HTTPS/host inválido, timeout, redirect, status não bem-sucedido ou corpo diferente do challenge.

Depois desta chamada

  • Corrigir o handshake no destino se necessário.
  • Executar update-partner-webhook-endpoint com a mesma URL e o token confirmado.

Regras desta operação

  • Um retorno JSON como {challenge:...} não corresponde ao texto puro esperado pelo verificador.
  • Esta operação realiza um GET real no destino; não testa o consumo do POST de eventos.
  • O valor meta_verify_token retornado é sensível.
POSTValida callback, salva configuração e agenda migração atômica das assinaturas Meta. Migração pendente/parcial/falha bloqueia nova troca.
update-partner-webhook-endpoint

Define o endpoint primário do parceiro e inicia a migração dos callbacks associados às instâncias já operacionais. Primeiro valida o handshake remoto; depois uma transação grava endpoint, migração, itens e fila juntos. A conclusão das chamadas Meta acontece por processamento de fila, portanto uma resposta aceita não significa que todos os números já trocaram de destino. Também persiste a evidência da validação GET da URL salva; isso é obrigatório antes de novos clientes, instâncias e sessões. A mesma URL pode ser revalidada sem obrigar a criação de outro endpoint.

Quando usar

Use no primeiro cadastro do endpoint ou quando mudar o domínio/caminho que receberá os eventos.

Referência oficial Meta: Números, registro e permissões · Webhooks da Cloud API

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • A HookCloud envia hub.mode=subscribe, hub.verify_token e hub.challenge=1234; seu servidor deve conferir o token e responder HTTP 200 com somente 1234 em texto puro. Testar sem salvar não libera cadastros. Ative também o POST na mesma URL para receber eventos.
  • Handshake HTTPS previamente implementado no destino.
  • Não pode existir migração pending, processing, partial ou failed sem conclusão/retry.
  • Avaliar as instâncias que já estão conectadas; elas podem precisar de reconfiguração remota.

Autenticação e permissão

Partner API Key ativa com webhook.write ou *. Se optar por JWT, as funções permitidas são owner, admin.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=update-partner-webhook-endpoint
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "webhook_url": "WEBHOOK_URL",
  "meta_verify_token": "WEBHOOK_VERIFY_TOKEN",
  "reason": "Teste de atualização do endpoint",
  "batch_size": 3
}

O que preencher em cada campo

webhook_urlstring URL HTTPS · Obrigatório

URL pública que receberá as verificações e eventos da integração. Precisa usar HTTPS, sem usuário/senha embutidos, porta padrão 443 e sem host/IP privado bloqueado. A transação de atualização limita a URL a 4096 caracteres. A verificação não segue redirects.

Exemplo: https://integracao.example.com/webhook/meta

reasonstring · Obrigatório

Justificativa de 3 a 1000 caracteres. Fica registrada com o ator da mudança e ajuda a explicar por que a URL anterior foi substituída.

Exemplo: Mudança do endpoint para o novo domínio

meta_verify_tokenstring · Opcional

Segredo de verificação comparado pelo endpoint ao receber hub.verify_token. Se omitido, reutiliza o existente ou gera um novo; não enviar texto vazio. Máximo de 1024 caracteres na atualização. Não é access token Meta nem segredo de assinatura HMAC dos eventos.

Exemplo: TOKEN_DE_VERIFICACAO_FICTICIO

batch_sizeinteger · Opcional

Quantidade de itens por lote, entre 1 e 10; padrão 3. Não representa limite total de números a migrar.

Exemplo: 3

Como ler a resposta

Retorna ok, changed, partner_id, endpoint_id, webhook_url, migration_id e meta_verify_token. Quando há alteração, inclui migration_status, total_instances e queue (id/status ou null). HTTP 202 com migration_status=pending indica trabalho remoto em andamento; HTTP 200 ocorre quando não há itens para migrar ou a URL/token já estavam iguais. changed=false pode vir com reason=webhook_url_unchanged. Reaproveite migration_id para acompanhamento.

Receba as próximas mudanças por webhook

Depois de consultar ou configurar esta operação, seu sistema pode receber os eventos abaixo. Abra para entender o POST recebido, cada campo e o que atualizar no seu cadastro.

Documentação dos payloads recebidos

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 reason_required/invalid_batch_size/invalid_meta_verify_token: parâmetros fora do contrato.
  • 400 webhook_verification_failed: a URL não passou no handshake HTTPS.
  • 409 webhook_migration_in_progress: concluir ou repetir a migração existente antes de outra troca.
  • 500 partner_webhook_endpoint_update_failed: não foi possível concluir o compromisso da configuração.

Depois desta chamada

  • Consulte get-partner-onboarding-status e confira webhook_validated e can_create_customer/can_create_instance. GET válido não prova o recebimento de POST; mantenha o receptor POST ativo.
  • Consultar get-partner-webhook-migration até a situação final.
  • Se houver partial/failed, corrigir a causa e usar retry-partner-webhook-migration.
  • Confirmar endpoint e contagens antes de desligar o destino anterior.

Regras desta operação

  • Não enviar várias mudanças de URL em paralelo.
  • Não interpretar HTTP 202 como migração concluída.
  • O token retornado deve corresponder ao segredo aceito pelo endpoint; não confundir com a chave da API do Partner.
  • Instâncias com application_webhook válido preservam seu destino individual durante a migração global. A troca do endpoint primário não remove esses overrides.
  • Esta resposta fornece meta_verify_token, mas não webhook_secret. O segredo HMAC dos eventos HookCloud precisa estar provisionado separadamente; o GET do endpoint também não o revela. Não aceite eventos não autenticados enquanto essa etapa estiver pendente e não use o verify token no lugar do segredo.
GETConsulta migração específica ou atual/mais recente. Exige permissão de gestão mesmo sendo consulta.
get-partner-webhook-migration

Mostra o registro de uma migração e os itens de reconfiguração por instância, permitindo distinguir pendência de fila de uma falha concreta na Meta. Apesar de ser uma consulta, a rota utiliza a permissão de gestão webhook.write e a role de gestão de endpoint, porque devolve o contexto completo da migração.

Quando usar

Use após atualizar o endpoint, ao investigar callbacks ainda no destino antigo ou antes de decidir por um retry.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Ter migration_id retornado pela atualização, ou aceitar consultar a migração mais recente do parceiro.

Autenticação e permissão

Partner API Key ativa com webhook.write ou *. Se optar por JWT, as funções permitidas são owner, admin.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-partner-webhook-migration
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

migration_idstring UUID · Opcional

Seleciona uma migração específica do próprio parceiro. Se omitido, consulta a mais recente; não assume necessariamente uma migração em execução.

Exemplo: 44444444-4444-4444-8444-444444444444

Como ler a resposta

Retorna ok, partner_id, migration e items. Sem migração, migration=null e items=[]. migration contém o registro completo, incluindo status, URLs, motivo, contagens, datas e token de verificação. items inclui id, partner_instance_id, meta_phone_number_id, URLs antiga/nova, status, attempt_count, max_attempts, next_retry_at, last_error e datas. A consulta limita os itens a 1000 e não oferece paginação neste contrato.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 invalid_migration_id: ID não é UUID.
  • 500 partner_webhook_migration_lookup_failed: falha de leitura.
  • Ausência de registro é retornada como migration=null; não é confirmação de que um ID arbitrário existiu.

Depois desta chamada

  • Ler items[].last_error para resolver a causa das falhas.
  • Usar retry apenas em migração partial/failed.
  • Consultar a instância individual se o resumo da migração e o estado do callback exigirem diagnóstico adicional.

Regras desta operação

  • A resposta contém dados sensíveis, incluindo meta_verify_token no registro da migração.
  • Não exponha esse resultado em tela pública.
  • Para parceiros com mais de 1000 itens na migração, esta rota não fornece sozinha a relação completa paginada.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
POSTReagenda itens com falha de migração parcial/falha e reconfigura callbacks na Meta.
retry-partner-webhook-migration

Reabre os itens com falha de uma migração partial/failed, zera suas tentativas e agenda novo processamento. A ação usa a mesma intenção de destino registrada na migração; ela não é uma segunda troca independente de URL.

Quando usar

Use quando a causa da falha de migração foi corrigida e os números pendentes precisam repetir a configuração remota.

Referência oficial Meta: Números, registro e permissões · Webhooks da Cloud API

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Migração existente do próprio parceiro com status partial ou failed.
  • Examinar last_error antes de repetir.
  • Ter itens failed ou pending para processar.

Autenticação e permissão

Partner API Key ativa com webhook.write ou *. Se optar por JWT, as funções permitidas são owner, admin.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=retry-partner-webhook-migration
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "migration_id": "MIGRATION_ID",
  "batch_size": 3
}

O que preencher em cada campo

migration_idstring UUID · Obrigatório

ID da migração que deve ser retomada.

Exemplo: 44444444-4444-4444-8444-444444444444

batch_sizenumber · Opcional

Tamanho pretendido do lote; padrão 3. O helper de fila limita o valor entre 1 e 10. Envie inteiro nesse intervalo; esta rota não faz a mesma validação estrita de inteiro presente na atualização inicial.

Exemplo: 3

Como ler a resposta

HTTP 202 com ok, migration_id, reset_items e queue. reset_items é o número de itens failed redefinidos, não a quantidade já corrigida na Meta. queue contém id e status da tarefa agendada ou reaproveitada. Acompanhe a mesma migração até a situação final.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 invalid_migration_id.
  • 404 webhook_migration_not_found.
  • 409 webhook_migration_not_retryable: status não é partial/failed.
  • 409 webhook_migration_no_failed_items: não há itens failed ou pending.
  • 500 partner_webhook_migration_retry_failed: falha ao preparar o reprocessamento.

Depois desta chamada

  • Consultar get-partner-webhook-migration e avaliar a evolução das contagens.
  • Se a mesma causa reaparecer, tratar credencial/endpoint/número antes de nova repetição.

Regras desta operação

  • Não use retry contínuo como substituto de corrigir um erro de autorização ou handshake.
  • Uma resposta 202 apenas agenda; não libera automaticamente a possibilidade de trocar a URL novamente.

Catálogo de templates no Partner

Consultar os modelos conhecidos, os campos a preencher e a atualização do catálogo.

GETLista catálogo em cache dos templates de WABAs pertencentes ao parceiro.
list-partner-meta-templates

Consultar o catálogo de templates já conhecido pela HookCloud, com filtros e paginação, para alimentar seletores no sistema do assinante ou preparar um sistema de envio.

Quando usar

Use antes de montar uma mensagem de template ou quando a interface precisar listar nomes, idiomas e parâmetros. Para atualizar dados potencialmente antigos, solicite refresh e consulte novamente após a conclusão do trabalho.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Ter uma WABA vinculada a uma instância ou credencial do parceiro para que existam dados de catálogo.
  • Conhecer a WABA/instância do cliente quando a integração administrar mais de uma conta. Sem seletor, a listagem pode abranger todas as WABAs do parceiro.

Autenticação e permissão

Partner API Key ativa com meta_risk.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=list-partner-meta-templates&page=1&page_size=20
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

waba_idstring · Opcional.

ID da conta WhatsApp Business (WABA), pertencente ao parceiro autenticado. É texto, mesmo quando composto apenas por dígitos. Não é o ID do app Meta nem o ID do número. Se combinar com uma instância, ambos precisam apontar para a mesma WABA.

Exemplo: 123456789012345

meta_waba_idstring · Opcional.

Alias de waba_id. Use um único nome de campo; waba_id tem precedência se ambos forem enviados. A posse da WABA é verificada no ambiente do parceiro.

Exemplo: 123456789012345

instance_idUUID em string · Opcional.

Resolve a WABA a partir do ID interno de uma instância do Partner. Não combine com instance_key ou phone_number_id nesta família de rotas.

Exemplo: 11111111-2222-4333-8444-555555555555

instance_keystring · Opcional.

Resolve a WABA pela chave da instância cadastrada no Partner. É normalizada para minúsculas. É alternativa a instance_id e phone_number_id, não um filtro adicional.

Exemplo: loja-centro-whatsapp

phone_number_idstring · Opcional.

Resolve a WABA pelo identificador técnico do número na Meta. Não é o telefone com DDI nem o BSUID do destinatário. Use somente este ou outro seletor de instância.

Exemplo: 987654321098765

searchstring · Opcional.

Busca parcial por nome, ID ou idioma do template. Não é uma expressão SQL nem um nome de rota.

Exemplo: confirmacao

statusstring · Opcional.

Filtra o status do template na Meta, por exemplo APPROVED, PENDING ou REJECTED. O alias template_status também é lido pelo handler, mas prefira status nesta rota.

Exemplo: APPROVED

languagestring · Opcional.

Código de idioma do template. Use o código retornado pela Meta; não traduza para um nome de idioma.

Exemplo: pt_BR

categorystring · Opcional.

Categoria do template, como UTILITY, MARKETING ou AUTHENTICATION. O filtro é normalizado para maiúsculas.

Exemplo: UTILITY

sendable_onlybooleano · Opcional.

true retorna somente os marcados como enviáveis; false retorna somente os não enviáveis. Omitir inclui ambos. Não envie false supondo que signifique desabilitar o filtro.

Exemplo: true

pageinteiro · Opcional.

Página numerada a partir de 1; padrão 1. Nas rotas com validação apiPagination, aceita de 1 a 1.000.000. No da integração, incremente somente depois de processar os itens da página atual.

Exemplo: 1

page_sizeinteiro · Opcional.

Quantidade de itens por página; padrão 50 e máximo 200. Use 50 inicialmente. Não confunda total de registros com tamanho do array items desta resposta.

Exemplo: 50

quality_statusstring · Opcional.

Filtra a qualidade Meta antes da contagem e da paginação. Use o valor retornado pelo catálogo, por exemplo GREEN, YELLOW, RED ou UNKNOWN; é diferente de status APPROVED/PENDING.

Exemplo: GREEN

is_riskybooleano · Opcional.

true lista somente modelos em risco; false lista somente os que não estão em risco. Omitir inclui ambos. O filtro é aplicado antes da contagem e da paginação.

Exemplo: true

Como ler a resposta

Retorna ok, partner_id, meta_waba_id, source="hookcloud_cache", sync e a paginação items, total, page, page_size e pages. meta_waba_id e sync podem ser nulos quando a consulta não escolhe uma única WABA. total refere-se ao conjunto filtrado, não à página atual. Registros marcados como missing_from_graph são excluídos desta listagem. Os registros de template incluem id (UUID local), meta_waba_id, template_id (ID Meta), template_name, template_language, template_status, quality_status, category, rejection_reason, is_risky, sendable, components, parameter_schema, sync_status, last_graph_sync_at, last_graph_error, last_event_at, missing_from_graph, graph_version e datas de criação/atualização. components contém os componentes reais sincronizados; parameter_schema resume os parâmetros identificados. Campos ainda não sincronizados podem estar vazios ou nulos. Leia sendable junto com o estado e a data de sincronização; ele não garante a aprovação de uma futura chamada de envio pela Meta.

Receba as próximas mudanças por webhook

Depois de consultar ou configurar esta operação, seu sistema pode receber os eventos abaixo. Abra para entender o POST recebido, cada campo e o que atualizar no seu cadastro.

Documentação dos payloads recebidos

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 multiple_instance_identifiers: foi enviado mais de um entre instance_id, instance_key e phone_number_id; mantenha apenas um.
  • 400 invalid_instance_id ou waba_instance_mismatch: revise o UUID ou a associação entre a instância e a WABA.
  • 404 instance_not_found ou waba_not_found: o recurso não foi encontrado dentro do parceiro autenticado; confira ambiente e cadastro.
  • 400 invalid_pagination: página ou tamanho fora dos limites; ajuste os parâmetros do cliente HTTP.
  • 500 meta_template_list_failed: a consulta ao catálogo falhou; preserve o último catálogo válido e tente novamente com intervalo.

Depois desta chamada

  • No da integração, processe items com Split Out/Loop Over Items e incremente page até alcançar pages ou items ficar vazio.
  • Guarde template_id, template_name, template_language e meta_waba_id juntos. Um mesmo nome pode existir em WABAs ou idiomas diferentes.
  • Para enviar, use o fluxo Graph correspondente; selecione components/parameter_schema do registro encontrado e confira os parâmetros exigidos.

Regras desta operação

  • Guarde WABA ID e phone_number_id como texto no seu sistema. A conversão para Number pode perder precisão em identificadores longos.
  • Com mais de uma WABA, informe o seletor explicitamente. Nunca escolha a primeira WABA de uma lista sem associá-la ao cliente correto.
  • O catálogo desta API é uma cópia sincronizada pela HookCloud. Criar, editar, apagar ou enviar um template usa a Graph API autorizada; estas rotas não encaminham essas operações para a Meta.
  • Não trate um array vazio como falha de transporte: pode ser resultado legítimo dos filtros ou de uma sincronização ainda não concluída.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
GETConsulta template por ID ou nome+idioma. Por nome exige WABA inequívoca; selecione WABA se houver mais de uma.
get-partner-meta-template

Ler um template específico do catálogo, incluindo seus componentes e informações de sincronização, sem percorrer todas as páginas.

Quando usar

Use ao abrir os detalhes de um template escolhido ou imediatamente antes de construir os parâmetros do envio.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Ter template_id da Meta ou o par exato template_name + language.
  • Na consulta por nome, identificar a WABA; o sistema só a deduz quando há exatamente uma WABA disponível.

Autenticação e permissão

Partner API Key ativa com meta_risk.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-partner-meta-template&template_name=hello_world&language=en_US&instance_key=cliente-001-whatsapp-principal
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

template_idstring · Condicional: obrigatório quando não for usado template_name + language.

ID do template na Meta, não o UUID local id retornado pela tabela. Não envie template_id junto com template_name.

Exemplo: 1023456789012345

template_namestring · Condicional: obrigatório quando template_id não for informado.

Nome exato do template. Exige language e uma WABA resolvível, pois o mesmo nome pode existir em contas diferentes.

Exemplo: confirmacao_pedido

languagestring · Obrigatório quando usar template_name.

Código de idioma exato, como pt_BR. Na busca por ID não é necessário fornecer o par nome/idioma.

Exemplo: pt_BR

waba_idstring · Opcional.

ID da conta WhatsApp Business (WABA), pertencente ao parceiro autenticado. É texto, mesmo quando composto apenas por dígitos. Não é o ID do app Meta nem o ID do número. Se combinar com uma instância, ambos precisam apontar para a mesma WABA.

Exemplo: 123456789012345

meta_waba_idstring · Opcional.

Alias de waba_id. Use um único nome de campo; waba_id tem precedência se ambos forem enviados. A posse da WABA é verificada no ambiente do parceiro.

Exemplo: 123456789012345

instance_idUUID em string · Opcional.

Resolve a WABA a partir do ID interno de uma instância do Partner. Não combine com instance_key ou phone_number_id nesta família de rotas.

Exemplo: 11111111-2222-4333-8444-555555555555

instance_keystring · Opcional.

Resolve a WABA pela chave da instância cadastrada no Partner. É normalizada para minúsculas. É alternativa a instance_id e phone_number_id, não um filtro adicional.

Exemplo: loja-centro-whatsapp

phone_number_idstring · Opcional.

Resolve a WABA pelo identificador técnico do número na Meta. Não é o telefone com DDI nem o BSUID do destinatário. Use somente este ou outro seletor de instância.

Exemplo: 987654321098765

Como ler a resposta

Retorna ok, partner_id, meta_waba_id e template, um único registro. A ausência do template gera 404, não template vazio com ok=true. Os registros de template incluem id (UUID local), meta_waba_id, template_id (ID Meta), template_name, template_language, template_status, quality_status, category, rejection_reason, is_risky, sendable, components, parameter_schema, sync_status, last_graph_sync_at, last_graph_error, last_event_at, missing_from_graph, graph_version e datas de criação/atualização. components contém os componentes reais sincronizados; parameter_schema resume os parâmetros identificados. Campos ainda não sincronizados podem estar vazios ou nulos. Leia sendable junto com o estado e a data de sincronização; ele não garante a aprovação de uma futura chamada de envio pela Meta.

Receba as próximas mudanças por webhook

Depois de consultar ou configurar esta operação, seu sistema pode receber os eventos abaixo. Abra para entender o POST recebido, cada campo e o que atualizar no seu cadastro.

Documentação dos payloads recebidos

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 multiple_instance_identifiers: foi enviado mais de um entre instance_id, instance_key e phone_number_id; mantenha apenas um.
  • 400 invalid_instance_id ou waba_instance_mismatch: revise o UUID ou a associação entre a instância e a WABA.
  • 404 instance_not_found ou waba_not_found: o recurso não foi encontrado dentro do parceiro autenticado; confira ambiente e cadastro.
  • 400 template_identifier_required: faltou escolher uma forma de identificação.
  • 400 multiple_template_identifiers: template_id e template_name foram enviados juntos.
  • 400 template_language_required: a busca por nome não informou o idioma.
  • 400 waba_id_required ou 409 waba_missing: não foi possível determinar uma única WABA para a busca por nome.
  • 404 meta_template_not_found: registro não encontrado no catálogo do parceiro/WABA.
  • 500 meta_template_lookup_failed: falha ao consultar o catálogo.

Depois desta chamada

  • Use o registro retornado para mostrar status, idioma e parâmetros no sistema do cliente.
  • Se o template acabou de ser criado na Meta, solicite refresh-partner-meta-templates, acompanhe o job e repita a consulta.

Regras desta operação

  • Guarde WABA ID e phone_number_id como texto no seu sistema. A conversão para Number pode perder precisão em identificadores longos.
  • Com mais de uma WABA, informe o seletor explicitamente. Nunca escolha a primeira WABA de uma lista sem associá-la ao cliente correto.
  • O catálogo desta API é uma cópia sincronizada pela HookCloud. Criar, editar, apagar ou enviar um template usa a Graph API autorizada; estas rotas não encaminham essas operações para a Meta.
  • Não use o UUID local id no lugar de template_id. Mantenha nomes claros nas variáveis do seu sistema, por exemplo template_meta_id e template_local_id.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
POSTAgenda sincronização dos templates pela Graph API; cooldown padrão de 300 segundos.
refresh-partner-meta-templates

Pedir uma nova sincronização do catálogo de uma WABA com a Graph API por meio da fila interna da HookCloud.

Quando usar

Use depois de alterações de template na Meta ou quando o catálogo local estiver desatualizado. O pedido inicia/recupera um trabalho assíncrono; não retorna o catálogo pronto.

Referência oficial Meta: Números, registro e permissões · Webhooks da Cloud API

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Ter uma WABA pertencente ao parceiro e credenciais Meta válidas para ela.
  • Quando houver várias WABAs, enviar um seletor explícito.
  • Respeitar o intervalo de atualização manual informado pelo servidor.

Autenticação e permissão

Partner API Key ativa com instances.write ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=refresh-partner-meta-templates
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "instance_key": "cliente-001-whatsapp-principal"
}

O que preencher em cada campo

waba_idstring · Condicional: informe este campo ou um seletor de instância quando houver mais de uma WABA disponível.

ID da conta WhatsApp Business (WABA), pertencente ao parceiro autenticado. É texto, mesmo quando composto apenas por dígitos. Não é o ID do app Meta nem o ID do número. Se combinar com uma instância, ambos precisam apontar para a mesma WABA.

Exemplo: 123456789012345

meta_waba_idstring · Opcional.

Alias de waba_id. Use um único nome de campo; waba_id tem precedência se ambos forem enviados. A posse da WABA é verificada no ambiente do parceiro.

Exemplo: 123456789012345

instance_idUUID em string · Opcional.

Resolve a WABA a partir do ID interno de uma instância do Partner. Não combine com instance_key ou phone_number_id nesta família de rotas.

Exemplo: 11111111-2222-4333-8444-555555555555

instance_keystring · Opcional.

Resolve a WABA pela chave da instância cadastrada no Partner. É normalizada para minúsculas. É alternativa a instance_id e phone_number_id, não um filtro adicional.

Exemplo: loja-centro-whatsapp

phone_number_idstring · Opcional.

Resolve a WABA pelo identificador técnico do número na Meta. Não é o telefone com DDI nem o BSUID do destinatário. Use somente este ou outro seletor de instância.

Exemplo: 987654321098765

forcebooleano · Opcional.

Reservado ao administrador da plataforma HookCloud. O assinante, inclusive owner de um Partner, deve omitir ou enviar false; não é uma opção de aceleração disponível à API do cliente.

Exemplo: false

Como ler a resposta

HTTP 202 com ok=true, accepted=true, partner_id, meta_waba_id, sync_job_id, sync_status, next_allowed_at e poll. sync_job_id identifica o trabalho pendente/em processamento, que pode ter sido reutilizado em vez de duplicado. poll fornece a consulta para acompanhar a sincronização. next_allowed_at é a próxima oportunidade de solicitar atualização manual; não é uma promessa de horário de término.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 multiple_instance_identifiers: foi enviado mais de um entre instance_id, instance_key e phone_number_id; mantenha apenas um.
  • 400 invalid_instance_id ou waba_instance_mismatch: revise o UUID ou a associação entre a instância e a WABA.
  • 404 instance_not_found ou waba_not_found: o recurso não foi encontrado dentro do parceiro autenticado; confira ambiente e cadastro.
  • 400 waba_id_required ou 409 waba_missing: informe a WABA/instância correta ou conclua a conexão.
  • 403 force_refresh_admin_only: remova force=true da automação do assinante.
  • 429 meta_template_refresh_rate_limited: respeite o header Retry-After e error.details.retry_after_seconds/next_allowed_at; cached_data_available indica que o catálogo anterior pode continuar sendo consultado.
  • 500 meta_template_refresh_failed: falha ao solicitar atualização; não interprete como exclusão dos templates existentes.

Depois desta chamada

  • No backend da integração, guarde sync_job_id e meta_waba_id, aguarde o intervalo informado e chame get-partner-meta-template-sync.
  • Quando o job concluir com sucesso, chame list-partner-meta-templates ou get-partner-meta-template.
  • Se o job falhar, registre last_error e mantenha a cópia anterior até corrigir credencial/permissão e pedir nova atualização dentro do intervalo permitido.

Regras desta operação

  • Guarde WABA ID e phone_number_id como texto no seu sistema. A conversão para Number pode perder precisão em identificadores longos.
  • Com mais de uma WABA, informe o seletor explicitamente. Nunca escolha a primeira WABA de uma lista sem associá-la ao cliente correto.
  • O catálogo desta API é uma cópia sincronizada pela HookCloud. Criar, editar, apagar ou enviar um template usa a Graph API autorizada; estas rotas não encaminham essas operações para a Meta.
  • Não faça polling disparando refresh repetidamente. Separe a ação de solicitar a atualização da consulta de status.
  • O intervalo manual é configurável no servidor; o padrão usado pelo handler é 300 segundos, mas a resposta do ambiente é a referência para o sistema.
  • Um evento novo ou force=true do Admin não reduz uma espera já registrada. A primeira solicitação pode iniciar o trabalho imediatamente; solicitações repetidas e limites Meta respeitam next_allowed_at e Retry-After. O guard de consumo pode adiar a leitura antes de consultar a Meta, mantendo o catálogo anterior.
GETConsulta estado e último job da sincronização.
get-partner-meta-template-sync

Consultar o estado de sincronização de uma WABA e o trabalho mais recente de atualização do catálogo.

Quando usar

Use após refresh-partner-meta-templates ou para mostrar no painel a última atualização e eventuais falhas de sincronização.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Escolher a mesma WABA usada no pedido de refresh.
  • Ter uma única WABA disponível ou informar o seletor explicitamente.

Autenticação e permissão

Partner API Key ativa com meta_risk.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-partner-meta-template-sync&instance_key=cliente-001-whatsapp-principal
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

waba_idstring · Condicional: informe este campo ou um seletor de instância quando houver mais de uma WABA disponível.

ID da conta WhatsApp Business (WABA), pertencente ao parceiro autenticado. É texto, mesmo quando composto apenas por dígitos. Não é o ID do app Meta nem o ID do número. Se combinar com uma instância, ambos precisam apontar para a mesma WABA.

Exemplo: 123456789012345

meta_waba_idstring · Opcional.

Alias de waba_id. Use um único nome de campo; waba_id tem precedência se ambos forem enviados. A posse da WABA é verificada no ambiente do parceiro.

Exemplo: 123456789012345

instance_idUUID em string · Opcional.

Resolve a WABA a partir do ID interno de uma instância do Partner. Não combine com instance_key ou phone_number_id nesta família de rotas.

Exemplo: 11111111-2222-4333-8444-555555555555

instance_keystring · Opcional.

Resolve a WABA pela chave da instância cadastrada no Partner. É normalizada para minúsculas. É alternativa a instance_id e phone_number_id, não um filtro adicional.

Exemplo: loja-centro-whatsapp

phone_number_idstring · Opcional.

Resolve a WABA pelo identificador técnico do número na Meta. Não é o telefone com DDI nem o BSUID do destinatário. Use somente este ou outro seletor de instância.

Exemplo: 987654321098765

Como ler a resposta

Retorna ok, partner_id, meta_waba_id, sync e latest_job. sync é o registro do estado da WABA e latest_job é a linha mais recente da fila; ambos podem ser nulos se ainda não houver histórico. latest_job inclui id, status, reason, attempt_count, max_attempts, run_after, last_error e datas disponíveis no registro. Use status para distinguir um trabalho pendente/em processamento de um concluído ou com falha, e last_error para diagnóstico. Essa resposta não traz o array de templates.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 multiple_instance_identifiers: foi enviado mais de um entre instance_id, instance_key e phone_number_id; mantenha apenas um.
  • 400 invalid_instance_id ou waba_instance_mismatch: revise o UUID ou a associação entre a instância e a WABA.
  • 404 instance_not_found ou waba_not_found: o recurso não foi encontrado dentro do parceiro autenticado; confira ambiente e cadastro.
  • 400 waba_id_required ou 409 waba_missing: faltou uma WABA unívoca.
  • 500 meta_template_sync_lookup_failed: a consulta ao estado de sincronização falhou.

Depois desta chamada

  • Implemente polling com intervalo e limite de tentativas, usando Wait entre consultas.
  • Após sucesso, leia o catálogo; em falha persistente, encaminhe o diagnóstico ao suporte com WABA e sync_job_id, sem tokens Meta.

Regras desta operação

  • Guarde WABA ID e phone_number_id como texto no seu sistema. A conversão para Number pode perder precisão em identificadores longos.
  • Com mais de uma WABA, informe o seletor explicitamente. Nunca escolha a primeira WABA de uma lista sem associá-la ao cliente correto.
  • O catálogo desta API é uma cópia sincronizada pela HookCloud. Criar, editar, apagar ou enviar um template usa a Graph API autorizada; estas rotas não encaminham essas operações para a Meta.
  • latest_job é o trabalho mais recente da WABA, não necessariamente o único iniciado pelo seu sistema. Compare o id quando precisar acompanhar um pedido específico.
  • Não substitua um catálogo existente por vazio apenas porque sync/latest_job veio nulo.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
GETResumo dos templates e últimos registros do parceiro.
get-meta-template-dashboard

Obter um resumo operacional de templates e uma pequena lista de registros recentes do parceiro.

Quando usar

Use para cartões de indicadores do painel, triagem de templates rejeitados e visualização da qualidade do catálogo.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Ter dados de templates já recebidos/sincronizados no parceiro. Nenhum campo de filtro é necessário nesta rota.

Autenticação e permissão

Partner API Key ativa com meta_risk.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-meta-template-dashboard
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

Esta operação não exige campos adicionais. A identidade do parceiro vem da autenticação.

Como ler a resposta

Retorna ok, partner_id, summary e latest_templates. summary contém total_templates, approved_templates, pending_templates, rejected_templates, risky_templates, low_quality_templates, sendable_templates, graph_synced_templates, stale_templates, wabas_count e languages_count. approved_templates conta APPROVED/REINSTATED; pending_templates agrega PENDING/IN_APPEAL/PENDING_DELETION; low_quality_templates considera RED/LOW/FLAGGED. stale_templates indica registros marcados como ausentes na Graph. latest_templates usa o formato items,total,page,page_size,pages e traz a primeira página de 10 registros recentes. O resumo é do parceiro, sem seletor por WABA nesta rota.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 500 meta_template_dashboard_failed: um dos componentes do painel não pôde ser carregado. Mantenha o estado anterior da interface e sinalize a falha da atualização.

Depois desta chamada

  • Use summary para os indicadores e latest_templates.items para a tabela de destaque.
  • Abra search-meta-templates com filtros apropriados para investigar um indicador; use list/get para selecionar um template para envio.

Regras desta operação

  • total_templates conta registros não marcados como ausentes na Graph, incluindo templates ainda não enviáveis. Não exija que ele seja idêntico ao número de resultados de sendable_only=true.
  • Esta chamada não solicita nova sincronização com a Meta.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
GETPesquisa do painel de templates; rota distinta do catálogo simplificado.
search-meta-templates

Pesquisar o catálogo operacional de templates usando status, qualidade, risco e intervalo de tempo.

Quando usar

Use em telas de pesquisa e rotinas de acompanhamento, por exemplo para localizar templates de marketing com baixa qualidade ou alterações recentes.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Ter os códigos de status/categoria/idioma usados pelos registros do catálogo. Não é necessário fornecer todos os filtros.

Autenticação e permissão

Partner API Key ativa com meta_risk.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=search-meta-templates&page=1&page_size=20
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

searchstring · Opcional.

Busca textual em nome, ID, idioma, WABA e demais informações indexadas pela consulta operacional.

Exemplo: confirmacao

template_statusstring · Opcional.

Filtra o estado do template. Compare com o template_status retornado pelo catálogo.

Exemplo: APPROVED

quality_statusstring · Opcional.

Filtra o indicador de qualidade registrado; exemplos de estados de baixa qualidade reconhecidos pelo resumo incluem RED, LOW e FLAGGED.

Exemplo: LOW

categorystring · Opcional.

Categoria de template, comparada sem depender de maiúsculas/minúsculas.

Exemplo: MARKETING

languagestring · Opcional.

Código de idioma do template, não o idioma da interface.

Exemplo: pt_BR

meta_waba_idstring · Opcional.

Restringe à WABA identificada. Nesta rota de busca, esse é o nome do filtro do inventário.

Exemplo: 123456789012345

is_riskybooleano · Opcional.

true seleciona registros marcados como arriscados; false seleciona os não marcados. Omitir não restringe por risco.

Exemplo: true

sendable_onlybooleano · Opcional.

true seleciona os enviáveis; false seleciona os não enviáveis; omitir inclui ambos.

Exemplo: true

date_fromstring de data/hora · Opcional.

Limite inicial inclusivo do período. Prefira ISO 8601 com fuso para não depender do fuso do sistema. Na busca de entregas também aceita YYYY-MM-DD; o filtro usa o instante do evento.

Exemplo: 2026-09-01T00:00:00-03:00

date_tostring de data/hora · Opcional.

Limite final inclusivo. Envie data/hora completa se quiser incluir o último dia inteiro: uma data simples representa meia-noite, não 23:59:59. Não use valor anterior a date_from.

Exemplo: 2026-09-11T23:59:59-03:00

pageinteiro · Opcional.

Página numerada a partir de 1; padrão 1. Nas rotas com validação apiPagination, aceita de 1 a 1.000.000. No da integração, incremente somente depois de processar os itens da página atual.

Exemplo: 1

page_sizeinteiro · Opcional.

Quantidade de itens por página; padrão 50 e máximo 200. Use 50 inicialmente. Não confunda total de registros com tamanho do array items desta resposta.

Exemplo: 50

sortstring · Opcional.

Use asc para ordem cronológica crescente ou desc para decrescente. O código trata valores diferentes de asc como desc; envie somente os valores esperados.

Exemplo: desc

Como ler a resposta

Retorna ok, partner_id, items, total, page, page_size e pages. Os itens incluem os campos do estado de template e as informações de parceiro adicionadas pela consulta (partner_name e partner_slug), além de effective_event_at. O período/ordenação considera effective_event_at, calculado priorizando last_graph_sync_at, depois last_event_at e updated_at. Registros missing_from_graph=true são excluídos desta busca. Os registros de template incluem id (UUID local), meta_waba_id, template_id (ID Meta), template_name, template_language, template_status, quality_status, category, rejection_reason, is_risky, sendable, components, parameter_schema, sync_status, last_graph_sync_at, last_graph_error, last_event_at, missing_from_graph, graph_version e datas de criação/atualização. components contém os componentes reais sincronizados; parameter_schema resume os parâmetros identificados. Campos ainda não sincronizados podem estar vazios ou nulos. Leia sendable junto com o estado e a data de sincronização; ele não garante a aprovação de uma futura chamada de envio pela Meta.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 500 meta_template_search_failed: falha na pesquisa, inclusive quando parâmetros não podem ser convertidos pelo banco. Envie datas ISO válidas e paginação dentro dos limites em vez de depender de coerções do servidor.

Depois desta chamada

  • Use paginação até alcançar pages, mantendo os mesmos filtros em todas as páginas.
  • Para investigar um registro, consulte get-partner-meta-template pelo template_id e pela WABA.

Regras desta operação

  • O intervalo de data representa a atualização efetiva do catálogo, não o horário em que uma mensagem foi enviada ao destinatário.
  • is_risky=false e sendable_only=false são filtros ativos; remova os campos quando quiser incluir todos os estados.
  • No da integração, envie booleanos reais em JSON e as strings true/false nos parâmetros de consulta, sem expressões que produzam texto vazio.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.

Alertas Meta e saúde de entregas

Reportar status, investigar erros e acompanhar incidentes por cliente ou número.

POSTRegistra status informado pelo sistema do parceiro para saúde/alertas. Não envia mensagem WhatsApp.
report-partner-message-status

Registrar um estado de entrega observado pelo sistema do assinante e atualizar os indicadores internos de saúde da HookCloud.

Quando usar

Use depois de receber um status real da Meta ou uma confirmação real da tentativa de envio. Exemplo: Webhook da integração recebe statuses[], separa cada item, mapeia a instância e relata sent, delivered ou read.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Ter instância cadastrada no Partner e relacioná-la ao metadata.phone_number_id recebido da Meta.
  • Extrair cada status individual do envelope entry[].changes[].value.statuses[]; o endpoint não processa o envelope completo automaticamente.
  • Conservar o ID e o instante real do evento para deduplicação.

Autenticação e permissão

Partner API Key ativa com instances.write ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=report-partner-message-status
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "instance_key": "cliente-001-whatsapp-principal",
  "message_id": "MESSAGE_ID",
  "status": "delivered",
  "recipient_user_id": "BR.BSUID_RECEBIDO_NO_WEBHOOK",
  "occurred_at": "OCCURRED_AT"
}

O que preencher em cada campo

instance_idUUID em string · Condicional: envie exatamente um entre instance_id, instance_key e phone_number_id.

ID interno da instância cujo envio está sendo relatado. Ela precisa pertencer ao parceiro da credencial. Não é o UUID do cliente.

Exemplo: 11111111-2222-4333-8444-555555555555

instance_keystring · Condicional: alternativa a instance_id e phone_number_id.

Chave da instância no Partner; é convertida para minúsculas. Não envie outro seletor de instância junto.

Exemplo: loja-centro-whatsapp

phone_number_idstring · Condicional: alternativa a instance_id e instance_key.

ID técnico do número remetente na Meta. É o metadata.phone_number_id do webhook da Meta, não o telefone/BSUID do destinatário.

Exemplo: 987654321098765

message_idstring · Condicional: informe este campo ou wamid, client_message_id ou request_id.

Identificador estável da mensagem. É a primeira opção lida quando vários aliases chegam. Para mensagens aceitas pela Meta, prefira o WAMID retornado por ela.

Exemplo: wamid.EXEMPLO_META

wamidstring · Condicional: alternativa a message_id.

Alias explícito para o identificador Meta de mensagem. O status recebido em statuses[].id deve ser mapeado para message_id ou wamid no topo deste relatório.

Exemplo: wamid.EXEMPLO_META

client_message_idstring · Condicional: alternativa quando ainda não existe WAMID.

ID estável gerado pelo sistema do assinante para correlacionar a mesma tentativa lógica, útil quando a Graph rejeita o envio antes de gerar uma mensagem. Não gere um UUID diferente a cada repetição do mesmo relatório.

Exemplo: pedido-4501-confirmacao-1

request_idstring · Condicional: alternativa quando não forem usados os anteriores.

Referência estável da requisição do assinante. É a última opção na ordem de resolução dos identificadores. Use namespaces próprios para evitar colisões dentro do parceiro.

Exemplo: envio-pedido-4501-tentativa-1

statusstring enum · Obrigatório.

Estado a registrar: accepted, sent, delivered, read, failed ou deleted. accepted representa uma aceitação efetivamente observada; não assuma delivered apenas porque o envio HTTP retornou sucesso.

Exemplo: delivered

error_codestring ou número convertido em texto · Opcional.

Código de erro devolvido pela Meta. Tem precedência sobre error.code; não invente um código para uma falha sem código conhecido.

Exemplo: 131026

error_titlestring · Opcional.

Título curto do erro; tem precedência sobre error.title. Preserve o texto útil para diagnóstico, sem incluir tokens.

Exemplo: Message undeliverable

error_messagestring · Opcional.

Mensagem descritiva. O handler também procura error.message e error.error_data.details quando este campo estiver ausente.

Exemplo: A Meta rejeitou a entrega desta mensagem.

error_detailsobjeto JSON · Opcional.

Detalhes estruturados do erro. Tem precedência sobre error.error_data e sobre o objeto error inteiro para o campo de detalhes persistido. Não envie tokens, conteúdo da mensagem ou dados pessoais desnecessários.

Exemplo: {"details":"Destinatário não elegível para esta tentativa."}

errorobjeto JSON · Opcional.

Objeto de erro da Graph, utilizado como alternativa aos campos error_* do topo. Para erro de webhook, extraia o item de errors[] no seu sistema e coloque-o aqui; o handler não transforma automaticamente o envelope inteiro da Meta em um erro.

Exemplo: {"code":131026,"title":"Message undeliverable","message":"Entrega recusada","error_data":{"details":"Detalhe fornecido pela Meta"}}

error.codestring ou número · Opcional.

Dentro de error: alternativa de error_code para classificar a falha.

Exemplo: 131026

error.titlestring · Opcional.

Dentro de error: alternativa do título quando error_title não foi informado.

Exemplo: Message undeliverable

error.messagestring · Opcional.

Dentro de error: alternativa de error_message.

Exemplo: Entrega recusada

error.error_dataobjeto JSON · Opcional.

Dentro de error: detalhes estruturados usados quando error_details não foi informado.

Exemplo: {"details":"Detalhe fornecido pela Meta"}

error.error_data.detailsstring · Opcional.

Dentro de error.error_data: texto usado como última alternativa de error_message.

Exemplo: Detalhe fornecido pela Meta

template_idstring · Opcional.

ID Meta do template relacionado à mensagem. É contexto para análise; não faz o envio nem a validação do template.

Exemplo: 1023456789012345

template_namestring · Opcional.

Nome do template usado, quando houver. Permite agrupar falhas por template; omita em mensagens de texto livre.

Exemplo: confirmacao_pedido

template_languagestring · Opcional.

Código do idioma do template enviado. O handler também lê language como alias, mas este nome evita ambiguidade.

Exemplo: pt_BR

categorystring · Opcional.

Categoria do template/contexto relatado. O handler também aceita template_category com precedência. Não confunda com status_payload.pricing.category, que descreve a categoria de tarifação recebida da Meta.

Exemplo: UTILITY

campaign_idstring · Opcional.

Identificador da campanha no sistema do assinante. Use o mesmo valor em todos os relatos que pertençam à campanha.

Exemplo: campanha-pos-venda-2026-09

recipient_hashstring hexadecimal de 64 caracteres · Opcional.

Hash SHA-256/HMAC já calculado pelo assinante, opcional. Se omitido e um identificador de destinatário válido for enviado, a HookCloud calcula um HMAC com contexto de parceiro e WABA. O exemplo é apenas formato; gere um hash real por identidade.

Exemplo: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

recipient_user_idstring BSUID · Opcional.

Identificador de usuário recebido da Meta. Prefira statuses[].recipient_user_id para relatos de status. Preserve o identificador inteiro e opaco, incluindo o prefixo de país e ENT. quando presente. O código aceita o formato PREFIXO.(ENT.)IDENTIFICADOR alfanumérico.

Exemplo: BR.1234567890

user_idstring BSUID · Opcional.

Alias de recipient_user_id no topo. Use apenas uma origem consistente; identificadores diferentes entre aliases provocam conflito. Não é o UUID do usuário do portal.

Exemplo: BR.1234567890

recipientstring · Opcional.

Compatibilidade: aceita BSUID com prefixo ou um telefone legado com 7 a 15 dígitos após normalização. Para o modelo novo, envie recipient_user_id. Username reservado não é resolvido por esta rota.

Exemplo: BR.1234567890

occurred_atstring ISO 8601 com fuso ou timestamp Unix em segundos · Opcional.

Instante real do evento, com prioridade sobre timestamp e status_payload.timestamp. Se todos estiverem ausentes, usa o horário do recebimento. Não use milissegundos do Date.now() como se fossem segundos.

Exemplo: 2026-09-11T13:30:00-03:00

timestampstring ou número Unix em segundos; ou ISO com fuso · Opcional.

Alias do instante do evento, lido quando occurred_at não existe. Copie o timestamp da Meta sem multiplicar por 1.000.

Exemplo: 1789144200

status_payloadobjeto JSON · Opcional.

Contexto de um item de statuses[] da Meta. Somente os campos reconhecidos são extraídos; o objeto bruto não é armazenado. Ainda é necessário mapear message_id, status e a instância para o topo do relatório.

Exemplo: {"timestamp":"1789144200","recipient_user_id":"BR.1234567890","pricing":{"pricing_model":"PMP","category":"service","billable":false}}

status_payload.timestampstring ou número Unix em segundos · Opcional.

Última alternativa para o instante do evento, se occurred_at e timestamp do topo estiverem ausentes.

Exemplo: 1789144200

status_payload.recipient_user_idstring BSUID · Opcional.

Alternativa para o BSUID do destinatário quando não enviado no topo. Identidades conflitantes entre as opções são rejeitadas.

Exemplo: BR.1234567890

status_payload.recipient_idstring · Opcional.

Identificador legado de telefone do status Meta, usado somente como alternativa quando não houver BSUID aplicável. Não converta BSUID em número de telefone.

Exemplo: 5511999990000

status_payload.pricingobjeto JSON · Opcional.

Local efetivamente lido pelo handler para armazenar um resumo de tarifação Meta. Copie o pricing do item de status para dentro deste objeto.

Exemplo: {"pricing_model":"PMP","category":"service","billable":false}

status_payload.pricing.pricing_modelstring · Opcional.

Modelo de tarifação informado pela Meta, preservado no resumo graph_status_context.pricing_model.

Exemplo: PMP

status_payload.pricing.categorystring · Opcional.

Categoria de tarifação informada pela Meta; é gravada como pricing_category no contexto sanitizado.

Exemplo: service

status_payload.pricing.billablebooleano · Opcional.

Indica se o evento foi marcado como faturável pela Meta. Somente true/false booleanos são reconhecidos; texto "false" resulta em valor nulo no contexto. Não determina a cobrança do pacote HookCloud.

Exemplo: false

status_payload.conversationobjeto JSON · Opcional.

Local efetivamente lido para preservar o contexto resumido de conversa enviado pela Meta.

Exemplo: {"id":"CONVERSA_META_EXEMPLO","origin":{"type":"service"},"expiration_timestamp":"1789230600"}

status_payload.conversation.idstring · Opcional.

ID da conversa Meta; vai para graph_status_context.conversation_id.

Exemplo: CONVERSA_META_EXEMPLO

status_payload.conversation.originobjeto JSON · Opcional.

Contêiner da origem da conversa. O handler extrai somente origin.type.

Exemplo: {"type":"service"}

status_payload.conversation.origin.typestring · Opcional.

Tipo/origem da conversa informado pela Meta.

Exemplo: service

status_payload.conversation.expiration_timestampstring ou número convertido em texto · Opcional.

Vencimento recebido no contexto da conversa. É preservado como texto; não substitui occurred_at do evento.

Exemplo: 1789230600

pricingobjeto JSON · Opcional.

Consta no inventário, mas o objeto no topo não é lido pelo handler atual para graph_status_context. Para preservar os campos suportados, mova-o para status_payload.pricing.

Exemplo: {"pricing_model":"PMP","category":"service","billable":false}

conversationobjeto JSON · Opcional.

Consta no inventário, mas o objeto no topo não é lido pelo handler atual. Use status_payload.conversation e seus campos descritos acima.

Exemplo: {"id":"CONVERSA_META_EXEMPLO","origin":{"type":"service"}}

Como ler a resposta

HTTP 201 com ok=true, report, classification, message_id, message_id_source e privacy. report contém ok, duplicate, event_id, state_id e message_id; quando o evento não é uma repetição também retorna current_status, bucket_start e state_advanced na versão atual. duplicate=true significa que o evento já foi registrado, não que deva ser reenviado ao WhatsApp. state_advanced=false indica que o evento foi guardado no histórico sem fazer o estado atual retroceder. classification é nulo para estados não falhos; para falha contém code, type, category, severity, retry_advice, is_retryable e retry_after. privacy informa recipient_stored_as_hash e raw_recipient_stored=false. message_id_source distingue meta_wamid, partner_client_message_id e partner_request_id. Mesmo uma repetição aceita responde 201; decida pelo conteúdo de report, não apenas pelo código HTTP.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 multiple_instance_identifiers/instance_identifier_required ou invalid_instance_id: forneça exatamente um identificador de instância válido.
  • 404 instance_not_found: a instância informada não existe no parceiro autenticado.
  • 400 message_id_required: faltou uma referência estável da mensagem/requisição.
  • 400 invalid_occurred_at: envie data/hora ISO com fuso ou timestamp Unix em segundos válido.
  • 400 invalid_recipient_hash, invalid_recipient_user_id, invalid_recipient ou conflicting_recipient_identifiers: revise o formato e a consistência da identidade; não use username como BSUID.
  • 403 delivery_report_forbidden: o membro não tem permissão para registrar a operação.
  • 500 delivery_status_report_failed: falha ao persistir o relato. Repita o mesmo evento com o mesmo identificador/idempotência, sem disparar outro envio de mensagem por causa deste erro.
  • 400 invalid_delivery_status: use um dos seis estados suportados.

Depois desta chamada

  • Mapeie o retorno de report em um log técnico mínimo com event_id, message_id e duplicate.
  • Em failed, avalie classification.retry_advice, is_retryable e retry_after antes de qualquer política de reenvio; o relatório não faz o reenvio por você.
  • Consulte get-partner-delivery-health e search-partner-delivery-events para confirmar os indicadores e o histórico.

Regras desta operação

  • Estas rotas registram observabilidade; não enviam mensagens, não chamam o destinatário e não reproduzem o webhook da Meta para o sistema do cliente.
  • O destinatário bruto e status_payload bruto não são armazenados. Ainda assim, revise error_details: é um objeto persistido e não deve conter tokens nem conteúdo pessoal desnecessário.
  • Use Idempotency-Key estável no header para repetir o mesmo evento com segurança. Na ausência dele, o servidor deriva uma chave da instância, mensagem, status, erro e instante. Um novo status da mesma mensagem é outro evento e precisa de uma identidade de evento distinta.
  • Não use o mesmo Idempotency-Key para sent e delivered. Conserve o timestamp original ao repetir o mesmo status; alterar o horário pode transformar a repetição em outro evento.
  • O estado consolidado respeita progressão e eventos fora de ordem. Um failed antigo não deve rebaixar uma mensagem já delivered/read. O histórico pode conter ambos, e não representa duas mensagens enviadas.
  • O relatório de saúde representa o que o assinante reportou. Se a Meta entrega os webhooks diretamente ao endpoint do cliente, a HookCloud não passa a conhecer esses status sem este fluxo de reporte.
  • Um BSUID é opaco e tem contexto de negócio. Não remova o prefixo BR., não tente derivar o telefone e não trate username reservado como destinatário endereçável.
POSTRegistra falha de entrega informada; status é forçado para failed e pode gerar alerta.
report-partner-message-delivery-failure

Registrar uma falha real de envio/entrega e acionar sua classificação no acompanhamento da HookCloud.

Quando usar

Use no ramo de erro do cliente HTTP da Graph API ou ao receber um status failed. É útil quando a Graph rejeita a requisição antes de devolver um WAMID: nesse caso, use client_message_id ou request_id estável.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Ter a instância associada ao envio e o erro real da Meta.
  • Separar falha de entrega de falha do próprio sistema. Um timeout do seu sistema sem confirmação da Meta não prova, sozinho, que a mensagem não foi aceita.
  • Configurar o ramo de erro para relatar a falha sem entrar num loop de reenvios.

Autenticação e permissão

Partner API Key ativa com instances.write ou *. Se optar por JWT, as funções permitidas são owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=report-partner-message-delivery-failure
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "instance_key": "cliente-001-whatsapp-principal",
  "message_id": "MESSAGE_ID",
  "error_code": "131047",
  "error_message": "Falha informada pelo integrador"
}

O que preencher em cada campo

instance_idUUID em string · Condicional: envie exatamente um entre instance_id, instance_key e phone_number_id.

ID interno da instância cujo envio está sendo relatado. Ela precisa pertencer ao parceiro da credencial. Não é o UUID do cliente.

Exemplo: 11111111-2222-4333-8444-555555555555

instance_keystring · Condicional: alternativa a instance_id e phone_number_id.

Chave da instância no Partner; é convertida para minúsculas. Não envie outro seletor de instância junto.

Exemplo: loja-centro-whatsapp

phone_number_idstring · Condicional: alternativa a instance_id e instance_key.

ID técnico do número remetente na Meta. É o metadata.phone_number_id do webhook da Meta, não o telefone/BSUID do destinatário.

Exemplo: 987654321098765

message_idstring · Condicional: informe este campo ou wamid, client_message_id ou request_id.

Identificador estável da mensagem. É a primeira opção lida quando vários aliases chegam. Para mensagens aceitas pela Meta, prefira o WAMID retornado por ela.

Exemplo: wamid.EXEMPLO_META

wamidstring · Condicional: alternativa a message_id.

Alias explícito para o identificador Meta de mensagem. O status recebido em statuses[].id deve ser mapeado para message_id ou wamid no topo deste relatório.

Exemplo: wamid.EXEMPLO_META

client_message_idstring · Condicional: alternativa quando ainda não existe WAMID.

ID estável gerado pelo sistema do assinante para correlacionar a mesma tentativa lógica, útil quando a Graph rejeita o envio antes de gerar uma mensagem. Não gere um UUID diferente a cada repetição do mesmo relatório.

Exemplo: pedido-4501-confirmacao-1

request_idstring · Condicional: alternativa quando não forem usados os anteriores.

Referência estável da requisição do assinante. É a última opção na ordem de resolução dos identificadores. Use namespaces próprios para evitar colisões dentro do parceiro.

Exemplo: envio-pedido-4501-tentativa-1

error_codestring ou número convertido em texto · Opcional.

Código de erro devolvido pela Meta. Tem precedência sobre error.code; não invente um código para uma falha sem código conhecido.

Exemplo: 131026

error_titlestring · Opcional.

Título curto do erro; tem precedência sobre error.title. Preserve o texto útil para diagnóstico, sem incluir tokens.

Exemplo: Message undeliverable

error_messagestring · Opcional.

Mensagem descritiva. O handler também procura error.message e error.error_data.details quando este campo estiver ausente.

Exemplo: A Meta rejeitou a entrega desta mensagem.

error_detailsobjeto JSON · Opcional.

Detalhes estruturados do erro. Tem precedência sobre error.error_data e sobre o objeto error inteiro para o campo de detalhes persistido. Não envie tokens, conteúdo da mensagem ou dados pessoais desnecessários.

Exemplo: {"details":"Destinatário não elegível para esta tentativa."}

errorobjeto JSON · Opcional.

Objeto de erro da Graph, utilizado como alternativa aos campos error_* do topo. Para erro de webhook, extraia o item de errors[] no seu sistema e coloque-o aqui; o handler não transforma automaticamente o envelope inteiro da Meta em um erro.

Exemplo: {"code":131026,"title":"Message undeliverable","message":"Entrega recusada","error_data":{"details":"Detalhe fornecido pela Meta"}}

error.codestring ou número · Opcional.

Dentro de error: alternativa de error_code para classificar a falha.

Exemplo: 131026

error.titlestring · Opcional.

Dentro de error: alternativa do título quando error_title não foi informado.

Exemplo: Message undeliverable

error.messagestring · Opcional.

Dentro de error: alternativa de error_message.

Exemplo: Entrega recusada

error.error_dataobjeto JSON · Opcional.

Dentro de error: detalhes estruturados usados quando error_details não foi informado.

Exemplo: {"details":"Detalhe fornecido pela Meta"}

error.error_data.detailsstring · Opcional.

Dentro de error.error_data: texto usado como última alternativa de error_message.

Exemplo: Detalhe fornecido pela Meta

template_idstring · Opcional.

ID Meta do template relacionado à mensagem. É contexto para análise; não faz o envio nem a validação do template.

Exemplo: 1023456789012345

template_namestring · Opcional.

Nome do template usado, quando houver. Permite agrupar falhas por template; omita em mensagens de texto livre.

Exemplo: confirmacao_pedido

template_languagestring · Opcional.

Código do idioma do template enviado. O handler também lê language como alias, mas este nome evita ambiguidade.

Exemplo: pt_BR

categorystring · Opcional.

Categoria do template/contexto relatado. O handler também aceita template_category com precedência. Não confunda com status_payload.pricing.category, que descreve a categoria de tarifação recebida da Meta.

Exemplo: UTILITY

campaign_idstring · Opcional.

Identificador da campanha no sistema do assinante. Use o mesmo valor em todos os relatos que pertençam à campanha.

Exemplo: campanha-pos-venda-2026-09

recipient_hashstring hexadecimal de 64 caracteres · Opcional.

Hash SHA-256/HMAC já calculado pelo assinante, opcional. Se omitido e um identificador de destinatário válido for enviado, a HookCloud calcula um HMAC com contexto de parceiro e WABA. O exemplo é apenas formato; gere um hash real por identidade.

Exemplo: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

recipient_user_idstring BSUID · Opcional.

Identificador de usuário recebido da Meta. Prefira statuses[].recipient_user_id para relatos de status. Preserve o identificador inteiro e opaco, incluindo o prefixo de país e ENT. quando presente. O código aceita o formato PREFIXO.(ENT.)IDENTIFICADOR alfanumérico.

Exemplo: BR.1234567890

user_idstring BSUID · Opcional.

Alias de recipient_user_id no topo. Use apenas uma origem consistente; identificadores diferentes entre aliases provocam conflito. Não é o UUID do usuário do portal.

Exemplo: BR.1234567890

recipientstring · Opcional.

Compatibilidade: aceita BSUID com prefixo ou um telefone legado com 7 a 15 dígitos após normalização. Para o modelo novo, envie recipient_user_id. Username reservado não é resolvido por esta rota.

Exemplo: BR.1234567890

occurred_atstring ISO 8601 com fuso ou timestamp Unix em segundos · Opcional.

Instante real do evento, com prioridade sobre timestamp e status_payload.timestamp. Se todos estiverem ausentes, usa o horário do recebimento. Não use milissegundos do Date.now() como se fossem segundos.

Exemplo: 2026-09-11T13:30:00-03:00

timestampstring ou número Unix em segundos; ou ISO com fuso · Opcional.

Alias do instante do evento, lido quando occurred_at não existe. Copie o timestamp da Meta sem multiplicar por 1.000.

Exemplo: 1789144200

status_payloadobjeto JSON · Opcional.

Contexto de um item de statuses[] da Meta. Somente os campos reconhecidos são extraídos; o objeto bruto não é armazenado. Ainda é necessário mapear message_id, status e a instância para o topo do relatório.

Exemplo: {"timestamp":"1789144200","recipient_user_id":"BR.1234567890","pricing":{"pricing_model":"PMP","category":"service","billable":false}}

status_payload.timestampstring ou número Unix em segundos · Opcional.

Última alternativa para o instante do evento, se occurred_at e timestamp do topo estiverem ausentes.

Exemplo: 1789144200

status_payload.recipient_user_idstring BSUID · Opcional.

Alternativa para o BSUID do destinatário quando não enviado no topo. Identidades conflitantes entre as opções são rejeitadas.

Exemplo: BR.1234567890

status_payload.recipient_idstring · Opcional.

Identificador legado de telefone do status Meta, usado somente como alternativa quando não houver BSUID aplicável. Não converta BSUID em número de telefone.

Exemplo: 5511999990000

status_payload.pricingobjeto JSON · Opcional.

Local efetivamente lido pelo handler para armazenar um resumo de tarifação Meta. Copie o pricing do item de status para dentro deste objeto.

Exemplo: {"pricing_model":"PMP","category":"service","billable":false}

status_payload.pricing.pricing_modelstring · Opcional.

Modelo de tarifação informado pela Meta, preservado no resumo graph_status_context.pricing_model.

Exemplo: PMP

status_payload.pricing.categorystring · Opcional.

Categoria de tarifação informada pela Meta; é gravada como pricing_category no contexto sanitizado.

Exemplo: service

status_payload.pricing.billablebooleano · Opcional.

Indica se o evento foi marcado como faturável pela Meta. Somente true/false booleanos são reconhecidos; texto "false" resulta em valor nulo no contexto. Não determina a cobrança do pacote HookCloud.

Exemplo: false

status_payload.conversationobjeto JSON · Opcional.

Local efetivamente lido para preservar o contexto resumido de conversa enviado pela Meta.

Exemplo: {"id":"CONVERSA_META_EXEMPLO","origin":{"type":"service"},"expiration_timestamp":"1789230600"}

status_payload.conversation.idstring · Opcional.

ID da conversa Meta; vai para graph_status_context.conversation_id.

Exemplo: CONVERSA_META_EXEMPLO

status_payload.conversation.originobjeto JSON · Opcional.

Contêiner da origem da conversa. O handler extrai somente origin.type.

Exemplo: {"type":"service"}

status_payload.conversation.origin.typestring · Opcional.

Tipo/origem da conversa informado pela Meta.

Exemplo: service

status_payload.conversation.expiration_timestampstring ou número convertido em texto · Opcional.

Vencimento recebido no contexto da conversa. É preservado como texto; não substitui occurred_at do evento.

Exemplo: 1789230600

pricingobjeto JSON · Opcional.

Consta no inventário, mas o objeto no topo não é lido pelo handler atual para graph_status_context. Para preservar os campos suportados, mova-o para status_payload.pricing.

Exemplo: {"pricing_model":"PMP","category":"service","billable":false}

conversationobjeto JSON · Opcional.

Consta no inventário, mas o objeto no topo não é lido pelo handler atual. Use status_payload.conversation e seus campos descritos acima.

Exemplo: {"id":"CONVERSA_META_EXEMPLO","origin":{"type":"service"}}

Como ler a resposta

HTTP 201 com ok=true, report, classification, message_id, message_id_source e privacy. report contém ok, duplicate, event_id, state_id e message_id; quando o evento não é uma repetição também retorna current_status, bucket_start e state_advanced na versão atual. duplicate=true significa que o evento já foi registrado, não que deva ser reenviado ao WhatsApp. state_advanced=false indica que o evento foi guardado no histórico sem fazer o estado atual retroceder. classification é nulo para estados não falhos; para falha contém code, type, category, severity, retry_advice, is_retryable e retry_after. privacy informa recipient_stored_as_hash e raw_recipient_stored=false. message_id_source distingue meta_wamid, partner_client_message_id e partner_request_id. Mesmo uma repetição aceita responde 201; decida pelo conteúdo de report, não apenas pelo código HTTP. Esta rota força o status failed no servidor; não depende de um campo status no body.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 multiple_instance_identifiers/instance_identifier_required ou invalid_instance_id: forneça exatamente um identificador de instância válido.
  • 404 instance_not_found: a instância informada não existe no parceiro autenticado.
  • 400 message_id_required: faltou uma referência estável da mensagem/requisição.
  • 400 invalid_occurred_at: envie data/hora ISO com fuso ou timestamp Unix em segundos válido.
  • 400 invalid_recipient_hash, invalid_recipient_user_id, invalid_recipient ou conflicting_recipient_identifiers: revise o formato e a consistência da identidade; não use username como BSUID.
  • 403 delivery_report_forbidden: o membro não tem permissão para registrar a operação.
  • 500 delivery_status_report_failed: falha ao persistir o relato. Repita o mesmo evento com o mesmo identificador/idempotência, sem disparar outro envio de mensagem por causa deste erro.

Depois desta chamada

  • Guarde a classificação e apresente a orientação adequada ao operador.
  • Se is_retryable=false, corrija a causa antes de tentar enviar novamente. Se houver retry_after, respeite-o.
  • Use a consulta de saúde para investigar recorrência por instância, template e campanha.

Regras desta operação

  • Estas rotas registram observabilidade; não enviam mensagens, não chamam o destinatário e não reproduzem o webhook da Meta para o sistema do cliente.
  • O destinatário bruto e status_payload bruto não são armazenados. Ainda assim, revise error_details: é um objeto persistido e não deve conter tokens nem conteúdo pessoal desnecessário.
  • Use Idempotency-Key estável no header para repetir o mesmo evento com segurança. Na ausência dele, o servidor deriva uma chave da instância, mensagem, status, erro e instante. Um novo status da mesma mensagem é outro evento e precisa de uma identidade de evento distinta.
  • Não use o mesmo Idempotency-Key para sent e delivered. Conserve o timestamp original ao repetir o mesmo status; alterar o horário pode transformar a repetição em outro evento.
  • O estado consolidado respeita progressão e eventos fora de ordem. Um failed antigo não deve rebaixar uma mensagem já delivered/read. O histórico pode conter ambos, e não representa duas mensagens enviadas.
  • O relatório de saúde representa o que o assinante reportou. Se a Meta entrega os webhooks diretamente ao endpoint do cliente, a HookCloud não passa a conhecer esses status sem este fluxo de reporte.
  • Um BSUID é opaco e tem contexto de negócio. Não remova o prefixo BR., não tente derivar o telefone e não trate username reservado como destinatário endereçável.
  • Não envie erros simulados para a operação real: eles alimentam alertas, histórico e indicadores.
  • Relatar a falha não debita nem estorna cobrança do pacote e não desconecta o número.
GETConsulta agregados de saúde de entregas no intervalo selecionado.
get-partner-delivery-health

Consultar contagens e taxas de entrega/falha dos relatos recebidos pela HookCloud em uma janela de tempo.

Quando usar

Use para indicadores do painel do assinante ou para verificar o impacto de uma falha recorrente por cliente/instância.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Ter relatórios enviados pelas rotas report-partner-message-status/failure. A ausência de relatórios pode produzir totais zero mesmo que o sistema externo esteja enviando mensagens.
  • Escolher uma janela temporal adequada ao volume monitorado.

Autenticação e permissão

Partner API Key ativa com meta_risk.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-partner-delivery-health&window_hours=24
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

window_hoursinteiro · Opcional.

Tamanho da janela retroativa em horas: padrão 24, mínimo 1 e máximo 2160 (90 dias). Não é uma data inicial absoluta.

Exemplo: 24

customer_idUUID em string · Opcional.

Filtra pelo cliente interno do Partner, não por external_customer_id. Pode ser usado junto com um filtro de instância, quando ambos são pertinentes.

Exemplo: 11111111-2222-4333-8444-555555555555

partner_customer_idUUID em string · Opcional.

Alias de customer_id. Se ambos forem enviados, devem conter o mesmo UUID; valores diferentes são rejeitados.

Exemplo: 11111111-2222-4333-8444-555555555555

instance_idUUID em string · Opcional.

Filtra pela instância interna do Partner. Aqui é um filtro de consulta, não phone_number_id da Meta.

Exemplo: 22222222-3333-4444-8555-666666666666

partner_instance_idUUID em string · Opcional.

Alias de instance_id. Use apenas um nome de campo; se informar ambos, os UUIDs precisam coincidir.

Exemplo: 22222222-3333-4444-8555-666666666666

alert_pageinteiro · Opcional.

Página dos alertas, começando em 1. A paginação dos alertas é independente da lista de eventos de mensagens.

Exemplo: 1

alert_page_sizeinteiro · Opcional.

Quantidade de alertas por página, entre 1 e 200. Use 5, 10, 20, 50 ou 100; a resposta confirma o tamanho e a página efetiva.

Exemplo: 20

alert_searchstring · Opcional.

Busca texto nos alertas do parceiro. Combine com alert_status para localizar um incidente aberto ou histórico.

Exemplo: pagamento

alert_statusstring · Opcional.

Use open, acknowledged, resolved ou all. O padrão é open. A janela window_hours é aplicada às métricas de mensagens; não encerra nem oculta incidentes mais antigos que continuam abertos.

Exemplo: open

Como ler a resposta

Retorna ok, partner_id, summary e alerts. summary inclui window_hours, from, total_messages, accepted, sent, delivered, read, failed, deleted, error_131049, error_131042, error_131026, error_other, failure_rate, open_alerts, critical_alerts, top_errors e top_templates. failure_rate é uma fração entre 0 e 1; multiplique por 100 somente para exibir percentagem. top_errors agrupa códigos/títulos e contagens; top_templates inclui template_name, failed_count e total_count. Os contadores são calculados a partir dos estados consolidados, não da quantidade bruta de eventos sent/delivered/read. alerts é uma página com items,total,page,page_size,pages, limitada a 20 itens na chamada padrão. Atenção: os filtros customer_id/instance_id são passados ao resumo, mas a consulta de alerts nesta implementação é do parceiro inteiro; não atribua automaticamente todos esses alertas ao cliente filtrado. alerts contém items,total,page,page_size,pages e respeita o filtro de cliente/instância. Use alert_page/alert_page_size para navegar e alert_search/alert_status para pesquisar os incidentes; a janela de mensagens não é um corte temporal dos alertas.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 invalid_window_hours: use um inteiro entre 1 e 2160.
  • 400 invalid_customer_id/invalid_partner_customer_id/invalid_instance_id/invalid_partner_instance_id: um filtro não é UUID.
  • 400 conflicting_identifiers: aliases do mesmo recurso contêm UUIDs diferentes.
  • 500 delivery_health_failed: a agregação ou a busca de alertas falhou.

Depois desta chamada

  • Mostre a janela junto aos indicadores e identifique quando a atualização falhar.
  • Use search-partner-delivery-events para abrir os eventos de uma instância/campanha antes de tirar conclusões sobre a causa.
  • Para triagem humana, reconheça um alerta pela rota acknowledge; para registrar a correção efetiva, use resolve com uma nota.

Regras desta operação

  • Taxa de falha baixa não comprova ausência de problemas quando parte dos status não está sendo reportada.
  • Não some sent + delivered + read como mensagens diferentes: o estado consolidado de cada mensagem avança.
  • A lista alerts não herda os filtros de cliente e instância do resumo; filtre a apresentação pelos IDs dos alertas se precisar de um painel estritamente individual.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
GETPesquisa eventos de entrega do parceiro com filtros e paginação.
search-partner-delivery-events

Pesquisar o histórico dos eventos de entrega relatados, com filtros por mensagem, erro, template, campanha, cliente e instância.

Quando usar

Use na investigação de uma mensagem ou na exportação operacional de falhas para uma planilha/sistema de suporte do assinante.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Ter eventos previamente reportados.
  • Distinguir eventos individuais do estado consolidado: uma mesma mensagem pode ter vários eventos válidos.

Autenticação e permissão

Partner API Key ativa com meta_risk.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=search-partner-delivery-events&page=1&page_size=20
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

searchstring · Opcional.

Busca textual em identificador da mensagem, template, campanha, erro e dados de identificação do cliente disponíveis na consulta.

Exemplo: pedido-4501

statusstring · Opcional.

Filtra o estado do evento: accepted, sent, delivered, read, failed ou deleted.

Exemplo: failed

error_codestring · Opcional.

Código de erro exato a investigar.

Exemplo: 131049

template_namestring · Opcional.

Busca parcial no nome do template relacionado.

Exemplo: confirmacao

campaign_idstring · Opcional.

Identificador exato da campanha atribuído nos relatórios.

Exemplo: campanha-pos-venda-2026-09

customer_idUUID em string · Opcional.

Filtra pelo cliente interno do Partner, não por external_customer_id. Pode ser usado junto com um filtro de instância, quando ambos são pertinentes.

Exemplo: 11111111-2222-4333-8444-555555555555

partner_customer_idUUID em string · Opcional.

Alias de customer_id. Se ambos forem enviados, devem conter o mesmo UUID; valores diferentes são rejeitados.

Exemplo: 11111111-2222-4333-8444-555555555555

instance_idUUID em string · Opcional.

Filtra pela instância interna do Partner. Aqui é um filtro de consulta, não phone_number_id da Meta.

Exemplo: 22222222-3333-4444-8555-666666666666

partner_instance_idUUID em string · Opcional.

Alias de instance_id. Use apenas um nome de campo; se informar ambos, os UUIDs precisam coincidir.

Exemplo: 22222222-3333-4444-8555-666666666666

date_fromstring de data/hora · Opcional.

Limite inicial inclusivo do período. Prefira ISO 8601 com fuso para não depender do fuso do sistema. Na busca de entregas também aceita YYYY-MM-DD; o filtro usa o instante do evento.

Exemplo: 2026-09-01T00:00:00-03:00

date_tostring de data/hora · Opcional.

Limite final inclusivo. Envie data/hora completa se quiser incluir o último dia inteiro: uma data simples representa meia-noite, não 23:59:59. Não use valor anterior a date_from.

Exemplo: 2026-09-11T23:59:59-03:00

pageinteiro · Opcional.

Página numerada a partir de 1; padrão 1. Nas rotas com validação apiPagination, aceita de 1 a 1.000.000. No da integração, incremente somente depois de processar os itens da página atual.

Exemplo: 1

page_sizeinteiro · Opcional.

Quantidade de itens por página; padrão 50 e máximo 200. Use 50 inicialmente. Não confunda total de registros com tamanho do array items desta resposta.

Exemplo: 50

sortstring · Opcional.

Use asc para ordem cronológica crescente ou desc para decrescente. O código trata valores diferentes de asc como desc; envie somente os valores esperados.

Exemplo: desc

Como ler a resposta

Retorna ok, partner_id, items,total,page,page_size,pages. Cada item corresponde a uma linha de evento, com os identificadores, delivery_status, occurred_at, message_id, campos de erro/classificação, referência de template/campanha e metadados sanitizados gravados pelo relatório. A consulta acrescenta customer_name, external_customer_id, instance_key, instance_name e partner_name. Não espere o destinatário bruto ou o texto completo da mensagem: esses dados não fazem parte do relatório de saúde. Para decidir o estado final de uma mensagem, não basta contar eventos ou escolher um evento antigo isolado.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 invalid_pagination: page/page_size fora dos limites.
  • 400 invalid_date_from/invalid_date_to: data inválida ou sem fuso quando exigido; prefira ISO completo.
  • 400 invalid_date_range: date_from posterior a date_to.
  • 400 conflicting_identifiers ou invalid_<campo>: revise aliases e UUIDs dos filtros.
  • 500 delivery_event_search_failed: falha ao pesquisar o histórico.

Depois desta chamada

  • No da integração, percorra pages mantendo os filtros constantes e guarde o ponto de retomada se a exportação for longa.
  • Agrupe por message_id e instância para investigar a sequência de status.
  • Inclua IDs técnicos e código de erro no chamado de suporte; evite exportar informações que não sejam necessárias à investigação.

Regras desta operação

  • O total desta rota conta eventos, não mensagens únicas; não o use diretamente como denominador da taxa de entrega.
  • Um filtro até YYYY-MM-DD termina à meia-noite. Use data/hora explícita para incluir o restante do dia.
  • O Partner armazena metadados de diagnóstico; o conteúdo da mensagem e o processamento externo do cliente permanecem sob responsabilidade do sistema dele.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
POSTReconhece alerta de entrega. API key é recusada pelo gate de role, mesmo com meta_risk.write.
acknowledge-partner-delivery-alert

Marcar um alerta de saúde de entrega como reconhecido por um operador responsável.

Quando usar

Use quando a equipe assumir a investigação, antes de a causa estar necessariamente resolvida.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal antes de acessar os recursos operacionais. O perfil do membro e suas permissões continuam sendo conferidos.
  • Obter alert_id de um alerta do parceiro.
  • Usar a sessão de membro autorizado para a triagem. Uma chave de API de integração não substitui o papel humano exigido nesta operação.

Autenticação e permissão

Exige access_token obtido no login de membro. A Partner API Key não é aceita nesta operação. Funções permitidas: owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=acknowledge-partner-delivery-alert
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer ACCESS_TOKEN_DO_MEMBRO",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "alert_id": "ALERT_ID",
  "notes": "Alerta em análise"
}

O que preencher em cada campo

alert_idUUID em string · Obrigatório.

ID do alerta de saúde de entrega, não do evento de mensagem nem do alerta de risco Meta.

Exemplo: 11111111-2222-4333-8444-555555555555

notesstring · Opcional.

Nota sobre a investigação assumida. É guardada em metadata.acknowledgement_notes.

Exemplo: Equipe iniciou análise da falha recorrente nesta instância.

Como ler a resposta

Retorna ok=true e alert com a linha atualizada. O status passa para acknowledged, com acknowledged_at, acknowledged_by e a nota de reconhecimento em metadata.acknowledgement_notes. O alerta continua sendo um problema acompanhado; não é encerrado por este reconhecimento.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal. Não faça retry automático.
  • 400 invalid_alert_id: o identificador não é UUID.
  • 404 delivery_alert_not_found: alerta inexistente.
  • 403 delivery_alert_access_denied ou delivery_alert_acknowledge_forbidden: recurso de outro parceiro ou sessão sem permissão.
  • 500 delivery_alert_acknowledge_failed: atualização não concluída.

Depois desta chamada

  • Atualize a interface usando o alert retornado.
  • Investigue os eventos relacionados; depois da correção efetiva, use resolve-partner-delivery-alert com uma explicação do que foi feito.

Regras desta operação

  • Não reconheça todos os alertas automaticamente apenas para zerar indicadores: a ação registra responsabilidade de atendimento.
  • Reconhecer não muda credenciais Meta, não regulariza pagamento e não reenviará mensagens.
POSTResolve alerta localmente; não corrige erro remoto da Meta.
resolve-partner-delivery-alert

Registrar o encerramento manual de um alerta de entrega, com a justificativa da resolução.

Quando usar

Use depois de a causa ter sido verificada e corrigida, por exemplo após confirmar uma entrega bem-sucedida ou concluir a orientação operacional.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal antes de acessar os recursos operacionais. O perfil do membro e suas permissões continuam sendo conferidos.
  • Ter o ID do alerta de entrega e a conclusão da análise.
  • Usar uma sessão de membro com permissão de triagem/resolução.

Autenticação e permissão

Exige access_token obtido no login de membro. A Partner API Key não é aceita nesta operação. Funções permitidas: owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=resolve-partner-delivery-alert
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer ACCESS_TOKEN_DO_MEMBRO",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "alert_id": "ALERT_ID",
  "resolution_notes": "Causa revisada pelo responsável"
}

O que preencher em cada campo

alert_idUUID em string · Obrigatório.

Identificador do alerta de saúde de entrega a encerrar.

Exemplo: 11111111-2222-4333-8444-555555555555

notesstring não vazia · Condicional: obrigatório se resolution_notes não for informado.

Descrição objetiva da causa e da correção. Tem precedência se ambos os nomes forem enviados.

Exemplo: Configuração corrigida e entrega de teste confirmada.

resolution_notesstring não vazia · Condicional: alternativa a notes.

Alias para a nota de resolução. Não envie apenas espaços nem use uma nota genérica que esconda um problema ainda ativo.

Exemplo: Configuração corrigida e entrega de teste confirmada.

Como ler a resposta

Retorna ok=true e alert atualizado: status=resolved, resolved_at, resolved_by, resolution_notes e metadata.resolved_by_source. O histórico do alerta permanece; a ação não apaga eventos de falha anteriores.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal. Não faça retry automático.
  • 400 invalid_alert_id: informe UUID válido.
  • 400 resolution_notes_required: notes/resolution_notes ausente ou vazio.
  • 404 delivery_alert_not_found: alerta não encontrado.
  • 403 delivery_alert_access_denied ou delivery_alert_resolve_forbidden: acesso recusado.
  • 500 delivery_alert_resolve_failed: falha ao registrar o encerramento.

Depois desta chamada

  • Mostre a nota e o horário de resolução no histórico do atendimento.
  • Continue monitorando novos relatórios de entrega para identificar recorrências.

Regras desta operação

  • Encerrar manualmente o alerta não corrige a causa técnica por si só.
  • Novas falhas podem gerar ou reabrir um acompanhamento; a resolução não funciona como bloqueio permanente de novos alertas.
GETConsulta resumo de riscos, bloqueios e alertas do parceiro.
get-meta-risk-dashboard

Consultar o panorama de risco Meta do parceiro, incluindo alertas e clientes com restrições para novas conexões.

Quando usar

Use no painel administrativo do assinante para identificar contas, instâncias e templates que exigem atenção antes de ampliar a operação.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Ter a integração Meta e o recebimento/processamento de eventos de gestão configurados.
  • Entender que o painel reflete os eventos e estados conhecidos pela HookCloud, não uma auditoria em tempo real de toda a conta Meta.

Autenticação e permissão

Partner API Key ativa com meta_risk.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-meta-risk-dashboard
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

customer_idUUID · query · Opcional

Restringe incident_history a um cliente do parceiro. Não altera o resumo geral nem a lista de até 100 estados atuais.

Exemplo: UUID_DO_CLIENTE

instance_idUUID · query · Opcional

Restringe incident_history a uma instância. Se combinar com customer_id, a instância precisa pertencer a esse cliente.

Exemplo: UUID_DA_INSTANCIA

page / page_sizeinteiros · query · Opcional

Paginação de incident_history. page começa em 1; page_size aceita de 1 a 200. Use 5, 10, 20, 50 ou 100 conforme sua interface.

Exemplo: 1 / 20

Como ler a resposta

Retorna ok, partner_id, summary, settings, customer_states e latest_alerts. summary traz open_alerts, critical_alerts, high_alerts, unacknowledged_alerts, blocked_customers, risky_instances, disabled_wabas, risky_templates e latest_alert_at. open_alerts inclui os abertos e reconhecidos. settings contém a configuração de monitoramento consultada, sem oferecer alteração por esta rota. customer_states contém até 100 estados, priorizados por quantidade de instâncias em risco, com partner_customer_id, risky_instances_count, flagged_instances_count, red_instances_count, disabled_instances_count, risk_level, block_new_connections, manual_block_override, manual_block_reason, threshold_reached_at, last_event_at, reviewed_at, review_notes e dados do customer/partner associados. latest_alerts é a primeira página de 10 alertas no formato items,total,page,page_size,pages. incident_history traz incidentes BAN/RED separados dos alertas operacionais e sua cobertura histórica. current_state_coverage.limit=100 e truncated indicam o limite dos destaques atuais. A paginação solicitada aplica-se a incident_history, não a customer_states/latest_alerts. customer_risk contém a política individual do cliente: ban_count_30d, red_count_30d, limits={ban:20,red:5}, window_days=30, block_new_connections, reasons, next_exit_at, next_unlock_at e a cobertura histórica. Os limites bloqueiam novas conexões desse cliente, mesmo com vagas no pacote, sem desligar números existentes. Atualize seu cache com hookcloud.customer.risk_updated e reconcilie pela Partner API.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 500 meta_risk_dashboard_failed: falha ao carregar algum componente do painel. Não converta ausência de resposta em "sem riscos".

Depois desta chamada

  • Apresente primeiro clientes com block_new_connections=true e alertas de maior severidade.
  • Use search-meta-risk-alerts para investigar os alertas e acknowledge-meta-risk-alert quando um responsável assumir a análise.
  • Associe os registros ao partner_customer_id correto antes de mostrar risco a um cliente do assinante.

Regras desta operação

  • block_new_connections impede novas conexões conforme a política de risco; esse indicador não significa que o sistema desconectou automaticamente todos os números existentes.
  • O limite de 100 customer_states é uma lista de destaque, não uma exportação completa de todos os clientes do parceiro.
  • Não crie uma automação para contornar um bloqueio de risco com outro cadastro de cliente; investigue e regularize a origem.
  • Reconhecer um alerta não elimina um episódio de BAN/RED. Um evento genérico de conta ativa não prova que a Meta removeu um banimento. O histórico começa na implantação desta coleta, sem preenchimento retroativo fictício.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
GETPesquisa alertas Meta do parceiro.
search-meta-risk-alerts

Pesquisar alertas de risco Meta por texto, estado, severidade, categoria e período.

Quando usar

Use em uma fila de atendimento ou investigação, por exemplo para separar alertas críticos ainda abertos de itens já reconhecidos.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Conhecer os estados e categorias dos alertas retornados no próprio ambiente. Não é necessário aplicar todos os filtros.

Autenticação e permissão

Partner API Key ativa com meta_risk.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=search-meta-risk-alerts&page=1&page_size=20
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

searchstring · Opcional.

Busca textual nos dados de alerta e referências relacionadas disponibilizados pela consulta.

Exemplo: qualidade

statusstring · Opcional.

Estado do alerta, por exemplo open, acknowledged ou resolved. Use o estado real retornado pela API.

Exemplo: open

severitystring · Opcional.

Severidade registrada, por exemplo critical ou high. É um filtro de diagnóstico, não uma alteração da severidade.

Exemplo: critical

categorystring · Opcional.

Código da categoria do alerta. Prefira copiar category de um alerta real; categorias de risco Meta não são necessariamente as mesmas da saúde de entrega.

Exemplo: meta_payment_issue

date_fromstring de data/hora · Opcional.

Limite inicial inclusivo do período. Prefira ISO 8601 com fuso para não depender do fuso do sistema. Na busca de entregas também aceita YYYY-MM-DD; o filtro usa o instante do evento.

Exemplo: 2026-09-01T00:00:00-03:00

date_tostring de data/hora · Opcional.

Limite final inclusivo. Envie data/hora completa se quiser incluir o último dia inteiro: uma data simples representa meia-noite, não 23:59:59. Não use valor anterior a date_from.

Exemplo: 2026-09-11T23:59:59-03:00

pageinteiro · Opcional.

Página numerada a partir de 1; padrão 1. Nas rotas com validação apiPagination, aceita de 1 a 1.000.000. No da integração, incremente somente depois de processar os itens da página atual.

Exemplo: 1

page_sizeinteiro · Opcional.

Quantidade de itens por página; padrão 50 e máximo 200. Use 50 inicialmente. Não confunda total de registros com tamanho do array items desta resposta.

Exemplo: 50

sortstring · Opcional.

Use asc para ordem cronológica crescente ou desc para decrescente. O código trata valores diferentes de asc como desc; envie somente os valores esperados.

Exemplo: desc

Como ler a resposta

Retorna ok, partner_id e a página items,total,page,page_size,pages. items contém os registros de meta_risk_alerts enriquecidos pela consulta, com id, status, severity, category, title, description, referências de parceiro/cliente/instância/WABA quando disponíveis, metadata e datas de reconhecimento/resolução. Use id como alert_id para reconhecimento. total corresponde ao conjunto filtrado; um array vazio é resultado válido.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 500 meta_risk_alert_search_failed: erro na pesquisa. Valide na sua integração datas ISO e paginação; esta família de consultas não deve ser usada para testar coerções de tipos do banco.

Depois desta chamada

  • Percorra pages caso precise de todos os registros; mantenha os filtros nas páginas seguintes.
  • Abra o contexto do cliente/instância antes de acionar uma correção.
  • Ao assumir um caso, chame acknowledge-meta-risk-alert com uma nota objetiva.

Regras desta operação

  • Esta rota consulta risco de gestão Meta. Para pesquisar estados sent/delivered/read de mensagens, use search-partner-delivery-events.
  • Alertas não são provas de indisponibilidade global da Meta: leia a categoria, a descrição e a origem concreta de cada ocorrência.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
POSTReconhece alerta Meta. API key é recusada; a resolução administrativa é exclusiva da HookCloud.
acknowledge-meta-risk-alert

Registrar que um operador reconheceu um alerta de risco Meta e assumiu sua análise.

Quando usar

Use depois de ler o alerta e atribuir responsabilidade de atendimento, mesmo que a causa ainda esteja sendo investigada.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal antes de acessar os recursos operacionais. O perfil do membro e suas permissões continuam sendo conferidos.
  • Ter alert_id de search-meta-risk-alerts ou do painel de risco.
  • Autenticar um membro com papel permitido; esta mutação de triagem não é liberada apenas por usar uma chave de API do parceiro.

Autenticação e permissão

Exige access_token obtido no login de membro. A Partner API Key não é aceita nesta operação. Funções permitidas: owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=acknowledge-meta-risk-alert
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer ACCESS_TOKEN_DO_MEMBRO",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "alert_id": "ALERT_ID",
  "notes": "Alerta em análise"
}

O que preencher em cada campo

alert_idUUID em string · Obrigatório.

ID do alerta de risco Meta. Não use o ID de um alerta de saúde de entrega.

Exemplo: 11111111-2222-4333-8444-555555555555

notesstring · Opcional.

Nota de reconhecimento, guardada em metadata.acknowledgement_notes.

Exemplo: Responsável verificará a configuração da conta Meta com o cliente.

Como ler a resposta

Retorna ok e alert com status=acknowledged, acknowledged_at, acknowledged_by e a nota em metadata.acknowledgement_notes. Os demais dados do alerta permanecem disponíveis para investigação.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal. Não faça retry automático.
  • 400 invalid_alert_id: identificador inválido.
  • 404 meta_risk_alert_not_found: alerta não encontrado.
  • 403 meta_risk_alert_access_denied: alerta fora do parceiro autorizado.
  • 403 meta_risk_acknowledge_forbidden: sessão/papel não autorizado a reconhecer.
  • 500 meta_risk_alert_acknowledge_failed: reconhecimento não registrado.

Depois desta chamada

  • Atualize a fila de atendimento usando o alert retornado.
  • Investigue o motivo na conta, instância ou template indicado. A regularização da causa pode exigir ação na Meta ou análise administrativa da HookCloud.

Regras desta operação

  • Reconhecer não remove block_new_connections, não aprova nome de exibição e não conclui verificações da Meta.
  • Não existe, entre as rotas de assinante desta ficha, um comando genérico para encerrar qualquer risco administrativo. Não reutilize resolve-partner-delivery-alert com um ID de risco Meta.

Pacotes e capacidade

Consultar vagas, calcular uma proposta, contratar ou programar uma redução.

GETConsultar assinatura e capacidade disponível
get-partner-billing-summary

Consultar a assinatura, o catálogo de pacotes, a capacidade ocupada e as pendências de cobrança do parceiro autenticado.

Quando usar

Use antes de mostrar preços/limites, propor uma mudança ou informar o resultado de um checkout. É a consulta de referência para o estado de assinatura.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • Usar a credencial do parceiro correto e conferir environment na resposta.
  • Não é necessário fornecer partner_id, subscription_id ou customer_id Stripe no corpo: o vínculo é resolvido pelo servidor.

Autenticação e permissão

Partner API Key ativa com billing.read ou *. Se optar por JWT, as funções permitidas são owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-partner-billing-summary
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

Esta operação não exige campos adicionais. A identidade do parceiro vem da autenticação.

Como ler a resposta

Retorna ok, billing_model="number_packs_v2", environment, catalog, packs, status, number_limit, used_numbers, available_numbers, monthly_price_cents, period_end, cancel_at_period_end, pending_change, checkout_url, payment_pending, payment_url, trial e trial_days. catalog lista os pacotes suportados; packs representa o total contratado. Os códigos atuais são partner_numbers_4 (4 números; 9990 centavos/mês), partner_numbers_25 (25; 49990 centavos/mês) e partner_numbers_100 (100; 150000 centavos/mês). status vem do estado reconciliado da assinatura ou unsubscribed. pending_change, quando existe, contém id,packs,number_limit,recurring_cents,status. available_numbers desconta used_numbers do menor limite entre o vigente e uma redução já agendada. trial, quando disponível, contém started_at e ends_at; trial_days=3 indica elegibilidade para um trial ainda não usado e 0 indica que ele já foi usado, não quantos dias restam do trial atual. checkout_url e payment_url podem ser nulos. Campos adicionais: paid_capacity_current_period é null sem pagamento comprovado; used_slots são números em uso; reserved_slots são reservas não consumidas; available_slots respeita o menor limite atual/futuro; renewal_capacity é a capacidade programada. paid_period{start,end,invoice_id,subscription_id}, observed_period, original_contract_started_at, next_billing_at, latest_invoice{id,status,due_at,paid_at,amount_due_cents,amount_remaining_cents,billing_reason}, payment_evidence{status,source}. Campos ausentes continuam null; não inferir mensalidade paga por status active ou trialing.

Erros e como agir

  • 409 billing_change_in_progress: outra operação de assinatura está em curso; aguarde e consulte novamente.
  • 503 number_pack_billing_unavailable, billing_storage_unavailable ou capacity_unavailable: o serviço não conseguiu reconciliar cobrança/capacidade. Não invente limites na sua integração.

Depois desta chamada

  • Mostre capacidade vigente, ocupação e mudança agendada separadamente.
  • Se houver checkout_url ou payment_url, ofereça o link ao responsável autorizado.
  • Para alteração de pacotes, monte o total desejado e chame preview-number-pack-change.

Regras desta operação

  • Em produção, operações de aplicação e gestão de assinatura podem alterar uma cobrança real. No da integração, deixe essas ações atrás de uma decisão explícita do assinante; não execute toda a coleção de nós em sequência.
  • Os valores monetários são inteiros em centavos de real. 9990 significa R$ 99,90. Não envie números de ponto flutuante nem formate valores como "99,90" na API.
  • O modelo ativo é number_packs_v2, com capacidade compartilhada por números entre os clientes do parceiro. Não é o antigo pacote de quantidade de clientes.
  • Esta consulta pode conferir a Stripe e reconciliar o estado local. Não cria uma cobrança nova, mas também não é apenas uma leitura estática do banco.
  • Nunca calcule a disponibilidade apenas por number_limit-used_numbers quando existir pending_change: use available_numbers retornado.
  • Um status de pagamento pendente não autoriza liberar capacidade adicional no seu sistema.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.

Aliases aceitos: get-partner-stripe-billing-summary. Prefira o nome do exemplo.

POSTCalcular uma mudança de pacotes
preview-number-pack-change

Calcular e registrar uma proposta de alteração do conjunto total de pacotes, com valor imediato, recorrência e momento de aplicação.

Quando usar

Use quando o assinante escolher contratar, aumentar ou reduzir os pacotes. A prévia deve ser apresentada antes da aplicação financeira.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Consultar o resumo atual e a ocupação antes de montar a proposta.
  • Decidir o total final desejado, incluindo os pacotes que continuarão contratados.
  • Usar a mesma identidade de autenticação na prévia e na aplicação: a proposta é vinculada ao parceiro e ao ator (chave ou usuário).

Autenticação e permissão

Partner API Key ativa com billing.write ou *. Se optar por JWT, as funções permitidas são owner, admin.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=preview-number-pack-change
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "packs": [
    {
      "code": "OAUTH_CODE",
      "quantity": 1
    }
  ]
}

O que preencher em cada campo

packsarray de objetos · Obrigatório.

Conjunto TOTAL desejado, não uma lista de adicionais. De 1 a 3 entradas, com códigos únicos. Ao omitir um código do conjunto final, ele não permanece contratado por padrão. Deve haver pelo menos uma quantidade positiva.

Exemplo: [{"code":"partner_numbers_25","quantity":1}]

packs[].codestring enum · Obrigatório.

Código do pacote de cada item: partner_numbers_4, partner_numbers_25 ou partner_numbers_100. Não envie price_id Stripe nem o nome comercial como substituto.

Exemplo: partner_numbers_25

packs[].quantityinteiro JSON · Obrigatório.

Quantidade desse pacote no total final: inteiro de 0 a 100, sem casas decimais. Zero retira o código do conjunto normalizado. O texto "2" é inválido aqui: configure a expressão do seu sistema para produzir número.

Exemplo: 1

Como ler a resposta

Retorna ok e a proposta: id, packs, timing, amount_due_cents, recurring_cents, number_limit, expires_at, trial_days e effective_at. timing pode ser checkout para nova contratação, immediate para aumento aplicável agora ou renewal para redução na renovação. amount_due_cents é o valor previsto para cobrança imediata; recurring_cents é a mensalidade resultante. Uma contratação elegível ao trial de 3 dias pode ter amount_due_cents=0 sem ser um plano gratuito. A prévia é salva no servidor; ela não cobra nem libera capacidade. expires_at deve ser respeitado; use o id retornado como quote_id na aplicação.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 400 invalid_packs: packs não é um array válido de 1 a 3 entradas.
  • 400 invalid_pack_quantity: código desconhecido/duplicado ou quantidade não inteira/fora de 0 a 100.
  • 400 use_subscription_cancellation: todas as quantidades são zero; use a rota de cancelamento da assinatura.
  • 409 numbers_in_use_exceed_target: o total pretendido não comporta os números em uso. Exemplo: 7 números ocupados impedem reduzir para 4.
  • 409 packs_unchanged: o conjunto desejado já é o atual.
  • 409 cancel_scheduled_change_first ou scheduled_change_exists: existe mudança futura; resolva-a antes de criar outra.
  • 409 billing_payment_required, payment_update_pending, subscription_cancellation_pending, automatic_collection_required ou outstanding_invoice: a situação da assinatura precisa ser regularizada antes da alteração.
  • 409 billing_change_in_progress: outra alteração está sendo processada.

Depois desta chamada

  • Apresente amount_due_cents, recurring_cents, number_limit, timing, effective_at e trial_days ao assinante.
  • Após decisão explícita, aplique exatamente esse id por apply-number-pack-change.
  • Se o usuário mudar a escolha ou a proposta expirar, faça uma nova prévia e mostre novamente os valores.

Regras desta operação

  • Em produção, operações de aplicação e gestão de assinatura podem alterar uma cobrança real. No da integração, deixe essas ações atrás de uma decisão explícita do assinante; não execute toda a coleção de nós em sequência.
  • Os valores monetários são inteiros em centavos de real. 9990 significa R$ 99,90. Não envie números de ponto flutuante nem formate valores como "99,90" na API.
  • O modelo ativo é number_packs_v2, com capacidade compartilhada por números entre os clientes do parceiro. Não é o antigo pacote de quantidade de clientes.
  • Exemplo: quem já possui 1 pacote de 4 e quer terminar com 8 números envia quantity=2 para partner_numbers_4; enviar quantity=1 não adiciona outro pacote.
  • Qualquer redução de capacidade OU mensalidade é tratada para a renovação, conforme as regras do serviço. Não suponha aplicação imediata de uma redução.
  • A trava de downgrade não desconecta números automaticamente. É necessário reduzir a ocupação por uma decisão separada do assinante antes de propor um limite menor.
  • Não aplique automaticamente uma prévia só porque o HTTP retornou 200. A prévia é uma etapa de revisão comercial.
POSTConfirmar a mudança de pacotes
apply-number-pack-change

Aplicar uma proposta de pacotes previamente calculada e aceita, iniciando checkout, atualização de assinatura ou redução agendada conforme a proposta.

Quando usar

Use somente depois de exibir a prévia ao assinante e receber sua decisão de contratar/alterar.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal. A API Key não pode enviar esse cadastro; consulte get-partner-onboarding-status para identificar registration_complete=false.
  • Ter quote_id retornado por preview-number-pack-change, ainda válido.
  • Usar o mesmo parceiro e ator que criaram a prévia.
  • Preservar o mesmo quote_id em uma repetição após timeout; não criar uma nova compra automaticamente.

Autenticação e permissão

Partner API Key ativa com billing.write ou *. Se optar por JWT, as funções permitidas são owner, admin.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=apply-number-pack-change
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "quote_id": "UUID_DA_PROPOSTA"
}

O que preencher em cada campo

quote_idUUID em string · Obrigatório.

Valor id retornado pela prévia. Esta rota não aceita packs no lugar de uma proposta e não deve receber um price_id Stripe.

Exemplo: 11111111-2222-4333-8444-555555555555

Como ler a resposta

Retorna ok e um resultado de fluxo. status=checkout vem com url para o assinante concluir a contratação. status=payment_pending ou applied pode vir com url de fatura ou null, conforme a atualização imediata. status=scheduled vem com effective_at para a redução na renovação. Um pedido repetido com a mesma proposta pode devolver o resultado já armazenado. A capacidade só é liberada após a confirmação aplicável da Stripe; payment_pending não equivale a pagamento concluído. Leia o resumo de cobrança para confirmar o estado reconciliado.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal antes desta operação. Não faça retry automático nem envie documentos nos campos de clientes.
  • 404 quote_not_found: a proposta não existe para o parceiro/ator atual; confira a credencial usada na prévia.
  • 409 quote_expired ou quote_not_available: a proposta expirou ou não está em estado aplicável.
  • 409 quote_stale ou quote_amount_changed: a assinatura/valor mudou desde a prévia; refaça a proposta e obtenha nova decisão.
  • 409 numbers_in_use_exceed_target: a ocupação mudou e já não cabe no limite pretendido.
  • 409 checkout_already_open: existe checkout aberto; consulte o resumo em vez de criar uma duplicata.
  • 409 checkout_pending_reconciliation ou billing_reconciliation_required: o resultado anterior exige reconciliação; não contorne com uma compra nova.
  • 409 billing_change_in_progress: operação concorrente em andamento.
  • Falha de pagamento/Stripe: preserve o diagnóstico e use payment_url/checkout_url quando disponibilizados. Uma recusa de cartão não deve ser tratada como capacidade liberada.

Depois desta chamada

  • Se checkout, entregue a url ao assinante em um navegador; o cliente HTTP da integração não substitui a interação de pagamento.
  • Se scheduled, apresente a data efetiva e o futuro limite. Se payment_pending, aguarde a regularização.
  • Depois, consulte get-partner-billing-summary e atualize a interface com o estado real.

Regras desta operação

  • Em produção, operações de aplicação e gestão de assinatura podem alterar uma cobrança real. No da integração, deixe essas ações atrás de uma decisão explícita do assinante; não execute toda a coleção de nós em sequência.
  • Os valores monetários são inteiros em centavos de real. 9990 significa R$ 99,90. Não envie números de ponto flutuante nem formate valores como "99,90" na API.
  • O modelo ativo é number_packs_v2, com capacidade compartilhada por números entre os clientes do parceiro. Não é o antigo pacote de quantidade de clientes.
  • A idempotência é vinculada à proposta. Em timeout, repita o mesmo quote_id com a mesma identidade, em vez de gerar outra proposta sem saber o resultado anterior.
  • A redução agendada reserva o limite futuro para impedir novas conexões que tornariam a redução impossível. available_numbers pode diminuir antes da renovação.
  • Não publique links de checkout/fatura em logs acessíveis a todos os clientes do assinante.
POSTCancela alteração futura de pacotes já agendada.
cancel-number-pack-change

Cancelar a mudança de pacotes que está agendada para uma renovação futura.

Quando usar

Use quando o assinante desistir de uma redução já agendada ou precisar rever a proposta futura.

Antes de começar

  • Ter uma mudança agendada no resumo de cobrança.
  • Obter a decisão do responsável de cancelar essa mudança específica.

Autenticação e permissão

Partner API Key ativa com billing.write ou *. Se optar por JWT, as funções permitidas são owner, admin.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=cancel-number-pack-change
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{}

O que preencher em cada campo

Esta operação não exige campos adicionais. A identidade do parceiro vem da autenticação.

Como ler a resposta

Retorna ok=true e status="canceled" quando a mudança futura é cancelada. O serviço libera o agendamento na Stripe e remove a referência/limite pendente no estado interno. Esta resposta diz respeito à mudança de pacotes, não ao cancelamento da assinatura vigente.

Erros e como agir

  • 404 scheduled_change_not_found: não existe mudança futura para cancelar.
  • 409 scheduled_change_already_effective: a alteração já foi efetivada; não pode ser desfeita como agendamento.
  • 409 schedule_reconciliation_required: o estado do agendamento exige reconciliação antes de nova ação.
  • 409 billing_change_in_progress: aguarde a operação em curso.

Depois desta chamada

  • Consulte novamente o resumo e confirme pending_change=null.
  • Se o assinante desejar outra composição, crie uma nova prévia usando o total final pretendido.

Regras desta operação

  • Em produção, operações de aplicação e gestão de assinatura podem alterar uma cobrança real. No da integração, deixe essas ações atrás de uma decisão explícita do assinante; não execute toda a coleção de nós em sequência.
  • Os valores monetários são inteiros em centavos de real. 9990 significa R$ 99,90. Não envie números de ponto flutuante nem formate valores como "99,90" na API.
  • O modelo ativo é number_packs_v2, com capacidade compartilhada por números entre os clientes do parceiro. Não é o antigo pacote de quantidade de clientes.
  • Não use esta rota para cancelar a assinatura. Para isso existe cancel-stripe-subscription.
  • Cancelar a mudança futura não estorna automaticamente cobranças que já ocorreram.
  • A rota de recuperação/cancelamento de cobrança continua acessível com as permissões existentes mesmo enquanto o cadastro obrigatório do proprietário estiver pendente.
POSTGera URL privada do portal Stripe para assinatura/cliente existentes.
create-billing-portal-session

Gerar uma sessão temporária do portal de cobrança Stripe associado ao parceiro.

Quando usar

Use quando o assinante precisar abrir a gestão de pagamento/faturas nas opções liberadas pelo portal configurado.

Antes de começar

  • Ter uma assinatura vinculada ao parceiro e a configuração do portal disponível no ambiente.
  • Entregar o link apenas ao responsável autorizado pela cobrança.

Autenticação e permissão

Partner API Key ativa com billing.write ou *. Se optar por JWT, as funções permitidas são owner, admin.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=create-billing-portal-session
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{}

O que preencher em cada campo

Esta operação não exige campos adicionais. A identidade do parceiro vem da autenticação.

Como ler a resposta

Retorna ok=true e url da sessão de portal Stripe. A criação da sessão não representa, por si só, pagamento ou alteração de plano. As ações disponíveis dentro do portal dependem da configuração da HookCloud na Stripe.

Erros e como agir

  • 404 subscription_not_found: não há assinatura vinculada para abrir o portal.
  • 503 billing_portal_not_configured: o portal não está configurado no ambiente.
  • 503 number_pack_billing_unavailable: falha de integração ao gerar a sessão.

Depois desta chamada

  • Abra/entregue a url ao assinante no navegador.
  • Depois de uma ação no portal, consulte get-partner-billing-summary para atualizar o estado mostrado no sistema.

Regras desta operação

  • Em produção, operações de aplicação e gestão de assinatura podem alterar uma cobrança real. No da integração, deixe essas ações atrás de uma decisão explícita do assinante; não execute toda a coleção de nós em sequência.
  • Os valores monetários são inteiros em centavos de real. 9990 significa R$ 99,90. Não envie números de ponto flutuante nem formate valores como "99,90" na API.
  • O modelo ativo é number_packs_v2, com capacidade compartilhada por números entre os clientes do parceiro. Não é o antigo pacote de quantidade de clientes.
  • A url é uma sessão temporária de acesso à cobrança; não a trate como um link público permanente.
  • Não prometa que todos os tipos de alteração estão disponíveis no portal. Para mudar os pacotes pelo fluxo Partner, utilize prévia e aplicação.
  • A rota de recuperação/cancelamento de cobrança continua acessível com as permissões existentes mesmo enquanto o cadastro obrigatório do proprietário estiver pendente.

Aliases aceitos: create-stripe-customer-portal-session. Prefira o nome do exemplo.

POSTAgenda cancelamento ao fim do período atual; exige cancelar alteração de pacotes pendente antes.
cancel-stripe-subscription

Agendar o cancelamento da assinatura do parceiro para o fim do período vigente.

Quando usar

Use após decisão explícita do assinante de encerrar a renovação da assinatura.

Antes de começar

  • Ter assinatura em estado compatível (active, trialing ou past_due).
  • Resolver primeiro uma mudança de pacotes futura ou um pagamento pendente que impeça o cancelamento.
  • Mostrar a data de fim do período retornada pelo resumo antes de confirmar.

Autenticação e permissão

Partner API Key ativa com billing.write ou *. Se optar por JWT, as funções permitidas são owner, admin.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=cancel-stripe-subscription
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{}

O que preencher em cada campo

Esta operação não exige campos adicionais. A identidade do parceiro vem da autenticação.

Como ler a resposta

Retorna ok=true e status="cancellation_scheduled". O serviço configura cancel_at_period_end=true na Stripe e reconcilia a assinatura. Consulte o resumo para obter period_end e confirmar o agendamento. No modelo v2 desta API, esta chamada não solicita cancelamento imediato.

Erros e como agir

  • 404 subscription_not_found: não existe assinatura vinculada.
  • 409 cancel_scheduled_change_first: há uma mudança de pacotes futura para resolver antes.
  • 409 payment_pending: existe uma atualização/pagamento pendente.
  • 409 subscription_not_changeable: o estado da assinatura não permite esta operação.
  • 409 billing_change_in_progress: outra operação está em andamento.

Depois desta chamada

  • Releia o resumo e mostre cancel_at_period_end=true e period_end.
  • Se o assinante desistir antes do encerramento efetivo, use resume-stripe-subscription.

Regras desta operação

  • Em produção, operações de aplicação e gestão de assinatura podem alterar uma cobrança real. No da integração, deixe essas ações atrás de uma decisão explícita do assinante; não execute toda a coleção de nós em sequência.
  • Os valores monetários são inteiros em centavos de real. 9990 significa R$ 99,90. Não envie números de ponto flutuante nem formate valores como "99,90" na API.
  • O modelo ativo é number_packs_v2, com capacidade compartilhada por números entre os clientes do parceiro. Não é o antigo pacote de quantidade de clientes.
  • Não envie immediate=true, reason ou parâmetros herdados do fluxo antigo esperando cancelamento imediato; o handler v2 ativo não usa esses campos.
  • O agendamento não desconecta imediatamente os números para forçar um downgrade. A política após o encerramento deve ser apresentada pelo estado vigente do serviço.
  • A operação não é um pedido de reembolso.
  • A rota de recuperação/cancelamento de cobrança continua acessível com as permissões existentes mesmo enquanto o cadastro obrigatório do proprietário estiver pendente.
POSTRemove cancelamento agendado de assinatura ativa/trial/past_due; não ressuscita assinatura já encerrada.
resume-stripe-subscription

Retirar o cancelamento agendado e permitir a continuidade da assinatura ainda existente.

Quando usar

Use quando o assinante desistir do cancelamento antes de ele se efetivar.

Antes de começar

  • Ter assinatura ainda em estado alterável e decisão explícita de continuar as renovações.
  • Consultar o resumo para verificar cancel_at_period_end e eventual pendência de pagamento.

Autenticação e permissão

Partner API Key ativa com billing.write ou *. Se optar por JWT, as funções permitidas são owner, admin.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=resume-stripe-subscription
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer SUA_PARTNER_API_KEY_COMPLETA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{}

O que preencher em cada campo

Esta operação não exige campos adicionais. A identidade do parceiro vem da autenticação.

Como ler a resposta

Retorna ok=true e status="active" como resultado da ação de retomada. O serviço configura cancel_at_period_end=false e reconcilia a assinatura. Esse rótulo de resultado não substitui o status financeiro real: uma assinatura trialing ou past_due precisa ser lida no resumo depois da operação.

Erros e como agir

  • 404 subscription_not_found: assinatura inexistente.
  • 409 subscription_not_changeable: assinatura já encerrada ou em estado que não permite a alteração.
  • 409 cancel_scheduled_change_first ou payment_pending: resolva a pendência indicada.
  • 409 billing_change_in_progress: aguarde a operação em curso.

Depois desta chamada

  • Consulte get-partner-billing-summary e confirme cancel_at_period_end=false.
  • Mostre o estado financeiro real e a próxima data de período ao assinante.
  • Se a assinatura já estiver cancelada, use uma nova proposta/checkout permitido pelo serviço, em vez de repetir indefinidamente a retomada.

Regras desta operação

  • Em produção, operações de aplicação e gestão de assinatura podem alterar uma cobrança real. No da integração, deixe essas ações atrás de uma decisão explícita do assinante; não execute toda a coleção de nós em sequência.
  • Os valores monetários são inteiros em centavos de real. 9990 significa R$ 99,90. Não envie números de ponto flutuante nem formate valores como "99,90" na API.
  • O modelo ativo é number_packs_v2, com capacidade compartilhada por números entre os clientes do parceiro. Não é o antigo pacote de quantidade de clientes.
  • Esta rota não recria uma assinatura já encerrada e não confirma pagamento de uma fatura pendente.
  • Continuar a assinatura implica renovação/cobrança futura; não execute como recuperação automática de erro sem decisão do assinante.
  • A rota de recuperação/cancelamento de cobrança continua acessível com as permissões existentes mesmo enquanto o cadastro obrigatório do proprietário estiver pendente.

Equipe, acesso e notificações

Ações que podem exigir login de membro, sua função e uma sessão válida.

POSTEnvia convite real por e-mail e cria/vincula conta e membro. Owner convida admin/member; admin apenas member.
invite-partner-member

Convidar um colaborador para a equipe do parceiro e associar seu usuário ao papel definido.

Quando usar

Use no cadastro de um operador humano que trabalhará no portal do parceiro. Não é o cadastro das empresas clientes do assinante, que usa as rotas de customers.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal antes de acessar os recursos operacionais. O perfil do membro e suas permissões continuam sendo conferidos.
  • Ter o e-mail correto do colaborador e decisão de conceder acesso.
  • Respeitar a hierarquia: owner pode convidar admin/member; admin pode convidar member.
  • Haver vaga no limite de 5 colaboradores não proprietários aplicado pelo sistema.

Autenticação e permissão

Exige access_token obtido no login de membro. A Partner API Key não é aceita nesta operação. Funções permitidas: owner, admin.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=invite-partner-member
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer ACCESS_TOKEN_DO_MEMBRO",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "email": "INVITE_EMAIL",
  "role": "member"
}

O que preencher em cada campo

emailstring de e-mail · Obrigatório.

Endereço do colaborador, normalizado para minúsculas e sem espaços externos; máximo 254 caracteres e formato válido. É para este endereço que o fluxo de acesso envia a mensagem necessária.

Exemplo: operador@example.com

rolestring enum · Obrigatório.

Papel inicial permitido: admin ou member. O convite não aceita owner. Um admin não pode usar esta rota para convidar outro admin.

Exemplo: member

Como ler a resposta

Retorna ok e member com id,partner_id,user_id,email,role,status,joined_at,created_at, além de invite_sent, password_email_sent, auth_user_creation_mode, auth_user_source, collaborator_limit, collaborator_count_before, redirect_to, warning e message. auth_user_creation_mode diferencia invited_new_user de existing_user. status será active se a conta já estiver confirmada, ou invited quando depender do primeiro acesso. Para usuário novo, o fluxo usa convite; para um usuário já existente, pode enviar recuperação de senha. warning pode conter code=password_email_not_sent: nesse caso, a associação foi realizada, mas o e-mail complementar não foi enviado. Não interprete esse aviso como convite inteiramente desfeito.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal. Não faça retry automático.
  • 400 invalid_email: endereço inválido ou acima do limite.
  • 400 invalid_role: papel fora de admin/member.
  • 403 insufficient_role: quem convida não pode atribuir o papel pedido.
  • 409 member_already_active: o usuário já é membro ativo do parceiro.
  • 409 collaborator_limit_reached: limite de colaboradores atingido.
  • 503 invite_delivery_unavailable: o serviço de convite não conseguiu enviar para o novo usuário; a integração não deve informar falsamente que o convite chegou.
  • 500 member_lookup_failed, member_upsert_failed ou auth_user_missing_after_invite: falha ao localizar/vincular o membro. Verifique o estado antes de repetir convites em sequência.

Depois desta chamada

  • Guarde member.id para futuras operações de equipe; esse ID é diferente de user_id do Auth.
  • Mostre se o acesso ficou active/invited e se houve warning no envio.
  • Oriente o colaborador a abrir o e-mail de convite/recuperação mais recente e concluir a definição de senha no endereço correto do ambiente.

Regras desta operação

  • Esta rota envia e-mail de acesso e concede permissão; mantenha-a fora de loops automáticos e use destinatários realmente autorizados.
  • Repetir a operação com novos e-mails não é um teste inofensivo: cria associações de equipe reais.
  • Não peça nem transporte a senha do colaborador no body do convite. A definição de senha ocorre pelo fluxo de acesso apropriado.
  • Um convite de equipe não cria uma empresa cliente nem reserva um número do pacote.
POSTAltera role; somente owner. Preserva último owner e bloqueia autorrebaixamento.
update-partner-member-role

Alterar o papel de um membro já associado à equipe do parceiro.

Quando usar

Use para promoção/restrição de acesso de um colaborador, mediante decisão do proprietário.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal antes de acessar os recursos operacionais. O perfil do membro e suas permissões continuam sendo conferidos.
  • Usar a sessão de owner: esta rota exige proprietário mesmo para mudar admin para member.
  • Ter member_id da associação ao parceiro, não user_id do Auth.
  • Revisar o impacto de conceder owner, que amplia o controle sobre equipe e operação.

Autenticação e permissão

Exige access_token obtido no login de membro. A Partner API Key não é aceita nesta operação. Funções permitidas: owner.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=update-partner-member-role
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer ACCESS_TOKEN_DO_MEMBRO",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "member_id": "MEMBER_ID",
  "role": "member"
}

O que preencher em cada campo

member_idUUID em string · Obrigatório.

ID da associação de equipe retornado no objeto member. Deve pertencer ao parceiro autorizado.

Exemplo: 11111111-2222-4333-8444-555555555555

rolestring enum · Obrigatório.

Novo papel: owner, admin ou member. O papel é substituído; não é um campo de permissões incrementais.

Exemplo: admin

Como ler a resposta

Retorna ok=true e member com id,partner_id,user_id,email,role,status,joined_at. O campo role retornado é o novo papel persistido. status do membro não é reativado automaticamente por esta mudança de papel.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal. Não faça retry automático.
  • 400 invalid_payload: member_id ou papel ausente/inválido.
  • 403 owner_required: sessão não pertence a um owner autorizado.
  • 404 member_not_found: associação não encontrada no parceiro.
  • 400 cannot_demote_self: o owner não pode rebaixar o próprio papel por esta operação.
  • 409 last_owner_protected: a alteração deixaria o parceiro sem proprietário.
  • 409 collaborator_limit_reached: rebaixar um owner para colaborador excederia o limite de colaboradores.
  • 500 member_role_update_failed: a mudança não foi concluída.

Depois desta chamada

  • Atualize a lista de equipe com o member retornado.
  • Se a interface mantiver permissões em cache, atualize a sessão/contexto antes de mostrar ações autorizadas.

Regras desta operação

  • role=owner é uma concessão de controle sensível, não apenas um rótulo visual.
  • Não use a mudança de papel para tentar contornar o limite de colaboradores.
  • A proteção de último owner e a proibição de rebaixar a si próprio devem ser respeitadas na sua integração, não escondidas em repetição automática.
POSTRemove acesso de membro. Owner remove admin/member; admin apenas member. Não remove owner ou a si mesmo. A implementação marca membership status=inactive; não exclui Auth user.
remove-partner-member

Desativar a associação de um colaborador à equipe do parceiro.

Quando usar

Use quando uma pessoa deixa de participar da operação do assinante ou perde a autorização de acesso.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal antes de acessar os recursos operacionais. O perfil do membro e suas permissões continuam sendo conferidos.
  • Ter member_id correto e confirmar a pessoa que perderá acesso.
  • Respeitar a hierarquia: owner gerencia membros não owner; admin remove apenas member.
  • Não apontar a chamada para o próprio usuário autenticado.

Autenticação e permissão

Exige access_token obtido no login de membro. A Partner API Key não é aceita nesta operação. Funções permitidas: owner, admin.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=remove-partner-member
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer ACCESS_TOKEN_DO_MEMBRO",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "member_id": "MEMBER_ID"
}

O que preencher em cada campo

member_idUUID em string · Obrigatório.

ID da associação de equipe a desativar. Não é o ID de um cliente do parceiro nem o user_id do Auth.

Exemplo: 11111111-2222-4333-8444-555555555555

Como ler a resposta

Retorna ok=true e member com id,partner_id,user_id,email,role,status,joined_at; status passa para inactive. A operação mantém o registro de equipe e não apaga a conta global do usuário no Auth.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal. Não faça retry automático.
  • 400 cannot_remove_self: não é permitido remover a própria associação.
  • 404 member_not_found: membro não encontrado no parceiro.
  • 403 insufficient_role: a hierarquia não permite remover esse alvo; um owner não é removido diretamente por esta regra de gestão.
  • 409 last_owner_protected: proteção contra ausência de proprietário.
  • 500 member_remove_failed: não foi possível desativar a associação.

Depois desta chamada

  • Confirme member.status=inactive e atualize a lista de equipe.
  • Revise separadamente as credenciais de integração que a pessoa administrava, quando isso fizer parte do procedimento do assinante.

Regras desta operação

  • Desativar um membro não elimina seus registros de auditoria nem a conta global de login.
  • A remoção de equipe não apaga empresas clientes, instâncias ou mensagens.
  • Não prometa uma transferência automática de propriedade. Se for necessário substituir owner, planeje os papéis e proteções antes desta ação.
POSTRevela chave do próprio parceiro para membro autorizado; API key não pode revelar outra chave.
reveal-partner-api-key

Revelar a cópia recuperável de uma chave de API do parceiro para configuração autorizada de uma integração.

Quando usar

Use pontualmente, durante a preparação das credenciais do sistema do assinante. Não é necessário revelar a chave em cada execução de sistema.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal antes de acessar os recursos operacionais. O perfil do membro e suas permissões continuam sendo conferidos.
  • Usar uma sessão de membro autorizada a revelar a chave; uma chave de API não pode chamar esta rota para revelar outra chave.
  • Ter api_key_id do registro correto, ativo, não expirado e com material criptografado recuperável.
  • Preparar o armazenamento de credencial antes de revelar, evitando que o segredo fique em históricos compartilhados.

Autenticação e permissão

Exige access_token obtido no login de membro. A Partner API Key não é aceita nesta operação. Funções permitidas: owner, admin, developer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=reveal-partner-api-key
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer ACCESS_TOKEN_DO_MEMBRO",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "api_key_id": "API_KEY_ID"
}

O que preencher em cada campo

api_key_idUUID em string · Obrigatório, salvo quando usar um dos aliases key_id ou id.

ID interno do registro da chave, não o próprio segredo. É o nome recomendado para a requisição.

Exemplo: 11111111-2222-4333-8444-555555555555

key_idUUID em string · Condicional: alias de api_key_id; normalmente omita.

Aceito como alternativa; api_key_id tem precedência se ambos forem enviados.

Exemplo: 11111111-2222-4333-8444-555555555555

idUUID em string · Condicional: último alias; prefira api_key_id.

Identificador da chave caso os nomes anteriores não estejam presentes. Não confunda com partner_id.

Exemplo: 11111111-2222-4333-8444-555555555555

Como ler a resposta

Retorna ok, api_key_id, partner_id, name, key_prefix, key_hint, api_key, scopes, status, last_used_at e created_at. api_key contém o segredo em texto para a configuração; key_prefix/key_hint servem apenas para identificação e não autenticam. A revelação é auditada e atualiza a informação de revelação. Não inclua esse resultado em exemplos públicos, PDFs, capturas ou mensagens de suporte.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal. Não faça retry automático.
  • 403 forbidden: autenticação por chave de API não pode revelar o segredo.
  • 403 insufficient_role: membro não autorizado para a revelação.
  • 404 api_key_not_found: registro não encontrado no parceiro.
  • 409 api_key_inactive ou api_key_expired: a chave não pode ser usada/revelada nessa condição.
  • 409 api_key_not_recoverable: chave antiga sem cópia criptografada recuperável; não existe como reconstruí-la a partir do hash.
  • 500 api_key_decrypt_failed: falha ao abrir a cópia criptografada; acione suporte sem enviar o segredo.

Depois desta chamada

  • Armazene api_key diretamente na credencial segura do seu sistema e aplique-a em Authorization conforme a seção de autenticação do manual.
  • Use scopes para conferir se a chave atende somente às operações necessárias.
  • Finalize a configuração evitando salvar o resultado de revelação como dado fixo de um sistema exportável.

Regras desta operação

  • Uma execução de da integração que grava todo o JSON de resposta pode persistir o segredo no histórico. Prefira configuração manual controlada de credencial, com política apropriada de retenção/acesso.
  • Nunca use key_prefix ou key_hint no lugar de api_key.
  • A revelação não amplia scopes, não reativa uma chave e não prorroga sua expiração.
  • Não repita a revelação em agendamentos. Os nós de operação devem reutilizar a credencial já armazenada.
GETLista notificações do usuário autenticado.
list-partner-notifications

Carregar a lista de notificações visíveis para o membro e sua contagem de não lidas.

Quando usar

Use para a central de notificações do portal ou para consultar avisos pessoais de um operador autorizado.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal antes de acessar os recursos operacionais. O perfil do membro e suas permissões continuam sendo conferidos.
  • Usar a sessão de membro; o contexto individual é obrigatório para aplicar destino e leitura.
  • Ter em mente que categorias desabilitadas nas preferências são filtradas da lista.

Autenticação e permissão

Exige access_token obtido no login de membro. A Partner API Key não é aceita nesta operação. Funções permitidas: owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=list-partner-notifications&limit=30
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer ACCESS_TOKEN_DO_MEMBRO"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

limitinteiro · Opcional.

Quantidade máxima da página, de 1 a 100, padrão 30. O handler limita os valores e usa o padrão quando a conversão não produz um valor útil; envie um inteiro válido em vez de depender disso.

Exemplo: 30

beforestring ISO 8601 com fuso · Opcional.

Cursor temporal: traz registros com created_at anterior ao instante informado. Para buscar mais antigos, use created_at do último item da página atual. Uma data inválida é descartada pelo handler e a consulta volta a não usar cursor.

Exemplo: 2026-09-11T13:00:00.000Z

Como ler a resposta

Retorna ok, items, unread e preferences. Cada item contém os campos da notificação: id,partner_id,target_user_id,category,event_type,severity,title,body,target_url,source_table,source_id,dedupe_key,metadata,expires_at,created_at,updated_at e read_at obtido da leitura pessoal. read_at=null indica que o membro ainda não a marcou como lida. Não há campo is_read calculado nesta resposta; derive-o a partir de read_at. unread conta todas as notificações não lidas visíveis nas preferências, independentemente do limite/cursor da página. preferences contém notify_academy, notify_meta_alerts, notify_templates, notify_delivery_health, notify_billing, notify_billing_reminders, notify_system e popup_enabled. São preferências pessoais do membro autenticado dentro do parceiro. Os valores padrão do serviço são true quando não há escolha gravada.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal. Não faça retry automático.
  • 500 notification_list_failed: falha ao carregar notificações. Não zere unread na interface como se não houvesse pendências.
  • Falha de autenticação de membro: renove a sessão pelo fluxo previsto; não tente substituir o JWT por uma chave de API.

Depois desta chamada

  • Mostre title/body/severity e trate target_url como destino de navegação, não como comando a executar.
  • Para paginação, conserve o cursor do último created_at e interrompa quando não vierem itens.
  • Ao usuário abrir um aviso, envie seu id para mark-partner-notification-read.

Regras desta operação

  • Notificações são pessoais: o usuário autenticado determina os destinatários visíveis, as preferências e as confirmações de leitura. Uma automação com uma única sessão não atua por todos os membros.
  • Silenciar uma categoria de notificação não desliga a integração Meta, o webhook, a cobrança nem o cálculo de risco/saúde.
  • Notificações expiradas e destinadas a outro usuário não entram na lista.
  • A paginação usa timestamp com comparação estrita antes de before; não é uma exportação transacional com cursor único por ID. Evite usar esta central como arquivo completo de eventos de negócio.
  • Se usar POST, parâmetros limit/before presentes na query têm precedência sobre o body; mantenha uma única fonte para evitar divergências.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
GETConsulta preferências do usuário autenticado.
get-partner-notification-preferences

Consultar as preferências de notificação do membro autenticado.

Quando usar

Use ao abrir a tela de preferências ou antes de aplicar uma alteração parcial de notificações.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal antes de acessar os recursos operacionais. O perfil do membro e suas permissões continuam sendo conferidos.
  • Ter sessão de membro válida no parceiro. Não há user_id alvo ou partner_id para editar as preferências de outra pessoa.

Autenticação e permissão

Exige access_token obtido no login de membro. A Partner API Key não é aceita nesta operação. Funções permitidas: owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-partner-notification-preferences
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer ACCESS_TOKEN_DO_MEMBRO"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

Esta operação não exige campos adicionais. A identidade do parceiro vem da autenticação.

Como ler a resposta

Retorna ok=true e preferences. preferences contém notify_academy, notify_meta_alerts, notify_templates, notify_delivery_health, notify_billing, notify_billing_reminders, notify_system e popup_enabled. São preferências pessoais do membro autenticado dentro do parceiro. Os valores padrão do serviço são true quando não há escolha gravada.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal. Não faça retry automático.
  • 500 notification_preferences_failed: o serviço não conseguiu consultar as preferências atuais.

Depois desta chamada

  • Preencha os controles da interface com os booleanos retornados.
  • Envie somente os campos realmente alterados a update-partner-notification-preferences.

Regras desta operação

  • Notificações são pessoais: o usuário autenticado determina os destinatários visíveis, as preferências e as confirmações de leitura. Uma automação com uma única sessão não atua por todos os membros.
  • Silenciar uma categoria de notificação não desliga a integração Meta, o webhook, a cobrança nem o cálculo de risco/saúde.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
POSTAtualiza booleanos de preferências do próprio usuário; aceita campos planos ou objeto preferences.
update-partner-notification-preferences

Salvar escolhas pessoais de categorias de notificação e de exibição de popup.

Quando usar

Use quando o membro ligar/desligar opções na tela de preferências. A alteração é parcial: os campos não enviados são preservados.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal antes de acessar os recursos operacionais. O perfil do membro e suas permissões continuam sendo conferidos.
  • Ter sessão do membro que está alterando suas próprias preferências.
  • Produzir booleanos JSON reais no seu sistema; a string "false" não desliga uma opção.

Autenticação e permissão

Exige access_token obtido no login de membro. A Partner API Key não é aceita nesta operação. Funções permitidas: owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=update-partner-notification-preferences
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer ACCESS_TOKEN_DO_MEMBRO",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "preferences": {
    "notify_delivery_health": true
  }
}

O que preencher em cada campo

notify_academybooleano · Opcional.

Controla avisos da Academy e seus conteúdos. true habilita e false desabilita. Quando fornecido como booleano no topo, prevalece sobre preferences.notify_academy. Omitir preserva o valor atual.

Exemplo: false

notify_meta_alertsbooleano · Opcional.

Controla notificações de alertas de risco/gestão Meta. true habilita e false desabilita. Quando fornecido como booleano no topo, prevalece sobre preferences.notify_meta_alerts. Omitir preserva o valor atual.

Exemplo: false

notify_templatesbooleano · Opcional.

Controla notificações de templates e suas mudanças. true habilita e false desabilita. Quando fornecido como booleano no topo, prevalece sobre preferences.notify_templates. Omitir preserva o valor atual.

Exemplo: false

notify_delivery_healthbooleano · Opcional.

Controla notificações de saúde de entregas. true habilita e false desabilita. Quando fornecido como booleano no topo, prevalece sobre preferences.notify_delivery_health. Omitir preserva o valor atual.

Exemplo: false

notify_billingbooleano · Opcional.

Controla notificações gerais de cobrança, separadas dos lembretes antecipados. true habilita e false desabilita. Quando fornecido como booleano no topo, prevalece sobre preferences.notify_billing. Omitir preserva o valor atual.

Exemplo: false

notify_billing_remindersbooleano · Opcional.

Controla lembretes antecipados de cobrança, fim de trial e nova tentativa de pagamento. true habilita e false desabilita. Quando fornecido como booleano no topo, prevalece sobre preferences.notify_billing_reminders. Omitir preserva o valor atual.

Exemplo: false

notify_systembooleano · Opcional.

Controla avisos gerais do sistema. true habilita e false desabilita. Quando fornecido como booleano no topo, prevalece sobre preferences.notify_system. Omitir preserva o valor atual.

Exemplo: false

popup_enabledbooleano · Opcional.

Controla exibição de popup na experiência de notificações da interface. true habilita e false desabilita. Quando fornecido como booleano no topo, prevalece sobre preferences.popup_enabled. Omitir preserva o valor atual.

Exemplo: false

preferencesobjeto JSON · Opcional.

Contêiner alternativo para os mesmos oito booleanos. Não é obrigatório envolver o body neste objeto. Se um campo booleano aparecer também no topo, o valor do topo ganha.

Exemplo: {"notify_templates":true,"popup_enabled":false}

preferences.notify_academybooleano · Opcional.

Dentro de preferences: alternativa para avisos da Academy e seus conteúdos. É usada quando não houver booleano válido no campo notify_academy do topo.

Exemplo: true

preferences.notify_meta_alertsbooleano · Opcional.

Dentro de preferences: alternativa para notificações de alertas de risco/gestão Meta. É usada quando não houver booleano válido no campo notify_meta_alerts do topo.

Exemplo: true

preferences.notify_templatesbooleano · Opcional.

Dentro de preferences: alternativa para notificações de templates e suas mudanças. É usada quando não houver booleano válido no campo notify_templates do topo.

Exemplo: true

preferences.notify_delivery_healthbooleano · Opcional.

Dentro de preferences: alternativa para notificações de saúde de entregas. É usada quando não houver booleano válido no campo notify_delivery_health do topo.

Exemplo: true

preferences.notify_billingbooleano · Opcional.

Dentro de preferences: alternativa para notificações gerais de cobrança, separadas dos lembretes antecipados. É usada quando não houver booleano válido no campo notify_billing do topo.

Exemplo: true

preferences.notify_billing_remindersbooleano · Opcional.

Dentro de preferences: alternativa para lembretes antecipados de cobrança, fim de trial e nova tentativa de pagamento. É usada quando não houver booleano válido no campo notify_billing_reminders do topo.

Exemplo: true

preferences.notify_systembooleano · Opcional.

Dentro de preferences: alternativa para avisos gerais do sistema. É usada quando não houver booleano válido no campo notify_system do topo.

Exemplo: true

preferences.popup_enabledbooleano · Opcional.

Dentro de preferences: alternativa para exibição de popup na experiência de notificações da interface. É usada quando não houver booleano válido no campo popup_enabled do topo.

Exemplo: true

Como ler a resposta

Retorna ok=true e preferences com o resultado completo após mesclar os campos aceitos com o estado anterior. preferences contém notify_academy, notify_meta_alerts, notify_templates, notify_delivery_health, notify_billing, notify_billing_reminders, notify_system e popup_enabled. São preferências pessoais do membro autenticado dentro do parceiro. Os valores padrão do serviço são true quando não há escolha gravada. Campos desconhecidos e valores que não sejam booleanos não são aplicados; um body vazio não redefine tudo. O serviço registra a alteração em auditoria.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal. Não faça retry automático.
  • 500 notification_preferences_failed: não foi possível carregar o estado atual antes da mesclagem.
  • 500 notification_preferences_update_failed: não foi possível salvar a alteração.

Depois desta chamada

  • Leia a resposta e atualize os controles com os valores efetivamente gravados.
  • Consulte a lista novamente se quiser refletir imediatamente as categorias agora visíveis.

Regras desta operação

  • Notificações são pessoais: o usuário autenticado determina os destinatários visíveis, as preferências e as confirmações de leitura. Uma automação com uma única sessão não atua por todos os membros.
  • Silenciar uma categoria de notificação não desliga a integração Meta, o webhook, a cobrança nem o cálculo de risco/saúde.
  • notify_billing e notify_billing_reminders são escolhas distintas. Os lembretes billing.payment_retry_tomorrow, billing.trial_ends_tomorrow e billing.charge_tomorrow seguem a preferência de lembretes.
  • Não interprete uma resposta de sucesso como prova de que uma string "false" foi convertida; confira o booleano retornado.
  • Evite enviar o objeto completo antigo após muito tempo aberto na tela, pois isso pode sobrescrever uma escolha mais recente do próprio usuário. Prefira atualização parcial.
POSTMarca notificação do próprio usuário como lida.
mark-partner-notification-read

Registrar que o membro autenticado leu uma notificação específica.

Quando usar

Use quando o operador abrir o aviso ou escolher explicitamente marcá-lo como lido.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal antes de acessar os recursos operacionais. O perfil do membro e suas permissões continuam sendo conferidos.
  • Ter notification_id obtido da lista do mesmo membro/parceiro.

Autenticação e permissão

Exige access_token obtido no login de membro. A Partner API Key não é aceita nesta operação. Funções permitidas: owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=mark-partner-notification-read
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer ACCESS_TOKEN_DO_MEMBRO",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "notification_id": "NOTIFICATION_ID"
}

O que preencher em cada campo

notification_idUUID em string · Obrigatório.

ID da notificação retornada em items[].id. Não é source_id nem o ID do alerta que originou o aviso.

Exemplo: 11111111-2222-4333-8444-555555555555

Como ler a resposta

Retorna ok, notification_id e read_at. A leitura é registrada para o usuário autenticado; o conteúdo da notificação original permanece e as leituras de outros membros não são alteradas.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal. Não faça retry automático.
  • 400 invalid_notification_id: o ID não é UUID válido.
  • 404 notification_not_found: o serviço não conseguiu marcar uma notificação válida para esse membro/parceiro. O handler também usa esse erro quando a operação de leitura no banco falha.

Depois desta chamada

  • Atualize read_at do item local e consulte unread novamente quando necessário.
  • Se o aviso apontar para um alerta ainda aberto, investigue-o pela rota adequada; marcar leitura não reconhece nem resolve o alerta.

Regras desta operação

  • Notificações são pessoais: o usuário autenticado determina os destinatários visíveis, as preferências e as confirmações de leitura. Uma automação com uma única sessão não atua por todos os membros.
  • Silenciar uma categoria de notificação não desliga a integração Meta, o webhook, a cobrança nem o cálculo de risco/saúde.
  • Não marque como lido antes de exibir o conteúdo apenas para esconder o contador.
  • Leitura de notificação, reconhecimento de alerta e resolução de problema são três ações distintas.
POSTMarca todas as notificações do próprio usuário como lidas.
mark-all-partner-notifications-read

Marcar em lote as notificações do membro como lidas.

Quando usar

Use na ação explícita "Marcar todas como lidas" da central de notificações.

Antes de começar

  • O proprietário deve concluir o cadastro obrigatório CPF/CNPJ no Portal antes de acessar os recursos operacionais. O perfil do membro e suas permissões continuam sendo conferidos.
  • Ter sessão do membro que pediu a ação.
  • Esclarecer que a operação vai além da página atualmente exibida.

Autenticação e permissão

Exige access_token obtido no login de membro. A Partner API Key não é aceita nesta operação. Funções permitidas: owner, admin, developer, member, viewer.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=mark-all-partner-notifications-read
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Authorization": "Bearer ACCESS_TOKEN_DO_MEMBRO",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{}

O que preencher em cada campo

Esta operação não exige campos adicionais. A identidade do parceiro vem da autenticação.

Como ler a resposta

Retorna ok=true e marked, a quantidade de linhas processadas pela gravação em lote. A função usa upsert e pode incluir notificações já marcadas; marked não é necessariamente a quantidade que estava não lida antes da operação. Atua sobre notificações não expiradas do parceiro visíveis pelo destinatário (gerais ou destinadas ao membro), sem limitar à página corrente. A preferência de categoria da lista não funciona como limitador deste lote.

Erros e como agir

  • 409 partner_registration_required: o proprietário precisa concluir seu cadastro pessoal ou empresarial no Portal. Não faça retry automático.
  • 500 notification_mark_all_failed: falha ao marcar o conjunto de notificações.

Depois desta chamada

  • Recarregue list-partner-notifications para obter unread e read_at atualizados.
  • Mantenha os alertas operacionais abertos até sua própria triagem/resolução, mesmo após a leitura em lote.

Regras desta operação

  • Notificações são pessoais: o usuário autenticado determina os destinatários visíveis, as preferências e as confirmações de leitura. Uma automação com uma única sessão não atua por todos os membros.
  • Silenciar uma categoria de notificação não desliga a integração Meta, o webhook, a cobrança nem o cálculo de risco/saúde.
  • Não use marked como contador de incidentes resolvidos.
  • A ação não apaga notificações e não muda a leitura de outros membros.
  • Não a execute automaticamente a cada login, pois isso elimina o sinal de avisos ainda não vistos.
POSTEntrar com e-mail e senha para obter JWT de membro
auth-login

Entrar como usuário já cadastrado no Partner e obter o JWT de membro usado nas operações que dependem da identidade e da função da pessoa.

Quando usar

Use depois que o convite foi aceito e a senha foi definida, ou quando o access_token anterior expirou. Para integrações usuais por API Key, este login não é uma etapa obrigatória.

Antes de começar

  • Conta do Partner confirmada, convite aceito e senha definida.
  • Esta etapa só é necessária para chamadas identificadas como JWT de membro. O cadastro de clientes e a conexão de números aceitam a Partner API Key.

Autenticação e permissão

Use seu e-mail e senha no JSON. O login devolve access_token para as rotas de membro. Não é necessário fazer login para cada chamada com Partner API Key.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/auth/v1/token?grant_type=password
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "email": "SEU_EMAIL",
  "password": "SUA_SENHA"
}

O que preencher em cada campo

emailstring · body · Obrigatório

E-mail de quem fará a ação. Precisa pertencer ao Partner selecionado.

Exemplo: usuario@empresa.example

passwordstring · body · Obrigatório

Senha definida por esse usuário. Não copie o exemplo preenchido para terceiros.

Exemplo: SUA_SENHA

grant_typestring · query · Obrigatório

Já incluído na URL deste exemplo.

Exemplo: password

Como ler a resposta

O retorno contém access_token, token_type, expires_in/expires_at, refresh_token e user. Copie access_token para Authorization: Bearer SEU_ACCESS_TOKEN nas rotas de membro. Respeite a validade retornada. A função owner/admin/developer/viewer continua sendo a definida no Partner; o login não aumenta privilégios.

Erros e como agir

  • Credenciais inválidas podem ser reportadas sem diferenciar usuário inexistente de senha incorreta; conferir o login sem presumir qual dado falhou.
  • email_not_confirmed exige concluir a confirmação permitida pelo projeto.
  • HTTP 429 indica limitação de autenticação; evitar repetição rápida.
  • Login bem-sucedido seguido de 403 numa rota pode ser falta de vínculo ou função autorizada. Refazer o login não concede uma função superior.

Depois desta chamada

  • Coloque access_token no header Authorization da rota de membro escolhida.
  • Quando expirar, use o fluxo de autenticação do seu sistema para renovar a sessão. Estes exemplos não são um gerenciador de sessões.

Regras desta operação

  • A resposta contém tokens sensíveis. Não compartilhe uma execução do seu sistema que inclua esses dados.
  • Se a conta exigir MFA, conclua também o fluxo de autenticação apropriado.

Meta — enviar mensagens

Texto, template, mídia, localização, botões, reação e confirmação de leitura.

POSTEnviar texto a um BSUID
meta-send-text

Enviar uma mensagem de texto pelo número comercial selecionado para um usuário identificado por BSUID.

Quando usar

Validar o envio básico depois de uma mensagem recebida abrir a janela de atendimento e depois de confirmar o BSUID no webhook.

Referência oficial Meta: Envio de mensagens pela Cloud API · Identidade do destinatário e BSUID · Janela de atendimento e preços da Meta

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Ter autorização para falar com o destinatário e um BSUID real recebido no webhook da mesma empresa. Mensagens livres dependem da janela de atendimento e das regras vigentes da Meta; não substituem templates exigidos fora dela.
  • O token Meta precisa de whatsapp_business_messaging e acesso ao número/ativo usado. A chave da HookCloud não substitui essa permissão da Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/messages
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "messaging_product": "whatsapp",
  "recipient": "BR.BSUID_RECEBIDO_NO_WEBHOOK",
  "type": "text",
  "text": {
    "body": "Olá, recebemos sua solicitação."
  }
}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

RECIPIENT_BSUID / recipientstring · configuração/body · Sim neste exemplo

RECIPIENT_BSUID substitui o marcador do campo recipient. Copiar o identificador recebido da Meta no contexto da empresa, não montar a partir do telefone.

Exemplo: BR.BSUID_REAL_RECEBIDO_NO_WEBHOOK

messaging_productstring literal · body · Sim

Seleciona o produto WhatsApp.

Exemplo: whatsapp

typestring literal · body · Sim

Seleciona a estrutura de conteúdo esperada para esta mensagem.

Exemplo: text

textobjeto · body · Sim

Contém o conteúdo textual; deve acompanhar type=text.

Exemplo: {"body":"Olá, recebemos sua solicitação."}

text.bodystring · body · Sim

Texto final da mensagem. O exemplo do catálogo usa um texto de teste; substitua pelo conteúdo autorizado antes da execução. A Meta admite até 4096 caracteres em mensagens de texto.

Exemplo: Olá, recebemos sua solicitação.

text.preview_urlboolean · body · Opcional; ausente no exemplo

Solicita prévia de um link contido no texto, quando aplicável. Não é necessário para um texto sem URL.

Exemplo: false

Como ler a resposta

Resposta ilustrativa de aceitação: {"messages":[{"id":"wamid.EXEMPLO"}]}. messages[].id é a referência da mensagem; guarde esse ID para correlacionar os status. contacts, quando presente, descreve a identidade reconhecida pela Meta. HTTP 2xx confirma a aceitação da chamada; sent, delivered, read ou failed vêm do webhook e não são garantidos pela resposta inicial.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Aceitação HTTP não encerra a análise: falhas de janela, destinatário, política, qualidade ou limite podem aparecer no webhook. Correlacionar pelo wamid e tratar o motivo concreto antes de repetir; uma nova execução pode criar outra mensagem.

Depois desta chamada

  • Guardar o message_id retornado e correlacionar os eventos do webhook. report-partner-message-status apenas registra o status no Partner; não envia a mensagem novamente.

Regras desta operação

  • recipient recebe o BSUID opaco, por exemplo BR.BSUID_REAL, vindo de contacts[].user_id, messages[].from_user_id ou statuses[].recipient_user_id. Preservar prefixo, letras e maiúsculas. user_id é campo de identidade no webhook, não o nome do campo de envio. Não usar username nem PHONE_NUMBER_ID como destinatário; não acrescentar to ao exemplo BSUID, pois a Meta prioriza to quando ambos estão presentes. Parent BSUID não deve ser assumido disponível; exige habilitação própria.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
  • Texto livre depende de uma mensagem recebida e autenticada do usuário nas últimas 24 horas para esse número e geração da conexão. Criar um contato, importar cliente, enviar um template, receber sent/delivered/read ou identificar FEP não reinicia essa janela. Fora dela, use template aprovado e autorização adequada do destinatário.
  • FEP é benefício de cobrança, separado da permissão de conteúdo. Mostre sua expiração somente com evidência Meta pertinente, como conversation.origin.type=referral_conversion, expiration_timestamp e pricing compatível; ausência desses campos significa não confirmado. Não deduza uma janela fixa da existência de um anúncio nem estenda texto livre para o prazo FEP. Confira a política oficial vigente para elegibilidade e duração.
  • Para telefone conhecido e autorizado, substitua recipient por to com DDI e dígitos. Não envie user_id no body Graph como se fosse campo de envio. BSUID usa recipient, preserva o identificador opaco e seu contexto de portfólio; username reservado não identifica o destinatário.
  • HTTP 2xx/um wamid confirma aceitação, não entrega. Persista o pedido antes de chamar a Meta e deduplique sua fila. Timeout ou resposta ilegível após POST deve ficar incerto e ser reconciliado com webhook/histórico; não faça reenvio automático cego. Idempotency-Key do Partner não oferece idempotência para POSTs Graph.
POSTEnviar template aprovado a um BSUID
meta-send-template

Enviar uma tradução aprovada de um template da WABA, informando nome, idioma e, quando necessário, os valores dos parâmetros.

Quando usar

Para mensagens que exigem template ou para validar um template específico. O exemplo mínimo funciona somente quando o template escolhido não pede parâmetros.

Referência oficial Meta: Envio de mensagens pela Cloud API · Identidade do destinatário e BSUID · Janela de atendimento e preços da Meta

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Template da WABA em condição de envio e tradução correta. APPROVED não elimina regras de qualidade, categoria, destinatário e política; consultar o status atual.
  • O token Meta precisa de whatsapp_business_messaging e acesso ao número/ativo usado. A chave da HookCloud não substitui essa permissão da Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/messages
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "messaging_product": "whatsapp",
  "recipient": "BR.BSUID_RECEBIDO_NO_WEBHOOK",
  "type": "template",
  "template": {
    "name": "TEMPLATE_NAME",
    "language": {
      "code": "TEMPLATE_LANGUAGE"
    }
  }
}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

RECIPIENT_BSUID / recipientstring · configuração/body · Sim neste exemplo

RECIPIENT_BSUID substitui o marcador do campo recipient. Copiar o identificador recebido da Meta no contexto da empresa, não montar a partir do telefone.

Exemplo: BR.BSUID_REAL_RECEBIDO_NO_WEBHOOK

messaging_productstring literal · body · Sim

Seleciona o produto WhatsApp.

Exemplo: whatsapp

typestring literal · body · Sim

Seleciona a estrutura de conteúdo esperada para esta mensagem.

Exemplo: template

templateobjeto · body · Sim

Reúne a identificação e a personalização do template. Não reutilizar o objeto de criação de template nesta chamada.

Exemplo: {"name":"hello_world","language":{"code":"en_US"}}

TEMPLATE_NAME / template.namestring · configuração/body · Sim

Nome exato do template existente na WABA do número. hello_world é um exemplo de configuração, não uma garantia de que exista nesta WABA.

Exemplo: hello_world

template.languageobjeto · body · Sim

Seleciona uma tradução existente; seu formato é um objeto no envio.

Exemplo: {"code":"en_US"}

TEMPLATE_LANGUAGE / template.language.codestring · configuração/body · Sim

Código exato aprovado pela Meta. Não escolher pt_BR apenas porque o texto é português se essa tradução não existir.

Exemplo: en_US

template.componentsarray de objetos · body · Obrigatório quando o template tem parâmetros; ausente no exemplo mínimo

Fornece valores de HEADER, BODY ou botões conforme o template aprovado. Exemplo de texto posicional: components=[{type:"body",parameters:[{type:"text",text:"Marcos"}]}]. Ordem e quantidade precisam coincidir com as variáveis aprovadas; não enviar o texto completo de definição. Para cabeçalho de mídia usar o tipo e o ID de mídia exigidos, para botão informar os campos próprios do tipo de botão.

Exemplo: [{"type":"body","parameters":[{"type":"text","text":"Marcos"}]}]

Como ler a resposta

Resposta ilustrativa de aceitação: {"messages":[{"id":"wamid.EXEMPLO"}]}. messages[].id é a referência da mensagem; guarde esse ID para correlacionar os status. contacts, quando presente, descreve a identidade reconhecida pela Meta. HTTP 2xx confirma a aceitação da chamada; sent, delivered, read ou failed vêm do webhook e não são garantidos pela resposta inicial.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Aceitação HTTP não encerra a análise: falhas de janela, destinatário, política, qualidade ou limite podem aparecer no webhook. Correlacionar pelo wamid e tratar o motivo concreto antes de repetir; uma nova execução pode criar outra mensagem.
  • Nome/idioma ausente na WABA, template pausado/desabilitado e parâmetros incompatíveis exigem correções diferentes. A documentação atual informa erro 132018 para problemas de parâmetros de componentes no envio a partir da Graph v23.
  • Templates de autenticação que dependem do telefone têm restrições com BSUID; não supor que one-tap, zero-tap ou copy-code aceitem este exemplo sem conferir a modalidade elegível.

Depois desta chamada

  • Usar meta-list-templates/meta-get-template para confirmar nome, idioma, status e components. Guardar o wamid e acompanhar o webhook após o envio.
  • Prefira list-partner-meta-templates/get-partner-meta-template para ler o cache. Atualize via eventos hookcloud.meta.template.updated e refresh-partner-meta-templates respeitando o cooldown; use GET Graph pontual quando realmente necessário.

Regras desta operação

  • recipient recebe o BSUID opaco, por exemplo BR.BSUID_REAL, vindo de contacts[].user_id, messages[].from_user_id ou statuses[].recipient_user_id. Preservar prefixo, letras e maiúsculas. user_id é campo de identidade no webhook, não o nome do campo de envio. Não usar username nem PHONE_NUMBER_ID como destinatário; não acrescentar to ao exemplo BSUID, pois a Meta prioriza to quando ambos estão presentes. Parent BSUID não deve ser assumido disponível; exige habilitação própria.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
  • Texto livre depende de uma mensagem recebida e autenticada do usuário nas últimas 24 horas para esse número e geração da conexão. Criar um contato, importar cliente, enviar um template, receber sent/delivered/read ou identificar FEP não reinicia essa janela. Fora dela, use template aprovado e autorização adequada do destinatário.
  • FEP é benefício de cobrança, separado da permissão de conteúdo. Mostre sua expiração somente com evidência Meta pertinente, como conversation.origin.type=referral_conversion, expiration_timestamp e pricing compatível; ausência desses campos significa não confirmado. Não deduza uma janela fixa da existência de um anúncio nem estenda texto livre para o prazo FEP. Confira a política oficial vigente para elegibilidade e duração.
  • Para telefone conhecido e autorizado, substitua recipient por to com DDI e dígitos. Não envie user_id no body Graph como se fosse campo de envio. BSUID usa recipient, preserva o identificador opaco e seu contexto de portfólio; username reservado não identifica o destinatário.
  • HTTP 2xx/um wamid confirma aceitação, não entrega. Persista o pedido antes de chamar a Meta e deduplique sua fila. Timeout ou resposta ilegível após POST deve ficar incerto e ser reconciliado com webhook/histórico; não faça reenvio automático cego. Idempotency-Key do Partner não oferece idempotência para POSTs Graph.
POSTEnviar image por ID de mídia a um BSUID
meta-send-image

Enviar imagem previamente carregado na Meta para o BSUID selecionado.

Quando usar

Depois de obter MEDIA_ID válido para o arquivo e confirmar que o destinatário pode receber uma mensagem livre.

Referência oficial Meta: Envio de mensagens pela Cloud API · Identidade do destinatário e BSUID · Janela de atendimento e preços da Meta

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Ter autorização para falar com o destinatário e um BSUID real recebido no webhook da mesma empresa. Mensagens livres dependem da janela de atendimento e das regras vigentes da Meta; não substituem templates exigidos fora dela.
  • Arquivo disponível na Meta com tipo compatível: image/png ou image/jpeg, até 5 MB.
  • O token Meta precisa de whatsapp_business_messaging e acesso ao número/ativo usado. A chave da HookCloud não substitui essa permissão da Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/messages
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "messaging_product": "whatsapp",
  "recipient": "BR.BSUID_RECEBIDO_NO_WEBHOOK",
  "type": "image",
  "image": {
    "id": "MEDIA_ID"
  }
}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

RECIPIENT_BSUID / recipientstring · configuração/body · Sim neste exemplo

RECIPIENT_BSUID substitui o marcador do campo recipient. Copiar o identificador recebido da Meta no contexto da empresa, não montar a partir do telefone.

Exemplo: BR.BSUID_REAL_RECEBIDO_NO_WEBHOOK

messaging_productstring literal · body · Sim

Seleciona o produto WhatsApp.

Exemplo: whatsapp

typestring literal · body · Sim

Seleciona a estrutura de conteúdo esperada para esta mensagem.

Exemplo: image

imageobjeto · body · Sim

Objeto de mídia correspondente ao campo type. O exemplo envia um ID, não os bytes do arquivo.

Exemplo: {"id":"ID_DE_MIDIA"}

MEDIA_ID / image.idstring · configuração/body · Sim neste exemplo

ID retornado por meta-upload-media ou obtido de uma mídia autorizada. Não é URL de arquivo, caminho local, WABA_ID ou message_id.

Exemplo: ID real devolvido por meta-upload-media

image.captionstring · body · Opcional; ausente no exemplo

Legenda enviada junto ao arquivo, se suportada pelo tipo. Acrescentar via PARAMETROS completo, mantendo os outros campos obrigatórios.

Exemplo: Arquivo solicitado

Como ler a resposta

Resposta ilustrativa de aceitação: {"messages":[{"id":"wamid.EXEMPLO"}]}. messages[].id é a referência da mensagem; guarde esse ID para correlacionar os status. contacts, quando presente, descreve a identidade reconhecida pela Meta. HTTP 2xx confirma a aceitação da chamada; sent, delivered, read ou failed vêm do webhook e não são garantidos pela resposta inicial.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Aceitação HTTP não encerra a análise: falhas de janela, destinatário, política, qualidade ou limite podem aparecer no webhook. Correlacionar pelo wamid e tratar o motivo concreto antes de repetir; uma nova execução pode criar outra mensagem.

Depois desta chamada

  • Guardar o message_id retornado e correlacionar os eventos do webhook. report-partner-message-status apenas registra o status no Partner; não envia a mensagem novamente.

Regras desta operação

  • recipient recebe o BSUID opaco, por exemplo BR.BSUID_REAL, vindo de contacts[].user_id, messages[].from_user_id ou statuses[].recipient_user_id. Preservar prefixo, letras e maiúsculas. user_id é campo de identidade no webhook, não o nome do campo de envio. Não usar username nem PHONE_NUMBER_ID como destinatário; não acrescentar to ao exemplo BSUID, pois a Meta prioriza to quando ambos estão presentes. Parent BSUID não deve ser assumido disponível; exige habilitação própria.
  • Imagem JPEG/PNG válida. Um documento PDF não vira imagem apenas por alterar o MIME.
  • Um ID inexistente, removido ou não acessível ao token falha mesmo que o formato do JSON esteja correto. O fluxo não faz upload automaticamente nesta operação; use meta-upload-media antes.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
  • Texto livre depende de uma mensagem recebida e autenticada do usuário nas últimas 24 horas para esse número e geração da conexão. Criar um contato, importar cliente, enviar um template, receber sent/delivered/read ou identificar FEP não reinicia essa janela. Fora dela, use template aprovado e autorização adequada do destinatário.
  • FEP é benefício de cobrança, separado da permissão de conteúdo. Mostre sua expiração somente com evidência Meta pertinente, como conversation.origin.type=referral_conversion, expiration_timestamp e pricing compatível; ausência desses campos significa não confirmado. Não deduza uma janela fixa da existência de um anúncio nem estenda texto livre para o prazo FEP. Confira a política oficial vigente para elegibilidade e duração.
  • Para telefone conhecido e autorizado, substitua recipient por to com DDI e dígitos. Não envie user_id no body Graph como se fosse campo de envio. BSUID usa recipient, preserva o identificador opaco e seu contexto de portfólio; username reservado não identifica o destinatário.
  • HTTP 2xx/um wamid confirma aceitação, não entrega. Persista o pedido antes de chamar a Meta e deduplique sua fila. Timeout ou resposta ilegível após POST deve ficar incerto e ser reconciliado com webhook/histórico; não faça reenvio automático cego. Idempotency-Key do Partner não oferece idempotência para POSTs Graph.
POSTEnviar document por ID de mídia a um BSUID
meta-send-document

Enviar documento previamente carregado na Meta para o BSUID selecionado.

Quando usar

Depois de obter MEDIA_ID válido para o arquivo e confirmar que o destinatário pode receber uma mensagem livre.

Referência oficial Meta: Envio de mensagens pela Cloud API · Identidade do destinatário e BSUID · Janela de atendimento e preços da Meta

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Ter autorização para falar com o destinatário e um BSUID real recebido no webhook da mesma empresa. Mensagens livres dependem da janela de atendimento e das regras vigentes da Meta; não substituem templates exigidos fora dela.
  • Arquivo disponível na Meta com tipo compatível: formatos de documento suportados, por exemplo application/pdf, até 100 MB.
  • O token Meta precisa de whatsapp_business_messaging e acesso ao número/ativo usado. A chave da HookCloud não substitui essa permissão da Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/messages
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "messaging_product": "whatsapp",
  "recipient": "BR.BSUID_RECEBIDO_NO_WEBHOOK",
  "type": "document",
  "document": {
    "id": "MEDIA_ID"
  }
}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

RECIPIENT_BSUID / recipientstring · configuração/body · Sim neste exemplo

RECIPIENT_BSUID substitui o marcador do campo recipient. Copiar o identificador recebido da Meta no contexto da empresa, não montar a partir do telefone.

Exemplo: BR.BSUID_REAL_RECEBIDO_NO_WEBHOOK

messaging_productstring literal · body · Sim

Seleciona o produto WhatsApp.

Exemplo: whatsapp

typestring literal · body · Sim

Seleciona a estrutura de conteúdo esperada para esta mensagem.

Exemplo: document

documentobjeto · body · Sim

Objeto de mídia correspondente ao campo type. O exemplo envia um ID, não os bytes do arquivo.

Exemplo: {"id":"ID_DE_MIDIA"}

MEDIA_ID / document.idstring · configuração/body · Sim neste exemplo

ID retornado por meta-upload-media ou obtido de uma mídia autorizada. Não é URL de arquivo, caminho local, WABA_ID ou message_id.

Exemplo: ID real devolvido por meta-upload-media

document.captionstring · body · Opcional; ausente no exemplo

Legenda enviada junto ao arquivo, se suportada pelo tipo. Acrescentar via PARAMETROS completo, mantendo os outros campos obrigatórios.

Exemplo: Arquivo solicitado

document.filenamestring · body · Opcional; ausente no exemplo

Nome apresentado ao destinatário; não converte o formato do arquivo nem altera o ID da mídia.

Exemplo: comprovante.pdf

Como ler a resposta

Resposta ilustrativa de aceitação: {"messages":[{"id":"wamid.EXEMPLO"}]}. messages[].id é a referência da mensagem; guarde esse ID para correlacionar os status. contacts, quando presente, descreve a identidade reconhecida pela Meta. HTTP 2xx confirma a aceitação da chamada; sent, delivered, read ou failed vêm do webhook e não são garantidos pela resposta inicial.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Aceitação HTTP não encerra a análise: falhas de janela, destinatário, política, qualidade ou limite podem aparecer no webhook. Correlacionar pelo wamid e tratar o motivo concreto antes de repetir; uma nova execução pode criar outra mensagem.

Depois desta chamada

  • Guardar o message_id retornado e correlacionar os eventos do webhook. report-partner-message-status apenas registra o status no Partner; não envia a mensagem novamente.

Regras desta operação

  • recipient recebe o BSUID opaco, por exemplo BR.BSUID_REAL, vindo de contacts[].user_id, messages[].from_user_id ou statuses[].recipient_user_id. Preservar prefixo, letras e maiúsculas. user_id é campo de identidade no webhook, não o nome do campo de envio. Não usar username nem PHONE_NUMBER_ID como destinatário; não acrescentar to ao exemplo BSUID, pois a Meta prioriza to quando ambos estão presentes. Parent BSUID não deve ser assumido disponível; exige habilitação própria.
  • Usar um formato listado pela Meta. Um arquivo HTML de uma página de download não é o documento pretendido.
  • Um ID inexistente, removido ou não acessível ao token falha mesmo que o formato do JSON esteja correto. O fluxo não faz upload automaticamente nesta operação; use meta-upload-media antes.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
  • Texto livre depende de uma mensagem recebida e autenticada do usuário nas últimas 24 horas para esse número e geração da conexão. Criar um contato, importar cliente, enviar um template, receber sent/delivered/read ou identificar FEP não reinicia essa janela. Fora dela, use template aprovado e autorização adequada do destinatário.
  • FEP é benefício de cobrança, separado da permissão de conteúdo. Mostre sua expiração somente com evidência Meta pertinente, como conversation.origin.type=referral_conversion, expiration_timestamp e pricing compatível; ausência desses campos significa não confirmado. Não deduza uma janela fixa da existência de um anúncio nem estenda texto livre para o prazo FEP. Confira a política oficial vigente para elegibilidade e duração.
  • Para telefone conhecido e autorizado, substitua recipient por to com DDI e dígitos. Não envie user_id no body Graph como se fosse campo de envio. BSUID usa recipient, preserva o identificador opaco e seu contexto de portfólio; username reservado não identifica o destinatário.
  • HTTP 2xx/um wamid confirma aceitação, não entrega. Persista o pedido antes de chamar a Meta e deduplique sua fila. Timeout ou resposta ilegível após POST deve ficar incerto e ser reconciliado com webhook/histórico; não faça reenvio automático cego. Idempotency-Key do Partner não oferece idempotência para POSTs Graph.
POSTEnviar audio por ID de mídia a um BSUID
meta-send-audio

Enviar áudio previamente carregado na Meta para o BSUID selecionado.

Quando usar

Depois de obter MEDIA_ID válido para o arquivo e confirmar que o destinatário pode receber uma mensagem livre.

Referência oficial Meta: Envio de mensagens pela Cloud API · Identidade do destinatário e BSUID · Janela de atendimento e preços da Meta

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Ter autorização para falar com o destinatário e um BSUID real recebido no webhook da mesma empresa. Mensagens livres dependem da janela de atendimento e das regras vigentes da Meta; não substituem templates exigidos fora dela.
  • Arquivo disponível na Meta com tipo compatível: audio/aac, audio/mp4, audio/mpeg, audio/amr ou audio/ogg, até 16 MB.
  • O token Meta precisa de whatsapp_business_messaging e acesso ao número/ativo usado. A chave da HookCloud não substitui essa permissão da Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/messages
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "messaging_product": "whatsapp",
  "recipient": "BR.BSUID_RECEBIDO_NO_WEBHOOK",
  "type": "audio",
  "audio": {
    "id": "MEDIA_ID"
  }
}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

RECIPIENT_BSUID / recipientstring · configuração/body · Sim neste exemplo

RECIPIENT_BSUID substitui o marcador do campo recipient. Copiar o identificador recebido da Meta no contexto da empresa, não montar a partir do telefone.

Exemplo: BR.BSUID_REAL_RECEBIDO_NO_WEBHOOK

messaging_productstring literal · body · Sim

Seleciona o produto WhatsApp.

Exemplo: whatsapp

typestring literal · body · Sim

Seleciona a estrutura de conteúdo esperada para esta mensagem.

Exemplo: audio

audioobjeto · body · Sim

Objeto de mídia correspondente ao campo type. O exemplo envia um ID, não os bytes do arquivo.

Exemplo: {"id":"ID_DE_MIDIA"}

MEDIA_ID / audio.idstring · configuração/body · Sim neste exemplo

ID retornado por meta-upload-media ou obtido de uma mídia autorizada. Não é URL de arquivo, caminho local, WABA_ID ou message_id.

Exemplo: ID real devolvido por meta-upload-media

Como ler a resposta

Resposta ilustrativa de aceitação: {"messages":[{"id":"wamid.EXEMPLO"}]}. messages[].id é a referência da mensagem; guarde esse ID para correlacionar os status. contacts, quando presente, descreve a identidade reconhecida pela Meta. HTTP 2xx confirma a aceitação da chamada; sent, delivered, read ou failed vêm do webhook e não são garantidos pela resposta inicial.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Aceitação HTTP não encerra a análise: falhas de janela, destinatário, política, qualidade ou limite podem aparecer no webhook. Correlacionar pelo wamid e tratar o motivo concreto antes de repetir; uma nova execução pode criar outra mensagem.

Depois desta chamada

  • Guardar o message_id retornado e correlacionar os eventos do webhook. report-partner-message-status apenas registra o status no Partner; não envia a mensagem novamente.

Regras desta operação

  • recipient recebe o BSUID opaco, por exemplo BR.BSUID_REAL, vindo de contacts[].user_id, messages[].from_user_id ou statuses[].recipient_user_id. Preservar prefixo, letras e maiúsculas. user_id é campo de identidade no webhook, não o nome do campo de envio. Não usar username nem PHONE_NUMBER_ID como destinatário; não acrescentar to ao exemplo BSUID, pois a Meta prioriza to quando ambos estão presentes. Parent BSUID não deve ser assumido disponível; exige habilitação própria.
  • OGG precisa usar codec Opus; conferir a codificação real. Este exemplo envia áudio comum, sem ativar recursos opcionais de mensagem de voz.
  • Um ID inexistente, removido ou não acessível ao token falha mesmo que o formato do JSON esteja correto. O fluxo não faz upload automaticamente nesta operação; use meta-upload-media antes.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
  • Texto livre depende de uma mensagem recebida e autenticada do usuário nas últimas 24 horas para esse número e geração da conexão. Criar um contato, importar cliente, enviar um template, receber sent/delivered/read ou identificar FEP não reinicia essa janela. Fora dela, use template aprovado e autorização adequada do destinatário.
  • FEP é benefício de cobrança, separado da permissão de conteúdo. Mostre sua expiração somente com evidência Meta pertinente, como conversation.origin.type=referral_conversion, expiration_timestamp e pricing compatível; ausência desses campos significa não confirmado. Não deduza uma janela fixa da existência de um anúncio nem estenda texto livre para o prazo FEP. Confira a política oficial vigente para elegibilidade e duração.
  • Para telefone conhecido e autorizado, substitua recipient por to com DDI e dígitos. Não envie user_id no body Graph como se fosse campo de envio. BSUID usa recipient, preserva o identificador opaco e seu contexto de portfólio; username reservado não identifica o destinatário.
  • HTTP 2xx/um wamid confirma aceitação, não entrega. Persista o pedido antes de chamar a Meta e deduplique sua fila. Timeout ou resposta ilegível após POST deve ficar incerto e ser reconciliado com webhook/histórico; não faça reenvio automático cego. Idempotency-Key do Partner não oferece idempotência para POSTs Graph.
POSTEnviar video por ID de mídia a um BSUID
meta-send-video

Enviar vídeo previamente carregado na Meta para o BSUID selecionado.

Quando usar

Depois de obter MEDIA_ID válido para o arquivo e confirmar que o destinatário pode receber uma mensagem livre.

Referência oficial Meta: Envio de mensagens pela Cloud API · Identidade do destinatário e BSUID · Janela de atendimento e preços da Meta

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Ter autorização para falar com o destinatário e um BSUID real recebido no webhook da mesma empresa. Mensagens livres dependem da janela de atendimento e das regras vigentes da Meta; não substituem templates exigidos fora dela.
  • Arquivo disponível na Meta com tipo compatível: video/mp4 ou video/3gpp, até 16 MB.
  • O token Meta precisa de whatsapp_business_messaging e acesso ao número/ativo usado. A chave da HookCloud não substitui essa permissão da Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/messages
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "messaging_product": "whatsapp",
  "recipient": "BR.BSUID_RECEBIDO_NO_WEBHOOK",
  "type": "video",
  "video": {
    "id": "MEDIA_ID"
  }
}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

RECIPIENT_BSUID / recipientstring · configuração/body · Sim neste exemplo

RECIPIENT_BSUID substitui o marcador do campo recipient. Copiar o identificador recebido da Meta no contexto da empresa, não montar a partir do telefone.

Exemplo: BR.BSUID_REAL_RECEBIDO_NO_WEBHOOK

messaging_productstring literal · body · Sim

Seleciona o produto WhatsApp.

Exemplo: whatsapp

typestring literal · body · Sim

Seleciona a estrutura de conteúdo esperada para esta mensagem.

Exemplo: video

videoobjeto · body · Sim

Objeto de mídia correspondente ao campo type. O exemplo envia um ID, não os bytes do arquivo.

Exemplo: {"id":"ID_DE_MIDIA"}

MEDIA_ID / video.idstring · configuração/body · Sim neste exemplo

ID retornado por meta-upload-media ou obtido de uma mídia autorizada. Não é URL de arquivo, caminho local, WABA_ID ou message_id.

Exemplo: ID real devolvido por meta-upload-media

video.captionstring · body · Opcional; ausente no exemplo

Legenda enviada junto ao arquivo, se suportada pelo tipo. Acrescentar via PARAMETROS completo, mantendo os outros campos obrigatórios.

Exemplo: Arquivo solicitado

Como ler a resposta

Resposta ilustrativa de aceitação: {"messages":[{"id":"wamid.EXEMPLO"}]}. messages[].id é a referência da mensagem; guarde esse ID para correlacionar os status. contacts, quando presente, descreve a identidade reconhecida pela Meta. HTTP 2xx confirma a aceitação da chamada; sent, delivered, read ou failed vêm do webhook e não são garantidos pela resposta inicial.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Aceitação HTTP não encerra a análise: falhas de janela, destinatário, política, qualidade ou limite podem aparecer no webhook. Correlacionar pelo wamid e tratar o motivo concreto antes de repetir; uma nova execução pode criar outra mensagem.

Depois desta chamada

  • Guardar o message_id retornado e correlacionar os eventos do webhook. report-partner-message-status apenas registra o status no Partner; não envia a mensagem novamente.

Regras desta operação

  • recipient recebe o BSUID opaco, por exemplo BR.BSUID_REAL, vindo de contacts[].user_id, messages[].from_user_id ou statuses[].recipient_user_id. Preservar prefixo, letras e maiúsculas. user_id é campo de identidade no webhook, não o nome do campo de envio. Não usar username nem PHONE_NUMBER_ID como destinatário; não acrescentar to ao exemplo BSUID, pois a Meta prioriza to quando ambos estão presentes. Parent BSUID não deve ser assumido disponível; exige habilitação própria.
  • A Meta aceita vídeo H.264 com áudio AAC, uma única faixa de áudio ou sem áudio. A extensão sozinha não garante compatibilidade; conferir os codecs reais do arquivo.
  • Um ID inexistente, removido ou não acessível ao token falha mesmo que o formato do JSON esteja correto. O fluxo não faz upload automaticamente nesta operação; use meta-upload-media antes.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
  • Texto livre depende de uma mensagem recebida e autenticada do usuário nas últimas 24 horas para esse número e geração da conexão. Criar um contato, importar cliente, enviar um template, receber sent/delivered/read ou identificar FEP não reinicia essa janela. Fora dela, use template aprovado e autorização adequada do destinatário.
  • FEP é benefício de cobrança, separado da permissão de conteúdo. Mostre sua expiração somente com evidência Meta pertinente, como conversation.origin.type=referral_conversion, expiration_timestamp e pricing compatível; ausência desses campos significa não confirmado. Não deduza uma janela fixa da existência de um anúncio nem estenda texto livre para o prazo FEP. Confira a política oficial vigente para elegibilidade e duração.
  • Para telefone conhecido e autorizado, substitua recipient por to com DDI e dígitos. Não envie user_id no body Graph como se fosse campo de envio. BSUID usa recipient, preserva o identificador opaco e seu contexto de portfólio; username reservado não identifica o destinatário.
  • HTTP 2xx/um wamid confirma aceitação, não entrega. Persista o pedido antes de chamar a Meta e deduplique sua fila. Timeout ou resposta ilegível após POST deve ficar incerto e ser reconciliado com webhook/histórico; não faça reenvio automático cego. Idempotency-Key do Partner não oferece idempotência para POSTs Graph.
POSTEnviar sticker por ID de mídia a um BSUID
meta-send-sticker

Enviar sticker previamente carregado na Meta para o BSUID selecionado.

Quando usar

Depois de obter MEDIA_ID válido para o arquivo e confirmar que o destinatário pode receber uma mensagem livre.

Referência oficial Meta: Envio de mensagens pela Cloud API · Identidade do destinatário e BSUID · Janela de atendimento e preços da Meta

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Ter autorização para falar com o destinatário e um BSUID real recebido no webhook da mesma empresa. Mensagens livres dependem da janela de atendimento e das regras vigentes da Meta; não substituem templates exigidos fora dela.
  • Arquivo disponível na Meta com tipo compatível: image/webp: até 100 KB estático ou 500 KB animado.
  • O token Meta precisa de whatsapp_business_messaging e acesso ao número/ativo usado. A chave da HookCloud não substitui essa permissão da Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/messages
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "messaging_product": "whatsapp",
  "recipient": "BR.BSUID_RECEBIDO_NO_WEBHOOK",
  "type": "sticker",
  "sticker": {
    "id": "MEDIA_ID"
  }
}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

RECIPIENT_BSUID / recipientstring · configuração/body · Sim neste exemplo

RECIPIENT_BSUID substitui o marcador do campo recipient. Copiar o identificador recebido da Meta no contexto da empresa, não montar a partir do telefone.

Exemplo: BR.BSUID_REAL_RECEBIDO_NO_WEBHOOK

messaging_productstring literal · body · Sim

Seleciona o produto WhatsApp.

Exemplo: whatsapp

typestring literal · body · Sim

Seleciona a estrutura de conteúdo esperada para esta mensagem.

Exemplo: sticker

stickerobjeto · body · Sim

Objeto de mídia correspondente ao campo type. O exemplo envia um ID, não os bytes do arquivo.

Exemplo: {"id":"ID_DE_MIDIA"}

MEDIA_ID / sticker.idstring · configuração/body · Sim neste exemplo

ID retornado por meta-upload-media ou obtido de uma mídia autorizada. Não é URL de arquivo, caminho local, WABA_ID ou message_id.

Exemplo: ID real devolvido por meta-upload-media

Como ler a resposta

Resposta ilustrativa de aceitação: {"messages":[{"id":"wamid.EXEMPLO"}]}. messages[].id é a referência da mensagem; guarde esse ID para correlacionar os status. contacts, quando presente, descreve a identidade reconhecida pela Meta. HTTP 2xx confirma a aceitação da chamada; sent, delivered, read ou failed vêm do webhook e não são garantidos pela resposta inicial.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Aceitação HTTP não encerra a análise: falhas de janela, destinatário, política, qualidade ou limite podem aparecer no webhook. Correlacionar pelo wamid e tratar o motivo concreto antes de repetir; uma nova execução pode criar outra mensagem.

Depois desta chamada

  • Guardar o message_id retornado e correlacionar os eventos do webhook. report-partner-message-status apenas registra o status no Partner; não envia a mensagem novamente.

Regras desta operação

  • recipient recebe o BSUID opaco, por exemplo BR.BSUID_REAL, vindo de contacts[].user_id, messages[].from_user_id ou statuses[].recipient_user_id. Preservar prefixo, letras e maiúsculas. user_id é campo de identidade no webhook, não o nome do campo de envio. Não usar username nem PHONE_NUMBER_ID como destinatário; não acrescentar to ao exemplo BSUID, pois a Meta prioriza to quando ambos estão presentes. Parent BSUID não deve ser assumido disponível; exige habilitação própria.
  • Usar sticker WebP compatível com as dimensões e características exigidas pela Meta; uma imagem PNG comum não corresponde a este tipo.
  • Um ID inexistente, removido ou não acessível ao token falha mesmo que o formato do JSON esteja correto. O fluxo não faz upload automaticamente nesta operação; use meta-upload-media antes.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
  • Texto livre depende de uma mensagem recebida e autenticada do usuário nas últimas 24 horas para esse número e geração da conexão. Criar um contato, importar cliente, enviar um template, receber sent/delivered/read ou identificar FEP não reinicia essa janela. Fora dela, use template aprovado e autorização adequada do destinatário.
  • FEP é benefício de cobrança, separado da permissão de conteúdo. Mostre sua expiração somente com evidência Meta pertinente, como conversation.origin.type=referral_conversion, expiration_timestamp e pricing compatível; ausência desses campos significa não confirmado. Não deduza uma janela fixa da existência de um anúncio nem estenda texto livre para o prazo FEP. Confira a política oficial vigente para elegibilidade e duração.
  • Para telefone conhecido e autorizado, substitua recipient por to com DDI e dígitos. Não envie user_id no body Graph como se fosse campo de envio. BSUID usa recipient, preserva o identificador opaco e seu contexto de portfólio; username reservado não identifica o destinatário.
  • HTTP 2xx/um wamid confirma aceitação, não entrega. Persista o pedido antes de chamar a Meta e deduplique sua fila. Timeout ou resposta ilegível após POST deve ficar incerto e ser reconciliado com webhook/histórico; não faça reenvio automático cego. Idempotency-Key do Partner não oferece idempotência para POSTs Graph.
POSTEnviar localização a um BSUID
meta-send-location

Enviar uma localização estática com coordenadas geográficas e um nome opcional.

Quando usar

Para informar um ponto de atendimento, retirada ou encontro. Não é compartilhamento de localização em tempo real.

Referência oficial Meta: Envio de mensagens pela Cloud API · Identidade do destinatário e BSUID · Janela de atendimento e preços da Meta

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Ter autorização para falar com o destinatário e um BSUID real recebido no webhook da mesma empresa. Mensagens livres dependem da janela de atendimento e das regras vigentes da Meta; não substituem templates exigidos fora dela.
  • O token Meta precisa de whatsapp_business_messaging e acesso ao número/ativo usado. A chave da HookCloud não substitui essa permissão da Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/messages
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "messaging_product": "whatsapp",
  "recipient": "BR.BSUID_RECEBIDO_NO_WEBHOOK",
  "type": "location",
  "location": {
    "latitude": -22.9,
    "longitude": -43.17,
    "name": "Local de teste"
  }
}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

RECIPIENT_BSUID / recipientstring · configuração/body · Sim neste exemplo

RECIPIENT_BSUID substitui o marcador do campo recipient. Copiar o identificador recebido da Meta no contexto da empresa, não montar a partir do telefone.

Exemplo: BR.BSUID_REAL_RECEBIDO_NO_WEBHOOK

messaging_productstring literal · body · Sim

Seleciona o produto WhatsApp.

Exemplo: whatsapp

typestring literal · body · Sim

Seleciona a estrutura de conteúdo esperada para esta mensagem.

Exemplo: location

locationobjeto · body · Sim

Agrupa latitude, longitude e informações de exibição.

Exemplo: {"latitude":-22.9,"longitude":-43.17,"name":"Local de teste"}

location.latitudenúmero · body · Sim

Coordenada norte/sul em graus decimais, de -90 a 90. Enviar número JSON, usando ponto como separador decimal.

Exemplo: -22.9

location.longitudenúmero · body · Sim

Coordenada leste/oeste em graus decimais, de -180 a 180. Não inverter com a latitude.

Exemplo: -43.17

location.namestring · body · Opcional; presente no exemplo

Rótulo do ponto apresentado ao destinatário. As coordenadas continuam sendo a localização efetiva.

Exemplo: Local de teste

location.addressstring · body · Opcional; ausente no exemplo

Endereço legível complementar, se desejado; não substitui as coordenadas.

Exemplo: Rua Exemplo, 100

Como ler a resposta

Resposta ilustrativa de aceitação: {"messages":[{"id":"wamid.EXEMPLO"}]}. messages[].id é a referência da mensagem; guarde esse ID para correlacionar os status. contacts, quando presente, descreve a identidade reconhecida pela Meta. HTTP 2xx confirma a aceitação da chamada; sent, delivered, read ou failed vêm do webhook e não são garantidos pela resposta inicial.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Aceitação HTTP não encerra a análise: falhas de janela, destinatário, política, qualidade ou limite podem aparecer no webhook. Correlacionar pelo wamid e tratar o motivo concreto antes de repetir; uma nova execução pode criar outra mensagem.

Depois desta chamada

  • Guardar o message_id retornado e correlacionar os eventos do webhook. report-partner-message-status apenas registra o status no Partner; não envia a mensagem novamente.

Regras desta operação

  • recipient recebe o BSUID opaco, por exemplo BR.BSUID_REAL, vindo de contacts[].user_id, messages[].from_user_id ou statuses[].recipient_user_id. Preservar prefixo, letras e maiúsculas. user_id é campo de identidade no webhook, não o nome do campo de envio. Não usar username nem PHONE_NUMBER_ID como destinatário; não acrescentar to ao exemplo BSUID, pois a Meta prioriza to quando ambos estão presentes. Parent BSUID não deve ser assumido disponível; exige habilitação própria.
  • As coordenadas do catálogo são ilustrativas. Conferir o ponto no mapa antes de enviar ao cliente.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
  • Texto livre depende de uma mensagem recebida e autenticada do usuário nas últimas 24 horas para esse número e geração da conexão. Criar um contato, importar cliente, enviar um template, receber sent/delivered/read ou identificar FEP não reinicia essa janela. Fora dela, use template aprovado e autorização adequada do destinatário.
  • FEP é benefício de cobrança, separado da permissão de conteúdo. Mostre sua expiração somente com evidência Meta pertinente, como conversation.origin.type=referral_conversion, expiration_timestamp e pricing compatível; ausência desses campos significa não confirmado. Não deduza uma janela fixa da existência de um anúncio nem estenda texto livre para o prazo FEP. Confira a política oficial vigente para elegibilidade e duração.
  • Para telefone conhecido e autorizado, substitua recipient por to com DDI e dígitos. Não envie user_id no body Graph como se fosse campo de envio. BSUID usa recipient, preserva o identificador opaco e seu contexto de portfólio; username reservado não identifica o destinatário.
  • HTTP 2xx/um wamid confirma aceitação, não entrega. Persista o pedido antes de chamar a Meta e deduplique sua fila. Timeout ou resposta ilegível após POST deve ficar incerto e ser reconciliado com webhook/histórico; não faça reenvio automático cego. Idempotency-Key do Partner não oferece idempotência para POSTs Graph.
POSTEnviar botões interativos a um BSUID
meta-send-buttons

Enviar uma mensagem com botões de resposta rápida, cada um com identificador estável para o sistema do cliente tratar a escolha.

Quando usar

Para oferecer poucas opções dentro da janela de atendimento; estes botões livres não são a definição de botões de um template.

Referência oficial Meta: Envio de mensagens pela Cloud API · Identidade do destinatário e BSUID · Janela de atendimento e preços da Meta

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Ter autorização para falar com o destinatário e um BSUID real recebido no webhook da mesma empresa. Mensagens livres dependem da janela de atendimento e das regras vigentes da Meta; não substituem templates exigidos fora dela.
  • O token Meta precisa de whatsapp_business_messaging e acesso ao número/ativo usado. A chave da HookCloud não substitui essa permissão da Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/messages
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "messaging_product": "whatsapp",
  "recipient": "BR.BSUID_RECEBIDO_NO_WEBHOOK",
  "type": "interactive",
  "interactive": {
    "type": "button",
    "body": {
      "text": "Escolha uma opção"
    },
    "action": {
      "buttons": [
        {
          "type": "reply",
          "reply": {
            "id": "opcao_1",
            "title": "Opção 1"
          }
        }
      ]
    }
  }
}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

RECIPIENT_BSUID / recipientstring · configuração/body · Sim neste exemplo

RECIPIENT_BSUID substitui o marcador do campo recipient. Copiar o identificador recebido da Meta no contexto da empresa, não montar a partir do telefone.

Exemplo: BR.BSUID_REAL_RECEBIDO_NO_WEBHOOK

messaging_productstring literal · body · Sim

Seleciona o produto WhatsApp.

Exemplo: whatsapp

typestring literal · body · Sim

Seleciona a estrutura de conteúdo esperada para esta mensagem.

Exemplo: interactive

interactiveobjeto · body · Sim

Conteúdo interativo; deve combinar com type=interactive.

Exemplo: Objeto mostrado no exemplo do fluxo

interactive.typestring literal · body · Sim

Seleciona botões de resposta. Não trocar por list sem reconstruir o objeto de ação correspondente.

Exemplo: button

interactive.bodyobjeto · body · Sim

Texto principal da interação.

Exemplo: {"text":"Escolha uma opção"}

interactive.body.textstring · body · Sim

Pergunta ou orientação, até 1024 caracteres conforme a documentação da Meta.

Exemplo: Escolha uma opção

interactive.actionobjeto · body · Sim

Reúne as ações oferecidas ao usuário.

Exemplo: {"buttons":[...]}

interactive.action.buttonsarray de objetos · body · Sim

Uma a três opções. O exemplo inclui uma; acrescente as demais no mesmo array.

Exemplo: [{"type":"reply","reply":{"id":"opcao_1","title":"Opção 1"}}]

interactive.action.buttons[].typestring literal · body · Sim em cada botão

Tipo da ação suportada neste exemplo.

Exemplo: reply

interactive.action.buttons[].replyobjeto · body · Sim em cada botão

Agrupa ID interno e título visível.

Exemplo: {"id":"opcao_1","title":"Opção 1"}

interactive.action.buttons[].reply.idstring · body · Sim; único na mensagem

Identificador técnico da opção, até 256 caracteres. Use esse valor para decisões no sistema, sem depender do texto exibido.

Exemplo: opcao_1

interactive.action.buttons[].reply.titlestring · body · Sim

Texto visível do botão, até 20 caracteres. Usar rótulos curtos e distintos.

Exemplo: Opção 1

Como ler a resposta

Resposta ilustrativa de aceitação: {"messages":[{"id":"wamid.EXEMPLO"}]}. messages[].id é a referência da mensagem; guarde esse ID para correlacionar os status. contacts, quando presente, descreve a identidade reconhecida pela Meta. HTTP 2xx confirma a aceitação da chamada; sent, delivered, read ou failed vêm do webhook e não são garantidos pela resposta inicial.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Aceitação HTTP não encerra a análise: falhas de janela, destinatário, política, qualidade ou limite podem aparecer no webhook. Correlacionar pelo wamid e tratar o motivo concreto antes de repetir; uma nova execução pode criar outra mensagem.

Depois desta chamada

  • Após o usuário clicar, identificar messages[].interactive.button_reply.id e title no webhook. O envio da mensagem não executa a escolha nem chama automaticamente outro endpoint do Partner.

Regras desta operação

  • recipient recebe o BSUID opaco, por exemplo BR.BSUID_REAL, vindo de contacts[].user_id, messages[].from_user_id ou statuses[].recipient_user_id. Preservar prefixo, letras e maiúsculas. user_id é campo de identidade no webhook, não o nome do campo de envio. Não usar username nem PHONE_NUMBER_ID como destinatário; não acrescentar to ao exemplo BSUID, pois a Meta prioriza to quando ambos estão presentes. Parent BSUID não deve ser assumido disponível; exige habilitação própria.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
  • Texto livre depende de uma mensagem recebida e autenticada do usuário nas últimas 24 horas para esse número e geração da conexão. Criar um contato, importar cliente, enviar um template, receber sent/delivered/read ou identificar FEP não reinicia essa janela. Fora dela, use template aprovado e autorização adequada do destinatário.
  • FEP é benefício de cobrança, separado da permissão de conteúdo. Mostre sua expiração somente com evidência Meta pertinente, como conversation.origin.type=referral_conversion, expiration_timestamp e pricing compatível; ausência desses campos significa não confirmado. Não deduza uma janela fixa da existência de um anúncio nem estenda texto livre para o prazo FEP. Confira a política oficial vigente para elegibilidade e duração.
  • Para telefone conhecido e autorizado, substitua recipient por to com DDI e dígitos. Não envie user_id no body Graph como se fosse campo de envio. BSUID usa recipient, preserva o identificador opaco e seu contexto de portfólio; username reservado não identifica o destinatário.
  • HTTP 2xx/um wamid confirma aceitação, não entrega. Persista o pedido antes de chamar a Meta e deduplique sua fila. Timeout ou resposta ilegível após POST deve ficar incerto e ser reconciliado com webhook/histórico; não faça reenvio automático cego. Idempotency-Key do Partner não oferece idempotência para POSTs Graph.
POSTReagir a uma mensagem
meta-send-reaction

Aplicar um emoji como reação a uma mensagem recebida do usuário.

Quando usar

Quando a aplicação quer reconhecer uma mensagem específica, usando seu wamid real.

Referência oficial Meta: Envio de mensagens pela Cloud API · Identidade do destinatário e BSUID · Janela de atendimento e preços da Meta

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Ter autorização para falar com o destinatário e um BSUID real recebido no webhook da mesma empresa. Mensagens livres dependem da janela de atendimento e das regras vigentes da Meta; não substituem templates exigidos fora dela.
  • O token Meta precisa de whatsapp_business_messaging e acesso ao número/ativo usado. A chave da HookCloud não substitui essa permissão da Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/messages
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "messaging_product": "whatsapp",
  "recipient": "BR.BSUID_RECEBIDO_NO_WEBHOOK",
  "type": "reaction",
  "reaction": {
    "message_id": "MESSAGE_ID",
    "emoji": "👍"
  }
}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

RECIPIENT_BSUID / recipientstring · configuração/body · Sim neste exemplo

RECIPIENT_BSUID substitui o marcador do campo recipient. Copiar o identificador recebido da Meta no contexto da empresa, não montar a partir do telefone.

Exemplo: BR.BSUID_REAL_RECEBIDO_NO_WEBHOOK

messaging_productstring literal · body · Sim

Seleciona o produto WhatsApp.

Exemplo: whatsapp

typestring literal · body · Sim

Seleciona a estrutura de conteúdo esperada para esta mensagem.

Exemplo: reaction

reactionobjeto · body · Sim

Identifica a mensagem alvo e o emoji.

Exemplo: {"message_id":"wamid.EXEMPLO","emoji":"👍"}

MESSAGE_ID / reaction.message_idstring · configuração/body · Sim

ID da mensagem recebida na conversa do BSUID escolhido. Não é o ID do template nem do evento interno do Partner.

Exemplo: wamid.REAL_RECEBIDO_NO_WEBHOOK

reaction.emojistring Unicode · body · Sim

Emoji que será aplicado. Pode ser escrito diretamente em JSON; manter o documento em UTF-8.

Exemplo: 👍

Como ler a resposta

Resposta ilustrativa de aceitação: {"messages":[{"id":"wamid.EXEMPLO_REACAO"}]}. Esse ID é o da nova reação. A documentação atual informa que reações geram somente status sent; não geram webhooks delivered/read. Portanto, não tratar a ausência desses dois status como falha de entrega da reação.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • A Meta informa erro 131009 no webhook se a mensagem alvo tiver mais de 30 dias, não existir na conversa, tiver sido excluída ou já for uma reação. Conferir o wamid alvo e o contexto.

Depois desta chamada

  • Guardar separadamente o MESSAGE_ID alvo e o message_id da reação devolvido pela API. Acompanhar o status sent da reação quando recebido.

Regras desta operação

  • recipient recebe o BSUID opaco, por exemplo BR.BSUID_REAL, vindo de contacts[].user_id, messages[].from_user_id ou statuses[].recipient_user_id. Preservar prefixo, letras e maiúsculas. user_id é campo de identidade no webhook, não o nome do campo de envio. Não usar username nem PHONE_NUMBER_ID como destinatário; não acrescentar to ao exemplo BSUID, pois a Meta prioriza to quando ambos estão presentes. Parent BSUID não deve ser assumido disponível; exige habilitação própria.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
  • Texto livre depende de uma mensagem recebida e autenticada do usuário nas últimas 24 horas para esse número e geração da conexão. Criar um contato, importar cliente, enviar um template, receber sent/delivered/read ou identificar FEP não reinicia essa janela. Fora dela, use template aprovado e autorização adequada do destinatário.
  • FEP é benefício de cobrança, separado da permissão de conteúdo. Mostre sua expiração somente com evidência Meta pertinente, como conversation.origin.type=referral_conversion, expiration_timestamp e pricing compatível; ausência desses campos significa não confirmado. Não deduza uma janela fixa da existência de um anúncio nem estenda texto livre para o prazo FEP. Confira a política oficial vigente para elegibilidade e duração.
  • Para telefone conhecido e autorizado, substitua recipient por to com DDI e dígitos. Não envie user_id no body Graph como se fosse campo de envio. BSUID usa recipient, preserva o identificador opaco e seu contexto de portfólio; username reservado não identifica o destinatário.
  • HTTP 2xx/um wamid confirma aceitação, não entrega. Persista o pedido antes de chamar a Meta e deduplique sua fila. Timeout ou resposta ilegível após POST deve ficar incerto e ser reconciliado com webhook/histórico; não faça reenvio automático cego. Idempotency-Key do Partner não oferece idempotência para POSTs Graph.
POSTMarcar mensagem recebida como lida
meta-mark-read

Informar à Meta que a aplicação leu uma mensagem recebida pelo número comercial.

Quando usar

Depois que o atendimento ou processamento considerar a mensagem realmente lida. Não usar o ID da própria mensagem enviada para simular que o cliente a leu.

Referência oficial Meta: Marcar mensagem como lida

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Ter o messages[].id de uma mensagem recebida no número selecionado.
  • O token Meta precisa de whatsapp_business_messaging e acesso ao número/ativo usado. A chave da HookCloud não substitui essa permissão da Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/messages
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "messaging_product": "whatsapp",
  "status": "read",
  "message_id": "MESSAGE_ID"
}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

messaging_productstring literal · body · Sim

Identifica a API WhatsApp.

Exemplo: whatsapp

statusstring literal · body · Sim

Ação de leitura; não usar sent/delivered nesta chamada.

Exemplo: read

MESSAGE_ID / message_idstring · configuração/body · Sim

wamid da mensagem recebida que será marcada como lida. É um campo no nível principal do body.

Exemplo: wamid.REAL_RECEBIDO_NO_WEBHOOK

Como ler a resposta

Exemplo ilustrativo: {"success":true}. Confirma a marcação solicitada, não o envio de uma nova mensagem. Não há novo messages[].id a usar como resposta ao cliente.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • ID de mensagem inválido, de outro número ou não elegível para marcação deve ser corrigido. Não insistir trocando arbitrariamente o BSUID ou o número.

Depois desta chamada

  • Registrar no sistema do cliente que a ação foi aceita. Para enviar uma resposta, escolher separadamente uma operação meta-send-* apropriada.

Regras desta operação

  • Este body não recebe recipient, user_id, to nem type=text. A nota geral do catálogo sobre BSUID não significa que esta operação exija um destinatário.
  • Marcar leitura não substitui report-partner-message-status: a primeira atua na Meta; a segunda registra telemetria recebida no Partner.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.

Meta — criar e gerenciar templates

Criar, editar e excluir modelos diretamente na Graph API.

GETListar templates diretamente na Meta
meta-list-templates · Meta: cache obrigatório

Consultar os templates existentes diretamente na WABA da Meta, sem depender da última sincronização do cache HookCloud.

Quando usar

Antes de escolher um template para envio, depois de criar/editar ou quando houver divergência entre o catálogo local e o WhatsApp Manager.

GET à Meta: cache obrigatório

Armazene e reutilize a resposta no seu backend. Priorize webhooks para mudanças; não consulte a Meta a cada renderização, número ou abertura de tela. Use paginação, requisições concorrentes limitadas e backoff com Retry-After quando informado. Repetições excessivas podem causar rate limit e revisão da integração pela HookCloud. Política de integração.

Referência oficial Meta: Templates: criação, consulta, atualização e exclusão

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • A WABA e o template devem estar acessíveis ao token com whatsapp_business_management. O escopo instances.credentials.read da HookCloud permite obter a credencial, mas não substitui as permissões Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/WABA_ID/message_templates?limit=25
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

WABA_IDstring numérica · configuração/path · Derivado da credencial; obrigatório nesta URL

Conta WhatsApp Business da instância selecionada. Não é o ID do app Meta, do portfólio empresarial nem do usuário destinatário. Preenchê-lo na configuração acrescenta uma conferência de correspondência.

Exemplo: ID real da WABA

limitinteiro · query · Opcional; exemplo define 25

Quantidade desejada por página na Graph. Não corresponde a page_size das rotas do Partner. A Meta pode retornar menos itens.

Exemplo: 25

afterstring opaca · query · Opcional; necessário para avançar se houver cursor

Para outra página, usar paging.cursors.after recebido e repetir a mesma operação com os filtros pretendidos. Não calcular o cursor nem incrementá-lo como número.

Exemplo: Cursor real da resposta

Como ler a resposta

Exemplo ilustrativo reduzido: {"data":[{"id":"ID_META","name":"aviso_pedido","language":"pt_BR","status":"APPROVED","category":"UTILITY","components":[]}],"paging":{"cursors":{"after":"CURSOR"}}}. id identifica a tradução na Meta; name é o nome reutilizado no envio; language seleciona o idioma; status informa análise/disponibilidade; category classifica o uso; components contém a estrutura e variáveis. APPROVED indica aprovação, enquanto PENDING, REJECTED, PAUSED ou DISABLED exigem interpretação própria; nunca considerar todos esses estados como enviáveis. paging.next indica continuação quando existe. O sistema faz uma chamada por execução; não percorre todas as páginas automaticamente.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Uma lista vazia válida é diferente de HTTP 403 ou resposta de erro. Conferir a WABA da instância, não presumir que um nome existente em outra WABA deve aparecer.

Depois desta chamada

  • Copiar id para TEMPLATE_ID e a combinação name/language para TEMPLATE_NAME/TEMPLATE_LANGUAGE.
  • Se houver mudanças a refletir no Partner, executar refresh-partner-meta-templates e depois consultar o resultado da sincronização.

Regras desta operação

  • Cache obrigatório: consulte a Meta somente quando necessário, reutilize os dados armazenados e priorize eventos. Não faça GET a cada abertura de tela ou em loop. Use paginação e backoff, respeite Retry-After quando existir e interrompa tentativas repetidas de permissão. Uso excessivo pode gerar rate limit e revisão da integração pela HookCloud.
  • A Graph usa cursores; as consultas do cache HookCloud usam paginação própria. Não intercambiar parâmetros dos dois serviços.
  • O filtro fields e outros filtros da Graph podem ser acrescentados via PARAMETROS, mas sua disponibilidade precisa seguir o contrato Meta. O catálogo atual só fornece limit no exemplo.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
GETConsultar um template por ID
meta-get-template · Meta: cache obrigatório

Ler uma tradução de template pelo ID da Meta e verificar a estrutura exata antes de editar ou enviar.

Quando usar

Após copiar TEMPLATE_ID da listagem/criação, especialmente para conferir idioma, status e componentes de um template específico.

GET à Meta: cache obrigatório

Armazene e reutilize a resposta no seu backend. Priorize webhooks para mudanças; não consulte a Meta a cada renderização, número ou abertura de tela. Use paginação, requisições concorrentes limitadas e backoff com Retry-After quando informado. Repetições excessivas podem causar rate limit e revisão da integração pela HookCloud. Política de integração.

Referência oficial Meta: Templates: criação, consulta, atualização e exclusão

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • A WABA e o template devem estar acessíveis ao token com whatsapp_business_management. O escopo instances.credentials.read da HookCloud permite obter a credencial, mas não substitui as permissões Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/TEMPLATE_ID?fields=id%2Cname%2Cstatus%2Ccategory%2Clanguage%2Ccomponents
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

TEMPLATE_IDstring numérica · configuração/path · Sim

ID do template/tradução na Meta. Não é o nome legível, o UUID do cache do Partner nem um wamid. Obter em meta-list-templates ou na resposta da criação.

Exemplo: ID Meta real do template

fieldsstring separada por vírgulas · query · Presente no exemplo; seleciona o retorno

Lista os atributos desejados. Mantê-la como string, e não como array JSON.

Exemplo: id,name,status,category,language,components

Como ler a resposta

Exemplo ilustrativo: {"id":"ID_META","name":"aviso_pedido","status":"APPROVED","category":"UTILITY","language":"pt_BR","components":[{"type":"BODY","text":"Seu pedido está pronto."}]}. id identifica a tradução na Meta; name é o nome reutilizado no envio; language seleciona o idioma; status informa análise/disponibilidade; category classifica o uso; components contém a estrutura e variáveis. APPROVED indica aprovação, enquanto PENDING, REJECTED, PAUSED ou DISABLED exigem interpretação própria; nunca considerar todos esses estados como enviáveis. Aqui o retorno é o objeto de um template, não necessariamente um array data.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Objeto inexistente e objeto sem permissão podem produzir erros de acesso semelhantes. Conferir se TEMPLATE_ID pertence à WABA autorizada e se foi excluído.

Depois desta chamada

  • Para envio, usar name e language.code dentro do objeto template de meta-send-template.
  • Para edição, preservar a estrutura necessária de todos os componentes e conferir as limitações do status atual.

Regras desta operação

  • Cache obrigatório: consulte a Meta somente quando necessário, reutilize os dados armazenados e priorize eventos. Não faça GET a cada abertura de tela ou em loop. Use paginação e backoff, respeite Retry-After quando existir e interrompa tentativas repetidas de permissão. Uso excessivo pode gerar rate limit e revisão da integração pela HookCloud.
  • TEMPLATE_ID é inserido no path. O runtime confere PHONE_NUMBER_ID/WABA_ID da credencial, mas o acesso final ao ID arbitrário do template também é validado pela Meta. Não usar essa operação como uma consulta global de templates de outros clientes.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
POSTCriar template na Meta
meta-create-template

Criar um template e uma tradução na WABA para análise pela Meta.

Quando usar

Quando o cliente precisa de uma mensagem reutilizável própria, com categoria, idioma e conteúdo coerentes com o uso real.

Referência oficial Meta: Templates: criação, consulta, atualização e exclusão

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • A WABA e o template devem estar acessíveis ao token com whatsapp_business_management. O escopo instances.credentials.read da HookCloud permite obter a credencial, mas não substitui as permissões Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/WABA_ID/message_templates
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "name": "TEMPLATE_NAME",
  "language": "TEMPLATE_LANGUAGE",
  "category": "UTILITY",
  "components": [
    {
      "type": "BODY",
      "text": "O pedido {{1}} foi confirmado. A entrega está prevista para {{2}}. Consulte seu pedido no aplicativo.",
      "example": {
        "body_text": [
          [
            "12345",
            "05/10"
          ]
        ]
      }
    }
  ],
  "parameter_format": "POSITIONAL"
}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

UUID da instância na HookCloud para obter o token em reveal-partner-instance-meta-token. Esta é uma etapa anterior no backend do seu sistema; não envie INSTANCE_ID no body de criação/edição da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Opcional para identificar/conferir a instância; não faz parte desta URL

ID técnico do número associado à credencial, diferente do telefone e do BSUID. Nesta operação a URL usa WABA_ID (criação) ou TEMPLATE_ID (edição), não PHONE_NUMBER_ID. Seu backend deve conferir que a credencial pertence ao cliente e ao ativo corretos.

Exemplo: ID real do número conectado

WABA_IDstring numérica · configuração/path · Derivado da credencial; obrigatório nesta URL

Conta WhatsApp Business da instância selecionada, usada na URL /WABA_ID/message_templates. Não é o ID do app, portfólio ou usuário. Seu backend deve conferir essa associação ao obter a credencial.

Exemplo: ID real da WABA

TEMPLATE_NAME / namestring · configuração/body · Sim

Nome técnico único para essa combinação de WABA e idioma. A documentação aceita letras minúsculas, números e sublinhado; não espaços nem letras maiúsculas. Escolher um nome novo: hello_world já existente não é um bom nome para testar criação.

Exemplo: aviso_pedido_integracao

TEMPLATE_LANGUAGE / languagestring · configuração/body · Sim

Código de idioma da tradução criada. Na criação o campo é uma string direta; no envio é template.language.code.

Exemplo: pt_BR

categorystring enum · body · Sim

Classificação real do conteúdo. O exemplo usa UTILITY; MARKETING e AUTHENTICATION têm regras próprias. Não mudar só para obter uma categoria de cobrança diferente.

Exemplo: UTILITY

componentsarray de objetos · body · Sim

Define a estrutura completa. O exemplo contém BODY com duas posições {{1}}/{{2}} e seus exemplos de análise. HEADER, FOOTER e BUTTONS dependem do formato autorizado e exigem os respectivos campos.

Exemplo: [{"type":"BODY","text":"O pedido {{1}} foi confirmado. A entrega está prevista para {{2}}. Consulte seu pedido no aplicativo.","example":{"body_text":[["12345","05/10"]]}}]

components[].typestring enum · body · Sim em cada componente

O exemplo cria o componente de corpo. Os componentes de definição usam BODY/HEADER/FOOTER/BUTTONS, diferentes do parâmetro de envio type=body.

Exemplo: BODY

components[].textstring · body · Sim no BODY de texto do exemplo

Texto da definição submetida à Meta. Preserve literalmente {{1}} e {{2}} para declarar as posições variáveis; esses marcadores não são valores de configuração nem os dados finais de um envio. Não inclua segredos ou dados reais de clientes nos exemplos.

Exemplo: O pedido {{1}} foi confirmado. A entrega está prevista para {{2}}. Consulte seu pedido no aplicativo.

components[].exampleobjeto · body · Obrigatório neste exemplo, pois há variáveis

Para o BODY posicional deste exemplo, envie example.body_text como lista de conjuntos de valores: [["12345","05/10"]], correspondendo a {{1}} e {{2}}. Esses valores ilustram o conteúdo para a análise da Meta. No envio ao usuário, os dados reais entram em template.components[].parameters, na ordem aprovada.

Exemplo: {"body_text":[["12345","05/10"]]}

parameter_formatstring enum · body · Opcional; para definição parametrizada

O exemplo usa POSITIONAL, em maiúsculas, para variáveis numeradas {{1}}/{{2}}. NAMED usa parâmetros nomeados e exemplos correspondentes; não misture os formatos. O valor deve corresponder à definição submetida.

Exemplo: POSITIONAL

Como ler a resposta

Exemplo ilustrativo: {"id":"ID_META_NOVO","status":"PENDING","category":"UTILITY"}. Guardar id. A resposta de criação aceita não comprova aprovação nem envio; a análise pode aprovar ou rejeitar, e a categoria final deve ser acompanhada.

Erros e como agir

  • Antes da Graph, obtenha a credencial com instances.credentials.read e confira no seu backend a instância/WABA/template do cliente correto. Não troque por um token de outro cliente para resolver falha de permissão.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Nome inválido ou idioma/categoria não suportado pode retornar código 100. Nome já existente no mesmo idioma também pode retornar 100, subcódigo 2388024.
  • Variáveis sem exemplos, componentes incompatíveis ou conteúdo em categoria inadequada exigem corrigir a definição e acompanhar a análise.

Depois desta chamada

  • Consultar meta-get-template até compreender o status devolvido; não transformar isso em consulta contínua sem intervalo.
  • Atualizar o cache HookCloud com refresh-partner-meta-templates. Depois de aprovação e parâmetros corretos, usar meta-send-template.
  • Após a aprovação, use meta-send-template com nome, idioma e os valores reais em template.components[].parameters. Os marcadores {{1}}/{{2}} permanecem na definição do template, não são o texto literal a enviar como valor de parâmetro.

Regras desta operação

  • Distinga os marcadores do guia, como WABA_ID, TEMPLATE_ID e TEMPLATE_NAME, que você substitui pelos dados da integração, dos parâmetros Meta {{1}} e {{2}}, que precisam permanecer no texto da definição. Configure a interpolação do seu próprio sistema para preservar os parâmetros da Meta.
  • O guia gera exemplos HTTP; ele não executa a criação/edição nem pré-valida a aprovação. Seu backend faz o POST direto à Graph API com o token Meta. A resposta e a análise da Meta determinam se a definição é aceita.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
  • Criação, edição e exclusão são mutações Graph, não operações do cache HookCloud. Reserve a intenção antes da chamada e não repita resultado ambíguo; reconcilie pelo ID/nome/idioma/WABA. A criação pode retornar PENDING e a edição pode iniciar nova análise. Para update/delete confira a confirmação success:true quando esse for o contrato da operação.
POSTEditar componentes de um template
meta-update-template

Substituir a definição dos componentes de um template existente na Meta.

Quando usar

Quando o conteúdo aprovado/rejeitado/pausado precisa de revisão e o template atende às condições de edição. Não usar enquanto estiver PENDING.

Referência oficial Meta: Templates: criação, consulta, atualização e exclusão

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • A WABA e o template devem estar acessíveis ao token com whatsapp_business_management. O escopo instances.credentials.read da HookCloud permite obter a credencial, mas não substitui as permissões Meta.
  • Consultar o template primeiro. A documentação permite editar APPROVED, REJECTED e PAUSED; categoria de template aprovado não pode ser editada.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/TEMPLATE_ID
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "components": [
    {
      "type": "BODY",
      "text": "O pedido {{1}} foi confirmado. A entrega está prevista para {{2}}. Consulte seu pedido no aplicativo.",
      "example": {
        "body_text": [
          [
            "12345",
            "05/10"
          ]
        ]
      }
    }
  ]
}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

UUID da instância na HookCloud para obter o token em reveal-partner-instance-meta-token. Esta é uma etapa anterior no backend do seu sistema; não envie INSTANCE_ID no body de criação/edição da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Opcional para identificar/conferir a instância; não faz parte desta URL

ID técnico do número associado à credencial, diferente do telefone e do BSUID. Nesta operação a URL usa WABA_ID (criação) ou TEMPLATE_ID (edição), não PHONE_NUMBER_ID. Seu backend deve conferir que a credencial pertence ao cliente e ao ativo corretos.

Exemplo: ID real do número conectado

TEMPLATE_IDstring numérica · configuração/path · Sim

ID do template/tradução na Meta. Não é o nome legível, o UUID do cache do Partner nem um wamid. Obter em meta-list-templates ou na resposta da criação.

Exemplo: ID Meta real do template

componentsarray completo de objetos · body · Sim no exemplo de edição

A Meta substitui todos os componentes pelo array enviado. Não é PATCH de um único componente. Se o template possui cabeçalho, rodapé ou botões que devem continuar, mantê-los na definição enviada.

Exemplo: [{"type":"BODY","text":"O pedido {{1}} foi confirmado. A entrega está prevista para {{2}}. Consulte seu pedido no aplicativo.","example":{"body_text":[["12345","05/10"]]}}]

components[].typestring enum · body · Sim em cada componente

Identifica o componente completo que a edição vai manter/substituir. O exemplo somente BODY eliminaria outros componentes não incluídos.

Exemplo: BODY

components[].textstring · body · Sim no BODY textual

Texto da definição submetida à Meta. Preserve literalmente {{1}} e {{2}} para declarar as posições variáveis; esses marcadores não são valores de configuração nem os dados finais de um envio. Não inclua segredos ou dados reais de clientes nos exemplos.

Exemplo: O pedido {{1}} foi confirmado. A entrega está prevista para {{2}}. Consulte seu pedido no aplicativo.

components[].exampleobjeto · body · Obrigatório neste exemplo, pois há variáveis

Para o BODY posicional deste exemplo, envie example.body_text como lista de conjuntos de valores: [["12345","05/10"]], correspondendo a {{1}} e {{2}}. Esses valores ilustram o conteúdo para a análise da Meta. No envio ao usuário, os dados reais entram em template.components[].parameters, na ordem aprovada.

Exemplo: {"body_text":[["12345","05/10"]]}

Como ler a resposta

Exemplo ilustrativo: {"success":true}. Significa que a edição foi aceita. Consultar novamente status e components: pode haver nova avaliação e mudança da condição de envio; a aplicação não deve supor que o conteúdo anterior continua aprovado.

Erros e como agir

  • Antes da Graph, obtenha a credencial com instances.credentials.read e confira no seu backend a instância/WABA/template do cliente correto. Não troque por um token de outro cliente para resolver falha de permissão.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Edição em status não elegível, tentativa de mudar categoria aprovada ou limite de edições excedido precisam ser tratados conforme a resposta Meta.
  • Para APPROVED, a documentação limita a uma edição em 24 horas e até 10 em 30 dias. Não contornar isso criando uma sequência de requisições iguais.

Depois desta chamada

  • Executar meta-get-template para conferir os componentes efetivos e o status.
  • Atualizar o cache do Partner e revisar os parâmetros usados em meta-send-template se o número de variáveis mudou.
  • Após a aprovação, use meta-send-template com nome, idioma e os valores reais em template.components[].parameters. Os marcadores {{1}}/{{2}} permanecem na definição do template, não são o texto literal a enviar como valor de parâmetro.

Regras desta operação

  • O exemplo com apenas BODY é apropriado somente quando a estrutura desejada é realmente só esse componente. Antes de substituir um template em uso, conferir automações que dependem dos demais componentes.
  • Distinga os marcadores do guia, como WABA_ID, TEMPLATE_ID e TEMPLATE_NAME, que você substitui pelos dados da integração, dos parâmetros Meta {{1}} e {{2}}, que precisam permanecer no texto da definição. Configure a interpolação do seu próprio sistema para preservar os parâmetros da Meta.
  • O guia gera exemplos HTTP; ele não executa a criação/edição nem pré-valida a aprovação. Seu backend faz o POST direto à Graph API com o token Meta. A resposta e a análise da Meta determinam se a definição é aceita.
  • O exemplo de edição pressupõe um template de formato POSITIONAL. Leia o template antes de editar e preserve o formato e a estrutura compatíveis; não renumere ou converta parâmetros sem revisar os envios que dependem deles.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
  • Criação, edição e exclusão são mutações Graph, não operações do cache HookCloud. Reserve a intenção antes da chamada e não repita resultado ambíguo; reconcilie pelo ID/nome/idioma/WABA. A criação pode retornar PENDING e a edição pode iniciar nova análise. Para update/delete confira a confirmação success:true quando esse for o contrato da operação.
DELETEExcluir template pelo nome e ID
meta-delete-template

Excluir da Meta uma tradução específica de template, usando conjuntamente nome e ID.

Quando usar

Para remover um template de teste ou descontinuado que já não deva ser usado nas integrações.

Referência oficial Meta: Templates: criação, consulta, atualização e exclusão

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • A WABA e o template devem estar acessíveis ao token com whatsapp_business_management. O escopo instances.credentials.read da HookCloud permite obter a credencial, mas não substitui as permissões Meta.
  • Confirmar TEMPLATE_NAME e TEMPLATE_ID da mesma tradução. Verificar automações e mensagens pendentes antes da exclusão.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método DELETE com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/WABA_ID/message_templates?name=TEMPLATE_NAME&hsm_id=TEMPLATE_ID
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

WABA_IDstring numérica · configuração/path · Derivado da credencial; obrigatório nesta URL

Conta WhatsApp Business da instância selecionada. Não é o ID do app Meta, do portfólio empresarial nem do usuário destinatário. Preenchê-lo na configuração acrescenta uma conferência de correspondência.

Exemplo: ID real da WABA

TEMPLATE_NAME / namestring · configuração/query · Sim neste exemplo

Nome exato do template. Embora DELETE, esta operação usa query string, sem JSON no body.

Exemplo: aviso_pedido_da integração

TEMPLATE_ID / hsm_idstring numérica · configuração/query · Sim para exclusão específica

Identifica a tradução a excluir dentro desse nome. O campo da API é hsm_id; não mudar para template_id.

Exemplo: ID_META_DA_TRADUCAO

Como ler a resposta

Exemplo ilustrativo: {"success":true}. Confirma o pedido de exclusão conforme as regras Meta. Um template com mensagem ainda não entregue pode ficar em PENDING_DELETION; verificar a consulta e não assumir remoção instantânea em todos os cenários.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Nome inexistente, ID incompatível com o nome ou ausência de whatsapp_business_management causam falha. A documentação informa código 200 se o token tiver apenas whatsapp_business_messaging.
  • A documentação registra limitações para excluir templates desabilitados e para reutilizar nome de template aprovado excluído; respeitar a resposta recebida.

Depois desta chamada

  • Conferir por consulta e atualizar o catálogo HookCloud para refletir o estado atual.
  • Retirar esse nome/idioma de futuras chamadas de envio.

Regras desta operação

  • Remover hsm_id e manter somente name amplia a exclusão para traduções com o mesmo nome. Não tratar essa mudança como mera simplificação do payload.
  • A Meta pode impedir recriação do mesmo nome por 30 dias após excluir um template aprovado. DELETE de template não apaga mensagens já entregues.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
  • Criação, edição e exclusão são mutações Graph, não operações do cache HookCloud. Reserve a intenção antes da chamada e não repita resultado ambíguo; reconcilie pelo ID/nome/idioma/WABA. A criação pode retornar PENDING e a edição pode iniciar nova análise. Para update/delete confira a confirmação success:true quando esse for o contrato da operação.

Meta — perfil e username comercial

Consultar números, editar o perfil e gerenciar o username quando o recurso estiver habilitado.

GETListar números da conta WhatsApp
meta-list-phone-numbers · Meta: cache obrigatório

Listar os números associados à WABA selecionada e seus identificadores oficiais.

Quando usar

Para inventariar ativos disponíveis na conta e conferir se o número esperado pertence à WABA da instância.

GET à Meta: cache obrigatório

Armazene e reutilize a resposta no seu backend. Priorize webhooks para mudanças; não consulte a Meta a cada renderização, número ou abertura de tela. Use paginação, requisições concorrentes limitadas e backoff com Retry-After quando informado. Repetições excessivas podem causar rate limit e revisão da integração pela HookCloud. Política de integração.

Referência oficial Meta: Números comerciais, nome e qualidade

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Token com acesso à WABA e whatsapp_business_management. Listar um número não conclui registro, validação por SMS nem instalação do callback.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/WABA_ID/phone_numbers?fields=id%2Cdisplay_phone_number%2Cverified_name%2Cquality_rating
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

WABA_IDstring numérica · configuração/path · Derivado da credencial; obrigatório nesta URL

Conta WhatsApp Business da instância selecionada. Não é o ID do app Meta, do portfólio empresarial nem do usuário destinatário. Preenchê-lo na configuração acrescenta uma conferência de correspondência.

Exemplo: ID real da WABA

fieldsstring separada por vírgulas · query · Presente no exemplo

Campos retornados para cada número. Não confundir a seleção fields com os campos assinados do webhook Meta.

Exemplo: id,display_phone_number,verified_name,quality_rating

afterstring opaca · query · Opcional se houver próxima página

Cursor real recebido em paging; não usar page/page_size da API HookCloud.

Exemplo: Cursor real da resposta

Como ler a resposta

Exemplo ilustrativo reduzido: {"data":[{"id":"ID_NUMERO","display_phone_number":"+55 ...","verified_name":"Empresa Exemplo","quality_rating":"GREEN"}],"paging":{...}}. id é o PHONE_NUMBER_ID técnico; display_phone_number é a apresentação legível do telefone empresarial; verified_name é o nome associado/verificado pela Meta; quality_rating é o indicador devolvido pela Meta e pode estar indisponível. Nenhum desses campos é o BSUID do consumidor. GREEN é apenas valor ilustrativo; o retorno real pode ser diferente. A listagem pode ser paginada.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • WABA incorreta, token sem acesso aos números ou campo não permitido podem impedir a consulta. Lista vazia válida não prova que uma conta de outro portfólio não tenha números.

Depois desta chamada

  • Conferir o ID desejado em get-partner-instance. Para operar outro número pelo fluxo, selecionar sua instância autorizada.
  • Usar meta-get-phone-number quando já tiver o número escolhido.

Regras desta operação

  • Cache obrigatório: consulte a Meta somente quando necessário, reutilize os dados armazenados e priorize eventos. Não faça GET a cada abertura de tela ou em loop. Use paginação e backoff, respeite Retry-After quando existir e interrompa tentativas repetidas de permissão. Uso excessivo pode gerar rate limit e revisão da integração pela HookCloud.
  • A listagem não muda a instância selecionada nem distribui o token entre todos os números. O sistema bloqueia PHONE_NUMBER_ID configurado que divergir da credencial revelada.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
GETConsultar número conectado
meta-get-phone-number · Meta: cache obrigatório

Consultar os dados oficiais de um único número comercial selecionado pela instância.

Quando usar

Durante diagnóstico de conexão, para confirmar o ID técnico, a apresentação do número, nome e qualidade atuais.

GET à Meta: cache obrigatório

Armazene e reutilize a resposta no seu backend. Priorize webhooks para mudanças; não consulte a Meta a cada renderização, número ou abertura de tela. Use paginação, requisições concorrentes limitadas e backoff com Retry-After quando informado. Repetições excessivas podem causar rate limit e revisão da integração pela HookCloud. Política de integração.

Referência oficial Meta: Números comerciais, nome e qualidade

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • O token precisa ter acesso ao número. Esta consulta não realiza nem confirma sozinha a verificação de propriedade e registro na Cloud API.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID?fields=id%2Cdisplay_phone_number%2Cverified_name%2Cquality_rating
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

fieldsstring separada por vírgulas · query · Presente no exemplo

Solicita os quatro atributos do exemplo. Campos extras dependem da referência Meta e das permissões do token.

Exemplo: id,display_phone_number,verified_name,quality_rating

Como ler a resposta

Exemplo ilustrativo: {"id":"ID_NUMERO","display_phone_number":"+55 ...","verified_name":"Empresa Exemplo","quality_rating":"GREEN"}. id é o PHONE_NUMBER_ID técnico; display_phone_number é a apresentação legível do telefone empresarial; verified_name é o nome associado/verificado pela Meta; quality_rating é o indicador devolvido pela Meta e pode estar indisponível. Nenhum desses campos é o BSUID do consumidor. A condição operacional da instância/callback deve ser conferida também no Partner; esses quatro campos não substituem esse diagnóstico.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • ID de telefone confundido com número E.164, WABA_ID ou APP_ID não identifica o recurso pretendido. Conferir o retorno da instância antes de tentar novamente.

Depois desta chamada

  • Comparar com get-partner-instance. Se a dúvida for entrega ou callback, usar também as rotas de saúde e endpoint, sem alterar o ativo Meta por esta consulta.

Regras desta operação

  • Cache obrigatório: consulte a Meta somente quando necessário, reutilize os dados armazenados e priorize eventos. Não faça GET a cada abertura de tela ou em loop. Use paginação e backoff, respeite Retry-After quando existir e interrompa tentativas repetidas de permissão. Uso excessivo pode gerar rate limit e revisão da integração pela HookCloud.
  • verified_name não é username reservado, e quality_rating não é uma promessa de entrega de qualquer mensagem. Não converter um campo vazio em status aprovado por conta própria.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
GETConsultar perfil comercial
meta-get-business-profile · Meta: cache obrigatório

Consultar informações públicas do perfil comercial mostrado no WhatsApp para o número escolhido.

Quando usar

Para revisar apresentação, descrição, contatos e links antes de solicitar alterações.

GET à Meta: cache obrigatório

Armazene e reutilize a resposta no seu backend. Priorize webhooks para mudanças; não consulte a Meta a cada renderização, número ou abertura de tela. Use paginação, requisições concorrentes limitadas e backoff com Retry-After quando informado. Repetições excessivas podem causar rate limit e revisão da integração pela HookCloud. Política de integração.

Referência oficial Meta: Perfil comercial

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • O token Meta precisa de whatsapp_business_management e acesso ao número comercial.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/whatsapp_business_profile?fields=about%2Caddress%2Cdescription%2Cemail%2Cprofile_picture_url%2Cwebsites%2Cvertical
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

fieldsstring separada por vírgulas · query · Presente no exemplo

Seleciona os atributos do perfil. about é o texto curto; description é a descrição comercial; address é o endereço; email é contato; profile_picture_url é a URL da foto; websites é a lista de sites; vertical é o ramo.

Exemplo: about,address,description,email,profile_picture_url,websites,vertical

Como ler a resposta

Exemplo ilustrativo reduzido: {"data":[{"about":"Atendimento da empresa","description":"Descrição comercial","email":"contato@empresa.example","websites":["https://empresa.example"],"vertical":"RETAIL","messaging_product":"whatsapp"}]}. Ler o objeto dentro de data e tratar campos ausentes como não informados/indisponíveis, sem apagar automaticamente valores locais.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Campos não autorizados ou formato de fields incorreto podem ser rejeitados. Verificar se o token acessa o número, não apenas o portfólio.

Depois desta chamada

  • Preparar somente as mudanças desejadas em meta-update-business-profile e conferir novamente depois.

Regras desta operação

  • Cache obrigatório: consulte a Meta somente quando necessário, reutilize os dados armazenados e priorize eventos. Não faça GET a cada abertura de tela ou em loop. Use paginação e backoff, respeite Retry-After quando existir e interrompa tentativas repetidas de permissão. Uso excessivo pode gerar rate limit e revisão da integração pela HookCloud.
  • A URL de foto retornada não é automaticamente um profile_picture_handle utilizável para edição. Essa operação não muda verified_name nem username.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
POSTAtualizar descrição comercial
meta-update-business-profile

Atualizar o texto curto about do perfil comercial, conforme o exemplo do sistema.

Quando usar

Quando o conteúdo de apresentação do número precisa ser corrigido. Para outros campos, reconstruir PARAMETROS conscientemente conforme o contrato de perfil.

Referência oficial Meta: Perfil comercial

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • A pessoa responsável pelo número deve ter autorizado a alteração pública do perfil; conferir o conteúdo atual antes da mudança.
  • O token Meta precisa de whatsapp_business_management e acesso ao número comercial.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/whatsapp_business_profile
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "messaging_product": "whatsapp",
  "about": "Atendimento da empresa"
}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

messaging_productstring literal · body · Sim no exemplo

Produto ao qual a atualização se aplica.

Exemplo: whatsapp

aboutstring · body · Sim neste exemplo

Texto curto do perfil comercial. Não equivale à descrição longa description nem muda o nome verificado da empresa.

Exemplo: Atendimento da empresa

address / description / email / websitescampos opcionais · body · Opcionais; ausentes no exemplo

A referência Meta permite atualizar campos específicos de perfil. Se forem necessários, consultar seus formatos/limites e enviar apenas os campos pretendidos. address é texto, não geocodificação; websites corresponde aos links. O manual não transforma o exemplo mínimo em editor completo.

Exemplo: Manter ausentes para alterar somente about

profile_picture_handlestring opaca · body · Somente para uma alteração de foto fora do exemplo

Um handle de imagem obtido pelo procedimento de upload apropriado. Não usar uma URL comum ou MEDIA_ID de envio como substituto automático.

Exemplo: Handle real do procedimento Meta

Como ler a resposta

Exemplo ilustrativo: {"success":true}. Confirma que a API aceitou a atualização. Fazer nova consulta ao perfil para verificar o valor efetivo e considerar propagação de exibição.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Texto acima do limite, e-mail/link malformado, valor de categoria inválido ou handle de imagem incorreto precisam ser corrigidos no respectivo campo.
  • Não tentar resolver falha de nome verificado por about: a gestão do nome usa outro processo Meta.

Depois desta chamada

  • Executar meta-get-business-profile com os campos alterados e comparar com o conteúdo desejado.

Regras desta operação

  • Esta atualização modifica a apresentação pública real. PARAMETROS não vazio substitui o exemplo inteiro; manter messaging_product e todos os campos que pretende alterar.
  • A API de perfil não registra o número nem configura o webhook. Também não cria nome de usuário reservado.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
GETConsultar username reservado
meta-get-username · Meta: cache obrigatório

Consultar o nome de usuário comercial associado ao número e o status informado pela Meta.

Quando usar

Para verificar uma reserva/reivindicação existente antes de pedir alteração ou exclusão.

GET à Meta: cache obrigatório

Armazene e reutilize a resposta no seu backend. Priorize webhooks para mudanças; não consulte a Meta a cada renderização, número ou abertura de tela. Use paginação, requisições concorrentes limitadas e backoff com Retry-After quando informado. Repetições excessivas podem causar rate limit e revisão da integração pela HookCloud. Política de integração.

Referência oficial Meta: Identidade, BSUID e usernames

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Número comercial registrado e conta elegível à funcionalidade de usernames, conforme a liberação Meta. Exige acesso ao ativo e whatsapp_business_management; para provedores podem existir requisitos de acesso avançado. A conexão comum não garante essa elegibilidade.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/username
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

PARAMETROSobjeto JSON · configuração · Manter {} no exemplo

Esta consulta não precisa de nome de usuário, BSUID nem corpo de mensagem; o número já identifica o recurso.

Exemplo: {}

Como ler a resposta

Exemplo ilustrativo: {"username":"empresa.exemplo","status":"reserved"}. username pode ser omitido quando não houver nome associado. reserved significa reservado mas ainda não visível, conforme liberação; a referência descreve approved como aprovado/visível na consulta. Interpretar o status efetivo e a disponibilização para a conta, sem anunciar visibilidade apenas por existir uma reserva.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • A documentação distingue falta de permissão/acesso ao número de falta de elegibilidade do recurso. Não interpretar qualquer erro como username disponível ou inexistente.

Depois desta chamada

  • Se não houver nome associado, consultar sugestões e verificar elegibilidade antes de reservar.
  • Após alteração, consultar de novo e acompanhar business_username_updates quando esse evento estiver disponível.

Regras desta operação

  • Cache obrigatório: consulte a Meta somente quando necessário, reutilize os dados armazenados e priorize eventos. Não faça GET a cada abertura de tela ou em loop. Use paginação e backoff, respeite Retry-After quando existir e interrompa tentativas repetidas de permissão. Uso excessivo pode gerar rate limit e revisão da integração pela HookCloud.
  • Este é o username da empresa, não o username do cliente destinatário. Ele nunca substitui recipient nem PHONE_NUMBER_ID nos envios.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
GETConsultar sugestões de username
meta-suggest-usernames · Meta: cache obrigatório

Consultar sugestões/reservas de nomes de usuário que a Meta disponibiliza ao portfólio associado ao número.

Quando usar

Antes de escolher o username comercial, para identificar opções com maior chance de aprovação dentro da conta elegível.

GET à Meta: cache obrigatório

Armazene e reutilize a resposta no seu backend. Priorize webhooks para mudanças; não consulte a Meta a cada renderização, número ou abertura de tela. Use paginação, requisições concorrentes limitadas e backoff com Retry-After quando informado. Repetições excessivas podem causar rate limit e revisão da integração pela HookCloud. Política de integração.

Referência oficial Meta: Identidade, BSUID e usernames

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Número comercial registrado e conta elegível à funcionalidade de usernames, conforme a liberação Meta. Exige acesso ao ativo e whatsapp_business_management; para provedores podem existir requisitos de acesso avançado. A conexão comum não garante essa elegibilidade.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/username_suggestions
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

PARAMETROSobjeto JSON · configuração · Manter {} no exemplo

A operação usa o número selecionado; não é uma pesquisa pública por qualquer username ou usuário de WhatsApp.

Exemplo: {}

Como ler a resposta

Exemplo ilustrativo: {"data":[{"username_suggestions":["empresa.exemplo","empresa_atendimento"]}]}. Ler data[].username_suggestions. Uma lista vazia significa que a resposta não forneceu sugestões; não garante disponibilidade de um nome arbitrário.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • A documentação distingue falta de permissão/acesso ao número de falta de elegibilidade do recurso. Não interpretar qualquer erro como username disponível ou inexistente.

Depois desta chamada

  • Escolher uma opção coerente com a marca, copiar para USERNAME e executar meta-reserve-username somente se desejar reivindicá-la.

Regras desta operação

  • Cache obrigatório: consulte a Meta somente quando necessário, reutilize os dados armazenados e priorize eventos. Não faça GET a cada abertura de tela ou em loop. Use paginação e backoff, respeite Retry-After quando existir e interrompa tentativas repetidas de permissão. Uso excessivo pode gerar rate limit e revisão da integração pela HookCloud.
  • A sugestão não reserva por conta própria e não obriga a Meta a aprovar a reivindicação. Não aplicar estas opções como destino de mensagens.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
POSTReservar username sem transferência forçada
meta-reserve-username

Solicitar um nome de usuário comercial para o número selecionado, sem retirar automaticamente o nome de outro número.

Quando usar

Depois de revisar sugestões, direitos de marca, elegibilidade e eventual vínculo do número à Página do Facebook/Instagram que já usa o nome.

Referência oficial Meta: Identidade, BSUID e usernames

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Número comercial registrado e conta elegível à funcionalidade de usernames, conforme a liberação Meta. Exige acesso ao ativo e whatsapp_business_management; para provedores podem existir requisitos de acesso avançado. A conexão comum não garante essa elegibilidade.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/username
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "username": "USERNAME",
  "transfer_action": "none"
}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

USERNAME / usernamestring · configuração/body · Sim

Nome comercial desejado no formato aceito pela Meta. Não adicionar um arroba apenas por ser exibido assim na interface; seguir o formato real exigido e o retorno das sugestões.

Exemplo: empresa.exemplo

transfer_actionstring enum · body · Opcional na Meta; o exemplo fixa none

none é a escolha segura do exemplo: se o nome estiver em outro número do mesmo portfólio, a chamada falha em vez de transferi-lo.

Exemplo: none

Como ler a resposta

Exemplo ilustrativo: {"status":"reserved"}. A API também pode retornar approved conforme a situação. A aceitação não autoriza presumir que o username já ficou visível em todos os países/clientes; consultar o status e a liberação da Meta.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • A documentação distingue falta de permissão/acesso ao número de falta de elegibilidade do recurso. Não interpretar qualquer erro como username disponível ou inexistente.
  • 147001: nome indisponível; 147002: conta não qualificada; 147003/147004: vínculo com Facebook/Instagram exigido; 147005: nome já em outro número do mesmo portfólio e transferência necessária.
  • 100 pode indicar formato inválido; 133010 indica número não registrado. Tratar a causa descrita em error_data.details, sem tentar variações em massa.

Depois desta chamada

  • Consultar meta-get-username e acompanhar business_username_updates quando recebido.
  • Em conflito com outro número, revisar conscientemente a propriedade do nome e o impacto antes de qualquer procedimento de transferência.

Regras desta operação

  • force_transfer existe na referência Meta e remove o username do outro número para atribuí-lo a este. O sistema usa none; não trocar automaticamente para force_transfer para esconder um erro de conflito.
  • Reservar nome da empresa não descobre BSUIDs de consumidores e não habilita envio por username.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
DELETERemover reserva de username
meta-delete-username

Remover o nome de usuário comercial associado ao número selecionado.

Quando usar

Somente ao descontinuar esse nome ou corrigir uma associação já revisada com o responsável pela conta.

Referência oficial Meta: Identidade, BSUID e usernames

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Número comercial registrado e conta elegível à funcionalidade de usernames, conforme a liberação Meta. Exige acesso ao ativo e whatsapp_business_management; para provedores podem existir requisitos de acesso avançado. A conexão comum não garante essa elegibilidade.
  • Consultar o username atual e confirmar que a exclusão é a intenção. A requisição atua no número, sem repetir o username no body.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método DELETE com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/username
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

PARAMETROSobjeto JSON · configuração · Manter {} no exemplo

DELETE sem corpo personalizado. O número na URL identifica a associação a remover.

Exemplo: {}

Como ler a resposta

Exemplo ilustrativo: {"success":true}. A documentação também prevê success=false. Avaliar o booleano e o status HTTP; não marcar exclusão concluída apenas porque o JSON foi recebido.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • A documentação distingue falta de permissão/acesso ao número de falta de elegibilidade do recurso. Não interpretar qualquer erro como username disponível ou inexistente.

Depois desta chamada

  • Executar meta-get-username para verificar o estado posterior. Atualizar materiais comerciais se o nome deixará de existir.

Regras desta operação

  • Não é desativação da instância, exclusão do número nem apagamento do usuário cliente. A remoção pode afetar a descoberta pública pelo username.
  • Não presumir disponibilidade imediata para reivindicar o mesmo nome em outro número.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.

Meta — arquivos de mídia

Carregar arquivos e consultar ou excluir a mídia usada nas mensagens.

POSTEnviar arquivo HTTPS para a Meta (multipart)
meta-upload-media

Carregar um arquivo binário na Meta para obter MEDIA_ID reutilizável nos exemplos de envio de mídia.

Quando usar

Antes de enviar imagem, documento, áudio, vídeo ou sticker por ID, quando o arquivo ainda está numa URL HTTPS externa acessível ao da integração.

Referência oficial Meta: Mídias: upload, consulta e exclusão

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Ter uma URL que devolva diretamente os bytes do arquivo e um MIME compatível com o conteúdo. O nó de download não envia credenciais e não segue redirecionamentos.
  • O token Meta precisa de whatsapp_business_messaging e acesso ao número/ativo usado. A chave da HookCloud não substitui essa permissão da Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/PHONE_NUMBER_ID/media
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA"
}
Body de arquivo

Envie multipart/form-data com messaging_product=whatsapp, type=TIPO_MIME e o arquivo binário no campo file. Deixe sua biblioteca HTTP criar o Content-Type multipart e seu boundary.

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

MEDIA_SOURCE_URLstring URL HTTPS · configuração · Sim

URL de origem do arquivo baixado por Baixar mídia para upload. Não é enviado como JSON para /media. Precisa responder diretamente com o arquivo, sem login, página HTML intermediária ou redirecionamento.

Exemplo: https://arquivos.empresa.example/imagem.png

MEDIA_MIME_TYPEstring MIME · configuração · Sim; padrão image/png

Tipo real do arquivo. Usado no campo multipart type; o binário também deve estar corretamente identificado. Declarar image/png não converte JPEG, HTML ou PDF.

Exemplo: image/png

messaging_productcampo textual multipart · Automático

Produto WhatsApp adicionado pelo nó Meta • upload multipart.

Exemplo: whatsapp

typecampo textual multipart · Configurado pelo sistema

Recebe MEDIA_MIME_TYPE. Não confundir com type=image do envio de mensagens.

Exemplo: image/png

filearquivo binário multipart · Automático após download válido

Campo de upload montado a partir da propriedade binária file do seu sistema, usando seu sistema Binary File / inputDataFieldName=file. Não colocar Base64, uma URL ou caminho do seu computador nesse campo.

Exemplo: Conteúdo binário do download

PARAMETROSobjeto JSON · configuração · Manter {} no exemplo

O upload possui um nó multipart dedicado; sua configuração principal vem de MEDIA_SOURCE_URL/MEDIA_MIME_TYPE, não de um body JSON de /messages.

Exemplo: {}

Como ler a resposta

Exemplo ilustrativo: {"id":"ID_MIDIA_META"}. Copiar id para MEDIA_ID. Esse resultado confirma o upload do ativo, não envio para consumidor; não retorna wamid de mensagem.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • No download: TLS, 3xx, 401/403, 404, timeout ou resposta HTML indicam problema na origem do arquivo, antes de qualquer validação de mídia da Meta.
  • Na Meta: MIME incompatível, arquivo inválido, tamanho acima do limite ou falta de acesso ao número exigem corrigir o arquivo/token. Não reenviar o mesmo arquivo com uma extensão falsa.

Depois desta chamada

  • Copiar id para MEDIA_ID e escolher meta-send-image/document/audio/video/sticker conforme o tipo real.
  • Se precisar examinar o ativo, usar meta-get-media.

Regras desta operação

  • O corpo é multipart/form-data, não JSON. Deixar o da integração montar o boundary; não acrescentar manualmente um Content-Type multipart sem boundary.
  • Limites variam por tipo: imagem JPEG/PNG até 5 MB; áudio/vídeo até 16 MB; documentos suportados até 100 MB; sticker WebP até 100 KB estático ou 500 KB animado. Outros requisitos de codec/dimensão continuam aplicáveis.
  • O fluxo descarrega arquivos de uma URL escolhida pelo operador. Use somente origem confiável sob seu controle; este exemplo não acrescenta varredura antivírus nem transforma qualquer URL em arquivo seguro.
  • O upload de mídia de mensagem não deve ser confundido com o procedimento de handles de imagem usado por foto de perfil ou por alguns exemplos de aprovação de cabeçalho de template.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
GETConsultar URL e metadados de mídia
meta-get-media · Meta: cache obrigatório

Consultar metadados e uma URL temporária para baixar um ativo de mídia autorizado.

Quando usar

Quando houver MEDIA_ID de upload ou de mensagem recebida e for necessário acessar o arquivo ou conferir seu tipo/tamanho.

GET à Meta: cache obrigatório

Armazene e reutilize a resposta no seu backend. Priorize webhooks para mudanças; não consulte a Meta a cada renderização, número ou abertura de tela. Use paginação, requisições concorrentes limitadas e backoff com Retry-After quando informado. Repetições excessivas podem causar rate limit e revisão da integração pela HookCloud. Política de integração.

Referência oficial Meta: Mídias: upload, consulta e exclusão

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Ter o ID de uma mídia acessível ao token da instância. IDs de mídias recebidas e disponibilização para download podem ter janelas de retenção próprias.
  • O token Meta precisa de whatsapp_business_messaging e acesso ao número/ativo usado. A chave da HookCloud não substitui essa permissão da Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/MEDIA_ID
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

MEDIA_IDstring numérica · configuração/path · Sim

ID do ativo na Meta, e não URL de download nem wamid.

Exemplo: ID real do upload ou do webhook

PARAMETROSobjeto JSON · configuração · Manter {} no exemplo básico

A consulta do catálogo não envia filtros extras.

Exemplo: {}

phone_number_idstring numérica · query · Opcional na Meta; ausente no exemplo

Se incluído manualmente em PARAMETROS, restringe o processamento à mídia carregada no número informado. Usar o mesmo número autorizado; não é parâmetro de destinatário.

Exemplo: ID real do número comercial

Como ler a resposta

Exemplo ilustrativo: {"id":"ID_MIDIA","url":"URL_TEMPORARIA","mime_type":"image/png","sha256":"HASH","file_size":"12345","messaging_product":"whatsapp"}. url é temporária e requer token de acesso para download; mime_type informa o formato, sha256 o hash e file_size o tamanho retornado. A documentação informa validade de cinco minutos para a URL; consulte o ID novamente se ela expirar.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Uma URL expirada deve ser renovada pela consulta do ID. Falha de autorização no download não é resolvida removendo o header de autenticação.
  • ID excluído, expirado para recuperação ou de ativo inacessível exige verificar a origem do MEDIA_ID.

Depois desta chamada

  • Baixar o arquivo em um processo próprio que envie o token Meta ao endpoint autorizado. O catálogo não inclui uma operação separada de download autenticado por essa URL.

Regras desta operação

  • Cache obrigatório: consulte a Meta somente quando necessário, reutilize os dados armazenados e priorize eventos. Não faça GET a cada abertura de tela ou em loop. Use paginação e backoff, respeite Retry-After quando existir e interrompa tentativas repetidas de permissão. Uso excessivo pode gerar rate limit e revisão da integração pela HookCloud.
  • MEDIA_SOURCE_URL de meta-upload-media é baixada sem credenciais; não presumir que a URL temporária protegida retornada aqui possa ser usada diretamente nesse nó.
  • Tratar a URL e o token como dados sensíveis da execução. O link temporário não é um endereço público permanente para publicar ao cliente.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.
DELETEExcluir mídia
meta-delete-media

Excluir um ativo de mídia armazenado na Meta pelo seu ID.

Quando usar

Para remover um arquivo de teste ou que não deve mais ser reutilizado nos envios.

Referência oficial Meta: Mídias: upload, consulta e exclusão

Antes de começar

  • Primeiro chame reveal-partner-instance-meta-token com sua Partner API Key e o escopo instances.credentials.read. A chave do Partner é usada somente no domínio HookCloud; o token revelado autentica a Graph.
  • Concluir a conexão da instância e ter acesso aos ativos e permissões Meta exigidos pela operação. A existência do exemplo no catálogo não comprova elegibilidade nem aprovação de um recurso nessa WABA.
  • Confirmar o MEDIA_ID e que não há envios/automação que ainda precisem usar esse ativo.
  • O token Meta precisa de whatsapp_business_messaging e acesso ao número/ativo usado. A chave da HookCloud não substitui essa permissão da Meta.

Autenticação e permissão

Envie o meta_access_token revelado para esta instância. A Partner API Key só autentica chamadas no domínio HookCloud; não a envie para a Meta.

O escopo instances.credentials.read permite buscar a credencial no Partner. A operação na Meta exige também as permissões e a elegibilidade do ativo descritas abaixo.

Configure a chamada HTTP

No backend do seu sistema, use o método DELETE com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://graph.facebook.com/v26.0/MEDIA_ID
Headers — formato JSON
{
  "Authorization": "Bearer META_ACCESS_TOKEN_DA_INSTANCIA",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{}

O que preencher em cada campo

INSTANCE_IDstring UUID · configuração · INSTANCE_ID ou PHONE_NUMBER_ID

Identifica a instância do Partner usada para obter o token Meta. Quando preenchido, tem precedência como seletor da credencial. Use esta referência para obter meta_access_token em reveal-partner-instance-meta-token; não envie INSTANCE_ID no corpo da Graph.

Exemplo: UUID retornado por get-partner-instance

PHONE_NUMBER_IDstring numérica · configuração/path · Derivado da instância; obrigatório na URL Meta

ID técnico do número da empresa, nunca o telefone ou BSUID do consumidor. Se preenchido na configuração, deve coincidir com o número da credencial obtida; divergências interrompem a execução.

Exemplo: ID real do número conectado

MEDIA_IDstring numérica · configuração/path · Sim

Identifica o ativo a remover; não é a mensagem que o levou ao cliente.

Exemplo: ID real da mídia a remover

PARAMETROSobjeto JSON · configuração · Manter {} no exemplo

O catálogo executa DELETE do recurso por ID sem campos adicionais.

Exemplo: {}

Como ler a resposta

Exemplo ilustrativo: {"success":true}. Confirma a exclusão do ativo conforme o retorno da Meta; não apaga uma mensagem entregue nem a cópia já recebida pelo usuário.

Erros e como agir

  • Antes da Graph: falha ao revelar token, chave sem instances.credentials.read ou ID configurado divergente da instância. Corrigir a credencial/seleção; não trocar por um token de outro cliente.
  • Na Graph: consultar resposta.error.code, error_subcode, error_data.details e fbtrace_id. Token inválido/expirado, ativo não autorizado e parâmetro incorreto são classes distintas; o HTTP status sozinho não identifica a causa.
  • Mídia inexistente, já removida ou sem autorização pode impedir a operação. Não selecionar outro ID para obter um retorno positivo.

Depois desta chamada

  • Remover esse MEDIA_ID das futuras mensagens. Para enviar novamente, realizar um novo upload se o arquivo ainda estiver autorizado.

Regras desta operação

  • Não confundir delete de mídia com exclusão de instância/cliente no Partner ou remoção de mensagem do WhatsApp.
  • A referência Meta oferece phone_number_id opcional na query para GET/DELETE de mídia, mas o catálogo atual só encaminha query em GET ou em rotas marcadas queryOnly. meta-delete-media não tem queryOnly: não presumir que acrescentar phone_number_id em PARAMETROS gera a query opcional desejada; o exemplo básico usa apenas o ID.
  • Partner API Key autentica somente a HookCloud. A Graph recebe somente o Meta Access Token da instância; nunca envie a chave Partner à Meta nem exponha o token no navegador.

Referência opcional — página Connect e monitoramento

Não faz parte da implementação obrigatória: a página Connect executa essas etapas. O health apenas verifica se a API responde.

GETConnect: consultar sessão temporária (referência opcional)
get-connect-session

Consulta os dados da sessão temporária usada pela página Connect. A própria página oficial chama esta rota. Para integrar o fluxo padrão, seu backend só precisa gerar connect_url, abrir esse link e consultar get-partner-instance ao final.

Quando usar

Use para diagnosticar um connect_url e verificar se a jornada está disponível antes de abrir a autorização da Meta. O sistema permite executar essa consulta.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • Link gerado por uma operação de criação de sessão.
  • Token vigente, correspondente à sessão pretendida.

Autenticação e permissão

Usa o token temporário do connect_url. Ele autoriza somente a sessão correspondente; não substitui sua Partner API Key. No fluxo normal, a página Connect já executa esta etapa.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=get-connect-session&token=TOKEN_TEMPORARIO_DO_LINK
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

tokenstring · Obrigatório

Valor do parâmetro token existente em connect_url. Enviado na query do GET. Não é connect_session_id, JWT nem token Meta.

Exemplo: TOKEN_DE_CONEXAO_FICTICIO

Como ler a resposta

Retorna ok, session (id/status/validade/URLs/mode), readiness, partner, instance, customer e meta (app_id/redirect_uri/graph_version), além de alguns campos de apresentação do número. instance inclui meta_access_token_available e token_hint, nunca o token Meta em texto. session.status pode mudar de created para opened. readiness deve orientar a continuidade da jornada. Atualização de28/09/2026: leia connection_health e os campos separados connection_status, authorization_status, callback_status, inventory_state, meta_account_state, messaging_capability, business_verification, meta_payment, evidence, issues e allowed_actions. A fotografia deve trazer data/fonte/completude; unknown não equivale a false. ready_to_operate permanece conservador. Apenas 141006 com prova completa da WABA exata mantém inventory_state=active, mas messaging_capability.state=blocked e ready_to_operate=false podem continuar. Não recalcular esses estados no seu sistema. operation informa id,kind,status,started_at,finished_at,lease_until,result_code e steps; observation_scope separa current de historical. processing não confirma conclusão; needs_review pede reconciliação sem repetir a ação. request_id no JSON e X-Request-ID no cabeçalho permitem rastrear esta requisição; não são chaves de idempotência. Pagamento: meta_payment.status confirmed exige fonte de pagamento identificada na WABA; no_issue_detected significa consulta completa sem pendência, sem confirmar método. action_required preserva pendências e unknown informa falta de evidência atual. method_presence pode ser identified, not_confirmed ou unknown; nenhuma destas respostas expõe cartão ou identificador financeiro. business_verification informa a verificação empresarial explícita e separada do nome aprovado. Confira checked_at/source e acompanhe hookcloud.instance.health_updated. Registro do número: phone.status PENDING, PENDING_REGISTRATION ou UNVERIFIED na identidade atual não confirma disponibilidade de envio, mesmo que a WABA informe AVAILABLE. Sem bloqueio, limitação ou restrição real prioritária, connection_health.state e messaging_capability.state ficam unknown, messaging_capability.reason=meta_registration_not_confirmed, ready_to_operate=false e inventory_state=attention. O status técnico connected pode permanecer. issues mantém o código meta_phone_not_confirmed_connected. Exiba “Confirmação pendente na Meta”; não conclua banimento, não desconecte nem crie outro vínculo automaticamente. A regra financeira de 141006 não transforma registro pendente em inventário pronto. Essa classificação usa a evidência já armazenada e não acrescenta GET à Meta; acompanhe o webhook e as datas, sem polling extra.

Erros e como agir

  • 400 missing_token.
  • 404 session_not_found.
  • 410 session_expired: gerar novo link em vez de reutilizar o expirado.
  • 409 session_unavailable: cancelada, com erro ou indisponível.
  • 429 meta_registration_rate_limited: aguardar liberação indicada.
  • Bloqueios operacionais/de cobrança podem impedir a consulta de uma jornada ainda não concluída.

Depois desta chamada

  • Se readiness estiver adequado, abrir o connect_url no navegador.
  • Usar start-connect-session apenas para iniciar a sessão; a autorização Meta continua interativa.
  • Consultar get-partner-instance após a conclusão.

Regras desta operação

  • O GET tem efeito de registrar abertura e pode marcar expiração.
  • O token autoriza acesso a dados dessa jornada; não compartilhar em logs públicos.
  • Mesmo uma sessão anteriormente concluída está sujeita à verificação de expires_at no início do handler.
  • O sistema externo é controlado pelo assinante. HookCloud confirma sua conexão/configuração e expõe evidências; callback ativo não garante recebimento/processamento no sistema externo. Não repetir POSTs para atualizar saúde. A atualização deve usar refresh-partner-instance-meta respeitando cooldown/retorno da API.
  • Use os campos adicionais sem remover os campos antigos ao atualizar seu consumidor. Não trate UNKNOWN de qualidade como GREEN, nem pagamento desconhecido como sem cartão. Guia: https://developers.hookcloud.app/connection-health.html
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
  • Não é necessário reimplementar esta rota no sistema do assinante. O token é restrito à sessão e não substitui a Partner API Key.
POSTMarca sessão de conexão como iniciada e aplica bloqueios operacionais.
start-connect-session

Inicia formalmente a sessão de conexão depois de validar o token, o estado do cliente, a cobrança, o bloqueio de registro Meta e a prontidão do webhook. Define status=started e registra os horários necessários. O início não executa OAuth nem substitui a interação do proprietário da empresa no Embedded Signup.

Quando usar

Use para testar se o link pode avançar até a autorização ou acompanhar a lógica usada pela página de conexão. A operação funciona na sua integração com o token temporário.

Antes de começar

  • Sessão created, opened ou started e ainda não expirada.
  • Cliente ativo, endpoint pronto e ausência de bloqueio de registro/cobrança.

Autenticação e permissão

Usa o token temporário do connect_url. Ele autoriza somente a sessão correspondente; não substitui sua Partner API Key. No fluxo normal, a página Connect já executa esta etapa.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=start-connect-session
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "token": "TOKEN_TEMPORARIO_DO_LINK"
}

O que preencher em cada campo

tokenstring · Obrigatório

Token do connect_url, agora enviado no corpo JSON do POST. Não trocar o nome por connect_token nesta rota.

Exemplo: TOKEN_DE_CONEXAO_FICTICIO

Como ler a resposta

Retorna ok, session_id, status=started, expires_at e meta com app_id, redirect_uri e graph_version. O retorno confirma que os pré-requisitos da jornada permitiram o início; ainda é preciso concluir o fluxo no navegador.

Erros e como agir

  • 400 missing_token; 404 session_not_found.
  • 410 session_expired.
  • 409 session_unavailable/session_state_changed: estado não permite a transição ou mudou durante o processamento.
  • 429 meta_registration_rate_limited: não repetir imediatamente.
  • Erros de prontidão do endpoint ou cliente inativo podem cancelar/bloquear a sessão.
  • 423 meta_risk_customer_blocked: o cliente atingiu a política BAN/RED ou revisão manual; leia customer_risk. Vagas livres do parceiro não removem a trava. Não recadastre o cliente para contornar o histórico.
  • 409 billing_sync_required: a confirmação comercial do parceiro precisa ser atualizada. Na página Connect, oriente o cliente final a voltar ao sistema e contatar o parceiro responsável; o cliente final não administra a assinatura HookCloud. O parceiro pode abrir Assinatura no Portal e clicar em Atualizar. Sem retry automático, sem afirmar recusa de cartão e sem desconexão de números já ativos.

Depois desta chamada

  • Abrir o mesmo connect_url para completar o Embedded Signup.
  • Se bloqueado, corrigir a configuração concreta antes de gerar sessões adicionais.

Regras desta operação

  • Pode ser chamado novamente em uma sessão started, mas isso não reinicia a validade.
  • Não é uma confirmação de phone_number_id registrado nem de capacidade consumida.
POSTConcluir a autorização no navegador
complete-meta-onboarding

Finaliza a jornada de conexão depois que a Meta devolve o código OAuth e os dados do Embedded Signup. O backend autentica a sessão, chama a integração Meta, verifica o vínculo do número, registra callbacks, persiste a credencial e atualiza a ocupação de capacidade. No sistema entregue, essa operação é somente uma referência de contrato: a execução fica bloqueada porque depende da autorização interativa no navegador.

Quando usar

Use a ficha para entender o retorno da página de conexão e diagnosticar uma conclusão. Para executar o fluxo real, abra connect_url e conclua a janela da Meta; não fabrique um código OAuth no seu sistema.

Referência oficial Meta: Números, registro e permissões · Webhooks da Cloud API

Antes de começar

  • Sessão temporária válida da instância correta.
  • Código OAuth real obtido pelo SDK/Embedded Signup para essa autorização, quando requerido pelo fluxo de primeira conexão.
  • Cliente/assinatura/capacidade e endpoint elegíveis; ausência de bloqueio de registro Meta.

Autenticação e permissão

Usa o token temporário do connect_url. Ele autoriza somente a sessão correspondente; não substitui sua Partner API Key. No fluxo normal, a página Connect já executa esta etapa.

Etapa controlada pelo navegador

Abra o connect_url e deixe a página Connect concluir a autorização. O exemplo explica o contrato; não invente um código OAuth nem tente reaproveitar um código de outra tentativa.

Configure a chamada HTTP

No backend do seu sistema, use o método POST com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker?route=complete-meta-onboarding
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q",
  "Content-Type": "application/json"
}

Envie o corpo em JSON e substitua os exemplos pelos seus dados. A rota já está na URL; não é necessário repeti-la no JSON.

Body JSON
{
  "connect_token": "TOKEN_TEMPORARIO_DO_LINK",
  "code": "OAUTH_CODE"
}

O que preencher em cada campo

connect_tokenstring · Obrigatório

Token secreto da sessão. Aqui o nome é connect_token, diferente de token nas rotas de consulta/início.

Exemplo: TOKEN_DE_CONEXAO_FICTICIO

codestring · Obrigatório na primeira conexão OAuth normal; determinado pela jornada real.

Código efêmero emitido pela Meta e recebido no navegador. O catálogo mostra a estrutura, mas o sistema bloqueia a execução.

Exemplo: CODIGO_OAUTH_FICTICIO_NAO_UTILIZAVEL

meta_waba_idstring de dígitos · Opcional

WABA retornada pelo Embedded Signup; o backend pode usar o vínculo existente quando o fluxo permitir. Não escolher WABA arbitrária.

Exemplo: 100000000000002

meta_phone_number_idstring de dígitos · Opcional

ID técnico do número que a Meta autorizou. Deve corresponder à WABA/jornada.

Exemplo: 100000000000001

meta_business_idstring de dígitos · Opcional

ID do portfólio empresarial relacionado à autorização; pode vir do evento da Meta ou do vínculo existente.

Exemplo: 100000000000003

connection_kindstring · Opcional

Tipo de conexão usado para orientar o registro. O normalizador reconhece coexistence, meta_provided_test_number e cloud_api_new, além de aliases; não há enum fechado neste helper.

Exemplo: cloud_api_new

meta_event_namestring · Opcional

Nome do evento real de conclusão do Embedded Signup, usado para interpretar o tipo de jornada. embedded_signup_event também é aceito como alias.

Exemplo: EVENTO_REAL_DO_EMBEDDED_SIGNUP

display_phone_numberstring · Opcional

Telefone apresentado no resultado da Meta. É dado descritivo; não substitui meta_phone_number_id.

Exemplo: +1 555 010 0000

verified_namestring · Opcional

Nome verificado retornado pela jornada/Meta. Não é um pedido para aprovar ou alterar o nome.

Exemplo: Comércio Exemplo

modestring · Opcional

Intenção connect ou reconnect. A metadata autenticada da sessão tem precedência sobre um valor arbitrário do corpo.

Exemplo: connect

register_phoneboolean · Opcional

Sinal usado pelo fluxo de registro do número. O backend deriva um padrão conforme tipo de conexão/reconexão; não force esse campo sem seguir a jornada Meta.

Exemplo: true

registration_pinstring · Opcional

PIN usado no registro quando a modalidade exigir. É informação sensível e pode ser recuperado do vínculo existente; mantenha sua definição no fluxo controlado de onboarding.

Exemplo: PIN_FICTICIO

is_meta_test_numberboolean · Opcional

Indica que o número foi fornecido pela Meta para teste; o backend também reconhece is_test_number. Não converte um número real em número de teste.

Exemplo: false

Como ler a resposta

Em sucesso retorna ok, instance_id/status, instance com nomes/IDs/qualidade/callback, completion_mode, reconnect_finalized quando aplicável, meta_credential_saved, referências da credencial, provider_result, occupies_slot/slot_state, used_slots/slot_limit e URLs de retorno. O campo legado provider='da integração' no retorno não significa que o assinante deva criar um provider externo para concluir a autorização. Confirme a instância pelo endpoint de consulta após a página concluir. Atualização de28/09/2026: leia connection_health e os campos separados connection_status, authorization_status, callback_status, inventory_state, meta_account_state, messaging_capability, business_verification, meta_payment, evidence, issues e allowed_actions. A fotografia deve trazer data/fonte/completude; unknown não equivale a false. ready_to_operate permanece conservador. Apenas 141006 com prova completa da WABA exata mantém inventory_state=active, mas messaging_capability.state=blocked e ready_to_operate=false podem continuar. Não recalcular esses estados no seu sistema. operation informa id,kind,status,started_at,finished_at,lease_until,result_code e steps; observation_scope separa current de historical. processing não confirma conclusão; needs_review pede reconciliação sem repetir a ação. request_id no JSON e X-Request-ID no cabeçalho permitem rastrear esta requisição; não são chaves de idempotência. Registro do número: phone.status PENDING, PENDING_REGISTRATION ou UNVERIFIED na identidade atual não confirma disponibilidade de envio, mesmo que a WABA informe AVAILABLE. Sem bloqueio, limitação ou restrição real prioritária, connection_health.state e messaging_capability.state ficam unknown, messaging_capability.reason=meta_registration_not_confirmed, ready_to_operate=false e inventory_state=attention. O status técnico connected pode permanecer. issues mantém o código meta_phone_not_confirmed_connected. Exiba “Confirmação pendente na Meta”; não conclua banimento, não desconecte nem crie outro vínculo automaticamente. A regra financeira de 141006 não transforma registro pendente em inventário pronto. Essa classificação usa a evidência já armazenada e não acrescenta GET à Meta; acompanhe o webhook e as datas, sem polling extra.

Erros e como agir

  • 401 missing_auth: faltou autenticação da sessão.
  • 404 session_not_found/instance_not_found; 410 session_expired.
  • 403 session_instance_mismatch: token e instância não correspondem.
  • 409 session_unavailable: a sessão não permite concluir a operação; consulte seu estado antes de iniciar outra tentativa.
  • 409 number_capacity_unavailable ou slot_limit_reached: falta real de vaga para admitir o número. Confira números em uso, reservas e reduções agendadas. Se a falha ocorreu após etapas na Meta, consulte o resultado antes de qualquer nova tentativa.
  • 503 number_capacity_check_unavailable: não foi possível verificar a capacidade. Não confirma limite atingido e comprar outro pacote não resolve essa falha. Consulte a sessão e procure o suporte se persistir.
  • 409 connection_update_in_progress: outra operação está atualizando a conexão ou a capacidade. Aguarde e consulte o resultado; não conclua falta de vagas nem refaça a autorização automaticamente.
  • 500 instance_update_failed ou slot_sync_failed: não foi possível confirmar o registro final na HookCloud depois de etapas na Meta. Atualize a sessão e consulte a instância; não repita OAuth nem considere a conexão concluída apenas porque a janela Meta fechou.
  • 402 billing_payment_required: a assinatura do parceiro precisa ser regularizada. O responsável deve conferir Planos e cobrança; não confunda a restrição comercial com falta de vagas.
  • 429 meta_registration_rate_limited: respeitar a espera determinada.
  • Erros de provider/registro/credencial/callback podem impedir a conclusão e são retornados com detalhes da etapa.
  • 423 meta_risk_customer_blocked: o cliente atingiu a política BAN/RED ou revisão manual; leia customer_risk. Vagas livres do parceiro não removem a trava. Não recadastre o cliente para contornar o histórico.
  • 409 billing_sync_required: a confirmação comercial do parceiro precisa ser atualizada. Na página Connect, oriente o cliente final a voltar ao sistema e contatar o parceiro responsável; o cliente final não administra a assinatura HookCloud. O parceiro pode abrir Assinatura no Portal e clicar em Atualizar. Sem retry automático, sem afirmar recusa de cartão e sem desconexão de números já ativos.

Depois desta chamada

  • No navegador, concluir a janela Meta e aguardar a confirmação da página HookCloud.
  • Consultar get-partner-instance e confirmar status, phone_number_id, callback e disponibilidade de credencial.
  • Somente depois testar a Graph API com BSUID real do destinatário.

Regras desta operação

  • Operação bloqueada para execução na sua integração; simulação e documentação continuam disponíveis.
  • Não copiar código OAuth, PIN ou token da sessão para logs permanentes.
  • Concluir a janela Meta e vê-la fechar não basta: a página HookCloud precisa confirmar o processamento do retorno.
  • Os erros de admissão de número retornam error.retryable=false, inclusive nos HTTP 500 e 503; error.details.retryable=false também pode aparecer quando details estiver presente. Não dependa de details nos erros de servidor. Consulte a sessão e a instância antes de decidir outra tentativa. Esse campo impede retry automático; não significa que uma falha temporária seja definitiva. Em especial, não reutilize o código OAuth nem repita a autorização quando a Meta já pode ter concluído etapas.
  • A reconexão da mesma instância já contabilizada preserva a vaga existente. Reativar uma instância desconectada que liberou a vaga exige capacidade disponível. Uma falha de banco, concorrência ou comunicação nunca deve ser apresentada como motivo para comprar pacote adicional.
  • O sistema externo é controlado pelo assinante. HookCloud confirma sua conexão/configuração e expõe evidências; callback ativo não garante recebimento/processamento no sistema externo. Não repetir POSTs para atualizar saúde. A atualização deve usar refresh-partner-instance-meta respeitando cooldown/retorno da API.
  • Use os campos adicionais sem remover os campos antigos ao atualizar seu consumidor. Não trate UNKNOWN de qualidade como GREEN, nem pagamento desconhecido como sem cartão. Guia: https://developers.hookcloud.app/connection-health.html
GETDisponibilidade da API (monitoramento opcional)
health

Confere se o serviço HTTP da HookCloud responde. Serve para monitoramento técnico opcional. HTTP 200 não confirma número conectado, capacidade de envio, cadastro de cartão ou disponibilidade da Meta.

Quando usar

Use em uma checagem básica de conectividade do seu sistema ou do monitoramento do assinante antes de investigar um erro de rota/autenticação.

Leitura na HookCloud: retorna dados armazenados e não consulta a Meta a cada acesso. Confira a data da observação.

Antes de começar

  • Usar a URL-base da função: https://api.hookcloud.app/functions/v1/swift-worker, sem parâmetro route.
  • Distinguir este health técnico de uma consulta de status completo dos serviços externos.

Autenticação e permissão

Consulta de disponibilidade do serviço. HTTP 200 não comprova uma conexão de WhatsApp nem a saúde de um cliente.

Configure a chamada HTTP

No backend do seu sistema, use o método GET com a URL e os headers abaixo. Substitua os marcadores pelos dados reais; não envie credenciais pelo navegador do cliente final.

URL
https://api.hookcloud.app/functions/v1/swift-worker
Headers — formato JSON
{
  "apikey": "sb_publishable_vcEqaz4bqRNm3Oh7POfznA_SfWpNn5q"
}

Sem body. Os filtros e identificadores ficam nos parâmetros da URL. Não acrescente um corpo JSON nesta chamada.

O que preencher em cada campo

Esta operação não exige campos adicionais. A identidade do parceiro vem da autenticação.

Como ler a resposta

GET na URL-base retorna HTTP 200 com ok=true, service="swift-worker", status="online" e version="v1.0.0-direct-meta-provider" no código atual. HEAD retorna 200 sem corpo JSON. A resposta usa Cache-Control: no-store e X-Content-Type-Options: nosniff. Ela confirma a resposta da função HTTP; não executa um teste completo de conexão Meta, pagamento Stripe, SMTP, todas as tabelas ou endpoint do cliente.

Erros e como agir

  • 400 missing_route: um método que precisa de operação foi enviado à raiz sem route.
  • 404/erro de rede/DNS: confira o domínio e o caminho exato da função; não substitua por um domínio técnico de outro ambiente.
  • 5xx: a camada HTTP/função não conseguiu responder; registre horário, status e identificador técnico da requisição se disponível.

Depois desta chamada

  • Se o health responder, teste a rota específica com método, autenticação e body corretos.
  • Para saúde de mensagens, use get-partner-delivery-health; para risco Meta, use get-meta-risk-dashboard.

Regras desta operação

  • health é o ID de catálogo usado no material da integração. __health__ é uma referência documental interna; não chame ?route=health nem ?route=__health__.
  • Se escolher HEAD no seu sistema, não configure uma expectativa de corpo JSON.
  • Um health 200 não prova que a chave do parceiro tem scopes suficientes para uma operação protegida.
  • Esta leitura consulta dados armazenados na HookCloud; não dispara um GET à Meta a cada item. Confira as datas da evidência e use atualização explícita apenas quando necessário.
  • Não é parte obrigatória da conexão. Para a situação de um número, consulte get-partner-instance.