curl --request POST \
--url https://api.sandbox.z2pay.com/v1/recipients \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "<string>",
"email": "jsmith@example.com",
"document": "<string>",
"phone": "<string>",
"companyType": "<string>",
"companyLegalName": "<string>",
"companyFoundingDate": "<string>",
"annualRevenue": 50000000000000,
"corporationType": "<string>",
"birthDate": "<string>",
"motherName": "<string>",
"profession": "<string>",
"monthlyIncome": 50000000000000,
"legalRepresentativeInfo": {
"name": "<string>",
"document": "<string>",
"email": "jsmith@example.com",
"motherName": "<string>",
"birthdate": "<string>",
"monthlyIncome": 50000000000000,
"profession": "<string>",
"phone": "<string>",
"selfDeclaredRepresentative": true
},
"pixKeyType": "<string>",
"pixKey": "<string>",
"website": "<string>",
"address": {
"address": "<string>",
"number": "<string>",
"complement": "<string>",
"neighborhood": "<string>",
"city": "<string>",
"state": "<string>",
"postalCode": "<string>",
"referencePoint": "<string>"
},
"files": {
"identificationDocument": "<string>",
"selfie": "<string>",
"addressProof": "<string>",
"socialContract": "<string>",
"powerOfAttorney": "<string>"
}
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
email: 'jsmith@example.com',
document: '<string>',
phone: '<string>',
companyType: '<string>',
companyLegalName: '<string>',
companyFoundingDate: '<string>',
annualRevenue: 50000000000000,
corporationType: '<string>',
birthDate: '<string>',
motherName: '<string>',
profession: '<string>',
monthlyIncome: 50000000000000,
legalRepresentativeInfo: {
name: '<string>',
document: '<string>',
email: 'jsmith@example.com',
motherName: '<string>',
birthdate: '<string>',
monthlyIncome: 50000000000000,
profession: '<string>',
phone: '<string>',
selfDeclaredRepresentative: true
},
pixKeyType: '<string>',
pixKey: '<string>',
website: '<string>',
address: {
address: '<string>',
number: '<string>',
complement: '<string>',
neighborhood: '<string>',
city: '<string>',
state: '<string>',
postalCode: '<string>',
referencePoint: '<string>'
},
files: {
identificationDocument: '<string>',
selfie: '<string>',
addressProof: '<string>',
socialContract: '<string>',
powerOfAttorney: '<string>'
}
})
};
fetch('https://api.sandbox.z2pay.com/v1/recipients', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sandbox.z2pay.com/v1/recipients"
payload = {
"name": "<string>",
"email": "jsmith@example.com",
"document": "<string>",
"phone": "<string>",
"companyType": "<string>",
"companyLegalName": "<string>",
"companyFoundingDate": "<string>",
"annualRevenue": 50000000000000,
"corporationType": "<string>",
"birthDate": "<string>",
"motherName": "<string>",
"profession": "<string>",
"monthlyIncome": 50000000000000,
"legalRepresentativeInfo": {
"name": "<string>",
"document": "<string>",
"email": "jsmith@example.com",
"motherName": "<string>",
"birthdate": "<string>",
"monthlyIncome": 50000000000000,
"profession": "<string>",
"phone": "<string>",
"selfDeclaredRepresentative": True
},
"pixKeyType": "<string>",
"pixKey": "<string>",
"website": "<string>",
"address": {
"address": "<string>",
"number": "<string>",
"complement": "<string>",
"neighborhood": "<string>",
"city": "<string>",
"state": "<string>",
"postalCode": "<string>",
"referencePoint": "<string>"
},
"files": {
"identificationDocument": "<string>",
"selfie": "<string>",
"addressProof": "<string>",
"socialContract": "<string>",
"powerOfAttorney": "<string>"
}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "rec_gk1o75xv3ioi4eoqosorz9s62",
"accountName": null,
"name": "Joao da Silva",
"email": "joao.silva@example.com",
"phone": "+5511987654321",
"document": "12345678901",
"type": "individual",
"companyType": null,
"companyLegalName": null,
"companyFoundingDate": null,
"annualRevenue": null,
"corporationType": null,
"birthDate": null,
"motherName": null,
"profession": null,
"monthlyIncome": null,
"legalRepresentativeInfo": null,
"pixKeyType": null,
"pixKey": null,
"website": null,
"mainAddress": null,
"defaultBankAccount": null,
"role": "seller",
"status": "new",
"splitValue": null,
"splitType": null,
"pixAntecipationDays": null,
"bankSlipAntecipationDays": null,
"creditCardAntecipationDays": null,
"approvedAt": null,
"refusedAt": null,
"analysisComplete": false,
"pendencies": [],
"pendenciesSummary": {
"open": 0,
"blocking": 0,
"warning": 0
},
"createdAt": "2025-06-29T13:45:30.000Z",
"updatedAt": "2025-06-29T13:45:30.000Z"
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Validation failed",
"issues": [
{
"path": "status",
"message": "Status inválido. Valores aceitos: pending, waiting_payment, paid, refused, canceled, refunded"
},
{
"path": "startDate",
"message": "Data deve ser ISO 8601 com timezone (ex.: 2026-06-24T00:00:00Z)"
}
]
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid API key"
}
}{
"error": "A request with this idempotency key is already being processed"
}{
"error": "Idempotency key already used with a different request body"
}Criar recebedor
Cadastra quem vai receber repasses na sua conta — ou reaproveita um cadastro que já existe.
curl --request POST \
--url https://api.sandbox.z2pay.com/v1/recipients \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "<string>",
"email": "jsmith@example.com",
"document": "<string>",
"phone": "<string>",
"companyType": "<string>",
"companyLegalName": "<string>",
"companyFoundingDate": "<string>",
"annualRevenue": 50000000000000,
"corporationType": "<string>",
"birthDate": "<string>",
"motherName": "<string>",
"profession": "<string>",
"monthlyIncome": 50000000000000,
"legalRepresentativeInfo": {
"name": "<string>",
"document": "<string>",
"email": "jsmith@example.com",
"motherName": "<string>",
"birthdate": "<string>",
"monthlyIncome": 50000000000000,
"profession": "<string>",
"phone": "<string>",
"selfDeclaredRepresentative": true
},
"pixKeyType": "<string>",
"pixKey": "<string>",
"website": "<string>",
"address": {
"address": "<string>",
"number": "<string>",
"complement": "<string>",
"neighborhood": "<string>",
"city": "<string>",
"state": "<string>",
"postalCode": "<string>",
"referencePoint": "<string>"
},
"files": {
"identificationDocument": "<string>",
"selfie": "<string>",
"addressProof": "<string>",
"socialContract": "<string>",
"powerOfAttorney": "<string>"
}
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
email: 'jsmith@example.com',
document: '<string>',
phone: '<string>',
companyType: '<string>',
companyLegalName: '<string>',
companyFoundingDate: '<string>',
annualRevenue: 50000000000000,
corporationType: '<string>',
birthDate: '<string>',
motherName: '<string>',
profession: '<string>',
monthlyIncome: 50000000000000,
legalRepresentativeInfo: {
name: '<string>',
document: '<string>',
email: 'jsmith@example.com',
motherName: '<string>',
birthdate: '<string>',
monthlyIncome: 50000000000000,
profession: '<string>',
phone: '<string>',
selfDeclaredRepresentative: true
},
pixKeyType: '<string>',
pixKey: '<string>',
website: '<string>',
address: {
address: '<string>',
number: '<string>',
complement: '<string>',
neighborhood: '<string>',
city: '<string>',
state: '<string>',
postalCode: '<string>',
referencePoint: '<string>'
},
files: {
identificationDocument: '<string>',
selfie: '<string>',
addressProof: '<string>',
socialContract: '<string>',
powerOfAttorney: '<string>'
}
})
};
fetch('https://api.sandbox.z2pay.com/v1/recipients', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sandbox.z2pay.com/v1/recipients"
payload = {
"name": "<string>",
"email": "jsmith@example.com",
"document": "<string>",
"phone": "<string>",
"companyType": "<string>",
"companyLegalName": "<string>",
"companyFoundingDate": "<string>",
"annualRevenue": 50000000000000,
"corporationType": "<string>",
"birthDate": "<string>",
"motherName": "<string>",
"profession": "<string>",
"monthlyIncome": 50000000000000,
"legalRepresentativeInfo": {
"name": "<string>",
"document": "<string>",
"email": "jsmith@example.com",
"motherName": "<string>",
"birthdate": "<string>",
"monthlyIncome": 50000000000000,
"profession": "<string>",
"phone": "<string>",
"selfDeclaredRepresentative": True
},
"pixKeyType": "<string>",
"pixKey": "<string>",
"website": "<string>",
"address": {
"address": "<string>",
"number": "<string>",
"complement": "<string>",
"neighborhood": "<string>",
"city": "<string>",
"state": "<string>",
"postalCode": "<string>",
"referencePoint": "<string>"
},
"files": {
"identificationDocument": "<string>",
"selfie": "<string>",
"addressProof": "<string>",
"socialContract": "<string>",
"powerOfAttorney": "<string>"
}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "rec_gk1o75xv3ioi4eoqosorz9s62",
"accountName": null,
"name": "Joao da Silva",
"email": "joao.silva@example.com",
"phone": "+5511987654321",
"document": "12345678901",
"type": "individual",
"companyType": null,
"companyLegalName": null,
"companyFoundingDate": null,
"annualRevenue": null,
"corporationType": null,
"birthDate": null,
"motherName": null,
"profession": null,
"monthlyIncome": null,
"legalRepresentativeInfo": null,
"pixKeyType": null,
"pixKey": null,
"website": null,
"mainAddress": null,
"defaultBankAccount": null,
"role": "seller",
"status": "new",
"splitValue": null,
"splitType": null,
"pixAntecipationDays": null,
"bankSlipAntecipationDays": null,
"creditCardAntecipationDays": null,
"approvedAt": null,
"refusedAt": null,
"analysisComplete": false,
"pendencies": [],
"pendenciesSummary": {
"open": 0,
"blocking": 0,
"warning": 0
},
"createdAt": "2025-06-29T13:45:30.000Z",
"updatedAt": "2025-06-29T13:45:30.000Z"
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Validation failed",
"issues": [
{
"path": "status",
"message": "Status inválido. Valores aceitos: pending, waiting_payment, paid, refused, canceled, refunded"
},
{
"path": "startDate",
"message": "Data deve ser ISO 8601 com timezone (ex.: 2026-06-24T00:00:00Z)"
}
]
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid API key"
}
}{
"error": "A request with this idempotency key is already being processed"
}{
"error": "Idempotency key already used with a different request body"
}POST /recipients
Faz parte do recurso Recebedores — os estados do vínculo, o ciclo de aprovação
e o catálogo de pendências estão lá.
Cria o recebedor e o vincula à sua conta. A resposta traz o cadastro e o estado do vínculo com a
sua conta — status e role descrevem a relação, não a pessoa.
new e só vira destino válido de
split quando chega a active. Entre uma coisa e outra há documentos a enviar e,
em muitos casos, prova de vida. Ver
Ciclo de aprovação.status: "active". Uma integração que assuma new no 201 erra exatamente no reenvio.409 quando o e-mail informado já pertence a outro
documento — a mensagem não revela qual, de propósito. Também responde 409 quando o e-mail é de
uma conta de usuário da plataforma. A saída é usar um e-mail do próprio recebedor, não o do
lojista.name, email,
document e type faz o recebedor nascer em new, para preencher o resto pelo
formulário. Mas assim que o corpo traz address, bankAccount ou
files — qualquer um dos três, não os três juntos —, passam a ser exigidos todos os campos
que a análise precisa para o type informado, listados abaixo. O que faltar volta em 400, e o
recebedor não chega a existir.400 traz tudo o que falta de uma vez, em error.issues[], com o caminho de cada campo em
notação de ponto. Percorra a lista inteira antes de tentar de novo — corrigir só o primeiro item
devolve o mesmo erro. Em cada item, key é estável e serve para você traduzir do seu lado;
message é texto para humanos e pode mudar de redação.O que o cadastro completo exige
| Sempre | individual | company | |
|---|---|---|---|
| Contato | phone, website | ||
| Titular | birthDate, motherName, profession, monthlyIncome | companyLegalName, companyType, companyFoundingDate, annualRevenue | |
| Representante legal | — | legalRepresentativeInfo, com name, document, email, birthdate, phone, motherName, profession, monthlyIncome e role | |
Endereço (address) | postalCode, address, number, neighborhood, city, state | ||
Conta (bankAccount) | bankHolderName, bankHolderDocument, bankCode, bankAgency, bankAccount, bankAccountDigit | ||
Documentos (files) | identificationDocument, selfie | e também socialContract — mais powerOfAttorney quando o representante é procurador |
complement e referencePoint do endereço, bankAgencyDigit, e o
par pixKeyType/pixKey.
legalRepresentativeInfo.role diz por
que aquela pessoa responde pela empresa, e o valor aceito depende do companyType: no MEI,
owner (o titular) ou attorney (procurador); nos demais tipos, administrator (sócio
administrador ou administrador nomeado no contrato social ou no estatuto) ou attorney. Fora
dessas combinações, o 400 vem em legalRepresentativeInfo.role.role: "attorney", files.powerOfAttorney passa a
ser exigido — a procuração que dá os poderes ao representante, em PDF ou imagem, no mesmo base64
dos outros arquivos. Titular e administrador constam nos dados públicos do CNPJ e não precisam
dela.birthDate e o birthdate do representante legal têm de
ser data no passado e de alguém com pelo menos 18 anos; companyFoundingDate só precisa estar no
passado. Todas aceitam AAAA-MM-DD ou ISO 8601 com hora.monthlyIncome e annualRevenue — são centavos, e a análise
recusa o valor zerado. companyType aceita MEI, ME, LTDA, EIRELI, SA, SLU ou OTHER,
e o conteúdo de files vai em base64, com ou sem o prefixo data:.Formato sempre validado
Estas valem nos dois caminhos — inclusive no cadastro mínimo — e também noPATCH:
| Campo | Regra |
|---|---|
document | Dígitos verificadores válidos e coerentes com o type — individual exige CPF, company exige CNPJ |
phone | DDD e número: 10 ou 11 dígitos. Aceita máscara e o prefixo +55 |
legalRepresentativeInfo.document | CPF válido |
bankAccount.bankHolderDocument | CPF ou CNPJ válido, e o titular tem de ser o próprio recebedor — só o MEI pode usar o CPF do representante legal |
pixKeyType e pixKey | Andam em par, e a chave é validada contra o tipo declarado |
Exemplo
Cadastro mínimo — o recebedor completa o resto pelo formulário:curl -X POST https://api.sandbox.z2pay.com/v1/recipients \
-H "x-api-key: SUA_CHAVE_DE_SANDBOX" \
-H "Content-Type: application/json" \
-d '{
"name": "Loja do João ME",
"type": "company",
"document": "12345678000190",
"email": "financeiro@lojadojoao.com.br",
"phone": "+5511987654321"
}'
{
"id": "rec_v57bi6ruyolouw3cpaq2ofy1k",
"name": "Loja do João ME",
"document": "12345678000190",
"email": "financeiro@lojadojoao.com.br",
"type": "company",
"role": "seller",
"status": "new",
"analysisComplete": false,
"pendencies": [],
"pendenciesSummary": { "open": 0, "blocking": 0, "warning": 0 },
"approvedAt": null,
"refusedAt": null
}
id
(rec_); é ele que as demais rotas recebem.Authorizations
API Key da Credential (gerada no Backoffice)
Headers
Chave única para idempotência
Body
Nome do recebedor.
2E-mail do recebedor.
Documento do recebedor (CPF ou CNPJ, somente dígitos).
11Tipo do recebedor: individual (pessoa física) ou company (pessoa jurídica).
individual, company Telefone do recebedor (formato E.164, ex.: +5511987654321).
Tipo de empresa do recebedor (pessoa jurídica).
Razão social da empresa.
Data de fundação da empresa.
Faturamento anual da empresa, em centavos.
0 <= x <= 100000000000000Natureza jurídica da empresa (ex.: LTDA, EIRELI, SA).
Data de nascimento do recebedor (pessoa física).
Nome da mãe do recebedor (pessoa física).
Profissão do recebedor (pessoa física).
Renda mensal do recebedor, em centavos.
0 <= x <= 100000000000000Dados do representante legal (recebedor pessoa jurídica).
Show child attributes
Show child attributes
Tipo da chave Pix do recebedor (ex.: cpf, cnpj, email, phone, random).
Chave Pix do recebedor para recebimentos.
Site do recebedor.
1024no, yes, related Endereço do recebedor.
Show child attributes
Show child attributes
Dados bancários do recebedor para recebimentos e saques.
Show child attributes
Show child attributes
Documentos para verificação (KYC) do recebedor.
Show child attributes
Show child attributes
Response
Recebedor criado
Identificador único do registro.
Nome da conta do recebedor.
Nome do registro.
E-mail de contato.
Telefone de contato.
Documento (CPF ou CNPJ) do titular.
Tipo do recebedor: individual (pessoa física) ou company (pessoa jurídica).
Tipo ou natureza jurídica da empresa.
Razão social da empresa.
Data de fundação da empresa (ISO 8601).
Faturamento anual do recebedor, em centavos.
Tipo societário da empresa.
Data de nascimento do recebedor (ISO 8601).
Nome da mãe do recebedor.
Profissão do recebedor.
Renda mensal do recebedor, em centavos.
Dados do representante legal da empresa.
Tipo da chave PIX (ex.: email, cpf, cnpj, phone, random).
Chave PIX do recebedor.
Site do recebedor.
Endereço principal do recebedor.
Conta bancária padrão do recebedor.
Papel do recebedor no split (ex.: seller).
Situação da conta bancária. Valores: active, inactive, pending.
Valor do split do recebedor (percentual ou fixo, conforme splitType).
Tipo do valor de split do recebedor (ex.: percentage, fixed).
Prazo de antecipação para PIX, em dias.
Prazo de antecipação para boleto, em dias.
Prazo de antecipação para cartão de crédito, em dias.
Data e hora em que o recebedor foi aprovado (ISO 8601).
Data e hora em que o recebedor foi recusado (ISO 8601).
Indica se a análise cadastral terminou. false enquanto houver rodada de análise aberta para este recebedor na sua conta.
Pendências apontadas pela análise. Cada item traz code (estável, para automação), field, severity (blocking ou warning), status (open ou resolved), message e action (texto traduzido) e as datas do grupo.
Contagem das pendências abertas: open (total), blocking e warning.
Data e hora de criação do registro (ISO 8601).
Data e hora da última atualização do registro (ISO 8601).