Arbor
api.pay.sejaarbor.com Download OpenAPIBaixar OpenAPI llms.txt AuthenticationAutenticação

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 URLUsageUso
https://api.pay.sejaarbor.comProduction 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.

Getting startedPrimeiros passos

AuthenticationAutenticação

POST/api/auth

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.

Request — cURLRequisição — cURL
curl -X POST https://api.pay.sejaarbor.com/api/auth \
  -u "YOUR_API_KEY:YOUR_API_SECRETSUA_API_KEY:SEU_API_SECRET"
ResponseResposta 200
{
  "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.

Getting startedPrimeiros passos

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.

PIX IN — receivePIX IN — receber

Create PIX QR CodeCriar QR Code PIX

POST/api/v1/pix/in/qrcode

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

FieldCampoTypeTipoDescriptionDescrição
amountInCentsintegerrequiredobrigatórioAmount in cents, minimum 100 (R$ 1.00).Valor em centavos, mínimo 100 (R$ 1,00).
customerobjectrequiredobrigatóriodocumentType (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.
descriptionstringoptionalopcionalUp to 140 characters. Shown on the payer's statement.Até 140 caracteres. Aparece no extrato do pagador.
postbackUrlstringoptionalopcionalURL 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).
trackingParametersobjectoptionalopcionalCampaign 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.
itemsarrayoptionalopcionalOrder items — title, tangible, quantity, amountInCents.Itens do pedido — title, tangible, quantity, amountInCents.
splitsarrayoptionalopcionalSends 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.
RequestRequisição
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"
    }
  }'
ResponseResposta 200
{
  "success": true,
  "message": "Transacao criada com sucesso",
  "data": {
    "id": "trx_1a2b3c4d5e6f7g8h9i0j",
    "pix": {
      "emv": "00020126580014br.gov.bcb.pix0136...",
      "qrCode": "iVBORw0KGgo..."
    },
    "status": "pending",
    "fees": 0
  }
}
PIX IN — receivePIX IN — receber

Get chargeConsultar cobrança

GET/api/v1/pix/in/qrcode/{transactionId}

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.

RequestRequisição
curl https://api.pay.sejaarbor.com/api/v1/pix/in/qrcode/trx_1a2b3c4d5e6f7g8h9i0j \
  -H "Authorization: Bearer YOUR_TOKENSEU_TOKEN"
PIX OUT — sendPIX OUT — enviar

Send PIX transferEnviar transferência PIX

POST/api/v1/pix/out/pixkey

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

FieldCampoTypeTipoDescriptionDescrição
pixKeystringrequiredobrigatórioDestination PIX key.Chave PIX de destino.
amountintegerrequiredobrigatórioAmount in cents, minimum 1.Valor em centavos, mínimo 1.
descriptionstringoptionalopcionalUp to 140 characters.Até 140 caracteres.
currencystringoptionalopcionalOnly BRL (default).Só BRL (padrão).
postbackUrlstringoptionalopcionalURL for this transfer's status webhook.URL para o webhook de status desta transferência.
RequestRequisição
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"
  }'
ResponseResposta 200
{
  "success": true,
  "message": "Transferencia criada com sucesso",
  "data": {
    "id": "transfer_abc123def456",
    "status": "pending",
    "amount": 10000,
    "netAmount": 10000,
    "fees": 0,
    "pixKey": "fornecedor@exemplo.com"
  }
}
PIX OUT — sendPIX OUT — enviar

Get transferConsultar transferência

GET/api/v1/pix/out/pixkey/{transferId}

Returns the transfer's state, including endToEndId and processedAt once completed.

Devolve o estado da transferência, incluindo endToEndId e processedAt quando concluída.

RequestRequisição
curl https://api.pay.sejaarbor.com/api/v1/pix/out/pixkey/transfer_abc123def456 \
  -H "Authorization: Bearer YOUR_TOKENSEU_TOKEN"
Card — receiveCartão — receber

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").

In the browser (JS)No navegador (JS)
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.

Card — receiveCartão — receber

Charge an international cardCobrar cartão internacional

POST/api/v1/card

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

FieldCampoTypeTipoDescriptionDescrição
amountInCentsintegerrequiredobrigatórioAmount in cents, in the currency currency.Valor em centavos, na moeda de currency.
currencystringrequiredobrigatório"USD" or "EUR". No BRL in this API."USD" ou "EUR". Sem BRL nesta API.
descriptionstringoptionalopcionalShown on Arbor's internal statement.Aparece no extrato interno da Arbor.
card.holderNamestringrequiredobrigatórioName printed on the card.Nome impresso no cartão.
card.tokenstringrequiredobrigatórioConfirmationToken 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.brandstringrequiredobrigatórioEchoed 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.installmentsintegeroptionalopcionalAccepted 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 / documentTypestringrequiredobrigatóriodocumentType is cpf or cnpj.documentType é cpf ou cnpj.
customer.emailstringrequiredobrigatórioPayer's e-mail.E-mail do pagador.
customer.billingAddressobjectrequiredobrigatóriostreet, number, neighborhood, city, state, zipCode.
trackingParametersobjectoptionalopcionalSame 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.

RequestRequisiçã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"
    }
  }'
ResponseResposta 201
{
  "success": true,
  "data": {
    "id": "trx_9f8e7d6c5b4a",
    "status": "paid",
    "card": { "brand": "card", "last4": "0000" }
  }
}
Card — receiveCartão — receber

Get transactionConsultar transação

GET/api/v1/transactions/{transactionId}

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.

RequestRequisição
curl https://api.pay.sejaarbor.com/api/v1/transactions/trx_9f8e7d6c5b4a \
  -H "Authorization: Bearer YOUR_TOKENSEU_TOKEN"
ReferenceReferência

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

pending
paid
refused refunded

PIX transferTransferência PIX PIX OUT

pending
completed
refused

Card chargeCobrança de cartão CardCartão

pending
paid
refused canceled

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

awaiting_advance
pending_balance
available
cancelled
Sandbox

SimulateSimular sandbox

POST/api/v1/pix/in/qrcode/{transactionId}/pay
POST/api/v1/pix/out/pixkey/{transferId}/complete

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.

Confirm chargeConfirmar cobrança
curl -X POST https://api.pay.sejaarbor.com/api/v1/pix/in/qrcode/trx_1a2b3c4d5e6f7g8h9i0j/pay \
  -H "Authorization: Bearer YOUR_SANDBOX_TOKENSEU_TOKEN_SANDBOX"
Complete transferConcluir transferência
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.

AccountConta

BalanceSaldo

GET/api/v1/balance

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.

FieldCampoDescriptionDescrição
pix.balanceAvailable balance (R$).Saldo disponível (R$).
pixBlocked.balanceHeld by a precautionary block / infraction.Retido por bloqueio cautelar / infração.
reserve.balanceHeld in risk reserve (if applicable).Retido em reserva de risco (se aplicável).
RequestRequisição
curl https://api.pay.sejaarbor.com/api/v1/balance \
  -H "Authorization: Bearer YOUR_TOKENSEU_TOKEN"
ResponseResposta 200
{
  "success": true,
  "data": {
    "pix": { "balance": "1250.00" },
    "pixBlocked": { "balance": "0.00" },
    "reserve": { "balance": "300.00" }
  }
}
Webhooks

Manage webhooksGerenciar webhooks

GET/api/v1/webhook
POST/api/v1/webhook
DELETE/api/v1/webhook/{id}

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.

EventEventoWhen it firesQuando dispara
transaction_createdPIX charge created.Cobrança PIX criada.
transaction_paidPayment confirmed — this is the one that should credit your customer.Pagamento confirmado — é este que credita o cliente.
transaction_refundedCharge refunded.Cobrança estornada.
transfer_completedPIX transfer completed.Transferência PIX concluída.
Create webhookCriar webhook
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"]
  }'
ResponseResposta 200
{
  "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"
  }
}
Webhooks

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.

transaction_paid
{
  "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" }
    }
  }
}
transfer_completed
{
  "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.

Webhooks

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.

Node.js
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;
}
ReferenceReferência

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.

ReferenceReferência

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" }
StatusMeaningSignificado
400Invalid 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).
401Missing, invalid or expired token. Call POST /api/auth again.Token ausente, inválido ou expirado. Refaça POST /api/auth.
403Route 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).
404Resource not found or belongs to another account.Recurso não encontrado ou de outra conta.
409Conflict — x-idempotency-key reused with a different body.Conflito — x-idempotency-key reaproveitada com corpo diferente.
422Validation — the message points to the field.Validação — a message aponta o campo.
ReferenceReferência

Endpoints

MethodMétodoRouteRotaDescriptionDescrição
POST/api/authGenerate Bearer tokenGerar token Bearer
POST/api/v1/pix/in/qrcodeCreate PIX QR CodeCriar QR Code PIX
GET/api/v1/pix/in/qrcode/{id}Get chargeConsultar cobrança
POST/api/v1/pix/in/qrcode/{id}/paySimulate payment (sandbox)Simular pagamento (sandbox)
POST/api/v1/pix/out/pixkeySend PIX transferEnviar transferência PIX
GET/api/v1/pix/out/pixkey/{id}Get transferConsultar transferência
POST/api/v1/pix/out/pixkey/{id}/completeSimulate completion (sandbox)Simular conclusão (sandbox)
POST/api/v1/cardCharge cardCobrar no cartão
GET/api/v1/transactions/{id}Get transactionConsultar transação
GET/api/v1/balanceGet balanceConsultar saldo
GET/api/v1/webhookList webhooksListar webhooks
POST/api/v1/webhookCreate webhookCriar webhook
DEL/api/v1/webhook/{id}Remove webhookRemover webhook