/fees/pix-quote?amount=10000Cotação de cobrança
Calcula tarifa e valor líquido antes de criar a cobrança.
Referência completa para autenticação, cobranças, transferências, saldo, idempotência, webhooks, erros e práticas de produção da VELTIS.
https://api.veltispay.com/v1Auth
Key + Secret
Criações
Idempotentes
Eventos
HMAC-SHA256
Ambiente
Live
Quickstart
Um fluxo de integração seguro começa pelas credenciais, passa pela cotação e termina confirmando o pagamento por webhook.
Gere credenciais
Crie Key + Secret e aplique somente os escopos necessários.
Consulte a tarifa
Faça a cotação em centavos antes de criar a operação.
Crie com idempotência
Envie uma chave única por operação financeira.
Confirme por webhook
Valide HMAC e deduplique pelo Event ID.
curl --request POST 'https://api.veltispay.com/v1/charges' \
--header 'X-Veltis-Key: sk_live_xxxxxxxxx' \
--header 'X-Veltis-Secret: sk_secret_live_xxxxxxxxx' \
--header 'Idempotency-Key: order_8821' \
--header 'Content-Type: application/json' \
--data '{
"amount": 15000,
"description": "Pedido #8821",
"external_reference": "order-8821",
"customer": {
"name": "Cliente Exemplo",
"document": "12345678901",
"email": "[email protected]"
}
}'Segurança
Novas integrações usam duas credenciais independentes. Nunca coloque Key ou Secret em JavaScript público, aplicativo distribuído ou repositório.
X-Veltis-Key: sk_live_xxxxxxxxx X-Veltis-Secret: sk_secret_live_xxxxxxxxx Content-Type: application/json
Princípio do menor privilégio
Configure escopos, expiração e, quando possível, uma allowlist de IPs IPv4/CIDR para cada integração.
charges:readConsultar cobranças e cotação PIXcharges:writeCriar e reconciliar cobrançaspayouts:readConsultar transferências e cotação de saídapayouts:writeSolicitar transferências PIXbalance:readConsultar saldo disponível e reservadoledger:readConsultar extrato financeiroCredenciais legadas de uma única chave podem existir apenas para compatibilidade. Integrações novas devem usar X-Veltis-Key + X-Veltis-Secret.
Confiabilidade
POST /charges e POST /payouts exigem Idempotency-Key. Isso permite repetir uma tentativa após timeout sem criar uma segunda movimentação.
Idempotency-Key: order_8821 # Também aceito X-Idempotency-Key: order_8821
Use uma chave por intenção financeira
Exemplo: o ID interno do pedido, saque ou operação no seu sistema.
Repita a mesma chave após timeout
Se o payload for igual, a VELTIS reutiliza a operação já registrada.
Não mude o payload da mesma chave
Reutilizar uma chave com conteúdo diferente retorna 409 IDEMPOTENCY_CONFLICT.
Limite
A chave pode ter no máximo 191 caracteres.
Referência
Pesquise por recurso, método, caminho ou escopo.
/fees/pix-quote?amount=10000Cotação de cobrança
Calcula tarifa e valor líquido antes de criar a cobrança.
/chargesListar cobranças
Retorna até 100 cobranças recentes da conta.
/chargesCriar cobrança PIX
Cria cobrança, QR Code, copia e cola e checkout hospedado.
/charges/:idConsultar cobrança
Consulta uma cobrança e pode reconciliar estado pendente.
/charges/:id/syncSincronizar cobrança
Solicita reconciliação imediata com o serviço de liquidação.
/fees/payout-quote?amount=20000Cotação de transferência
Retorna tarifa e débito total antes da transferência.
/payoutsListar transferências
Retorna até 100 transferências recentes.
/payoutsCriar transferência PIX
Solicita transferência com reserva financeira e rastreamento assíncrono.
/payouts/:idConsultar transferência
Consulta estado, tarifa, débito total e motivo de falha.
/balanceConsultar saldo
Retorna saldo disponível e saldo reservado em BRL.
/ledger?limit=100Consultar extrato
Retorna lançamentos recentes; limit aceita de 1 a 200.
Recebimentos
Valores são sempre enviados como inteiros em centavos. O mínimo aceito pela API é 100 centavos.
GET https://api.veltispay.com/v1/fees/pix-quote?amount=15000 X-Veltis-Key: sk_live_xxxxxxxxx X-Veltis-Secret: sk_secret_live_xxxxxxxxx
{
"success": true,
"data": {
"amount": 15000,
"fee": 450,
"net_amount": 14550,
"currency": "BRL"
}
}POST https://api.veltispay.com/v1/charges
X-Veltis-Key: sk_live_xxxxxxxxx
X-Veltis-Secret: sk_secret_live_xxxxxxxxx
Idempotency-Key: order_8821
Content-Type: application/json
{
"amount": 15000,
"description": "Pedido #8821",
"external_reference": "order-8821",
"return_url": "https://suaempresa.com/pedidos/8821",
"customer": {
"name": "Cliente Exemplo",
"document": "12345678901",
"email": "[email protected]",
"phone": "+5511999999999"
},
"metadata": {
"pedido": "8821"
}
}{
"success": true,
"data": {
"id": "ch_...",
"object": "charge",
"amount": 15000,
"fee": 450,
"net_amount": 14550,
"currency": "BRL",
"status": "pending",
"external_reference": "order-8821",
"pix": {
"copy_paste": "000201...",
"qr_code_payload": "000201...",
"qr_code_image": "...",
"expires_at": "2026-09-26T00:30:00Z"
},
"checkout_url": "https://veltispay.com/c/ch_...",
"paid_at": null,
"created_at": "2026-09-26T00:15:00Z"
}
}return_url precisa ser HTTPS
Quando informado, return_url deve ser uma URL HTTPS válida. metadata aceita um objeto JSON de até aproximadamente 16 KB.
Saídas
Transferências via API são autorizadas pelas credenciais, escopos e controles da conta. O PIN transacional é exclusivo das operações humanas no painel.
GET https://api.veltispay.com/v1/fees/payout-quote?amount=20000
X-Veltis-Key: sk_live_xxxxxxxxx
X-Veltis-Secret: sk_secret_live_xxxxxxxxx
{
"success": true,
"data": {
"amount": 20000,
"recipient_amount": 20000,
"fee": 600,
"total_debit": 20600,
"currency": "BRL"
}
}POST https://api.veltispay.com/v1/payouts
X-Veltis-Key: sk_live_xxxxxxxxx
X-Veltis-Secret: sk_secret_live_xxxxxxxxx
Idempotency-Key: withdraw_991
Content-Type: application/json
{
"amount": 20000,
"recipient_name": "Cliente Exemplo",
"recipient_document": "12345678901",
"pix_key_type": "cpf",
"pix_key": "12345678901",
"description": "Saque #991",
"external_reference": "withdraw-991"
}cpfcnpjemailphoneevpSaldo é reservado antes do envio
A transferência precisa ter saldo disponível suficiente para valor + tarifa. Falta de saldo retorna 409 INSUFFICIENT_BALANCE.
Conciliação
Use o saldo para disponibilidade operacional e o ledger para conciliar cada crédito e débito.
GET https://api.veltispay.com/v1/balance
X-Veltis-Key: sk_live_xxxxxxxxx
X-Veltis-Secret: sk_secret_live_xxxxxxxxx
{
"success": true,
"data": {
"available": 24842000,
"reserved": 20600,
"currency": "BRL"
}
}GET https://api.veltispay.com/v1/ledger?limit=100
X-Veltis-Key: sk_live_xxxxxxxxx
X-Veltis-Secret: sk_secret_live_xxxxxxxxx
{
"success": true,
"data": [
{
"id": "led_...",
"type": "charge_credit",
"direction": "credit",
"amount": 14550,
"charge_id": "ch_...",
"payout_id": null,
"description": "Liquidação PIX",
"created_at": "2026-09-26T00:20:00Z"
}
]
}Eventos
Cada endpoint configurado recebe uma Signing Secret própria. O segredo é exibido na criação ou rotação e deve ficar somente no backend.
X-Veltis-Event-Id: <event_id> X-Veltis-Event-Type: charge.paid X-Veltis-Timestamp: 1787160000 X-Veltis-Signature: sha256=<hex> Content-Type: application/json
import crypto from "node:crypto";
const material = timestamp + "." + rawBody;
const expected = crypto
.createHmac("sha256", process.env.VELTIS_WEBHOOK_SECRET)
.update(material)
.digest("hex");
const received = signature.replace(/^sha256=/, "");
if (received.length !== expected.length ||
!crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected))) {
throw new Error("Assinatura inválida");
}Material assinado
timestamp + "." + RAW_BODYValide o corpo bruto exatamente como recebido. Persista o Event ID antes de executar efeitos e responda HTTP 2xx somente depois dessa persistência. Entregas com falha são reenviadas com backoff.
charge.createdcharge.pendingcharge.paidcharge.expiredcharge.failedcharge.cancelledcharge.refundedpayout.requestedpayout.approvedpayout.processingpayout.paidpayout.failedpayout.rejectedContrato
Erros seguem um envelope estável. Use error.code para lógica e error.message para diagnóstico humano.
{
"success": false,
"error": {
"code": "INSUFFICIENT_BALANCE",
"message": "Saldo disponível insuficiente"
}
}JSON, idempotência ou cabeçalho obrigatório.
Key/Secret inválidos, expirados ou revogados.
Escopo, IP, conta ou capacidade operacional.
Recurso ou rota inexistente.
Idempotência, saldo ou estado da operação.
Valor, PIX key ou campos inválidos.
Reduza a taxa e faça retry com backoff.
Não gere nova intenção; repita com a mesma idempotência.
Estados de cobrança
creatingpendingpaidexpiredfailedcancelledrefundedEstados de transferência
submittingrequestedapprovedprocessingpaidfailedrejectedGo live
Use esta lista como critério mínimo antes de liberar tráfego financeiro real.
Segredos fora do código
Armazene Key, Secret e Signing Secret em cofre de segredos ou variáveis protegidas.
Escopos mínimos
Conceda somente as permissões usadas por cada serviço.
Allowlist de IP
Restrinja as credenciais aos IPs do backend quando sua infraestrutura permitir.
Idempotência persistente
Salve a chave junto ao pedido/saque e reutilize a mesma após timeout.
Webhook em RAW_BODY
Calcule o HMAC antes de fazer parse ou reserializar o JSON.
Deduplicação
Persista Event ID e torne o processamento de eventos idempotente.
Timeouts e retries
Use timeout de rede e retry com backoff sem trocar a chave idempotente.
Conciliação
Use webhooks como caminho principal e consultas/sync como mecanismo de recuperação.