FT-WEBHOOK-PUBLIC· 1.0.1Integrações
Webhook Público SAP→Lefia
Como configurar SAP (ou outro sistema externo) para postar documentos no Lefia via webhook autenticado.
Atualizado em 8/22/2026
Quando uma integração tem paradigma Push, o Lefia expõe um endpoint público que aceita POST de sistema externo.
Em /edi-hub/integracao/[id], o card "Webhook público" mostra:
Por segurança, o server nunca retorna o secret atual. Para descobrir o secret você precisa regenerar.
Exemplo ABAP completo é exibido no card colapsável "Exemplos de uso".
URL e Secret
Em /edi-hub/integracao/[id], o card "Webhook público" mostra:
- URL pública:
https://lefia.ai/api/edi-hub/webhook/<path>(copy button) - Secret: mascarado. Para revelar/copiar, clique em Regenerar — o novo secret é exibido uma única vez (após isso só será possível regenerar de novo, invalidando o anterior).
Por segurança, o server nunca retorna o secret atual. Para descobrir o secret você precisa regenerar.
Configurar SAP
Opção A — Output Management (S/4HANA moderno)
Configurar condition record com REST destination apontando pra URL + header customizado:Content-Type: application/jsonx-webhook-secret: whsec_...
Opção B — ABAP custom (ECC ou S/4)
BAdI emVBAK_VBAP_SAVE (ou similar) que dispara cl_http_client=>create_by_url com POST.Exemplo ABAP completo é exibido no card colapsável "Exemplos de uso".
Opção C — cURL (teste manual)
curl -X POST "https://lefia.ai/api/edi-hub/webhook/<path>" \\
-H "x-webhook-secret: whsec_..." \\
-H "Content-Type: application/json" \\
-H "idempotency-key: doc-12345" \\
-d '{"docnum":"0005000123","mestyp":"SALES_ORDER","format":"json","data":{...}}'
Body esperado
{
"docnum": "0005000123",
"mestyp": "SALES_ORDER",
"format": "json",
"direction": "inbound",
"data": { "SalesOrder": "0005000123", "SoldToParty": "100001" },
"sourceStatus": "received"
}
Idempotência
- Header
idempotency-key(opcional, recomendado): se reenviar com mesmo valor, retorna a mensagem original sem reprocessar. - Se não enviar, Lefia computa fingerprint do payload e dedupliça automaticamente.
Respostas
- 200: deduplicado (mensagem já recebida)
- 202 Accepted: processado, retorna
messageId+pipeline_status - 401: secret inválido ou ausente
- 404: path não encontrado
- 423 Locked: integração não está ativa
Health check
GET /api/edi-hub/webhook/<path> retorna 200 + {ok, status, expects} se o path existe. Útil pro time do cliente validar antes de configurar POST com payload real.Histórico de versões
- 1.0.1
Promovido staging → main no merge release 49edb06
5/13/2026 · updated
- 1.0.0
Endpoint público POST /api/edi-hub/webhook/[path] + GET health + regenerate-secret API + UI WebhookCard (URL pública, secret regenerável, cURL/ABAP examples). UNIQUE index em webhook_path. Constant-time compare via crypto.timingSafeEqual. Reusa fingerprint+idempotency+processMessage do receive-message.
5/13/2026 · new