Docs Entrar na plataforma

Webhooks

Receber eventos

A Oneos avisa o seu sistema a cada passo da operação, com um POST assinado para a URL que você cadastrar.

Configurar o endpoint

Em Minha empresa › Webhooks, na plataforma:

  1. Informe a URL do seu endpoint.
  2. Escolha os eventos que quer receber.
  3. Guarde o signing secret (whsec_…) — ele aparece uma única vez.

Regras da URL:

  • HTTPS na porta 443, com endereço público — IPs internos ou privados são recusados.
  • Sem usuário e senha embutidos na URL.
  • Redirecionamento não é seguido: responder 3xx conta como falha.

Cada empresa tem um endpoint, na matriz. Você pode pausar as entregas, rotacionar o secret, enviar um evento de teste e ver o histórico na aba Entregas.

Formato da entrega

entrega
POST /webhooks/oneos HTTP/1.1
Host: erp.suaempresa.com.br
content-type: application/json
x-oneos-signature: t=1789482001,v1=5f0c…9a2e
x-oneos-event-id: 9f8e7d6c-1b2a-4c3d-8e9f-0a1b2c3d4e5f
x-oneos-event-type: pre_authorization.created

{
  "id": "9f8e7d6c-1b2a-4c3d-8e9f-0a1b2c3d4e5f",
  "type": "pre_authorization.created",
  "createdAt": "2026-09-15T13:00:01.000Z",
  "data": {
    "anticipationId": 48213,
    "status": "IN_PRE_AUTH",
    "origin": "PRE_AUTH",
    "invoice": {
      "amount": 18400,
      "dueDate": "2026-11-30",
      "number": "48211"
    },
    "netAmount": null,
    "payer": {
      "cnpj": "44555666000199",
      "name": "Construtora Exemplo LTDA"
    },
    "supplier": {
      "cnpj": "11222333000181",
      "name": "Fornecedor Exemplo ME"
    },
    "externalReference": "PED-4581",
    "reason": null,
    "stage": null
  }
}

Headers

HeaderConteúdo
x-oneos-signatureAssinatura t=<segundos>,v1=<hmac>. Veja Verificar assinatura.
x-oneos-event-idO id do evento, igual ao do corpo.
x-oneos-event-typeO type do evento, igual ao do corpo.

Envelope

  • id string obrigatório

    Identificador único do evento. É o mesmo em todas as tentativas e reenvios — use para deduplicar.

    UUID
  • type enum obrigatório

    Tipo do evento, do catálogo.

    pre_authorization.createdpre_authorization.declinedpre_authorization.revokedpre_authorization.expiredanticipation.createdanticipation.requestedanticipation.approvedanticipation.analysis_approvedanticipation.reprovedanticipation.reopenedanticipation.paidanticipation.payout_returnedanticipation.billedanticipation.concludedanticipation.extension_createdanticipation.extension_concludedanticipation.extension_canceledinvoice.receivedpayment_order.createdpayment_order.under_reviewpayment_order.scheduledpayment_order.paidpayment_order.canceledpayment_order.reprovedwebhook.test
  • createdAt string obrigatório

    Momento em que o evento aconteceu, ISO 8601 em UTC.

  • data object obrigatório

    Conteúdo do evento. O formato depende da família do tipo.

Eventos de pré-autorização e antecipação

O data de pre_authorization.* e anticipation.* tem sempre este formato:

  • anticipationId integer obrigatório

    O id da operação — o mesmo da resposta de criação.

  • status enum obrigatório

    Status da operação depois do evento.

    IN_PRE_AUTHIN_VERIFICATIONTO_APPROVEIN_ANALYSISTO_PAYTO_BILLTO_RECEIVECONCLUDEDREPROVED
  • origin enum obrigatório

    PRE_AUTH quando nasceu de pré-autorização; DIRECT quando o fornecedor antecipou direto.

    PRE_AUTHDIRECT
  • invoice object obrigatório

    Dados da nota.

  • amount invoice. number obrigatório

    Valor bruto.

  • dueDate invoice. string obrigatório

    Vencimento, AAAA-MM-DD.

  • number invoice. string | null obrigatório

    Número da nota.

  • netAmount number | null obrigatório

    Valor líquido ao fornecedor, ou null enquanto não foi calculado.

  • payer object obrigatório

    A construtora (tomadora) da operação.

  • cnpj payer. string obrigatório

    CNPJ da construtora.

  • name payer. string obrigatório

    Razão social da construtora.

  • supplier object obrigatório

    O fornecedor da operação.

  • cnpj supplier. string obrigatório

    CNPJ do fornecedor.

  • name supplier. string | null obrigatório

    Nome do fornecedor, ou null.

  • externalReference string | null obrigatório

    O identificador do seu ERP, ou null.

  • reason string | null opcional

    Motivo de encerramento, quando houver — por exemplo Cancelada via integração ou Pré-autorização expirada. Senão null.

  • stage string | null opcional

    Etapa em que a operação foi encerrada: PRE_AUTH, REQUEST ou SYSTEM. Senão null.

  • extension object opcional

    Só nos eventos anticipation.extension_*: a prorrogação do boleto.

  • id extension. integer obrigatório

    Identificador da prorrogação.

  • newDueDate extension. string obrigatório

    Novo vencimento do boleto.

  • totalAmount extension. number obrigatório

    Valor total do boleto prorrogado.

Os outros formatos de data estão no catálogo de eventos.

Seu endpoint, em três regras

  1. Verifique a assinatura com o corpo bruto, antes de qualquer parse.
  2. Responda 2xx em até 10 segundos e processe depois, numa fila.
  3. Deduplique pelo id — o mesmo evento pode chegar mais de uma vez, e fora de ordem.
Receptor de webhook
import express from 'express'
import { createHmac, timingSafeEqual } from 'node:crypto'

const SECRET = process.env.ONEOS_WEBHOOK_SECRET // whsec_...
const TOLERANCE_SECONDS = 300

function isValidSignature(rawBody, header) {
  const parts = Object.fromEntries(header.split(',').map((part) => part.split('=')))
  const timestamp = Number(parts.t)
  if (!Number.isInteger(timestamp) || !parts.v1) return false
  if (Math.abs(Date.now() / 1000 - timestamp) > TOLERANCE_SECONDS) return false

  const expected = createHmac('sha256', SECRET).update(`${timestamp}.${rawBody}`).digest()
  const received = Buffer.from(parts.v1, 'hex')
  return expected.length === received.length && timingSafeEqual(expected, received)
}

const app = express()

// corpo BRUTO: o HMAC é sobre os bytes exatos que chegaram
app.post('/webhooks/oneos', express.raw({ type: 'application/json' }), (req, res) => {
  const rawBody = req.body.toString('utf8')
  if (!isValidSignature(rawBody, req.get('x-oneos-signature') ?? '')) {
    return res.sendStatus(400)
  }

  const event = JSON.parse(rawBody)
  res.sendStatus(200) // responda rápido: o limite é 10 s

  enqueue(event) // processe fora do request, deduplicando por event.id
})

Quem recebe

Eventos de pré-autorização e antecipação vão para a construtora e para o fornecedor da operação — cada um no seu próprio endpoint, se tiver. Eventos de nota fiscal e de ordem de pagamento vão só para a empresa dona.