DocumentaçãoReferência da API

    API PaySync

    Integre pagamentos PIX na sua aplicação em minutos. Simples, segura e feita para desenvolvedores.

    O que é a PaySync?

    A PaySync é um gateway de pagamento que simplifica cobranças PIX. Nossa API foi construída com foco em simplicidade: endpoints intuitivos, respostas consistentes e zero burocracia.

    Baseada em intenção

    Cada endpoint faz exatamente o que o nome diz

    Rápida

    PIX gerado em milissegundos, callback instantâneo

    Consistente

    Respostas padronizadas com error/data em toda a API

    Início rápido

    1. Crie uma API Key no painel
    2. Chame POST /v1/payments com o valor ou produto
    3. O cliente paga o PIX (brCode retornado)
    4. Receba o callback automático na sua URL
    Usando IA para integrar? Acesse a documentação otimizada para LLMs em usepaysync.com/llms-full.txt — formato plain text estruturado que modelos de linguagem interpretam perfeitamente.
    Exemplo rápido
    curl -X POST https://api.usepaysync.com/v1/payments \
      -H "Authorization: Bearer ps_live_sua_chave" \
      -H "Content-Type: application/json" \
      -d '{
        "productId": "665f1a2b3c4d5e6f7a8b9c0d",
        "callbackUrl": "https://seu-site.com/webhook"
      }'
    Resposta
    {
      "paymentId": "psa_a1b2c3d4e5f6...",
      "status": "pending",
      "amountCents": 2990,
      "pix": {
        "brCode": "00020126580014br.gov.bcb.pix...",
        "qrCodeImage": "https://api.openpix.com.br/..."
      },
      "expiresAt": "2026-03-18T12:30:00.000Z"
    }
    Comece aquiAutenticação

    Autenticação

    Todas as requisições exigem uma API Key no header Authorization.

    Terminal
    Authorization: Bearer ps_live_sua_chave_aqui

    Crie e gerencie suas chaves em Dashboard → API. Cada conta pode ter até 10 chaves ativas.

    Nunca exponha sua API key no frontend ou em repositórios públicos. Use apenas no backend (server-side).
    Comece aquiErros

    Erros

    A API retorna erros no formato JSON com o campo error:

    Terminal
    { "error": "Product not found or inactive" }
    CódigoSignificado
    400
    Parâmetro inválido ou ausente
    401
    API key inválida ou ausente
    404
    Recurso não encontrado
    429
    Rate limit excedido (120 req/min)
    502
    Falha no gateway de pagamento
    ProdutosCRUD

    Produtos

    Criar produto

    POST/v1/products

    Cria um produto que pode ser referenciado em pagamentos e assinaturas. Limite: 500 produtos por conta/ambiente.

    ParâmetroTipoDescrição
    namereq
    string
    Nome do produto (max 200)
    description
    string
    Descrição (max 500)
    priceCentsreq
    number
    Preço em centavos (min 100 = R$ 1,00)
    currency
    string
    Moeda (default BRL)
    metadata
    string
    JSON string com dados extras (max 2KB)
    Request
    curl -X POST https://api.usepaysync.com/v1/products \
      -H "Authorization: Bearer ps_live_..." \
      -H "Content-Type: application/json" \
      -d '{
        "name": "Plano Premium",
        "priceCents": 4990,
        "description": "Acesso mensal"
      }'
    Resposta (201)
    {
      "_id": "60f7b2a1c3e4d5f6a7b8c9d0",
      "name": "Plano Premium",
      "description": "Acesso mensal",
      "priceCents": 4990,
      "currency": "BRL",
      "active": true,
      "metadata": "{}",
      "createdAt": "2026-03-18T10:00:00.000Z"
    }

    Listar produtos

    GET/v1/products
    ParâmetroTipoDescrição
    includeInactive
    string
    Defina como "true" para incluir produtos inativos
    Resposta (200)
    {
      "products": [
        { "_id": "60f7...", "name": "Plano Premium", "priceCents": 4990, "currency": "BRL", "active": true, "createdAt": "..." }
      ]
    }

    Obter produto

    GET/v1/products/:id

    Retorna o produto individual com os mesmos campos da listagem.

    Atualizar produto

    PUT/v1/products/:id

    Todos os campos são opcionais. Envie apenas o que deseja alterar.

    ParâmetroTipoDescrição
    name
    string
    Novo nome (max 200)
    description
    string
    Nova descrição (max 500)
    priceCents
    number
    Novo preço em centavos (min 100)
    active
    boolean
    Ativar/desativar produto
    metadata
    string
    JSON string (max 2KB)

    Deletar produto

    DELETE/v1/products/:id
    Resposta (200)
    { "deleted": true }
    Pagamentos PIXReferência

    Pagamentos PIX

    Criar pagamento

    POST/v1/payments

    Cria um pagamento PIX. Vincule a um produto (productId) ou envie valor livre (valueCents).

    ParâmetroTipoDescrição
    productId
    string
    ID do produto (preço vem dele)
    valueCents
    number
    Valor em centavos (min 100) — se sem productId
    description
    string
    Descrição do pagamento
    callbackUrl
    string
    URL HTTPS para webhook quando pago
    customer.name
    string
    Nome do cliente
    customer.email
    string
    Email do cliente
    customer.externalId
    string
    ID externo no seu sistema
    metadata
    string
    JSON string com dados extras (max 2KB)
    Envie productId OU valueCents. Se ambos forem enviados, o preço do produto prevalece.
    Request
    curl -X POST https://api.usepaysync.com/v1/payments \
      -H "Authorization: Bearer ps_live_..." \
      -H "Content-Type: application/json" \
      -d '{
        "productId": "665f1a2b3c4d5e6f7a8b9c0d",
        "callbackUrl": "https://seu-site.com/webhook",
        "customer": {
          "name": "João Silva",
          "email": "joao@email.com"
        }
      }'
    Resposta (200)
    {
      "paymentId": "psa_a1b2c3d4e5f6...",
      "status": "pending",
      "amountCents": 4990,
      "currency": "BRL",
      "productName": "Produto Premium",
      "pix": {
        "brCode": "00020126580014br.gov.bcb.pix0136...",
        "qrCodeImage": "https://api.openpix.com.br/..."
      },
      "expiresAt": "2026-03-18T12:30:00.000Z"
    }
    O brCode é o PIX Copia e Cola. O qrCodeImage é a URL da imagem do QR Code. Pagamento expira em 30 minutos.

    Consultar pagamento

    GET/v1/payments/:paymentId

    Consulta o status de um pagamento pelo paymentId.

    Resposta
    {
      "paymentId": "psa_a1b2c3d4...",
      "status": "paid",
      "amountCents": 4990,
      "paidAt": "2026-03-18T12:05:00.000Z"
    }

    Status: pending · paid · expired · refunded

    Listar pagamentos

    GET/v1/payments
    ParâmetroTipoDescrição
    limit
    number
    Resultados por página (1-100, default 50)
    offset
    number
    Pular N resultados
    status
    string
    Filtrar: pending, paid, expired, refunded
    Resposta
    {
      "payments": [ ... ],
      "total": 42,
      "limit": 50,
      "offset": 0
    }
    Cobranças PIXReferência

    Cobranças PIX avulsas

    Criar cobrança

    POST/v1/charges

    Cria uma cobrança PIX avulsa com valor customizado, sem necessidade de produto cadastrado.

    ParâmetroTipoDescrição
    valueCentsreq
    number
    Valor em centavos (min 100)
    description
    string
    Descrição (max 200, default "Pagamento PIX")
    callbackUrl
    string
    URL HTTPS para webhook quando pago
    customer.name
    string
    Nome do cliente (max 100)
    customer.email
    string
    Email do cliente (max 255)
    customer.externalId
    string
    ID externo no seu sistema (max 200)
    metadata
    string
    JSON string com dados extras (max 2KB)
    Request
    curl -X POST https://api.usepaysync.com/v1/charges \
      -H "Authorization: Bearer ps_live_..." \
      -H "Content-Type: application/json" \
      -d '{
        "valueCents": 1200,
        "description": "Pagamento avulso",
        "callbackUrl": "https://seu-site.com/webhook"
      }'
    Resposta (201)
    {
      "paymentId": "psc_a1b2c3d4e5f6...",
      "status": "pending",
      "amountCents": 1200,
      "currency": "BRL",
      "environment": "live",
      "pix": {
        "brCode": "00020126580014br.gov.bcb.pix0136...",
        "qrCodeImage": "https://api.openpix.com.br/..."
      },
      "expiresAt": "2026-03-18T12:30:00.000Z"
    }
    O prefixo psc_ indica cobrança avulsa. psa_ indica pagamento vinculado a produto.

    Consultar cobrança

    GET/v1/charges/:paymentId

    Consulta o status de uma cobrança avulsa pelo paymentId.

    Resposta (200)
    {
      "paymentId": "psc_a1b2c3d4...",
      "status": "paid",
      "amountCents": 1200,
      "currency": "BRL",
      "description": "Pagamento avulso",
      "customer": { "name": "", "email": "", "externalId": "" },
      "metadata": "{}",
      "paidAt": "2026-03-18T12:05:00.000Z",
      "expiresAt": "2026-03-18T12:30:00.000Z",
      "createdAt": "2026-03-18T12:00:00.000Z"
    }
    Split ChargesDivisão automática no recebimento

    PIX dividido entre N contas

    Criar split charge

    POST/v1/split-charges

    Cria uma cobrança PIX que, ao ser paga, é automaticamente dividida entre múltiplos beneficiários (contas paysync já cadastradas). Útil para marketplaces, comissionamento e gestão de royalties.

    Validações rigorosas — rejeição imediata com HTTP 400 se quebradas:
    • splits: 2 a 10 beneficiários
    • Cada percentage: entre 0.01 e 99.99 (não aceita 0% nem 100% individual)
    • Soma das percentages: EXATAMENTE 100.00 (tolerância 0.01)
    • recipientEmail único por charge (sem duplicar)
    • Beneficiário deve ser conta paysync existente (validado por email)
    • Beneficiário não pode ser o dono da API key
    • amountCents: integer entre 80 (R$ 0.80) e 500.000 (R$ 5.000)
    ParâmetroTipoDescrição
    amountCentsreq
    number
    Valor total em centavos (80–500000)
    amount
    number
    Alternativa em reais decimais (use amountCents preferencialmente)
    splits[]req
    array
    Lista de 2-10 beneficiários
    splits[].recipientEmailreq
    string
    Email de uma conta paysync existente
    splits[].percentagereq
    number
    Percentual 0.01–99.99 (soma = 100)
    description
    string
    Descrição (max 200)
    callbackUrl
    string
    URL HTTPS para webhook quando pago
    customer.name
    string
    Nome do pagador (max 100, opcional)
    customer.email
    string
    Email do pagador (max 255, opcional)
    customer.externalId
    string
    ID externo (max 100, opcional)
    Request
    curl -X POST https://api.usepaysync.com/v1/split-charges \
      -H "Authorization: Bearer ps_live_..." \
      -H "Content-Type: application/json" \
      -d '{
        "amountCents": 10000,
        "description": "Venda compartilhada",
        "splits": [
          { "recipientEmail": "vendedor1@example.com", "percentage": 50 },
          { "recipientEmail": "vendedor2@example.com", "percentage": 50 }
        ],
        "customer": { "name": "Cliente", "email": "cliente@example.com" }
      }'
    Resposta (201)
    {
      "paymentId": "psplit_a1b2c3d4...",
      "status": "pending",
      "amountCents": 10000,
      "currency": "BRL",
      "environment": "live",
      "pix": {
        "brCode": "00020126360014BR.GOV.BCB.PIX...",
        "qrCodeImage": null
      },
      "splits": [
        { "recipientEmail": "ve***@example.com", "percentage": 50 },
        { "recipientEmail": "ve***@example.com", "percentage": 50 }
      ],
      "expiresAt": "2026-05-28T12:30:00.000Z"
    }
    LGPD — emails dos beneficiários são mascarados em todas as respostas (POST/GET/webhook). Internamente o paysync armazena o User ID + email pra audit, mas nunca expõe o endereço completo via API.

    Fluxo de pagamento:

    1. Você cria a split charge → recebe brCode (PIX copia-e-cola)
    2. Cliente paga o valor cheio (10000 cents = R$ 100,00)
    3. Paysync deduz a taxa do gateway do total (ex: 2% + R$ 0,50 = R$ 2,50)
    4. Valor líquido (R$ 97,50) é dividido conforme as percentages
    5. Cada beneficiário recebe na própria carteira paysync
    6. O último beneficiário recebe netCents - soma(outros) para garantir centavo exato
    Exemplo de arredondamento: charge R$ 100, líquido 9750 cents. Splits 33.33% / 33.33% / 33.34%:
    • A: floor(9750 × 0.3333) = 3249 cents (R$ 32,49)
    • B: floor(9750 × 0.3333) = 3249 cents (R$ 32,49)
    • C: 9750 − 3249 − 3249 = 3252 cents (R$ 32,52)
    Soma exata = 9750. Sem perda nem sobra.

    Consultar split charge

    GET/v1/split-charges/:paymentId

    Retorna o status atual + breakdown de cada split (valor creditado em centavos e timestamp).

    Resposta (200)
    {
      "paymentId": "psplit_a1b2c3d4...",
      "status": "paid",
      "amountCents": 10000,
      "gatewayFeeCents": 250,
      "netAmountCents": 9750,
      "currency": "BRL",
      "environment": "live",
      "pix": { "brCode": "..." },
      "splits": [
        {
          "recipientEmail": "ve***@example.com",
          "percentage": 50,
          "amountCents": 4875,
          "creditedAt": "2026-05-28T12:15:00.000Z"
        },
        {
          "recipientEmail": "ve***@example.com",
          "percentage": 50,
          "amountCents": 4875,
          "creditedAt": "2026-05-28T12:15:00.000Z"
        }
      ],
      "paidAt": "2026-05-28T12:15:00.000Z",
      "expiresAt": "2026-05-28T12:30:00.000Z",
      "createdAt": "2026-05-28T12:00:00.000Z"
    }

    Status values: pending | paid | expired | refunded | cancelled.

    Pagamentos CartãoStripe Checkout

    Pagamentos por Cartão

    Criar pagamento cartão

    POST/v1/card-payments

    Cria um pagamento por cartão de crédito via Stripe Checkout. O cliente é redirecionado para a página de checkout.

    Não disponível em modo sandbox. Requer Stripe configurado no servidor.
    ParâmetroTipoDescrição
    valueCentsreq
    number
    Valor em centavos (min 100)
    description
    string
    Descrição (max 200, default "Pagamento Cartao")
    callbackUrl
    string
    URL HTTPS para webhook quando pago
    customer.name
    string
    Nome do cliente (max 100)
    customer.email
    string
    Email do cliente (max 255)
    customer.externalId
    string
    ID externo (max 200)
    metadata
    string
    JSON string com dados extras (max 2KB)
    successUrl
    string
    URL de redirecionamento após pagamento
    cancelUrl
    string
    URL de redirecionamento ao cancelar
    Resposta (201)
    {
      "orderCode": "JUE7Y9MPSX",
      "status": "pending",
      "amountCents": 4990,
      "currency": "BRL",
      "checkoutUrl": "https://checkout.stripe.com/...",
      "expiresAt": "2026-03-18T12:30:00.000Z"
    }
    Redirecione o cliente para checkoutUrl. Use successUrl e cancelUrl para controlar a experiência pós-pagamento.

    Consultar pagamento cartão

    GET/v1/card-payments/:orderCode

    Consulta o status de um pagamento por cartão pelo orderCode.

    Resposta (200)
    {
      "orderCode": "JUE7Y9MPSX",
      "status": "paid",
      "amount": 49.90,
      "amountCents": 4990,
      "currency": "BRL",
      "description": "Pagamento Cartao",
      "checkoutUrl": null,
      "paidAt": "2026-03-18T12:05:00.000Z",
      "createdAt": "2026-03-18T12:00:00.000Z"
    }

    Status: pending · paid · expired · canceled

    Listar pagamentos cartão

    GET/v1/card-payments
    ParâmetroTipoDescrição
    limit
    number
    Resultados por página (1-100, default 50)
    offset
    number
    Pular N resultados
    status
    string
    Filtrar: pending, paid, expired, refunded, failed
    Resposta (200)
    {
      "payments": [
        { "orderCode": "JUE7Y9MPSX", "status": "paid", "amountCents": 4990, "paidAt": "...", "createdAt": "..." }
      ],
      "total": 10,
      "limit": 50,
      "offset": 0
    }
    AssinaturasPIX Recorrente

    Assinaturas

    Criar assinatura

    POST/v1/subscriptions

    Cria uma assinatura PIX recorrente vinculada a um produto. A cobrança é gerada automaticamente de acordo com a frequência escolhida.

    ParâmetroTipoDescrição
    productIdreq
    string
    ID do produto
    customer.namereq
    string
    Nome do assinante
    customer.externalId
    string
    ID externo no seu sistema (max 200)
    frequency
    string
    WEEKLY, MONTHLY (default), SEMIANNUALLY ou ANNUALLY
    dayGenerateCharge
    number
    Dia do mês para gerar cobrança (4-28)
    callbackUrl
    string
    URL HTTPS para webhook a cada pagamento
    metadata
    string
    JSON string com dados extras (max 2KB)
    Request
    curl -X POST https://api.usepaysync.com/v1/subscriptions \
      -H "Authorization: Bearer ps_live_..." \
      -H "Content-Type: application/json" \
      -d '{
        "productId": "665f1a2b3c4d5e6f7a8b9c0d",
        "customer": { "name": "João Silva" },
        "frequency": "MONTHLY",
        "dayGenerateCharge": 15,
        "callbackUrl": "https://seu-site.com/webhook"
      }'
    Resposta
    {
      "paymentId": "psa_sub_a1b2c3d4...",
      "status": "pending",
      "type": "subscription",
      "subscriptionId": "sub_xyz...",
      "amountCents": 4990,
      "currency": "BRL",
      "productName": "Plano Premium",
      "frequency": "MONTHLY",
      "environment": "live",
      "pix": {
        "brCode": "00020126580014br.gov.bcb.pix...",
        "paymentLinkUrl": "https://openpix.com.br/pay/..."
      },
      "dayGenerateCharge": 15
    }
    Frequências disponíveis: WEEKLY (semanal), MONTHLY (mensal, padrão), SEMIANNUALLY (semestral) e ANNUALLY (anual).

    Listar assinaturas

    GET/v1/subscriptions

    Retorna as assinaturas criadas na sua conta com paginação e filtros.

    ParâmetroTipoDescrição
    limit
    number
    Resultados por página (1-100, default 50)
    offset
    number
    Pular N resultados (paginação)
    status
    string
    Filtrar: pending, paid, expired, refunded
    Request
    curl -X GET "https://api.usepaysync.com/v1/subscriptions?limit=20&status=pending" \
      -H "Authorization: Bearer ps_live_..."
    Resposta
    {
      "subscriptions": [
        {
          "paymentId": "psa_sub_a1b2c3d4...",
          "subscriptionId": "sub_xyz...",
          "status": "pending",
          "amountCents": 4990,
          "currency": "BRL",
          "productName": "Plano Premium",
          "customer": { "name": "João Silva", "email": "", "externalId": "user_123" },
          "metadata": "{}",
          "paidAt": null,
          "createdAt": "2026-03-18T10:00:00.000Z"
        }
      ],
      "total": 5,
      "limit": 20,
      "offset": 0
    }

    Sandbox

    Ambiente de Teste

    Use uma API key ps_test_... para operar em sandbox. Nesse modo, pagamentos e cobranças são criados sem gateway real e você pode simular confirmação.

    Simular pagamento realizado

    POST/v1/sandbox/payments/:paymentId/simulate-paid

    Marca um pagamento sandbox como pago e dispara callback payment.paid (se callbackUrl foi configurado).

    Request
    curl -X POST https://api.usepaysync.com/v1/sandbox/payments/psa_abc123/simulate-paid \
      -H "Authorization: Bearer ps_test_..."
    Para cobranças avulsas, use POST /v1/sandbox/charges/:paymentId/simulate-paid.

    Sandbox carteira

    GET/v1/sandbox/wallet

    Retorna saldo disponível e pendente apenas das transações sandbox.

    Resposta
    {
      "sandbox": true,
      "availableCents": 12990,
      "pendingCents": 4990,
      "available": 129.9,
      "pending": 49.9
    }

    Sandbox transações

    GET/v1/sandbox/transactions
    ParâmetroTipoDescrição
    limit
    number
    Resultados por página (1-200, default 50)
    offset
    number
    Pular N resultados
    Resposta
    {
      "sandbox": true,
      "transactions": [
        {
          "paymentId": "psa_abc123",
          "source": "payment",
          "type": "one_time",
          "status": "paid",
          "amountCents": 4990
        }
      ],
      "total": 1,
      "limit": 50,
      "offset": 0
    }
    DisputasReferência

    Disputas

    Listar disputas

    GET/v1/disputes

    Retorna as disputas (MEDs) abertas contra sua conta. Use para monitorar contestações e enviar evidências.

    ParâmetroTipoDescrição
    limit
    number
    Resultados por página (1-100, default 50)
    offset
    number
    Pular N resultados (paginação)
    status
    string
    Filtrar: aberta, resolvida, perdida
    Request
    curl -X GET "https://api.usepaysync.com/v1/disputes?limit=20&status=aberta" \
      -H "Authorization: Bearer ps_live_..."
    Resposta
    {
      "disputes": [
        {
          "id": "665f1a2b3c4d5e6f7a8b9c0d",
          "code": "MED-2024-001",
          "wooviDisputeId": "abc123...",
          "endToEndId": "E123456782024...",
          "orderCode": "JUE7Y9MPSX",
          "buyer": "João Silva",
          "product": "Produto Premium",
          "amount": 23.07,
          "reason": "Produto não recebido",
          "status": "aberta",
          "evidences": [],
          "resolvedAt": null,
          "createdAt": "2026-03-18T10:00:00.000Z"
        }
      ],
      "total": 3,
      "limit": 50,
      "offset": 0
    }

    Status: aberta · resolvida · perdida

    Obter disputa

    GET/v1/disputes/:id

    Retorna detalhes de uma disputa pelo ID. Use o id retornado em listar disputas.

    ParâmetroTipoDescrição
    idreq
    string
    ID da disputa (path)
    Request
    curl -X GET https://api.usepaysync.com/v1/disputes/665f1a2b3c4d5e6f7a8b9c0d \
      -H "Authorization: Bearer ps_live_..."
    Resposta
    {
      "id": "665f1a2b3c4d5e6f7a8b9c0d",
      "code": "MED-2024-001",
      "wooviDisputeId": "abc123...",
      "endToEndId": "E123456782024...",
      "orderCode": "JUE7Y9MPSX",
      "buyer": "João Silva",
      "buyerDiscordId": "",
      "product": "Produto Premium",
      "amount": 23.07,
      "reason": "Produto não recebido",
      "status": "aberta",
      "evidences": [
        { "url": "https://...", "description": "Comprovante", "correlationID": "MED-2024-001-EV1" }
      ],
      "resolvedAt": null,
      "createdAt": "2026-03-18T10:00:00.000Z"
    }
    Se a disputa não pertencer à sua conta, a API retorna 404 Dispute not found.

    Enviar evidências

    POST/v1/disputes/:id/evidence

    Envia documentos como evidência para contestar uma disputa aberta. Apenas disputas com status aberta aceitam evidências.

    ParâmetroTipoDescrição
    idreq
    string
    ID da disputa (path)
    documents
    array
    Lista de documentos de evidência — até 10 itens
    textForPdf
    string
    Texto convertido em PDF e enviado como evidência (alternativa a documents)
    Request
    curl -X POST https://api.usepaysync.com/v1/disputes/665f1a2b3c4d5e6f7a8b9c0d/evidence \
      -H "Authorization: Bearer ps_live_..." \
      -H "Content-Type: application/json" \
      -d '{
        "documents": [
          {
            "url": "https://seu-site.com/comprovante.pdf",
            "description": "Comprovante de entrega",
            "correlationID": "MED-2024-001-EV1"
          }
        ],
        "textForPdf": "O cliente recebeu o produto em 15/03. Rastreio: BR123456789."
      }'
    Resposta (200)
    {
      "success": true,
      "uploaded": 2
    }
    URLs devem apontar diretamente para arquivos (PDF, PNG, JPEG, WebP). Links de páginas HTML (como prnt.sc) serão rejeitados pela operadora.
    SaquesSolicitar saque

    Pague-se via API

    Solicitar saque

    Solicita uma transferência do saldo disponível da loja. PIX cai pendente de aprovação admin; LTC envia direto após aprovação.

    POST/v1/payouts
    Rate limit: 10 requisições por hora por API key.
    PIX: a chave PIX deve estar pré-verificada no dashboard.
    ParâmetroTipoDescrição
    methodreq
    string
    "pix" ou "ltc"
    amountreq
    number
    Valor em BRL (min 5.00, max 999999.99)
    walletAddressreq
    string
    Chave PIX (PIX) ou endereço LTC (LTC)
    cryptoAmount
    number
    Quantidade em LTC (obrigatório quando method="ltc")
    cURL — Saque PIX
    curl -X POST https://api.usepaysync.com/v1/payouts \
      -H "Authorization: Bearer ps_live_<key>" \
      -H "Content-Type: application/json" \
      -d '{
        "method": "pix",
        "amount": 100.00,
        "walletAddress": "loja@email.com"
      }'
    Resposta (201)
    {
      "id": "SAQ-API-A1B2C3D4",
      "code": "SAQ-API-A1B2C3D4",
      "method": "pix",
      "amount": 100.00,
      "status": "pending",
      "sandbox": false
    }
    cURL — Saque LTC
    curl -X POST https://api.usepaysync.com/v1/payouts \
      -H "Authorization: Bearer ps_live_<key>" \
      -H "Content-Type: application/json" \
      -d '{
        "method": "ltc",
        "amount": 100.00,
        "cryptoAmount": 0.5,
        "walletAddress": "ltc1q..."
      }'
    Status do saque:
    • pending — aguardando aprovação admin
    • completed — pago
    • denied — negado
    Erros comuns:
    • 400 — Saldo insuficiente / valor fora do range / endereço LTC inválido
    • 403 — PIX não verificado (faça verificação no painel primeiro)
    • 429 — Rate limit excedido (10/hr)
    Segurança: a resposta NUNCA contém dados sensíveis (CPF, chave PIX completa). O walletAddress é mascarado em logs e respostas (12345***).

    Listar saques

    GET/v1/payouts
    ParâmetroTipoDescrição
    limit
    number
    Resultados (1-100, default 20)
    status
    string
    Filtrar: pendente, concluido, negado
    Resposta
    {
      "payouts": [
        {
          "id": "SAQ-API-A1B2C3D4",
          "code": "SAQ-API-A1B2C3D4",
          "method": "pix",
          "amount": 100.00,
          "cryptoAmount": null,
          "walletAddress": "12345***",
          "status": "pendente",
          "createdAt": "2026-04-27T12:00:00.000Z"
        }
      ]
    }
    walletAddress sempre vem mascarado (primeiros 6 chars + ***).
    WebhooksSegurança (HMAC)

    Webhooks

    Segurança & Assinatura HMAC

    Todo webhook que a gente envia (pagamento, cartão, pedido de loja, saque) vem assinado com HMAC-SHA256. A assinatura fica no header X-Webhook-Signature e é mandada sempre, sem flag de opt-in.

    Sua URL de callback é pública, então qualquer um na internet pode mandar um POST com status "paid". Valide a assinatura antes de tratar o evento como confirmado.

    Onde fica meu webhook secret?

    Cada loja tem um secret próprio. Você pega (ou regenera) em Dashboard → API & Desenvolvedores → Webhooks, ou via API:

    GET webhook secret
    GET https://api.usepaysync.com/api/developer/webhook-secret
    Authorization: Bearer <seu_token_dashboard>
    
    → { "secret": "whk_a1b2c3d4..." }
    Guarde no seu backend (variável de ambiente). Não exponha no front. Se vazar, regenere pelo dashboard; o antigo para de funcionar na hora.

    Como validar a assinatura

    Calcule o HMAC-SHA256 do corpo cru da requisição (a string exata do JSON recebido, antes de qualquer parse) usando seu secret como chave. Compare com o valor do header. Use comparação timing-safe pra evitar timing attacks.

    Node.js (Express)
    import crypto from "node:crypto";
    import express from "express";
    
    const app = express();
    
    // Importante: precisa do body cru. O JSON.parse vem depois da validação.
    app.post("/webhook", express.raw({ type: "application/json" }), (req, res) => {
      const signature = req.header("X-Webhook-Signature");
      const expected = crypto
        .createHmac("sha256", process.env.PAYSYNC_WEBHOOK_SECRET)
        .update(req.body)
        .digest("hex");
    
      // timing-safe compare
      const valid =
        signature &&
        signature.length === expected.length &&
        crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
    
      if (!valid) return res.status(401).send("invalid signature");
    
      const event = JSON.parse(req.body.toString());
      // ... processa event.event, event.paymentId, etc.
      res.json({ ok: true });
    });
    PHP
    <?php
    $payload = file_get_contents('php://input'); // body cru
    $signature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
    $secret = getenv('PAYSYNC_WEBHOOK_SECRET');
    $expected = hash_hmac('sha256', $payload, $secret);
    
    if (!hash_equals($expected, $signature)) {
      http_response_code(401);
      exit('invalid signature');
    }
    
    $event = json_decode($payload, true);
    // ... processa $event['event'], $event['paymentId'], etc.
    http_response_code(200);
    echo json_encode(['ok' => true]);
    Lojas antigas que ainda não regeneraram o secret usam um fallback derivado do userId com uma chave global. Recomendamos chamar o endpoint acima pra gerar o seu próprio.
    WebhooksCallback PIX

    Callback PIX (payment.paid / charge.paid)

    Quando o PIX é confirmado, a gente faz um POST pro callbackUrl que você passou na criação. O nome do evento depende do recurso: payment.paid pros Payment Links (/v1/payments) e charge.paid pras cobranças PIX diretas (/v1/charges).

    Payload (payment.paid)
    POST https://seu-site.com/webhook
    Content-Type: application/json
    X-Webhook-Signature: a3f5b8c2e1d4f7a9b6c8d2e5f1a4b7c9d2e5f8a1b4c7d0e3f6a9b2c5d8e1f4a7
    
    {
      "event": "payment.paid",
      "paymentId": "psa_a1b2c3d4...",
      "amountCents": 4990,
      "status": "paid",
      "paidAt": "2026-03-18T12:05:00.000Z",
      "customer": {
        "name": "João Silva",
        "email": "joao@email.com",
        "externalId": "user_123"
      },
      "metadata": "{\"orderId\": \"abc-123\"}"
    }
    Payload (charge.paid) com campos extras do acquirer
    {
      "event": "charge.paid",
      "paymentId": "psa_a1b2c3d4...",
      "amountCents": 4990,
      "status": "paid",
      "paidAt": "2026-03-18T12:05:00.000Z",
      "customer": { "name": "João Silva", "email": "joao@email.com" },
      "metadata": "{\"orderId\": \"abc-123\"}",
      "payer": "João Silva",
      "cpfCensored": "123.***.**1-23",
      "bank": "077 - Banco Inter",
      "endToEndId": "E1818773820260318120500abc12345"
    }
    O callback vai uma única vez (fire-and-forget, timeout de 5s). Não tem retry. Se sua URL responder com erro, faça GET /v1/payments/:paymentId pra conferir o status. O header X-Webhook-Signature está presente em todo callback; veja Segurança & HMAC pra validar.
    ParâmetroTipoDescrição
    eventreq
    string
    "payment.paid" ou "charge.paid"
    paymentIdreq
    string
    ID único do pagamento/cobrança
    amountCentsreq
    number
    Valor em centavos
    statusreq
    string
    "paid"
    paidAtreq
    string
    Data/hora ISO da confirmação
    customer
    object
    Dados do cliente (se informados na criação)
    metadata
    string
    JSON string enviado na criação
    payer
    string
    Nome do pagador (apenas charge.paid)
    cpfCensored
    string
    CPF censurado do pagador (apenas charge.paid)
    bank
    string
    Banco de origem do PIX (apenas charge.paid)
    endToEndId
    string
    End-to-end ID do Bacen (apenas charge.paid)
    WebhooksCallback Cartão

    Callback Cartão (card_payment.paid)

    Quando uma cobrança no cartão é confirmada (via Stripe), a gente faz POST pro callbackUrl da cobrança. Evento card_payment.paid. A shape difere um pouco do PIX: o valor vem em amount (reais, decimal), não em amountCents.

    Payload
    POST https://seu-site.com/webhook
    Content-Type: application/json
    X-Webhook-Signature: a3f5b8c2e1d4f7a9b6c8d2e5f1a4b7c9d2e5f8a1b4c7d0e3f6a9b2c5d8e1f4a7
    
    {
      "event": "card_payment.paid",
      "orderCode": "ORD-7K3B9X",
      "amount": 49.90,
      "status": "paid",
      "paidAt": "2026-03-18T12:05:00.000Z",
      "customer": { "name": "João Silva", "email": "joao@email.com" },
      "metadata": "{\"orderId\": \"abc-123\"}"
    }
    ParâmetroTipoDescrição
    eventreq
    string
    "card_payment.paid"
    orderCodereq
    string
    Código da cobrança no cartão
    amountreq
    number
    Valor em reais (não centavos)
    statusreq
    string
    "paid"
    paidAtreq
    string
    Data/hora ISO da confirmação
    customer
    object
    Dados do cliente (se informados)
    metadata
    string
    JSON string enviado na criação
    Mesmas garantias do callback PIX: assinatura HMAC, fire-and-forget, timeout 5s. Detalhes em Segurança & HMAC.
    WebhooksWebhook Pedido (Discord)

    Webhook Pedido (order.paid)

    Específico pra lojas no Discord (bot PaySync). Quando um pedido feito pelo bot é pago, a gente faz POST pra URL configurada na setting order_webhook_url. Útil pra sincronizar estoque ou CRM externo.

    Configure a URL em Dashboard → API & Desenvolvedores → Webhooks. Esse aqui é por loja, não por cobrança como o callback PIX. Vale pra todos os pedidos do bot.
    Payload
    POST https://seu-site.com/webhook
    Content-Type: application/json
    X-Webhook-Signature: a3f5b8c2e1d4f7a9b6c8d2e5f1a4b7c9d2e5f8a1b4c7d0e3f6a9b2c5d8e1f4a7
    
    {
      "event": "order.paid",
      "orderId": "665f1a2b3c4d5e6f7a8b9c0d",
      "orderCode": "ORD-7K3B9X",
      "total": 49.90,
      "paidAt": "2026-03-18T12:05:00.000Z",
      "acquirer": "cartwave"
    }
    ParâmetroTipoDescrição
    eventreq
    string
    "order.paid"
    orderIdreq
    string
    ID interno do pedido (ObjectId)
    orderCodereq
    string
    Código curto do pedido
    totalreq
    number
    Valor total em reais
    paidAtreq
    string
    Data/hora ISO da confirmação
    acquirerreq
    string
    Adquirente que processou (ex: cartwave)

    Webhook de Saques

    Quando um saque é solicitado, aprovado ou negado, enviamos um POST para a URL configurada na setting withdrawal_webhook_url.

    Configure a URL de webhook de saques em Dashboard → API & Desenvolvedores → Webhooks. Todos os eventos de saque serão enviados para a URL configurada.

    Saque solicitado

    Payload
    POST https://seu-site.com/webhook
    Content-Type: application/json
    X-Webhook-Signature: hmac_sha256_...
    
    {
      "event": "withdrawal.requested",
      "withdrawalId": "665f1a2b3c4d5e6f7a8b9c0d",
      "code": "SAQ-A1B2C3",
      "amount": 150.00,
      "method": "pix",
      "walletAddress": "email@exemplo.com",
      "status": "pendente",
      "requestedAt": "2026-03-18T14:00:00.000Z"
    }

    Saque aprovado

    Payload
    {
      "event": "withdrawal.completed",
      "withdrawalId": "665f1a2b3c4d5e6f7a8b9c0d",
      "code": "SAQ-A1B2C3",
      "amount": 150.00,
      "method": "pix",
      "walletAddress": "email@exemplo.com",
      "status": "concluido",
      "processedAt": "2026-03-18T15:30:00.000Z"
    }

    Saque negado

    Payload
    {
      "event": "withdrawal.denied",
      "withdrawalId": "665f1a2b3c4d5e6f7a8b9c0d",
      "code": "SAQ-A1B2C3",
      "amount": 150.00,
      "method": "pix",
      "walletAddress": "email@exemplo.com",
      "status": "negado",
      "processedAt": "2026-03-18T15:30:00.000Z"
    }
    ParâmetroTipoDescrição
    eventreq
    string
    "withdrawal.requested", "withdrawal.completed" ou "withdrawal.denied"
    withdrawalIdreq
    string
    ID único do saque
    codereq
    string
    Código do saque (ex: SAQ-A1B2C3)
    amountreq
    number
    Valor em reais
    methodreq
    string
    Método: pix, ltc, etc.
    walletAddressreq
    string
    Chave PIX ou endereço de destino
    statusreq
    string
    pendente, concluido ou negado
    requestedAt / processedAtreq
    string
    Data/hora ISO do evento
    Mesma garantia dos outros webhooks: header X-Webhook-Signature com HMAC-SHA256. Veja Segurança & HMAC pra exemplos de validação.

    Cookies & Privacidade

    Usamos cookies essenciais para o funcionamento do site e, com seu consentimento, cookies de análise para melhorar sua experiência.

    Ver detalhes