Webhooks
Webhooks permitem que a Obra Play notifique seu sistema automaticamente quando eventos importantes acontecem na plataforma — sem que você precise ficar consultando a API periodicamente (polling).
Quando um evento ocorre, a Obra Play faz uma requisição POST para a URL que você configurou, enviando os dados do evento em JSON.
Como configurar um webhook
Cadastre a URL do seu endpoint via API:
POST /api/hooks/
Authorization: Token seu_token_aqui
Content-Type: application/json
{
"url": "https://sua-plataforma.com/webhooks/obraplay",
"event": "quotation.published"
}
Para listar seus webhooks cadastrados:
GET /api/hooks/
Authorization: Token seu_token_aqui
Testando localmente
Durante o desenvolvimento, use o ngrok para expor seu servidor local e receber webhooks:
ngrok http 3000
# Copie a URL gerada e use como endpoint do webhook
Estrutura do payload
Todos os webhooks seguem a mesma estrutura de envelope:
{
"event": "quotation.published",
"timestamp": "2026-04-16T14:32:00Z",
"data": {
// objeto do recurso que gerou o evento
}
}
| Campo | Tipo | Descrição |
|---|---|---|
event | string | Identificador do evento (ex: quotation.published) |
timestamp | string | Data e hora do evento em UTC (ISO 8601) |
data | object | Dados completos do recurso relacionado |
Eventos disponíveis
| Evento | Descrição |
|---|---|
company.membership_created | Um novo membro foi adicionado a uma empresa |
company.membership_updated | A associação de um membro em uma empresa foi atualizada |
company.membership_deleted | A associação de um membro em uma empresa foi removida |
company.created | Uma nova empresa foi criada na plataforma |
company.updated | Os dados de uma empresa foram atualizados |
company.deleted | Uma empresa foi removida da plataforma |
company.configured | A configuração inicial de uma empresa foi concluída |
company.address_confirmed | O endereço de uma empresa foi confirmado |
company.verified | Uma empresa foi verificada e aprovada na plataforma |
quotation.created | Uma nova cotação foi criada |
quotation.updated | Uma cotação foi atualizada |
quotation.deleted | Uma cotação foi removida |
quotation_answer.created | Uma nova resposta a uma cotação foi criada |
quotation_answer.updated | Uma resposta a uma cotação foi atualizada |
quotation_answer.finalized | Uma resposta a uma cotação foi finalizada |
quotation_answer.autofilled | Uma resposta a uma cotação foi preenchida automaticamente |
quotation_answer.renegotiate | Uma renegociação de resposta a cotação foi iniciada |
quotation_answer.deleted | Uma resposta a uma cotação foi removida |
quotation_answer_message.created | Uma nova mensagem foi enviada em uma resposta de cotação |
quotation_answer_message.updated | Uma mensagem em uma resposta de cotação foi atualizada |
quotation_answer_message.deleted | Uma mensagem em uma resposta de cotação foi removida |
order.updated | Uma ordem de compra foi atualizado |
order.processed | Uma ordem de compra foi processado e confirmado pelo fornecedor |
order.refused | Uma ordem de compra foi recusado pelo fornecedor |
order.canceled | Uma ordem de compra foi cancelado |
order.finalized | Uma ordem de compra foi finalizado e a entrega confirmada |
order_review.created | Uma nova avaliação de pedido foi criada |
order_review.updated | Uma avaliação de pedido foi atualizada |
order_review.deleted | Uma avaliação de pedido foi removida |
user.created | Um novo usuário foi criado na plataforma |
user.updated | Os dados de um usuário foram atualizados |
Respondendo ao webhook
Seu endpoint deve retornar um status 2xx (preferencialmente 200 OK) em até 5 segundos para confirmar o recebimento.
Se a Obra Play não receber uma resposta 2xx, a entrega será considerada falha e o evento será reenviado com backoff exponencial.
Processe de forma assíncrona
Não execute lógica pesada durante o tratamento do webhook. Retorne 200 imediatamente e processe o evento em background (fila, worker, etc.) para evitar timeout.
Verificando a autenticidade
Todos os webhooks enviados pela Obra Play incluem um header de assinatura para garantir que a requisição é legítima:
X-ObraPlay-Signature: sha256=abc123...
Valide a assinatura calculando o HMAC-SHA256 do corpo da requisição com o seu webhook secret (disponível no painel de configurações da integração) e comparando com o valor do header.
Exemplo em Python:
import hmac
import hashlib
def verify_signature(payload_body: bytes, secret: str, signature_header: str) -> bool:
expected = hmac.new(
secret.encode(),
payload_body,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(f"sha256={expected}", signature_header)
Exemplo em Node.js:
const crypto = require('crypto');
function verifySignature(payloadBody, secret, signatureHeader) {
const expected = crypto
.createHmac('sha256', secret)
.update(payloadBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(`sha256=${expected}`),
Buffer.from(signatureHeader)
);
}