Visão geral
Todo relatório por recurso segue o formato do serializer V3 definido emservice-didit-verification. O mesmo objeto aparece em três lugares, e por isso o schema mostrado aqui é a única fonte de verdade para todos eles:
GET /v3/session/{sessionId}/decision/: cada recurso é retornado como um array no plural (id_verifications[],nfc_verifications[],liveness_checks[],face_matches[],poa_verifications[],phone_verifications[],email_verifications[],aml_screenings[],ip_analyses[],database_validations[],questionnaire_responses[],signatures[],bank_verifications[](veja Métodos de verificação bancária) e os equivalentes de KYBregistry_checks[],document_verifications[],key_people_checks[]).- Payloads de webhook (
status.updated,data.updated): o mesmo formato, dentro do envelopedecision. - APIs independentes: as respostas de objeto único (Busca facial, Estimativa de idade, Autenticação biométrica) reutilizam o mesmo conjunto de campos.
A V3 introduziu fluxos de verificação (workflows) com múltiplas instâncias: cada objeto de recurso traz um
node_id que vincula o relatório ao nó do grafo do fluxo que o gerou. Os endpoints V2 (no singular: kyc, face, aml etc.) continuam retrocompatíveis, mas retornam apenas a primeira instância.Campos comuns
Todo objeto de relatório expõe os seguintes campos:| Campo | Tipo | Descrição |
|---|---|---|
status | string | Status do ciclo de vida no nível do recurso, um dos valores em Enum de status. Origem: common/config/choices.py:FeatureStatusChoices (linhas 343-348). O status de nível superior da sessão pai usa o enum de sessão, mais amplo (StatusChoices, linhas 106-117). |
node_id | string | null | Identificador do nó do grafo do fluxo. Preenchido em fluxos V3 com múltiplas instâncias; null em sessões legadas com um único recurso. |
warnings | array de objetos de aviso | Sinais de risco filtrados para este recurso e este node_id. Retornado por Session.get_logs(...) (sessions/models/session.py:1611). |
portrait_image, front_image, document_file, …) são URLs pré-assinadas com um período de validade limitado: baixe os arquivos logo, em vez de armazenar a URL. Os exemplos as mostram como https://<media-host>/....
Objeto de aviso
Retornado em cada arraywarnings[]. Schema de logs/serializers/log.py:8-65 (LogV3Serializer).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
feature | string (enum) | Não | Recurso que emitiu o aviso. Valores de LogWarningChoices (common/config/choices.py:190-204): ID_VERIFICATION, NFC, LIVENESS, FACEMATCH, PROOF_OF_ADDRESS, PHONE, EMAIL, AML, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE. | "ID_VERIFICATION" |
risk | string | Não | Código de risco estável (por exemplo, DOCUMENT_EXPIRED, LOW_LIVENESS_SCORE). Valores de logs/choices.py:RiskChoices. Usado como chave nas tabelas de descrição. | "DOCUMENT_EXPIRED" |
additional_data | object | null | Sim | Contexto específico do risco (por exemplo, limiares de pontuação, campos correspondentes). O formato varia conforme o código de risco. | { "score": 42.1, "threshold": 70 } |
log_type | string (enum) | Não | Um dos valores: error, warning, information. De LogTypeChoices (common/config/choices.py:207-210). | "error" |
short_description | string | Não | Rótulo legível do risco. De logs/choices.py:RISK_SHORT_DESCRIPTIONS. | "Document expired" |
long_description | string | Não | Explicação legível mais longa, adequada para interfaces exibidas ao usuário final. De logs/choices.py:RISK_LONG_DESCRIPTIONS. | "The document's expiration date has passed, rendering it no longer valid for use." |
node_id | string | null | Sim | Nó do grafo do fluxo ao qual o aviso se refere. null em logs V2 legados sem node_id. | "first_id_verification" |
{
"feature": "ID_VERIFICATION",
"risk": "DOCUMENT_EXPIRED",
"additional_data": null,
"log_type": "error",
"short_description": "Document expired",
"long_description": "The document's expiration date has passed, rendering it no longer valid for use.",
"node_id": "first_id_verification"
}
Objetos de relatório
As seções restantes descrevem cada objeto de relatório por recurso. O texto do título H3 é mantido fixo de propósito, para que outras documentações possam linkar diretamente para ele.Verificação de identidade
Retornado para cada documento de KYC/identidade enviado pelo usuário. Aparece comoid_verifications[] em GET /v3/session/{sessionId}/decision/ e dentro do campo kyc das respostas V2. Fonte: kyc/serializers/kyc.py:383-414 (IDVerificationV3Serializer, que estende IDVerificationV2Serializer em kyc/serializers/kyc.py:320-380).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
status | texto | Não | Consulte o Enum de status. | "Approved" |
document_type | texto | Sim | Classe do documento legível por humanos (Passport, Identity Card, Driver's License, Residence Permit, Health Insurance Card, Tax Card, Social Security Card, Work Permit, Visa, Public Service Card, Birth Certificate, Firearm License, Other). Fonte: DOC_TYPE_MAPPING (common/config/choices.py:1275-1289). | "Passport" |
document_subtype | texto | Sim | Código de subtipo do documento, do registro de documentos da Didit, filtrado para o que as configurações de documento do fluxo aceitam. Documentos específicos de uma região incluem a região. Lista completa de códigos: Subtipos de documento. | "QUEENSLAND_DRIVER_LICENSE_GENERIC" |
document_number | texto | Sim | Número do documento extraído por OCR. | "AB1234567" |
personal_number | texto | Sim | Identificador pessoal/nacional extraído por OCR. | "99999999R" |
portrait_image | texto (URL) | Sim | URL pré-assinada do recorte do rosto. | "https://<media-host>/.../portrait.jpg?..." |
front_image | texto (URL) | Sim | URL pré-assinada da frente do documento, já tratada. | "https://<media-host>/.../front.jpg?..." |
front_video | texto (URL) | Sim | URL pré-assinada do vídeo de captura da frente (quando disponível). | "https://<media-host>/.../front.mp4?..." |
back_image | texto (URL) | Sim | URL pré-assinada do verso do documento, já tratado. | "https://<media-host>/.../back.jpg?..." |
back_video | texto (URL) | Sim | URL pré-assinada do vídeo de captura do verso. | null |
full_front_image | texto (URL) | Sim | Captura da frente sem recorte (quadro completo). | "https://<media-host>/.../full_front.jpg?..." |
full_back_image | texto (URL) | Sim | Captura do verso sem recorte (quadro completo). | null |
front_image_camera_front | texto (URL) | Sim | Imagem da câmera frontal tirada ao mesmo tempo que a frente do documento. | null |
back_image_camera_front | texto (URL) | Sim | Imagem da câmera frontal tirada ao mesmo tempo que o verso do documento. | null |
front_image_camera_front_face_match_score | número decimal (0-100) | Sim | Similaridade entre o retrato do documento e a captura da câmera frontal. | null |
back_image_camera_front_face_match_score | número decimal (0-100) | Sim | Igual ao anterior, mas para a captura do verso. | null |
document_selfie_face_matches | array | Sim | Sessões anteriores ou entradas da lista de bloqueio facial correspondentes à selfie tirada durante a captura do documento. Mesmo formato de entrada de liveness_checks[].matches. null quando a busca não foi executada, [] quando nada correspondeu. | null |
front_image_quality_score | objeto | Sim | Métricas de qualidade da imagem da frente: pontuações de 0 a 100 (focus_score, brightness_score, resolution_score, overall_score), além de brightness_issue (ok, too_dark, too_bright) e is_document_fully_visible (booleano). | { "focus_score": 91.0, "overall_score": 88.5 } |
back_image_quality_score | objeto | Sim | Mesmo formato de front_image_quality_score. | null |
date_of_birth | texto (AAAA-MM-DD) | Sim | Data de nascimento extraída por OCR. | "1990-05-12" |
age | inteiro | Sim | Idade calculada em anos no momento da extração. | 35 |
expiration_date | texto (AAAA-MM-DD) | Sim | Data de validade do documento. | "2032-05-11" |
date_of_issue | texto (AAAA-MM-DD) | Sim | Data de emissão do documento. | "2022-05-11" |
issuing_state | texto (ISO 3166-1 alpha-3) | Sim | Código do país emissor. | "ESP" |
issuing_state_name | texto | Sim | Nome localizado do país emissor. | "Spain" |
first_name | texto | Sim | Nome(s) próprio(s) extraído(s) por OCR. | "María" |
last_name | texto | Sim | Sobrenome(s) extraído(s) por OCR. | "García López" |
full_name | texto | Sim | Nome completo normalizado (fornecido pelo fornecedor). | "María García López" |
gender | texto | Sim | M, F ou outro valor fornecido pelo fornecedor. | "F" |
address | texto | Sim | Linha de endereço bruta extraída por OCR. | "Calle Mayor 1, 28001 Madrid" |
formatted_address | texto | Sim | Endereço geocodificado/formatado (quando é possível interpretá-lo). | "Calle Mayor 1, 28001 Madrid, Spain" |
parsed_address | objeto | Sim | Endereço estruturado e geocodificado: street_1, street_2, city, region, country, postal_code, address_type, formatted_address, document_location ({latitude, longitude}), raw_results, is_best_match. Fonte: kyc/utils/address.py:147-197. | { "street_1": "Calle Mayor 1", "city": "Madrid", "postal_code": "28001", "country": "ES" } |
place_of_birth | texto | Sim | Local de nascimento extraído por OCR. | "Madrid" |
marital_status | texto | Sim | Quando for possível extrair. | null |
nationality | texto (ISO 3166-1 alpha-3) | Sim | Nacionalidade extraída por OCR. | "ESP" |
extra_fields | objeto | Sim | Campos específicos do tipo de documento que não estão cobertos pelo esquema canônico (por exemplo, categorias da carteira de motorista). | { "DL Class": "B" } |
mrz | objeto | Sim | Campos da MRZ interpretados, quando presentes (document_number, birth_date, expiry_date, surname, given_names, …). | { "document_number": "AB1234567", "surname": "GARCIA", "given_names": "MARIA" } |
extra_files | array de textos (URL) | Não | URLs pré-assinadas de quaisquer arquivos adicionais enviados. | [] |
matches | array de objetos | Não | Correspondências de documentos entre sessões. Cada item: { session_id, session_number, vendor_data, verification_date, user_details: { name, document_type, document_number }, status, is_blocklisted, api_service, front_image_url }. front_image_url é pré-assinada. | [] |
verification_method | string | Não | Qual método de Verificação de identidade gerou esta linha: document, id_lookup ou wallet. Sempre document para um documento fotografado, incluindo todas as sessões criadas antes da existência dos outros métodos. | "id_lookup" |
assurance | string | Não | Nível de garantia derivado de verification_method: documentary, data_match ou cryptographic. | "data_match" |
wallet_provider | string | null | Sim | ID da carteira no catálogo, quando uma carteira gerou esta linha (mitid, bankid_se, itsme, …). null caso contrário. | "mitid" |
fallback_from | object | null | Sim | Motivo pelo qual um método diferente de documento encerrou a etapa de ID: { method, reason, action }. É definido quando uma consulta ou um login na carteira falhou: na linha recusada, quando a configuração do país era decline (action: "decline"), e na verificação de documento com a qual o usuário prossegue, quando era fallback_to_document (action: "fallback_to_document"). null quando nenhuma falha anterior de método diferente de documento está registrada. | { "method": "id_lookup", "reason": "no_match", "action": "decline" } |
id_lookup | object | null | Sim | Evidência da fonte, presente apenas quando verification_method é id_lookup: source (a fonte exata consultada: um registro governamental na maioria dos países, ou um arquivo de bureau de crédito ou de registros residenciais em alguns), checked_at, attempts, max_attempts, outcome (match, partial_match, no_match, provider_error, format_rejected), comparison[] ({ field, label, provided, record, result }; field é um de identification_number, full_name, date_of_birth, address, e result é match, partial ou no_match; versões anteriores podem incluir uma linha provider com error), source_errors[] (ambiente de homologação atual: diagnósticos separados por fonte; confirme a disponibilização em produção), registry_portrait (URL pré-assinada, apenas para fontes que retornam uma) e face_match_score. | veja abaixo |
wallet_verification | object | null | Sim | Evidência de credencial, presente apenas quando verification_method é wallet: provider, provider_name, issuing_authority, issuing_country, credential_type, level_of_assurance (low, substantial, high), verified_at, signature_valid, attributes (o que a carteira compartilhou), portrait (URL pré-assinada quando a carteira compartilha uma) e face_match_score. | veja abaixo |
document_liveness | object | null | Sim | Pontuações de prova de vida do documento por tipo de fraude (portrait_replace, printed_copy, screen_replay), informadas com ou sem aviso disparado. Cada uma contém: score (0-100, quanto maior, mais provável que seja genuíno; o menor valor, que é o valor usado na decisão), front, back, decline_threshold, review_threshold, bucket (approve, review, decline ou null). Limiares e bucket são salvos no momento da avaliação; os três são null quando as evidências históricas de avaliação não estão disponíveis, mas as pontuações armazenadas continuam visíveis. null quando a verificação não foi executada. Veja Pontuações de prova de vida do documento. Apenas V3. | { "portrait_replace": { "score": 96.46, "bucket": "approve" } } |
node_id | string | null | Sim | Identificador do nó do fluxo de verificação (V3). | "first_id_verification" |
warnings | array | Não | Veja Objeto de aviso. | [] |
region | string | Sim | Região ou estado do país emissor, quando o documento o identifica. | "CA" |
extracted_data | object | Sim | Instantâneo dos dados extraídos do documento que foram apresentados à pessoa para revisão, mantido junto aos valores confirmados para que você possa compará-los. null quando a pessoa não foi solicitada a revisar. | |
barcodes | array de objetos | Não | Dados lidos dos códigos de barras do documento, uma entrada por código com type, position, data, data_raw e side. [] quando não há nenhum. | [] |
{
"status": "Approved",
"document_type": "Passport",
"document_subtype": "PASSPORT_GENERIC",
"document_number": "AB1234567",
"personal_number": "99999999R",
"portrait_image": "https://<media-host>/.../portrait.jpg?signature=...",
"front_image": "https://<media-host>/.../front.jpg?signature=...",
"front_video": null,
"back_image": "https://<media-host>/.../back.jpg?signature=...",
"back_video": null,
"full_front_image": "https://<media-host>/.../full_front.jpg?signature=...",
"full_back_image": null,
"front_image_camera_front": null,
"back_image_camera_front": null,
"front_image_camera_front_face_match_score": null,
"back_image_camera_front_face_match_score": null,
"front_image_quality_score": {
"focus_score": 91.0,
"brightness_score": 88.0,
"brightness_issue": "ok",
"is_document_fully_visible": true,
"resolution_score": 95.0,
"overall_score": 88.5
},
"back_image_quality_score": null,
"date_of_birth": "1990-05-12",
"age": 35,
"expiration_date": "2032-05-11",
"date_of_issue": "2022-05-11",
"issuing_state": "ESP",
"issuing_state_name": "Spain",
"first_name": "María",
"last_name": "García López",
"full_name": "María García López",
"gender": "F",
"address": "Calle Mayor 1, 28001 Madrid",
"formatted_address": "Calle Mayor 1, 28001 Madrid, Spain",
"parsed_address": { "street_1": "Calle Mayor 1", "street_2": null, "city": "Madrid", "region": "Madrid", "postal_code": "28001", "country": "ES", "address_type": "Calle" },
"place_of_birth": "Madrid",
"marital_status": null,
"nationality": "ESP",
"extra_fields": {},
"mrz": {
"document_number": "AB1234567",
"surname": "GARCIA",
"given_names": "MARIA",
"birth_date": "900512",
"expiry_date": "320511"
},
"extra_files": [],
"matches": [],
"node_id": "first_id_verification",
"verification_method": "document",
"assurance": "documentary",
"wallet_provider": null,
"fallback_from": null,
"id_lookup": null,
"wallet_verification": null,
"document_liveness": {
"portrait_replace": {
"score": 96.46,
"front": 96.46,
"back": 98.2,
"decline_threshold": 35,
"review_threshold": 70,
"bucket": "approve"
},
"printed_copy": {
"score": 91.2,
"front": 91.2,
"back": 93.7,
"decline_threshold": 35,
"review_threshold": 77,
"bucket": "approve"
},
"screen_replay": {
"score": 99.9,
"front": 99.9,
"back": 99.5,
"decline_threshold": 30,
"review_threshold": 70,
"bucket": "approve"
}
},
"warnings": []
}
null.
{
"status": "Approved",
"issuing_state": "ZAF",
"first_name": "Thabo",
"last_name": "Mokoena",
"full_name": "Thabo Mokoena",
"date_of_birth": "1991-06-15",
"personal_number": "9106155043088",
"node_id": "first_id_verification",
"verification_method": "id_lookup",
"assurance": "data_match",
"wallet_provider": null,
"fallback_from": null,
"id_lookup": {
"source": "Department of Home Affairs",
"checked_at": "2026-09-04T09:12:44Z",
"attempts": 1,
"max_attempts": 2,
"outcome": "match",
"comparison": [
{ "field": "identification_number", "label": "ID number", "provided": "9106155043088", "record": "9106155043088", "result": "match" },
{ "field": "full_name", "label": "Full name", "provided": "Thabo Mokoena", "record": "Thabo Mokoena", "result": "match" },
{ "field": "date_of_birth", "label": "Date of birth", "provided": "1991-06-15", "record": "1991-06-15", "result": "match" }
],
"registry_portrait": "https://<media-host>/.../registry_portrait.jpg?signature=...",
"face_match_score": 96.4
},
"wallet_verification": null,
"warnings": []
}
{
"status": "Approved",
"issuing_state": "DNK",
"first_name": "Freja",
"last_name": "Nielsen",
"full_name": "Freja Nielsen",
"date_of_birth": "1988-03-02",
"node_id": "first_id_verification",
"verification_method": "wallet",
"assurance": "cryptographic",
"wallet_provider": "mitid",
"fallback_from": null,
"id_lookup": null,
"wallet_verification": {
"provider": "mitid",
"provider_name": "MitID",
"issuing_authority": "Danish Agency for Digital Government",
"issuing_country": "DNK",
"credential_type": "person_identification",
"level_of_assurance": "substantial",
"verified_at": "2026-09-04T09:12:44Z",
"signature_valid": true,
"attributes": {
"full_name": "Freja Nielsen",
"date_of_birth": "1988-03-02",
"cpr_alias": "b0f1c2d3-e4f5-4678-9abc-def012345678"
},
"portrait": null,
"face_match_score": null
},
"warnings": []
}
Verificação NFC
Retornada para cada leitura de chip em um documento de identidade: um chip ePassport ou eID conforme ICAO 9303, ou um Japan My Number Card lido via JPKI (chip_protocol: "jpki"). Aparece como nfc_verifications[] em GET /v3/session/{sessionId}/decision/ (um por registro KYC pai). Fonte: kyc/serializers/epassport.py:121-139 (NFCV3Serializer, estende NFCV2Serializer em kyc/serializers/epassport.py:83-118).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Veja Enum de status. | "Approved" |
portrait_image | string (URL) | Sim | URL pré-assinada da imagem facial extraída do chip. | "https://<media-host>/.../nfc_portrait.jpg?..." |
signature_image | string (URL) | Sim | URL pré-assinada da imagem de assinatura extraída do chip (quando armazenada no chip). | null |
chip_data | object | Sim | Dados pessoais analisados dos grupos de dados do chip, em formato plano (kyc/utils/epassport.py:165-212): dgs (grupos de dados lidos), surname, name, country, nationality, birth_date (YYYY-MM-DD), expiry_date (YYYY-MM-DD), sex (M/F), document_type (código do documento na MRZ), document_number, optional_data, dígitos de verificação da MRZ (birth_date_hash, expiry_date_hash, document_number_hash, optional_data_hash, final_hash), mrz_string, mrz_type (TD1/TD2/TD3); além de place_of_birth e address (e full_name / full_name_non_latin para nomes não latinos) quando o chip contém o DG11. Essas chaves estão ausentes caso contrário. null quando a etapa de NFC foi ignorada. | { "document_number": "AB1234567", "name": "MARIA" } |
authenticity | object | Sim | { sod_integrity, dg_integrity }; null para uma leitura JPKI. sod_integrity valida se a assinatura do Document Security Object (SOD) está encadeada a uma CSCA válida do país emissor (e se a DSC não foi revogada nem está expirada); dg_integrity valida se o hash de cada grupo de dados corresponde ao SOD. Ambos true significam que o chip é genuíno e não foi adulterado. | { "sod_integrity": true, "dg_integrity": true } |
certificate_summary | objeto | Sim | Resumo do certificado do assinante do documento (kyc/utils/epassport.py:338-348): issuer, subject, serial_number (inteiro), not_valid_before, not_valid_after (YYYY-MM-DD HH:MM:SS), além de um objeto validation { csca_verified, dsc_revoked, dsc_expired, csca_expired } (kyc/views/epassport.py:86). | { "issuer": "Common Name: CSCA SPAIN, Country: ES", "not_valid_after": "2031-02-18 10:21:11" } |
node_id | string | null | Sim | Identificador do nó do fluxo de verificação (workflow) (V3). | "first_nfc" |
is_nfc_skipped | booleano | Não | true quando esta etapa NFC foi explicitamente ignorada em vez de lida; skip_reason informa o motivo. | false |
skip_reason | string | Sim | Motivo pelo qual a etapa foi ignorada; definido somente quando is_nfc_skipped é true. Um dos valores USER_SKIPPED, DOCUMENT_WITHOUT_CHIP, CHIP_CERTIFICATE_UNAVAILABLE, DEVICE_WITHOUT_NFC, INTEGRATION_WITHOUT_NFC_ACCESS, MRZ_KEY_UNAVAILABLE, JPKI_UNAVAILABLE; veja Motivos de ignorar. O payload de decisão também traz um nfc_skip_reason no nível da sessão, com a mesma taxonomia, que cobre etapas NFC ignoradas antes de criar qualquer relatório. | null |
chip_protocol | string | Não | Como o chip é lido: icao (chip de ePassport ou eID ICAO 9303) ou jpki (Cartão My Number do Japão). Para jpki, portrait_image, signature_image, chip_data, authenticity e certificate_summary são null. Também é definido em etapas ignoradas. | "icao" |
jpki | objeto | Sim | O que a leitura do Cartão My Number comprovou: certificate_types, chain_valid, signature_valid, revocation_status (good, revoked ou unchecked), ca_generation, certificate_expires_at, certificates[], attributes (nome, data de nascimento, sexo e endereço do certificado de assinatura), attributes_match_ocr e mismatched_attributes. Nunca inclui os certificados, seus números de série ou as assinaturas. null para chips ICAO, para etapas ignoradas e quando a etapa foi encerrada sem nenhuma leitura do cartão. Veja Campos JPKI. | null |
warnings | array | Não | Veja Objeto de aviso. | [] |
{
"status": "Approved",
"portrait_image": "https://<media-host>/.../nfc_portrait.jpg?signature=...",
"signature_image": null,
"chip_data": {
"dgs": ["DG1", "DG2", "DG11"],
"surname": "GARCIA LOPEZ",
"name": "MARIA",
"country": "ESP",
"nationality": "ESP",
"birth_date": "1990-05-12",
"expiry_date": "2032-05-11",
"sex": "F",
"document_type": "P",
"document_number": "AB1234567",
"optional_data": "",
"birth_date_hash": "4",
"expiry_date_hash": "7",
"document_number_hash": "3",
"optional_data_hash": "",
"final_hash": "8",
"mrz_string": "P<ESPGARCIA<LOPEZ<<MARIA<<<<<<<<<<<<<<<<<<<<AB1234567ESP9005124F3205117<<<<<<<<<<<<<<08",
"mrz_type": "TD3",
"place_of_birth": "MADRID",
"address": "CALLE MAYOR 1, MADRID"
},
"authenticity": { "sod_integrity": true, "dg_integrity": true },
"certificate_summary": {
"issuer": "Common Name: CSCA SPAIN, Organization: DIRECCION GENERAL DE LA POLICIA, Country: ES",
"subject": "Common Name: DS n-eID SPAIN 2, Organizational Unit: PASSPORT, Organization: DIRECCION GENERAL DE LA POLICIA, Country: ES",
"serial_number": 118120836164494130086420187336801405660,
"not_valid_before": "2020-11-18 10:21:11",
"not_valid_after": "2031-02-18 10:21:11",
"validation": {
"csca_verified": true,
"dsc_revoked": false,
"dsc_expired": false,
"csca_expired": false
}
},
"node_id": "first_nfc",
"is_nfc_skipped": false,
"skip_reason": null,
"chip_protocol": "icao",
"jpki": null,
"warnings": []
}
Verificação de prova de vida
Retornado para cada sessão de prova de vida. Aparece comoliveness_checks[] em GET /v3/session/{sessionId}/decision/. Fonte: face/serializers/face.py:301-320 (LivenessV3Serializer, estende LivenessV2Serializer em face/serializers/face.py:216-298).
| Campo | Tipo | Pode ser nulo | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Veja Enum de status. | "Approved" |
method | string (enum) | Sim | ACTIVE_3D, FLASHING ou PASSIVE (LivenessMethodChoices, common/config/choices.py:514-517). A prova passiva é executada quando sessões em desktop são permitidas e o usuário está usando um desktop. | "PASSIVE" |
score | float (0-100) | Sim | Confiança da prova de vida, arredondada para 2 casas decimais. | 92.41 |
reference_image | string (URL) | Sim | URL pré-assinada do recorte do rosto de referência do usuário. | "https://<media-host>/.../reference.jpg?..." |
video_url | string (URL) | Sim | URL pré-assinada da gravação da prova de vida, quando a captura armazenou uma, tanto para prova ativa quanto passiva. null quando a sessão não manteve nenhuma gravação. | "https://<media-host>/.../liveness.webm?..." |
age_estimation | float | Sim | Idade estimada (em anos) do maior rosto na imagem de referência. | 34.2 |
matches | array de objetos | Não | Correspondências faciais entre sessões. Cada item: { session_id, session_number, similarity_percentage, vendor_data, vendor_user_id, biometric_template_id, verification_date, user_details: { full_name, document_type, document_number }, match_image_url, status, is_blocklisted, is_allowlisted, api_service, source }. source é session, imported, list_entry ou retained_template. Uma correspondência de modelo retido tem vendor_user_id, vendor_data e biometric_template_id; seus campos de sessão, imagem, detalhes de identidade, status e serviço de API são null. | [] |
face_quality | float (0-100) | Sim | Pontuação de qualidade do rosto na prova de vida passiva (normalizada para porcentagem). | 87.50 |
face_luminance | float (0-100) | Sim | Pontuação de luminância do rosto na prova de vida passiva (normalizada de 0-255 para porcentagem). | 54.12 |
node_id | string | null | Sim | Identificador do nó do fluxo (V3). | "first_liveness" |
warnings | array | Não | Veja Objeto de aviso. | [] |
{
"status": "Approved",
"method": "PASSIVE",
"score": 92.41,
"reference_image": "https://<media-host>/.../reference.jpg?signature=...",
"video_url": null,
"age_estimation": 34.2,
"matches": [],
"face_quality": 87.50,
"face_luminance": 54.12,
"node_id": "first_liveness",
"warnings": []
}
null quando a sessão não manteve gravação; o exemplo acima é de uma sessão que não manteve nenhuma.
Correspondência facial
Retornado para cada comparação facial (normalmente o rosto da prova de vida do usuário com o retrato do documento). Aparece comoface_matches[] em GET /v3/session/{sessionId}/decision/. Fonte: face/serializers/face.py:367-389 (FaceMatchV3Serializer, estende FaceMatchV2Serializer em face/serializers/face.py:323-364).
| Campo | Tipo | Pode ser nulo | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Veja Enum de status. | "Approved" |
score | float (0-100) | Sim | Similaridade, arredondada para 2 casas decimais. Quando o provedor retorna apenas um unmatched_faces[].Confidence, ele é convertido para 100 - confidence. | 97.83 |
source_image_session_id | string (UUID) | Sim | A sessão cujo retrato armazenado forneceu a imagem de origem (referência). É definido em fluxos baseados em retrato (autenticação biométrica, ou um retrato fornecido na criação da sessão). null quando a referência é o retrato do documento da mesma sessão. | null |
source_image | string (URL) | Sim | URL pré-assinada da imagem de origem (referência): normalmente o retrato do documento ou, nos fluxos de autenticação biométrica, o retrato armazenado. | "https://<media-host>/.../source.jpg?..." |
target_image | string (URL) | Sim | URL pré-assinada da imagem alvo (rosto ao vivo) capturada durante a prova de vida. | "https://<media-host>/.../target.jpg?..." |
node_id | string | null | Sim | Identificador do nó do fluxo (V3). | "first_face_match" |
warnings | array | Não | Veja Objeto de aviso. | [] |
face_coverage | objeto | Sim | Indica se eyes, mouth e face estão cobertos na imagem capturada. Cada região tem covered, calibrated e visibility_score; calibrated: false indica evidência de sombra à qual nenhum aviso se aplica. Retornado somente por GET /v3/session/{sessionId}/decision/, nunca em payloads de webhook. | { "eyes": { "covered": false, "calibrated": true, "visibility_score": 0.98 } } |
{
"status": "Approved",
"score": 97.83,
"source_image_session_id": null,
"source_image": "https://<media-host>/.../source.jpg?signature=...",
"target_image": "https://<media-host>/.../target.jpg?signature=...",
"node_id": "first_face_match",
"warnings": []
}
Busca facial
Retornado pela API independente de Busca facial (POST /v3/face-search/). A busca facial nunca aparece como um array de vários itens em /v3/session/{sessionId}/decision/. Quando persistida com save_api_request=true, a sessão aparece ali como uma entrada FACE_SEARCH em features[], mais um item em liveness_checks[] que contém os matches armazenados. Fontes: apis/serializers/face_search.py:8-79 (FaceSearchResponseSerializer, que encapsula FaceSearchDetailsSerializer); os dicionários de correspondência são montados em face/utils/utils.py:869-884.
Resposta de nível superior:
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
request_id | string (UUID) | Não | O ID da sessão persistida quando save_api_request=true (utilizável com GET /v3/session/{sessionId}/decision/); caso contrário, um UUID de correlação temporário. | "4a1c2c4e-8b1b-4d6a-91b5-ee9a1f3a2c7f" |
face_search | objeto | Não | O payload com os detalhes da busca; veja os campos abaixo. | — |
vendor_data | string | Sim | vendor_data repetido da requisição. | null |
metadata | objeto | Sim | metadata repetido da requisição. | null |
created_at | string (ISO 8601) | Não | Timestamp da requisição no servidor. | "2026-06-12T01:04:42.763237+00:00" |
face_search:
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Declined somente quando um aviso FACE_IN_BLOCKLIST ou POSSIBLE_FACE_IN_BLOCKLIST foi disparado; Approved nos demais casos. Correspondências duplicadas, por si só, nunca resultam em recusa (apis/views/face_search.py:242-248). | "Approved" |
total_matches | inteiro | Não | Número de correspondências retornadas em matches[] (0–5). | 1 |
matches | array de objetos de correspondência de busca facial | Não | Até 5 correspondências acima do limite mínimo de similaridade, ordenadas por similaridade decrescente (entradas da lista de bloqueio primeiro, com search_type=blocklisted_or_approved). | […] |
user_image | objeto | Não | Resultado da detecção para a imagem enviada: { entities: [{ bbox, confidence }], best_angle }, com uma entidade por rosto detectado. | { "entities": [{ "bbox": [40, 40, 120, 120], "confidence": 0.73 }], "best_angle": 0 } |
warnings | array de objetos | Não | Formato reduzido de aviso para esta API independente, sem node_id. O contrato do serializer declara { risk, additional_data, log_type, short_description, long_description } (apis/serializers/face_search.py:49-54). O payload em tempo de execução também traz feature, sempre "LIVENESS" (apis/views/face_search.py:332-341). | [] |
Objeto de correspondência de busca facial
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
session_id | string (UUID) | Sim | A sessão de verificação correspondente. null quando source é imported, list_entry ou retained_template. | "a3f2a6f1-…" |
session_number | inteiro | Sim | Número da sessão correspondente, amigável para o console; null para correspondências que não são de sessão. | 1024 |
similarity_percentage | float (0-100) | Não | Similaridade entre a face enviada e a face correspondente. | 96.42 |
source | string (enum) | Não | De onde a face correspondente foi cadastrada: session (sessão de verificação ou chamada independente salva), imported (upload direto da face no perfil do usuário), list_entry (face vinculada a uma lista), retained_template (template biométrico sem imagem, retido após a exclusão da sessão de origem). | "session" |
vendor_data | string | Sim | O vendor_data da sessão correspondente ou o do usuário vinculado, nas correspondências imported e retained_template. | "user-12345" |
vendor_user_id | string (UUID) | Sim | O usuário vinculado. null para correspondências list_entry e para sessões sem usuário. | "2f7c1a9e-…" |
biometric_template_id | string (UUID) | Sim | O template retido que correspondeu. Definido somente para correspondências retained_template; use-o com GET/DELETE /v3/biometric-templates/{id}/. | null |
verification_date | string (ISO 8601) | Sim | Quando a face correspondente foi capturada, ou quando um retained_template foi retido; null para correspondências list_entry. | "2024-11-04T09:14:02Z" |
user_details | objeto | Sim | { full_name, document_type, document_number } da verificação de documento da sessão correspondente. Para correspondências imported, apenas full_name é preenchido. null quando não existem dados de identidade e sempre null para correspondências retained_template. | { "full_name": "María García López", "document_type": "Passport", "document_number": "AB1234567" } |
match_image_url | string (URL) | Sim | Face de referência do usuário correspondente: URL pré-assinada quando save_api_request=true, caso contrário, o caminho bruto do armazenamento. Sempre null para correspondências retained_template, que não guardam imagem. | "https://<media-host>/.../matched.jpg?..." |
status | string | Sim | O status de verificação da sessão correspondente (veja o enum de status); null para correspondências que não são de sessão. | "Approved" |
is_blocklisted | boolean | Não | Indica se a face correspondente está na sua lista de bloqueio facial. Sempre false para correspondências retained_template. Uma face da lista de bloqueio é reportada separadamente como uma correspondência list_entry. | false |
is_allowlisted | boolean | Não | Indica se a face correspondente está em uma das suas listas de permissão. | false |
api_service | string (enum) | Sim | Tipo da API independente da sessão correspondente, em maiúsculas (por exemplo, PASSIVE_LIVENESS, FACE_MATCH); null para sessões de fluxo de verificação e para correspondências que não são de sessão. | null |
{
"request_id": "4a1c2c4e-8b1b-4d6a-91b5-ee9a1f3a2c7f",
"face_search": {
"status": "Approved",
"total_matches": 1,
"matches": [
{
"session_id": "a3f2a6f1-1c1c-4eec-8b69-1c1c2f3a2c7f",
"session_number": 1024,
"similarity_percentage": 96.42,
"source": "session",
"vendor_data": "user-12345",
"verification_date": "2024-11-04T09:14:02Z",
"user_details": {
"full_name": "María García López",
"document_type": "Passport",
"document_number": "AB1234567"
},
"match_image_url": "https://<media-host>/.../matched.jpg?signature=...",
"status": "Approved",
"is_blocklisted": false,
"is_allowlisted": false,
"api_service": null
}
],
"user_image": {
"entities": [
{
"bbox": [40, 40, 120, 120],
"confidence": 0.732973
}
],
"best_angle": 0
},
"warnings": []
},
"vendor_data": null,
"metadata": null,
"created_at": "2026-06-12T01:04:42.763237+00:00"
}
Análise AML
Retornado para cada entidade analisada. Aparece comoaml_screenings[] em GET /v3/session/{sessionId}/decision/, tanto para sessões KYC quanto para sessões KYB. Fonte: aml/serializers/aml.py:63-85 (AMLV3Serializer, que estende AMLV2Serializer em aml/serializers/aml.py:28-60).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Veja o enum de status. | "Approved" |
total_hits | inteiro | Não | Número de ocorrências da análise (sempre presente, com valor padrão 0). | 2 |
entity_type | string (enum) | Sim | person ou company (EntityTypeChoices, common/config/choices.py:675-677). | "person" |
hits | array de objetos | Não | Uma entrada por ocorrência. Campos principais: id, caption, match (booleano), target (booleano | null, indicando se a entidade é o alvo direto da listagem), match_score (float de 0 a 100, confiança de identidade), risk_score (float de 0 a 100, risco da entidade), score (float de 0 a 1, descontinuado), datasets[] (por exemplo, PEP, PEP Level 1-4, Sanctions, Adverse Media, Warnings and Regulatory Enforcement, Fitness and Probity), properties (nomes, aliases, datas de nascimento, …), features, url, first_seen, last_seen, rca_name, risk_view, score_breakdown, pep_matches, sanction_matches, warning_matches, adverse_media_matches, adverse_media_details, linked_entities, additional_information, e review_status (Unreviewed, Confirmed Match, False Positive, Inconclusive; editável pelo endpoint de atualização do status de ocorrência AML, AMLHitStatusChoices). | […] |
score | float (0-100) | Sim | Pontuação geral de triagem: o maior risk_score entre os resultados não marcados como False Positive (aml/services/aml.py:832-842); 0 quando todos os resultados são falsos positivos. null até ser calculada. | 42.7 |
screened_data | object | Sim | Cópia dos dados enviados para a triagem: full_name, nationality, date_of_birth, document_number. | { "full_name": "María García López", "date_of_birth": "1990-05-12" } |
is_ongoing_monitoring_enabled | boolean | Não | Se a entidade está inscrita nas retriagens do monitoramento contínuo. | false |
next_ongoing_monitoring_bill_date | string (YYYY-MM-DD) | Sim | Calculada como last_aml_bill_date + 365 days quando o monitoramento contínuo está habilitado. Uma data de faturamento, não uma data de triagem. | null |
last_ongoing_screening_at | string (ISO 8601) | Sim | Quando o monitoramento contínuo concluiu mais recentemente uma retriagem deste registro, independentemente de o resultado ter mudado. null quando nunca houve nova triagem; nunca é preenchido retroativamente. | "2026-09-12T04:03:11Z" |
last_ongoing_screening_datasets_updated_at | string (ISO 8601) | Sim | Atualização mais recente do conjunto de dados AML que o provedor informou para essa triagem. null quando nenhuma data de atualização do conjunto de dados foi informada; nunca é estimada. | null |
node_id | string | null | Sim | Identificador do nó do fluxo (V3). | "first_aml" |
warnings | array | Não | Consulte Objeto de aviso. | [] |
{
"status": "In Review",
"total_hits": 1,
"entity_type": "person",
"hits": [
{
"id": "Q7XW3-aml-hit-1",
"caption": "Maria Garcia Lopez",
"match": true,
"target": true,
"match_score": 86.4,
"risk_score": 42.7,
"datasets": ["PEP Level 2"],
"properties": {
"name": ["María García López", "M. García"],
"alias": ["Maria Garcia"],
"birthDate": ["1990-05-12"]
},
"url": "https://example.org/registry/entities/Q7XW3",
"first_seen": "2023-11-02T00:00:00Z",
"last_seen": "2026-05-01T00:00:00Z",
"review_status": "Unreviewed"
}
],
"score": 42.7,
"screened_data": {
"full_name": "María García López",
"date_of_birth": "1990-05-12",
"nationality": "ES",
"document_number": "AB1234567"
},
"is_ongoing_monitoring_enabled": false,
"next_ongoing_monitoring_bill_date": null,
"last_ongoing_screening_at": null,
"last_ongoing_screening_datasets_updated_at": null,
"node_id": "first_aml",
"warnings": []
}
Análise de IP
Retornada para cada localização de rede capturada. Aparece comoip_analyses[] em GET /v3/session/{sessionId}/decision/ para sessões de KYC e de KYB. Origem: kyc/serializers/location.py:196-243 (IPAnalysisSerializerV3).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Consulte Enum de status. | "Approved" |
node_id | string | null | Sim | Identificador do nó do fluxo (V3). | "first_ip_analysis" |
device_brand | string | Sim | Marca do dispositivo derivada do user agent. | "Apple" |
device_model | string | Sim | Modelo do dispositivo. | "iPhone" |
browser_family | string | Sim | Família do navegador. | "Mobile Safari" |
os_family | string | Sim | Família do sistema operacional. | "iOS" |
platform | string | Sim | Plataforma de alto nível (mobile, desktop, tablet). | "mobile" |
device_fingerprint | string | Sim | Hash estável de impressão digital por dispositivo. | "f2a3…" |
ip_country | string | Sim | Nome do país resolvido a partir do IP. | "Spain" |
ip_country_code | string (ISO 3166-1 alpha-2) | Sim | Código do país resolvido a partir do IP. | "ES" |
ip_state | string | Sim | Região / estado resolvido a partir do IP. | "Comunidad de Madrid" |
ip_city | string | Sim | Cidade resolvida a partir do IP. | "Madrid" |
latitude | float | Sim | Latitude derivada do IP. | 40.4168 |
longitude | float | Sim | Longitude derivada do IP. | -3.7038 |
ip_address | string | Sim | O endereço capturado. | "203.0.113.42" |
isp | string | Sim | Nome do ISP. | "Telefonica de Espana" |
organization | string | Sim | Nome da organização (muitas vezes igual ao ISP). | "Telefonica de Espana" |
is_vpn_or_tor | boolean | Sim | true quando o IP pertence a uma VPN, a um proxy ou a um nó de saída Tor. | false |
is_data_center | boolean | Sim | true quando o IP pertence a um ASN conhecido de hospedagem ou data center. | false |
time_zone | string | Sim | Nome do fuso horário no formato IANA. | "Europe/Madrid" |
time_zone_offset | string | Sim | Deslocamento em relação ao UTC. | "+02:00" |
ip | object | Não | { location, distance_from_id_document, distance_from_poa_document }. location = { latitude, longitude }. Distâncias em km, null quando algum dos lados estiver ausente. | { "location": { "latitude": 40.4168, "longitude": -3.7038 }, "distance_from_id_document": 3.4, "distance_from_poa_document": 1.1 } |
id_document | object | Não | { location, distance_from_ip, distance_from_poa_document }. Localização do documento de identidade resolvida a partir de issuing_state e do endereço analisado. | { "location": { "latitude": 40.4165, "longitude": -3.7026 }, "distance_from_ip": 3.4, "distance_from_poa_document": 4.0 } |
poa_document | object | Não | { location, distance_from_ip, distance_from_id_document }. Endereço do comprovante de endereço (POA), geocodificado. | { "location": { "latitude": 40.4170, "longitude": -3.7040 }, "distance_from_ip": 1.1, "distance_from_id_document": 4.0 } |
matches | array de objetos | Não | Correspondências de IP e dispositivo entre sessões. Cada item: { session_id, session_number, vendor_data, verification_date, match_type, match_source, matched_value, status, is_blocklisted, api_service, source, device_info, location_info, confidence, match_mode }. match_type é ip_address ou device_fingerprint; match_source é ip_address, persistent_id, legacy_fp ou recovered_high (correspondências recuperadas também trazem recovery_similarity, tls_ja4_corroborated, recovery_gate_reason). Limitado a 5 correspondências de IP e 5 de dispositivo. | [] |
warnings | array | Não | Consulte Objeto de aviso. | [] |
browser_version, os_version | string | Sim | Versões do navegador e do sistema operacional, a partir do user agent. | "17.4" |
user_agent, accept_language | string | Sim | A string de user agent e o cabeçalho Accept-Language enviados pelo navegador. | "en-US,en;q=0.9" |
session_identifier, session_age_ms | string, integer | Sim | A sessão de navegação em que a etapa foi executada e a sua idade em milissegundos. | 48210 |
coords_accuracy | float | Sim | Raio de precisão, em metros, das coordenadas informadas pelo dispositivo. | 35.0 |
raw_device_data | object | Sim | Sinais brutos do dispositivo coletados para a etapa. | {} |
{
"status": "Approved",
"node_id": "first_ip_analysis",
"device_brand": "Apple",
"device_model": "iPhone",
"browser_family": "Mobile Safari",
"os_family": "iOS",
"platform": "mobile",
"device_fingerprint": "f2a3c1de8b994a3f9e4cdf3a02b1a7c9",
"ip_country": "Spain",
"ip_country_code": "ES",
"ip_state": "Comunidad de Madrid",
"ip_city": "Madrid",
"latitude": 40.4168,
"longitude": -3.7038,
"ip_address": "203.0.113.42",
"isp": "Telefonica de Espana",
"organization": "Telefonica de Espana",
"is_vpn_or_tor": false,
"is_data_center": false,
"time_zone": "Europe/Madrid",
"time_zone_offset": "+02:00",
"ip": {
"location": { "latitude": 40.4168, "longitude": -3.7038 },
"distance_from_id_document": 3.4,
"distance_from_poa_document": 1.1
},
"id_document": {
"location": { "latitude": 40.4165, "longitude": -3.7026 },
"distance_from_ip": 3.4,
"distance_from_poa_document": 4.0
},
"poa_document": {
"location": { "latitude": 40.4170, "longitude": -3.7040 },
"distance_from_ip": 1.1,
"distance_from_id_document": 4.0
},
"matches": [],
"warnings": []
}
Verificação de localização
Retornado para cada etapa de Verificação de localização. Aparece comogeolocation_checks[] em GET /v3/session/{sessionId}/decision/: um item por etapa, correspondente à tentativa aceita. geolocation_attempts[] lista todas as tentativas de todas as etapas, da mais antiga para a mais recente. Ambos são null em fluxos sem a etapa. Origem: GeolocationDecisionSerializer.
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
node_id | string | Sim | Nó do fluxo que produziu o resultado. | "geolocation_1" |
status | string | Não | Consulte Enum de status. | "Declined" |
outcome | string | Sim | O que aconteceu na tentativa: verified, low_accuracy, accuracy_undetermined, stale, approximate, denied, restricted, unavailable, timeout, mock_detected, outside_geofence, in_blocked_area, anonymizer_detected, skipped, replay_rejected ou unsupported_client. | "outside_geofence" |
permission | string | Sim | O que o sistema concedeu: granted_precise, granted_approximate, denied, restricted, unavailable, timeout, dismissed ou not_requested. | "granted_precise" |
latitude, longitude | float | Sim | Posição WGS84. null quando não há posição. | 48.8566 |
accuracy_m | float | Sim | Raio de incerteza em metros. | 35.0 |
accuracy_confidence | string | Sim | p95, p68 ou unspecified. | "p95" |
measured_at, age_seconds | datetime, integer | Sim | Quando o dispositivo obteve a posição e quantos segundos se passaram até a Didit recebê-la. | 2 |
source, platform, sdk_version | string | Sim | De onde veio a posição, o cliente que a produziu e a versão do SDK. | "browser" |
is_mock, produced_by_accessory | boolean | Sim | Evidências de spoofing que a plataforma informa. null significa que a plataforma não informa. | null |
integrity | string | Não | attested, not_attested, failed, unsupported (web) ou not_determined. | "unsupported" |
country_code, region_code, city | string | Sim | O local correspondente à posição. | "FR" |
geofence, inside_geofence, geofence_basis, inside_areas, blocked_areas | object, boolean, string, arrays | Sim | O resultado referente ao país e às áreas. | { "enabled": true, "result": "outside" } |
position_source, anonymizers | string, object | Sim | De onde a etapa obtém a posição e os sinais de VPN, proxy, Tor, spoofing e emulador. | "device_and_ip" |
ip_distance_km, ip_distance_uncertainty_km, ip_consistent, document_distance_km, travel_excused, consecutive_mismatches | number, boolean, integer | Sim | As comparações com a localização do IP e com o endereço cadastrado. | 12.4 |
attempts | integer | Não | O número da tentativa dentro da etapa. | 3 |
consent | object | Sim | accepted_at, version e locale do aviso de consentimento que a pessoa aceitou. | |
warnings | array de objetos de aviso | Não | Os avisos LOCATION_* da etapa. Não estão presentes em geolocation_attempts[], que acrescenta received_at e created_at. | [] |
Comprovante de endereço
Retornado para cada documento de comprovante de endereço enviado. Aparece comopoa_verifications[] em GET /v3/session/{sessionId}/decision/. Fonte: poa/serializers/poa.py:212-227 (POAV3Serializer, que estende POAV2Serializer em poa/serializers/poa.py:173-209).
| Campo | Tipo | Nulável | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Consulte Enum de status. | "Approved" |
issuing_state | string (ISO 3166-1 alpha-3) | Sim | Código do país do emissor do documento. | "ESP" |
document_type | string | Não | Tipo de alto nível de PoaDocumentTypeChoices (common/config/choices.py:868-873): UTILITY_BILL, BANK_STATEMENT, GOVERNMENT_ISSUED_DOCUMENT, OTHER_POA_DOCUMENT. Usa UNKNOWN como alternativa, nunca null. | "UTILITY_BILL" |
document_subtype | string | Não | Código de subtipo de PoaDocumentSubtypeChoices (por exemplo, ELECTRICITY_BILL, WATER_BILL, ACCOUNT_STATEMENT). Usa UNKNOWN como alternativa, nunca null. | "ELECTRICITY_BILL" |
issuer | string | Sim | Nome da entidade emissora. | "Iberdrola" |
issue_date | string (YYYY-MM-DD) | Sim | Data de emissão do documento. | "2026-04-15" |
expiration_date | string (YYYY-MM-DD) | Sim | Data de validade impressa no documento, quando houver. | null |
poa_address | string | Sim | Endereço bruto extraído por OCR. | "Calle Mayor 1, 28001 Madrid" |
poa_formatted_address | string | Sim | Endereço geocodificado e formatado. | "Calle Mayor 1, 28001 Madrid, Spain" |
poa_parsed_address | object | Sim | Endereço estruturado (street_1, street_2, city, region, postal_code, country (alpha-2), address_type, document_location, …). | { "street_1": "Calle Mayor 1", "city": "Madrid", "postal_code": "28001" } |
document_file | string (URL) | Sim | URL pré-assinada do documento enviado. | "https://<media-host>/.../poa.pdf?..." |
document_language | string | Sim | Idioma detectado do documento (ISO 639-1). | "es" |
document_metadata | object | Sim | Metadados filtrados: file_size, content_type, creation_date, modified_date, creator, producer, software, encryption, is_signed, is_tampered, signature_info, exif_original_date, exif_digitized_date, processed_by_known_editor, has_different_creation_mod_date, overlay_manipulation. | { "file_size": 184221, "content_type": "application/pdf", "is_tampered": false } |
extra_fields | object | Não | Campos de conta bancária (bank_account_number, bank_iban, bank_sort_code, bank_routing_number, bank_swift_bic, bank_branch_name, bank_branch_address), document_phone_number, additional_names, além de quaisquer chaves personalizadas salvas no registro. | { "bank_iban": null, "additional_names": [] } |
name_on_document | string | Sim | Nome conforme aparece no comprovante de endereço. | "María García López" |
expected_details_address | string | Sim | Endereço que o cliente digitou no cadastro, textualmente. | "Calle Mayor 1, Madrid" |
expected_details_formatted_address | string | Sim | Endereço esperado geocodificado. | "Calle Mayor 1, 28001 Madrid, Spain" |
expected_details_parsed_address | object | Sim | Endereço esperado estruturado. | { "city": "Madrid", "postal_code": "28001" } |
name_match_score_expected_details | float (0-100) | Sim | Correspondência aproximada entre name_on_document e o nome informado na criação da sessão. | 94.0 |
name_match_score_id_verification | float (0-100) | Sim | Correspondência aproximada entre name_on_document e o full_name do documento de identidade verificado. | 100.0 |
extra_files | array de strings (URL) | Não | URLs pré-assinadas de arquivos adicionais enviados. | [] |
detected_codes | array de objetos | Não | Códigos QR e códigos de barras detectados em todas as páginas processadas do documento: type, page_number (baseado em 1), position (polígono), x/y/width/height (caixa delimitadora), page_width/page_height, raw_payload (base64), parsed_payload (valor decodificado, null quando um código foi localizado mas não pôde ser decodificado). Array vazio quando a detecção não encontra nada. | [{ "type": "QR_CODE", "page_number": 1, "parsed_payload": "https://issuer.example/inv/9981" }] |
node_id | string | null | Sim | Identificador do nó do fluxo (V3). | "first_poa" |
warnings | array | Não | Consulte o Objeto de aviso. | [] |
{
"status": "Approved",
"issuing_state": "ESP",
"document_type": "UTILITY_BILL",
"document_subtype": "ELECTRICITY_BILL",
"issuer": "Iberdrola",
"issue_date": "2026-04-15",
"expiration_date": null,
"poa_address": "Calle Mayor 1, 28001 Madrid",
"poa_formatted_address": "Calle Mayor 1, 28001 Madrid, Spain",
"poa_parsed_address": { "street_1": "Calle Mayor 1", "city": "Madrid", "postal_code": "28001", "country": "ES" },
"document_file": "https://<media-host>/.../poa.pdf?signature=...",
"document_language": "es",
"document_metadata": {
"file_size": 184221,
"content_type": "application/pdf",
"creation_date": "2026-04-15T08:11:32Z",
"modified_date": "2026-04-15T08:11:32Z",
"creator": "Iberdrola Billing",
"producer": "Adobe PDF Library 15.0",
"software": null,
"encryption": null,
"is_signed": true,
"is_tampered": false,
"signature_info": { "signer_name": "Iberdrola Clientes", "date": "2026-04-15T08:11:32Z" },
"exif_original_date": null,
"exif_digitized_date": null,
"processed_by_known_editor": false,
"has_different_creation_mod_date": false,
"overlay_manipulation": null
},
"extra_fields": {
"bank_account_number": null,
"bank_iban": null,
"bank_sort_code": null,
"bank_routing_number": null,
"bank_swift_bic": null,
"bank_branch_name": null,
"bank_branch_address": null,
"document_phone_number": null,
"additional_names": []
},
"name_on_document": "María García López",
"expected_details_address": "Calle Mayor 1, Madrid",
"expected_details_formatted_address": "Calle Mayor 1, 28001 Madrid, Spain",
"expected_details_parsed_address": { "city": "Madrid", "postal_code": "28001", "country": "ES" },
"name_match_score_expected_details": 94.0,
"name_match_score_id_verification": 100.0,
"extra_files": [],
"detected_codes": [
{
"type": "QR_CODE",
"page_number": 1,
"position": [[820, 1120], [1002, 1120], [1002, 1302], [820, 1302]],
"x": 820,
"y": 1120,
"width": 182,
"height": 182,
"page_width": 1190,
"page_height": 1684,
"raw_payload": "aHR0cHM6Ly9pYmVyZHJvbGEuZXMvZmFjdHVyYS85OTgx",
"parsed_payload": "https://iberdrola.es/factura/9981"
},
{
"type": "CODE_128",
"page_number": 1,
"position": [[112, 1480], [560, 1480], [560, 1540], [112, 1540]],
"x": 112,
"y": 1480,
"width": 448,
"height": 60,
"page_width": 1190,
"page_height": 1684,
"raw_payload": "MDA5OTgxMDAwNDI=",
"parsed_payload": "0099810042"
}
],
"node_id": "first_poa",
"warnings": []
}
Verificação de telefone
Retornado para cada tentativa de verificação de telefone. Aparece comophone_verifications[] em GET /v3/session/{sessionId}/decision/ tanto para sessões KYC quanto KYB. Fonte: phone/serializers/phone.py:251-266 (PhoneV3Serializer, estende PhoneV2Serializer em phone/serializers/phone.py:103-248).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Consulte o Enum de status. | "Approved" |
phone_number_prefix | string | Não | Prefixo de país E.164 (com +). | "+34" |
phone_number | string | Não | Número do assinante sem o prefixo. | "612345678" |
full_number | string | Não | O número E.164 completo (phone_number_prefix + phone_number). | "+34612345678" |
country_code | string (ISO 3166-1 alpha-2) | Sim | País do número. | "ES" |
country_name | string | Sim | Nome do país no idioma local. | "Spain" |
carrier | objeto | Não | { name, type }, em que type é um valor de LineTypeChoices (common/config/choices.py:648-667): mobile, fixed_line, voip, isp, vpn, toll_free, premium_rate, satellite, pager, payphone, voice_mail, unknown e outras classes de linha. | { "name": "Movistar", "type": "mobile" } |
is_disposable | boolean | Não | true quando a operadora marca o número como temporário ou descartável. | false |
is_virtual | boolean | Não | true quando carrier.type é um dos valores voip, isp ou vpn. | false |
verification_method | string | Não | Canal usado para enviar o OTP (whatsapp, sms, …). Lê o actual_channel da última tentativa de envio (recorre ao channel solicitado e, depois, a sms). | "whatsapp" |
verification_attempts | inteiro | Não | Total de tentativas de envio do OTP (envio inicial mais reenvios). | 1 |
verified_at | string (ISO 8601) | Sim | Data e hora em que o OTP foi inserido com sucesso. | "2026-05-17T10:14:02Z" |
lifecycle | array de objetos | Não | Eventos em ordem cronológica: tentativas de envio, callbacks de entrega, verificações de código e o evento de status final. Cada evento é { type, timestamp, details, fee }. Os tipos de evento vêm de PhoneEventChoices. | […] |
matches | array de objetos | Não | Correspondências de número de telefone entre sessões. Cada item: { session_id, session_number, vendor_data, verification_date, phone_number, status, is_blocklisted, api_service, source }. source é session ou list_entry. | [] |
node_id | string | null | Sim | Identificador do nó do fluxo (V3). | "first_phone" |
warnings | array | Não | Consulte o Objeto de aviso. | [] |
phone_intelligence | objeto | Sim | Sinais de inteligência do telefone. Presente apenas quando o complemento de inteligência foi executado para o número. | |
phone_social | objeto | Sim | Presença do número nas redes sociais. Presente apenas quando o complemento de presença social foi executado. |
{
"status": "Approved",
"phone_number_prefix": "+34",
"phone_number": "612345678",
"full_number": "+34612345678",
"country_code": "ES",
"country_name": "Spain",
"carrier": { "name": "Movistar", "type": "mobile" },
"is_disposable": false,
"is_virtual": false,
"verification_method": "whatsapp",
"verification_attempts": 1,
"verified_at": "2026-05-17T10:14:02Z",
"lifecycle": [
{
"type": "PHONE_VERIFICATION_MESSAGE_SENT",
"timestamp": "2026-05-17T10:13:51Z",
"details": { "status": "Success", "reason": null, "channel": "whatsapp", "actual_channel": "whatsapp" },
"fee": 0.02
},
{
"type": "PHONE_DELIVERY_DELIVERED",
"timestamp": "2026-05-17T10:13:52Z",
"details": { "channel": "whatsapp", "status": "delivered" },
"fee": 0
},
{
"type": "VALID_CODE_ENTERED",
"timestamp": "2026-05-17T10:14:02Z",
"details": { "code_tried": "482917", "status": "Approved" },
"fee": 0
},
{
"type": "PHONE_VERIFICATION_APPROVED",
"timestamp": "2026-05-17T10:14:02Z",
"details": null,
"fee": 0
}
],
"matches": [],
"node_id": "first_phone",
"warnings": []
}
Verificação de e-mail
Retornado para cada tentativa de verificação de e-mail. Aparece comoemail_verifications[] em GET /v3/session/{sessionId}/decision/ tanto para sessões KYC quanto KYB. Fonte: email_verification/serializers/email.py:149-164 (EmailV3Serializer, estende EmailV2Serializer em email_verification/serializers/email.py:38-146).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Consulte o Enum de status. | "Approved" |
email | string | Não | O endereço de e-mail fornecido. | "maria.garcia@example.com" |
is_breached | boolean | Não | true quando o e-mail aparece em um vazamento de dados conhecido. | false |
breaches | array de objetos | Não | Detalhes por vazamento quando is_breached é true: { name, domain, logo_path, breach_date, description, is_verified, data_classes, breach_emails_count }. | [] |
is_disposable | boolean | Não | true quando o e-mail pertence a um provedor de e-mail descartável. | false |
is_undeliverable | boolean | Não | true quando a verificação de entrega SMTP indica que a caixa de entrada não aceita e-mails. | false |
verification_attempts | inteiro | Não | Total de tentativas de verificação do OTP. | 1 |
verified_at | string (ISO 8601) | Sim | Data e hora em que o OTP foi inserido com sucesso. | "2026-05-17T10:15:22Z" |
lifecycle | array de objetos | Não | Eventos em ordem cronológica: tentativas de envio, verificações de código e o evento de status final. Cada evento é { type, timestamp, details, fee }. Os tipos de evento vêm de EmailEventChoices. | […] |
matches | array de objetos | Não | Correspondências de e-mail entre sessões. Cada item: { session_id, session_number, vendor_data, verification_date, email, status, is_blocklisted, api_service, source }. source é session ou list_entry. | [] |
node_id | string | null | Sim | Identificador do nó do fluxo (V3). | "first_email" |
warnings | array | Não | Consulte o Objeto de aviso. | [] |
email_intelligence | objeto | Sim | Sinais de inteligência do e-mail. Presente apenas quando o complemento de inteligência foi executado para o endereço. | |
email_social | objeto | Sim | Presença do endereço nas redes sociais. Presente apenas quando o complemento de presença social foi executado. |
{
"status": "Approved",
"email": "maria.garcia@example.com",
"is_breached": false,
"breaches": [],
"is_disposable": false,
"is_undeliverable": false,
"verification_attempts": 1,
"verified_at": "2026-05-17T10:15:22Z",
"lifecycle": [
{
"type": "EMAIL_VERIFICATION_MESSAGE_SENT",
"timestamp": "2026-05-17T10:15:11Z",
"details": { "status": "Success", "reason": null },
"fee": 0.02
},
{
"type": "VALID_CODE_ENTERED",
"timestamp": "2026-05-17T10:15:22Z",
"details": { "code_tried": "739204", "status": "Approved" },
"fee": 0
},
{
"type": "EMAIL_VERIFICATION_APPROVED",
"timestamp": "2026-05-17T10:15:22Z",
"details": null,
"fee": 0
}
],
"matches": [],
"node_id": "first_email",
"warnings": []
}
Validação de banco de dados
Retornado por consulta a banco de dados executada sobre os dados enviados pelo usuário. Aparece comodatabase_validations[] em GET /v3/session/{sessionId}/decision/. Fonte: database_validation/serializers/database_validation.py:21-142 (DatabaseValidationV3Serializer, estende DatabaseValidationV2Serializer).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
issuing_state | string (ISO 3166-1 alpha-3) | Sim | País cujo registro foi consultado. | "ESP" |
validation_type | string (enum) | Não | Como o resultado foi corroborado: one_by_one (resultado de um único serviço), two_by_two (dois ou mais serviços distintos corresponderam totalmente ao número de identificação, de forma independente) ou not_enabled (o validador foi ignorado ou nenhum provedor respondeu; um no_match definitivo ainda retorna one_by_one). Nunca null. Fonte: DatabaseValidationChoices (common/config/choices.py:1097-1100). | "one_by_one" |
screened_data | objeto | Não | Os dados enviados ao registro. Os campos de arquivo (selfie, cnh_qr_code_image, document_image) são pré-assinados no momento da leitura. | { "document_number": "99999999R", "date_of_birth": "1990-05-12" } |
validations | array de objetos | Não | Uma entrada para cada serviço do catálogo que produziu uma correspondência. Cada entrada pode incluir service_id, service_name, validation (objeto com o veredito do provedor), outcome_code, outcome_detail e source_data (perfil do cidadão higienizado: full_name, gender, date_of_birth, photo (URL pré-assinada), signature (URL pré-assinada), …). | […] |
errors | array de objetos | Sim | Erros por serviço quando uma consulta falhou; a chave é omitida por completo quando vazia. Cada entrada é o objeto de erro do serviço de origem somado ao service_id que o produziu. | [] |
match_type | string (enum) | Sim | Veredito agregado de correspondência entre os serviços consultados: full_match, partial_match ou no_match (DatabaseValidationMatchTypeChoices, common/config/choices.py:1103-1106). null até ser avaliado. | "full_match" |
status | string | Não | Consulte o Enum de status. | "Approved" |
node_id | string | null | Sim | Identificador do nó do fluxo de verificação (V3). | "first_db_validation" |
warnings | array | Não | Consulte o objeto de aviso. | [] |
{
"issuing_state": "ESP",
"validation_type": "one_by_one",
"screened_data": {
"document_number": "99999999R",
"date_of_birth": "1990-05-12",
"first_name": "María",
"last_name": "García López"
},
"validations": [
{
"service_id": "esp_dni",
"service_name": "Spain - DNI/NIE verification",
"validation": { "is_valid": true, "match_score": 100 },
"outcome_code": "MATCH",
"outcome_detail": "All identifiers match the registry record.",
"source_data": {
"full_name": "María García López",
"gender": "F",
"date_of_birth": "1990-05-12",
"photo": "https://<media-host>/.../registry_photo.jpg?signature=...",
"signature": null
}
}
],
"match_type": "full_match",
"status": "Approved",
"node_id": "first_db_validation",
"warnings": []
}
Resposta do questionário
Retornada para cada envio de questionário. Aparece comoquestionnaire_responses[] em GET /v3/session/{sessionId}/decision/ tanto para sessões de KYC quanto de KYB. Fonte: questionnaires/serializers/questionnaire.py:591-597 (QuestionnaireResponseV3Serializer, que estende QuestionnaireResponseSerializer em questionnaires/serializers/questionnaire.py:520-588).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
questionnaire_id | string (UUID) | Não | Identificador da versão do questionário que foi respondida. | "6a0f1c2c-…" |
title | string | Não | Nome do questionário, conforme definido no Console. | "Customer risk profile" |
description | string | Sim | Descrição do questionário. | "Short risk-profile questions." |
languages | array de strings | Não | Códigos de idioma nos quais o questionário é publicado. | ["en", "es"] |
default_language | string | Não | Código de idioma de fallback. | "en" |
is_active | booleano | Não | Indica se esta versão do questionário é a ativa. | true |
is_simple_questionnaire | booleano | Não | true quando o questionário não tem ramificações (lista linear). | true |
questionnaire_group_id | string (UUID) | Não | Identificador compartilhado entre as versões do mesmo questionário. | "a7c2c2c2-…" |
version | inteiro | Não | Número da versão do modelo ativo. | 3 |
status | string | Não | Um de Approved, In Review ou Not Finished (uma recusa em nível de questionário é mapeada para In Review). | "Approved" |
published_at | string (ISO 8601) | Sim | Quando o modelo foi publicado. | "2026-01-12T11:00:00Z" |
sections | array de objetos | Não | Seções ordenadas após a aplicação da travessia do grafo e do filtro de visibilidade. Cada seção é { title, description, items[] } (título e descrição vêm do SECTION_HEADER de abertura, já traduzidos). Cada item é um elemento de formulário (uuid, value (id do nó), element_type, is_required, title, description, placeholder, choices, max_files, required_if, repeatable_config, além de um campo answer, que é null quando não respondido e omitido em itens de layout HEADING/PARAGRAPH/SEPARATOR). Respostas de arquivo contêm { files: [<presigned URL>, …] }. | […] |
node_id | string | null | Sim | Identificador do nó do fluxo de verificação (V3). | "first_questionnaire" |
{
"questionnaire_id": "6a0f1c2c-3b7d-4d2c-9eb6-fdc6c7c92ef9",
"title": "Customer risk profile",
"description": "Short risk-profile questions.",
"languages": ["en", "es"],
"default_language": "en",
"is_active": true,
"is_simple_questionnaire": true,
"questionnaire_group_id": "a7c2c2c2-1111-4d2c-9eb6-fdc6c7c92ef9",
"version": 3,
"status": "Approved",
"published_at": "2026-01-12T11:00:00Z",
"sections": [
{
"title": "Source of funds",
"description": null,
"items": [
{
"uuid": "4f1d5e2c-aaaa-4d2c-9eb6-fdc6c7c92ef9",
"value": "q_source_of_funds",
"element_type": "SINGLE_CHOICE",
"is_required": true,
"title": "What is your main source of funds?",
"description": null,
"placeholder": null,
"choices": [
{ "label": "Salary", "value": "salary" },
{ "label": "Business income", "value": "business" },
{ "label": "Investments", "value": "investments" }
],
"max_files": 1,
"required_if": null,
"repeatable_config": null,
"answer": { "value": "salary" }
}
]
}
],
"node_id": "first_questionnaire"
}
Assinatura eletrônica
Retornada para cada signatário de uma etapa de Assinatura eletrônica. Aparece comosignatures[] em GET /v3/session/{sessionId}/decision/ tanto para sessões de KYC quanto de KYB, somente quando o fluxo de verificação tem a etapa. Diferentemente dos outros objetos de relatório, seu status indica a fase da assinatura e o resultado está em verdict, e os itens de warnings[] são { code, node_id } em vez de objetos de aviso.
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
id | string (UUID) | Não | A assinatura do signatário. Use-o como signature_id nas rotas de evidências e de validação. | "0e6c2a8e-…" |
node_id | string | Não | Identificador do nó do fluxo de verificação. | "feature_signature" |
status | string | Não | Fase da assinatura: intro, review, code, signing, signed ou declined. Somente signed significa que os documentos estão assinados. | "signed" |
verdict | string | Não | Not Finished, Approved, In Review ou Declined. | "Approved" |
level | string | Não | simple (padrão), aes ou qes (qualificada, um complemento). | "aes" |
format | string | Não | pdf para uma assinatura simples, pades para assinatura avançada (AES) e qualificada (QES). | "pades" |
profile | string | Sim | PAdES-B-LT assim que uma assinatura avançada (AES) ou qualificada (QES) for assinada; caso contrário, null. | "PAdES-B-LT" |
signer | objeto | Não | { name, capacity, company, role, roles, identity_session_id }. capacity é self (KYC) ou company (KYB). | { "name": "Jane Doe", "capacity": "self", … } |
identity_used | objeto | Não | { session_id, kyc_id, verified, expected_name }: a identidade verificada na qual a assinatura se baseia. Vazio para uma assinatura simples sem identidade verificada. | { "verified": true, … } |
certificate | objeto | Sim | { issuer, issued_to, serial, valid_from, valid_until }. null até a assinatura ser concluída e sempre null para uma assinatura simples. | { "serial": "5A3F9C21", … } |
confirmation | objeto | Não | { channel, destination, confirmed_at, attempts }. destination é mascarado; attempts conta os códigos digitados, incluindo o correto. Uma assinatura Simple não tem código, então channel e destination são null. | { "channel": "email", … } |
timestamp | objeto | Sim | { time, qualified, valid }. qualified é sempre false para AES, em que a Didit emite o timestamp; para QES, o prestador qualificado de serviços de confiança o emite. null até a assinatura, e sempre null para uma assinatura Simple. | { "qualified": false, … } |
documents | array de objetos | Não | { id, uuid, title, language, source_revision, translation_id, file_name, pages, size_bytes, sha256_original, sha256_signed, status, opened_at, read_at, read_to_end, consented_at, consent, signed_file, mode, source_format, conversion, fields }. status é signed, declined, not_signed ou not_reached. mode é fields ou read_and_agree. source_format é pdf ou docx; conversion descreve o arquivo Word original, ou é null para um PDF. | […] |
documents[].language | string | Sim | Idioma da versão selecionada quando a tentativa começou, ou null se não estiver definido. Se houver uma tradução completa correspondente, ela é usada; caso contrário, o original. Após a assinatura, este é o idioma efetivamente assinado. | "en" |
documents[].source_revision | string (UUID) | Não | Revisão da fonte copiada para a tentativa, inclusive quando uma tradução é selecionada. Diferente do id do documento do signatário. | "22222222-2222-4222-8222-222222222222" |
documents[].translation_id | string (UUID) | Sim | Tradução selecionada, ou null para o original. A cópia do documento e a seleção de idioma permanecem fixas depois que a tentativa começa. | null |
documents[].fields | array de objetos | Não | { key, type, role, label, page, x, y, width, height, required, value, display_value, value_source, filled_at, image_url, value_unavailable_reason } para cada campo do documento. value é uma string, um booleano para caixa de seleção, ou true para uma assinatura ou rubrica aplicada. Vazio para um documento sem campos. | […] |
adopted_signature | objeto | Sim | { method, font, adopted_at }: a assinatura e a rubrica que o signatário adotou. method é typed ou drawn; font é o estilo de letra manuscrita de uma assinatura digitada. null até ser adotada. | { "method": "drawn", … } |
electronic_signature_consent_at | string (ISO 8601) | Sim | Quando o signatário concordou em assinar os documentos eletronicamente. Definido quando algum documento tem campos. | "2026-11-03T10:41:40Z" |
evidence_file | string | Sim | Caminho do PDF de evidências, após a assinatura. | "/v3/session/…/evidence/?signature_id=…" |
warnings | array de objetos | Não | { code, node_id }, com code sendo um de SIGNATURE_DECLINED, SIGNATURE_OTP_FAILED, SIGNATURE_NAME_MISMATCH, SIGNATURE_IDENTITY_NOT_VERIFIED, SIGNATURE_DOCUMENT_CHANGED. | [] |
validation | objeto | Sim | { valid, checked_at, documents[] }: a última verificação criptográfica dos documentos assinados. null até a assinatura. { valid: null, reason: "signature_provider_outcome_unknown", checked_at } quando o resultado da assinatura não pôde ser confirmado. | { "valid": true, … } |
declined_at | string (ISO 8601) | Sim | Quando o signatário recusou. | null |
declined_action | string | Não | A signature_declined_action da etapa. | "REVIEW" |
signed_at | string (ISO 8601) | Sim | Quando os documentos foram assinados. | "2026-11-03T10:42:24Z" |
expires_at | string (ISO 8601) | Não | Quando o link de assinatura deixa de funcionar. | "2026-11-10T10:30:00Z" |
email_sent_at | string (ISO 8601) | Sim | Quando o signatário recebeu por e-mail uma cópia assinada. | "2026-11-03T10:42:30Z" |
email_unavailable_reason | string | Sim | Motivo pelo qual nenhuma cópia foi enviada por e-mail, quando uma foi solicitada. | null |
ip_address | string | Sim | O endereço IP do signatário quando ele solicitou o código. | "203.0.113.10" |
place | string | Sim | Não coletado: sempre null. | null |
place_unavailable_reason | string | Sim | not_collected. | "not_collected" |
Estimativa de idade
Retornado pela API de estimativa de idade independente (POST /v3/age-estimation/). A resposta traz um subconjunto da estrutura de Liveness check sob um envelope age_estimation: status, method, score, age_estimation e warnings, mais um bloco user_image de detecção facial exclusivo do modo independente. Ela não inclui reference_image, video_url, matches, face_quality ou face_luminance. Em sessões com fluxo de verificação (workflow) não há um array separado: a idade estimada aparece como liveness_checks[].age_estimation em GET /v3/session/{sessionId}/decision/. Fonte: apis/serializers/age_estimation.py:50-55 (AgeEstimationResponseSerializer), envelope montado em apis/views/age_estimation.py:138-174.
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
request_id | string (UUID) | Não | ID da sessão persistida quando save_api_request=true (o padrão); caso contrário, um UUID de correlação temporário. | "3b1f1e2c-…" |
age_estimation | objeto | Não | Envelope do resultado: status (Approved / Declined), method (sempre PASSIVE), score (prova de vida de 0 a 100, anulável), age_estimation (idade prevista em anos do maior rosto, anulável), user_image (entities[] com, por rosto, age, bbox [x_min, y_min, x_max, y_max], confidence e gender; além de best_angle), warnings[]. | { … } |
vendor_data | string | Sim | vendor_data devolvido da requisição. | null |
metadata | objeto | Sim | metadata devolvido da requisição. | null |
created_at | string (ISO 8601) | Não | Carimbo de data e hora da requisição no servidor. | "2026-05-17T10:22:13.512941+00:00" |
{
"request_id": "3b1f1e2c-7777-4d2c-9eb6-fdc6c7c92ef9",
"age_estimation": {
"status": "Approved",
"method": "PASSIVE",
"score": 94.10,
"age_estimation": 28.7,
"user_image": {
"entities": [
{ "age": 28.7, "bbox": [40, 40, 100, 100], "confidence": 0.72, "gender": "male" }
],
"best_angle": 0
},
"warnings": []
},
"vendor_data": null,
"metadata": null,
"created_at": "2026-05-17T10:22:13.512941+00:00"
}
Autenticação biométrica
A autenticação biométrica executa o mesmo pipeline de Prova de vida + Correspondência facial usado no KYC padrão, mas configurado para comparar o rosto capturado com a imagem de referência de um usuário existente, em vez de um retrato de documento recém-extraído por OCR. Não há serializador dedicado:GET /v3/session/{sessionId}/decision/ retorna os objetos padrão de verificação de prova de vida e correspondência facial em liveness_checks[] e face_matches[]. O fluxo da sessão é configurado com workflow_type = "biometric_authentication" (WorkflowTypeChoices, common/config/choices.py:636).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
liveness_checks | array de Verificação de prova de vida | Não | Resultado da prova de vida para a tentativa de autenticação. | [ { "status": "Approved", … } ] |
face_matches | array de Correspondência facial | Não | Resultado da correspondência com a referência cadastrada. source_image_session_id é definido como o session_id da própria sessão. A face de referência (o portrait_image enviado ou a face armazenada reutilizada por meio de vendor_data quando portrait_image é omitido) é registrada na própria sessão de autenticação (face/views/face.py:656-659). | [ { "status": "Approved", "source_image_session_id": "…", … } ] |
status | string | Não | Status de nível superior da sessão (consulte o Enum de status). | "Approved" |
{
"session_id": "9b1f1e2c-8888-4d2c-9eb6-fdc6c7c92ef9",
"status": "Approved",
"liveness_checks": [
{
"status": "Approved",
"method": "PASSIVE",
"score": 95.10,
"reference_image": "https://<media-host>/.../reference.jpg?signature=...",
"video_url": null,
"age_estimation": null,
"matches": [],
"face_quality": 91.20,
"face_luminance": 53.10,
"node_id": "biometric_auth_liveness",
"warnings": []
}
],
"face_matches": [
{
"status": "Approved",
"score": 98.42,
"source_image_session_id": "9b1f1e2c-8888-4d2c-9eb6-fdc6c7c92ef9",
"source_image": "https://<media-host>/.../source.jpg?signature=...",
"target_image": "https://<media-host>/.../target.jpg?signature=...",
"node_id": "biometric_auth_face_match",
"warnings": []
}
]
}
Registro KYB
Retornado para cada empresa confirmada pelo registro em um fluxo KYB. Aparece comoregistry_checks[] em GET /v3/session/{sessionId}/decision/ para sessões de empresas. Origem: kyb/serializers/kyb.py:939-964 (RegistryCheckV3Serializer).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Consulte o Enum de status. | "Approved" |
node_id | string | null | Sim | Identificador do nó do fluxo (V3). | "first_registry" |
data_resolved | boolean | Não | true quando a consulta ao registro foi concluída (ou quando is_from_registry é false, o que significa que os dados foram inseridos manualmente). | true |
company | object | Não | Payload completo da empresa. Consulte o Objeto de empresa abaixo. | { … } |
ownership_structure | object | Sim | A tabela de capitalização confirmada pelo registro: shareholders[] e beneficial_owners[], com cada proprietário, sua identidade no registro, sua participação e o shareholding canônico. | { "shareholders": [...], "beneficial_owners": [] } |
warnings | array | Não | Consulte o Objeto de aviso. | [] |
Objeto de empresa
Origem:kyb/serializers/kyb.py:220-321 (KYBCompanyResponseSerializer).
| Campo | Tipo | Anulável | Descrição |
|---|---|---|---|
uuid | string (UUID) | Não | Identificador interno da empresa. |
node_id | string | null | Sim | Identificador do nó do fluxo. |
status | string | Não | Status do recurso (FeatureStatusChoices). |
registry_status | string | Sim | Status da empresa no registro (active, dissolved, …). |
data_resolved | boolean | Não | Mesma definição do objeto pai. |
company_name | string | Sim | Nome da empresa registrado. |
registration_number | string | Sim | Identificador no registro. |
country_code | string (ISO 3166-1 alpha-2) | Sim | País de constituição. |
region | string | Sim | Subdivisão ISO 3166-2, quando aplicável (por exemplo, US-CA). |
company_type | string | Sim | Forma jurídica (LLC, SL, …). |
incorporation_date | string (YYYY-MM-DD) | Sim | Data de constituição. |
registered_address | string | Sim | Endereço jurídico registrado. |
tax_number | string | Sim | Identificador fiscal / VAT. |
risk_level | string | Sim | Classificação de risco fornecida pelo provedor. |
verification_status | string | Sim | Enum interno de status de verificação. |
is_from_registry | boolean | Não | true quando os dados vêm do registro (em oposição à inserção manual). |
fetch_status | string | Sim | pending, resolved, failed. |
alternative_names | string | Sim | Nomes fantasia alternativos, separados por vírgula. |
nature_of_business | string | Sim | Descrição livre da atividade empresarial. |
registered_capital | string | Sim | Capital social registrado, como string legível para humanos. |
registered_capital_amount | string (decimal) | Sim | Valor analisado do capital social registrado. |
registered_capital_currency | string (ISO 4217) | Sim | Código da moeda. |
website | string (URL) | Sim | Site da empresa. |
email | string | Sim | E-mail de contato público. |
phone | string | Sim | Telefone de contato público. |
legal_entity_identifier | string | Sim | LEI, quando disponível. |
location_of_registration | string | Sim | Escritório ou região do registro. |
vat_number | string | Sim | Número de VAT informado para a empresa. |
vat_validation_status | string | Não | Resultado da validação do número de VAT ou, na ausência dele, do tax_number: valid, invalid, format_valid, invalid_format, could_not_validate ou not_applicable. Consulte a Validação de VAT e identificação fiscal. |
vat_validated_number | string | Sim | O número verificado, como a fonte o conhece. |
vat_validation_source | string | Sim | Fonte que definiu o status: eu_vies, pl_vat_white_list, no_brreg, ch_uid_register, br_receita_federal, co_rues, cr_hacienda, ec_sri, py_dnit ou format_rules. |
vat_validated_name | string | Sim | Nome registrado na fonte (vazio quando ela não divulga um nome). |
vat_validated_address | string | Sim | Endereço registrado na fonte (vazio quando não divulgado). |
vat_checked_at | string (ISO 8601) | Sim | Data e hora da verificação; null quando nenhuma verificação foi executada. |
financial_summary | object | Sim | Resumo dos principais indicadores financeiros mais recentes, quando fornecido pelo registro. |
officers | array de objetos | Não | Lista de dirigentes segura para B2C: { uuid, name, designation, role, nationality, is_active, kyc_status, kyc_session_url }. |
beneficial_owners | array de objetos | Não | Lista de UBOs segura para B2C: { uuid, name, first_name, last_name, entity_type, roles, ownership_min_shares, ownership_max_shares, is_active, kyc_status, kyc_session_url, effective_ownership_percent }. |
addresses | array de objetos | Sim | Detalhes de cada endereço obtidos do registro. |
industries | array de objetos | Sim | Classificações no estilo SIC/NAICS. |
accounts | array de objetos | Sim | Metadados das contas apresentadas. |
registry_data | object | Sim | Detalhamento normalizado do registro pela Didit (resultado de propriedade, correções feitas no console, dados do registro que não têm campo próprio). Não é um contrato estável. |
user_provided_data | object | Sim | Instantâneo dos campos editados pelo usuário. |
confirmed_by_user_at | string (ISO 8601) | Sim | Data e hora em que o usuário confirmou os dados extraídos. |
last_console_edit_at | string (ISO 8601) | Sim | Data e hora da última edição no console. |
is_editable | boolean | Não | true enquanto os dados originados do registro ainda puderem ser editados pelo usuário final. |
{
"status": "Approved",
"node_id": "first_registry",
"data_resolved": true,
"company": {
"uuid": "b1f1e2c2-9999-4d2c-9eb6-fdc6c7c92ef9",
"node_id": "first_registry",
"status": "Approved",
"registry_status": "active",
"data_resolved": true,
"company_name": "Sante Clinics SL",
"registration_number": "B12345678",
"country_code": "ES",
"region": null,
"company_type": "SL",
"incorporation_date": "2018-03-22",
"registered_address": "Calle Mayor 1, 28001 Madrid, Spain",
"tax_number": "B12345678",
"risk_level": "low",
"verification_status": "verified",
"is_from_registry": true,
"fetch_status": "resolved",
"alternative_names": "Sante Clinics",
"nature_of_business": "Medical clinic operations",
"registered_capital": "EUR 50,000",
"registered_capital_amount": "50000.00",
"registered_capital_currency": "EUR",
"website": "https://santeclinics.com",
"email": "info@santeclinics.com",
"phone": "+34911223344",
"legal_entity_identifier": null,
"location_of_registration": "Registro Mercantil de Madrid",
"vat_number": "ESB12345678",
"vat_validation_status": "valid",
"vat_validated_name": "SANTE CLINICS SL",
"vat_validated_address": "CALLE MAYOR 1, 28001 MADRID",
"vat_checked_at": "2026-05-17T10:11:05Z",
"financial_summary": null,
"officers": [
{
"uuid": "c1f1e2c2-aaaa-4d2c-9eb6-fdc6c7c92ef9",
"name": "María García López",
"designation": "Administrador único",
"role": "Director",
"nationality": "ESP",
"is_active": true,
"kyc_status": "Approved",
"kyc_session_url": "https://verify.didit.me/s/…"
}
],
"beneficial_owners": [
{
"uuid": "d1f1e2c2-bbbb-4d2c-9eb6-fdc6c7c92ef9",
"name": "María García López",
"first_name": "María",
"last_name": "García López",
"entity_type": "person",
"roles": ["UBO"],
"ownership_min_shares": "75.00",
"ownership_max_shares": "75.00",
"is_active": true,
"kyc_status": "Approved",
"kyc_session_url": "https://verify.didit.me/s/…",
"effective_ownership_percent": 75.0
}
],
"addresses": [],
"industries": [],
"accounts": [],
"registry_data": {},
"user_provided_data": {},
"confirmed_by_user_at": "2026-05-17T10:11:02Z",
"last_console_edit_at": null,
"is_editable": false
},
"ownership_structure": null,
"warnings": []
}
Documento KYB
Retornado por nó que coleta documentos de apoio KYB. Aparece comodocument_verifications[] em GET /v3/session/{sessionId}/decision/ para sessões de empresas: uma entrada por node_id, com items[] listando cada documento enviado. Fonte: kyb/serializers/kyb.py:1053-1068 (DocumentVerificationV3Serializer); cada item segue kyb/serializers/kyb.py:811-851 (KYBDocumentResponseSerializer).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Status agregado dos documentos deste nó: Approved somente quando todos os documentos do pipeline forem aprovados; Declined se algum for recusado; In Review nos demais casos; Not Finished enquanto estiver pendente. Veja o enum de status. | "Approved" |
node_id | string | null | Sim | Identificador do nó do fluxo (V3). | "first_kyb_documents" |
items | lista de objetos de item de documento KYB | Não | Uma entrada por documento enviado ou solicitado. | […] |
groups | object | Não | Contagens por grupo de documentos: { <group_name>: { total, approved, pending, declined, in_review, other, missing } }. | { "incorporation_certificate": { "total": 1, "approved": 1, "pending": 0, "declined": 0, "in_review": 0, "other": 0, "missing": 0 } } |
required_groups | lista de strings | Não | Grupos de documentos exigidos pela configuração do fluxo. | ["incorporation_certificate", "shareholder_register"] |
warnings | array | Não | Veja Objeto de aviso. | [] |
Objeto de item de documento KYB
| Campo | Tipo | Anulável | Descrição |
|---|---|---|---|
uuid | string (UUID) | Não | Identificador interno do documento. |
document_type | string | Sim | Grupo de alto nível (incorporation_certificate, shareholder_register, …). |
document_subtype | string | Sim | Subtipo específico do provedor. |
document_group | string | Sim | Espelho de document_type (alias mantido por clareza). |
file_url | string (URL) | Sim | URL pré-assinada para o arquivo tratado. |
original_filename | string | Sim | Nome do arquivo como foi enviado. |
file_size | integer | Sim | Tamanho do arquivo em bytes. |
status | string | Não | Status por documento (FeatureStatusChoices). |
created_at | string (ISO 8601) | Não | Data e hora do envio. |
cross_check_result | object | Sim | Veredito da validação cruzada com o registro ou com outros documentos. |
document_metadata | object | Sim | Mesmo formato de metadados filtrados do document_metadata do comprovante de endereço. |
description | string | Sim | Descrição fornecida pelo revisor ou pelo sistema. |
is_requested | boolean | Não | true quando o fluxo esperava este documento. |
ocr_data | object | Sim | Campos extraídos por OCR, quando disponíveis. |
is_console_upload | boolean | Não | true quando o documento foi enviado por um revisor do console (excluído do veredito agregado). |
is_confirmed | boolean | Não | true quando o revisor confirmou explicitamente o documento. |
{
"status": "Approved",
"node_id": "first_kyb_documents",
"items": [
{
"uuid": "e1f1e2c2-cccc-4d2c-9eb6-fdc6c7c92ef9",
"document_type": "incorporation_certificate",
"document_subtype": "registro_mercantil_extract",
"document_group": "incorporation_certificate",
"file_url": "https://<media-host>/.../incorporation.pdf?signature=...",
"original_filename": "incorporation_certificate.pdf",
"file_size": 256412,
"status": "Approved",
"created_at": "2026-05-17T10:08:00Z",
"cross_check_result": { "matches_registry_name": true, "matches_registration_number": true },
"document_metadata": {
"file_size": 256412,
"content_type": "application/pdf",
"is_signed": true,
"is_tampered": false
},
"description": null,
"is_requested": true,
"ocr_data": { "company_name": "Sante Clinics SL", "registration_number": "B12345678" },
"is_console_upload": false,
"is_confirmed": true
}
],
"groups": {
"incorporation_certificate": { "total": 1, "approved": 1, "pending": 0, "declined": 0, "in_review": 0, "other": 0, "missing": 0 }
},
"required_groups": ["incorporation_certificate", "shareholder_register"],
"warnings": []
}
Pessoa-chave KYB
Retornado por nó de pessoas-chave em um fluxo KYB. Aparece comokey_people_checks[] em GET /v3/session/{sessionId}/decision/ para sessões de empresas. Fonte: kyb/serializers/kyb.py:967-1050 (KeyPeopleCheckV3Serializer).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Veja o enum de status. | "Approved" |
node_id | string | null | Sim | Identificador do nó do fluxo (V3). | "first_key_people" |
registry | object | Não | { officers[], beneficial_owners[] } extraídos do registro de empresas. Os administradores seguem KYBPersonResponseSerializer (kyb/serializers/kyb.py:533-645); os beneficiários finais seguem KYBBeneficialOwnerResponseSerializer (kyb/serializers/kyb.py:648-788, que acrescenta date_of_birth, country_of_birth, email, company_name, registration_number, entity_type, roles, ownership_min_shares, ownership_max_shares, child_beneficial_owners, effective_ownership_percent). Ambos incluem enriquecimento AML e KYC para cada parte (aml_status, kyc_status, kyc_session_url, kyc_session_id, verification_workflow_type, verification_workflow_id, verification_workflow_label, verification_workflow_features, didit_internal_id, kyc_document_type, kyc_nationality, kyc_liveness_passed, kyc_verified_at, kyc_aml_categories, kyc_notification_sent_at). | { "officers": [...], "beneficial_owners": [...] } |
submitted | object | Não | { parties[] }: entradas que a empresa confirmou ou enviou pelo fluxo de pessoas-chave (linhas de BusinessParty com source=USER). Cada parte segue BusinessPartySubmissionResponseSerializer (kyb/serializers/party.py:146-194): uuid, entity_type, source, name, first_name, last_name, company_name, registration_number, email, nationality, phone_number, date_of_birth, position, custom_fields, is_active, is_skipped, requires_verification, roles[] ({ role, ownership_percent, voting_percent }), kyc_session_id, kyc_session_status, kyc_session_url, kyc_session_deleted, kyb_sub_session_id, kyb_sub_session_status, kyb_sub_session_url, kyb_sub_session_deleted, verification_workflow_type, verification_workflow_id, verification_workflow_label, verification_workflow_features, didit_internal_id. kyc_session_deleted e kyb_sub_session_deleted marcam uma sessão filha que foi excluída: o status dela permanece congelado no valor que tinha, o *_session_url correspondente volta como null porque o link não resolve mais, e a parte deixa de bloquear a sessão pai (a verificação passa para In Review). Limpe com PATCH /v3/session/{id}/kyb/parties/{party_uuid}/. | { "parties": [...] } |
ubo_kyc_summary | object | Sim | Contagens dos UBOs ativos com KYC vinculado: { total, approved, flagged, pending }. null quando nenhum UBO ativo tem KYC vinculado. | { "total": 2, "approved": 2, "flagged": 0, "pending": 0 } |
warnings | array | Não | Veja Objeto de aviso. | [] |
{
"status": "Approved",
"node_id": "first_key_people",
"registry": {
"officers": [
{
"uuid": "c1f1e2c2-aaaa-4d2c-9eb6-fdc6c7c92ef9",
"name": "María García López",
"designation": "Administrador único",
"role": "Director",
"nationality": "ESP",
"appointment_date": "2018-03-22",
"termination_date": null,
"is_active": true,
"address": "Calle Mayor 1, 28001 Madrid",
"aml_status": "Approved",
"kyc_status": "Approved",
"kyc_session_url": "https://verify.didit.me/s/…",
"kyc_session_id": "9b1f1e2c-8888-4d2c-9eb6-fdc6c7c92ef9",
"verification_workflow_type": "kyc",
"verification_workflow_id": "11111111-1111-1111-1111-111111111111",
"verification_workflow_label": "KYB officer KYC",
"verification_workflow_features": [
{ "feature": "ID_VERIFICATION", "status": "Approved" },
{ "feature": "LIVENESS", "status": "Approved" },
{ "feature": "FACE_MATCH", "status": "Approved" }
],
"didit_internal_id": "user-12345",
"kyc_document_type": "Passport",
"kyc_nationality": "ESP",
"kyc_liveness_passed": true,
"kyc_verified_at": "2026-05-17T10:10:11Z",
"kyc_aml_categories": [],
"kyc_notification_sent_at": "2026-05-15T08:00:00Z"
}
],
"beneficial_owners": []
},
"submitted": {
"parties": [
{
"uuid": "d1f1e2c2-bbbb-4d2c-9eb6-fdc6c7c92ef9",
"entity_type": "person",
"source": "USER",
"name": "María García López",
"first_name": "María",
"last_name": "García López",
"company_name": null,
"registration_number": null,
"email": "maria.garcia@example.com",
"nationality": "ESP",
"phone_number": null,
"date_of_birth": "1990-05-12",
"position": "Administrador único",
"custom_fields": {},
"is_active": true,
"is_skipped": false,
"requires_verification": true,
"roles": [
{ "role": "UBO", "ownership_percent": 75.0, "voting_percent": null }
],
"kyc_session_id": "9b1f1e2c-8888-4d2c-9eb6-fdc6c7c92ef9",
"kyc_session_status": "Approved",
"kyc_session_url": "https://verify.didit.me/s/…",
"kyb_sub_session_id": null,
"kyb_sub_session_status": null,
"kyb_sub_session_url": null,
"verification_workflow_type": "kyc",
"verification_workflow_id": "11111111-1111-1111-1111-111111111111",
"verification_workflow_label": "KYB officer KYC",
"verification_workflow_features": [
{ "feature": "ID_VERIFICATION", "status": "Approved" },
{ "feature": "LIVENESS", "status": "Approved" }
],
"didit_internal_id": "user-12345"
}
]
},
"ubo_kyc_summary": { "total": 1, "approved": 1, "flagged": 0, "pending": 0 },
"warnings": []
}
Campos no nível da decisão
Essas chaves ficam ao lado dos arrays de recursos emGET /v3/session/{sessionId}/decision/ e dentro do decision de um webhook.
| Campo | Tipo | Anulável | Descrição |
|---|---|---|---|
status_override | object | Sim | { overridden_at, automatic_status } depois que um revisor definiu o status manualmente; null quando o status é o automático. |
decision_trace | object | Não | Como o status foi definido: status, decided_by (manual, automatic ou investigator), decided_at, automatic_status, terminal_node_id, actor, warning_counts e status_warnings. |
linked_records | object | Sim | Resumos de same_face, earlier_verifications e networks; null quando não há nada a mostrar. |
biometric_retention | object | Não | { jurisdictions, deletes_at }. deletes_at é a data em que os dados biométricos da captura ao vivo da sessão são excluídos, e é null quando ainda não há uma data aplicável. |
database_validation_not_performed_reason | object | Sim | { code, message } explicando por que uma validação de banco de dados configurada não produziu resultado. |
assignee, waiting_since, sla_due_at | object, datetime | Sim | O revisor do Console responsável pela sessão e o cronômetro de revisão dela; o relógio é null, a menos que a sessão esteja In Review. |
shared_from_session, shared_from_session_number | UUID, integer | Sim | A sessão de origem de uma sessão importada. |
sandbox_scenario | string | Sim | O cenário com que uma sessão de sandbox foi criada. |
fraud_check | object | Sim | O resultado da Fraud Check API; null para todas as outras sessões. |
full_session_video, full_session_video_recorded_at | URL, datetime | Sim | A gravação e o momento em que foi feita. Retornados somente quando sua organização grava vídeo da sessão completa. |
Consentimento biométrico
Toda decisão e todo webhook de sessão da Verificação de usuários trazem um único objetobiometric_consent (não um array): se a sessão exigiu consentimento biométrico explícito, por quê, e a evidência da resposta. Ele é null quando a sessão nunca foi avaliada, por exemplo em um fluxo sem captura facial. Origem: BiometricConsentDecisionSerializer (sessions/serializers/biometric_consent.py). Quando a etapa aparece e o que significa cada caso está explicado em Consentimento biométrico.
Campos sem valor registrado são null, nunca uma string vazia.
| Campo | Tipo | Descrição |
|---|---|---|
required | boolean | Se a sessão deve coletar consentimento biométrico explícito. Nunca volta a ser false. |
trigger | string (enum) | null | Por que o consentimento é exigido, ou como ele foi atendido: declared_state, ip_state, ip_unknown, document_issuer, forced (o modo da aplicação é Always), customer_collected (você enviou biometric_consent na criação da sessão). null enquanto não for exigido. |
status | string (enum) | not_required, pending (exigido, não concedido), given, declined (uma recusa foi registrada; hoje nenhuma tela da Didit oferece a opção de recusar). |
given_at | string (ISO 8601) | null | Quando o consentimento foi concedido. Para customer_collected, o given_at que você enviou. |
declined_at | string (ISO 8601) | null | Quando uma recusa foi registrada. |
text_version | string | null | ID da versão do texto de consentimento ao qual a pessoa respondeu, ou o que você enviou. |
text_hash | string | null | SHA-256 (hex) do texto exato exibido, no idioma em que foi exibido. |
locale | string | null | Idioma em que o texto foi exibido. |
policy_url | string | null | A política de dados biométricos para a qual a etapa apontava. |
step | string | null | Etapa do fluxo em que a sessão estava quando a pessoa respondeu (por exemplo, LIVENESS). |
node_id | string | null | Nó do grafo do fluxo em que a sessão estava quando a pessoa respondeu. |
ip_address | string | null | IP de onde veio a resposta. |
ip_country_code | string | null | País ISO 3166-1 alpha-2 do IP da resposta. |
ip_state | string | null | Subdivisão ISO 3166-2 do IP da resposta (por exemplo, US-IL). |
ip_city | string | null | Cidade do IP da resposta. |
user_agent | string | null | User agent da requisição da resposta. |
detected_ip_address | string | null | O IP da pessoa a partir do qual a exigência foi avaliada pela última vez. Pode ser diferente de ip_address quando a pessoa respondeu em outro dispositivo. |
detected_country_code | string | null | País ISO 3166-1 alpha-2 do IP detectado. |
detected_state | string | null | Subdivisão ISO 3166-2 do IP detectado. |
detected_city | string | null | Cidade do IP detectado. |
declared_state | string | null | Subdivisão ISO 3166-2 que você declarou: user_state, ou o estado de um endereço nos EUA em expected_details. |
document_state | string | null | Subdivisão ISO 3166-2 que emitiu o documento de identidade, lida na captura do documento. |
jurisdictions | array of string | Estados dos EUA (códigos USPS, por exemplo IL) cuja lei de biometria se aplica à pessoa. US quando a evidência situa a pessoa nos EUA, mas nenhum estado é conhecido. Vazio quando nenhuma se aplica. |
retention_months | integer | null | O menor limite de retenção de dados biométricos, em meses, entre as jurisdictions. null quando nenhuma se aplica. |
reason | string (enum) | null | BIOMETRIC_CONSENT_UNSUPPORTED_SDK: o consentimento era exigido e um SDK nativo anterior à 4.10.0, ou um que não informou sua versão, capturou um rosto sem a etapa; status permanece pending, ou given se a pessoa concordou depois no fluxo hospedado. BIOMETRIC_CONSENT_DECLINED: uma recusa foi registrada (ela substitui o motivo do SDK). null nos demais casos, e sempre null quando a sessão não exigiu consentimento. |
decline_reason | string | null | BIOMETRIC_CONSENT_DECLINED quando uma recusa registrada encerrou a sessão; caso contrário, null. |
face_data_deleted_at | string (ISO 8601) | null | Quando a recusa excluiu as imagens faciais, os vídeos e os templates faciais da sessão. null, a menos que uma recusa tenha sido registrada. |
{
"required": true,
"trigger": "ip_state",
"status": "pending",
"given_at": null,
"declined_at": null,
"text_version": null,
"text_hash": null,
"locale": null,
"policy_url": null,
"step": null,
"node_id": null,
"ip_address": null,
"ip_country_code": null,
"ip_state": null,
"ip_city": null,
"user_agent": null,
"detected_ip_address": "203.0.113.42",
"detected_country_code": "US",
"detected_state": "US-IL",
"detected_city": "Chicago",
"declared_state": null,
"document_state": null,
"jurisdictions": ["IL"],
"retention_months": 36,
"reason": "BIOMETRIC_CONSENT_UNSUPPORTED_SDK",
"decline_reason": null,
"face_data_deleted_at": null
}
{
"required": true,
"trigger": "declared_state",
"status": "given",
"given_at": "2026-10-13T18:31:07.412000Z",
"declined_at": null,
"text_version": "bio-consent-2026-10-12",
"text_hash": "9b2f0c5e4d8a7f61c3e2b4a5d6f7081923a4b5c6d7e8f90a1b2c3d4e5f6a7b8c",
"locale": "en",
"policy_url": "https://didit.me/legal/biometric-data-policy",
"step": "LIVENESS",
"node_id": "feature_liveness_1",
"ip_address": "198.51.100.23",
"ip_country_code": "ES",
"ip_state": "ES-M",
"ip_city": "Madrid",
"user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1",
"detected_ip_address": "198.51.100.23",
"detected_country_code": "ES",
"detected_state": "ES-M",
"detected_city": "Madrid",
"declared_state": null,
"document_state": null,
"jurisdictions": ["IL"],
"retention_months": 36,
"reason": null,
"decline_reason": null,
"face_data_deleted_at": null
}
Referência do enum de status
Dois conjuntos de valores relacionados compartilham o nome de campostatus. Todos os objetos de relatório por recurso nesta página usam o enum de recurso; o status de nível superior da sessão principal usa o enum de sessão, mais amplo.
Status no nível do recurso
Usados pelo campostatus de todos os objetos de relatório. Fonte: common/config/choices.py:343-348 (FeatureStatusChoices).
| Valor | Significado |
|---|---|
Not Finished | O recurso foi provisionado, mas o usuário ainda não o concluiu. |
Approved | O recurso passou em todas as verificações. |
Declined | O recurso falhou em pelo menos uma verificação obrigatória (veja warnings[] com log_type: "error"). |
In Review | O recurso gerou sinais de falha leve e aguarda revisão manual (veja warnings[] com log_type: "warning"). |
Resub Requested | Um revisor solicitou que o usuário reenvie este recurso. |
Expired quando a etapa correspondente atinge o tempo limite (PhoneStatusChoices em common/config/choices.py:377-382, EmailStatusChoices em common/config/choices.py:434-439).
Status no nível da sessão
Usados pelostatus de nível superior da sessão principal. Fonte: common/config/choices.py:106-117 (StatusChoices).
| Valor | Significado |
|---|---|
Not Started | A sessão foi criada, mas o usuário ainda não a iniciou. |
In Progress | O usuário iniciou o fluxo; o resultado ainda não foi finalizado. |
Approved | A sessão passou em todas as verificações. |
Declined | A sessão falhou em pelo menos uma verificação obrigatória. |
In Review | A sessão aguarda revisão manual. |
Expired | A sessão expirou antes de ser concluída. |
Abandoned | O usuário saiu do fluxo sem concluí-lo. |
Kyc Expired | O período de validade do KYC terminou (usado em fluxos de reverificação). |
Resubmitted | O usuário reenviou após uma recusa anterior; esta sessão foi substituída por uma mais recente. |
Awaiting User | O sistema aguarda uma ação do usuário (por exemplo, a inserção do OTP). |
Os valores finais de sessão são
Approved, Declined, In Review, Expired, Kyc Expired e Abandoned. Uma sessão pode chegar à decisão geral enquanto um recurso individual permanece em In Review.