Your AI Connector Docs

API de Webhooks

Os webhooks permitem que a plataforma notifique os seus outros sistemas no momento em que algo acontece — um novo contacto, uma resposta, uma marcação agendada, e muito mais. Esta API gere as próprias subscrições: que URLs recebem que eventos. Para saber como receber e verificar os payloads que o seu endpoint recebe, consulte Webhooks.

Todos os caminhos abaixo são relativos ao URL base da API:

https://api.youraiconnector.com/v1

Todos os pedidos devem ser autenticados. Consulte Autenticação para os quatro métodos aceites. Os exemplos aqui utilizam o cabeçalho X-API-Key (e uma forma de parâmetro de consulta para cURL).

Nota: Os webhooks devem estar ativados na sua conta. Caso contrário, estes endpoints devolvem um 403.


Como as subscrições são endereçadas

Cada subscrição tem um id e um name opcional. Qualquer um deles pode ser utilizado como o {webhookId} no caminho para atualizar, eliminar, testar, verificar o estado e reativar.

Prefira o nome. Os IDs de subscrição são posicionais, pelo que podem mudar após a eliminação de outra subscrição. Se definir um name estável ao criar uma subscrição, enderece-a pelo nome para evitar surpresas.


Listar subscrições

GET /webhooks

cURL

curl "https://api.youraiconnector.com/v1/webhooks?apiKey=YOUR_API_KEY"

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/webhooks", {
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();

Python

import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/webhooks",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Resposta

{
  "success": true,
  "webhooks": [
    {
      "id": "0",
      "name": "Order updates hook",
      "url": "https://hooks.example.com/incoming",
      "subscribed_to": ["Contact Created", "Replies"],
      "subscribed_to_tags": [],
      "created_at": "2026-06-09T12:00:00.000Z",
      "signing_enabled": true,
      "signing_secret_created_at": "2026-07-15T09:30:00.000Z",
      "retries_enabled": true,
      "enabled": true,
      "apply_to_sub_accounts": false
    }
  ]
}

signing_enabled e retries_enabled são opções de ativação por subscrição, ambas desativadas a menos que as ative. Consulte Payloads assinados e Reiterações.

apply_to_sub_accounts é a opção de adesão à herança de agência — consulte Uma subscrição para todas as contas de cliente. Desativada por predefinição e inerte em contas que não possuem contas de cliente.

enabled é o interruptor de ligar/desligar da subscrição — consulte Desligar uma subscrição. As subscrições desligadas continuam listadas aqui.

O segredo de assinatura em si nunca é incluído aqui — leia-o a partir de GET /webhooks/{id}/signing-secret.


Listar tipos de eventos subscrevíveis

Devolve as strings exatas que pode utilizar em subscribed_to. Utilize isto para descobrir nomes de eventos válidos em vez de os codificar diretamente.

GET /webhooks/events

cURL

curl "https://api.youraiconnector.com/v1/webhooks/events" \
  -H "X-API-Key: YOUR_API_KEY"

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/webhooks/events", {
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();

Python

import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/webhooks/events",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Resposta

A resposta é {"success": true, "events": [...]}, onde events contém atualmente 22 cadeias de caracteres exatas: Contact Created, Human Alerted, Appointment Booked, Replies, Reads, Deliveries, Credits Spent, Credits Recharged, Low Credit Balance, Contact Paused, Contact Do Not Disturb, Contact Unarchived, New Message, Contact Resumed, Chat Concluded, Task Created, Task Updated, Task Completed, Daily Summary Created, Channel Connected, Broadcast Started e Broadcast Completed (Channel Connected é aceite em subscribed_to, mas nada o emite atualmente, por isso não baseie nada nele).

Para saber o que significa cada evento e o código event que envia no payload, consulte Os 22 Eventos de Webhook. Este endpoint é a lista oficial em qualquer momento — leia-a em tempo real em vez de codificar os nomes diretamente.


Criar uma subscrição

POST /webhooks

Campo Obrigatório Descrição
url Sim URL HTTPS que receberá payloads de eventos via POST. Deve ser publicamente acessível.
subscribed_to Sim Uma matriz não vazia de nomes de eventos (consulte /webhooks/events).
name Não Um nome de exibição. Também utilizável como {webhookId} mais tarde. Predefinido para um nome com carimbo de data/hora.
subscribed_to_tags Não IDs de etiquetas que restringem quais as etiquetas que produzem uma notificação de resumo de conversação. Não limita os eventos da subscrição a essas etiquetas — para obter um pedido quando uma etiqueta específica é aplicada, defina um URL de webhook nessa etiqueta no separador Etiquetas do agente (ou campanha).
retries_enabled Não Booleano, predefinido para false. Opte por tentativas de reenvio de entregas falhadas.
generate_signing_secret Não Booleano, predefinido para false. Crie um segredo de assinatura HMAC com a subscrição. O segredo é devolvido uma vez, como um signing_secret de nível superior na resposta.
enabled Não Booleano, predefinido para true. Passe false para criar a subscrição desativada. Consulte Desativar uma subscrição.
apply_to_sub_accounts Não Booleano, predefinido para false. Numa conta de agência, true faz com que esta subscrição também receba eventos de todas as contas de cliente — consulte Uma subscrição para todas as contas de cliente.

Regras de URL: O URL deve utilizar https:// e ser publicamente acessível. http:// simples, localhost, endereços de rede privada e endereços internos da plataforma são rejeitados com um 400.

cURL

curl -X POST "https://api.youraiconnector.com/v1/webhooks?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://hooks.example.com/incoming",
    "subscribed_to": ["Contact Created", "Replies"],
    "name": "Order updates hook"
  }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/webhooks", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    url: "https://hooks.example.com/incoming",
    subscribed_to: ["Contact Created", "Replies"],
    name: "Order updates hook",
  }),
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/webhooks",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "url": "https://hooks.example.com/incoming",
        "subscribed_to": ["Contact Created", "Replies"],
        "name": "Order updates hook",
    },
)
data = res.json()

Resposta

{
  "success": true,
  "webhook_id": "1",
  "webhook": {
    "id": "1",
    "name": "Order updates hook",
    "url": "https://hooks.example.com/incoming",
    "subscribed_to": ["Contact Created", "Replies"],
    "subscribed_to_tags": [],
    "created_at": "2026-06-09T12:00:00.000Z"
  }
}

Atualizar uma subscrição

Forneça pelo menos um de url, subscribed_to, name, subscribed_to_tags, retries_enabled, enabled ou apply_to_sub_accounts. Os campos omitidos mantêm os seus valores atuais. subscribed_to e subscribed_to_tags são substituições, não fusões.

PUT /webhooks/{webhookId}

Atualizar uma subscrição nunca altera o seu segredo de assinatura — faça a gestão através das rotas de segredo de assinatura.

Quando o URL é alterado, a entrega para o novo URL é automaticamente reativada, dando a um endpoint que falhou anteriormente um novo começo.

cURL

curl -X PUT "https://api.youraiconnector.com/v1/webhooks/Order%20updates%20hook" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://hooks.example.com/v2/incoming",
    "subscribed_to": ["Replies", "Chat Concluded"]
  }'

JavaScript

const res = await fetch(
  `https://api.youraiconnector.com/v1/webhooks/${encodeURIComponent("Order updates hook")}`,
  {
    method: "PUT",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      url: "https://hooks.example.com/v2/incoming",
      subscribed_to: ["Replies", "Chat Concluded"],
    }),
  }
);
const data = await res.json();

Python

import requests

res = requests.put(
    "https://api.youraiconnector.com/v1/webhooks/Order updates hook",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "url": "https://hooks.example.com/v2/incoming",
        "subscribed_to": ["Replies", "Chat Concluded"],
    },
)
data = res.json()

Resposta

{
  "success": true,
  "webhook_id": "0",
  "webhook": {
    "id": "0",
    "name": "Order updates hook",
    "url": "https://hooks.example.com/v2/incoming",
    "subscribed_to": ["Replies", "Chat Concluded"],
    "subscribed_to_tags": [],
    "created_at": "2026-06-09T12:00:00.000Z"
  }
}

Um ID ou nome desconhecido devolve 404 com { "success": false, "error": "Webhook not found" }.


Eliminar uma subscrição

Remove a subscrição para que o seu URL deixe de receber payloads. Os seus contadores de estado de entrega são reiniciados, pelo que adicionar novamente o mesmo URL mais tarde começa com um registo limpo.

DELETE /webhooks/{webhookId}

cURL

curl -X DELETE "https://api.youraiconnector.com/v1/webhooks/0" \
  -H "X-API-Key: YOUR_API_KEY"

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/webhooks/0", {
  method: "DELETE",
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();

Python

import requests

res = requests.delete(
    "https://api.youraiconnector.com/v1/webhooks/0",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Resposta

{
  "success": true
}

Enviar um payload de teste

Envia um payload de amostra para o URL da subscrição para que possa verificar o seu recetor de ponta a ponta. Opcionalmente, passe um event para controlar que tipo de evento a amostra simula. As entregas de teste nunca afetam os contadores de estado da subscrição.

POST /webhooks/{webhookId}/test

A resposta devolve sempre 200 e comunica o resultado com um sinalizador delivered — um teste falhado não devolve um estado de erro. Quando delivered é false, a resposta inclui os detalhes da falha.

Campo Obrigatório Descrição
event Não Tipo de evento a simular (deve ser um de /webhooks/events). Por predefinição, utiliza um evento de entrega.

cURL

curl -X POST "https://api.youraiconnector.com/v1/webhooks/0/test?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "event": "Contact Created" }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/webhooks/0/test", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ event: "Contact Created" }),
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/webhooks/0/test",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"event": "Contact Created"},
)
data = res.json()

Resposta (entregue)

{
  "success": true,
  "webhook_id": "0",
  "delivered": true
}

Resposta (falhou)

{
  "success": true,
  "webhook_id": "0",
  "delivered": false,
  "failure_type": "permanent",
  "status_code": 404,
  "error_message": "Request failed with status code 404"
}

failure_type é um de permanent, temporary, timeout, network ou unknown.


Verificar o estado da entrega

Devolve o registo do estado da entrega para o URL da subscrição: quantas entregas foram bem-sucedidas e falharam, se a entrega está atualmente pausada após falhas repetidas e os detalhes da falha mais recente. Devolve "health": null quando ainda não foram tentadas entregas.

GET /webhooks/{webhookId}/health

cURL

curl "https://api.youraiconnector.com/v1/webhooks/0/health" \
  -H "X-API-Key: YOUR_API_KEY"

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/webhooks/0/health", {
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();

Python

import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/webhooks/0/health",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Resposta

{
  "success": true,
  "webhook_id": "0",
  "url": "https://hooks.example.com/incoming",
  "health": {
    "consecutive_failures": 0,
    "total_failures": 2,
    "total_successes": 120,
    "is_disabled": false,
    "disabled_at": null,
    "disabled_reason": null,
    "last_failure": null,
    "last_success_at": "2026-06-09T12:00:00.000Z",
    "created_at": "2026-05-01T08:00:00.000Z",
    "updated_at": "2026-06-09T12:00:00.000Z"
  }
}

Quando is_disabled é true, a entrega para o URL foi pausada automaticamente após falhas repetidas. Corrija o seu recetor e, em seguida, reative-o (abaixo).


Reativar a entrega

Retoma a entrega para um webhook cujo URL foi pausado automaticamente após falhas repetidas. Isto repõe o sinalizador de pausa e os contadores de falhas, mas não tenta uma entrega — utilize o endpoint de teste posteriormente para confirmar que o seu recetor está novamente operacional.

POST /webhooks/{webhookId}/reenable

cURL

curl -X POST "https://api.youraiconnector.com/v1/webhooks/0/reenable?apiKey=YOUR_API_KEY"

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/webhooks/0/reenable", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/webhooks/0/reenable",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Resposta

{
  "success": true,
  "webhook_id": "0"
}

Desligar uma subscrição

enabled é o próprio interruptor de ligar/desligar da subscrição. Desligá-lo interrompe as entregas, mantendo intactos o URL, a lista de eventos e o segredo de assinatura.

# Off
curl -X PUT "https://api.youraiconnector.com/v1/webhooks/0?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled": false}'

# Back on
curl -X PUT "https://api.youraiconnector.com/v1/webhooks/0?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled": true}'
  • Ausente significa ligado. Uma subscrição criada antes da existência deste campo não tem nenhum valor enabled armazenado e efetua entregas normalmente. GET /webhooks reporta sempre um booleano concreto.
  • As subscrições desligadas continuam listadas por GET /webhooks — é assim que as encontra para as voltar a ligar.
  • Uma repetição colocada na fila antes de desligar não é retomada: a repetição volta a ler a subscrição no momento do envio e é descartada se esta estiver desligada.
  • Nada do que foi suprimido enquanto estava desligado é reproduzido quando a volta a ligar.

Distinto da desativação automática após falhas repetidas, que é reportada por GET /webhooks/{id}/health como is_disabled e limpa com POST /webhooks/{id}/reenable. enabled é o interruptor da conta; is_disabled é o nosso. Nenhum substitui o outro — uma subscrição tem de estar ligada e não desativada automaticamente para efetuar entregas.


Uma subscrição para todas as contas de cliente (agências)

Numa conta de agência, defina apply_to_sub_accounts: true numa subscrição (no momento da criação ou via PUT) e esta também receberá eventos que ocorrem em cada uma das contas de cliente da agência — um endpoint cobre toda a agência, em vez de recriar a subscrição em cada conta de cliente.

curl -X PUT "https://api.youraiconnector.com/v1/webhooks/0?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"apply_to_sub_accounts": true}'

Como funciona:

  • O bloco user distingue as contas. O bloco user de cada payload identifica a conta onde o evento realmente ocorreu, para que o seu recetor possa encaminhar por cliente.
  • As definições da própria subscrição da agência aplicam-se em todo o lado. A sua lista de eventos, segredo de assinatura e opção de tentativa de reenvio são também utilizados para as entregas herdadas.
  • A subscrição da própria conta de cliente para o mesmo URL tem prioridade. Se uma conta de cliente tiver a sua própria subscrição a apontar para o mesmo URL, essa é utilizada para os eventos dessa conta — o mesmo evento nunca é entregue duas vezes ao mesmo endpoint.
  • As contas de cliente não a veem. As subscrições herdadas não aparecem na lista de webhooks da própria conta de cliente e o cliente não as pode desativar — apenas a agência as gere.
  • O estado da entrega é monitorizado por conta de cliente. Um endpoint que continua a falhar é automaticamente desativado para a conta cujas entregas falharam, não para toda a agência.
  • subscribed_to_tags não é herdado. A lista de etiquetas refere-se às etiquetas da própria agência, que não existem nas contas de cliente — a restrição de resumo de conversação aplica-se apenas aos eventos da própria agência.
  • Inerte noutros locais. Numa conta sem contas de cliente, o sinalizador é armazenado corretamente e não faz nada.

Cabeçalhos em cada entrega

Estes três cabeçalhos são enviados em cada entrega, independentemente de a subscrição estar assinada ou não:

Cabeçalho Significado
X-Webhook-Delivery ID estável para o evento lógico. Idêntico entre tentativas de reenvio — utilize-o para deduplicação.
X-Webhook-Attempt Número da tentativa, começando em 1.
X-Webhook-Event O nome do evento.

Payloads assinados

A assinatura é opcional, desativada por padrão e definida por subscrição. Quando uma subscrição tem um segredo de assinatura, cada entrega transporta mais dois cabeçalhos além dos três enviados em todas as entregas (X-Webhook-Delivery, X-Webhook-Attempt e X-Webhook-Event):

Cabeçalho Significado
X-Webhook-Signature v1=<hex> — HMAC-SHA256 da string "<timestamp>.<raw request body>", com a chave do segredo de assinatura por webhook que cria e renova em GET/POST/DELETE /v1/webhooks/{webhookId}/signing-secret.
X-Webhook-Timestamp Hora de envio, em segundos Unix. Vinculada à assinatura, pelo que não pode ser alterada independentemente.

Para verificar, recalcule o HMAC-SHA256 sobre o corpo bruto (raw body) com o seu segredo e compare-o com o cabeçalho. Verifique contra o corpo do pedido bruto. A re-serialização de JSON analisado altera os bytes e quebra a comparação. Rejeite entregas cujo carimbo de data/hora esteja fora de uma janela de frescura (300s é um padrão razoável) para evitar repetições, e compare com uma função segura contra ataques de temporização (timing-safe).

Consulte Payloads Assinados para exemplos completos de verificação em Node e Python.

A assinatura não é o mesmo que a autenticação da API. A própria API REST autentica-se com chaves de API em vez de OAuth (o OAuth 2.1 existe para servidores MCP que regista como ferramentas de bot), e ainda não existem pacotes SDK oficiais para npm ou PyPI — chame os endpoints com qualquer cliente HTTP.

Ler o segredo de assinatura

GET /webhooks/{id}/signing-secret

curl "https://api.youraiconnector.com/v1/webhooks/0/signing-secret?apiKey=YOUR_API_KEY"

Resposta

{
  "success": true,
  "webhook_id": "0",
  "signing_enabled": true,
  "signing_secret": "whsec_1a2b3c...",
  "signing_secret_created_at": "2026-07-15T09:30:00.000Z"
}

Quando a assinatura está desativada, signing_enabled é false e signing_secret é null.

Gerar ou rodar o segredo de assinatura

POST /webhooks/{id}/signing-secret

Cria um segredo (ativando a assinatura) ou substitui o existente. Devolve o novo segredo.

curl -X POST "https://api.youraiconnector.com/v1/webhooks/0/signing-secret?apiKey=YOUR_API_KEY"

Resposta

{
  "success": true,
  "webhook_id": "0",
  "signing_enabled": true,
  "signing_secret": "whsec_9f8e7d...",
  "signing_secret_created_at": "2026-07-15T10:00:00.000Z"
}

A rotação entra em vigor imediatamente — a entrega seguinte é assinada apenas com o novo segredo. Aceite ambos os segredos brevemente enquanto implementa a alteração num endpoint em produção.

Também pode gerar um segredo no momento da criação ao passar "generate_signing_secret": true para POST /webhooks; a resposta inclui então um campo signing_secret de nível superior.

Desativar a assinatura

DELETE /webhooks/{id}/signing-secret

curl -X DELETE "https://api.youraiconnector.com/v1/webhooks/0/signing-secret?apiKey=YOUR_API_KEY"

Resposta

{
  "success": true,
  "webhook_id": "0",
  "signing_enabled": false
}

Todas as três rotas de segredos de assinatura requerem a permissão de edição de integrações, incluindo a GET — o segredo é uma credencial que pode falsificar entregas, pelo que não é exposto a funções de apenas leitura.


Repetições

Opcional, desativado por predefinição e definido por subscrição através do booleano retries_enabled em POST /webhooks ou PUT /webhooks/{id}.

curl -X PUT "https://api.youraiconnector.com/v1/webhooks/0?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"retries_enabled": true}'

Quando ativado, uma entrega falhada é repetida após 1m, 5m, 30m e 2h da primeira tentativa (cerca de 2h40m de cobertura).

  • Repetido: respostas 5xx, timeouts e falhas de ligação.
  • Não repetido: qualquer 4xx. O recetor está a rejeitar o próprio pedido, pelo que repeti-lo sem alterações apenas reproduz a rejeição.

As tentativas de reenvio tornam possível a entrega duplicada — um endpoint que processou um evento, mas cujo tempo limite expirou antes de responder, irá recebê-lo novamente. Utilize X-Webhook-Delivery para a desduplicação, uma vez que este é constante em todas as tentativas. É por este motivo que as tentativas de reenvio são opcionais.

Os contadores de delivery-health contam uma entrega completa, não cada tentativa: uma falha é registada apenas uma vez quando todas as repetições são esgotadas, pelo que ativar as repetições não faz com que o gatilho de desativação automática seja acionado mais cedo.


Erros

Todos os erros utilizam o envelope padrão:

{
  "success": false,
  "error": "Webhook not found"
}

Casos comuns: um URL que não é permitido, um subscribed_to vazio/inválido ou campos em falta devolvem 400; um id ou nome desconhecido devolve 404; e um 403 significa que os webhooks não estão ativados para a sua conta. Consulte Erros para a lista completa.


Próximos passos