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
- 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.
- 2A chave fica só no servidor. A 3B entrega uma chave
3bpt_live_..., mostrada uma vez. Toda chamada levaAuthorization: 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. - 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.
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.
/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.
/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.
/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": "..." }
}
}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.
/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://..." }
]
}/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.
/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.
/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 }/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_paidlimits); 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
/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)." }
}/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_..."
}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.
/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
unauthorizedChave ausente, fora do formato ou desconhecida.ip_not_allowedO IP de saída do seu servidor não está liberado para esta chave.partner_disabledA API do parceiro foi desligada pela 3B.seller_not_foundVendedor inexistente ou de outro parceiro.split_above_limitO split passa do teto da sua conta (GET /partner-api/split mostra o teto).invalid_splitsplit fora do formato: percent até 2 casas, amount inteiro em centavos.split_not_supported_currencysplit em cobrança em real. O split vale fora do real.email_in_useO e-mail já tem conta na 3B. Use outro.seller_not_approvedO vendedor ainda não foi aprovado pela 3B.payout_destination_missingO vendedor ainda não tem conta de saque cadastrada na processadora.insufficient_balanceSaldo disponível menor que o pedido (a resposta traz o disponível).idempotency_key_requiredSaque sem o cabeçalho Idempotency-Key.destination_not_allowedO corpo tentou dizer para onde vai o saque.rate_limitedMais de 600 chamadas por minuto.payout_failedA processadora recusou o saque.
