Documentação da API
Integre pagamentos PIX à sua aplicação com a API da SyntraPay. Cobranças, saques, consulta de saldo, webhooks e monitoramento de infrações MED, tudo via REST.
https://api.syntrapay.com.brTodos os valores monetários são inteiros em centavos (ex.: 1490 = R$ 14,90). As respostas usam JSON.
Autenticação
Autentique cada requisição enviando sua chave de API no header Authorization, sem o prefixo Bearer. Gere e gerencie suas chaves no painel em Integrações → Credenciais.
Authorization: sk_live_sua_chave_aquiExemplo: primeira cobrança
curl -X POST https://api.syntrapay.com.br/transactions \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{ "amount": 1490 }'Escopos
Cada chave de API possui escopos que definem quais ações ela pode executar. Selecione os escopos ao criar a chave e conceda apenas o necessário.
payments.createCriar cobranças PIX.payments.readConsultar cobranças e transações.transfers.readConsultar transferências.withdrawals.createCriar saques PIX.withdrawals.readConsultar saques.webhooks.manageGerenciar webhooks.Cobranças (PIX)
Crie e consulte cobranças PIX. Todos os valores são inteiros em centavos (ex.: 1490 = R$ 14,90).
/transactions payments.createCriar cobrança
Cria uma cobrança PIX e retorna o QR Code (base64) e o código copia-e-cola para o pagador. O valor é sempre em centavos.
Parâmetros
amountbodyobrigatóriowebhookbodysplit_emailbodysplit_taxbodycustomerbodyproductsbodytrackingParametersbodyIdempotency-KeyheaderCampos da resposta
idstatusamountqrCodeBase64copyPasteexpiresAtfeestoreIdRequisição
curl -X POST "https://api.syntrapay.com.br/transactions" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{"amount":1490}'Resposta
201 Created{
"message": "Transaction created successfully",
"status": "pending",
"id": "9c1e7b2a-3f4d-4a8b-bc12-5e6f7a8b9c0d",
"amount": 1490,
"qrCodeBase64": "data:image/png;base64,iVBORw0KGgoAAA...",
"copyPaste": "00020126580014br.gov.bcb.pix...6304ABCD",
"expiresAt": "2026-07-18T15:30:00.000Z",
"fee": 44,
"storeId": "usr_a1b2c3"
}{
"status": "error",
"code": "BAD_REQUEST",
"message": "400: Amount must be greater than 50 cents"
}/transactions/:id payments.readConsultar cobrança
Consulta os detalhes e o status atual de uma cobrança pelo seu ID. Ao fazer polling do status, use nocache=1 para ler sempre direto do banco.
Parâmetros
idpathobrigatórionocachequeryCampos da resposta
idstatusamountfeepayerpaidAtRequisição
curl -X GET "https://api.syntrapay.com.br/transactions/9c1e7b2a-3f4d-4a8b-bc12-5e6f7a8b9c0d" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json"Resposta
200 OK{
"id": "9c1e7b2a-3f4d-4a8b-bc12-5e6f7a8b9c0d",
"status": "PAID",
"type": "DEPOSIT",
"reason": "PIX_PAYMENT",
"amount": 1490,
"fee": 44,
"payer": { "name": "João da Silva", "document": "***.456.789-**" },
"storeId": "usr_a1b2c3",
"createdAt": "2026-07-18T14:30:00.000Z",
"paidAt": "2026-07-18T14:31:12.000Z"
}{
"status": "error",
"code": "NOT_FOUND",
"message": "404: Not Found - Transaction not found"
}/transactions payments.readListar transações
Lista as transações da sua conta (cobranças e saques), com paginação e filtros opcionais.
Parâmetros
startquerylimitquerystatusquerytypequerysearchqueryRequisição
curl -X GET "https://api.syntrapay.com.br/transactions?limit=50&status=PAID" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json"Resposta
200 OK{
"status": "success",
"total": 128,
"start": 1,
"limit": 50,
"count": 50,
"transactions": [
{
"id": "9c1e7b2a-3f4d-4a8b-bc12-5e6f7a8b9c0d",
"status": "PAID",
"type": "DEPOSIT",
"amount": 1490,
"fee": 44,
"createdAt": "2026-07-18T14:30:00.000Z"
}
]
}Saques (PIX)
Envie saques PIX e consulte o histórico. Aceita CPF, CNPJ, e-mail, telefone, chave aleatória (EVP) ou copia-e-cola.
/withdrawals withdrawals.createCriar saque
Realiza um saque via PIX para uma chave. O valor é em centavos e é descontado do seu saldo disponível junto com a taxa.
Parâmetros
pixKeybodyobrigatórioamountbodyobrigatóriodescriptionbodywebhookbodyIdempotency-KeyheaderCampos da resposta
idstatusamountpixKeypixKeyTypefeeRequisição
curl -X POST "https://api.syntrapay.com.br/withdrawals" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{"pixKey":"cliente@email.com","amount":5000}'Resposta
201 Created{
"message": "Withdraw request created successfully",
"status": "pending",
"id": "f1e2d3c4-b5a6-4789-9c0d-1a2b3c4d5e6f",
"amount": 5000,
"pixKey": "cliente@email.com",
"pixKeyType": "EMAIL",
"fee": 250
}{
"status": "error",
"code": "INSUFFICIENT_FUNDS",
"message": "400: Saldo insuficiente para realizar o saque"
}/withdrawals withdrawals.readListar saques
Lista os saques da sua conta, com paginação.
Parâmetros
startquerylimitqueryRequisição
curl -X GET "https://api.syntrapay.com.br/withdrawals" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json"Resposta
200 OK{
"status": "success",
"total": 12,
"start": 1,
"limit": 50,
"count": 12,
"withdrawals": [
{
"id": "f1e2d3c4-b5a6-4789-9c0d-1a2b3c4d5e6f",
"type": "WITHDRAWAL",
"status": "PAID",
"amount": 5000,
"fee": 250,
"payer": { "pixKey": "cliente@email.com", "pixKeyType": "EMAIL" },
"end_to_end": "E12345678202607181430...",
"createdAt": "2026-07-18T14:30:00.000Z",
"paidAt": "2026-07-18T14:30:20.000Z"
}
]
}/withdrawals/:id withdrawals.readConsultar saque
Consulta os detalhes e o status de um saque pelo seu ID.
Parâmetros
idpathobrigatórioCampos da resposta
idstatusamounttaxespixKeypixKeyTypereceiverpaidAtRequisição
curl -X GET "https://api.syntrapay.com.br/withdrawals/f1e2d3c4-b5a6-4789-9c0d-1a2b3c4d5e6f" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json"Resposta
201 Created{
"id": "f1e2d3c4-b5a6-4789-9c0d-1a2b3c4d5e6f",
"withdrawStatusId": "Successfull",
"status": "PAID",
"amount": 5000,
"taxes": 250,
"pixKey": "cliente@email.com",
"pixKeyType": "EMAIL",
"receiver": { "name": "Maria Souza", "document": "***.123.456-**" },
"paidAt": "2026-07-18T14:30:20.000Z"
}{
"status": "error",
"code": "NOT_FOUND",
"message": "404: Not Found - Withdrawal not found"
}Saldo
/balanceConsultar saldo
Consulta o saldo da sua conta: disponível, bloqueado, em análise (MED) e total. Não requer corpo na requisição.
Campos da resposta
balance_availablebalance_lockedbalance_infractionsnetBalanceRequisição
curl -X POST "https://api.syntrapay.com.br/balance" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json"Resposta
200 OK{
"codeStatus": 200,
"balance": {
"id": "usr_a1b2c3",
"balance": 1530.50,
"balance_available": 1530.50,
"balance_locked": 0,
"balance_infractions": 0,
"totalBalances": 8240.00,
"netBalance": 1530.50,
"fees": { "saque": 250 }
}
}MED: Infrações PIX
Consulte as infrações MED (Mecanismo Especial de Devolução) registradas nas suas transações. Valores em centavos.
/infractionsListar infrações
Lista as infrações MED da sua conta, com um resumo agregado e paginação por intervalo (from/to).
Parâmetros
fromquerytoquerystatusqueryCampos da resposta
summary.totalCountsummary.totalAmountsummary.waitingPspsummary.completeddata[].infractionIddata[].typedata[].statusdata[].endToEndIddata[].amountdata[].payerNamedata[].linkedTransactionIdRequisição
curl -X GET "https://api.syntrapay.com.br/infractions?from=0&to=10&status=all" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json"Resposta
200 OK{
"status": "success",
"summary": {
"totalCount": 3,
"totalAmount": 45000,
"waitingPsp": 1,
"completed": 2
},
"range": { "total": 3, "from": 0, "to": 10 },
"data": [
{
"infractionId": "inf_9a8b7c6d",
"type": "FRAUD",
"status": "WAITING_PSP",
"endToEndId": "E12345678202607181430...",
"reportedBy": "PACS",
"amount": 15000,
"currency": "BRL",
"creationDate": "2026-07-18T12:00:00.000Z",
"payerName": "João da Silva",
"linkedTransactionId": "9c1e7b2a-3f4d-4a8b-bc12-5e6f7a8b9c0d"
}
]
}Webhooks
Configure endpoints para receber eventos em tempo real. Ao criar, enviamos um POST de teste. Sua URL deve responder 200/201/202. Cada disparo inclui o header syntrapay-webhook-secret.
Eventos disponíveis
payment.approvedUma cobrança PIX foi paga e o valor creditado.payment.failedA cobrança falhou, expirou ou foi cancelada.transfer-approvedUm saque PIX foi concluído com sucesso.transfer-failedUm saque PIX falhou ou foi rejeitado.pix.infractionUma infração MED foi registrada em uma transação sua.Cada disparo inclui os headers syntrapay-signature (sha256=…), syntrapay-timestamp e syntrapay-webhook-secret. A assinatura é o HMAC-SHA256 de `${timestamp}.${corpo_bruto}` usando o signing secret do webhook: valide-a e rejeite timestamps antigos (replay).
Verificar a assinatura (Node.js)
import crypto from "crypto"
function verifyWebhook(rawBody, headers, secret) {
const ts = headers["syntrapay-timestamp"]
const sig = (headers["syntrapay-signature"] || "").replace("sha256=", "")
const expected = crypto
.createHmac("sha256", secret)
.update(ts + "." + rawBody) // HMAC de `${ts}.${corpo}`
.digest("hex")
const ok =
sig.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))
// Rejeite se !ok ou se |agora - ts| > 300s (replay)
const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300
return ok && fresh
}/webhooks webhooks.manageListar webhooks
Lista os webhooks da sua conta. O signing secret é retornado mascarado.
Requisição
curl -X GET "https://api.syntrapay.com.br/webhooks" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json"Resposta
200 OK{
"status": "success",
"webhooks": [
{
"id": "665fbe1c9a2d4e0012ab34cd",
"url": "https://seusite.com/webhooks/syntrapay",
"events": ["payment.approved", "payment.failed"],
"active": true,
"secret": "whsec_ab12...cd34",
"createdAt": "2026-07-01T10:00:00.000Z"
}
]
}/webhooks webhooks.manageCriar webhook
Cria um webhook. O signing secret completo é retornado apenas na criação (também pode ser revelado depois com sua senha no painel). Máximo de 10 webhooks por conta.
Parâmetros
urlbodyobrigatórioeventsbodyobrigatórioRequisição
curl -X POST "https://api.syntrapay.com.br/webhooks" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{"url":"https://seusite.com/webhooks/syntrapay","events":["payment.approved","payment.failed"]}'Resposta
201 Created{
"status": "success",
"webhook": {
"id": "665fbe1c9a2d4e0012ab34cd",
"url": "https://seusite.com/webhooks/syntrapay",
"events": ["payment.approved", "payment.failed"],
"active": true,
"secret": "a1b2c3...64-char-hex-secret",
"createdAt": "2026-07-18T10:00:00.000Z"
}
}{
"status": "error",
"code": "WEBHOOK_TEST_FAILED",
"message": "A URL não respondeu ao POST de teste."
}/webhooks webhooks.manageEditar webhook
Atualiza a URL, os eventos ou o status (ativo/inativo) de um webhook. Só os campos enviados são alterados.
Parâmetros
webhookIdbodyobrigatóriourlbodyeventsbodyactivebodyRequisição
curl -X PATCH "https://api.syntrapay.com.br/webhooks" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{"webhookId":"665fbe1c9a2d4e0012ab34cd","active":false}'Resposta
200 OK{
"status": "success",
"webhook": {
"id": "665fbe1c9a2d4e0012ab34cd",
"url": "https://seusite.com/webhooks/syntrapay",
"events": ["payment.approved", "payment.failed"],
"active": false,
"createdAt": "2026-07-01T10:00:00.000Z"
}
}/webhooks webhooks.manageRemover webhook
Remove um webhook permanentemente.
Parâmetros
webhookIdbodyobrigatórioRequisição
curl -X DELETE "https://api.syntrapay.com.br/webhooks" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{"webhookId":"665fbe1c9a2d4e0012ab34cd"}'Resposta
200 OK{
"status": "success",
"message": "Webhook removido com sucesso"
}Erros
Erros retornam um envelope consistente com status, code e message.
{
"status": "error",
"code": "BAD_REQUEST",
"message": "Descrição do erro em português."
}UNAUTHORIZED401Chave/token ausente ou inválido no header Authorization.ACCESS_FORBIDDEN200/403Sem permissão para acessar o recurso.FORBIDDEN_SCOPE403A chave de API não possui o escopo necessário para a ação.FORBIDDEN403Conta ainda não ativada.BAD_REQUEST400Parâmetros ausentes ou inválidos.INSUFFICIENT_FUNDS400Saldo insuficiente para o saque.INVALID_PIX_KEY400Chave PIX inválida ou não encontrada.TOO_MANY_REQUESTS429Limite de requisições atingido. Aguarde e tente novamente.NOT_FOUND404Recurso não encontrado.INTERNAL_ERROR500Erro interno do servidor.