curl --request POST \
--url https://api.uvvipay.com.br/v2/submerchants/onboarding/pf \
--header 'Content-Type: multipart/form-data' \
--header 'client-id: <api-key>' \
--header 'client-secret: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--form document=12345678901 \
--form 'fullName=João da Silva' \
--form birthDate=1990-01-15 \
--form 'phone=+5511999999999' \
--form addressZipCode=01310100 \
--form 'addressStreet=Avenida Paulista' \
--form addressNumber=1000 \
--form 'addressNeighborhood=Bela Vista' \
--form 'addressCity=São Paulo' \
--form addressState=SP \
--form 'bankAccount={
"bankAccountType": "conta_corrente",
"bankName": "Banco do Brasil",
"bankCode": "001",
"bankAgency": "1234",
"bankAccount": "56789",
"bankAccountDv": "0",
"ispb": "00000000"
}' \
--form 'documentoFrente=<string>' \
--form 'documentoVerso=<string>' \
--form 'selfie=<string>' \
--form email=joao@exemplo.com \
--form 'addressComplement=Apto 101' \
--form 'cnhCompleta=<string>'import requests
url = "https://api.uvvipay.com.br/v2/submerchants/onboarding/pf"
payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"\r\n\r\n12345678901\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"fullName\"\r\n\r\nJoão da Silva\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"birthDate\"\r\n\r\n1990-01-15\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"phone\"\r\n\r\n+5511999999999\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressZipCode\"\r\n\r\n01310100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressStreet\"\r\n\r\nAvenida Paulista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNumber\"\r\n\r\n1000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNeighborhood\"\r\n\r\nBela Vista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressCity\"\r\n\r\nSão Paulo\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressState\"\r\n\r\nSP\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bankAccount\"\r\n\r\n{\r\n \"bankAccountType\": \"conta_corrente\",\r\n \"bankName\": \"Banco do Brasil\",\r\n \"bankCode\": \"001\",\r\n \"bankAgency\": \"1234\",\r\n \"bankAccount\": \"56789\",\r\n \"bankAccountDv\": \"0\",\r\n \"ispb\": \"00000000\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoFrente\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoVerso\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email\"\r\n\r\njoao@exemplo.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressComplement\"\r\n\r\nApto 101\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cnhCompleta\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
headers = {
"client-secret": "<api-key>",
"client-id": "<api-key>",
"x-idempotency-key": "<x-idempotency-key>",
"Content-Type": "multipart/form-data"
}
response = requests.post(url, data=payload, headers=headers)
print(response.text)const form = new FormData();
form.append('document', '12345678901');
form.append('fullName', 'João da Silva');
form.append('birthDate', '1990-01-15');
form.append('phone', '+5511999999999');
form.append('addressZipCode', '01310100');
form.append('addressStreet', 'Avenida Paulista');
form.append('addressNumber', '1000');
form.append('addressNeighborhood', 'Bela Vista');
form.append('addressCity', 'São Paulo');
form.append('addressState', 'SP');
form.append('bankAccount', '{
"bankAccountType": "conta_corrente",
"bankName": "Banco do Brasil",
"bankCode": "001",
"bankAgency": "1234",
"bankAccount": "56789",
"bankAccountDv": "0",
"ispb": "00000000"
}');
form.append('documentoFrente', '<string>');
form.append('documentoVerso', '<string>');
form.append('selfie', '<string>');
form.append('email', 'joao@exemplo.com');
form.append('addressComplement', 'Apto 101');
form.append('cnhCompleta', '<string>');
const options = {
method: 'POST',
headers: {
'client-secret': '<api-key>',
'client-id': '<api-key>',
'x-idempotency-key': '<x-idempotency-key>'
}
};
options.body = form;
fetch('https://api.uvvipay.com.br/v2/submerchants/onboarding/pf', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.uvvipay.com.br/v2/submerchants/onboarding/pf",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"\r\n\r\n12345678901\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"fullName\"\r\n\r\nJoão da Silva\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"birthDate\"\r\n\r\n1990-01-15\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"phone\"\r\n\r\n+5511999999999\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressZipCode\"\r\n\r\n01310100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressStreet\"\r\n\r\nAvenida Paulista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNumber\"\r\n\r\n1000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNeighborhood\"\r\n\r\nBela Vista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressCity\"\r\n\r\nSão Paulo\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressState\"\r\n\r\nSP\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bankAccount\"\r\n\r\n{\r\n \"bankAccountType\": \"conta_corrente\",\r\n \"bankName\": \"Banco do Brasil\",\r\n \"bankCode\": \"001\",\r\n \"bankAgency\": \"1234\",\r\n \"bankAccount\": \"56789\",\r\n \"bankAccountDv\": \"0\",\r\n \"ispb\": \"00000000\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoFrente\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoVerso\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email\"\r\n\r\njoao@exemplo.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressComplement\"\r\n\r\nApto 101\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cnhCompleta\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"client-id: <api-key>",
"client-secret: <api-key>",
"x-idempotency-key: <x-idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.uvvipay.com.br/v2/submerchants/onboarding/pf"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"\r\n\r\n12345678901\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"fullName\"\r\n\r\nJoão da Silva\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"birthDate\"\r\n\r\n1990-01-15\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"phone\"\r\n\r\n+5511999999999\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressZipCode\"\r\n\r\n01310100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressStreet\"\r\n\r\nAvenida Paulista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNumber\"\r\n\r\n1000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNeighborhood\"\r\n\r\nBela Vista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressCity\"\r\n\r\nSão Paulo\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressState\"\r\n\r\nSP\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bankAccount\"\r\n\r\n{\r\n \"bankAccountType\": \"conta_corrente\",\r\n \"bankName\": \"Banco do Brasil\",\r\n \"bankCode\": \"001\",\r\n \"bankAgency\": \"1234\",\r\n \"bankAccount\": \"56789\",\r\n \"bankAccountDv\": \"0\",\r\n \"ispb\": \"00000000\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoFrente\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoVerso\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email\"\r\n\r\njoao@exemplo.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressComplement\"\r\n\r\nApto 101\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cnhCompleta\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("client-secret", "<api-key>")
req.Header.Add("client-id", "<api-key>")
req.Header.Add("x-idempotency-key", "<x-idempotency-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.uvvipay.com.br/v2/submerchants/onboarding/pf")
.header("client-secret", "<api-key>")
.header("client-id", "<api-key>")
.header("x-idempotency-key", "<x-idempotency-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"\r\n\r\n12345678901\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"fullName\"\r\n\r\nJoão da Silva\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"birthDate\"\r\n\r\n1990-01-15\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"phone\"\r\n\r\n+5511999999999\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressZipCode\"\r\n\r\n01310100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressStreet\"\r\n\r\nAvenida Paulista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNumber\"\r\n\r\n1000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNeighborhood\"\r\n\r\nBela Vista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressCity\"\r\n\r\nSão Paulo\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressState\"\r\n\r\nSP\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bankAccount\"\r\n\r\n{\r\n \"bankAccountType\": \"conta_corrente\",\r\n \"bankName\": \"Banco do Brasil\",\r\n \"bankCode\": \"001\",\r\n \"bankAgency\": \"1234\",\r\n \"bankAccount\": \"56789\",\r\n \"bankAccountDv\": \"0\",\r\n \"ispb\": \"00000000\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoFrente\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoVerso\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email\"\r\n\r\njoao@exemplo.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressComplement\"\r\n\r\nApto 101\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cnhCompleta\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.uvvipay.com.br/v2/submerchants/onboarding/pf")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["client-secret"] = '<api-key>'
request["client-id"] = '<api-key>'
request["x-idempotency-key"] = '<x-idempotency-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"\r\n\r\n12345678901\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"fullName\"\r\n\r\nJoão da Silva\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"birthDate\"\r\n\r\n1990-01-15\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"phone\"\r\n\r\n+5511999999999\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressZipCode\"\r\n\r\n01310100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressStreet\"\r\n\r\nAvenida Paulista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNumber\"\r\n\r\n1000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNeighborhood\"\r\n\r\nBela Vista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressCity\"\r\n\r\nSão Paulo\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressState\"\r\n\r\nSP\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bankAccount\"\r\n\r\n{\r\n \"bankAccountType\": \"conta_corrente\",\r\n \"bankName\": \"Banco do Brasil\",\r\n \"bankCode\": \"001\",\r\n \"bankAgency\": \"1234\",\r\n \"bankAccount\": \"56789\",\r\n \"bankAccountDv\": \"0\",\r\n \"ispb\": \"00000000\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoFrente\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoVerso\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email\"\r\n\r\njoao@exemplo.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressComplement\"\r\n\r\nApto 101\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cnhCompleta\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"registration_id": "2f1c8b9a-4d3e-4f6a-9b1c-0a1b2c3d4e5f",
"status": "submitted"
}{
"message": "Tipo de arquivo não permitido: application/octet-stream. Tipos aceitos: application/pdf, image/jpeg, image/jpg, image/png, image/gif, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"error": "Bad Request",
"statusCode": 400
}Onboarding PF
Inicia o onboarding assíncrono de subconta pessoa física via multipart/form-data. Retorna 202 com registration_id e status.
curl --request POST \
--url https://api.uvvipay.com.br/v2/submerchants/onboarding/pf \
--header 'Content-Type: multipart/form-data' \
--header 'client-id: <api-key>' \
--header 'client-secret: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--form document=12345678901 \
--form 'fullName=João da Silva' \
--form birthDate=1990-01-15 \
--form 'phone=+5511999999999' \
--form addressZipCode=01310100 \
--form 'addressStreet=Avenida Paulista' \
--form addressNumber=1000 \
--form 'addressNeighborhood=Bela Vista' \
--form 'addressCity=São Paulo' \
--form addressState=SP \
--form 'bankAccount={
"bankAccountType": "conta_corrente",
"bankName": "Banco do Brasil",
"bankCode": "001",
"bankAgency": "1234",
"bankAccount": "56789",
"bankAccountDv": "0",
"ispb": "00000000"
}' \
--form 'documentoFrente=<string>' \
--form 'documentoVerso=<string>' \
--form 'selfie=<string>' \
--form email=joao@exemplo.com \
--form 'addressComplement=Apto 101' \
--form 'cnhCompleta=<string>'import requests
url = "https://api.uvvipay.com.br/v2/submerchants/onboarding/pf"
payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"\r\n\r\n12345678901\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"fullName\"\r\n\r\nJoão da Silva\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"birthDate\"\r\n\r\n1990-01-15\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"phone\"\r\n\r\n+5511999999999\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressZipCode\"\r\n\r\n01310100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressStreet\"\r\n\r\nAvenida Paulista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNumber\"\r\n\r\n1000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNeighborhood\"\r\n\r\nBela Vista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressCity\"\r\n\r\nSão Paulo\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressState\"\r\n\r\nSP\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bankAccount\"\r\n\r\n{\r\n \"bankAccountType\": \"conta_corrente\",\r\n \"bankName\": \"Banco do Brasil\",\r\n \"bankCode\": \"001\",\r\n \"bankAgency\": \"1234\",\r\n \"bankAccount\": \"56789\",\r\n \"bankAccountDv\": \"0\",\r\n \"ispb\": \"00000000\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoFrente\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoVerso\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email\"\r\n\r\njoao@exemplo.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressComplement\"\r\n\r\nApto 101\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cnhCompleta\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
headers = {
"client-secret": "<api-key>",
"client-id": "<api-key>",
"x-idempotency-key": "<x-idempotency-key>",
"Content-Type": "multipart/form-data"
}
response = requests.post(url, data=payload, headers=headers)
print(response.text)const form = new FormData();
form.append('document', '12345678901');
form.append('fullName', 'João da Silva');
form.append('birthDate', '1990-01-15');
form.append('phone', '+5511999999999');
form.append('addressZipCode', '01310100');
form.append('addressStreet', 'Avenida Paulista');
form.append('addressNumber', '1000');
form.append('addressNeighborhood', 'Bela Vista');
form.append('addressCity', 'São Paulo');
form.append('addressState', 'SP');
form.append('bankAccount', '{
"bankAccountType": "conta_corrente",
"bankName": "Banco do Brasil",
"bankCode": "001",
"bankAgency": "1234",
"bankAccount": "56789",
"bankAccountDv": "0",
"ispb": "00000000"
}');
form.append('documentoFrente', '<string>');
form.append('documentoVerso', '<string>');
form.append('selfie', '<string>');
form.append('email', 'joao@exemplo.com');
form.append('addressComplement', 'Apto 101');
form.append('cnhCompleta', '<string>');
const options = {
method: 'POST',
headers: {
'client-secret': '<api-key>',
'client-id': '<api-key>',
'x-idempotency-key': '<x-idempotency-key>'
}
};
options.body = form;
fetch('https://api.uvvipay.com.br/v2/submerchants/onboarding/pf', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.uvvipay.com.br/v2/submerchants/onboarding/pf",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"\r\n\r\n12345678901\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"fullName\"\r\n\r\nJoão da Silva\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"birthDate\"\r\n\r\n1990-01-15\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"phone\"\r\n\r\n+5511999999999\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressZipCode\"\r\n\r\n01310100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressStreet\"\r\n\r\nAvenida Paulista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNumber\"\r\n\r\n1000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNeighborhood\"\r\n\r\nBela Vista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressCity\"\r\n\r\nSão Paulo\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressState\"\r\n\r\nSP\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bankAccount\"\r\n\r\n{\r\n \"bankAccountType\": \"conta_corrente\",\r\n \"bankName\": \"Banco do Brasil\",\r\n \"bankCode\": \"001\",\r\n \"bankAgency\": \"1234\",\r\n \"bankAccount\": \"56789\",\r\n \"bankAccountDv\": \"0\",\r\n \"ispb\": \"00000000\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoFrente\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoVerso\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email\"\r\n\r\njoao@exemplo.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressComplement\"\r\n\r\nApto 101\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cnhCompleta\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"client-id: <api-key>",
"client-secret: <api-key>",
"x-idempotency-key: <x-idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.uvvipay.com.br/v2/submerchants/onboarding/pf"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"\r\n\r\n12345678901\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"fullName\"\r\n\r\nJoão da Silva\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"birthDate\"\r\n\r\n1990-01-15\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"phone\"\r\n\r\n+5511999999999\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressZipCode\"\r\n\r\n01310100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressStreet\"\r\n\r\nAvenida Paulista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNumber\"\r\n\r\n1000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNeighborhood\"\r\n\r\nBela Vista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressCity\"\r\n\r\nSão Paulo\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressState\"\r\n\r\nSP\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bankAccount\"\r\n\r\n{\r\n \"bankAccountType\": \"conta_corrente\",\r\n \"bankName\": \"Banco do Brasil\",\r\n \"bankCode\": \"001\",\r\n \"bankAgency\": \"1234\",\r\n \"bankAccount\": \"56789\",\r\n \"bankAccountDv\": \"0\",\r\n \"ispb\": \"00000000\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoFrente\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoVerso\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email\"\r\n\r\njoao@exemplo.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressComplement\"\r\n\r\nApto 101\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cnhCompleta\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("client-secret", "<api-key>")
req.Header.Add("client-id", "<api-key>")
req.Header.Add("x-idempotency-key", "<x-idempotency-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.uvvipay.com.br/v2/submerchants/onboarding/pf")
.header("client-secret", "<api-key>")
.header("client-id", "<api-key>")
.header("x-idempotency-key", "<x-idempotency-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"\r\n\r\n12345678901\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"fullName\"\r\n\r\nJoão da Silva\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"birthDate\"\r\n\r\n1990-01-15\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"phone\"\r\n\r\n+5511999999999\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressZipCode\"\r\n\r\n01310100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressStreet\"\r\n\r\nAvenida Paulista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNumber\"\r\n\r\n1000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNeighborhood\"\r\n\r\nBela Vista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressCity\"\r\n\r\nSão Paulo\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressState\"\r\n\r\nSP\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bankAccount\"\r\n\r\n{\r\n \"bankAccountType\": \"conta_corrente\",\r\n \"bankName\": \"Banco do Brasil\",\r\n \"bankCode\": \"001\",\r\n \"bankAgency\": \"1234\",\r\n \"bankAccount\": \"56789\",\r\n \"bankAccountDv\": \"0\",\r\n \"ispb\": \"00000000\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoFrente\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoVerso\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email\"\r\n\r\njoao@exemplo.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressComplement\"\r\n\r\nApto 101\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cnhCompleta\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.uvvipay.com.br/v2/submerchants/onboarding/pf")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["client-secret"] = '<api-key>'
request["client-id"] = '<api-key>'
request["x-idempotency-key"] = '<x-idempotency-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"document\"\r\n\r\n12345678901\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"fullName\"\r\n\r\nJoão da Silva\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"birthDate\"\r\n\r\n1990-01-15\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"phone\"\r\n\r\n+5511999999999\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressZipCode\"\r\n\r\n01310100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressStreet\"\r\n\r\nAvenida Paulista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNumber\"\r\n\r\n1000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressNeighborhood\"\r\n\r\nBela Vista\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressCity\"\r\n\r\nSão Paulo\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressState\"\r\n\r\nSP\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bankAccount\"\r\n\r\n{\r\n \"bankAccountType\": \"conta_corrente\",\r\n \"bankName\": \"Banco do Brasil\",\r\n \"bankCode\": \"001\",\r\n \"bankAgency\": \"1234\",\r\n \"bankAccount\": \"56789\",\r\n \"bankAccountDv\": \"0\",\r\n \"ispb\": \"00000000\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoFrente\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documentoVerso\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"selfie\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email\"\r\n\r\njoao@exemplo.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"addressComplement\"\r\n\r\nApto 101\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cnhCompleta\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"registration_id": "2f1c8b9a-4d3e-4f6a-9b1c-0a1b2c3d4e5f",
"status": "submitted"
}{
"message": "Tipo de arquivo não permitido: application/octet-stream. Tipos aceitos: application/pdf, image/jpeg, image/jpg, image/png, image/gif, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"error": "Bad Request",
"statusCode": 400
}POST /v2/submerchants/onboarding/pf
Inicia o onboarding de uma subconta PF. A requisição é multipart/form-data
e retorna 202 Accepted com o registration_id e o status inicial.
202 com
registration_id. Exige headers client-id + client-secret e
x-idempotency-key (UUID v4).Arquivos (multipart)
Envie uma das opções de documento de identidade, mais a selfie:| Campo | Obrigatório | Descrição |
|---|---|---|
documentoFrente | Condicional | Frente do RG/CIN |
documentoVerso | Condicional | Verso do RG/CIN |
cnhCompleta | Condicional | CNH completa (alternativa a frente+verso) |
selfie | Sim | Selfie do titular (rosto) |
- Envie
documentoFrenteedocumentoVerso, oucnhCompleta. - O campo da selfie é
selfie(não use maisselfieComDocumento).
Tipo do arquivo
Cada parte do multipart precisa doContent-Type do arquivo. PDF usa
application/pdf. JPEG usa image/jpeg. Sem tipo, o cliente envia
application/octet-stream e a API responde 400.
Tipos aceitos:
application/pdfimage/jpegimage/jpgimage/pngimage/gifapplication/mswordapplication/vnd.openxmlformats-officedocument.wordprocessingml.document
-F "documentoFrente=@frente.pdf;type=application/pdf" e
-F "selfie=@selfie.jpg;type=image/jpeg".
{
"message": "Tipo de arquivo não permitido: application/octet-stream. Tipos aceitos: application/pdf, image/jpeg, image/jpg, image/png, image/gif, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"error": "Bad Request",
"statusCode": 400
}
documentoFrente e documentoVerso, ou envie cnhCompleta. O campo
da selfie é selfie. Não use selfieComDocumento. Depois do 202, consulte
o status com o registration_id. Veja o guia Subcontas.Headers
Secret da credencial do merchant
ID público da credencial do merchant
UUID v4 gerado pelo cliente. Usado como externalId da subconta.
Body
- Option 1
- Option 2
CPF do titular (11 dígitos)
"12345678901"
Nome completo do titular
255"João da Silva"
Data de nascimento (YYYY-MM-DD)
"1990-01-15"
Telefone no formato E.164
"+5511999999999"
CEP
10"01310100"
Logradouro
255"Avenida Paulista"
Número do endereço
20"1000"
Bairro
100"Bela Vista"
Cidade
100"São Paulo"
UF (2 caracteres)
2"SP"
Dados bancários. Em multipart, envie como JSON string.
Show child attributes
Show child attributes
Frente do RG/CIN. Obrigatório com documentoVerso, se não enviar cnhCompleta. Content-Type aceito: application/pdf, image/jpeg, image/jpg, image/png, image/gif, application/msword ou application/vnd.openxmlformats-officedocument.wordprocessingml.document. application/octet-stream é recusado com 400.
Verso do RG/CIN. Obrigatório com documentoFrente, se não enviar cnhCompleta. Content-Type aceito: application/pdf, image/jpeg, image/jpg, image/png, image/gif, application/msword ou application/vnd.openxmlformats-officedocument.wordprocessingml.document. application/octet-stream é recusado com 400.
Selfie do titular (rosto). Não use selfieComDocumento. Content-Type aceito: application/pdf, image/jpeg, image/jpg, image/png, image/gif, application/msword ou application/vnd.openxmlformats-officedocument.wordprocessingml.document. application/octet-stream é recusado com 400.
Email de contato (opcional)
255"joao@exemplo.com"
Complemento do endereço
255"Apto 101"
CNH completa. Alternativa a documentoFrente + documentoVerso. Content-Type aceito: application/pdf, image/jpeg, image/jpg, image/png, image/gif, application/msword ou application/vnd.openxmlformats-officedocument.wordprocessingml.document. application/octet-stream é recusado com 400.

