curl --request GET \
--url https://api.id.zapsign.com.br/v1/validations/{id} \
--header 'Authorization: Bearer <token>'const url = 'https://api.id.zapsign.com.br/v1/validations/{id}';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://api.id.zapsign.com.br/v1/validations/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.id.zapsign.com.br/v1/validations/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.id.zapsign.com.br/v1/validations/{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 => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}require 'uri'
require 'net/http'
url = URI("https://api.id.zapsign.com.br/v1/validations/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "validation",
"id": "val_06YGSA9CF0V6RVXT326BS4K1ZA",
"type": "liveness_document_match",
"status": "completed",
"result": "passed",
"reason_code": null,
"external_id": "pedido_12345",
"created_at": "2026-08-07T14:20:00Z",
"resolved_at": "2026-08-07T14:26:35Z",
"validation_url": "https://id.zapsign.com.br/validate/val_06YGSA9CF0V6RVXT326BS4K1ZA",
"expires_at": "2026-08-08T14:20:00Z",
"attempts_remaining": null,
"details": {
"liveness_document_match": {
"full_name": "Maria Aparecida da Silva",
"sex": "F",
"cpf": "12345678909",
"date_of_birth": "1985-03-12",
"document_type": "id_card",
"document_number": "123456789",
"document_country": "BR",
"document_version": null,
"document_issued_at": "2018-06-01",
"document_expires_at": null
}
}
}Consultar validação
Use nas validações hospedadas para saber quando o titular terminou o fluxo e qual foi o resultado.
curl --request GET \
--url https://api.id.zapsign.com.br/v1/validations/{id} \
--header 'Authorization: Bearer <token>'const url = 'https://api.id.zapsign.com.br/v1/validations/{id}';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://api.id.zapsign.com.br/v1/validations/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.id.zapsign.com.br/v1/validations/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.id.zapsign.com.br/v1/validations/{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 => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}require 'uri'
require 'net/http'
url = URI("https://api.id.zapsign.com.br/v1/validations/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "validation",
"id": "val_06YGSA9CF0V6RVXT326BS4K1ZA",
"type": "liveness_document_match",
"status": "completed",
"result": "passed",
"reason_code": null,
"external_id": "pedido_12345",
"created_at": "2026-08-07T14:20:00Z",
"resolved_at": "2026-08-07T14:26:35Z",
"validation_url": "https://id.zapsign.com.br/validate/val_06YGSA9CF0V6RVXT326BS4K1ZA",
"expires_at": "2026-08-08T14:20:00Z",
"attempts_remaining": null,
"details": {
"liveness_document_match": {
"full_name": "Maria Aparecida da Silva",
"sex": "F",
"cpf": "12345678909",
"date_of_birth": "1985-03-12",
"document_type": "id_card",
"document_number": "123456789",
"document_country": "BR",
"document_version": null,
"document_issued_at": "2018-06-01",
"document_expires_at": null
}
}
}Acompanhar uma validação assíncrona
Nas validações síncronas o resultado já vem na resposta da criação. Na prova de vida + documento, que nasce empending, consulte até o status mudar; expires_at limita a janela de espera.
A posse de telefone por WhatsApp também nasce em pending, mas não resolve sozinha. Quem a resolve é POST /validations/{id}/verify, então consultar em laço só chega ao expired.Authorizations
Sua chave de API no cabeçalho Authorization: Bearer sk_.... Crie e revogue chaves no painel ou pelos endpoints de Chaves de API.
Path Parameters
Identificador da validação.
Response
Validação encontrada.
Resultado de uma validação.
Sempre validation.
validation Identificador único da validação.
"val_0NQW3MVYJYQ453E95V3V1T76AV"
Tipo da validação.
| Valor | O que é |
|---|---|
cpf_phone_match | Vínculo entre CPF e telefone |
sim_swap | Troca de chip |
liveness_document_match | Prova de vida + documento |
phone_ownership | Posse do telefone, por código no WhatsApp |
liveness_cpf_match | Prova de vida + CPF |
telco_financial_capacity | Capacidade financeira via operadora |
Os quatro primeiros têm endpoint de criação. Os outros dois podem aparecer em consultas e listagens de contas que os usam por outros canais.
liveness_document_match, liveness_cpf_match, cpf_phone_match, sim_swap, telco_financial_capacity, phone_ownership Estado atual.
| Valor | O que é |
|---|---|
pending | Criada, aguardando o titular concluir o fluxo hospedado ou devolver o código |
completed | Resolvida; veja result |
failed | Não foi possível concluir |
expired | O prazo venceu sem conclusão |
pending, completed, failed, expired Resultado de negócio. É null enquanto status for pending.
| Valor | Aparece em |
|---|---|
match / no_match | cpf_phone_match |
recent_swap / no_recent_swap | sim_swap |
passed / not_passed | liveness_document_match, liveness_cpf_match, phone_ownership |
high_capacity / moderate_capacity / low_capacity | telco_financial_capacity |
unknown | Qualquer tipo, quando a fonte não deu uma resposta conclusiva. O motivo vem em reason_code. |
passed, not_passed, match, no_match, recent_swap, no_recent_swap, high_capacity, moderate_capacity, low_capacity, unknown Por que o resultado foi o que foi. É null quando o resultado não precisa de explicação. Acompanha unknown na maioria dos casos, e também not_passed quando a validação foi recusada por um motivo específico.
| Valor | O que é |
|---|---|
liveness_failed | Prova de vida não confirmada |
face_mismatch | O rosto não corresponde ao documento |
spoof_detected | Suspeita de fraude na captura |
document_tampered | Indícios de adulteração no documento |
document_invalid | Documento inválido ou não aceito |
document_unreadable | O documento não pôde ser lido |
cpf_reference_not_found | CPF não encontrado na base de referência |
data_unavailable | Dados indisponíveis na fonte consultada |
phone_not_covered | Telefone sem cobertura para a consulta |
invalid_code | O código enviado não confere, e as tentativas acabaram |
liveness_failed, face_mismatch, spoof_detected, document_tampered, document_invalid, document_unreadable, cpf_reference_not_found, data_unavailable, phone_not_covered, invalid_code A referência de correlação que você enviou na criação.
Data de criação em ISO-8601.
Data de resolução em ISO-8601. É null enquanto não resolvida.
URL para onde redirecionar o titular. Preenchida nas validações hospedadas; null nas síncronas.
Quando a validação vence, em ISO-8601. Preenchida nas validações hospedadas e nas que enviam um código; null nas síncronas.
Quantas chamadas de verificação ainda serão aceitas. Preenchida nos tipos que enviam um código para a pessoa devolver (hoje só phone_ownership) e null nos demais.
Vale 0 assim que a validação é resolvida, em qualquer desfecho, porque nenhuma outra tentativa será aceita.
Dados extraídos, agrupados pela chave do type. Hoje só liveness_document_match produz detalhes, e só com status igual a completed. Nos demais casos é null.
Show child attributes
Show child attributes
Was this page helpful?