Diccionario · Versión 1.2
Diccionario de datos del API
Campos de entrada y salida del API de MéTRIK Valida, tipos, formato esperado, valores aceptados y ejemplos. Documento para tu equipo de integración técnica.
1. Introducción
MéTRIK Valida expone un API REST sobre HTTPS para consulta SARLAFT contra listas vinculantes y de referencia. Este documento describe cada endpoint, los campos esperados en cada request, los campos retornados en cada response, los valores aceptados por cada enum y los códigos de error.
- Base URL:
https://api.valida.metrikone.co - Versión vigente: v1
- Formato: JSON sobre HTTPS
- Codificación: UTF-8
- Zona horaria de timestamps: UTC ISO 8601 (
2026-05-15T14:32:00Z)
Este diccionario describe campos y valores. Cómo integrarse (quickstart, idempotencia, consumo, cobro, webhooks, concurrencia, ejemplos en curl, JavaScript y Python) está en la Guía del integrador. Referencia interactiva en /docs/referencia. Para esquema crudo OpenAPI 3.1.0, ver /api/openapi.json.
2. Autenticación
Bearer api_key
Todas las rutas /v1/ requieren Authorization: Bearer <api_key>. Las api_keys se emiten por cliente (workspace ONE o externo) con hash SHA-256 en base de datos. Si pierdes la clave en texto plano, se rota — no se puede recuperar.
Header requerido en cada request:
Authorization: Bearer <api_key>
Content-Type: application/json
Idempotency-Key: <uuid> # recomendado en POST /validateLas operaciones /admin/ usan un token distinto reservado para operaciones internas de MéTRIK. Toda respuesta trae el header X-Valida-Request-Id; cítelo en soporte.
3. Endpoints
Resumen de endpoints públicos del API.
| Método | Path | Descripción | Auth |
|---|---|---|---|
| POST | /api/v1/validate | Consulta puntual contra todas las listas activas | |
| POST | /api/v1/reporte-lote | Genera PDF agregado de un cargue masivo | |
| GET | /api/v1/reporte/{consulta_id} | Descarga PDF del reporte auditable | |
| GET | /api/v1/consultas | Lista las consultas históricas del cliente (filtros: desde, severidad, referencia_externa, sujeto_obligado_nit) | |
| GET | /api/v1/cuenta/consumo | Contador del paquete, periodo vigente y estado de cobro | |
| GET | /api/v1/cuenta/consumo/historial | Periodos anteriores | |
| GET | /api/v1/cuenta/alertas | Configuración de alertas y eventos del periodo | |
| PUT | /api/v1/cuenta/alertas | Configurar umbrales, emails y webhook | |
| POST | /api/v1/cuenta/alertas/webhook/rotar-secreto | Rotar el secreto del webhook | |
| POST | /api/v1/cuenta/alertas/prueba | Enviar un evento de prueba a los canales | |
| GET | /api/v1/health | Estado del servicio (público) | público |
4. Schemas — Request
ValidateRequest · POST /api/v1/validate
| Campo | Tipo | Req. | Descripción | Valores |
|---|---|---|---|---|
| tipo | enum | Sí | Tipo de sujeto a validar. | natural · juridica |
| nombre | string | — | Nombre completo (natural) o razón social (jurídica). Mínimo 2 caracteres. Se exige al menos uno entre nombre y documento; con uno solo la respuesta marca consulta_parcial. | — |
| documento.tipo | enum | — | Tipo de documento. Si se incluye y hay match por documento, severidad escala automáticamente. | CC · CE · NIT · PAS |
| documento.numero | string | — | Número de documento (sin guiones ni espacios). Mínimo 3 caracteres. | — |
| fecha_nacimiento | date | — | YYYY-MM-DD. Opcional para personas naturales. | 1985-03-15 |
| pais | string | — | Código país ISO 3166-1 alpha-2 (2 letras). | CO · US · MX · ES … |
| referencia_externa | string | — | Su identificador (expediente, fila del lote). Se devuelve tal cual y se filtra en GET /consultas. Máximo 128 caracteres. | "EXP-2026-00123" |
| sujeto_obligado.razon_social | string | — | Razón social del sujeto obligado final. OBLIGATORIO si el cliente API opera para terceros (agregador); el PDF se emite a su nombre. | 3 a 200 caracteres |
| sujeto_obligado.nit | string | — | NIT del sujeto obligado final. Se aceptan puntos y guion del dígito de verificación; se guarda normalizado a dígitos. | "800.123.456-7" → 8001234567 |
| Idempotency-Key (header) | string | — | Clave única por consulta (1-64 chars). Misma clave + mismo cuerpo en 24 h devuelve la misma respuesta sin cobrar; cuerpo distinto → 409. | UUID v4 |
{
"tipo": "natural",
"nombre": "Juan Pérez Gómez",
"documento": { "tipo": "CC", "numero": "1077089147" },
"fecha_nacimiento": "1985-03-15",
"pais": "CO",
"referencia_externa": "EXP-2026-00123",
"sujeto_obligado": { "razon_social": "Transportes La Sabana SAS", "nit": "800.123.456-7" }
}ReporteLoteRequest · POST /api/v1/reporte-lote
| Campo | Tipo | Req. | Descripción | Valores |
|---|---|---|---|---|
| consulta_ids | array<uuid> | Sí | UUID de las consultas previamente ejecutadas. Máximo 500 por lote. | — |
| titulo | string | — | Título del cargue (queda en el header del PDF). Máximo 200 caracteres. | "Cargue CDA mayo 2026" |
{
"consulta_ids": [
"4f8e2a91-…",
"7b2c1d83-…"
],
"titulo": "Cargue CDA mayo 2026"
}5. Schemas — Response
ValidateResponse · 200 OK
| Campo | Tipo | Req. | Descripción | Valores |
|---|---|---|---|---|
| consulta_id | uuid | Sí | Identificador interno de la consulta. Persiste 10 años. | — |
| severidad | enum | Sí | Severidad global derivada de los matches. | alto · medio · bajo · informativo · sin_hallazgo |
| total_matches | integer | Sí | Cantidad de coincidencias encontradas. | 0+ |
| consulta_parcial | boolean | Sí | true si la consulta trajo solo nombre o solo documento. | true · false |
| matches | array<MatchItem> | Sí | Detalle de coincidencias. Ver schema MatchItem. | — |
| hash_reporte | string | Sí | SHA-256 hex del reporte. Usable para verificación independiente. | 64 chars hex |
| sujeto_obligado | object | null | Sí | El sujeto obligado enviado, normalizado. | { razon_social, nit } · null |
| referencia_externa | string | null | Sí | La referencia enviada. | — |
| listas_consultadas | array<ListaConsultada> | Sí | Versión de cada lista contra la que corrió la consulta: slug, nombre, tier, version_id, hash_contenido, fetched_en, total_entradas. Queda grabada; el PDF la lee de ahí. | — |
| fecha_reporte | datetime | Sí | Timestamp de la consulta en UTC. | 2026-09-08T14:32:00Z |
| cliente | string | Sí | Nombre del cliente API autenticado. | — |
{
"consulta_id": "4f8e2a91-…",
"severidad": "sin_hallazgo",
"total_matches": 0,
"consulta_parcial": false,
"matches": [],
"hash_reporte": "a3f8d92e4b1c…",
"sujeto_obligado": { "razon_social": "Transportes La Sabana SAS", "nit": "8001234567" },
"referencia_externa": "EXP-2026-00123",
"listas_consultadas": [ { "slug": "onu_consolidated", "tier": "1_vinculante", "fetched_en": "2026-09-05T05:15:12Z", "total_entradas": 1002, "version_id": "…", "hash_contenido": "…", "nombre": "…" } ],
"fecha_reporte": "2026-09-08T14:32:00Z",
"cliente": "Plataforma Ejemplo"
}MatchItem · elemento del array matches
| Campo | Tipo | Req. | Descripción | Valores |
|---|---|---|---|---|
| lista | string | Sí | Slug único de la lista. Estable a lo largo del tiempo. | onu_consolidated · csn_colombia · pep_colombia · ofac_sdn · eu_consolidated … |
| lista_nombre | string | Sí | Nombre legible de la lista. | — |
| tier | enum | Sí | Tier normativo. Determina la consecuencia legal. | 1_vinculante · 2_obligatoria · 3_referencia · 4_kyc_nacional |
| vinculante_colombia | boolean | Sí | True si la consulta es legalmente exigible en Colombia. | true · false |
| nombre_coincidencia | string | Sí | Nombre o alias de la entrada en lista que generó el match. | — |
| score | number | Sí | Score combinado Jaro-Winkler 70% + Levenshtein 30%. 0.0 a 1.0. | 0.0 ≤ x ≤ 1.0 |
| resultado | enum | Sí | Tipo de coincidencia. | exacto (≥ 0.95) · posible (0.70 - 0.95) |
| fundamento_legal | string | — | Referencia o programa que justifica la inclusión del nombre en la lista. | "UN Resolution 1267" · "SDNTK" · null |
| match_por | enum | Sí | Por qué campo coincidió. | nombre · documento |
| documento_coincidencia | object | null | — | Documento que trae la ENTRADA de la lista (dato de la coincidencia, no identidad confirmada). | { tipo, numero, pais } |
| derivado | boolean | Sí | true si salió del segundo pase (revalidación con el dato complementario hallado). | true · false |
| derivado_de | object | null | — | De qué dato y lista se derivó. | { tipo, valor, lista_nombre } |
ConsultaResumen · elemento de GET /api/v1/consultas
| Campo | Tipo | Req. | Descripción | Valores |
|---|---|---|---|---|
| consulta_id | uuid | Sí | Identificador de la consulta. | — |
| nombre_consultado | string | Sí | Nombre original consultado. | — |
| documento_consultado | string | — | Documento concatenado (tipo+número). | "CC 1077089147" · null |
| severidad | enum | Sí | Severidad global de la consulta. | alto · medio · bajo · informativo · sin_hallazgo |
| total_matches | integer | Sí | Total de coincidencias. | 0+ |
| referencia_externa | string | — | Referencia enviada en /validate. | — |
| sujeto_obligado_razon_social | string | — | Sujeto obligado final. | — |
| sujeto_obligado_nit | string | — | NIT normalizado. | — |
| creada_en | datetime | Sí | Timestamp UTC. | — |
6. Enums y valores aceptados
Severidad global
| alto | Coincidencia exacta en lista vinculante (Tier 1). Bloqueo + ROS UIAF. |
| medio | Coincidencia exacta en lista obligatoria (Tier 2: PEP) o no vinculante (Tier 3: por ejemplo OFAC o UE). |
| bajo | Coincidencia posible (puntaje 0.70 - 0.95). Sin coincidencia exacta. |
| informativo | Coincidencia solo en referencia internacional sin vinculancia local. |
| sin_hallazgo | Sin coincidencias. |
Tier (clasificación normativa de la lista)
| 1_vinculante | Listas vinculantes legalmente en Colombia (ONU, CSN Colombia). |
| 2_obligatoria | Listas obligatorias sin fuente única (PEP Colombia via SIGEP). |
| 3_referencia | Listas no vinculantes en Colombia — estándar de facto de debida diligencia. El detalle de cuáles son lo declara el documento «Explicación de listas de consulta». |
Tipo de documento
| CC | Cédula de Ciudadanía (personas naturales colombianas). |
| CE | Cédula de Extranjería. |
| NIT | Número de Identificación Tributaria (personas jurídicas). |
| PAS | Pasaporte. |
Resultado del match
| exacto | Puntaje ≥ 0.95. Coincidencia con muy alta probabilidad. |
| posible | Puntaje 0.70 - 0.95. Requiere análisis manual del oficial de cumplimiento. |
7. Códigos de error
Toda respuesta de error tiene la misma forma: { "error": "<codigo>", "message": "<descripcion>", "doc_url": "<ancla>", "request_id": "req_…", "issues"?: [...] }. Programe contra error; message puede cambiar. No existen 429, 403 ni 503.
| HTTP | error | Descripción y cómo corregir |
|---|---|---|
| 400 | invalid_json | El cuerpo no es JSON válido. |
| 400 | validation_error | Payload inválido. Revisa el campo issues (path + message) para detalle por campo. |
| 400 | sujeto_obligado_requerido | El cliente opera para terceros y falta sujeto_obligado { razon_social, nit }. |
| 400 | idempotency_key_invalida | Idempotency-Key vacía, con espacios o de más de 64 caracteres. |
| 401 | invalid_api_key | API key faltante, mal formada, revocada o de cliente inactivo. Verifica el header Authorization. |
| 402 | paquete_vencido_sin_pago | Cuenta de cobro vencida sin pago registrado Y consumo por encima del 100% del paquete. Nunca se bloquea solo por consumo. Registre el pago con soporte; no reintente en bucle. |
| 404 | not_found | Recurso no encontrado o no pertenece al cliente autenticado. |
| 409 | idempotency_error | La Idempotency-Key ya se usó con un cuerpo distinto. Use una clave nueva. |
| 409 | sin_plan_asignado | GET /cuenta/consumo de un cliente sin paquete asignado. /validate funciona igual. |
| 500 | persistencia_error | La consulta corrió pero no se guardó; no se cobró. Reintente con la misma Idempotency-Key. |
| 500 | db_error | Error interno de lectura/escritura. Reintentar con espera exponencial; si persiste, soporte con el request_id. |
Tabla completa con "cuándo" y "qué hacer" por código en la Guía del integrador.