POST /v1/assessments — la solicitud
Su backend solicita una evaluación con una única llamada síncrona a
POST https://api.fingertrackid.com/v1/assessments, firmada con
HMAC.
El origen de la API de producción es https://api.fingertrackid.com; la consola también lo
muestra, con un botón para copiar, como Endereço da API de risco en el paso
Credencial servidor a servidor de Início. Configúrelo exactamente como está escrito, sin
barra final ni ruta. La ruta es exactamente /v1/assessments: sin cadena de consulta, sin barra
final y sin normalización. El cuerpo es un único objeto JSON en UTF-8.
POST /v1/assessments HTTP/1.1Host: api.fingertrackid.comContent-Type: application/jsonX-FTID-Timestamp: <second at which you sign this attempt>X-FTID-Request-Id: <a new lowercase UUIDv7>X-FTID-External-Event-Id: evt:tag-0001X-FTID-Signature: v1=<key_id>:<mac>
{"schema_version":"event-assessment-request.v1.1","external_event_id":"evt:tag-0001","idempotency_key":"idem-tag-0001","occurred_at":"2026-10-11T12:00:00.000Z","subject_ref":null,"account_ref":null,"event_context_token":null,"tag":"login","deadline_ms":null}Descargue los archivos de contrato exactos de cada perfil. Para v1.1: el
contrato OpenAPI v1.1, el
esquema de la solicitud,
el esquema de la respuesta y
los ejemplos sintéticos. Para
v1: el contrato OpenAPI v1, el
esquema de la solicitud,
el esquema de la respuesta y
los ejemplos sintéticos. Ambos
perfiles comparten el esquema de Problem,
y el contrato v1.1 también hace referencia a los ejemplos v1 para dos Problems.
Conserve la estructura relativa de directorios de estos archivos al usar las referencias de
OpenAPI. Los archivos conservan su servidor de ejemplo original y su anotación de estado de
implementación; ignore ese servidor de ejemplo y use
https://api.fingertrackid.com.
Producción acepta ambos perfiles: un cuerpo v1.1 correctamente firmado con su tag recibe como
respuesta event-assessment.v1.1, y la solicitud v1 no cambia.
Encabezados
Sección titulada «Encabezados»| Encabezado | Valor | Regla |
|---|---|---|
Content-Type |
application/json |
Exactamente este. application/json; charset=utf-8 se rechaza con 415 |
X-FTID-Timestamp |
Epoch UTC en segundos, p. ej. 1788523200 |
Solo dígitos, sin cero a la izquierda, como máximo 253402300799; se acepta dentro de ±300 s del reloj del servidor |
X-FTID-Request-Id |
UUIDv7 canónico en minúsculas | Nuevo en cada intento de envío; es el nonce anti-replay |
X-FTID-External-Event-Id |
El external_event_id del cuerpo |
Igual byte a byte al del cuerpo y al de la cadena firmada |
X-FTID-Signature |
v1=<key_id>:<mac> |
Una sola firma; mac tiene 64 caracteres hexadecimales en minúsculas |
No envíe estos encabezados:
| Encabezado enviado | Respuesta |
|---|---|
Content-Encoding, con cualquier valor, incluido identity |
415 unsupported-media-type |
Expect o Trailer; Host, Content-Length, Content-Type o Transfer-Encoding duplicados |
400 validation-failed |
X-Client-Id, X-Signature, X-Timestamp, X-Nonce |
401 authentication-failed |
X-FTID-Client-Id, X-FTID-Key-Id, X-FTID-Nonce, X-FTID-Event-Id, X-FTID-Business-Event-Id, X-FTID-Delivery-Id |
401 authentication-failed |
X-FTID-Assessment-Id en esta ruta |
401 authentication-failed |
Si su cliente HTTP agrega Expect: 100-continue o ; charset=... por su cuenta, desactívelo. No
comprima la solicitud.
No existe X-Client-Id, ni client_id en el cuerpo, ni elección de empresa, aplicación o
entorno por parte del cliente: todo eso se deriva del key_id una vez verificada la firma.
El cuerpo tiene dos perfiles en esta ruta, elegidos por schema_version en cada llamada:
v1.1, que nombra el momento con su propio tag, y v1, con tres recorridos fijos
(recorridos y etiquetas). v1.1 es el perfil recomendado para integraciones
nuevas y se acepta en producción; v1 se sigue admitiendo, sin cambios.
Todos los campos son obligatorios, incluidos los que aceptan null: omitir un campo no es lo
mismo que enviar null. Un campo desconocido es un error, y también lo es un campo del otro perfil.
| Campo | Formato | Regla |
|---|---|---|
schema_version |
"event-assessment-request.v1.1" o "event-assessment-request.v1" |
Selecciona el perfil |
external_event_id |
^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$ |
ID de su evento de negocio; nunca se reutiliza |
idempotency_key |
De 8 a 255 caracteres ASCII visibles (0x21–0x7E) |
Identifica la operación lógica; nunca se reutiliza |
occurred_at |
RFC 3339 con segundos, desfase explícito y hasta 3 decimales | Cuándo ocurrió el evento en su backend; una operación nueva debe estar dentro de ±300 s del reloj del servidor |
subject_ref |
Referencia opaca (misma gramática que external_event_id, como máximo 128 caracteres) o null |
Seudónimo estable de la persona en su sistema (referencias) |
account_ref |
Referencia opaca (misma gramática que external_event_id, como máximo 128 caracteres) o null. Requiere un subject_ref no nulo; de lo contrario, 400 validation-failed |
Seudónimo estable de la cuenta. Queda vinculado al subject_ref con el que se envió por primera vez (referencias) |
event_context_token |
De 1 a 4096 caracteres ASCII visibles, o null |
Token del Web SDK para esta acción; null = no se proporcionó contexto del navegador |
tag |
Solo v1.1. ^[a-z0-9][a-z0-9_]{0,63}$, con un máximo de 10 dígitos en total |
Su nombre para el momento; nunca datos personales (la etiqueta) |
journey |
Solo v1. LOGIN, WITHDRAWAL o TRADE |
El perfil v1 |
action |
Solo v1. Fijo por recorrido | El perfil v1 |
journey_context |
Solo v1. Objeto cerrado por recorrido | El perfil v1 |
deadline_ms |
Entero dentro del rango, o null |
v1.1: 250–5000 para todas las etiquetas; v1: el rango del recorrido. null usa el valor predeterminado |
Referencias de persona y de cuenta
Sección titulada «Referencias de persona y de cuenta»subject_ref nombra a la persona y account_ref nombra una cuenta de esa persona en su
sistema. Una persona puede tener varias cuentas; una cuenta pertenece exactamente a una persona.
- Constrúyalas como seudónimos con clave, en su backend. Por ejemplo, HMAC-SHA-256 sobre su
ID interno con una clave secreta que solo su backend posee, escrito en hexadecimal tras un
prefijo corto propio (
usr_…,acc_…). Un hash simple de un identificador fiscal o de un correo electrónico no es un seudónimo: cualquiera puede recalcularlo adivinando la entrada. El hexadecimal siempre cumple la gramática. base64url necesita un prefijo, porque puede empezar por-o_; el base64 estándar (+,/,=) se rechaza. La referencia completa, prefijo incluido, tiene como máximo 128 caracteres. - Mantenga el par estable. Envíe el mismo par para la misma persona y la misma cuenta en cada
llamada. Un
account_refqueda vinculado alsubject_refcon el que se envió por primera vez: el mismoaccount_refcon otrosubject_refdevuelve409 binding-conflict, y no se almacena ningún evento ni ninguna evaluación. Cambiar la clave HMAC o el prefijo crea personas nuevas y cuentas nuevas, por lo que su historial empieza de nuevo. Nunca cambie solo la clave desubject_refmanteniendoaccount_ref: en ese caso, todas las cuentas existentes devolverían409. Una clave nueva parasubject_reftambién convierte a cada persona en una segunda persona nueva en los navegadores que ya usó: durante 30 días,DEVICE_MULTI_USERcuenta ambos seudónimos, por lo que cuenta de más a las personas de esos dispositivos (esDETECTEDcon más de tres personas) hasta que los seudónimos antiguos salgan de su ventana. - Envíelas siempre que el usuario esté identificado. Envíe
subject_refen cada momento evaluado en el que su backend conozca al usuario; en un inicio de sesión, después de que su backend haya autenticado al usuario. Envíeaccount_refjunto con él cuando el momento se refiera a una de las cuentas de esa persona; siempre viaja con susubject_ref. Cada plantilla de recorrido indica qué referencias lleva su momento: una recuperación de contraseña, por ejemplo, envíaaccount_ref: null. - Qué cambian. En la consola,
account_refalimenta los ítems de cuenta de Contexto do acesso (contexto del acceso), las cuentas en Vínculos y la búsqueda por cuenta. Los 13 indicadores yevidence_coverageson los mismos con o sin él;trust_scorey la recomendación cambian solo cuando su empresa ha activado una regla de contexto sobre un ítem de cuenta (reglas de riesgo de la empresa).DEVICE_MULTI_USERcuenta personas a través desubject_ref, por lo quesubject_refcambia las respuestas de las capturas posteriores (por qué un indicador no se evaluó). - El historial empieza en el primer evento que lleva la referencia. Los eventos anteriores nunca se vinculan a ella después. El primer acceso de cada cuenta con una captura del navegador completada muestra Primeira vez: ainda sem histórico (primera vez: aún sin historial) en los ítems que se comparan con el pasado de la cuenta; sin una captura del navegador completada, muestran Sem coleta concluída do navegador (sin captura del navegador completada). Un inicio de sesión posterior evalúa Dispositivo novo para esta conta solo cuando un acceso anterior de la misma cuenta en los últimos 90 días también tuvo una captura del navegador cuya instalación del navegador quedó vinculada; una cuenta inactiva durante más de 90 días vuelve a mostrar Primeira vez.
- Una cuenta por persona. Si su producto tiene una sola cuenta por persona, envíe igualmente ambas, con un seudónimo distinto y estable para la cuenta.
Reglas de bytes del cuerpo
Sección titulada «Reglas de bytes del cuerpo»- Como máximo 16384 bytes, contados antes de cualquier análisis o verificación de firma. Por
encima de eso:
413 payload-too-large. - UTF-8 sin BOM, un único documento JSON, nada después de él y ninguna clave duplicada en ningún nivel (incluidas las claves que solo se vuelven iguales después de deshacer el escape).
- Solo objetos, cadenas,
nully enteros; los arrays y los booleanos se rechazan. - Los números deben tener un valor entero exacto y seguro (hasta 9007199254740991). Envíe enteros simples.
- La firma y el servidor leen los mismos bytes. Serialice una sola vez, con una única llamada
a
JSON.stringify, conserve los bytes, y firme y envíe exactamente esos bytes.
Ejemplos de solicitud
Sección titulada «Ejemplos de solicitud»Un ejemplo sintético v1.1. Cada plantilla de recorrido tiene el suyo.
{ "schema_version": "event-assessment-request.v1.1", "external_event_id": "evt_login_0001", "idempotency_key": "idem_evt_login_0001", "occurred_at": "2026-11-03T14:05:22.481Z", "subject_ref": "usr_5c0e", "account_ref": "acc_77d2", "event_context_token": "ect_login_0001", "tag": "login", "deadline_ms": null}Ejemplos sintéticos v1, uno por recorrido.
{ "schema_version": "event-assessment-request.v1", "external_event_id": "login_20260904_000001", "idempotency_key": "idem_login_20260904_000001", "occurred_at": "2026-09-04T12:00:00Z", "subject_ref": "subject_123", "account_ref": "account_456", "event_context_token": "ect_login_20260904_000001", "journey": "LOGIN", "action": "LOGIN_ATTEMPT", "journey_context": {}, "deadline_ms": null}{ "schema_version": "event-assessment-request.v1", "external_event_id": "withdrawal_20260904_000001", "idempotency_key": "idem_withdrawal_20260904_000001", "occurred_at": "2026-09-04T12:00:00Z", "subject_ref": "subject_123", "account_ref": "account_456", "event_context_token": "ect_withdrawal_20260904_000001", "journey": "WITHDRAWAL", "action": "WITHDRAWAL_REQUEST", "journey_context": { "amount_minor": 150000, "currency": "BRL", "beneficiary_ref": "beneficiary_789" }, "deadline_ms": 1000}{ "schema_version": "event-assessment-request.v1", "external_event_id": "trade_20260904_000001", "idempotency_key": "idem_trade_20260904_000001", "occurred_at": "2026-09-04T12:00:00Z", "subject_ref": "subject_123", "account_ref": "account_456", "event_context_token": "ect_trade_20260904_000001", "journey": "TRADE", "action": "TRADE_REQUEST", "journey_context": {}, "deadline_ms": 750}Los ejemplos están formateados para facilitar la lectura. En la llamada real, envíe el JSON
compacto que produce JSON.stringify(object).
Siguiente paso: autenticación HMAC.