Inscrever-se em webhooks
Seja notificado quando eventos importantes acontecerem, sem precisar fazer polling.
Sessões são interações de longa duração. Embora a maioria das interações em tempo real aconteça por meio do fluxo de eventos SSE, os webhooks notificam você sobre mudanças de estado importantes.
Os eventos de webhook retornam o type e o id do evento, não o objeto completo. Ao receber um evento de webhook, você precisa buscar o objeto diretamente com uma chamada GET. Isso evita a entrega de dados desatualizados em novas tentativas e mantém cada entrega pequena.
Tipos de eventos suportados
Alguns desses eventos têm nomes diferentes dos eventos correspondentes no fluxo de eventos da sessão. Por exemplo, session.status_idle e session.status_running do fluxo correspondem aos eventos de webhook session.status_idled e session.status_run_started.
| Evento | Gatilho |
|---|---|
session.status_run_started | A execução do agente foi iniciada. Isso é acionado a cada transição de status da sessão para running. |
session.status_idled | O agente está aguardando entrada, por exemplo, uma aprovação de permissão de ferramenta ou uma nova mensagem do usuário. |
session.budget_reached | A sessão atingiu seu orçamento e foi pausada. É disparado no máximo uma vez para cada valor de orçamento que você definir; alterar o orçamento o arma novamente. |
session.status_rescheduled | Ocorreu um erro transitório e a sessão está tentando novamente de forma automática. |
session.status_terminated | A sessão foi encerrada, seja por causa de um erro irrecuperável ou porque foi arquivada. |
session.thread_created | Uma nova thread multiagente foi aberta: um agente adicional chamado pelo agente que a sessão executa está começando a trabalhar, ou o advisor da sessão está sendo consultado. Também é disparado para cada thread de uma execução de workflow, assim como os outros dois eventos de thread nesta tabela. |
session.thread_idled | Um agente em uma interação multiagente está aguardando entrada. |
session.thread_terminated | Uma thread multiagente foi encerrada, seja porque a thread foi arquivada ou porque esgotou suas novas tentativas. Um subagente que termina seu trabalho passa para idle, não terminated (uma thread de advisor é encerrada assim que sua consulta é concluída, e as threads de uma execução de workflow são encerradas quando o servidor as arquiva, até o fim da execução). É disparado apenas para threads filhas; o fim da thread principal, incluindo o arquivamento da sessão inteira, aparece apenas como session.status_terminated. |
session.outcome_evaluation_ended | A avaliação de resultado de uma única iteração foi concluída. |
session.updated | As propriedades da sessão foram alteradas (por exemplo, seu nome ou configuração foi atualizado). |
session.deleted | A sessão foi excluída permanentemente. Não há mais objeto para buscar, então trate o próprio evento como final. |
| Evento | Gatilho |
|---|---|
vault.created | Vault criado. |
vault.archived | Vault arquivado. Um evento vault_credential.archived também é emitido para cada credencial subjacente. |
vault.deleted | Vault excluído. Um evento vault_credential.deleted também é emitido para cada credencial subjacente. Não há mais objeto para buscar, então trate o próprio evento como final. |
vault_credential.created | Credencial criada. |
vault_credential.archived | Credencial arquivada, seja diretamente ou como resultado do arquivamento do vault. |
vault_credential.deleted | Credencial excluída, seja diretamente ou como resultado da exclusão do vault. Não há mais objeto para buscar, então trate o próprio evento como final. |
vault_credential.refresh_failed | Uma credencial mcp_oauth não pode ser renovada (refresh token inválido ou erro irrecuperável do servidor OAuth). |
Esses eventos acompanham o ciclo de vida dos recursos de agente no seu workspace e são distintos dos eventos de agente entregues no fluxo de eventos de uma sessão.
| Evento | Gatilho |
|---|---|
agent.created | Agente criado. |
agent.updated | Uma nova versão do agente foi publicada. Atualizações que não criam uma nova versão não acionam este evento. |
agent.archived | Agente arquivado. |
agent.deleted | Agente excluído permanentemente. Não há mais objeto para buscar, então trate o próprio evento como final. |
| Evento | Gatilho |
|---|---|
deployment.created | Deployment agendado criado. |
deployment.updated | As propriedades do deployment foram alteradas (por exemplo, seu agendamento foi atualizado). |
deployment.paused | Deployment pausado, seja por solicitação ou automaticamente quando uma execução agendada falha com um erro irrecuperável, como um subagente arquivado ou um ambiente arquivado. Falhas recuperáveis, incluindo limites de taxa, não pausam o deployment. Consulte Comportamento em caso de falha. |
deployment.unpaused | Deployment despausado, retomando seu agendamento. |
deployment.archived | Deployment arquivado, seja diretamente ou porque seu agente foi arquivado. Se, em vez disso, o agente for excluído, um deployment agendado é arquivado em sua próxima execução agendada; um deployment sem agendamento não é arquivado automaticamente. |
deployment.deleted | Deployment excluído permanentemente. Não há mais objeto para buscar, então trate o próprio evento como final. |
| Evento | Gatilho |
|---|---|
deployment_run.started | Uma execução agendada foi iniciada. Apenas execuções agendadas emitem eventos deployment_run; execuções manuais não. |
deployment_run.succeeded | Uma execução agendada criou sua sessão. O evento carrega o mesmo data.id (o ID da execução) que o evento deployment_run.started da execução. Para acompanhar o trabalho da sessão, inscreva-se nos eventos dessa sessão (a aba Eventos de sessão) ou busque a execução de deployment para obter seu session_id. |
deployment_run.failed | Uma execução agendada não criou uma sessão. O evento carrega o mesmo data.id que o evento deployment_run.started da execução. Busque a execução de deployment para obter os detalhes do erro. |
| Evento | Gatilho |
|---|---|
environment.created | Ambiente criado. |
environment.updated | Ambiente atualizado com pelo menos um campo alterado. Uma atualização sem efeito não emite nada. |
environment.archived | Ambiente arquivado. Arquivar novamente um ambiente já arquivado não emite nada. |
environment.deleted | Ambiente excluído, incluindo a exclusão de um ambiente já arquivado. Não há mais objeto para buscar, então trate o próprio evento como final. |
Os itens de trabalho de um ambiente não emitem eventos de webhook.
| Evento | Gatilho |
|---|---|
memory_store.created | Memory store criado, seja por você ou por um processo operado pela Anthropic que clona um dos seus stores existentes. |
memory_store.archived | Memory store arquivado. Arquivar novamente um store já arquivado não emite nada. |
memory_store.deleted | Memory store excluído, incluindo a exclusão de um store já arquivado. A exclusão de um store se propaga para suas memórias e versões de memória sem emitir eventos por memória; o único evento memory_store.deleted é o sinal. Não há mais objeto para buscar, então trate o próprio evento como final. |
Memórias individuais e versões de memória não emitem eventos de webhook.
Registrar um endpoint
No Claude Console, acesse a página Webhooks (platform.claude.com/settings/workspaces/default/webhooks). Cada endpoint pertence a um workspace. Selecione o workspace desejado no seletor de workspace na barra lateral.
Um endpoint de webhook consiste em:
- URL: Deve ser HTTPS na porta 443 com um hostname publicamente resolvível.
- Tipos de evento: A lista de valores de
data.typeque este endpoint recebe. Um endpoint recebe apenas os eventos nos quais está inscrito. - Segredo de assinatura: Um segredo de 32 bytes com prefixo
whsec_gerado na criação. Ele é exibido apenas uma vez, então armazene-o com segurança para verificar as entregas de webhook.
Verificar a assinatura
Toda entrega carrega os cabeçalhos webhook-id, webhook-timestamp e webhook-signature. Use o helper unwrap() do SDK para verificar a assinatura e fazer o parse do evento em uma única etapa. Ele lança uma exceção se a assinatura for inválida ou se o payload tiver mais de 5 minutos.
Defina ANTHROPIC_WEBHOOK_SIGNING_KEY como o segredo com prefixo whsec_ exibido na criação do endpoint.
from flask import Flask, request
import anthropic
client = anthropic.Anthropic() # reads ANTHROPIC_WEBHOOK_SIGNING_KEY from env
app = Flask(__name__)
@app.route("/webhook", methods=["POST"])
def webhook():
try:
# unwrap() lança uma exceção se a assinatura for inválida ou o payload estiver desatualizado
event = client.beta.webhooks.unwrap(
request.get_data(as_text=True),
headers=dict(request.headers),
)
except Exception:
return "invalid signature", 400
if event.data.type == "session.status_idled":
print("session idled:", event.data.id)
# trata outros tipos de evento
return "", 200Tratar um evento
Faça o parse do corpo, use um switch em data.type e busque o recurso pelo ID. Retorne qualquer 2xx para confirmar o recebimento. Qualquer outra resposta conta contra o endpoint: um 3xx o desativa imediatamente (redirecionamentos nunca são seguidos), enquanto outras falhas são tentadas novamente; consulte Comportamento de entrega para as regras de novas tentativas e de desativação automática.
Todo payload de evento tem a mesma estrutura, incluindo o tipo do evento, o identificador e o timestamp de quando o evento ocorreu.
{
"type": "event",
"id": "whe_9d5c1f7e...",
"created_at": "2026-03-18T14:05:22Z",
"data": {
"type": "session.status_idled",
"id": "sesn_01XYZ...",
"organization_id": "8a3d2f1e-...",
"workspace_id": "c7b0e4d9-..."
}
}if event.data.type == "session.status_idled":
session = client.beta.sessions.retrieve(event.data.id)
notify_user(session)
return "", 204O event.id de nível superior é único por evento, não por entrega. Se você receber o mesmo event.id duas vezes, trata-se de uma nova tentativa e você pode descartá-lo.
Comportamento de entrega
-
Duplicatas: Um endpoint pode receber o mesmo evento mais de uma vez, e toda tentativa entrega o mesmo
event.idde nível superior (o mesmo valor do cabeçalhowebhook-id). Faça a deduplicação com base nele. -
Escopo de inscrição: Um evento é entregue apenas aos endpoints inscritos em seu tipo no momento em que ele é emitido. Um evento emitido enquanto nenhum endpoint está inscrito em seu tipo nunca é entregue, e inscrever-se depois não o preenche retroativamente, então inscreva-se em um tipo de evento antes de precisar dele.
-
A ordem não é garantida. Os eventos não são entregues na ordem em que ocorreram:
session.status_idledpode chegar antes desession.outcome_evaluation_endedmesmo que o resultado tenha sido produzido primeiro, e um evento.deletedpode chegar antes do evento.archiveddo mesmo recurso. Baseie seu estado no recurso que você busca, não na ordem em que os eventos chegam. -
Novas tentativas: Para cada endpoint e evento, a Anthropic faz até três tentativas de entrega (uma resposta que aciona a desativação automática, descrita mais adiante nesta seção, nunca é tentada novamente) com backoff exponencial com jitter entre 5 e 120 segundos. Toda tentativa entrega o mesmo
event.id. Depois que a última tentativa falha, o evento é descartado: ele não é enfileirado para entrega posterior e não há nenhum sinal de que foi perdido. Webhooks não são um log durável, então, se você precisar observar todas as transições, faça a reconciliação listando ou buscando o recurso por meio da API. -
Timestamps: O cabeçalho
webhook-timestampé carimbado quando uma tentativa de entrega é assinada e é regenerado a cada nova tentativa, para que as novas tentativas não sejam rejeitadas pela verificação de atualidade do SDK. Ele é o relógio da tentativa de entrega, não do evento: use ocreated_atdo payload do evento para saber quando o evento ocorreu. -
Desativação automática: Um endpoint é automaticamente definido como
disabledcom umdisabled_reasonlegível por máquina em três casos:- O endpoint retorna uma resposta
3xx. Redirecionamentos nunca são seguidos; isso desativa o endpoint imediatamente, na primeira tentativa, com o motivoauto-disabled: endpoint URL returned a redirect (3xx). Se o seu endpoint mudar de lugar, atualize a URL no Console e reative o endpoint. - A URL do endpoint é resolvida para um endereço IP não público quando a Anthropic se conecta. Isso desativa o endpoint imediatamente, com o motivo
auto-disabled: endpoint URL resolved to an invalid address. - As entregas para o endpoint falham continuamente por um período prolongado, com o motivo
auto-disabled after sustained delivery failures. O gatilho é por quanto tempo o endpoint vem falhando sem interrupção, não uma contagem de entregas. Um único2xxreinicia a janela, então um evento instável não consegue desativar o endpoint.
Os três casos são reversíveis: reative o endpoint no Console depois de resolver o problema. Eventos emitidos enquanto o endpoint estava desativado não são reenviados.
- O endpoint retorna uma resposta
Was this page helpful?