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 abordam cada objeto de relatório por recurso. O texto dos títulos H3 é intencionalmente estável para que outros documentos possam criar links diretos para eles.Verificação de identidade
Retornado para cada documento de KYC/identidade que um usuário envia. 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 | string | Não | Consulte Enum de status. | "Approved" |
document_type | string | Sim | Classe do documento em formato legível (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 | string | Sim | Código de subtipo do documento no registro de documentos da Didit, filtrado pelo que as configurações de documento do fluxo de verificação (workflow) 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 | string | Sim | Número do documento extraído por OCR. | "AB1234567" |
personal_number | string | Sim | Identificador pessoal/nacional extraído por OCR. | "99999999R" |
portrait_image | string (URL) | Sim | URL pré-assinada do recorte do rosto. | "https://<media-host>/.../portrait.jpg?..." |
front_image | string (URL) | Sim | URL pré-assinada da frente do documento após o tratamento. | "https://<media-host>/.../front.jpg?..." |
front_video | string (URL) | Sim | URL pré-assinada do vídeo de captura da frente (quando disponível). | "https://<media-host>/.../front.mp4?..." |
back_image | string (URL) | Sim | URL pré-assinada do verso do documento após o tratamento. | "https://<media-host>/.../back.jpg?..." |
back_video | string (URL) | Sim | URL pré-assinada do vídeo de captura do verso. | null |
full_front_image | string (URL) | Sim | Captura da frente sem recorte (quadro completo). | "https://<media-host>/.../full_front.jpg?..." |
full_back_image | string (URL) | Sim | Captura do verso sem recorte (quadro completo). | null |
front_image_camera_front | string (URL) | Sim | Imagem da câmera frontal tirada no mesmo momento que a frente do documento. | null |
back_image_camera_front | string (URL) | Sim | Imagem da câmera frontal tirada no mesmo momento que o verso do documento. | null |
front_image_camera_front_face_match_score | float (0-100) | Sim | Similaridade entre o retrato do documento e a captura da câmera frontal. | null |
back_image_camera_front_face_match_score | float (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 que correspondem à selfie tirada durante a captura do documento. Mesmo formato de entrada que liveness_checks[].matches. null quando a busca não foi executada, [] quando não houve nenhuma correspondência. | 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 que front_image_quality_score. | null |
date_of_birth | string (YYYY-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 | string (YYYY-MM-DD) | Sim | Data de validade do documento. | "2032-05-11" |
date_of_issue | string (YYYY-MM-DD) | Sim | Data de emissão do documento. | "2022-05-11" |
issuing_state | string (ISO 3166-1 alpha-3) | Sim | Código do país emissor. | "ESP" |
issuing_state_name | string | Sim | Nome localizado do país emissor. | "Spain" |
first_name | string | Sim | Nome(s) extraído(s) por OCR. | "María" |
last_name | string | Sim | Sobrenome(s) extraído(s) por OCR. | "García López" |
full_name | string | Sim | Nome completo normalizado (fornecido pelo fornecedor). | "María García López" |
gender | string | Sim | M, F ou outro valor fornecido pelo fornecedor. | "F" |
address | string | Sim | Linha de endereço bruta extraída por OCR. | "Calle Mayor 1, 28001 Madrid" |
formatted_address | string | Sim | Endereço geocodificado/formatado (quando for 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 | string | Sim | Local de nascimento extraído por OCR. | "Madrid" |
marital_status | string | Sim | Quando for possível extraí-lo. | null |
nationality | string (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 são cobertos pelo esquema canônico (por exemplo, categorias da carteira de habilitação). | { "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 strings (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 é uma 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 de os outros métodos existirem. | "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 | objeto | null | Sim | Por que um método que não é de documento encerrou a etapa de identificação: { method, reason, action }. Definido na linha recusada quando uma consulta ou um login por carteira falhou e a opção configurada para o país era decline. O staging atual também o preserva na verificação de documento resultante após um fallback; confirme a implantação em produção. null quando nenhuma falha anterior de um método que não é de documento foi registrada. | { "method": "id_lookup", "reason": "no_match", "action": "decline" } |
id_lookup | objeto | 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, 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 destes: 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[] (staging atual: diagnósticos separados da fonte; confirme a implantação em produção), registry_portrait (URL pré-assinada, apenas para fontes que retornam uma) e face_match_score. | veja abaixo |
wallet_verification | objeto | null | Sim | Evidência da 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 | objeto | null | Sim | Pontuações de liveness do documento por tipo de fraude (portrait_replace, printed_copy, screen_replay), informadas independentemente de um aviso ter sido disparado ou não. Cada uma contém: score (0-100, quanto maior, mais provável que seja genuíno; o lado com a menor pontuação, que é o valor usado pela decisão), front, back, decline_threshold, review_threshold, bucket (approve, review, decline ou null). Os limiares e o bucket são salvos no momento da avaliação; os três são null quando a evidência histórica da avaliação não está disponível, enquanto as pontuações armazenadas continuam visíveis. null quando a verificação não foi executada. Veja Pontuações de liveness do documento. Somente V3. | { "portrait_replace": { "score": 96.46, "bucket": "approve" } } |
node_id | string | null | Sim | Identificador do nó do fluxo (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 indica um. | "CA" |
extracted_data | objeto | Sim | Instantâneo dos dados extraídos do documento que foram mostrados à pessoa para revisão, mantido junto aos valores confirmados para que você possa compará-los. null quando não foi solicitado à pessoa que revisasse os dados. | |
barcodes | array de objetos | Não | Dados lidos dos códigos de barras do documento, uma entrada por código de barras 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
Retornado para cada leitura de chip de um documento de identidade: um chip de ePassport ou eID ICAO 9303, ou um My Number Card japonês 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, que 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 do rosto extraída do chip. | "https://<media-host>/.../nfc_portrait.jpg?..." |
signature_image | string (URL) | Sim | URL pré-assinada da imagem da assinatura extraída do chip (quando armazenada no chip). | null |
chip_data | objeto | Sim | Dados pessoais extraídos dos Data Groups do chip, em estrutura plana (kyc/utils/epassport.py:165-212): dgs (Data Groups lidos), surname, name, country, nationality, birth_date (YYYY-MM-DD), expiry_date (YYYY-MM-DD), sex (M/F), document_type (código de documento da MRZ), document_number, optional_data, dígitos verificadores 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; caso contrário, essas chaves ficam ausentes. null quando a etapa NFC foi pulada. | { "document_number": "AB1234567", "name": "MARIA" } |
authenticity | objeto | Sim | { sod_integrity, dg_integrity }; null para uma leitura JPKI. sod_integrity valida que a assinatura do Document Security Object (SOD) se encadeia a uma CSCA válida do país emissor (e que o DSC não está revogado nem expirado); dg_integrity valida que os hashes de cada Data Group correspondem ao SOD. Ambos true significa 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 (V3). | "first_nfc" |
is_nfc_skipped | booleano | Não | true quando esta etapa de NFC foi explicitamente pulada em vez de lida; skip_reason informa o motivo. | false |
skip_reason | string | Sim | Motivo pelo qual a etapa foi pulada; definido somente quando is_nfc_skipped é true. Um destes valores: USER_SKIPPED, DOCUMENT_WITHOUT_CHIP, CHIP_CERTIFICATE_UNAVAILABLE, DEVICE_WITHOUT_NFC, INTEGRATION_WITHOUT_NFC_ACCESS, MRZ_KEY_UNAVAILABLE, JPKI_UNAVAILABLE; consulte Motivos para pular. O payload da decisão também inclui um nfc_skip_reason no nível da sessão, com a mesma taxonomia, que abrange as etapas de NFC ignoradas antes da criação de qualquer relatório. | null |
chip_protocol | string | Não | Como o chip é lido: icao (chip de ePassport ou eID ICAO 9303) ou jpki (My Number Card do Japão). Para jpki, portrait_image, signature_image, chip_data, authenticity e certificate_summary são null. Também é definido em etapas puladas. | "icao" |
jpki | objeto | Sim | O que a leitura de um My Number Card 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 extraídos do certificado de assinatura), attributes_match_ocr e mismatched_attributes. Nunca inclui os certificados, seus números de série nem as assinaturas. É null para chips ICAO, para etapas puladas e quando a etapa foi encerrada sem nenhuma leitura do cartão. Consulte Campos JPKI. | null |
warnings | array | Não | Consulte 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 por sessão de prova de vida. Aparece comoliveness_checks[] em GET /v3/session/{sessionId}/decision/. Fonte: face/serializers/face.py:301-320 (LivenessV3Serializer, que estende LivenessV2Serializer em face/serializers/face.py:216-298).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Consulte Enum de status. | "Approved" |
method | string (enum) | Sim | ACTIVE_3D, FLASHING ou PASSIVE (LivenessMethodChoices, common/config/choices.py:514-517). O modo passivo é executado quando sessões em desktop são permitidas e o usuário está em 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 facial de referência do usuário. | "https://<media-host>/.../reference.jpg?..." |
video_url | string (URL) | Sim | URL pré-assinada do vídeo de prova de vida (somente no modo ativo). | "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 com template 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 facial da prova de vida passiva (normalizada para porcentagem). | 87.50 |
face_luminance | float (0-100) | Sim | Pontuação de luminância facial da 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 | Consulte 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": []
}
Correspondência facial
Retornado por comparação de correspondência facial (normalmente o rosto do usuário na prova de vida comparado com o retrato do documento). Aparece comoface_matches[] em GET /v3/session/{sessionId}/decision/. Fonte: face/serializers/face.py:367-389 (FaceMatchV3Serializer, que estende FaceMatchV2Serializer em face/serializers/face.py:323-364).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Consulte 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 em 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 o retrato armazenado em fluxos de autenticação biométrica. | "https://<media-host>/.../source.jpg?..." |
target_image | string (URL) | Sim | URL pré-assinada da imagem de destino (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 | Consulte 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 significa uma evidência em modo sombra sobre a qual nenhum aviso atua. 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 autônoma de Busca facial (POST /v3/face-search/). A Busca facial nunca aparece como array no plural em /v3/session/{sessionId}/decision/: quando persistida com save_api_request=true, a sessão aparece ali como uma entrada FACE_SEARCH em features[], além de um item liveness_checks[] com as matches armazenadas. Fontes: apis/serializers/face_search.py:8-79 (FaceSearchResponseSerializer encapsulando FaceSearchDetailsSerializer); dicionários de correspondência construídos 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 | object | Não | O payload com os detalhes da busca. Veja os campos abaixo. | — |
vendor_data | string | Sim | vendor_data da requisição, devolvido na resposta. | null |
metadata | object | Sim | metadata da requisição, devolvido na resposta. | 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 causam recusa (apis/views/face_search.py:242-248). | "Approved" |
total_matches | integer | Não | Número de correspondências retornadas em matches[] (0–5). | 1 |
matches | array de objetos de correspondência da busca facial | Não | Até 5 correspondências acima do limiar mínimo de similaridade, ordenadas por similaridade decrescente (entradas da lista de bloqueio primeiro com search_type=blocklisted_or_approved). | […] |
user_image | object | Não | Resultado da detecção na 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 autônoma, 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 inclui feature, sempre "LIVENESS" (apis/views/face_search.py:332-341). | [] |
Objeto de correspondência da 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 | integer | Sim | Número da sessão correspondente, no formato exibido no console; null para correspondências que não são de sessão. | 1024 |
similarity_percentage | float (0-100) | Não | Similaridade entre o rosto enviado e o rosto correspondente. | 96.42 |
source | string (enum) | Não | Origem do cadastro do rosto correspondente: session (sessão de verificação ou chamada autônoma salva), imported (upload direto de rosto no perfil do usuário), list_entry (rosto vinculado 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 User vinculado para correspondências imported e retained_template. | "user-12345" |
vendor_user_id | string (UUID) | Sim | O User vinculado. null para correspondências list_entry e para sessões sem User. | "2f7c1a9e-…" |
biometric_template_id | string (UUID) | Sim | O template retido que gerou a correspondência. Preenchido somente para correspondências retained_template; use-o com GET/DELETE /v3/biometric-templates/{id}/. | null |
verification_date | string (ISO 8601) | Sim | Quando o rosto correspondente foi capturado, ou quando um retained_template foi retido; null para correspondências list_entry. | "2024-11-04T09:14:02Z" |
user_details | object | Sim | { full_name, document_type, document_number } da verificação de documento da sessão correspondente; para correspondências imported, somente full_name é preenchido; null quando não há 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 | Rosto de referência do usuário correspondente: URL pré-assinada quando save_api_request=true, caminho bruto de armazenamento caso contrário. 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 enum de status); null para correspondências que não são de sessão. | "Approved" |
is_blocklisted | boolean | Não | Indica se o rosto correspondente está na sua lista de bloqueio de rostos. Sempre false para correspondências retained_template; um rosto na lista de bloqueio é reportado separadamente como correspondência list_entry. | false |
is_allowlisted | boolean | Não | Indica se o rosto correspondente está em uma das suas listas de permissão. | false |
api_service | string (enum) | Sim | Tipo de API autônoma da sessão correspondente, em maiúsculas (por exemplo, PASSIVE_LIVENESS, FACE_MATCH); null para sessões de fluxo de verificação (workflow) e 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 em sessões KYC quanto 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 enum de status. | "Approved" |
total_hits | integer | Não | Número de ocorrências da análise (sempre presente, 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 (bool), target (bool | null, indica se a entidade é o alvo direto da listagem), match_score (float 0-100, confiança de identidade), risk_score (float 0-100, risco da entidade), score (float 0-1, obsoleto), 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 de status de ocorrência AML, AMLHitStatusChoices). | […] |
score | float (0-100) | Sim | Pontuação geral da análise: o maior risk_score entre as ocorrências não marcadas como False Positive (aml/services/aml.py:832-842); 0 quando todas as ocorrências são falsos positivos. null até ser calculado. | 42.7 |
screened_data | object | Sim | Snapshot dos dados enviados para a análise: 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 | Indica se a entidade está inscrita nas reanálises do monitoramento contínuo. | false |
next_ongoing_monitoring_bill_date | string (YYYY-MM-DD) | Sim | Calculado como last_aml_bill_date + 365 days quando o monitoramento contínuo está ativado. É uma data de faturamento, não uma data de análise. | null |
last_ongoing_screening_at | string (ISO 8601) | Sim | Quando o monitoramento contínuo concluiu pela última vez uma reanálise deste registro, independentemente de o resultado ter mudado ou não. null quando nunca foi reanalisado; 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 informada pelo provedor para essa análise. null quando nenhuma data do conjunto de dados foi informada; nunca é estimado. | 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
Retornado para cada localização de rede capturada. Aparece comoip_analyses[] em GET /v3/session/{sessionId}/decision/ tanto para sessões de KYC quanto de KYB. Fonte: 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 obtida a partir 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 em 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 obtido a partir do IP. | "Spain" |
ip_country_code | string (ISO 3166-1 alpha-2) | Sim | Código do país obtido a partir do IP. | "ES" |
ip_state | string | Sim | Região / estado obtido a partir do IP. | "Comunidad de Madrid" |
ip_city | string | Sim | Cidade obtida a partir do IP. | "Madrid" |
latitude | float | Sim | Latitude obtida a partir do IP. | 40.4168 |
longitude | float | Sim | Longitude obtida a partir do IP. | -3.7038 |
ip_address | string | Sim | O endereço IP capturado. | "203.0.113.42" |
isp | string | Sim | Nome do provedor de internet (ISP). | "Telefonica de Espana" |
organization | string | Sim | Nome da organização (geralmente 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 / data center. | false |
time_zone | string | Sim | Nome do fuso horário 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 está 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 obtida a partir de issuing_state e do endereço extraído. | { "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 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/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 (as correspondências recuperadas também trazem recovery_similarity, tls_ja4_corroborated, recovery_gate_reason). Limitado a 5 correspondências de IP + 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 obtidas 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 idade dela 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, com a tentativa aceita. geolocation_attempts[] lista todas as tentativas de todas as etapas, da mais antiga para a mais recente. Ambos são null em um fluxo sem essa etapa. Fonte: 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, inteiro | Sim | Quando o dispositivo obteve a posição e os segundos até a Didit recebê-la. | 2 |
source, platform, sdk_version | string | Sim | De onde veio a posição, o cliente que a gerou e a versão do SDK dele. | "browser" |
is_mock, produced_by_accessory | boolean | Sim | Evidências de spoofing informadas pela plataforma. null significa que ela não as 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 ao qual a posição corresponde. | "FR" |
geofence, inside_geofence, geofence_basis, inside_areas, blocked_areas | objeto, boolean, string, arrays | Sim | O resultado por país e por área. | { "enabled": true, "result": "outside" } |
position_source, anonymizers | string, objeto | 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 | número, boolean, inteiro | Sim | As comparações com a localização do IP e com o endereço registrado. | 12.4 |
attempts | inteiro | Não | O número da tentativa dentro da etapa. | 3 |
consent | objeto | Sim | accepted_at, version e locale do aviso que a pessoa aceitou. | |
warnings | array de objetos de aviso | Não | Os avisos LOCATION_* da etapa. Não aparece em geolocation_attempts[], que adiciona received_at e created_at. | [] |
Comprovante de endereço
Retornado para cada documento de endereço enviado. Aparece comopoa_verifications[] em GET /v3/session/{sessionId}/decision/. Origem: poa/serializers/poa.py:212-227 (POAV3Serializer, que estende POAV2Serializer em poa/serializers/poa.py:173-209).
| Campo | Tipo | Anulá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 geral de PoaDocumentTypeChoices (common/config/choices.py:868-873): UTILITY_BILL, BANK_STATEMENT, GOVERNMENT_ISSUED_DOCUMENT, OTHER_POA_DOCUMENT. Usa UNKNOWN como valor padrão, 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 valor padrão, 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 | objeto | 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 | objeto | 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 | objeto | 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 como 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 (literalmente). | "Calle Mayor 1, Madrid" |
expected_details_formatted_address | string | Sim | Endereço esperado geocodificado. | "Calle Mayor 1, 28001 Madrid, Spain" |
expected_details_parsed_address | objeto | 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 para 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 (começando 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 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/ para sessões KYC e KYB. Fonte: phone/serializers/phone.py:251-266 (PhoneV3Serializer, que estende PhoneV2Serializer em phone/serializers/phone.py:103-248).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Consulte 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 localizado do país. | "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/descartável. | false |
is_virtual | boolean | Não | true quando carrier.type é um destes valores: voip, isp, vpn. | false |
verification_method | string | Não | Canal usado para entregar o OTP (whatsapp, sms, …). É lido do actual_channel da última tentativa de envio (com fallback para o channel solicitado e, depois, para sms). | "whatsapp" |
verification_attempts | integer | 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 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 | Pegada social do número. Presente apenas quando o complemento de pegada 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/ para sessões KYC e KYB. Fonte: email_verification/serializers/email.py:149-164 (EmailV3Serializer, que estende EmailV2Serializer em email_verification/serializers/email.py:38-146).
| Campo | Tipo | Anulável | Descrição | Exemplo |
|---|---|---|---|---|
status | string | Não | Consulte Enum de status. | "Approved" |
email | string | Não | O endereço de e-mail enviado. | "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 de cada 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 sondagem de entrega SMTP mostra que a caixa de entrada não aceita mensagens. | false |
verification_attempts | integer | 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 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 | Pegada social do endereço. Presente apenas quando o complemento de pegada 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 para cada 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, que 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 obtiveram, de forma independente, correspondência total do número de identificação) ou not_enabled (o validador foi ignorado ou nenhum provedor respondeu; um no_match definitivo ainda resulta em one_by_one). Nunca é null. Origem: DatabaseValidationChoices (common/config/choices.py:1097-1100). | "one_by_one" |
screened_data | object | Não | Os dados enviados ao registro. Os campos de arquivo (selfie, cnh_qr_code_image, document_image) recebem URLs pré-assinadas no momento da leitura. | { "document_number": "99999999R", "date_of_birth": "1990-05-12" } |
validations | array of objects | Não | Uma entrada por 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 normalizado: full_name, gender, date_of_birth, photo (URL pré-assinada), signature (URL pré-assinada), …). | […] |
errors | array of objects | Sim | Erros por serviço quando uma consulta falhou; a chave é omitida por completo quando está vazia. Cada entrada é o objeto de erro do serviço upstream mais o service_id que o gerou. | [] |
match_type | string (enum) | Sim | Veredito de correspondência agregado 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 Enum de status. | "Approved" |
node_id | string | null | Sim | Identificador do nó do fluxo (V3). | "first_db_validation" |
warnings | array | Não | Consulte 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 de questionário
Retornado para cada envio de questionário. Aparece comoquestionnaire_responses[] em GET /v3/session/{sessionId}/decision/ tanto em sessões KYC quanto KYB. Origem: 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 of strings | Não | Códigos dos idiomas em que o questionário está publicado. | ["en", "es"] |
default_language | string | Não | Código do idioma de fallback. | "en" |
is_active | boolean | Não | Indica se esta versão do questionário é a ativa. | true |
is_simple_questionnaire | boolean | Não | true quando o questionário não tem ramificações (lista simples). | true |
questionnaire_group_id | string (UUID) | Não | Identificador compartilhado entre as versões do mesmo questionário. | "a7c2c2c2-…" |
version | integer | Não | Número da versão do modelo ativo. | 3 |
status | string | Não | Um entre Approved, In Review e Not Finished (uma recusa no nível do 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 of objects | Não | Seções ordenadas após a aplicação da travessia do grafo e da filtragem por visibilidade. Cada seção é { title, description, items[] } (title/description 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: null quando não respondido e omitido nos itens de layout HEADING/PARAGRAPH/SEPARATOR). As respostas de arquivo contêm { files: [<presigned URL>, …] }. | […] |
node_id | string | null | Sim | Identificador do nó do fluxo (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
Retornado para cada signatário de uma etapa de Assinatura eletrônica. Aparece comosignatures[] em GET /v3/session/{sessionId}/decision/ tanto em sessões KYC quanto KYB, somente quando o fluxo tem essa etapa. Diferentemente dos outros objetos de relatório, o status dele é o estágio da assinatura e o resultado fica 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 esse valor como signature_id nas rotas de evidência e de validação. | "0e6c2a8e-…" |
node_id | string | Não | Identificador do nó do fluxo. | "feature_signature" |
status | string | Não | Estágio 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) ou aes. qes é um complemento que ainda não está disponível. | "aes" |
format | string | Não | pdf para uma assinatura simples, pades para uma assinatura avançada (AES). | "pades" |
profile | string | Sim | PAdES-B-LT depois que uma assinatura avançada (AES) é assinada; caso contrário, null. | "PAdES-B-LT" |
signer | object | Não | { name, capacity, company, role, roles, identity_session_id }. capacity é self (KYC) ou company (KYB). | { "name": "Jane Doe", "capacity": "self", … } |
identity_used | object | Não | { session_id, kyc_id, verified, expected_name }: a identidade verificada em que a assinatura se baseia. Vazio para uma assinatura simples sem identidade verificada. | { "verified": true, … } |
certificate | object | 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 inseridos, 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. null até a assinatura, e sempre null para uma assinatura Simple. | { "qualified": false, … } |
documents | array de objetos | Não | { id, uuid, title, 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[].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 uma 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 caligrafia de uma assinatura digitada. null até a adoção. | { "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 não foi possível confirmar o resultado da assinatura. | { "valid": true, … } |
declined_at | string (ISO 8601) | Sim | Quando o signatário recusou. | null |
declined_action | string | Não | O 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 uma cópia assinada foi enviada por e-mail ao signatário. | "2026-11-03T10:42:30Z" |
email_unavailable_reason | string | Sim | Por que 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 autônoma de Estimativa de idade (POST /v3/age-estimation/). A resposta traz um subconjunto da estrutura de Liveness check dentro de um envelope age_estimation (status, method, score, age_estimation, warnings), além de um bloco de detecção facial user_image exclusivo da API autônoma; ela não inclui reference_image, video_url, matches, face_quality nem face_luminance. Em sessões de 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), com o 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 transitó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 age, bbox [x_min, y_min, x_max, y_max], confidence e gender por rosto; além de best_angle), warnings[]. | { … } |
vendor_data | string | Sim | vendor_data da requisição, devolvido na resposta. | null |
metadata | objeto | Sim | metadata da requisição, devolvido na resposta. | null |
created_at | string (ISO 8601) | Não | Data e hora da requisição registradas 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á um serializer dedicado:GET /v3/session/{sessionId}/decision/ retorna os objetos padrão Liveness check e Face match 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 Liveness check | Não | Resultado da prova de vida da tentativa de autenticação. | [ { "status": "Approved", … } ] |
face_matches | array de Face match | Não | Resultado da correspondência com a referência cadastrada. source_image_session_id recebe o próprio session_id da sessão: o rosto de referência (o portrait_image fornecido ou, quando portrait_image é omitido, o rosto armazenado reutilizado via vendor_data) é registrado 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 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 no registro em um fluxo de verificação (workflow) de KYB. Aparece comoregistry_checks[] em GET /v3/session/{sessionId}/decision/ para sessões de empresas. Fonte: kyb/serializers/kyb.py:939-964 (RegistryCheckV3Serializer).
| 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_registry" |
data_resolved | boolean | Não | true quando a consulta ao registro foi concluída (ou is_from_registry é false, o que significa que os dados foram inseridos manualmente). | true |
company | object | Não | Payload completo da empresa. Consulte Objeto de empresa abaixo. | { … } |
ownership_structure | object | Sim | O quadro societário comprovado pelo registro: shareholders[] e beneficial_owners[], cada proprietário com sua identidade no registro, sua participação e seu shareholding canônico. | { "shareholders": [...], "beneficial_owners": [] } |
warnings | array | Não | Consulte Objeto de aviso. | [] |
Objeto de empresa
Dekyb/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 usada no objeto pai. |
company_name | string | Sim | Razão social registrada da empresa. |
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 legal registrado. |
tax_number | string | Sim | Identificação fiscal / de IVA. |
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 vez de inserção manual). |
fetch_status | string | Sim | pending, resolved, failed. |
alternative_names | string | Sim | Nomes comerciais alternativos separados por vírgula. |
nature_of_business | string | Sim | Descrição em texto livre da atividade da empresa. |
registered_capital | string | Sim | Capital social registrado como texto legível. |
registered_capital_amount | string (decimal) | Sim | Valor do capital social registrado, já interpretado. |
registered_capital_currency | string (ISO 4217) | Sim | Código da moeda. |
website | string (URL) | Sim | Site da empresa. |
email | string | Sim | E-mail público de contato. |
phone | string | Sim | Telefone público de contato. |
legal_entity_identifier | string | Sim | LEI, quando disponível. |
location_of_registration | string | Sim | Cartório / região do registro. |
vat_number | string | Sim | Número de IVA enviado para a empresa. |
vat_validation_status | string | Não | Resultado da validação do número de IVA, ou do tax_number quando não houver um: valid, invalid, format_valid, invalid_format, could_not_validate ou not_applicable. Consulte Validação de IVA 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 determinou 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 o divulga). |
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 destaques financeiros mais recentes, quando fornecidos pelo registro. |
officers | array of objects | Não | Lista de administradores segura para B2C: { uuid, name, designation, role, nationality, is_active, kyc_status, kyc_session_url }. |
beneficial_owners | array of objects | 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 of objects | Sim | Detalhes de cada endereço vindos do registro. |
industries | array of objects | Sim | Classificações no estilo SIC/NAICS. |
accounts | array of objects | Sim | Metadados das demonstrações contábeis registradas. |
registry_data | object | Sim | Detalhes do registro normalizados pela Didit (resultado de propriedade, correções feitas no console, fatos do registro sem campo próprio). Não é um contrato estável. |
user_provided_data | object | Sim | Snapshot 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 vindos do registro ainda podem 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 para cada nó que coleta documentos de suporte de KYB. Aparece comodocument_verifications[] em GET /v3/session/{sessionId}/decision/ para sessões de empresas, com uma entrada por node_id e 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 entre os documentos deste nó: Approved somente quando todos os documentos do pipeline estão aprovados; Declined se algum for recusado; In Review nos demais casos; Not Finished enquanto estiver pendente. Consulte Enum de status. | "Approved" |
node_id | string | null | Sim | Identificador do nó do fluxo (V3). | "first_kyb_documents" |
items | array de objetos de item de documento KYB | Não | Uma entrada por documento enviado ou solicitado. | […] |
groups | objeto | 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 | array de strings | Não | Grupos de documentos exigidos pela configuração do fluxo. | ["incorporation_certificate", "shareholder_register"] |
warnings | array | Não | Consulte 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 para maior clareza). |
file_url | string (URL) | Sim | URL pré-assinada para o arquivo tratado. |
original_filename | string | Sim | Nome do arquivo conforme enviado. |
file_size | inteiro | 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 | objeto | Sim | Resultado da verificação cruzada com o registro e outros documentos. |
document_metadata | objeto | 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 | booleano | Não | true quando o fluxo esperava este documento. |
ocr_data | objeto | Sim | Campos extraídos por OCR, quando disponíveis. |
is_console_upload | booleano | Não | true quando o documento foi enviado por um revisor no console (excluído do resultado agregado). |
is_confirmed | booleano | Não | true quando o revisor confirmou o documento explicitamente. |
{
"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 para cada 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 | Consulte Enum de status. | "Approved" |
node_id | string | null | Sim | Identificador do nó do fluxo (V3). | "first_key_people" |
registry | objeto | Não | { officers[], beneficial_owners[] } extraídos do registro. Os administradores seguem KYBPersonResponseSerializer (kyb/serializers/kyb.py:533-645); os beneficiários finais seguem KYBBeneficialOwnerResponseSerializer (kyb/serializers/kyb.py:648-788, que adiciona 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 de AML + KYC por 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 | objeto | 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 / kyb_sub_session_deleted indicam uma sessão filha que foi excluída: o status dela fica congelado no valor que tinha, o *_session_url correspondente volta como null porque o link não funciona mais, e a parte deixa de bloquear a sessão principal (a verificação passa para In Review). Para limpar esse estado, use PATCH /v3/session/{id}/kyb/parties/{party_uuid}/. | { "parties": [...] } |
ubo_kyc_summary | objeto | Sim | Contagens entre os 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 | Consulte 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.