Pular para o conteúdo principal

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"
}
}
CampoTipoDescrição
issuer_keystringChave única do emissor.
issuer_auto_signature_keystringChave única da auto-assinatura.
statusstringStatus atual. No webhook, sempre pending_signature, enabled ou reproved.

Como tratar cada status recebido:

Status recebidoO que fazer
pending_signatureConsultar os links de assinatura e direcionar cada assinante do emissor ao seu próprio link.
enabledO emissor está habilitado: as emissões seguintes são assinadas automaticamente.
reprovedO 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​

  1. Cadastro do Emissor → issuer_status_change (approved/reproved)
  2. Cadastro do Investidor → investor_status_change (approved/reproved)
  3. Criação da Operação → operation_status_change (pending_signature_submission)
  4. Envio para Assinatura → operation_status_change (waiting_signature)
  5. Operação Emitida → operation_status_change (issued)

Fluxo de Subscrição​

  1. Criação da Subscrição → subscription_status_change (waiting_signature)
  2. Assinatura Concluída → subscription_status_change (waiting_payment)
  3. Inclusão do Comprovante → subscription_payment_status_change (waiting_confirmation)
  4. Pagamento Confirmado → subscription_payment_status_change (confirmed)
  5. Subscrição Finalizada → subscription_status_change (finished)

Boas Práticas​

  1. Responda rapidamente: Retorne um status HTTP 2xx o mais rápido possível para confirmar o recebimento do webhook.
  2. Processamento assíncrono: Para operações demoradas, confirme o recebimento imediatamente e processe o evento de forma assíncrona.
  3. Idempotência: Implemente lógica idempotente, pois webhooks podem ser reenviados em caso de falha de rede.
  4. Validação de assinatura: Sempre valide o JWT do header SIGNATURE antes de processar o webhook.
  5. Logs e monitoramento: Mantenha logs detalhados de todos os webhooks recebidos para auditoria e debugging.

Referências​