Tudo que o painel faz está disponível pela API: cobrar em cartão, PIX e boleto, dividir com subcontas, consultar saldo, antecipar recebíveis e transferir. Comece pela chave de teste — os payloads são idênticos aos de produção.
Passe estes endereços ao seu assistente de código em vez de colar trechos avulsos — eles descrevem a API inteira e são gerados a cada release, então não ficam para trás da produção:
/llms.txt — índice da documentação
/llms-full.txt — documentação completa em um arquivo
A API da TrustPay é REST, aceita e devolve JSON em UTF-8 e usa os verbos e códigos HTTP padrão. Tudo que o painel faz — cobrar, consultar saldo, sacar, gerenciar subcontas — está disponível pela API com as mesmas regras.
Item
Valor
Base URL
https://api.trustand.com.br/api/v1
Formato
JSON UTF-8
Valores monetários
Reais com até 2 casas decimais — 149.90
Datas
ISO 8601 em UTC — 2026-07-19T14:32:07.412Z
Autenticação
Header X-API-Key ou Authorization: Bearer
Rotas de negócio são escopadas ao seu merchant: o caminho sempre começa com /merchants/{merchantId}/…. O merchant da rota é autoritativo — o corpo da requisição nunca decide de qual conta é a operação.
Começando
Autenticação
Há duas credenciais, para dois usos diferentes: API key para integração servidor-a-servidor, e sessão de usuário (JWT, login + MFA) para o que só uma pessoa faz.
Método
Header
Uso
API key live
X-API-Key: gk_live_…
Produção, servidor-a-servidor. Abre as rotas de integração da conta (cobranças, clientes, transferências, recorrência, links, relatórios, comprovantes, extrato) — não as rotas de sessão abaixo.
API key test
X-API-Key: gk_test_…
Sandbox: mesmos endpoints, dados isolados, adquirente sempre simulado.
Sessão de usuário (JWT)
Authorization: Bearer …
Pessoa logada no painel (login + MFA). Access token dura 15 min; renove com o refresh token. Abre todas as rotas da conta.
Nunca exponha a chave live no navegadorA API key cobra, estorna e transfere em nome da conta. Ela deve viver apenas no seu servidor, em variável de ambiente. Se vazar, revogue imediatamente em Configurações → API Keys.
Qual credencial abre cada rota
Toda rota de negócio aceita sessão de usuário. A chave de API abre as rotas de integração e é recusada com 401 nas rotas que a plataforma trata como ato de pessoa: quem pede saque, cadastra o endpoint que recebe os eventos de dinheiro, abre disputa ou muda quem tem acesso à conta é um usuário identificado, com MFA, e a trilha registra quem foi.
Integração servidor-a-servidor que precise de uma rota de sessão usa um usuário próprio da equipe, com o papel mínimo, e guarda o refresh token como guarda a chave. O SDK Node cobre só as rotas de chave de API.
Criando uma API key
A criação exige um JWT de usuário Administrador. A chave é exibida uma única vez na resposta — guarde-a no momento em que criar, porque não há como recuperá-la depois.
A chave é sua, e a TrustPay nunca a enviaChaves são geradas por você — no painel, em Configurações → API Keys, ou por esta rota. A TrustPay não envia chaves por e-mail, WhatsApp ou telefone: guardamos apenas o hash, então nem nós conseguimos recuperá-las. Perdeu uma? Gere outra e revogue a anterior. Conta ainda em onboarding recebe 403 aqui — nem chave de teste — até ficar ativa, o que exige o credenciamento aprovado e a conta de recebimento aberta no banco parceiro. Já rotate funciona sempre para o dono da conta: é o caminho para trocar uma chave comprometida. Pela inspeção da conta-mãe, rotate devolve 403.
POST/merchants/{merchantId}/api-keys
Emite uma nova chave de API para a conta.
Corpo da requisição
name
stringobrigatório
Identificação da chave (ex.: "Servidor de produção").
mode
"live" | "test"
Padrão live. Chaves de teste operam no sandbox.
X-Step-Up-Token (header)
string
Chave de produção e rotate pedem um passe do autenticador: troque o código de 6 dígitos por ele em POST /auth/step-up com { code, act: "api_key_live", subject: merchantId } (vale 3 minutos, um ato). Sem ele: 403 com code: "step_up_required". Chave de teste não pede.
Requisição
curl -X POST https://api.trustand.com.br/api/v1/merchants/{merchantId}/api-keys \
-H "Authorization: Bearer $JWT" \
-H "X-Step-Up-Token: eyJ..." \
-H "Content-Type: application/json" \
-d '{"name":"Servidor de produção"}'
Resposta 201
{
"id":"b2f1…",
"name":"Servidor de produção",
"key":"gk_live_9f2a…",
"mode":"live",
"createdAt":"2026-07-19T12:00:00.000Z"
}
GET/merchants/{merchantId}/api-keys
Lista as chaves (sem o valor secreto). Sessão de usuário, como as demais desta família.
Gera um novo segredo e invalida o anterior (30/min). Fechada à conta-mãe.
Login de usuário e MFA
O login nunca devolve tokens diretamente: o segundo fator é obrigatório para todos os usuários. Com MFA ativo, o login retorna { mfaRequired, mfaToken } e você conclui em POST /auth/mfa/verify. Sem MFA, retorna { mfaSetupRequired, mfaSetupToken } e o usuário se inscreve no próprio fluxo de login.
POST/auth/email-verification
Antes do cadastro: manda um código de 6 dígitos ao e-mail (5/min). POST /auth/email-verification/confirm confirma.
POST/auth/register
Cria a credencial — só com e-mail confirmado. Senha: 8+ com maiúscula e caractere especial. Devolve mfaSetupToken, não tokens.
POST/auth/login
Passo 1. Devolve mfaToken ou mfaSetupToken.
POST/auth/mfa/verify
Passo 2 com o código TOTP de 6 dígitos → tokens.
POST/auth/mfa/enroll
Inscrição: devolve segredo + URI para o QR Code.
POST/auth/refresh
Renova o par de tokens (aceita corpo ou cookie httpOnly).
GET/auth/me
Perfil do usuário logado e o merchantId da conta.
POST/auth/password-reset/request
Esqueci a senha: envia link de uso único por e-mail (30 min). Resposta sempre genérica.
POST/auth/password-reset/confirm
Conclui com token + senha nova; conta com MFA exige mfaCode. Revoga todas as sessões.
Começando
Teste e produção
O sandbox não é um servidor separado: são os mesmos endpoints, discriminados pela chave que você usa.
Uma chave gk_test_ opera em modo teste — os dados nascem com livemode: false, ficam isolados da operação real e o adquirente de cartão é sempre o simulado, mesmo que haja um adquirente real configurado. Nada criado em modo teste aparece para a chave live nem toca o saldo real.
Integre primeiro com a chave de testeRode o fluxo inteiro no sandbox — cobrança, webhook, estorno, conciliação — antes de trocar uma única variável de ambiente para gk_live_. Os payloads são idênticos.
Começando
Primeira cobrança
Do zero a um pagamento aprovado em três chamadas. O exemplo usa cartão; PIX e boleto são ainda mais curtos.
1. Tokenize o cartão
O número do cartão nunca deve trafegar pela sua aplicação nem ser armazenado. Troque-o por um token de uso único, válido por 15 minutos.
1 — tokenização
curl -X POST https://api.trustand.com.br/api/v1/merchants/{merchantId}/card-tokens \
curl -X POST https://api.trustand.com.br/api/v1/merchants/{merchantId}/payments \
-H "X-API-Key: $TRUSTPAY_KEY" \
-H "Idempotency-Key: pedido-10432" \
-H "Content-Type: application/json" \
-d '{
"amount": 149.90,
"paymentMethod": "credit_card",
"cardToken": "tok_…",
"installments": 1
}'
# → { "id": "pay_…", "status": "authorized", … }
3. Capture
A autorização reserva o limite; a captura é o que efetivamente cobra e gera o recebível na sua agenda — o valor líquido entra em pending e liquida em D+32 (prazo do adquirente), não no saldo disponível na hora.
3 — captura
curl -X POST https://api.trustand.com.br/api/v1/merchants/{merchantId}/payments/pay_…/capture \
-H "X-API-Key: $TRUSTPAY_KEY"
# → { "id": "pay_…", "status": "paid", … }
Próximo passo obrigatórioConfigure um webhook. Consultar o status por polling funciona, mas eventos assíncronos — PIX liquidado, boleto pago, chargeback aberto — só chegam por webhook.
Fundamentos
Erros
Erros usam os códigos HTTP padrão e sempre trazem um corpo JSON com a mesma forma.
Corpo de erro
{
"statusCode":422,
"message":"Saldo insuficiente para a transferência",
"error":"Unprocessable Entity"
}
Código
Significado típico
400
Payload inválido — falhou a validação de campos.
401
Token ou chave ausente, inválida ou revogada.
403
Sem permissão RBAC, ou o recurso é de outro tenant.
404
Recurso não existe (ou não pertence à sua conta).
409
Conflito de estado — ex.: capturar um pagamento já capturado.
422
Regra de negócio — saldo insuficiente, chave PIX inválida, split acima de 100%.
429
Rate limit excedido — aplique retry com backoff.
400 e 422 não são a mesma coisa400 significa que a requisição está malformada e repetir não vai adiantar. 422 significa que a requisição é válida mas o estado da conta não permite a operação agora — pode fazer sentido tentar de novo mais tarde.
Fundamentos
Idempotência
Timeout de rede não significa que a operação falhou. A idempotência garante que reenviar a mesma requisição não cobra o cliente duas vezes.
Envie o header Idempotency-Key com um valor único seu (o ID do pedido serve bem) em qualquer POST. A primeira resposta é armazenada e as repetições com o mesmo payload recebem a resposta original de volta, sem executar nada.
Situação
Resultado
Mesma chave, mesmo payload
Replay: devolve a resposta original. Nada é executado de novo.
Mesma chave, payload diferente
409 Conflict — a chave já pertence a outra operação.
Mesma chave, ainda processando
409 Conflict — aguarde e consulte o recurso.
Reenvio seguro
# A mesma chave em duas chamadas idênticas cobra UMA vez.
curl -X POST https://api.trustand.com.br/api/v1/merchants/{merchantId}/payments \
-H "X-API-Key: $TRUSTPAY_KEY" \
-H "Idempotency-Key: pedido-10432" \
-d '{"amount":149.90,"paymentMethod":"pix"}'
Além do header universal, POST /payments e POST /transfers também aceitam idempotencyKey dentro do corpo.
Fundamentos
Paginação e filtros
Toda listagem compartilha a mesma base de parâmetros, e cada recurso acrescenta os seus.
Parâmetro
Descrição
page
Página, começando em 1.
limit
Itens por página. Máximo 100.
status
Filtra pelo status do recurso.
createdFrom / createdTo
Intervalo de criação em ISO 8601 — 2026-07-01 ou com hora.
amountFrom / amountTo
Faixa de valor em reais, inclusiva.
Filtros específicos por recurso
Recurso
Parâmetros extras
GET /ledger
eventType, action=credit|debit. A faixa de valor incide sobre o líquido.
GET /payments
paymentMethod, customerId, search (ID ou referência da adquirente).
GET /transactions
method=card|pix|boleto, kind=charge (só cobrança emitida: PIX e boleto), status normalizado, search (ID, referência, E2E, linha digitável ou nome/documento do pagador), dueFrom/dueTo.
GET /transfers
method=pix|ted, search (favorecido, documento, chave PIX ou end-to-end ID).
GET /pix/transactions
customerId
GET /boletos
dueFrom / dueTo — data de vencimento.
GET /receivables
dueFrom / dueTo; faixa de valor sobre o líquido.
GET /subscriptions
planId, customerId.
GET /payment-links
search
GET /customers
search, name, email.
Fundamentos
Rate limits
Os limites são por IP. Requisição com chave de API bem formada tem teto global maior; rotas sensíveis apertam com limite próprio.
Upload de documento de KYC (POST /kyc/documents, POST /subaccounts/{sid}/kyc-documents)
10 req/min
POST /subaccount-invites
20 req/min
Onboarding público — POST /onboarding/email-verification
5 req/min
Onboarding público — /email-verification/confirm, GET /cnpj/{cnpj}, POST /applications
10 req/min
Onboarding público — GET /onboarding/invite/{token}
20 req/min
Checkout público — GET /pay/links/{slug}
60 req/min
Checkout público — POST /pay/links/{slug}/coupon
20 req/min
Checkout público — POST /pay/links/{slug}/checkout
10 req/min
Ao exceder, a resposta é 429 Too Many Requests. Implemente retry com backoff exponencial — e combine com idempotência para que a retentativa seja segura.
Receber
Pagamentos com cartão
O ciclo é autorizar → capturar. A autorização reserva o limite do portador; a captura cobra de fato e gera os recebíveis na sua agenda de liquidação.
Status possíveis: created → authorized → paid → partially_refunded → refunded, ou os terminais declined, blocked_fraud e cancelled.
POST/merchants/{merchantId}/card-tokens
Troca os dados do cartão por um token de uso único, válido por 15 minutos. O PAN nunca é armazenado.
Confirma a autorização e gera os recebíveis. Só depois da captura o dinheiro entra na sua agenda.
Parâmetros de rota
id
stringobrigatório
ID do pagamento autorizado.
POST/merchants/{merchantId}/payments/{id}/refund
Estorna total ou parcialmente. Estornos parciais são cumulativos até o valor capturado. O portador recebe o valor cheio e a tarifa da venda não é devolvida: o débito no saldo é o bruto estornado. Se a venda ainda não liquidou, o principal sai da agenda de recebíveis e do saldo sai apenas a tarifa.
Corpo da requisição
amount
number
Valor a estornar. Omitido, estorna o saldo restante.
Estorno parcial
{ "amount":50.00 }
GET/merchants/{merchantId}/payments
Lista com todos os filtros da base comum.
GET/merchants/{merchantId}/payments/{id}
Detalhe de um pagamento.
GET/merchants/{merchantId}/payments/{id}/splits
Partes do split, os flags da regra (liable, chargeFee) e o status de liquidação de cada uma.
Tabela Price de 1 a 12x com os juros da sua conta.
Antifraude nativoTodo pagamento de cartão passa por um score inline antes de ir ao adquirente. Acima do limiar da conta (padrão 60) o pagamento nasce blocked_fraud. Há também bloqueio duro de card testing: um IP com 5 ou mais recusas em 15 minutos é barrado antes do adquirente, com blockReason: card_testing_ip_velocity.
Receber
PIX
Cobrança PIX com BR Code copia-e-cola. A liquidação é assíncrona: o crédito no saldo acontece quando o pagador paga, e você é avisado por webhook.
POST/merchants/{merchantId}/pix/transactions
Emite uma cobrança PIX e devolve o código EMV (qrCode) para exibir como QR Code ou texto copia-e-cola.
Corpo da requisição
amount
numberobrigatório
Valor em reais.
description
string
Texto exibido ao pagador (até 140 caracteres).
expiresInMinutes
number
Validade da cobrança, 1 a 1440 (padrão 60). Expirada, vira status expired.
customerId
string
Vincula a cobrança a um cliente.
splits
array
Divide na confirmação; a tarifa do trilho é rateada proporcionalmente.
Estorna cobrança paga: {amount?} — sem amount = total; parcial acumula até o valor pago. O pagador recebe o valor cheio e o débito no saldo é o bruto: a tarifa da venda não é devolvida. Provedores que só estornam o total recusam pedido parcial (400). Se o provedor cancelar o reembolso depois do aceite, o valor é recreditado e o webhook pix.refund_cancelled é emitido. Se o provedor não responder ao envio, a resposta é 201 com metadata.provider_refund_status = "pending" e o pix.refunded sai com pendingConfirmation: true — não repita o pedido; a conciliação conclui com pix.refund_confirmed ou pix.refund_cancelled. Conta bloqueada ou com saída suspensa não estorna (403).
Comprovante PIX tem E2EAo liquidar, a transação registra o ID end-to-end — obrigatório em comprovante PIX pelo manual do BACEN — junto com os dados do pagador.
QR fixo (o QR do balcão). Um código estático permanente para consultório, clínica ou comércio: imprima uma vez e receba quantos PIX chegarem. Cada pagamento vira uma transação PIX própria (com staticQrId preenchido), com tarifa, comprovante e webhook pix.completed iguais aos da cobrança avulsa. Valor fixo (mínimo R$ 1,00) ou aberto — o pagador digita. Sem split.
Desativar é interno: o QR some do painel, mas um código já impresso pode continuar pagável no banco emissor — pagamento que chegar depois ainda credita, marcado em metadata.paid_while_disabled. Recolha o material físico ao desativar.
POST/merchants/{merchantId}/pix/static-qrs
Cria o QR fixo: {label, amount?} — sem amount = valor aberto.
Boleto registrado com linha digitável e código de barras FEBRABAN. Com withPix, o mesmo documento aceita pagamento por QR Code PIX — é o Bole-Pix.
POST/merchants/{merchantId}/boletos
Emite um boleto em nome de um cliente cadastrado. A resposta traz o código de barras, a linha digitável e a URL do documento.
Corpo da requisição
amount
numberobrigatório
Valor de face.
dueDate
string (YYYY-MM-DD)obrigatório
Data de vencimento.
description
string
Descrição impressa no boleto.
finePercentage
number
Multa por atraso, em percentual — cobrada no pagamento atrasado. Teto legal: 2.
interestDailyPercentage
number
Juros por dia de atraso, em percentual — cobrados no pagamento atrasado. Teto legal: 0.033 (≈ 1%/mês).
withPix
boolean
Emite como Bole-Pix — o mesmo documento aceita PIX.
customerId
stringobrigatório
Quem vai pagar. O CPF/CNPJ do cliente é impresso no boleto como sacado, então o cadastro precisa ter documento. Crie o cliente antes em POST /customers.
splits
array
O percentual incide sobre o valor efetivamente pago, com multa e juros.
2ª via com multa e juros já embutidos no novo valor.
POST/merchants/{merchantId}/boletos/{id}/pay
Somente sandbox: simula a liquidação bancária.
POST/merchants/{merchantId}/boletos/{id}/pay-pix
Somente sandbox: liquida pelo QR PIX.
Boleto emitido paga tarifa, pago ou nãoAlém da tarifa de liquidação (produto boleto), existe o pós-pago boleto_unpaid, lançado na fatura quando o boleto vence sem pagamento e no cancelamento em emissor que não cancela de verdade no banco — a listagem devolve cancellationFee por boleto para você avisar antes do clique. Os dois nunca somam. O Bole-Pix tem produto próprio (bolepix): pago pelo papel ou pelo QR, cobra o mesmo. Se a perna PIX falhar depois do registro em emissor que não cancela, a cobrança fica como boleto simples: resposta 201 com withPix: false e o motivo em metadata.pix_leg_error.
Receber
Transações unificadas
Uma listagem só para as cobranças dos três trilhos — cartão, PIX e boleto — e um detalhe por transação com a linha do tempo de eventos, paga ou não. É a mesma visão da tela Transações do painel.
GET/merchants/{merchantId}/transactions
Lista paginada unificada. Além dos filtros comuns de listagem, aceita método, status normalizado e busca textual.
Query string
method
"card" | "pix" | "boleto"
Restringe a uma fonte. Ausente = todas.
status
string
Status normalizado: pending, paid, refunded, declined, expired ou cancelled — traduzido para os status brutos de cada fonte (ex.: pending casa created/authorized no cartão).
search
string
ID exato, referência no adquirente, end-to-end ID (PIX) ou linha digitável (boleto).
type identifica a fonte (payment, pix ou boleto) e é o segmento usado nas rotas de detalhe abaixo. Um boleto híbrido aparece com method: bolepix; a cobrança PIX interna de um Bole-Pix não é listada — o boleto representa a cobrança.
O detalhe devolve { transaction, events[] }. Cada evento é { key, label, description?, occurredAt, amount? } — a linha do tempo da cobrança: criação, autorização (código/NSU), pagamento, recusa, estorno(s), liquidação de recebível por parcela, chargeback, vencimento, expiração e cancelamento. Evento sem data registrada vem com occurredAt: null; vencimento futuro de boleto vem com data futura (o painel o mostra como etapa prevista).
PermissõesA listagem aceita qualquer permissão de leitura de cobrança (payment:read, pix:read ou boleto:read); cada rota de detalhe exige a permissão do seu tipo.
Receber
Links de pagamento
Uma página de checkout hospedada pela TrustPay, sem você escrever front-end. Útil para venda avulsa, cobrança por WhatsApp e primeiros testes.
POST/merchants/{merchantId}/payment-links
Cria o link. Informe amount para valor avulso OU planId para vincular a uma assinatura — nunca os dois.
Corpo da requisição
name
stringobrigatório
Nome do link, exibido no checkout.
amount
number
Valor avulso. Exclusivo com planId.
planId
string
Cria uma assinatura ao pagar. Exclusivo com amount.
paymentMethods
string[]
Quais meios exibir: credit_card, pix, bolepix.
maxUses
number
Limite de pagamentos aceitos pelo link.
expiresAt
string (ISO)
Data em que o link para de aceitar pagamentos.
branding
object
Sua marca na página: displayName, logoUrl (https) e primaryColor (hex).
O pagador digita um código na página e vê o valor já com desconto. O cupom vale na contratação: numa assinatura ele desconta a adesão e não volta nos meses seguintes — desconto que acompanha o contrato é preço, e preço mora na tabela de preços.
POST/merchants/{merchantId}/coupons
Cria o cupom: code, discountType (percent/fixed), percentBps ou fixedAmount, minAmount, validUntil, maxRedemptions.
GET/merchants/{merchantId}/coupons
Lista os cupons da conta, com os resgates de cada um.
POST/merchants/{merchantId}/coupons/{id}/disable
Para de aceitar o código (e /enable reativa).
POST/pay/links/{slug}/coupon
Público: calcula o desconto SEM consumir o resgate.
O desconto reduz o valor da cobrança: o que nasce em payments, pix_transactions ou boletos já é o valor com desconto, e é sobre ele que a tarifa incide. Para cobrar com cupom, envie couponCode no checkout.
Conferir o código não gasta o resgate — é o que a página chama enquanto o pagador digita. O limite de usos é reservado antes de a cobrança nascer, então dois pagamentos no mesmo instante não gastam o mesmo último cupom; e cobrança recusada devolve o cupom, para quem teve o cartão negado poder tentar de novo com o mesmo desconto.
Desconto que zeraria a cobrança é recusado, e link de assinatura não aceita cupom.
Sua marca na página
Quem abre o link conhece você, não a TrustPay. Envie branding na criação e a página de pagamento passa a exibir o seu nome, o seu logo e a sua cor no botão. O que você configurar volta na listagem, então o próximo link herda a mesma marca.
O logoUrl exige https — endereços http, data: e javascript: são recusados, porque a imagem é carregada numa página de pagamento e um recurso inseguro ali derruba o cadeado do navegador. Se o endereço sair do ar, a página esconde a imagem e mostra o nome.
Você não escolhe a cor do texto do botão: GET /pay/links/{slug} devolve onPrimary junto, calculado a partir da sua cor. Com um fundo claro o texto sai escuro, com um fundo escuro sai branco — assim o botão principal nunca fica ilegível. O rodapé informando que o pagamento é processado pela TrustPay aparece sempre.
Checkout público
Estas duas rotas não exigem autenticação — são o que a página hospedada consome. Use-as se preferir construir seu próprio checkout sobre o link.
Público (60/min por IP): dados do link para renderizar o checkout, incluindo as opções de parcelamento com juros.
POST/pay/links/{slug}/checkout
Público (10/min por IP): efetua o pagamento com os dados do pagador.
Receber
Planos e assinaturas
Cobrança recorrente: você define o plano uma vez e a TrustPay cobra no ciclo. No cartão a cobrança liquida na hora; no boleto, Bole-Pix e PIX a TrustPay emite a cobrança e o ciclo só fecha quando o pagamento entra.
POST/merchants/{merchantId}/plans
Cria um plano — o molde da cobrança recorrente.
Corpo da requisição
identifier
stringobrigatório
Identificador único seu (ex.: "pro-mensal").
name
stringobrigatório
Nome exibido.
amount
numberobrigatório
Valor por ciclo.
interval
number
Quantidade de intervalos por ciclo. Padrão 1.
intervalType
"days" | "weeks" | "months"
Unidade do ciclo. Padrão months.
trialDays
number
Período de teste antes da primeira cobrança.
paymentMethod
string
credit_card, boleto, bolepix ou pix.
billingMode
"anniversary" | "fixed_day"
anniversary (padrão) cobra no aniversário da adesão; fixed_day cobra todos no mesmo dia do mês.
billingDay
number
Dia do mês da cobrança (1–31). Obrigatório em fixed_day.
POST/merchants/{merchantId}/subscriptions
Assina um cliente a um plano. Para cobrança em cartão, o cardToken é obrigatório.
Corpo da requisição
planId
stringobrigatório
Plano a assinar.
customerId
stringobrigatório
Cliente assinante.
cardToken
string
Obrigatório quando o plano cobra em cartão.
GET/merchants/{merchantId}/subscriptions
Lista as assinaturas.
GET/merchants/{merchantId}/subscriptions/summary
Panorama da recorrência: receita mensal, cobranças em aberto, vencidas sem pagamento e o que entrou no mês.
Upgrade/downgrade: troca o plano e acerta o proporcional na PRÓXIMA parcela, nunca numa cobrança avulsa. Body { planId }.
GET/merchants/{merchantId}/plans
Lista os planos da conta.
POST/merchants/{merchantId}/plans/{planId}/price
Reajuste sem recriar assinante: { amount, effectiveFrom? }. O plano continua um só e cada assinatura passa a cobrar o valor novo na primeira cobrança emitida a partir da data; a resposta traz affectedSubscriptions. Um reajuste agendado por vez. Evento plan.price_changed.
Arquiva o plano — assinaturas ativas seguem cobrando.
O ciclo fecha no pagamento, não na emissão. Em cartão, a cobrança liquida na hora e o ciclo já nasce pago. Em boleto, Bole-Pix e PIX a TrustPay emite a cobrança e o ciclo fica pending: o contador cyclesBilled só avança, e o próximo ciclo só é agendado, quando o dinheiro entra. Consulte o estado em GET /subscriptions/{id}/cycles.
O pagador tem 5 dias para quitar cada ciclo (nunca mais que o próprio intervalo do plano). Enquanto a cobrança estiver em aberto, nenhuma outra é emitida para o mesmo ciclo. Vencer sem pagamento leva a assinatura para past_due e, na terceira vez, suspended. O aniversário da assinatura conta a partir da emissão: quem paga com atraso não empurra os ciclos seguintes.
Dia fixo, para quem cobra todo mundo no mesmo dia. Com billingMode: "fixed_day" a cobrança vence sempre no billingDay do mês. Quem adere no meio do mês não recebe uma cobrança avulsa: o proporcional dos dias corridos entra somado à primeira parcela cheia. Um aluguel de R$ 1.000 que vence dia 5, assinado dia 25, gera no dia 5 uma única cobrança de R$ 1.000 mais os dias. A cobrança emitida sai 5 dias antes do vencimento — nextDueDate é a data que o pagador conhece. Mês curto encosta no último dia e o mês seguinte volta ao dia do plano.
Upgrade e downgrade em POST /subscriptions/{id}/change-plan: a troca vale na hora e a diferença proporcional aos dias restantes entra como crédito ou débito da próxima parcela, nunca como cobrança avulsa. Exige o mesmo meio de pagamento e o mesmo modelo de cobrança, e não roda enquanto houver cobrança em aberto.
Receber
Carnês (parcelamento com fim)
Um orçamento fechado vira entrada opcional + N parcelas mensais, cobradas por Bole-Pix, boleto ou PIX. O cronograma inteiro é gravado na criação; a cobrança de cada parcela é emitida automaticamente perto do vencimento, e o carnê termina sozinho na última parcela paga.
POST/merchants/{merchantId}/carnes
Cria o carnê com o cronograma completo. O que já está no prazo (a entrada, tipicamente) é emitido na hora e volta na resposta.
Corpo da requisição
customerId
stringobrigatório
Cliente pagador.
description
stringobrigatório
O que foi vendido (ex.: "Tratamento ortodôntico"). Vai em cada cobrança.
installmentsCount
numberobrigatório
Número de parcelas (2 a 48).
installmentAmount
numberobrigatório
Valor de cada parcela.
firstDueDate
stringobrigatório
Vencimento da 1ª parcela (YYYY-MM-DD); as demais seguem mês a mês, no mesmo dia.
downPaymentAmount
number
Entrada opcional. Omitida = sem entrada.
downPaymentDueDate
string
Vencimento da entrada. Padrão: hoje.
paymentMethod
string
bolepix (padrão), boleto ou pix — um método para o carnê inteiro.
finePercentage
number
Multa após o vencimento (%). Padrão 2.
interestDailyPercentage
number
Juros ao dia de atraso (%). Padrão 0.033 (~1%/mês).
GET/merchants/{merchantId}/carnes
Lista os carnês, com progresso (pagas/total) e próximo vencimento.
GET/merchants/{merchantId}/carnes/summary
Panorama: carnês ativos, a receber, em atraso e o que entrou no mês.
GET/merchants/{merchantId}/carnes/{id}
Cronograma completo. Parcela emitida/atrasada traz a cobrança viva (linha digitável, QR PIX) para reenvio.
POST/merchants/{merchantId}/carnes/{id}/cancel
Encerra as parcelas não pagas e cancela as cobranças emitidas. Parcelas pagas ficam intactas.
Antecipa a emissão de uma parcela agendada, ou reemite a cobrança de uma vencida cuja cobrança morreu (QR expirado). A reemissão embute multa e juros acumulados; body { "waiveLateCharges": true } reemite pelo valor de face (renegociação).
A emissão é automática e acontece perto do vencimento. A parcela nasce scheduled, vira issued quando a cobrança é emitida (~10 dias antes de vencer), paid quando o dinheiro entra e overdue quando vence sem pagamento. Boleto vencido continua pagável com multa e juros — o valor registrado é sempre o realmente pago.
Acompanhe pelos webhooks carne.installment_issued, carne.installment_paid, carne.installment_overdue, carne.completed e carne.canceled. Falha operacional de emissão (conta em análise, emissor fora do ar) dispara carne.charge_error e fica em lastChargeError — nenhuma parcela entra em atraso por isso, e a emissão é retentada automaticamente.
Receber
Clientes
Cadastrar o pagador é opcional, mas destrava notificações automáticas de cobrança e o histórico por cliente.
POST/merchants/{merchantId}/customers
Cria o cliente: name, document?, email?, phone?, endereço (addressStreet/Number/Complement/City/State/Zip/Country) e metadata?.
GET/merchants/{merchantId}/customers
Lista com search, name e email. O CPF vem mascarado (***.456.789-**); o valor completo está no detalhe.
GET/merchants/{merchantId}/customers/{customerId}
Detalhe, com o documento inteiro — é o que sua integração deve ler para sincronizar cadastro.
Ajusta as janelas: reminderDays, overdueDays, renewalNoticeEnabled, notificationsEnabled (desliga a régua ao pagador, nunca os avisos de segurança ao lojista). Fechada à conta-mãe.
Quando a cobrança tem um cliente com contato, a TrustPay avisa esse cliente por e-mail: cobrança emitida, lembrete de vencimento, cobrança em atraso, confirmação de pagamento e renovação de assinatura.
A régua de lembretes é da conta e vale para boleto avulso, parcela de carnê e mensalidade de assinatura. reminderDays são os dias antes do vencimento (padrão [5,1,0], onde 0 é o próprio dia) e overdueDays os dias depois, para cobrança que venceu e continua em aberto (padrão [1,7]). Cada janela avisa uma única vez por cobrança, contando dias corridos no fuso de negócio. Array vazio desliga aquele lado da régua; notificationsEnabled: false desliga todos os avisos da conta.
Parcela de carnê só entra na régua depois de emitida — a emissão acontece perto do vencimento, então janelas muito longas não a alcançam. Em ambiente de teste nenhum aviso é entregue ao pagador.
Dinheiro
Saldo e extrato
O saldo é derivado de um livro-razão imutável: não existe campo de saldo editável. Toda movimentação é um lançamento append-only.
Números pré-agregados por dia (fuso de Brasília): dias fechados saem de uma tabela materializada, só o dia corrente é calculado ao vivo — a consulta responde rápido independente do volume histórico.
Todos os relatórios aceitam from/to (YYYY-MM-DD, inclusivos, máximo 366 dias) e product (card | pix | boleto), exigem a permissão report:read e têm uma variante /export.csv no dialeto que o Excel pt-BR abre com duplo clique.
GET/merchants/{merchantId}/reports/sales
Vendas: totais, por produto e série diária.
GET/merchants/{merchantId}/reports/performance
Conversão por produto + % de devoluções e chargebacks.
Como ler a conversãoCartão: aprovadas ÷ tentativas (aprovadas + recusadas). PIX e boleto: pagas ÷ emitidas — QR abandonado no checkout é normal e derruba o número; acompanhe a tendência. Percentual vem null quando não houve tráfego no denominador.
Dinheiro
Disputas: chargeback e MED
Contestação de cartão (chargeback) e devolução especial de PIX (MED, do BACEN) viram registros com status atualizado automaticamente conforme o provedor avança no caso.
GET/merchants/{merchantId}/chargebacks
Contestações de cartão da conta, com o status corrente da disputa.
Query string
status
string
Filtra por status: received, under_review, accepted, rejected, reversed.
Disputa aberta pelo portador; você pode responder com evidências.
under_review
Documentação em análise no adquirente.
reversed
Você GANHOU: o valor fica com você.
accepted
Disputa perdida ou aceita: o valor é debitado e devolvido ao portador.
rejected
Disputa rejeitada pela análise.
GET/merchants/{merchantId}/pix-disputes
Disputas de PIX (MED — Mecanismo Especial de Devolução do BACEN).
Query string
status
string
opened, accepted ou released.
Resposta 200
[{
"id":"med_7bc1…",
"pix_transaction_id":"pix_4a90…",
"amount":250.00,
"status":"opened",
"reason":"MED — suspeita de fraude relatada pelo pagador",
"resolved_at":null,
"created_at":"2026-07-20T09:15:00.000Z"
}]
Status
O que significa
opened
MED aberto: o valor está bloqueado na conta enquanto o caso é analisado.
accepted
MED acatado: o valor foi devolvido ao pagador.
released
MED rejeitado: o bloqueio foi liberado sem débito.
Disputas de cartão exigem sessão de usuárioAs rotas /chargebacks/* aceitam só Authorization: Bearer (login + MFA); chave de API recebe 401. Abrir e responder são fechadas à conta-mãe.
POST/merchants/{merchantId}/chargebacks
Abre disputa: { paymentId?, amount, reason, customerId?, metadata? }. Com paymentId, a cobrança precisa estar paga e o valor é limitado ao que ela ainda deve.
MED não é estorno comumO MED nasce na instituição do pagador (suspeita de fraude) e bloqueia o valor na conta antes de qualquer decisão. O registro aqui é informativo — a movimentação acontece no trilho do PIX — e a taxa de MEDs e chargebacks da conta aparece no relatório de performance. Ambas exigem a permissão chargeback:read.
Dinheiro
Recebíveis e antecipação
Cartão não liquida na hora: a captura cria uma agenda de recebíveis, uma linha por parcela, que vence em D+N. A antecipação troca essa espera por dinheiro hoje, com desconto.
O padrão é D+32, o prazo do adquirente (configurável em settlement_days_card): no parcelado, a 1ª parcela vence nesse prazo e as seguintes de mês em mês. Até vencer, o valor aparece em pending no saldo; um job liquida no vencimento e move para available.
GET/merchants/{merchantId}/receivables
Agenda. Filtre por status=scheduled|settled|anticipated e vencimento.
Simula a taxa pro-rata de cada recebível elegível, sem efeito.
GET/merchants/{merchantId}/anticipations/auto
Estado da antecipação automática da conta (ativação é feita pela plataforma — fale com o suporte).
POST/merchants/{merchantId}/anticipations
Antecipa. Sem receivableIds, antecipa todos os elegíveis. Administrador ou Financeiro; fechada à conta-mãe.
GET/merchants/{merchantId}/anticipations
Histórico de antecipações (origin: manual ou automática). GET /anticipations/{id} detalha uma.
Como a taxa é calculadaA antecipação cobra um percentual ao mês (padrão 1,99%) aplicado pro-rata pelos dias que faltam para cada recebível vencer. Antecipar um recebível que vence amanhã custa quase nada; antecipar um D+32 custa um mês cheio. O líquido é creditado na hora.
Dinheiro
Saques e transferências
Duas saídas de dinheiro: saque (payout) leva o saldo para a sua conta bancária cadastrada; transferência envia para terceiros por PIX ou TED.
Saque exige sessão de usuárioTodas as rotas /payouts/* aceitam só Authorization: Bearer de um usuário com papel Administrador ou Financeiro (login + MFA no painel); chave de API recebe 401. Transferência a terceiros (/transfers) aceita chave de API. A conta de destino do saque é a do cadastro — depois da aprovação ela só muda por chamado, pelo staff, com um micro-PIX de R$ 0,01 que valida a titularidade.
POST/merchants/{merchantId}/payouts
Saca para a conta bancária cadastrada do merchant. A tarifa de saque da sua tabela é debitada no ato, junto do valor, num débito único e atômico que serializa com outras saídas concorrentes.
Corpo da requisição
amount
number
Valor a sacar — o saldo precisa cobrir valor + tarifa. Omitido = saca o máximo (saldo − tarifa).
metadata
object
Dados livres devolvidos nos webhooks e consultas.
Requisição
curl -X POST https://api.trustand.com.br/api/v1/merchants/{merchantId}/payouts \
Saída de dinheiro pede idempotênciaNo sandbox, transferência e saque concluem no próprio request (completed / paid). Em produção a resposta pode vir processing: o valor já foi debitado e o desfecho chega por webhook (transfer.completed / payout.paid) ou estorna (transfer.failed / payout.failed). Indisponibilidade momentânea do provedor emite transfer.processing / payout.processing com pendingConfirmation: true. Sempre envie idempotencyKey e, na dúvida, consulte o recurso antes de reenviar.
GET/merchants/{merchantId}/payouts
Lista os saques; GET /payouts/{id} detalha um.
POST/merchants/{merchantId}/payouts/{id}/process
Antecipa o processamento (o ciclo de manutenção faria em até 5 min). Permissão payout:approve.
GET/merchants/{merchantId}/payouts/withdrawable
Quanto dá para sacar agora: withdrawable já desconta a tarifa e os saques pedidos que ainda não foram processados. Conta bloqueada, em análise ou sem conta bancária válida vem com withdrawable: 0 e o motivo em blockedCode.
POST/merchants/{merchantId}/payouts/{id}/cancel
Cancela um saque ainda não processado.
GET/merchants/{merchantId}/transfers
Lista, com method e search por favorecido, documento, chave ou E2E.
As tarifas de PIX out e TED são pós-pagas: entram na fatura mensal (da conta raiz, num guarda-chuva), e o débito imediato é só o valor enviado. Criar transferência é permissão de Administrador ou Financeiro; fechada à conta-mãe.
Saldo não é valor sacável. A tarifa do saque sai junto do valor, no mesmo débito, e um saque já pedido continua contando no saldo até ser processado. Antes de oferecer um valor ao seu usuário, pergunte a GET /merchants/{merchantId}/payouts/withdrawable: o valor que ela devolve é aceito por POST /payouts.
Dinheiro
Comprovantes
Segunda via sob demanda de qualquer transação concluída, em JSON estruturado ou PDF pronto para o cliente final.
type é um de payment, pix, boleto, transfer ou payout. A permissão exigida é a de leitura do recurso correspondente. Só transações concluídas têm comprovante — pendente ou recusada retorna 400.
Código de autenticaçãoTodo comprovante traz um código determinístico (HMAC-SHA256 dos dados imutáveis): a segunda via reproduz sempre o mesmo código, como em comprovante bancário. CPF de terceiros sai mascarado por LGPD.
Marketplace
Subcontas
No modelo marketplace, cada vendedor da sua plataforma vira uma subconta com saldo, extrato e KYC próprios, sob o seu guarda-chuva.
POST/merchants/{merchantId}/subaccount-invites
Convida um sublojista (recomendado): gera um link amarrado ao CNPJ dele. Ele preenche o próprio cadastro — dados, sócio e documentos — e a conta nasce no seu guarda-chuva, com KYC pendente. O token e a URL aparecem UMA única vez, nesta resposta.
Corpo da requisição
document
stringobrigatório
CNPJ do convidado (14 dígitos) — o onboarding recusa qualquer outro.
label
string
Como você identifica o convidado na lista (ex.: "Loja do João").
expiresInDays
number
Validade do link, 1 a 30 dias. Padrão: 7.
GET/merchants/{merchantId}/subaccount-invites
Lista os convites (pending, used, revoked, expired) — nunca devolve o token.
Pública: quem convidou e para qual CNPJ (404 para convite inválido/expirado).
POST/merchants/{merchantId}/subaccounts
Cria a subconta diretamente (caminho legado — prefira o convite). Ela nasce com KYC pendente e só opera em produção (receber e sacar) depois que a verificação aprovar.
Corpo da requisição
legalName
stringobrigatório
Razão social ou nome completo.
document
stringobrigatório
CPF (11 dígitos) ou CNPJ (14).
email
stringobrigatório
E-mail de contato da subconta.
O que a conta-mãe pode e não pode
A conta-mãe nunca movimenta o saldo da filhaA credencial da mãe opera as rotas das filhas para leitura, cobrança, KYC e controles — mas nunca movimenta o saldo nem decide quem acessa a filha. O poder da mãe é suspender, não movimentar. Uma filha também não acessa nada da mãe nem de outra filha.
Nestas 20 rotas a credencial da mãe (e a do staff em inspeção, e a chave que a mãe emitiu para a filha) recebe 403; só a credencial da própria conta passa. Leitura (GET) das mesmas famílias continua aberta pela hierarquia.
Grupo
Rotas fechadas à conta-mãe
Saída de dinheiro
POST /payoutsPOST /payouts/{id}/processPOST /payouts/{id}/cancelPOST /transfersPOST /anticipations
Movimento da cobrança
POST /payments/{id}/capturePOST /payments/{id}/refundPOST /pix/transactions/{id}/refundPOST /subscriptions/{id}/bill-now
Disputas
POST /chargebacksPOST /chargebacks/{id}/respond
Quem recebe os eventos e os avisos
POST /webhooksPATCH /webhooks/{id}DELETE /webhooks/{id}PATCH /notifications/settings
Quem tem acesso e como
POST /usersPATCH /users/{uid}/roleDELETE /users/{uid}POST /api-keys/{id}/rotatePATCH /merchants/{mid}
Emite chave escopada à filha — não escala para a mãe nem para irmãs. Como foi a mãe que emitiu, ela carrega o poder da mãe: cobra e consulta, mas é barrada nas rotas fechadas acima (saque, transferência, antecipação, captura e estorno). Para cashout, a filha emite a própria chave.
Divide uma cobrança entre várias contas no momento da liquidação. Funciona igual em cartão, PIX e boleto.
Envie splits na criação da cobrança. Cada regra aceita percentage (0,01 a 100) ouamount fixo, e os dois formatos podem ser misturados na mesma cobrança. O limite é de 20 recebedores.
Conta que recebe a parte. Precisa estar na mesma estrutura.
percentage
Percentual do valor pago. Exclusivo com amount.
amount
Valor fixo em reais. Exclusivo com percentage.
liable
Padrão true. Com false, um chargeback dessa parte fica com o marketplace, não com o recebedor.
chargeFee
Padrão true (tarifa rateada proporcionalmente). Com false, a fatia de tarifa deste recebedor passa ao marketplace — até o limite da sobra líquida dele na venda; o que não couber fica com o recebedor — a isenção nunca leva o líquido do marketplace a negativo. É o "proprietário recebe o aluguel cheio".
Regra do guarda-chuvaO recebedor precisa estar na mesma estrutura do pagador — mesma raiz por parent_merchant_id (mãe ↔ filha, filha ↔ irmã) — e com KYC aprovado. Split para fora da estrutura é recusado com 400.
Quando cada parte é creditada
Em cartão, o split segue a agenda D+N: cada parte vira um recebível próprio por parcela e só é creditada ao liquidar — split nunca antecipa liquidação. Em PIX e boleto, as regras são persistidas na criação e recalculadas na confirmação: o percentual incide sobre o valor efetivamente pago (boleto vencido inclui multa e juros) e a tarifa do trilho é rateada proporcionalmente.
Integração
Webhooks
Webhooks são a fonte de verdade da sua integração: a TrustPay chama a sua URL a cada evento, com assinatura HMAC, retry automático e histórico consultável.
Gerir webhooks exige sessão de usuárioAs rotas /webhooks/* aceitam só Authorization: Bearer de um usuário Administrador (login + MFA no painel); chave de API recebe 401. A conta-mãe não cadastra, edita nem apaga webhook da subconta (403): o endpoint que recebe os eventos de dinheiro da filha é da filha.
POST/merchants/{merchantId}/webhooks
Registra o endpoint. O secret é exibido uma única vez — guarde-o na hora.
Corpo da requisição
url
stringobrigatório
URL pública, http ou https (use https em produção). Loopback, faixas privadas, link-local e hostname sem ponto são rejeitados (anti-SSRF).
events
string[]obrigatório
Eventos que você quer receber.
description
string
Rótulo livre.
maxRetries
number
Tentativas no total, 1 a 10. Padrão 3.
timeoutMs
number
Timeout de cada tentativa, 1000 a 60000 ms. Padrão 5000.
Cada entrega traz o header X-Webhook-Signature com o HMAC-SHA256 (hex) do corpo bruto e X-Webhook-Timestamp (ISO 8601) com o instante do envio — a assinatura cobre só o corpo. Valide antes de qualquer JSON.parse, com comparação de tempo constante. Redirecionamento (3xx) do seu servidor conta como falha de entrega.
Node / Express
const crypto = require('crypto');
// Use o RAW body — reserializar o JSON quebra a assinatura.
// processe de forma IDEMPOTENTE: o mesmo evento pode chegar 2x
res.status(200).end(); // responda 2xx rápido
});
Três regras de ouroResponda 2xx rápido e processe o trabalho pesado de forma assíncrona. Seja idempotente: deduplique pelo ID do evento, porque retries podem duplicar entregas. Valide sempre a assinatura.
Retry e histórico
Entrega que falha — resposta não-2xx, 3xx ou timeout — volta para a fila com backoff exponencial (base de 5 s), até maxRetries tentativas no total (padrão 3, máximo 10).
GET/merchants/{merchantId}/webhooks
Lista os endpoints (sem o secret); GET /webhooks/{id} detalha um.
Duas famílias merecem leitura atenta. transfer.processing / payout.processing com pendingConfirmation: true avisam que o provedor não respondeu ao envio: o débito já vale e o desfecho vem por *.completed/*.paid ou *.failed — não reenvie. E payment.split_received de cartão sai na captura com status: 'scheduled': a parte do recebedor é recebível D+N, creditada só quando vence. O campo livemode distingue evento de sandbox.
Com a chave gk_test_, use estes números para forçar cada desfecho do adquirente.
Número
Resultado
4111 1111 1111 1111
Aprovado
4000 0000 0000 0002
Recusado — declined
4000 0000 0000 9995
Saldo insuficiente
4000 0000 0000 0101
Suspeita de fraude
4000 0000 0000 0259
Timeout do adquirente
Para PIX, use POST /pix/transactions/{id}/confirm para simular o pagamento. Para boleto, POST /boletos/{id}/pay ou /pay-pix. Em transferência, uma chave PIX contendo invalid resulta em failed sem débito, simulando recusa do DICT.
Tarifas
A tabela de tarifas é definida por conta, na proposta comercial: a plataforma não publica preço de prateleira. Consulte as tarifas da sua conta em GET /merchants/{mid}/pricing e simule o líquido de uma operação em GET /merchants/{mid}/pricing/simulate.
Integração
SDK e referência Swagger
Duas formas de ir além desta página.
SDK oficial para Node.js
Cliente TypeScript com zero dependências e retry idempotente embutido, cobrindo as rotas abertas à chave de API (cobranças, clientes, transferências, recorrência, links, recebíveis, subcontas, KYC, conciliação, comprovantes). Saque, webhooks, disputas e equipe exigem sessão de usuário e ficam fora do SDK.
Uso
import { Orion } from '@trustpay/node';
const orion = new Orion({ apiKey: process.env.TRUSTPAY_KEY });
O Swagger é gerado direto do código e lista todos os endpoints, incluindo os administrativos que não estão nesta página. Use-o como referência exaustiva e para testar chamadas no navegador: https://api.trustand.com.br/docs. O schema puro, para gerar cliente ou validar payload, fica em https://api.trustand.com.br/openapi.json.
Integrando com apoio de IA
Se você integra com um assistente de código (Claude, Cursor, Copilot), aponte-o para estes endereços em vez de colar trechos desta página — eles descrevem a API inteira e são gerados a cada release, então não ficam para trás do que está no ar. Colar pedaços soltos é o que faz o assistente inventar rota que não existe.
Endereço
O que é
/llms.txt
Resumo da API e links para cada documento — o agente lê primeiro e decide o que buscar.
/llms-full.txt
Toda a documentação num arquivo só, para despejar no contexto de uma vez.
https://api.trustand.com.br/openapi.json
Contrato de cada rota: parâmetros, corpo e respostas. Serve para o agente validar o que gerou.