Webhooks de Escrituração
Visão Geral
Os webhooks de escrituração permitem que você receba notificações em tempo real sobre mudanças de status e eventos importantes relacionados ao processo de emissão de Notas Comerciais. Quando um evento ocorre, a QI Tech envia automaticamente um payload HTTP POST para a URL configurada em seu sistema.
Configuração de Webhooks
Para receber webhooks, você precisa configurar uma URL de endpoint em seu sistema. Consulte a documentação de configuração de webhooks para mais detalhes sobre como cadastrar e gerenciar suas URLs de webhook.
Autenticação e Segurança
Todos os webhooks enviados pela QI Tech incluem um header SIGNATURE com um JWT assinado em HS256 com a Signature Key compartilhada com o parceiro. O corpo da requisição não é assinado diretamente: ele entra no token pelo claim payload_md5. Esta assinatura deve ser validada em seu sistema para garantir a autenticidade e integridade dos dados recebidos. Para o passo a passo da validação, consulte a documentação de autenticação de webhooks.
Eventos Disponíveis
Gestão de Emissores
Cadastro Emissor Aprovado
Enviado quando o cadastro de um emissor é aprovado pelo compliance.
Event Type: issuer_management.issuer_status_change
Payload:
{
"event_type": "issuer_management.issuer_status_change",
"event_datetime": "2025-07-30T15:32:00Z",
"event_data": {
"issuer_key": "18c4d162-1b1b-4c3a-b7a7-5f1200723c43",
"status": "approved"
}
}
Cadastro Emissor Reprovado
Enviado quando o cadastro de um emissor é reprovado pelo compliance.
Event Type: issuer_management.issuer_status_change
Payload:
{
"event_type": "issuer_management.issuer_status_change",
"event_datetime": "2025-07-30T15:32:00Z",
"event_data": {
"issuer_key": "18c4d162-1b1b-4c3a-b7a7-5f1200723c43",
"status": "reproved"
}
}
Auto-assinatura do Emissor — Mudança de Status
Enviado quando o envelope do termo de adesão é aberto e quando esse envelope é resolvido. O envelope é aberto durante a própria solicitação da habilitação, que já responde em pending_signature — para quem fez a chamada, este webhook confirma o que a resposta trouxe; para os demais consumidores do tenant, é o aviso de que o termo está disponível para assinatura. A habilitação é solicitada pelo integrador em POST .../auto_signature. Consulte o fluxo da auto-assinatura para o significado de cada status.
O evento é disparado em três momentos: pending_signature, enabled e reproved. A criação da auto-assinatura (pending_term_generation) e o cancelamento (canceled) não geram webhook — a criação é a resposta da própria solicitação, e o cancelamento é observado pela consulta da auto-assinatura.
Event Type: issuer_management.auto_signature_status_change
Payload:
{
"event_type": "issuer_management.auto_signature_status_change",
"event_datetime": "2026-02-10T09:16:03Z",
"event_data": {
"issuer_key": "18c4d162-1b1b-4c3a-b7a7-5f1200723c43",
"issuer_auto_signature_key": "9c3f0f1e-6a2b-4c58-9c9c-0f6b1d2a7e34",
"status": "pending_signature"
}
}
| Campo | Tipo | Descrição |
|---|---|---|
issuer_key | string | Chave única do emissor. |
issuer_auto_signature_key | string | Chave única da auto-assinatura. |
status | string | Status atual. No webhook, sempre pending_signature, enabled ou reproved. |
Como tratar cada status recebido:
| Status recebido | O que fazer |
|---|---|
pending_signature | Consultar os links de assinatura e direcionar cada assinante do emissor ao seu próprio link. |
enabled | O emissor está habilitado: as emissões seguintes são assinadas automaticamente. |
reproved | O envelope do termo foi recusado, cancelado ou expirou. As emissões seguem pelo fluxo de assinatura manual até que uma nova habilitação seja criada. |
Gestão de Contas de Liquidação
Abertura de Conta de Liquidação Rejeitada
Enviado quando o BaaS rejeita a abertura da conta de liquidação do emissor — por exemplo, por bloqueio no Bacen Protege+. A conta não é aberta, e a integralização do emissor fica impedida até que uma nova solicitação seja aprovada.
Não há evento correspondente de aprovação: a abertura bem-sucedida é observada pela consulta da conta de liquidação.
Event Type: liquidation_account.account_request_status_change
Payload:
{
"event_type": "liquidation_account.account_request_status_change",
"event_datetime": "2025-07-30T16:05:00Z",
"event_data": {
"issuer_key": "18c4d162-1b1b-4c3a-b7a7-5f1200723c43",
"account_request_key": "7e1c53d6-d372-4020-be6b-ed94248d7ae9",
"status": "rejected",
"rejection_reason": "Rejeitado devido ao Bacen Protege+",
"account_info": {
"account_branch": "0001",
"account_number": "1234567",
"account_digit": "3"
}
}
}
O campo account_info é opcional e só é enviado quando o BaaS informa os dados da conta recusada. O rejection_reason é repassado como recebido do BaaS.
Gestão de Investidores
Cadastro Investidor Aprovado
Enviado quando o cadastro de um investidor é aprovado pelo compliance.
Event Type: investor_management.investor_status_change
Payload:
{
"event_type": "investor_management.investor_status_change",
"event_datetime": "2025-07-30T15:32:00Z",
"event_data": {
"investor_key": "18c4d162-1b1b-4c3a-b7a7-5f1200723c43",
"status": "approved"
}
}
Cadastro Investidor Reprovado
Enviado quando o cadastro de um investidor é reprovado pelo compliance.
Event Type: investor_management.investor_status_change
Payload:
{
"event_type": "investor_management.investor_status_change",
"event_datetime": "2025-07-30T15:32:00Z",
"event_data": {
"investor_key": "18c4d162-1b1b-4c3a-b7a7-5f1200723c43",
"status": "reproved"
}
}
Gestão de Operações
Operação Aprovada
Enviado quando uma operação é aprovada pelo compliance e está pronta para ser enviada para assinatura.
Event Type: commercial_paper.operation_status_change
Payload:
{
"event_type": "commercial_paper.operation_status_change",
"event_datetime": "2025-07-30T15:45:00Z",
"event_data": {
"operation_key": "89c7f73a-c184-400c-bb2a-dd4424075a4f",
"status": "pending_signature_submission"
}
}
Operação Reprovada
Enviado quando uma operação é reprovada na análise (pré-análise automática ou análise manual do compliance). A operação não segue para assinatura.
Event Type: commercial_paper.operation_status_change
Payload:
{
"event_type": "commercial_paper.operation_status_change",
"event_datetime": "2025-07-30T15:45:00Z",
"event_data": {
"operation_key": "89c7f73a-c184-400c-bb2a-dd4424075a4f",
"status": "compliance_reproved",
"reproval_reason": {
"maximum_overdue_by_debtor": "Issuer 12.345.678/0001-90 holds another asset that is more than 0 days overdue."
}
}
}
O campo reproval_reason traz os motivos da reprovação em um objeto de chave e descrição. Na pré-análise automática, cada chave é a regra de elegibilidade que reprovou a operação. O campo pode vir null quando a reprovação não registrou nenhum motivo.
Operação Enviada para Assinatura
Enviado quando uma operação é enviada para assinatura das partes envolvidas.
Event Type: commercial_paper.operation_status_change
Payload:
{
"event_type": "commercial_paper.operation_status_change",
"event_datetime": "2025-07-30T15:45:00Z",
"event_data": {
"operation_key": "89c7f73a-c184-400c-bb2a-dd4424075a4f",
"status": "waiting_signature"
}
}
Operação Assinada e Emitida
Enviado quando uma operação é assinada por todas as partes. Este evento confirma que a Nota Comercial foi emitida com sucesso.
Event Type: commercial_paper.operation_status_change
Payload:
{
"event_type": "commercial_paper.operation_status_change",
"event_datetime": "2025-07-30T15:45:00Z",
"event_data": {
"operation_key": "89c7f73a-c184-400c-bb2a-dd4424075a4f",
"status": "issued",
"signed_files_url": "https://storage.googleapis.com/commercial-paper-bucket/89c7f73a-c184-400c-bb2a-dd4424075a4f/signed_files?X-Goog-Algorithm=..."
}
}
O campo signed_files_url traz o link para download de um arquivo compactado com todos os contratos assinados da operação, disponível independentemente do método de assinatura utilizado. O link tem validade de 7 dias a partir do envio do webhook.
Operação Cancelada
Enviado quando uma operação é cancelada.
Event Type: commercial_paper.operation_status_change
Payload:
{
"event_type": "commercial_paper.operation_status_change",
"event_datetime": "2025-07-30T15:45:00Z",
"event_data": {
"operation_key": "89c7f73a-c184-400c-bb2a-dd4424075a4f",
"status": "canceled"
}
}
Gestão de Subscrições
Subscrição Enviada para Assinatura
Enviado quando uma subscrição é criada e enviada para assinatura do investidor.
Event Type: subscription.subscription_status_change
Payload:
{
"event_type": "subscription.subscription_status_change",
"event_datetime": "2025-07-30T16:05:00Z",
"event_data": {
"integralization_key": "491e4f5c-a173-4ab8-8ec6-24e7aa228099",
"subscription_key": "eb791639-2931-41df-b087-731d40f07a7c",
"status": "waiting_signature"
}
}
Subscrição Assinada
Enviado quando a subscrição é assinada por todas as partes e está aguardando o pagamento.
Event Type: subscription.subscription_status_change
Payload:
{
"event_type": "subscription.subscription_status_change",
"event_datetime": "2025-07-30T16:05:00Z",
"event_data": {
"integralization_key": "491e4f5c-a173-4ab8-8ec6-24e7aa228099",
"subscription_key": "eb791639-2931-41df-b087-731d40f07a7c",
"status": "waiting_payment"
}
}
Subscrição Finalizada
Enviado quando a subscrição é completamente finalizada após a confirmação do pagamento.
Event Type: subscription.subscription_status_change
Payload:
{
"event_type": "subscription.subscription_status_change",
"event_datetime": "2025-07-30T16:05:00Z",
"event_data": {
"integralization_key": "491e4f5c-a173-4ab8-8ec6-24e7aa228099",
"subscription_key": "eb791639-2931-41df-b087-731d40f07a7c",
"status": "finished"
}
}
Subscrição Cancelada
Enviado quando a subscrição é cancelada por reprovação na análise de elegibilidade da integralização. A boleta e o envelope de assinatura são cancelados junto.
Event Type: subscription.subscription_status_change
Payload:
{
"event_type": "subscription.subscription_status_change",
"event_datetime": "2025-07-30T16:05:00Z",
"event_data": {
"operation_key": "89c7f73a-c184-400c-bb2a-dd4424075a4f",
"integralization_key": "491e4f5c-a173-4ab8-8ec6-24e7aa228099",
"subscription_key": "eb791639-2931-41df-b087-731d40f07a7c",
"status": "canceled",
"cancellation_reason": "ineligible",
"ineligible_reasons": {
"maximum_overdue_by_debtor": "Issuer 12.345.678/0001-90 holds another asset that is more than 0 days overdue."
}
}
}
O campo cancellation_reason identifica o motivo do cancelamento de forma estável. Para ineligible, o campo ineligible_reasons traz um objeto em que cada chave é a regra de elegibilidade que reprovou a integralização e cada valor é a descrição correspondente.
Gestão de Pagamentos de Subscrição
Comprovante de Pagamento Incluído
Enviado quando um comprovante de pagamento é incluído e está aguardando confirmação.
Event Type: subscription_payment.subscription_payment_status_change
Payload:
{
"event_type": "subscription_payment.subscription_payment_status_change",
"event_datetime": "2025-07-30T16:05:00Z",
"event_data": {
"integralization_key": "491e4f5c-a173-4ab8-8ec6-24e7aa228099",
"subscription_key": "eb791639-2931-41df-b087-731d40f07a7c",
"subscription_payment_key": "1413020c-6965-40fb-a162-632459d35fd1",
"status": "waiting_confirmation"
}
}
Comprovante de Pagamento Aprovado
Enviado quando o comprovante de pagamento é aprovado e confirmado.
Event Type: subscription_payment.subscription_payment_status_change
Payload:
{
"event_type": "subscription_payment.subscription_payment_status_change",
"event_datetime": "2025-07-30T16:05:00Z",
"event_data": {
"integralization_key": "491e4f5c-a173-4ab8-8ec6-24e7aa228099",
"subscription_key": "eb791639-2931-41df-b087-731d40f07a7c",
"subscription_payment_key": "1413020c-6965-40fb-a162-632459d35fd1",
"status": "confirmed"
}
}
Fluxo de Eventos
Fluxo de Emissão de Nota Comercial
- Cadastro do Emissor →
issuer_status_change(approved/reproved) - Cadastro do Investidor →
investor_status_change(approved/reproved) - Criação da Operação →
operation_status_change(pending_signature_submission) - Envio para Assinatura →
operation_status_change(waiting_signature) - Operação Emitida →
operation_status_change(issued)
Fluxo de Subscrição
- Criação da Subscrição →
subscription_status_change(waiting_signature) - Assinatura Concluída →
subscription_status_change(waiting_payment) - Inclusão do Comprovante →
subscription_payment_status_change(waiting_confirmation) - Pagamento Confirmado →
subscription_payment_status_change(confirmed) - Subscrição Finalizada →
subscription_status_change(finished)
Boas Práticas
- Responda rapidamente: Retorne um status HTTP 2xx o mais rápido possível para confirmar o recebimento do webhook.
- Processamento assíncrono: Para operações demoradas, confirme o recebimento imediatamente e processe o evento de forma assíncrona.
- Idempotência: Implemente lógica idempotente, pois webhooks podem ser reenviados em caso de falha de rede.
- Validação de assinatura: Sempre valide o JWT do header
SIGNATUREantes de processar o webhook. - Logs e monitoramento: Mantenha logs detalhados de todos os webhooks recebidos para auditoria e debugging.