cURL
curl "https://admin.kycert.com.br/api/v1/customers?limit=20" \
-H "x-api-key: $KYCERT_API_KEY"const res = await fetch(
'https://admin.kycert.com.br/api/v1/customers?limit=20',
{ headers: { 'x-api-key': process.env.KYCERT_API_KEY } },
)
const { data, has_more, next_cursor } = await res.json()
console.log(data.length, 'clientes', has_more ? `próxima: ${next_cursor}` : '')
import requests
url = "https://admin.kycert.com.br/api/v1/customers"
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', 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",
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"
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")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://admin.kycert.com.br/api/v1/customers")
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{
"data": [
{
"customer_id": "661e9511-f3ac-52e5-b827-557766551111",
"object": "customer",
"status": "em_analise",
"type": "pf",
"name": "João Silva",
"doc": "***",
"external_id": "cust_abc123",
"created_at": "2026-06-12T14:00:00Z",
"livemode": true
}
],
"has_more": false,
"livemode": true
}Customers
Listar clientes
Retorna lista paginada de clientes do tenant, do mais recente para o mais antigo.
Requer escopo customers:read.
GET
/
api
/
v1
/
customers
cURL
curl "https://admin.kycert.com.br/api/v1/customers?limit=20" \
-H "x-api-key: $KYCERT_API_KEY"const res = await fetch(
'https://admin.kycert.com.br/api/v1/customers?limit=20',
{ headers: { 'x-api-key': process.env.KYCERT_API_KEY } },
)
const { data, has_more, next_cursor } = await res.json()
console.log(data.length, 'clientes', has_more ? `próxima: ${next_cursor}` : '')
import requests
url = "https://admin.kycert.com.br/api/v1/customers"
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', 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",
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"
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")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://admin.kycert.com.br/api/v1/customers")
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{
"data": [
{
"customer_id": "661e9511-f3ac-52e5-b827-557766551111",
"object": "customer",
"status": "em_analise",
"type": "pf",
"name": "João Silva",
"doc": "***",
"external_id": "cust_abc123",
"created_at": "2026-06-12T14:00:00Z",
"livemode": true
}
],
"has_more": false,
"livemode": true
}Paginação
A listagem usa cursor pagination. Quandohas_more: true, o campo next_cursor está presente — passe-o como parâmetro cursor na próxima requisição.
let cursor: string | undefined
do {
const res = await fetch(
`https://admin.kycert.com.br/api/v1/customers?limit=20${cursor ? `&cursor=${encodeURIComponent(cursor)}` : ''}`,
{ headers: { 'x-api-key': process.env.KYCERT_API_KEY! } },
)
const page = await res.json()
if (!res.ok) {
throw new Error(`Falha ao listar clientes: ${page.error?.code ?? res.status}`)
}
process(page.data)
cursor = page.has_more ? page.next_cursor : undefined
} while (cursor)
cursor é um valor opaco (data de criação ISO 8601 concatenada ao ID do último registro da página) — pode conter caracteres reservados de URL como : e +, por isso é sempre necessário encodeURIComponent ao montá-lo na query string.
Campo doc
Por privacidade, o campo doc é retornado como *** na listagem. Para ver a versão mascarada com dígitos parciais, use GET /customers/:id.
Campos ausentes na listagem
Cada item dedata[] é um resumo — inclui email e phone (colunas simples, sem custo extra), mas não inclui documents nem latest_run.
Isso é intencional, não uma lacuna: documents e latest_run exigiriam uma query adicional por cliente para montar a listagem (N+1) — o mesmo padrão de problema de performance já evitado em outras telas da plataforma. Numa listagem de 100 clientes isso significaria até 200 queries extras só para popular uma página.
Se você precisa de documents ou latest_run para um cliente específico, use GET /customers/:id — o objeto completo só é montado sob demanda, um cliente por vez.
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_date (created_after/created_before fora do formato ISO 8601).Authorizations
ApiKeyHeaderBearerToken
API key no header x-api-key (recomendado)
Headers
Example:
"2026-06-03"
Query Parameters
Filtrar por tipo de pessoa
Available options:
pf, pj Status de onboarding do cliente (vocabulário do portal de cadastro — distinto
do status de bureau run que usa inglês: completed, running, blocked).
- em_analise — cadastro recebido, bureau em andamento
- aprovado — bureau concluído, cliente aprovado
- pendencia — bureau concluído com pendências para revisão manual
- recusado — cliente recusado pelo compliance
Available options:
em_analise, aprovado, pendencia, recusado Filtrar pelo identificador interno
Filtrar por CPF ou CNPJ (sem formatação) — busca por hash
Retornar apenas clientes criados após esta data (ISO 8601)
Retornar apenas clientes criados antes desta data (ISO 8601)
Número máximo de clientes por página
Required range:
1 <= x <= 100Cursor de paginação retornado em next_cursor da página anterior