Documentação da API
Integre pagamentos PIX à sua aplicação com a API da SyntraPay. Cobranças, links de checkout prontos para vender, 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.links.readConsultar links de pagamento, métricas e checkouts.links.manageCriar, editar, duplicar, apagar e restaurar links de pagamento.Implementar com IA
Deixe a IA escrever a integração pra você. Escolha o que quer fazer e a linguagem: geramos um prompt com todo o contexto da API já embutido (endpoints, parâmetros, exemplos e regras). Copie e cole no seu assistente, ou abra direto no ChatGPT ou Claude.
Escolha a tarefa
Selecione o que quer construir e a sua linguagem.
Copie o prompt
Já vem com todo o contexto da API. Ou abra direto no ChatGPT/Claude.
Cole e rode
A IA devolve o código pronto. Ajuste sua chave e publique.
O que você quer fazer?
Linguagem
Você é um engenheiro de software sênior. Implemente uma integração com a API de pagamentos PIX da SyntraPay em Node.js (use o fetch nativo; se for API do Next.js, use Route Handlers em app/api).
OBJETIVO: criar uma cobrança PIX e mostrar o QR Code e o código copia-e-cola para o pagador.
CONTEXTO DA API:
- Base URL: https://api.syntrapay.com.br
- Autenticação: envie a chave no header "Authorization: sk_live_sua_chave_aqui" (SEM o prefixo Bearer).
- Todos os valores monetários são inteiros em centavos (ex.: 1490 = R$ 14,90).
- Requisições e respostas em JSON.
ENDPOINTS ENVOLVIDOS:
### Criar cobrança — POST /transactions
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.
Escopo necessário: payments.create
Parâmetros:
- amount (integer, obrigatório, em body): Valor em centavos (mín. 100 = R$ 1,00). Ex.: 1490 = R$ 14,90.
- webhook (string, em body): URL para notificar quando o pagamento for aprovado (sobrescreve o webhook global desta cobrança).
- split_email (string, em body): E-mail de outra conta SyntraPay para dividir o valor (split).
- split_tax (integer, em body): Percentual destinado ao parceiro no split (1 a 99, padrão 50).
- customer (object, em body): Dados do pagador para rastreio (name, document). Opcional.
- products (array, em body): Itens da venda, usados por integrações de tracking (ex.: Utmify).
- trackingParameters (object, em body): UTMs da campanha (utm_source, utm_medium, etc.).
- Idempotency-Key (string, em header): Chave única sua para evitar cobranças duplicadas em reenvios. A resposta é repetida por 24h para a mesma chave.
Exemplo de corpo: {"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"
}
REQUISITOS:
- Código pronto para produção, organizado e comentado em português.
- Trate erros pelo envelope { status, code, message } e pelos códigos HTTP retornados.
- Em requisições POST, envie um header "Idempotency-Key" único para evitar duplicidade em reenvios.
- Leia a chave de API de uma variável de ambiente (nunca deixe hardcoded).
- Ao final, mostre um exemplo de uso.
Se faltar alguma informação, me pergunte antes de assumir.Prefere entregar tudo de uma vez? Copie a referência inteira (auth, endpoints, exemplos, webhooks e erros) e cole no seu assistente ou agente de IA. Depois é só pedir qualquer integração, que ele já tem o contexto.
Funciona com ChatGPT, Claude, Cursor, GitHub Copilot, Windsurf e qualquer LLM que aceite contexto colado.
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 at least 100 cents (R$ 1,00)"
}/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"
}
]
}Checkout (links de pagamento)
Crie links de pagamento por API e receba sem escrever uma linha de front-end. Cada link vira uma página de checkout hospedada por nós, com o preço, as ofertas adicionais, a aparência e as regras que você definir. O preço vive no link: o comprador nunca envia valor.
Você cria o link
POST /payment-links com o título e o preço. A resposta traz o checkoutUrl.
O cliente paga
Ele abre a URL, preenche os dados e paga por PIX na página hospedada por nós.
Você é avisado
O saldo é creditado e o webhook payment.approved dispara com os dados da venda.
Endereço do checkout
https://pay.syntrapay.com.br/<publicId>
https://pay.syntrapay.com.br/<publicId>/<slug>O publicId é a identidade do link e nunca muda: use sempre o checkoutUrl devolvido pela API. O slug é apenas decorativo, pode ser alterado ou removido a qualquer momento, e os endereços já divulgados continuam abrindo.
Regras do checkout
O preço vive no link, nunca na requisição do comprador: não existe forma de pagar um valor diferente do configurado.
Criação é deduplicada: a mesma configuração enviada de novo em até 24 horas devolve o link existente (HTTP 200, deduplicated: true) em vez de criar outro. Para forçar um segundo link igual, envie allowDuplicate: true.
O checkout também deduplica: o mesmo comprador pedindo a mesma cotação (mesmo valor, quantidade e ofertas) reaproveita a cotação aberta, então ele nunca fica com dois PIX para a mesma compra.
Valor mínimo de R$ 1,00 por cobrança. O teto é o limite por depósito da sua conta, aplicado no momento do pagamento (se o limite mudar, os links já criados passam a respeitar o novo valor).
Até 200 links não arquivados por conta e até 3 ofertas adicionais por link.
O corpo da requisição é limitado a 64 KB. Escritas: 30 por minuto por conta; leituras: 120 por minuto.
A conta precisa estar ativada para criar ou duplicar links.
Chaves de API criadas antes destes escopos não os possuem: marque links.read e links.manage em Integrações → Credenciais, ou gere uma chave nova.
Imagens, vídeos e redirecionamentos passam por validação de segurança: use URLs públicas e https.
Objeto do link: campos aninhados
Todos são opcionais na criação e na edição, e cada um tem um padrão pronto para vender. Na edição, o que você não enviar permanece como está.
appearance: aparência do checkout
themestring: "light" ou "dark". Padrão: light.primaryColorstring: Cor dos botões e destaques no formato #RRGGBB. Padrão: #6D3BF5.buttonTextstring: Texto do botão de pagamento, até 40 caracteres. Padrão: "Pagar agora".summaryPositionstring: "above" ou "below": resumo do pedido acima ou abaixo dos dados do comprador.showStepsboolean: Exibe as etapas Dados › Pagamento › Entrega. Padrão: true.funnel: prova social
showOnlineCounterboolean: Exibe o contador de pessoas vendo a oferta agora.onlineCounterMininteger: Piso do contador (1 a 999). Padrão: 12.onlineCounterMaxinteger: Teto do contador (1 a 999, nunca menor que o piso). Padrão: 78.showCompanyWatermarkboolean: Exibe a assinatura da SyntraPay no rodapé. Padrão: true.showSecurityBadgeboolean: Exibe o selo de compra segura. Padrão: true.media: vídeo e banner
videoUrlstring: Endereço do vídeo no YouTube ou no Vimeo. Envie null para remover.videoProviderstring: Somente leitura: "youtube" ou "vimeo", detectado por nós.videoEmbedUrlstring: Somente leitura: URL de incorporação que geramos a partir do vídeo enviado.bannerUrlstring: Banner do topo do checkout (https). Recomendado 1200x300.socialProof: barra de prova social
imageUrlstring: Imagem da barra (https), normalmente prints de depoimentos.showOnCheckoutboolean: Exibe a barra na tela de checkout.showOnPaymentTopboolean: Exibe a barra no topo da tela de pagamento PIX.countdown: contador regressivo
enabledboolean: Liga o contador no topo do checkout.minutesinteger: Duração em minutos (1 a 1440). Padrão: 15.bgColorstring: Cor de fundo em #RRGGBB. Padrão: #111827.textColorstring: Cor do texto em #RRGGBB. Padrão: #FFFFFF.textAbovestring: Texto acima do relógio, até 80 caracteres.textBelowstring: Texto abaixo do relógio, até 80 caracteres.expiredTextstring: Texto exibido quando o tempo acaba, até 80 caracteres.pixScreen: tela de pagamento PIX
showGuaranteeboolean: Exibe o selo de garantia.guaranteeDaysinteger: Dias de garantia (1 a 365). Padrão: 7.showTimerboolean: Exibe o cronômetro de validade do PIX. Padrão: true.timerMinutesinteger: Minutos exibidos no cronômetro (1 a 1440). Padrão: 15.fields: dados pedidos ao comprador
nameobject: { visible, required }: nome do comprador.emailobject: Sempre visível e obrigatório. O cadastro do cliente e o e-mail de confirmação dependem dele, então o que for enviado aqui é ignorado.phoneobject: { visible, required }: telefone.documentobject: { visible, required }: CPF ou CNPJ.postPayment: depois do pagamento
redirectUrlstring: Para onde levar o comprador após pagar (https obrigatório). Só é entregue depois que o pagamento é confirmado.thankYouMessagestring: Mensagem da tela de obrigado, até 500 caracteres.sendCustomerEmailboolean: Envia o e-mail de confirmação da compra ao comprador. Padrão: true.orderBumps[]: ofertas adicionais (máximo 3)
idstring: Gerado por nós (bmp_…). Reenvie o id existente ao editar para preservar a oferta; um id desconhecido vira uma oferta nova.titlestring: Obrigatório. Até 80 caracteres.descriptionstring: Até 300 caracteres.imageUrlstring: Imagem da oferta (https).priceCentsinteger: Preço em centavos, mínimo 100. O teto é o limite por depósito da conta.activeboolean: Se a oferta aparece no checkout. Padrão: true.Venda pelo checkout no webhook
Uma venda feita por link dispara o mesmo evento payment.approved de qualquer cobrança, com dois campos a mais: origin igual a CHECKOUT_LINK e o objeto checkout, que diz qual link vendeu, o que foi comprado e quais ofertas adicionais entraram.
{
"id": "9c1e7b2a-3f4d-4a8b-bc12-5e6f7a8b9c0d",
"status": "PAID",
"amount": 24600,
"origin": "CHECKOUT_LINK",
"checkout": {
"paymentLinkId": "plk_7f3a91c25be04d18a6c3e07b",
"checkoutSessionId": "chs_5b2e91a7c40d38f6",
"customerId": "cus_3f81ba07d259",
"publicId": "k7m2p9qx",
"slug": "curso-completo",
"priceMode": "fixed",
"quantity": 1,
"unitPriceCents": 19700,
"baseCents": 19700,
"bumps": [{ "id": "bmp_9c41ab7d02e5", "title": "Mentoria em grupo", "priceCents": 4900 }],
"bumpsTotalCents": 4900
}
}/payment-links links.manageCriar link de pagamento
Cria o link e devolve a URL do checkout pronta para divulgar. Só title é obrigatório: todo o resto tem padrão. O link nasce ativo, a menos que você envie active: false. Reenviar a mesma configuração dentro de 24 horas não cria um link novo: devolvemos o que já existe, com HTTP 200 e deduplicated: true, para uma retentativa ou um clique duplo não encherem sua conta de links iguais.
Parâmetros
titlebodyobrigatóriodescriptionbodyimageUrlbodyslugbodypriceModebodypriceCentsbodyminPriceCentsbodymaxPriceCentsbodyallowQuantitybodymaxQuantitybodyorderBumpsbodyappearancebodyfunnelbodymediabodysocialProofbodycountdownbodypixScreenbodyfieldsbodypostPaymentbodyactivebodyexpiresAtbodymaxSalesbodyallowDuplicatebodyCampos da resposta
deduplicatedlink.idlink.publicIdlink.slugcheckoutUrllink.orderBumps[].idlink.salesCountlink.revenueCentsRequisição
curl -X POST "https://api.syntrapay.com.br/payment-links" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{"title":"Curso completo de PIX","description":"Acesso vitalício + comunidade.","slug":"curso-completo","priceMode":"fixed","priceCents":19700,"imageUrl":"https://cdn.seusite.com/curso.png","orderBumps":[{"title":"Mentoria em grupo","priceCents":4900}],"appearance":{"theme":"dark","primaryColor":"#6D3BF5","buttonText":"Quero garantir"},"postPayment":{"redirectUrl":"https://seusite.com/obrigado","sendCustomerEmail":true},"maxSales":100}'Resposta
201 Created{
"status": "success",
"link": {
"id": "plk_7f3a91c25be04d18a6c3e07b",
"publicId": "k7m2p9qx",
"slug": "curso-completo",
"active": true,
"archived": false,
"title": "Curso completo de PIX",
"description": "Acesso vitalício + comunidade.",
"imageUrl": "https://cdn.seusite.com/curso.png",
"priceMode": "fixed",
"priceCents": 19700,
"minPriceCents": 100,
"maxPriceCents": 100000,
"allowQuantity": false,
"maxQuantity": 1,
"orderBumps": [
{
"id": "bmp_9c41ab7d02e5",
"title": "Mentoria em grupo",
"description": "",
"imageUrl": null,
"priceCents": 4900,
"active": true
}
],
"appearance": {
"theme": "dark",
"primaryColor": "#6D3BF5",
"buttonText": "Quero garantir",
"summaryPosition": "above",
"showSteps": true
},
"funnel": {
"showOnlineCounter": false,
"onlineCounterMin": 12,
"onlineCounterMax": 78,
"showCompanyWatermark": true,
"showSecurityBadge": true
},
"media": {
"videoUrl": null,
"videoProvider": null,
"videoEmbedUrl": null,
"bannerUrl": null
},
"socialProof": {
"imageUrl": null,
"showOnCheckout": false,
"showOnPaymentTop": false
},
"countdown": {
"enabled": false,
"minutes": 15,
"bgColor": "#111827",
"textColor": "#FFFFFF",
"textAbove": "",
"textBelow": "",
"expiredText": ""
},
"pixScreen": {
"showGuarantee": false,
"guaranteeDays": 7,
"showTimer": true,
"timerMinutes": 15
},
"fields": {
"name": { "visible": true, "required": true },
"email": { "visible": true, "required": true },
"phone": { "visible": true, "required": true },
"document": { "visible": true, "required": true }
},
"postPayment": {
"redirectUrl": "https://seusite.com/obrigado",
"thankYouMessage": "Pagamento confirmado. Obrigado pela sua compra.",
"sendCustomerEmail": true
},
"expiresAt": null,
"maxSales": 100,
"salesCount": 0,
"revenueCents": 0,
"viewCount": 0,
"sessionCount": 0,
"createdAt": "2026-07-25T13:20:00.000Z",
"updatedAt": "2026-07-25T13:20:00.000Z"
},
"checkoutUrl": "https://pay.syntrapay.com.br/k7m2p9qx/curso-completo"
}{
"status": "error",
"code": "VALIDATION_ERROR",
"message": "O preço não pode passar de R$ 1.000,00, o limite por depósito da sua conta.",
"field": "priceCents"
}/payment-links links.readListar links
Lista os links da sua conta com paginação, filtro por situação e busca por título, slug ou publicId. Cada item traz um resumo com métricas e a URL do checkout.
Parâmetros
pagequerylimitquerystatusquerysearchqueryCampos da resposta
links[]paginationlimits.minAmountCentslimits.maxAmountCentsRequisição
curl -X GET "https://api.syntrapay.com.br/payment-links?page=1&limit=20&status=active" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json"Resposta
200 OK{
"status": "success",
"links": [
{
"id": "plk_7f3a91c25be04d18a6c3e07b",
"publicId": "k7m2p9qx",
"slug": "curso-completo",
"title": "Curso completo de PIX",
"imageUrl": "https://cdn.seusite.com/curso.png",
"active": true,
"archived": false,
"priceMode": "fixed",
"priceCents": 19700,
"salesCount": 42,
"revenueCents": 827400,
"viewCount": 1890,
"sessionCount": 310,
"maxSales": 100,
"expiresAt": null,
"createdAt": "2026-07-25T13:20:00.000Z",
"checkoutUrl": "https://pay.syntrapay.com.br/k7m2p9qx/curso-completo"
}
],
"pagination": { "page": 1, "limit": 20, "total": 1, "totalPages": 1 },
"limits": { "minAmountCents": 100, "maxAmountCents": 100000 }
}/payment-links/detail links.readConsultar link
Retorna o objeto completo do link (todas as configurações), a URL do checkout, os limites de valor da conta e as métricas consolidadas.
Parâmetros
idqueryobrigatórioCampos da resposta
linkcheckoutUrllimits.priceAboveLimitstats.conversionRateRequisição
curl -X GET "https://api.syntrapay.com.br/payment-links/detail?id=plk_7f3a91c25be04d18a6c3e07b" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json"Resposta
200 OK{
"status": "success",
"link": { "id": "plk_7f3a91c25be04d18a6c3e07b", "publicId": "k7m2p9qx", "title": "Curso completo de PIX", "priceCents": 19700, "active": true },
"checkoutUrl": "https://pay.syntrapay.com.br/k7m2p9qx/curso-completo",
"limits": {
"minAmountCents": 100,
"maxAmountCents": 100000,
"priceAboveLimit": false
},
"stats": {
"salesCount": 42,
"revenueCents": 827400,
"viewCount": 1890,
"sessionCount": 310,
"conversionRate": 13.55
}
}{
"status": "error",
"code": "NOT_FOUND",
"message": "Link não encontrado."
}/payment-links links.manageEditar link
Atualiza um link existente. Envie apenas o que mudou: campos ausentes permanecem como estão. Objetos aninhados (appearance, countdown, fields…) são mesclados campo a campo; orderBumps, quando enviado, substitui a lista inteira. id, publicId, datas e métricas são imutáveis e ignorados se enviados.
Parâmetros
idbodyobrigatóriotitlebodypriceCentsbodyslugbodyorderBumpsbodyactivebody…bodyRequisição
curl -X PATCH "https://api.syntrapay.com.br/payment-links" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{"id":"plk_7f3a91c25be04d18a6c3e07b","priceCents":14700,"appearance":{"buttonText":"Comprar com desconto"}}'Resposta
200 OK{
"status": "success",
"link": { "id": "plk_7f3a91c25be04d18a6c3e07b", "publicId": "k7m2p9qx", "priceCents": 14700, "appearance": { "theme": "dark", "primaryColor": "#6D3BF5", "buttonText": "Comprar com desconto", "summaryPosition": "above", "showSteps": true } },
"checkoutUrl": "https://pay.syntrapay.com.br/k7m2p9qx/curso-completo",
"message": "Link atualizado com sucesso."
}{
"status": "error",
"code": "VALIDATION_ERROR",
"message": "Use apenas letras minúsculas, números e hífen, de 3 a 48 caracteres.",
"field": "slug"
}/payment-links/toggle links.manageAtivar ou desativar link
Liga ou desliga a venda pelo link sem mexer no resto da configuração. O campo active é obrigatório e explícito: não existe alternância automática. Links arquivados não são reativados por aqui.
Parâmetros
idbodyobrigatórioactivebodyobrigatórioRequisição
curl -X POST "https://api.syntrapay.com.br/payment-links/toggle" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{"id":"plk_7f3a91c25be04d18a6c3e07b","active":false}'Resposta
200 OK{
"status": "success",
"link": { "id": "plk_7f3a91c25be04d18a6c3e07b", "active": false },
"checkoutUrl": "https://pay.syntrapay.com.br/k7m2p9qx/curso-completo",
"message": "Link desativado com sucesso."
}/payment-links/duplicate links.manageDuplicar link
Cria uma cópia de um link existente com toda a configuração, porém com métricas zeradas, ids novos nas ofertas adicionais e um publicId próprio. A cópia nasce inativa para você revisar o preço antes de divulgar.
Parâmetros
idbodyobrigatóriotitlebodyslugbodyRequisição
curl -X POST "https://api.syntrapay.com.br/payment-links/duplicate" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{"id":"plk_7f3a91c25be04d18a6c3e07b","title":"Curso completo de PIX Black Friday"}'Resposta
201 Created{
"status": "success",
"link": {
"id": "plk_1d0c4b8fa72e46539ab1c250",
"publicId": "t4hq8znd",
"slug": "curso-completo-black-friday",
"active": false,
"title": "Curso completo de PIX Black Friday",
"priceCents": 19700,
"salesCount": 0,
"revenueCents": 0
},
"checkoutUrl": "https://pay.syntrapay.com.br/t4hq8znd/curso-completo-black-friday",
"message": "Link duplicado com sucesso."
}/payment-links links.manageApagar link
Apaga o link: ele para de vender na hora, sai da listagem padrão e a URL do checkout deixa de abrir. O registro é mantido arquivado porque as vendas já realizadas apontam para ele, e apagá-lo de vez quebraria seu histórico e seus relatórios. Para trazê-lo de volta, use Restaurar link.
Parâmetros
idbodyobrigatórioRequisição
curl -X DELETE "https://api.syntrapay.com.br/payment-links" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{"id":"plk_7f3a91c25be04d18a6c3e07b"}'Resposta
200 OK{
"status": "success",
"message": "Link arquivado com sucesso."
}{
"status": "error",
"code": "NOT_FOUND",
"message": "Link não encontrado."
}/payment-links/restore links.manageRestaurar link
Desfaz o apagamento e devolve o link à listagem, preservando o publicId (as URLs já divulgadas voltam a funcionar). Ele retorna inativo: ative-o quando quiser voltar a vender.
Parâmetros
idbodyobrigatórioRequisição
curl -X POST "https://api.syntrapay.com.br/payment-links/restore" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{"id":"plk_7f3a91c25be04d18a6c3e07b"}'Resposta
200 OK{
"status": "success",
"link": { "id": "plk_7f3a91c25be04d18a6c3e07b", "publicId": "k7m2p9qx", "active": false, "archived": false },
"checkoutUrl": "https://pay.syntrapay.com.br/k7m2p9qx/curso-completo",
"message": "Link restaurado. Ative-o para voltar a vender."
}{
"status": "error",
"code": "NOT_ARCHIVED",
"message": "Este link não está arquivado."
}/payment-links/stats links.readEstatísticas do link
Funil completo do link: visitas, checkouts iniciados, PIX aguardando pagamento, pagos, expirados, cancelados, abandonos, ticket médio e taxas de conversão.
Parâmetros
idqueryobrigatórioCampos da resposta
stats.sessionRatestats.conversionRatestats.overallConversionRatestats.abandonedCountstats.averageTicketCentsRequisição
curl -X GET "https://api.syntrapay.com.br/payment-links/stats?id=plk_7f3a91c25be04d18a6c3e07b" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json"Resposta
200 OK{
"status": "success",
"stats": {
"viewCount": 1890,
"sessionCount": 310,
"startedCount": 120,
"awaitingPaymentCount": 18,
"paidCount": 42,
"expiredCount": 108,
"canceledCount": 22,
"abandonedCount": 228,
"salesCount": 42,
"revenueCents": 827400,
"averageTicketCents": 19700,
"sessionRate": 16.4,
"conversionRate": 13.55,
"overallConversionRate": 2.22
}
}/payment-links/sessions links.readListar checkouts do link
Lista os checkouts iniciados no link, pagos ou não. Serve para recuperar carrinho abandonado e para conciliar cada venda com a transação que a liquidou.
Parâmetros
idqueryobrigatóriostatusquerypagequerylimitqueryCampos da resposta
sessions[].statussessions[].amountCentssessions[].transactionIdsessions[].buyerEmailRequisição
curl -X GET "https://api.syntrapay.com.br/payment-links/sessions?id=plk_7f3a91c25be04d18a6c3e07b&status=AWAITING_PAYMENT" \
-H "Authorization: sk_live_sua_chave_aqui" \
-H "Content-Type: application/json"Resposta
200 OK{
"status": "success",
"sessions": [
{
"id": "chs_5b2e91a7c40d38f6",
"status": "AWAITING_PAYMENT",
"amountCents": 24600,
"quantity": 1,
"bumpsTotalCents": 4900,
"transactionId": "9c1e7b2a-3f4d-4a8b-bc12-5e6f7a8b9c0d",
"customerId": null,
"buyerName": "João da Silva",
"buyerEmail": "joao@email.com",
"createdAt": "2026-07-25T14:02:00.000Z",
"paidAt": null
}
],
"pagination": { "page": 1, "limit": 20, "total": 1, "totalPages": 1 }
}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.VALIDATION_ERROR400Campo de link de pagamento fora das regras. A resposta traz field com o campo exato.INVALID_URL400URL de imagem, banner ou redirecionamento recusada. Use um endereço público https.TOO_MANY_BUMPS400Mais de 3 ofertas adicionais no mesmo link.LINK_LIMIT_REACHED400Limite de 200 links não arquivados por conta atingido.NOT_ARCHIVED400Tentativa de restaurar um link que não está arquivado.INSUFFICIENT_FUNDS400Saldo insuficiente para o saque.INVALID_PIX_KEY400Chave PIX inválida ou não encontrada.PAYLOAD_TOO_LARGE413Corpo da requisição acima de 64 KB.RATE_LIMIT_EXCEEDED429Muitas escritas ou leituras de link em pouco tempo.TOO_MANY_REQUESTS429Limite de requisições atingido. Aguarde e tente novamente.NOT_FOUND404Recurso não encontrado.SERVICE_UNAVAILABLE503Não foi possível gerar o endereço do checkout agora. Tente novamente.INTERNAL_ERROR500Erro interno do servidor.