Como funciona
- Abra a conta com os dados básicos (e, se tiver, os dados completos do KYC).
- Envie os documentos e a prova de vida pela API, se o seu app tem câmera, ou mande ao titular o link de verificação para ele fazer pelo celular.
- Envie para análise. A Arcano Pay roda a análise automática e a equipe decide, normalmente em até 1 dia útil.
- Receba o resultado por webhook (
kyc.approved,kyc.rejectedoukyc.resubmission_requested). - Integre a conta aprovada: gere a chave
sk_live_dela, cadastre os webhooks de vendas e, se quiser, convide o titular para o portal.
| Status da conta | Significado | nextStep |
|---|---|---|
| pending_kyc | Aberta, falta enviar o KYC (ou corrigir, se pedido) | send_kyc |
| in_review | Enviada, em análise | wait_review |
| active | Aprovada: pode cobrar e sacar | ready |
| rejected | Reprovada (motivo em kyc.reason) | none |
| suspended | Suspensa pela Arcano Pay | none |
Autenticação
Use a chave de parceiro (pk_live_…) que a Arcano Pay enviou, no cabeçalho Authorization: Bearer. Ela só funciona em /partner/v1 e só enxerga as contas que você abriu. Guarde no servidor, nunca no app ou no navegador.
curl https://stage.arcanopay.com/partner/v1/me -H "Authorization: Bearer $ARCANO_PARTNER_KEY" -H "Content-Type: application/json"
Abrir conta
type é individual (PF) ou company (PJ). Repetir o mesmo externalId devolve a conta já aberta (200, existing: true): seguro para novas tentativas. CPF/CNPJ ou e-mail que já tenham conta na Arcano Pay respondem 409.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| type | string | sim | individual ou company |
| document | string | sim | CPF (PF) ou CNPJ (PJ), com ou sem pontuação |
| name | string | sim | Nome completo (PF) ou razão social (PJ) |
| tradeName | string | não | Nome fantasia (PJ) |
| email / phone | string | sim | Contato da conta. Na PF, o e-mail também é o login do titular |
| representative | objeto | PJ | name, email (login do portal), cpf, birthDate, motherName, pep |
| person | objeto | não | PF: birthDate (AAAA-MM-DD), motherName, occupation, pep |
| company | objeto | não | PJ: businessActivity, openingDate, website, monthlyRevenue (centavos) |
| address | objeto | não | zipCode, street, number, complement, neighborhood, city, state |
| externalId | string | recomendado | Id do cliente no seu sistema; também serve no lugar do id nas rotas |
| sendPortalInvite | boolean | não | Envia ao titular o e-mail para criar a senha do portal (padrão false) |
curl -X POST https://stage.arcanopay.com/partner/v1/accounts -H "Authorization: Bearer $ARCANO_PARTNER_KEY" -H "Content-Type: application/json" -d '{
"type": "individual",
"externalId": "cli-42",
"document": "529.982.247-25",
"name": "Maria Silva Souza",
"email": "maria@exemplo.com",
"phone": "11987654321",
"person": { "birthDate": "1990-05-10", "motherName": "Ana Silva", "pep": false },
"address": { "zipCode": "01001000", "street": "Praça da Sé", "number": "1",
"neighborhood": "Sé", "city": "São Paulo", "state": "SP" }
}'curl -X POST https://stage.arcanopay.com/partner/v1/accounts -H "Authorization: Bearer $ARCANO_PARTNER_KEY" -H "Content-Type: application/json" -d '{
"type": "company",
"externalId": "loja-7",
"document": "11.222.333/0001-81",
"name": "Casa Dionísio Comércio LTDA",
"tradeName": "Casa Dionísio",
"email": "financeiro@casadionisio.com.br",
"phone": "1133334444",
"representative": { "name": "João Pereira Lima", "email": "joao@casadionisio.com.br",
"cpf": "111.444.777-35", "birthDate": "1985-02-20" },
"company": { "businessActivity": "Comércio de vinhos", "monthlyRevenue": 5000000 },
"address": { "zipCode": "01001000", "street": "Praça da Sé", "number": "1",
"neighborhood": "Sé", "city": "São Paulo", "state": "SP" }
}'A resposta traz account e kyc, com requirements e missing (o que ainda falta: person, company, address, idFront, companyDocument, liveness).
Dados do KYC
Completa ou corrige os dados depois da abertura. Envie só os blocos que quiser: person (titular ou representante: fullName, cpf, birthDate, motherName, phone, occupation, pep), company (legalName, cnpj, businessActivity…) e address. Só pode ser alterado antes do envio ou quando a análise pedir ajuste.
Documentos
Envie como multipart/form-data (campos kind, docType e file) ou em JSON com contentBase64. JPG, PNG, WEBP ou PDF (PDF só para documento da empresa e comprovante), até 8 MB. Reenviar o mesmo kind substitui o anterior.
| kind | Obrigatório | docType (opcional) |
|---|---|---|
| id_front | sim | cnh, rg, rne, passaporte |
| id_back | recomendado | mesmo do id_front |
| company_document | PJ | contrato_social, cartao_cnpj, ccmei, estatuto |
| proof_of_address | não | — |
curl -X POST https://stage.arcanopay.com/partner/v1/accounts/cli-42/kyc/documents -H "Authorization: Bearer $ARCANO_PARTNER_KEY" -H "Content-Type: application/json" -d '{
"kind": "id_front", "docType": "cnh", "fileName": "frente.jpg",
"contentBase64": "/9j/4AAQSkZJRgABAQ..."
}'Prova de vida (no seu app)
Para quem tem câmera no próprio app. A Arcano Pay sorteia os desafios; tire cada foto na hora, na ordem, e conclua em até 3 minutos. O passo 0 (olhar para a câmera) vira a selfie comparada com o documento.
# 1. começa: devolve sessionId e os passos (ex.: olhar para a câmera, virar à esquerda, sorrir…)
POST /partner/v1/accounts/:id/kyc/liveness
→ { "sessionId": "lvs_…", "expiresAt": "…", "steps": [{ "challenge": "look_straight", "instruction": "Olhe para a câmera" }, …] }
# 2. uma foto por passo (multipart com step e file, ou JSON com contentBase64)
POST /partner/v1/accounts/:id/kyc/liveness/:sessionId/frames { "step": 0, "contentBase64": "…" }
# 3. conclui
POST /partner/v1/accounts/:id/kyc/liveness/:sessionId/completeLink para o titular
Sem câmera no seu app? Gere um link e mande por e-mail, SMS ou WhatsApp. O titular (ou o representante da PJ) abre no celular, fotografa os documentos, faz a prova de vida e envia para análise, sem login e sem ver os dados cadastrais. O link deixa de valer depois do envio.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| expiresInHours | inteiro | não | De 1 a 720 (padrão 72) |
| redirectUrl | string | não | HTTPS: para onde o titular volta ao terminar |
curl -X POST https://stage.arcanopay.com/partner/v1/accounts/cli-42/kyc/link -H "Authorization: Bearer $ARCANO_PARTNER_KEY" -H "Content-Type: application/json" -d '{ "expiresInHours": 48, "redirectUrl": "https://seu-sistema.com/pronto" }'
→ { "id": "kyl_…", "url": "https://portal.arcanopay.com/verificacao/kyl_…", "expiresAt": "…" }Enviar para análise
Confere tudo e envia. Se faltar algo, responde 422 com details.missing. Enviado pelo link, não precisa chamar esta rota. A conta passa a in_review e você recebe kyc.submitted e, depois da análise automática, kyc.in_review.
Acompanhar
Liste com filtros status, kycStatus, document, externalId, limit e offset. :id aceita o id da conta (mer_…) ou o seu externalId. /kyc traz o que falta, os documentos enviados e o histórico (events). Quando a análise pede ajuste, o motivo vem em account.kyc.reason: corrija e envie de novo.
Depois da aprovação
| Rota | Para quê |
|---|---|
| POST /partner/v1/accounts/:id/api-keys | Gera a chave sk_live_ da conta (aparece só na resposta) para usar a API de pagamentos /v1 |
| GET · DELETE /partner/v1/accounts/:id/api-keys[/:keyId] | Lista e revoga as chaves da conta |
| POST /partner/v1/accounts/:id/webhooks | Cadastra o webhook de vendas, estornos e saques da conta (devolve o segredo) |
| GET · DELETE /partner/v1/accounts/:id/webhooks[/:id] | Lista e remove |
| POST /partner/v1/accounts/:id/portal-invite | Envia ao titular o e-mail para criar a senha do portal (vale 7 dias) |
Com a chave sk_live_ da conta, siga a documentação de pagamentos (Pix, cartão, estornos, saques e conciliação), disponível no portal da conta em Integração › Documentação.
Transferir para as contas abertas
Se a sua plataforma recebe pelos clientes (por exemplo, vende o serviço deles e repassa o valor), transfira do saldo disponível da sua conta Arcano Pay direto para a conta que você abriu para cada um. É na hora, sem Pix e sem tarifa: o valor sai da sua conta e entra na do cliente no mesmo instante, e os dois extratos mostram o lançamento (transfer_out e transfer_in). A conta de origem é a conta Arcano Pay da sua empresa, ligada ao seu cadastro de parceiro pela equipe Arcano Pay. Só contas active recebem.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| amount | inteiro | sim | Centavos, de 100 (R$ 1,00) a 100.000.000 |
| externalId | string | recomendado | Referência no seu sistema (até 100). Repetir devolve a mesma transferência (200, existing: true), sem transferir de novo |
| description | string | não | Até 140 caracteres; aparece no extrato das duas contas |
curl -X POST https://stage.arcanopay.com/partner/v1/accounts/cli-42/transfers -H "Authorization: Bearer $ARCANO_PARTNER_KEY" -H "Content-Type: application/json" -d '{
"amount": 15840, "externalId": "repasse-981", "description": "Repasse · Troca de disjuntor"
}'
→ 201 { "existing": false, "transfer": { "id": "tr_…", "accountId": "mer_…", "externalId": "repasse-981",
"amount": 15840, "description": "Repasse · Troca de disjuntor", "createdAt": "…" } }| Rota | Para quê |
|---|---|
| GET /partner/v1/balance | Saldo da sua conta de origem: { accountId, balance: { available, pending } } em centavos |
| GET /partner/v1/accounts/:id/balance | Saldo da conta do cliente (mesmo formato) |
| GET /partner/v1/accounts/:id/transfers | Transferências feitas para a conta (limit e offset) |
| GET /partner/v1/transfers/:id | Uma transferência, pelo id (tr_…) ou pelo seu externalId |
Erros: 422 saldo disponível insuficiente (nada é transferido) ou dados inválidos; 409 conta de destino ainda não ativa, parceiro sem conta de origem ou externalId já usado em outra transferência; 404 conta de outro parceiro. Você recebe o webhook transfer.completed com data.transfer e data.account.
Gestão das contas
A conta é do titular; você gere o vínculo dela com a sua plataforma. Tudo também pode ser feito no Portal do Parceiro, onde sua equipe acompanha as contas e a comissão. O motivo (reason, de 5 a 300 caracteres) é obrigatório, menos para reativar.
| Rota | O que faz |
|---|---|
| POST /partner/v1/accounts/:id/pause | Pausa as vendas: a conta não cria cobranças (API, portal e link de pagamento) até você reativar. O saldo continua do titular e o saque segue liberado. O titular vê o aviso com o motivo |
| POST /partner/v1/accounts/:id/resume | Reativa as vendas |
| POST /partner/v1/accounts/:id/revoke | Desvincula a conta: você perde o acesso a ela, as chaves de API e os webhooks que criou para ela param, e a comissão dela para no mesmo dia. A conta segue ativa com a Arcano Pay. Não dá para desfazer |
| POST /partner/v1/accounts/:id/closure-request | Pede o encerramento: a Arcano Pay confere saldo e pendências e encerra pelas regras do Banco Central |
| GET /partner/v1/commissions?period=AAAA-MM | Sua comissão no mês: nível, contas vendendo, ativações, margem, bônus, participação e o extrato fechado (statement) |
A resposta traz account.link com status (active, paused ou revoked), reason e changedAt. Em conta desvinculada, as outras rotas devolvem 409 com code: account_revoked; a consulta da conta continua funcionando. Uma cobrança numa conta pausada devolve 403 com code: sales_paused.
Webhooks do parceiro
Cadastre uma URL HTTPS com { "url": "https://…", "events": ["*"] }. A resposta traz o secret para verificar a assinatura Arcano-Signature: t=…,v1=HMAC-SHA256(secret, t + "." + corpo), igual aos webhooks de pagamento. Reenviamos em caso de falha (até 24 h) e você vê as entregas em GET /partner/v1/webhook-deliveries. A ordem de chegada não é garantida: use createdAt e o status em data.account.
| Evento | Quando |
|---|---|
| account.created | Conta aberta |
| kyc.submitted | KYC enviado para análise |
| kyc.in_review | Análise automática concluída; aguardando a equipe |
| kyc.approved | Conta aprovada (status active) |
| kyc.rejected | Reprovada; motivo em data.account.kyc.reason |
| kyc.resubmission_requested | A análise pediu ajuste; motivo em data.account.kyc.reason |
| transfer.completed | Transferência para uma conta concluída; data.transfer e data.account |
| account.paused / account.resumed | Vendas da conta pausadas ou reativadas |
| account.revoked | Conta desvinculada da sua parceria |
| account.closure_requested | Encerramento da conta pedido |
{
"id": "evt_…",
"type": "kyc.approved",
"createdAt": "2026-10-20T13:02:11.000Z",
"data": {
"account": {
"id": "mer_…", "externalId": "cli-42", "type": "individual", "status": "active",
"kyc": { "id": "kyc_…", "status": "approved", "nextStep": "ready" }
}
}
}Erros
| HTTP | Quando |
|---|---|
| 401 | Chave ausente, inválida ou revogada |
| 403 | Parceiro suspenso |
| 404 | Conta não encontrada (ou de outro parceiro) |
| 409 | CPF/CNPJ ou e-mail já cadastrado, externalId em uso, KYC já enviado, conta ainda não aprovada, parceiro sem conta de origem, conta desvinculada (account_revoked) |
| 410 | Sessão de prova de vida ou link expirado |
| 422 | Dados inválidos (details traz campo e mensagem) ou itens faltando (details.missing) |
Para ser parceiro, fale com a Arcano Pay: cadastramos a sua empresa e enviamos a chave pk_live_.