API documentation · OpenAPI 3.1Documentação da API · OpenAPI 3.1
Arbor Gateway APIAPI Arbor Gateway
A payments platform for the Brazilian market. Accept PIX and international credit cards, send PIX transfers, check your balance and set up webhooks for real-time notifications. A REST API with no required SDK — any HTTP client works.
Plataforma de pagamentos para o mercado brasileiro. Receba via PIX e cartão de crédito internacional, envie transferências PIX, consulte saldo e configure webhooks para notificações em tempo real. API REST, sem SDK obrigatório — qualquer cliente HTTP funciona.
Integration guideGuia de integração
How it worksComo funciona
Authenticate once to get a Bearer token and use it on every call. Create PIX charges (dynamic QR Code + copy-and-paste code), send PIX transfers to a key, and receive confirmation through a signed webhook or by polling the lookup endpoint.
Autentique-se uma vez para obter um Bearer token, e use-o em todas as chamadas. Crie cobranças PIX (QR Code dinâmico + copia-e-cola), envie transferências PIX por chave, e receba a confirmação por webhook assinado ou por polling na consulta.
Monetary amounts are always integers in cents —
R$ 10.50 is 1050. (The balance endpoint is the exception: it returns strings in reais.)
Valores monetários são sempre inteiros em centavos —
R$ 10,50 é 1050. (A consulta de saldo é a exceção: devolve strings em reais.)
| Base URL | UsageUso |
|---|---|
https://api.pay.sejaarbor.com | Production and sandbox — the environment is set by the credential pair used in POST /api/auth, not by a different host.Produção e sandbox — o ambiente é definido pelo par de credenciais usado em POST /api/auth, não por um host diferente. |
Credentials: generate your client_id and client_secret in the
Dashboard at pay.sejaarbor.com
→ API Keys. For the sandbox pair, open the Sandbox tab on the same screen and click Activate sandbox environment.
Credenciais: gere client_id e client_secret no
Dashboard em pay.sejaarbor.com
→ Chaves de API. Para o par de sandbox, abra a aba Sandbox na mesma tela e clique em Ativar ambiente sandbox.
Getting startedPrimeiros passos
What we offerO que oferecemos
Arbor gives you two ways to charge. The API is for teams that build their own payment screen. The Hosted Checkout is the ready-made page, at pay.sejaarbor.com → Checkout. Buyers only see the methods the merchant enabled on that checkout.
A Arbor tem dois jeitos de cobrar. A API é para quem monta a própria tela. O Checkout Hospedado é a página pronta, em pay.sejaarbor.com → Checkout. O comprador só vê os meios que o lojista marcou nesse checkout.
The public API creates Pix and international card (USD or EUR) charges. Domestic cards in reais, and the other international methods, are only available in the Hosted Checkout.
A API pública cria Pix e cartão internacional (USD ou EUR). Cartão nacional em real, e os outros meios internacionais, só existem no Checkout Hospedado.
| MethodMeio | API | Checkout | CurrencyMoeda | RuleRegra |
|---|---|---|---|---|
| Pix | YesSim | YesSim | BRL | Buyer's CPF or CNPJ. The acquirer rejects the charge without a document.CPF ou CNPJ do comprador. A adquirente recusa a cobrança sem documento. |
| Domestic cardCartão nacional | NoNão | YesSim | BRL | Hosted Checkout only. CPF or CNPJ required. POST /api/v1/card with BRL (or no currency) returns 400.Só no Checkout Hospedado. CPF ou CNPJ obrigatório. POST /api/v1/card com BRL (ou sem moeda) responde 400. |
| International cardCartão internacional | YesSim | YesSim | USD or EURUSD ou EUR | Single payment. In the API, currency and billing address are required, and the card is sent as a ConfirmationToken — see Capture the card. The approved amount does not become withdrawable balance right away.À vista. Na API, currency e endereço de cobrança são obrigatórios, e o cartão entra como ConfirmationToken — veja Capturar o cartão. O valor aprovado não vira saldo sacável na hora. |
| Apple Pay and Google PayApple Pay e Google Pay | NoNão | YesSim | USD or EURUSD ou EUR | Buttons inside the international card form at checkout, when the device supports them. No dedicated endpoint. The transaction is recorded as a card payment.Botões dentro do cartão internacional no checkout, quando o aparelho aceita. Não têm endpoint próprio. A transação sai como cartão. |
| SEPA | NoNão | YesSim | EUR | Bank debit. Checkout only.Débito bancário. Só no checkout. |
| PayPal | NoNão | YesSim | USD or EURUSD ou EUR | Checkout only.Só no checkout. |
| Klarna | NoNão | YesSim | USD or EURUSD ou EUR | Checkout only.Só no checkout. |
| iDEAL | NoNão | YesSim | EUR | Netherlands. Checkout only.Países Baixos. Só no checkout. |
| Bancontact | NoNão | YesSim | EUR | Belgium. Checkout only.Bélgica. Só no checkout. |
| MB WAY | NoNão | YesSim | EUR | Portugal. Checkout only.Portugal. Só no checkout. |
| Amazon Pay | NoNão | YesSim | USD or EURUSD ou EUR | Checkout only.Só no checkout. |
| Revolut Pay | NoNão | YesSim | EUR | Checkout only.Só no checkout. |
| Satispay | NoNão | YesSim | EUR | Italy. Checkout only.Itália. Só no checkout. |
| Boleto | NoNão | NoNão | — | Not available yet, neither in the API nor in the checkout.Ainda não disponível, nem na API nem no checkout. |
Rules that matter when integratingRegras que valem na hora de integrar
Buyer document. Pix and card payments in reais require a CPF or CNPJ: without it the acquirer won't create the charge.
International payments (dollar, euro, SEPA and the other methods in the table) don't require a CPF.
In the checkout, under Advanced, you can ask for the document only on payments in reais — the field is hidden for foreign buyers.
In the API, customer.documentType and customer.document are part of the payload. For Pix the document must be valid. For international cards it can be empty when the buyer has no CPF.
Documento do comprador. Pix e cartão em real exigem CPF ou CNPJ: sem isso a adquirente não gera a cobrança.
Pagamento internacional (dólar, euro, SEPA e os demais meios da tabela) não exige CPF.
No checkout, em Avançado, dá para pedir o documento só em pagamentos em real — o campo some para o comprador estrangeiro.
Na API, customer.documentType e customer.document fazem parte do payload. Em Pix o documento precisa ser válido. Em cartão internacional pode ir vazio quando o comprador não tem CPF.
What the API actually accepts. POST /api/v1/pix/in/qrcode creates Pix charges.
POST /api/v1/card charges cards only with currency "USD" or "EUR".
Installments (card.installments) are accepted by the schema but have no effect yet: international charges are single payments.
There is no API route for SEPA, PayPal, Klarna, iDEAL, Bancontact, MB WAY, Amazon Pay, Revolut Pay, Satispay, Apple Pay or Google Pay.
O que a API aceita de fato. POST /api/v1/pix/in/qrcode cria Pix.
POST /api/v1/card cobra cartão só com currency "USD" ou "EUR".
Parcelamento (card.installments) é aceito no schema e ainda não tem efeito: a cobrança internacional sai à vista.
Não existe rota de API para SEPA, PayPal, Klarna, iDEAL, Bancontact, MB WAY, Amazon Pay, Revolut Pay, Satispay, Apple Pay ou Google Pay.
Checkout. The merchant enables methods in Checkout → builder → Payment. iDEAL, SEPA, Bancontact, MB WAY, Revolut Pay and Satispay charge in euros. PayPal, Klarna and Amazon Pay charge in dollars or euros. With cards and an international currency enabled, Apple Pay and Google Pay appear in the card form when the device supports them. The platform can turn a method off for everyone: it disappears from the checkout and the API rejects charges with that method.
Checkout. O lojista marca os meios em Checkout → builder → Pagamento. iDEAL, SEPA, Bancontact, MB WAY, Revolut Pay e Satispay cobram em euro. PayPal, Klarna e Amazon Pay cobram em dólar ou euro. Com cartão e moeda internacional ligados, Apple Pay e Google Pay aparecem no formulário do cartão quando o aparelho aceita. A plataforma pode desligar um meio para todo mundo: ele some do checkout e a API recusa uma cobrança daquele método.
Card balance. Credited Pix goes into your balance. Approved card payments don't: they go through a settlement pipeline before they can be withdrawn. Track it in the Dashboard, under Wallet, or through the transaction's status.
Saldo de cartão. Pix creditado entra no saldo. Cartão aprovado não: fica numa esteira de liquidação antes de poder ser sacado. Acompanhe no Dashboard, em Carteira, ou pelo status da transação.
AuthenticationAutenticação
Exchanges your credentials for a JWT token. Build a
Basic Auth header: concatenate client_id:client_secret and encode it in
Base64. This route takes no body — only the Authorization header.
Troca suas credenciais por um token JWT. Monte um header
Basic Auth: concatene client_id:client_secret e codifique em
Base64. Esta rota não aceita body — só o header Authorization.
Use the returned token as Authorization: Bearer <token>
on every other route. expiresIn is in milliseconds.
Use o token retornado como Authorization: Bearer <token>
em todas as demais rotas. O expiresIn vem em milissegundos.
curl -X POST https://api.pay.sejaarbor.com/api/auth \
-u "YOUR_API_KEY:YOUR_API_SECRETSUA_API_KEY:SEU_API_SECRET"
{
"success": true,
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"tokenType": "Bearer",
"expiresIn": 60000
}
Store your client_secret carefully: it is shown only once,
when created. Arbor stores only its hash — if you lose it, generate a new pair.
Guarde o client_secret com cuidado: ele é exibido só uma vez
na criação. A Arbor armazena apenas o hash — se perder, gere um novo par.
Sandbox and productionSandbox e produção
Each environment has its own credential pair and isolated data. In sandbox, every charge/transfer runs against a simulated acquirer and never moves real money — PIX payments don't confirm on their own: use the simulation routes to fire the webhook manually, exactly as it would happen in production.
Cada ambiente tem seu próprio par de credenciais e dados isolados. No sandbox, toda cobrança/transferência transaciona contra um adquirente simulado e nunca movimenta dinheiro real — pagamentos PIX não confirmam sozinhos: use as rotas de simulação para disparar o webhook manualmente, exatamente como aconteceria em produção.
Endpoints behave identically in both environments — the only difference is which
credential pair you send to POST /api/auth.
Os endpoints funcionam de forma idêntica nos dois ambientes — a única diferença é qual par
de credenciais você envia em POST /api/auth.
Getting sandbox credentialsComo obter as credenciais de sandbox
Self-service, no need to talk to us: in the Dashboard, go to API Keys → Sandbox
and click Activate sandbox environment (2FA is requested if enabled on your account).
The client_secret is shown only once, just like in production; Generate new keys
on the same tab replaces the sandbox pair without touching your production keys.
É self-service, sem precisar falar com a gente: no Dashboard, vá em Chaves de API → Sandbox
e clique em Ativar ambiente sandbox (o 2FA é pedido se estiver ativo na sua conta).
O client_secret aparece uma única vez, igual à produção; Gerar novas chaves
na mesma aba troca o par de sandbox sem mexer nas chaves de produção.
Sandbox balance starts at zero and is separate from your real balance. To test a PIX transfer, first create a charge and confirm it with the simulation route — that credits the sandbox balance. Webhooks are configured separately too: register them using the sandbox token.
O saldo do sandbox começa zerado e é separado do seu saldo real. Para testar uma transferência PIX, primeiro crie uma cobrança e confirme pela rota de simulação — isso credita o saldo do sandbox. Os webhooks também são separados: cadastre-os usando o token sandbox.
Create PIX QR CodeCriar QR Code PIX
Creates a dynamic PIX charge. The response includes data.pix.emv (the
copy-and-paste payload, Central Bank EMV standard) and data.pix.qrCode (a PNG image in
Base64, ready to display).
Cria uma cobrança PIX dinâmica. A resposta traz data.pix.emv (payload
copia-e-cola, padrão EMV do Banco Central) e data.pix.qrCode (imagem PNG em
Base64, pronta para exibir).
Request bodyCorpo da requisição
| FieldCampo | TypeTipo | DescriptionDescrição | |
|---|---|---|---|
amountInCents | integer | requiredobrigatório | Amount in cents, minimum 100 (R$ 1.00).Valor em centavos, mínimo 100 (R$ 1,00). |
customer | object | requiredobrigatório | documentType (cpf | cnpj) and document (digits only) are required; name, email, phone, billingAddress are optional.documentType (cpf | cnpj) e document (só dígitos) são obrigatórios; name, email, phone, billingAddress opcionais. |
description | string | optionalopcional | Up to 140 characters. Shown on the payer's statement.Até 140 caracteres. Aparece no extrato do pagador. |
postbackUrl | string | optionalopcional | URL for this charge's webhook (in addition to the account's fixed webhooks).URL para o webhook desta cobrança (além dos webhooks fixos da conta). |
trackingParameters | object | optionalopcional | Campaign tracking. Fields, all optional: src, sck, utm_source, utm_campaign, utm_medium, utm_content, utm_term. Whatever you send here wins. If a field is missing from this object, Arbor looks for the same name in the query string of the origin URL (Origin/Referer) and of postbackUrl.Rastreamento da campanha. Campos, todos opcionais: src, sck, utm_source, utm_campaign, utm_medium, utm_content, utm_term. O que você enviar aqui prevalece. Se um campo não vier neste objeto, a Arbor tenta o mesmo nome na query da URL de origem (Origin/Referer) e do postbackUrl. |
items | array | optionalopcional | Order items — title, tangible, quantity, amountInCents.Itens do pedido — title, tangible, quantity, amountInCents. |
splits | array | optionalopcional | Sends part of the net amount to other Arbor companies — email + percentage (sum ≤ 100). Runs when the payment is confirmed.Distribui parte do líquido para outras empresas Arbor — email + percentage (soma ≤ 100). Executa na confirmação do pagamento. |
curl -X POST https://api.pay.sejaarbor.com/api/v1/pix/in/qrcode \
-H "Authorization: Bearer YOUR_TOKENSEU_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"amountInCents": 5000,
"description": "Payment for servicesPagamento de servicos",
"postbackUrl": "https://exemplo.com.br/webhook",
"trackingParameters": {
"src": "facebook",
"sck": "campanha-setembro",
"utm_source": "facebook",
"utm_campaign": "lancamento",
"utm_medium": "cpc",
"utm_content": "criativo-a",
"utm_term": "pix"
},
"customer": {
"name": "Joao Silva",
"email": "joao@exemplo.com",
"documentType": "cpf",
"document": "11122233344"
}
}'
{
"success": true,
"message": "Transacao criada com sucesso",
"data": {
"id": "trx_1a2b3c4d5e6f7g8h9i0j",
"pix": {
"emv": "00020126580014br.gov.bcb.pix0136...",
"qrCode": "iVBORw0KGgo..."
},
"status": "pending",
"fees": 0
}
}
Get chargeConsultar cobrança
Returns the current state of the charge. It's the reliable way to confirm a payment if
you don't use webhooks — check right after the payer says they paid, or at short
intervals until it leaves pending.
Devolve o estado atual da cobrança. É a forma confiável de confirmar um pagamento se
você não usa webhook — consulte logo após o pagador informar que pagou, ou em intervalos
curtos até sair de pending.
curl https://api.pay.sejaarbor.com/api/v1/pix/in/qrcode/trx_1a2b3c4d5e6f7g8h9i0j \
-H "Authorization: Bearer YOUR_TOKENSEU_TOKEN"
Send PIX transferEnviar transferência PIX
Sends a PIX to any key (CPF, CNPJ, e-mail, phone or random/EVP).
Send the x-idempotency-key header with a unique value per operation — see
Idempotency.
Envia um PIX para qualquer chave (CPF, CNPJ, e-mail, telefone ou aleatória/EVP).
Envie o header x-idempotency-key com um valor único por operação — veja
Idempotência.
Request bodyCorpo da requisição
| FieldCampo | TypeTipo | DescriptionDescrição | |
|---|---|---|---|
pixKey | string | requiredobrigatório | Destination PIX key.Chave PIX de destino. |
amount | integer | requiredobrigatório | Amount in cents, minimum 1.Valor em centavos, mínimo 1. |
description | string | optionalopcional | Up to 140 characters.Até 140 caracteres. |
currency | string | optionalopcional | Only BRL (default).Só BRL (padrão). |
postbackUrl | string | optionalopcional | URL for this transfer's status webhook.URL para o webhook de status desta transferência. |
curl -X POST https://api.pay.sejaarbor.com/api/v1/pix/out/pixkey \
-H "Authorization: Bearer YOUR_TOKENSEU_TOKEN" \
-H "x-idempotency-key: transf-9f21c3" \
-H "Content-Type: application/json" \
-d '{
"pixKey": "fornecedor@exemplo.com",
"amount": 10000,
"description": "Supplier paymentPagamento de fornecedor",
"postbackUrl": "https://exemplo.com.br/webhook/pix-out"
}'
{
"success": true,
"message": "Transferencia criada com sucesso",
"data": {
"id": "transfer_abc123def456",
"status": "pending",
"amount": 10000,
"netAmount": 10000,
"fees": 0,
"pixKey": "fornecedor@exemplo.com"
}
}
Get transferConsultar transferência
Returns the transfer's state, including endToEndId and
processedAt once completed.
Devolve o estado da transferência, incluindo endToEndId e
processedAt quando concluída.
curl https://api.pay.sejaarbor.com/api/v1/pix/out/pixkey/transfer_abc123def456 \
-H "Authorization: Bearer YOUR_TOKENSEU_TOKEN"
Capture the cardCapturar o cartão
This API covers international cards (USD/EUR) only — domestic cards (BRL) are only available through Arbor's Hosted Checkout. The card number, expiry date and CVV must never reach your backend: capture them directly in the customer's browser with a Payment Element and exchange them for a ConfirmationToken before calling the Arbor API.
Esta API cobre só cartão internacional (USD/EUR) — cartão nacional (BRL) só está disponível pelo Checkout Hospedado do Arbor. O número, validade e CVV nunca devem chegar ao seu backend: capture-os direto no navegador do cliente com um Payment Element e troque por um ConfirmationToken antes de chamar a API da Arbor.
You'll need your publishable key — ask the Arbor team (it isn't self-service in the Dashboard yet).
Você vai precisar da sua chave publicável — peça ao time Arbor (ainda não é auto-serviço pelo Dashboard).
Never capture the card on your server, and never log the response with sensitive data. The Payment Element exists precisely so that sensitive data goes from the browser straight to the processor, without touching your infrastructure — this drastically reduces the PCI scope of your integration.
Nunca capture o cartão no seu servidor, e nunca logue a resposta com dados sensíveis. O Payment Element existe justamente para que o dado sensível saia do navegador direto pro processador, sem passar pela sua infraestrutura — isso reduz drasticamente o escopo PCI da sua integração.
card.last4/card.brand are not extracted by this API — they are
just echoed back in the response as you sent them. Send a placeholder if your form doesn't
expose this data (e.g. "card" / "0000").
card.last4/card.brand não são extraídos nesta API — são
apenas ecoados na resposta como você enviar. Envie um placeholder se seu formulário não
expuser esses dados (ex.: "card" / "0000").
const stripe = Stripe("YOUR_PUBLISHABLE_KEYSUA_CHAVE_PUBLICAVEL")
const elements = stripe.elements({ mode: "payment", currency: "usd", amount: 1999 })
const paymentElement = elements.create("payment")
paymentElement.mount("#payment-element")
// On form submit:// No submit do formulário:
await elements.submit()
const { confirmationToken, error } = await stripe.createConfirmationToken({ elements })
// confirmationToken.id ("ctoken_...") — send this, never the card// confirmationToken.id ("ctoken_...") — envie isso, nunca o cartão
No Authorization on this call — it runs in the browser, with
your publishable key. No Arbor secret credential is involved here.
Sem Authorization nesta chamada — é feita a partir do navegador, com a
sua chave publicável. Nenhuma credencial secreta da Arbor entra aqui.
Charge an international cardCobrar cartão internacional
Creates and captures an international card charge (USD/EUR) in a
single call. Domestic cards (BRL) are not available through this
API — only through the Hosted Checkout. The customer's billingAddress is
required.
Cria e captura uma cobrança de cartão internacional (USD/EUR) em uma
única chamada. Cartão nacional (BRL) não está disponível por esta
API — só pelo Checkout Hospedado. O billingAddress do cliente é
obrigatório.
Request bodyCorpo da requisição
| FieldCampo | TypeTipo | DescriptionDescrição | |
|---|---|---|---|
amountInCents | integer | requiredobrigatório | Amount in cents, in the currency currency.Valor em centavos, na moeda de currency. |
currency | string | requiredobrigatório | "USD" or "EUR". No BRL in this API."USD" ou "EUR". Sem BRL nesta API. |
description | string | optionalopcional | Shown on Arbor's internal statement.Aparece no extrato interno da Arbor. |
card.holderName | string | requiredobrigatório | Name printed on the card.Nome impresso no cartão. |
card.token | string | requiredobrigatório | ConfirmationToken generated in Capture the card. Raw PANs are not accepted.ConfirmationToken gerado em Capturar o cartão. PAN cru não é aceito. |
card.last4 / card.brand | string | requiredobrigatório | Echoed back in the response as sent — not validated. Use a placeholder if you don't have the data.Ecoados na resposta como enviados — não são validados. Use um placeholder se não tiver o dado. |
card.installments | integer | optionalopcional | Accepted by the schema, but no effect yet on international cards — always a single payment.Aceito pelo schema, mas ainda sem efeito em cartão internacional — sempre à vista. |
customer.name / document / documentType | string | requiredobrigatório | documentType is cpf or cnpj.documentType é cpf ou cnpj. |
customer.email | string | requiredobrigatório | Payer's e-mail.E-mail do pagador. |
customer.billingAddress | object | requiredobrigatório | street, number, neighborhood, city, state, zipCode. |
trackingParameters | object | optionalopcional | Same object as in Pix. Optional fields: src, sck, utm_source, utm_campaign, utm_medium, utm_content, utm_term. The value sent here wins over the query string of the origin URL and of postbackUrl.Mesmo objeto do Pix. Campos opcionais: src, sck, utm_source, utm_campaign, utm_medium, utm_content, utm_term. O valor enviado aqui prevalece sobre a query da URL de origem e do postbackUrl. |
The amount doesn't become available balance right away. Every approved international card sale opens a receivable that only becomes withdrawable balance after your account's settlement period — see Card settlement.
O valor não vira saldo disponível na hora. Toda venda de cartão internacional aprovada abre um recebível que só vira saldo sacável depois do prazo de liquidação da sua conta — veja Liquidação de cartão.
curl -X POST https://api.pay.sejaarbor.com/api/v1/card \
-H "Authorization: Bearer YOUR_TOKENSEU_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"amountInCents": 1999,
"currency": "USD",
"description": "Order #4821Pedido #4821",
"card": {
"holderName": "John Doe",
"token": "ctoken_1AbCdEfGhIjKlMnOp",
"last4": "0000",
"brand": "card"
},
"customer": {
"name": "John Doe",
"documentType": "cpf",
"document": "12345678900",
"email": "john@example.com",
"billingAddress": {
"street": "5th Avenue",
"number": "100",
"neighborhood": "Manhattan",
"city": "New York",
"state": "NY",
"zipCode": "10001"
}
},
"trackingParameters": {
"src": "google",
"sck": "ads-us",
"utm_source": "google",
"utm_campaign": "launch",
"utm_medium": "cpc",
"utm_content": "creative-a",
"utm_term": "card"
}
}'
{
"success": true,
"data": {
"id": "trx_9f8e7d6c5b4a",
"status": "paid",
"card": { "brand": "card", "last4": "0000" }
}
}
Get transactionConsultar transação
Generic status lookup — works for card transactions and PIX charges using the
same id returned on creation.
Consulta genérica de status — funciona para transações de cartão e cobranças PIX pelo
mesmo id devolvido na criação.
curl https://api.pay.sejaarbor.com/api/v1/transactions/trx_9f8e7d6c5b4a \
-H "Authorization: Bearer YOUR_TOKENSEU_TOKEN"
StatesEstados
Each operation is a simple state machine: it starts in an initial state and ends in one of the final states below. Transitions are atomic — concurrent confirmations for the same resource never apply the effect twice.
Cada operação é uma máquina de estados simples: sai de um estado inicial e termina num dos estados finais abaixo. Transições são atômicas — confirmações concorrentes para o mesmo recurso nunca aplicam o efeito duas vezes.
PIX chargeCobrança PIX PIX IN
PIX transferTransferência PIX PIX OUT
Card chargeCobrança de cartão CardCartão
Card settlementLiquidação de cartão
paid is not available balance. Every approved international card sale
opens a receivable that follows its own pipeline (in USD/EUR) until it becomes
withdrawable balance. The default period is D+7 calendar days, which can be shortened by paying
an advance fee — talk to the Arbor team to adjust it per company.
paid não é saldo disponível. Toda venda de cartão internacional aprovada
abre um recebível que segue sua própria esteira (em USD/EUR) até virar
saldo sacável. O prazo padrão é D+7 corridos, redutível pagando uma taxa de antecipação —
fale com o time Arbor para ajustar por empresa.
Card receivableRecebível de cartão SettlementLiquidação
SimulateSimular sandbox
Only work with sandbox credentials. They confirm the charge / complete the
transfer as if the real PIX had happened, firing the same webhook
(transaction_paid / transfer_completed). In production they return
403; if the resource is no longer pending, they return 400.
Só funcionam com credenciais sandbox. Confirmam a cobrança / concluem a
transferência como se o PIX real tivesse acontecido, disparando o mesmo webhook
(transaction_paid / transfer_completed). Em produção devolvem
403; se o recurso já não estiver pendente, devolvem 400.
In sandbox, transfers skip manual review: they go straight to processing
(banking_processing) and wait there until you call /complete.
The QR Code returned by a sandbox charge is a valid BR Code (correct CRC), but it can't be
paid by a real bank app — confirm it with /pay.
No sandbox, a transferência não passa por análise manual: vai direto para processamento
(banking_processing) e espera lá até você chamar /complete.
O QR Code devolvido por uma cobrança sandbox é um BR Code válido (CRC correto), mas não pode
ser pago num app de banco de verdade — confirme com /pay.
curl -X POST https://api.pay.sejaarbor.com/api/v1/pix/in/qrcode/trx_1a2b3c4d5e6f7g8h9i0j/pay \
-H "Authorization: Bearer YOUR_SANDBOX_TOKENSEU_TOKEN_SANDBOX"
curl -X POST https://api.pay.sejaarbor.com/api/v1/pix/out/pixkey/transfer_abc123def456/complete \
-H "Authorization: Bearer YOUR_SANDBOX_TOKENSEU_TOKEN_SANDBOX"
Cards don't need simulation. In sandbox, POST /api/v1/card
responds synchronously and accepts any value in card.token — no publishable key
or Payment Element needed. Any token is approved (paid); a token containing
decline (e.g. "ctoken_decline") is refused (refused),
so you can test the error path.
Cartão não precisa de simulação. No sandbox, POST /api/v1/card
responde de forma síncrona e aceita qualquer valor em card.token — sem chave
publicável nem Payment Element. Qualquer token é aprovado (paid); um token que
contenha decline (ex.: "ctoken_decline") é recusado (refused),
para você testar o caminho de erro.
BalanceSaldo
Returns the account balances. Unlike the rest of the API, values come as
strings in reais. Use data.pix.balance as the balance
available to operate with.
Devolve os saldos da conta. Diferente do resto da API, os valores vêm como
strings em reais. Use data.pix.balance como o saldo
disponível para operar.
| FieldCampo | DescriptionDescrição |
|---|---|
pix.balance | Available balance (R$).Saldo disponível (R$). |
pixBlocked.balance | Held by a precautionary block / infraction.Retido por bloqueio cautelar / infração. |
reserve.balance | Held in risk reserve (if applicable).Retido em reserva de risco (se aplicável). |
curl https://api.pay.sejaarbor.com/api/v1/balance \
-H "Authorization: Bearer YOUR_TOKENSEU_TOKEN"
{
"success": true,
"data": {
"pix": { "balance": "1250.00" },
"pixBlocked": { "balance": "0.00" },
"reserve": { "balance": "300.00" }
}
}
Manage webhooksGerenciar webhooks
A webhook is a signed POST sent to your url for each subscribed
event. Creating one returns a signatureSecret — store it to
verify the signature. Respond 2xx quickly; do heavy
processing asynchronously.
Um webhook é um POST assinado enviado à sua url a cada evento
inscrito. A criação devolve um signatureSecret — guarde-o para
verificar a assinatura. Responda 2xx rápido; faça o
processamento pesado de forma assíncrona.
| EventEvento | When it firesQuando dispara |
|---|---|
transaction_created | PIX charge created.Cobrança PIX criada. |
transaction_paid | Payment confirmed — this is the one that should credit your customer.Pagamento confirmado — é este que credita o cliente. |
transaction_refunded | Charge refunded.Cobrança estornada. |
transfer_completed | PIX transfer completed.Transferência PIX concluída. |
curl -X POST https://api.pay.sejaarbor.com/api/v1/webhook \
-H "Authorization: Bearer YOUR_TOKENSEU_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "https://exemplo.com.br/webhook",
"events": ["transaction_paid", "transfer_completed"]
}'
{
"success": true,
"data": {
"id": 123,
"url": "https://exemplo.com.br/webhook",
"events": ["transaction_paid", "transfer_completed"],
"isActive": true,
"signatureSecret": "secret_abc123",
"createdAt": "2026-01-15T12:00:00Z"
}
}
Payload formatFormato do payload
Reference for the bodies sent in callbacks. The same format applies to the account's fixed
webhook and to the postbackUrl passed on the charge/transfer.
Referência dos corpos enviados nos callbacks. O mesmo formato vale para o webhook fixo da
conta e para o postbackUrl passado na cobrança/transferência.
{
"id": "8d0f3b8f-5c2f-4a10-8dd6-8bbf5e9b1d11",
"type": "transaction",
"event": "transaction_paid",
"scope": "user",
"transaction": {
"id": "transaction_abc123",
"amount": 5000,
"status": "paid",
"pix": {
"endToEndId": "E1234567820241231000000000000001",
"payerInfo": { "name": "Joao Silva", "document": "11122233344" }
}
}
}
{
"id": "5f9e0c94-60a4-4df8-bb81-7f6efc6f61b0",
"type": "transfer",
"event": "transfer_completed",
"scope": "user",
"transfer": {
"id": "transfer_abc123",
"amount": 10000,
"status": "paid",
"pix": {
"endToEndId": "E1234567820241231000000000000002",
"creditorAccount": { "name": "Fornecedor Exemplo", "document": "12345678000199" }
}
}
}
Idempotent delivery: treat the same event id arriving
more than once as normal — process idempotently by the event id or
by endToEndId, never assuming single delivery.
Idempotência na entrega: trate o mesmo id de evento chegando
mais de uma vez como normal — processe de forma idempotente pelo id do evento ou
pelo endToEndId, nunca assumindo entrega única.
Verify signatureVerificar assinatura
When the webhook has a signatureSecret, each POST arrives with the
ArborGateway-Signature header, in the format
t=<epoch>,v1=<hmac>. Recompute the HMAC-SHA256 over
{timestamp}.{JSON.stringify(payload)} with the secret and compare — preferably
in constant time.
Quando o webhook tem signatureSecret, cada POST chega com o
header ArborGateway-Signature, no formato
t=<epoch>,v1=<hmac>. Recalcule o HMAC-SHA256 sobre
{timestamp}.{JSON.stringify(payload)} com o segredo e compare — de preferência
em tempo constante.
const crypto = require("crypto");
function isValidArborWebhook(payload, signature, secret) {
const [tPart, sPart] = signature.split(",");
const timestamp = tPart.replace("t=", "");
const received = sPart.replace("v1=", "");
const expected = crypto
.createHmac("sha256", secret)
.update(`${timestamp}.${JSON.stringify(payload)}`)
.digest("hex");
return expected === received;
}
IdempotencyIdempotência
For PIX transfers (PIX OUT), send the
x-idempotency-key header with a unique value per operation. If the request is
resent by a network retry, the operation isn't duplicated — the original response is returned.
Em transferências PIX (PIX OUT), envie o
header x-idempotency-key com um valor único por operação. Se a requisição for
reenviada por retry de rede, a operação não é duplicada — a resposta original é devolvida.
ErrorsErros
Errors respond in JSON with success: false and a human-readable message:
Erros respondem em JSON com success: false e uma message legível:
{ "success": false, "message": "Transacao nao encontrada" }
| Status | MeaningSignificado |
|---|---|
400 | Invalid body, or incompatible state (e.g. simulating payment of something that is no longer pending).Corpo inválido, ou estado incompatível (ex.: simular pagamento de algo que já não está pending). |
401 | Missing, invalid or expired token. Call POST /api/auth again.Token ausente, inválido ou expirado. Refaça POST /api/auth. |
403 | Route unavailable in this environment (e.g. a simulation route with production credentials).Rota indisponível neste ambiente (ex.: rota de simulação com credencial de produção). |
404 | Resource not found or belongs to another account.Recurso não encontrado ou de outra conta. |
409 | Conflict — x-idempotency-key reused with a different body.Conflito — x-idempotency-key reaproveitada com corpo diferente. |
422 | Validation — the message points to the field.Validação — a message aponta o campo. |
Endpoints
| MethodMétodo | RouteRota | DescriptionDescrição |
|---|---|---|
| POST | /api/auth | Generate Bearer tokenGerar token Bearer |
| POST | /api/v1/pix/in/qrcode | Create PIX QR CodeCriar QR Code PIX |
| GET | /api/v1/pix/in/qrcode/{id} | Get chargeConsultar cobrança |
| POST | /api/v1/pix/in/qrcode/{id}/pay | Simulate payment (sandbox)Simular pagamento (sandbox) |
| POST | /api/v1/pix/out/pixkey | Send PIX transferEnviar transferência PIX |
| GET | /api/v1/pix/out/pixkey/{id} | Get transferConsultar transferência |
| POST | /api/v1/pix/out/pixkey/{id}/complete | Simulate completion (sandbox)Simular conclusão (sandbox) |
| POST | /api/v1/card | Charge cardCobrar no cartão |
| GET | /api/v1/transactions/{id} | Get transactionConsultar transação |
| GET | /api/v1/balance | Get balanceConsultar saldo |
| GET | /api/v1/webhook | List webhooksListar webhooks |
| POST | /api/v1/webhook | Create webhookCriar webhook |
| DEL | /api/v1/webhook/{id} | Remove webhookRemover webhook |