Documentação da plataforma

Para quem vende e para quem integra: o produto sem código e a API, cada tópico em sua página.

API de parceiro

Para plataformas que trazem os próprios clientes para vender pela 3B: cadastre cada cliente como vendedor da 3B, acompanhe a aprovação, cobre em nome dele e peça o saque, que cai direto na conta bancária do próprio cliente.

Como funciona

  1. 1Cada cliente seu é um vendedor da 3B. Com CPF ou CNPJ próprio, passando pela análise da 3B e com conta própria na processadora. A sua plataforma nunca recebe o dinheiro dos clientes, e por isso não precisa repassar nada.
  2. 2A chave fica só no servidor. A 3B entrega uma chave 3bpt_live_..., mostrada uma vez. Toda chamada leva Authorization: Bearer 3bpt_live_.... Nunca coloque no bot, no app ou na página. Se você mandar os IPs fixos do seu servidor, a chave só funciona a partir deles.
  3. 3O saque vai sempre para a conta do cliente. Você pede o saque pela API; o dinheiro cai na conta bancária que o próprio cliente cadastrou e que a processadora verificou. O destino nunca vai na requisição.
Base: https://api.pag3b.com/v1/partner-api. Valores sempre em centavos. Você só enxerga os vendedores que criou: o id de qualquer outro responde 404.

1. Criar o vendedor

Uma chamada por cliente, com o id dele na sua plataforma em externalId. Repetir com o mesmo externalId devolve o mesmo vendedor. Para achar depois: GET /sellers?externalId=user_8812.

POST/partner-api/sellersCria o vendedor.
curl -X POST https://api.pag3b.com/v1/partner-api/sellers \
  -H "Authorization: Bearer $CHAVE_PARCEIRO" \
  -H "Content-Type: application/json" \
  -d '{
    "externalId": "user_8812",          // o id dele na SUA plataforma (único)
    "email": "joao@email.com",
    "name": "João da Silva",
    "phone": "11987654321",
    "storeName": "Loja do João"
  }'

# resposta (201 criado; 200 com idempotentReplay quando o externalId já existe)
{
  "id": "6f1c...",                      // sellerId: use nas próximas chamadas
  "externalId": "user_8812",
  "kycStatus": "not_started",
  "createdAt": "2026-10-17T15:00:00Z"
}

2. Documentos e cadastro

Suba cada arquivo e guarde o fileId. Obrigatórios: frente e verso do documento (só a frente no passaporte) e uma selfie. Comprovante de endereço e de conta bancária são recomendados: a processadora costuma pedir depois.

POST/partner-api/sellers/{id}/documentsGuarda um documento.
curl -X POST https://api.pag3b.com/v1/partner-api/sellers/$SELLER_ID/documents \
  -H "Authorization: Bearer $CHAVE_PARCEIRO" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "id_front",                 // id_front | id_back | selfie | address_proof | company_registration | bank_proof
    "contentType": "image/jpeg",        // image/jpeg | image/png | application/pdf (selfie: só foto)
    "fileBase64": "/9j/4AAQSkZJRg..."   // até 5 MB
  }'

# resposta
{ "fileId": "0b7e..." }

Depois envie o cadastro. Os campos e as regras são os mesmos do cadastro do painel da 3B (CPF e CNPJ conferidos pelo dígito, endereço com número e bairro separados). O aceite dos termos é do seu cliente, dentro da sua plataforma: mande a versão, a data e o IP dele em terms.

POST/partner-api/sellers/{id}/submitEnvia o cadastro para análise.
curl -X POST https://api.pag3b.com/v1/partner-api/sellers/$SELLER_ID/submit \
  -H "Authorization: Bearer $CHAVE_PARCEIRO" \
  -H "Content-Type: application/json" \
  -d '{
    "terms": { "version": "2026-10", "acceptedAt": "2026-10-17T14:58:00Z", "ip": "177.10.20.30" },
    "tosAccepted": true,
    "aupAccepted": true,
    "entityType": "individual",         // individual (CPF) | company (CNPJ)
    "person": {
      "givenName": "João", "surname": "da Silva",
      "cpf": "12345678909",
      "dob": { "day": 10, "month": 5, "year": 1990 },
      "email": "joao@email.com", "phone": "11987654321",
      "motherName": "Maria da Silva",
      "monthlyIncomeCents": 500000,
      "professionalOccupation": "Empresário",
      "documentType": "DRIVERS",        // DRIVERS | ID_CARD | PASSPORT | RESIDENCE_PERMIT
      "documentFrontId": "<fileId>", "documentBackId": "<fileId>",
      "selfieId": "<fileId>", "addressProofId": "<fileId>",
      "address": {
        "line1": "Rua das Flores", "streetNumber": "100", "neighborhood": "Centro",
        "city": "São Paulo", "state": "SP", "postalCode": "01001-000"
      }
    },
    "bank": {
      "bankCode": "260", "branchCode": "0001",
      "accountNumber": "1234567-8", "accountType": "checking",
      "holderName": "João da Silva"
    },
    "businessProfile": {
      "storeName": "Loja do João",
      "productDescription": "Curso online de edição de vídeo",
      "supportEmail": "suporte@lojadojoao.com"
    }
  }'

# resposta
{ "ok": true, "submissionId": "a91d...", "status": "submitted" }

Cliente com CNPJ: entityType: "company" e o bloco business, com o sócio administrador.

"entityType": "company",
"business": {
  "registeredName": "Loja do João LTDA",
  "cnpj": "12345678000190",
  "foundingDate": "15/03/2021",
  "annualRevenueCents": 12000000,
  "registrationFileId": "<fileId>",
  "address": { "line1": "...", "streetNumber": "...", "neighborhood": "...", "city": "...", "state": "SP", "postalCode": "..." },
  "managingPartner": {
    "name": "João da Silva", "cpf": "12345678909", "isSelf": true, "ownershipPercent": 100,
    "dob": { "day": 10, "month": 5, "year": 1990 },
    "monthlyIncomeCents": 500000, "professionalOccupation": "Empresário",
    "address": { "line1": "...", "streetNumber": "...", "neighborhood": "...", "city": "...", "state": "SP", "postalCode": "..." }
  }
}
A 3B analisa cada cadastro. Erro de validação volta na hora, com a mensagem do campo. Se a análise pedir mais informação, o status vira more_info_needed com o motivo, e você pode enviar de novo.

3. Acompanhar o status

Aprovado, o vendedor ganha conta na processadora. Ela pode pedir uma verificação feita pelo próprio cliente (documento e selfie na hora, ou os dados da empresa). Mostre ao seu cliente o que está em pending e abra o link de verificationLinks para ele. Sem a verificação aprovada, a conta de saque não é cadastrada.

GET/partner-api/sellers/{id}Status completo.
curl https://api.pag3b.com/v1/partner-api/sellers/$SELLER_ID \
  -H "Authorization: Bearer $CHAVE_PARCEIRO"

# resposta
{
  "id": "6f1c...", "externalId": "user_8812",
  "kycStatus": "approved",              // not_started | submitted | in_review | more_info_needed
                                        // | approved | rejected | suspended
  "reason": null,                       // motivo, quando recusado ou pedindo informação
  "canSell": true,
  "canWithdraw": false,
  "whop": { "accountId": "biz_...", "canAcceptCards": true, "canPayout": false, "hasPayoutDestination": false },
  "pending": [                          // o que falta, e quem resolve
    { "owner": "seller", "step": "verificacao", "title": "Fazer a verificação de identidade",
      "description": "...", "verificationKind": "individual" }
  ],
  "verificationLinks": [                // abra para o vendedor
    { "kind": "individual", "status": "pending", "url": "https://..." }
  ]
}
POST/partner-api/sellers/{id}/verification-linkGera o link da verificação.
curl -X POST https://api.pag3b.com/v1/partner-api/sellers/$SELLER_ID/verification-link \
  -H "Authorization: Bearer $CHAVE_PARCEIRO" \
  -H "Content-Type: application/json" \
  -d '{ "kind": "individual" }'         // individual | business

# resposta
{ "kind": "individual", "url": "https://..." }

4. Cobrar em nome do vendedor

A cobrança é a mesma da API de cartão, com a sua chave de parceiro e o cabeçalho X-Seller-Id. Só vendedor aprovado cobra. Taxas e reserva são as da conta do vendedor.

POST/api-chargesCobrança em nome do vendedor.
curl -X POST https://api.pag3b.com/v1/api-charges \
  -H "Authorization: Bearer $CHAVE_PARCEIRO" \
  -H "X-Seller-Id: $SELLER_ID" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-555" \
  -d '{
    "amount": 2990,
    "currency": "usd",
    "description": "Acesso VIP",
    "reference": "pedido-555",
    "successUrl": "https://suaplataforma.com/obrigado",
    "split": { "percent": 3, "amount": 100 }
  }'

# resposta: o checkout da Whop para mandar o comprador
{ "id": "plan_...", "status": "awaiting_payment", "partnerSplit": 190,
  "checkout": { "planId": "plan_...", "url": "https://..." } }

As vendas do vendedor: GET /partner-api/sellers/{id}/orders (filtros status, limit e before).

Split: a sua taxa em cada venda

Mande split na cobrança com a sua parte: percent (do valor da venda), amount (fixo, em centavos da moeda da cobrança) ou os dois juntos. Sem o campo, vale o split padrão da sua conta. A sua parte sai do valor do vendedor e é transferida para a sua conta na 3B 7 dias depois do pagamento. Vale nas cobranças fora do real.

PUT/partner-api/splitDefine o split padrão (GET para ler).
# o split padrão (vale quando a cobrança não manda "split")
curl -X PUT https://api.pag3b.com/v1/partner-api/split   -H "Authorization: Bearer $CHAVE_PARCEIRO"   -H "Content-Type: application/json"   -d '{ "percent": 3, "amount": 100 }'

{ "percent": 3, "amount": 100, "limits": { "percent": 10, "amount": 500 }, "holdDays": 7 }
GET/partner-api/splitsAs vendas com split e o repasse de cada uma.
curl https://api.pag3b.com/v1/partner-api/splits?limit=50   -H "Authorization: Bearer $CHAVE_PARCEIRO"

{ "data": [
  { "orderId": "...", "sellerId": "...", "amount": 2990, "currency": "usd", "split": 190,
    "status": "scheduled", "availableOn": "2026-10-27T15:04:00Z", "paidAt": null }
] }
# status: scheduled (aguardando os 7 dias), paid (repassado), cancelled (reembolso ou contestação), not_paid
O destino é sempre a sua conta na 3B, ligada à chave: não existe account id na requisição. Cada conta tem um teto por cobrança (em limits); acima dele a cobrança é recusada com split_above_limit, nunca cortada. Venda reembolsada ou contestada antes dos 7 dias não gera repasse.

5. Saldo e saque

GET/partner-api/sellers/{id}/balanceSaldo por moeda.
curl https://api.pag3b.com/v1/partner-api/sellers/$SELLER_ID/balance \
  -H "Authorization: Bearer $CHAVE_PARCEIRO"

# resposta (centavos, por moeda)
{
  "data": [
    { "currency": "usd", "available": 15230, "pending": 4100, "reserve": 800, "inTransit": 0,
      "pendingSettlements": [ { "date": "2026-10-22", "amountCents": 4100 } ] }
  ],
  "payoutFee": { "amount": 150, "note": "Taxa da processadora por saque, na moeda do saque (1,50)." }
}
POST/partner-api/sellers/{id}/payoutsPede o saque.
curl -X POST https://api.pag3b.com/v1/partner-api/sellers/$SELLER_ID/payouts \
  -H "Authorization: Bearer $CHAVE_PARCEIRO" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: saque-user_8812-0001" \
  -d '{ "amount": 15000, "currency": "usd" }'

# resposta (201)
{
  "id": "c3f0...", "status": "requested",
  "amount": 15000, "currency": "usd",
  "fee": 150, "net": 14850,
  "processorPayoutId": "wdrl_..."
}
Idempotency-Key é obrigatória no saque: repetir com a mesma chave devolve o mesmo saque e nunca saca duas vezes. O valor sai do saldo disponível da moeda. A processadora desconta a taxa dela (1,50 na moeda do saque) e converte para real no câmbio do dia. O histórico, com o status vivo de cada saque, está em GET /partner-api/sellers/{id}/payouts.

Webhooks

Um endpoint só, com os eventos de todos os seus vendedores. Chegam assinados do mesmo jeito do webhook do vendedor: confira a assinatura como em Webhooks e eventos e deduplique pelo id. seller.updated avisa que o cadastro mudou: consulte GET /sellers/{id} para o detalhe.

PUT/partner-api/webhookCadastra o endpoint.
curl -X PUT https://api.pag3b.com/v1/partner-api/webhook \
  -H "Authorization: Bearer $CHAVE_PARCEIRO" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://suaplataforma.com/webhooks/3b" }'

# resposta (o secret aparece só na criação ou com "rotateSecret": true)
{ "url": "https://suaplataforma.com/webhooks/3b", "active": true, "secret": "whsec_3b_..." }

# um evento
{
  "id": "evt_6a0b..._paid",
  "type": "order.paid",                 // order.paid | order.failed | seller.updated | payout.created
  "created": "2026-10-17T15:10:00Z",
  "data": {
    "sellerId": "6f1c...", "externalId": "user_8812",
    "order": { "id": "...", "status": "paid", "currency": "usd", "amount": 2990,
               "sellerAmount": 2440, "reference": "pedido-555" }
  }
}

Erros

401unauthorizedChave ausente, fora do formato ou desconhecida.
403ip_not_allowedO IP de saída do seu servidor não está liberado para esta chave.
403partner_disabledA API do parceiro foi desligada pela 3B.
404seller_not_foundVendedor inexistente ou de outro parceiro.
400split_above_limitO split passa do teto da sua conta (GET /partner-api/split mostra o teto).
400invalid_splitsplit fora do formato: percent até 2 casas, amount inteiro em centavos.
400split_not_supported_currencysplit em cobrança em real. O split vale fora do real.
409email_in_useO e-mail já tem conta na 3B. Use outro.
409seller_not_approvedO vendedor ainda não foi aprovado pela 3B.
409payout_destination_missingO vendedor ainda não tem conta de saque cadastrada na processadora.
409insufficient_balanceSaldo disponível menor que o pedido (a resposta traz o disponível).
400idempotency_key_requiredSaque sem o cabeçalho Idempotency-Key.
400destination_not_allowedO corpo tentou dizer para onde vai o saque.
429rate_limitedMais de 600 chamadas por minuto.
502payout_failedA processadora recusou o saque.