Documentação da API
A API Omnicash é organizada em torno de REST. Aceita corpos JSON, retorna respostas JSON e usa códigos de status HTTP padrão, autenticação via Bearer token e webhooks para eventos assíncronos.
URL Base
https://omnicash.com.br/api/v1Convenções
Todas as requisições devem usar HTTPS. Corpos de requisição em JSON exigem o header Content-Type: application/json. Datas seguem ISO 8601. Valores monetários na criação são informados em centavos (inteiros); em respostas de listagem e saldo são retornados em reais decimais como string ou number.
Autenticação
Toda requisição requer autenticação via chave de API gerada no painel. Cada chave é criada com um conjunto de scopes que limitam o acesso.
Bearer Token
curl https://omnicash.com.br/api/v1/transactions \
-H "Authorization: Bearer sk_live_sua_chave"Basic Auth
Alternativa: a chave como username em Basic Auth (senha vazia).
curl https://omnicash.com.br/api/v1/transactions \
-u "sk_live_sua_chave:"Scopes
transactions:readtransactions:writecustomers:readpayouts:readTransações
Transações representam cobranças PIX. Crie, liste ou consulte uma transação específica.
Criar transação
/v1/transactionsBody
customer.nameobrig.customer.emailobrig.customer.phoneobrig.customer.cpfobrig.amountobrig.paymentMethodobrig.items[].nameobrig.items[].quantityobrig.items[].unitPriceobrig.items[].isPhysicalitems[].externalRefexternalIdpostbackUrlpix.expiresInMinutespix.expiresInDaysipHeaders opcionais
Idempotency-KeyX-AsyncRequisição
curl -X POST https://omnicash.com.br/api/v1/transactions \
-H "Authorization: Bearer sk_live_sua_chave" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: pedido-12345" \
-d '{
"customer": {
"name": "Maria Santos",
"email": "maria@email.com",
"phone": "+5511999998888",
"cpf": "529.982.247-25"
},
"amount": 15900,
"paymentMethod": "pix",
"items": [
{ "name": "Plano Pro", "quantity": 1, "unitPrice": 15900 }
],
"externalId": "pedido-12345"
}'Resposta — 200 OK
{
"success": true,
"data": {
"id": 1234,
"externalId": "evo_abc123",
"amount": 15900,
"status": "pending",
"pix": {
"qrcode": "00020126580014BR.GOV.BCB.PIX...",
"qrcodeBase64": "iVBORw0KGgoAAAANSUhEUgAA..."
},
"expiresAt": "2026-04-09T17:00:00.000Z",
"createdAt": "2026-04-08T17:00:00.000Z",
"customer": {
"id": 42,
"name": "Maria Santos",
"email": "maria@email.com"
}
}
}Resposta — 202 Accepted (async)
{
"success": true,
"async": true,
"data": {
"id": 1234,
"amount": 15900,
"status": "pending",
"createdAt": "2026-04-08T17:00:00.000Z",
"customer": { "id": 42, "name": "Maria Santos", "email": "maria@email.com" }
}
}Listar transações
/v1/transactionsQuery parameters
limitstarting_afterstatusdate_fromdate_tomin_amountmax_amountexternal_idcurl "https://omnicash.com.br/api/v1/transactions?limit=10&status=success" \
-H "Authorization: Bearer sk_live_sua_chave"{
"success": true,
"data": [
{
"id": 1234,
"amount": "159.00",
"currency": "BRL",
"status": "success",
"method": "pix",
"externalId": "evo_abc123",
"customerName": "Maria Santos",
"customerEmail": "maria@email.com",
"gatewayProvider": "evollute",
"createdAt": "2026-04-08T17:00:00.000Z",
"expiresAt": "2026-04-09T17:00:00.000Z"
}
],
"pagination": {
"hasMore": true,
"nextCursor": "1234"
}
}amount retornado na listagem vem como string decimal em reais (ex: "159.00").Consultar transação
/v1/transactions/:idSincroniza o status com o gateway em tempo real (quando suportado).
curl https://omnicash.com.br/api/v1/transactions/1234 \
-H "Authorization: Bearer sk_live_sua_chave"{
"success": true,
"data": {
"id": 1234,
"externalId": "evo_abc123",
"amount": "159.00",
"currency": "BRL",
"status": "success",
"method": "pix",
"paymentData": {
"pix": { "qrcode": "00020126...", "qrcodeBase64": "iVBORw0..." }
},
"customerName": "Maria Santos",
"customerEmail": "maria@email.com",
"postbackUrl": null,
"createdAt": "2026-04-08T17:00:00.000Z"
}
}Saldo
Consulte o saldo disponível, pendente e total. Os valores já consideram MDR, taxa fixa por transação e payouts realizados.
/v1/balancecurl https://omnicash.com.br/api/v1/balance \
-H "Authorization: Bearer sk_live_sua_chave"{
"success": true,
"data": {
"available": 1250.50,
"pending": 340.00,
"total": 1590.50,
"currency": "BRL",
"payoutFee": 3.50
}
}available é o saldo já liberado (líquido de taxas e payouts pagos/em processamento). pending reflete transações em pending/processing. payoutFee é a taxa por saque cobrada pela plataforma. Valores em reais decimais.
Clientes
Clientes são criados/atualizados automaticamente quando uma transação é processada (deduplicação por email).
/v1/customersQuery parameters
limitstarting_afterstatusemailnamecurl "https://omnicash.com.br/api/v1/customers?email=maria&limit=10" \
-H "Authorization: Bearer sk_live_sua_chave"{
"success": true,
"data": [
{
"id": 42,
"name": "Maria Santos",
"email": "maria@email.com",
"status": "active",
"country": "BR",
"createdAt": "2026-01-15T10:00:00.000Z"
}
],
"pagination": {
"hasMore": true,
"total": 340,
"nextCursor": "42"
}
}Webhooks
Webhooks notificam seu servidor quando eventos acontecem. Configure URLs no painel (até 10 endpoints, cada um com sua própria seleção de eventos) ou use postbackUrl em uma transação específica.
Eventos
payment.createdpayment.succeededpayment.failedrefund.createddispute.openedHeaders enviados
Content-Typeobrig.X-Omnicash-Signatureobrig.X-Omnicash-Timestampobrig.User-Agentobrig.Payload
{
"event": "payment.succeeded",
"data": {
"transactionId": 1234,
"amount": "159.00",
"currency": "BRL",
"status": "success",
"method": "pix",
"customerName": "Maria Santos",
"customerEmail": "maria@email.com",
"paidAt": "2026-04-08T17:00:45.000Z",
"createdAt": "2026-04-08T17:00:00.000Z"
},
"timestamp": "2026-04-08T17:00:46.000Z"
}Verificando a assinatura
Use sempre o body raw (Buffer/string). Nunca JSON.stringify de objeto já parseado — a serialização pode diferir.
const crypto = require("crypto");
function verify(rawBody, sigHeader, secret) {
const expected = "sha256=" + crypto
.createHmac("sha256", secret)
.update(rawBody)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(sigHeader),
Buffer.from(expected)
);
}
// Express — use express.raw() para preservar o body
app.post(
"/webhooks/omnicash",
express.raw({ type: "application/json" }),
(req, res) => {
const signature = req.headers["x-omnicash-signature"];
if (!verify(req.body, signature, process.env.WEBHOOK_SECRET)) {
return res.status(401).json({ error: "Invalid signature" });
}
const event = JSON.parse(req.body);
if (event.event === "payment.succeeded") {
// Liberar produto/serviço usando event.data.transactionId
}
res.json({ received: true });
}
);Política de retry
Se seu endpoint não responder com 2xx em até 10 segundos, tentaremos novamente até 3 vezes (delays de 0s, 2s e 5s). URLs internas/loopback são bloqueadas por proteção SSRF.
Testar endpoint
/v1/webhooks/pingEnvia um evento test.ping para validar conectividade.
urlobrig.curl -X POST https://omnicash.com.br/api/v1/webhooks/ping \
-H "Authorization: Bearer sk_live_sua_chave" \
-H "Content-Type: application/json" \
-d '{ "url": "https://seuservidor.com/webhooks" }'Erros
A API retorna códigos HTTP padronizados e um corpo JSON com detalhes do erro. Existem dois formatos de envelope em uso — sempre confira o campo code (presente em ambos) para tratar o erro de forma consistente.
Formato 1 — Aninhado
Usado em autenticação, rate limit e erros de gateway.
{
"success": false,
"error": {
"code": "RATE_LIMITED",
"message": "Limite de requisições excedido. Tente novamente em breve."
}
}Formato 2 — Top-level
Usado em validação Zod e erros internos.
{
"error": "Dados inválidos",
"code": "VALIDATION_ERROR",
"fields": {
"amount": ["Number must be greater than or equal to 100"]
}
}Status HTTP
200201202400401403404422429500502503Códigos (campo error.code)
VALIDATION_ERRORBAD_REQUESTUNAUTHORIZEDFORBIDDENACCOUNT_SUSPENDEDNOT_FOUNDINVALID_URLCONNECTION_FAILEDRATE_LIMITEDGATEWAY_ERRORMAINTENANCE_MODESERVICE_UNAVAILABLESERVER_ERRORRate Limiting
A API limita requisições a 120 requisições por minuto por chave de API, em janela deslizante.
Headers de resposta
X-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-ResetRetry-AfterResposta 429
{
"success": false,
"error": {
"code": "RATE_LIMITED",
"message": "Limite de requisições excedido. Tente novamente em breve."
}
}X-Async: true e receba 202 Accepted imediatamente — a transação é processada em background e você recebe o resultado via webhook.