curl "https://admin.kycert.com.br/api/v1/customers/CUSTOMER_ID" \
-H "x-api-key: $KYCERT_API_KEY"const res = await fetch(
`https://admin.kycert.com.br/api/v1/customers/${customerId}`,
{ headers: { 'x-api-key': process.env.KYCERT_API_KEY } },
)
const customer = await res.json()
console.log(customer.name, customer.doc, customer.latest_run?.decision)
import requests
url = "https://admin.kycert.com.br/api/v1/customers/{id}"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://admin.kycert.com.br/api/v1/customers/{id}', 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://admin.kycert.com.br/api/v1/customers/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-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"
"net/http"
"io"
)
func main() {
url := "https://admin.kycert.com.br/api/v1/customers/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://admin.kycert.com.br/api/v1/customers/{id}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://admin.kycert.com.br/api/v1/customers/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"customer_id": "661e9511-f3ac-52e5-b827-557766551111",
"object": "customer",
"status": "em_analise",
"type": "pf",
"name": "João Silva",
"email": "joao@example.com",
"doc": "***456789**",
"external_id": "cust_abc123",
"birth_date": "1990-05-15",
"latest_run": {
"run_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"decision": "approved",
"risk_band": "baixo",
"completed_at": "2026-06-12T14:00:18Z"
},
"facial_verification": {
"round_id": "772f9622-a4bd-63f6-c938-668877662222",
"checks": {
"face_match": {
"status": "Approved",
"score": 92.4,
"completed_at": "2026-06-12T14:00:05Z"
},
"passive_liveness": {
"status": "Approved",
"score": 88.1,
"completed_at": "2026-06-12T14:00:05Z"
}
}
},
"created_at": "2026-06-12T14:00:00Z",
"updated_at": "2026-06-12T14:00:18Z",
"livemode": true
}Buscar cliente
Retorna os dados completos de um cliente, incluindo o run de bureau mais recente.
Requer escopo customers:read.
curl "https://admin.kycert.com.br/api/v1/customers/CUSTOMER_ID" \
-H "x-api-key: $KYCERT_API_KEY"const res = await fetch(
`https://admin.kycert.com.br/api/v1/customers/${customerId}`,
{ headers: { 'x-api-key': process.env.KYCERT_API_KEY } },
)
const customer = await res.json()
console.log(customer.name, customer.doc, customer.latest_run?.decision)
import requests
url = "https://admin.kycert.com.br/api/v1/customers/{id}"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://admin.kycert.com.br/api/v1/customers/{id}', 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://admin.kycert.com.br/api/v1/customers/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-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"
"net/http"
"io"
)
func main() {
url := "https://admin.kycert.com.br/api/v1/customers/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://admin.kycert.com.br/api/v1/customers/{id}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://admin.kycert.com.br/api/v1/customers/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"customer_id": "661e9511-f3ac-52e5-b827-557766551111",
"object": "customer",
"status": "em_analise",
"type": "pf",
"name": "João Silva",
"email": "joao@example.com",
"doc": "***456789**",
"external_id": "cust_abc123",
"birth_date": "1990-05-15",
"latest_run": {
"run_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"decision": "approved",
"risk_band": "baixo",
"completed_at": "2026-06-12T14:00:18Z"
},
"facial_verification": {
"round_id": "772f9622-a4bd-63f6-c938-668877662222",
"checks": {
"face_match": {
"status": "Approved",
"score": 92.4,
"completed_at": "2026-06-12T14:00:05Z"
},
"passive_liveness": {
"status": "Approved",
"score": 88.1,
"completed_at": "2026-06-12T14:00:05Z"
}
}
},
"created_at": "2026-06-12T14:00:00Z",
"updated_at": "2026-06-12T14:00:18Z",
"livemode": true
}Campo status
status reflete a decisão de onboarding do cliente (em_analise, aprovado, pendencia, recusado) — derivada do resultado do bureau run mais recente, não do status do run em si (que usa inglês). Veja Status de bureau run vs status de cliente.
Campo doc
O CPF ou CNPJ é retornado mascarado, com dígitos parciais visíveis:
- CPF:
***456789** - CNPJ:
**34567890****
Campo latest_run
Retorna o run de bureau mais recente associado ao cliente, ou null se nenhum run foi executado ainda.
{
"latest_run": {
"run_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"decision": "approved",
"risk_band": "baixo",
"completed_at": "2026-06-12T14:00:18Z"
}
}
Campo facial_verification
Resultado da verificação facial (Face Match + Passive Liveness) da rodada mais recente do cliente. Presente apenas para clientes PF (campo ausente, não null, na resposta de clientes PJ — biometria não roda para PJ). null quando o cliente nunca passou por uma rodada de verificação facial.
{
"facial_verification": {
"round_id": "772f9622-a4bd-63f6-c938-668877662222",
"checks": {
"face_match": { "status": "Approved", "score": 92.4, "completed_at": "2026-06-12T14:00:05Z" },
"passive_liveness": { "status": "Approved", "score": 88.1, "completed_at": "2026-06-12T14:00:05Z" }
}
}
}
warnings brutos do provedor — apenas status/score/completed_at por check. Notificação em tempo real via webhook está disponível no evento biometric_check.completed — ver Webhooks.
Campo documents
Resumo dos documentos anexados ao cliente (via POST /customers//documents ou pelo portal de onboarding). Não inclui storage_path nem signed URL — baixar o arquivo continua exclusivo do dashboard.
{
"documents": [
{ "type": "comprovante_endereco", "status": "pendente", "created_at": "2026-06-12T14:05:00Z" },
{ "type": "identidade_frente", "status": "aprovado", "created_at": "2026-06-12T14:00:30Z" }
]
}
documents: [].
Campos complementares
nationality, occupation, declared_income (PF) e trade_name, annual_revenue, business_activity, employee_count (PJ) aparecem na resposta apenas quando foram enviados em POST /customers — nenhum valor default é inventado para o que não foi informado.
declared_income e annual_revenue são apenas armazenados — não refletem nenhum recálculo automático de capacidade financeira feito depois da criação do cliente.Erros
Formato completo do envelope e estratégia de retry em Tratamento de erros. Os códigos deste endpoint:missing_api_key, invalid_api_key, insufficient_scope, invalid_id ({id} da URL ausente ou inválido), customer_not_found.Authorizations
API key no header x-api-key (recomendado)
Headers
"2026-06-03"
Path Parameters
ID do cliente retornado pelo POST /customers
Response
Dados completos do cliente
customer em_analise, aprovado, pendencia e recusado são os status de decisão
de onboarding (mesmo vocabulário do parâmetro de filtro status).
rascunho (cadastro iniciado e ainda não finalizado), inactive (cliente
desativado manualmente) e em_monitoramento (aprovado em monitoramento
contínuo pós-aprovação) também podem aparecer neste campo, mesmo não
sendo filtráveis pelo parâmetro status.
em_analise, aprovado, pendencia, recusado, rascunho, inactive, em_monitoramento pf, pj CPF/CNPJ mascarado com dígitos parciais visíveis
"***456789**"
Apenas PF
Apenas PF — presente somente quando enviado no createCustomer
Apenas PF — presente somente quando enviado no createCustomer
Apenas PF — presente somente quando enviado no createCustomer. Apenas armazenado: não aciona recálculo automático de capacidade financeira (motor de renda).
Presente para PF e PJ quando enviado no createCustomer
Apenas PJ — presente somente quando enviado no createCustomer
Apenas PJ — presente somente quando enviado no createCustomer. Apenas armazenado: não aciona recálculo automático de capacidade financeira (motor de renda).
Apenas PJ — presente somente quando enviado no createCustomer
Apenas PJ — presente somente quando enviado no createCustomer
Resumo dos documentos anexados via POST /customers/{id}/documents ou pelo portal de onboarding. Não inclui storage_path nem signed URL — baixar o arquivo continua exclusivo do dashboard.
Show child attributes
Show child attributes
Run de bureau mais recente associado ao cliente
Show child attributes
Show child attributes
Resultado da verificação facial (Face Match + Passive Liveness) da
rodada mais recente. Presente apenas para clientes PF — ausente
(não null) na resposta de clientes PJ, que não passam por
biometria. null quando nenhuma rodada rodou ainda.
Show child attributes
Show child attributes