Pular para o conteúdo

Criar um endpoint

O endpoint é o endereço do seu sistema que recebe os eventos. Cadastrar é um passo só, pelo painel ou pela API. Este guia faz os dois caminhos e termina com a conferência de que as entregas estão chegando.

  • Quem cadastra. Webhook é gerido por dono e administradores, pelo painel ou por uma chave de API de um membro com esse papel. Os outros papéis recebem 403 em toda rota de webhooks, inclusive as de leitura.
  • Um endereço público com https://. Endereço interno, localhost e http:// são recusados, e a conferência se repete em toda entrega. As regras completas estão em Para onde a entrega pode ir. Para testar a partir da sua máquina, você precisa expor o seu servidor local num endereço público com https://, por exemplo com um serviço de túnel.
  • Um servidor que confere a assinatura. Deixe o recebimento pronto antes, com o código de Verificar a assinatura. Ele responde 200 a uma entrega assinada e 400 ao resto.
  • Os eventos que você usa. Escolha no Catálogo de eventos só o que o seu sistema vai tratar. Receber um evento é receber o dado dele.

Quantos endpoints a empresa pode ter depende do plano: veja Limites.

  1. Abra a página Configurações: clique no seu nome, no alto da tela, e em Configurações. Pelo menu lateral, o caminho é Configurações → Preferências da Empresa.
  2. Vá na aba API. O quadro Webhooks fica abaixo das chaves.
  3. Clique em Novo endpoint.
  4. Preencha a URL, uma Descrição para reconhecer depois qual sistema recebe, e marque os Eventos. Todos os eventos inclui também os que entrarem no catálogo depois.
  5. Confirme com a sua senha e clique em Criar endpoint.

A tela seguinte mostra o segredo, que começa com whsec_. Copie para o servidor que recebe os eventos. No painel, dono e administradores podem revelar o segredo de novo depois, pelo menu do endpoint (Revelar segredo), confirmando a senha.

O painel pede a senha ao criar e sempre que a URL ou os eventos mudam, porque são esses dois campos que decidem para onde os dados da empresa vão.

A chave precisa de:

PermissãoPara quê
webhooks:createCadastrar o endpoint
<modulo>:read de cada eventoSe inscrever: sales:read para sale.*, clients:read para client.*, e assim por diante. Com ["*"], de todos os módulos
webhooks:updateMandar o ping, rotacionar o segredo, ligar e desligar. Trocar a URL ou os eventos, religar, mandar o ping e rotacionar o segredo pedem também o <modulo>:read de cada evento que o endpoint assina, mesmo que ele tenha sido criado no painel
webhooks:readLer o endpoint e o log de entregas
Terminal window
# 1. Cadastrar
# Gere a chave uma vez e guarde: numa nova tentativa, repita com o mesmo valor.
CREATE_KEY=$(uuidgen)
curl -X POST "https://api.fatureihoje.com/public/v1/webhook_endpoints" \
-H "Authorization: Bearer $FH_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $CREATE_KEY" \
-d '{
"url": "https://erp.suaempresa.com.br/webhooks/faturei-hoje",
"description": "ERP da loja",
"events": ["sale.created", "sale.paid", "client.created"]
}'
# 2. Conferir a conexão, com o id que voltou acima
ENDPOINT_ID="7f3a1c5e-9b2d-4f6a-8c0e-2b4d6f8a0c1e"
# Gere a chave uma vez e guarde: numa nova tentativa, repita com o mesmo valor.
PING_KEY=$(uuidgen)
curl -X POST "https://api.fatureihoje.com/public/v1/webhook_endpoints/$ENDPOINT_ID/ping" \
-H "Authorization: Bearer $FH_API_KEY" \
-H "Idempotency-Key: $PING_KEY"
# 3. Alguns segundos depois, ver como a entrega foi
curl "https://api.fatureihoje.com/public/v1/webhook_endpoints/$ENDPOINT_ID/deliveries?limit=5" \
-H "Authorization: Bearer $FH_API_KEY"

A resposta do cadastro é 201 e traz o endpoint com o campo secret. Pela API, o segredo só aparece nesta resposta e na rotação. Repetir o cadastro com a mesma Idempotency-Key devolve o endpoint sem o segredo, porque ele não fica guardado em claro nem para a repetição. Se você perdeu a resposta, rotacione o segredo com POST /public/v1/webhook_endpoints/{id}/rotate_secret, ou revele-o pelo painel.

Dono e administradores recebem um e-mail a cada endpoint criado.

O ping (POST /public/v1/webhook_endpoints/{id}/ping, ou Enviar ping no menu do endpoint no painel) manda um evento ping de verdade só para aquele endpoint, assinado e pelo mesmo caminho de qualquer evento. Ele não leva dado da empresa. Não é ambiente de teste: é só a prova de que o endereço recebe e confere a assinatura.

Depois, abra o log de entregas (GET /public/v1/webhook_endpoints/{id}/deliveries, ou Ver entregas no painel):

O que apareceO que quer dizer
succeededO seu servidor respondeu 2xx. Pronto
pending, com response_status_codeO servidor respondeu, mas não 2xx. Uma nova tentativa vem depois
pending, com errorNão houve resposta (tempo, DNS, TLS, conexão). O motivo está no campo
failedAcabaram as tentativas, ou a entrega foi fechada sem envio. Veja Entregas e novas tentativas

Resposta 400 no ping quase sempre é assinatura que não conferiu no seu lado: o segredo errado, ou o corpo interpretado antes da conferência. Veja Os três erros que mais aparecem.

RespostaPor quê
422 com param urlA URL não é https://, não é pública, tem usuário e senha, ou não resolve
422 com param eventsEvento que não existe no catálogo, ou * junto de outro nome
403 permission_missingFalta webhooks:create, ou o <modulo>:read de algum evento escolhido
403 plan_limit_reachedA empresa chegou ao limite de endpoints do plano
403 member_permission_deniedO membro por trás da chave não é dono nem administrador