GET /api/v1/signing/public-key{
"Algoritmo": "Ed25519",
"ChavePublicaBase64": "MCowBQYDK2VwAyEA...",
"ChavePublicaPem": "-----BEGIN PUBLIC KEY-----\nMCow...\n-----END PUBLIC KEY-----",
"jwk": {
"kty": "OKP", "crv": "Ed25519", "kid": "2026-07", "use": "sig", "x": "..."
},
"jwks": {
"keys": [
{ "kty": "OKP", "crv": "Ed25519", "kid": "2026-07", "use": "sig", "x": "..." },
{ "kty": "OKP", "crv": "Ed25519", "kid": "2026-04", "use": "sig", "x": "..." }
]
}
}ChavePublicaBase64/ChavePublicaPem/jwk referem-se sempre à chave ativa (a que assina as entregas atuais).jwks.keys contém a chave ativa e chaves anteriores ainda válidas para verificação — necessário durante uma rotação de chaves, quando entregas antigas (assinadas com a chave anterior) e novas podem coexistir na fila de retentativas.Webhook-Key-IdWebhook-Key-Id de cada entrega informa qual kid assinou aquele evento específico. Procure em jwks.keys a entrada cujo kid corresponda para obter a chave pública correta:kid = headers["Webhook-Key-Id"]
public_key = entrada de jwks.keys onde entry.kid == kidkid em jwks.keys em vez de usar a chave ativa diretamente.{Webhook-Timestamp}.{body}1749772800.{"EventType":"Pix.CreditoRecebido","EventVersion":"v1","EventId":"550e8400-...","EntityId":"123456","OccurredAt":"2026-06-30T12:00:01Z","Data":{...}}Webhook-Signature contém o prefixo v1a, seguido da assinatura em Base64:Webhook-Signature: v1a,MEcCIGY3...==Webhook-Timestamp, Webhook-Signature e Webhook-Key-Id.jwks.keys a chave pública cujo kid corresponda a Webhook-Key-Id.Webhook-Signature, removendo o prefixo v1a,.{timestamp}.{body} — use o body exatamente como recebido, sem reserializar.Atenção: use o body bruto da requisição HTTP, antes de qualquer parsing JSON. Reserializar o objeto pode alterar a formatação (ordem de campos, espaços) e invalidar a verificação.
cryptography):