Recursos

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.

Última actualización: 15 de mayo de 2026Audiencia: equipo técnico, área de integraciónSpec OpenAPI interactivo →
Descargar PDF

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 /validate

Las 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étodoPathDescripciónAuth
POST/api/v1/validateConsulta puntual contra todas las listas activas
POST/api/v1/reporte-loteGenera PDF agregado de un cargue masivo
GET/api/v1/reporte/{consulta_id}Descarga PDF del reporte auditable
GET/api/v1/consultasLista las consultas históricas del cliente (filtros: desde, severidad, referencia_externa, sujeto_obligado_nit)
GET/api/v1/cuenta/consumoContador del paquete, periodo vigente y estado de cobro
GET/api/v1/cuenta/consumo/historialPeriodos anteriores
GET/api/v1/cuenta/alertasConfiguración de alertas y eventos del periodo
PUT/api/v1/cuenta/alertasConfigurar umbrales, emails y webhook
POST/api/v1/cuenta/alertas/webhook/rotar-secretoRotar el secreto del webhook
POST/api/v1/cuenta/alertas/pruebaEnviar un evento de prueba a los canales
GET/api/v1/healthEstado del servicio (público)público

4. Schemas — Request

ValidateRequest · POST /api/v1/validate

CampoTipoReq.DescripciónValores
tipoenumTipo de sujeto a validar.natural · juridica
nombrestringNombre 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.tipoenumTipo de documento. Si se incluye y hay match por documento, severidad escala automáticamente.CC · CE · NIT · PAS
documento.numerostringNúmero de documento (sin guiones ni espacios). Mínimo 3 caracteres.
fecha_nacimientodateYYYY-MM-DD. Opcional para personas naturales.1985-03-15
paisstringCódigo país ISO 3166-1 alpha-2 (2 letras).CO · US · MX · ES …
referencia_externastringSu 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_socialstringRazó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.nitstringNIT 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)stringClave ú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

CampoTipoReq.DescripciónValores
consulta_idsarray<uuid>UUID de las consultas previamente ejecutadas. Máximo 500 por lote.
titulostringTí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

CampoTipoReq.DescripciónValores
consulta_iduuidIdentificador interno de la consulta. Persiste 10 años.
severidadenumSeveridad global derivada de los matches.alto · medio · bajo · informativo · sin_hallazgo
total_matchesintegerCantidad de coincidencias encontradas.0+
consulta_parcialbooleantrue si la consulta trajo solo nombre o solo documento.true · false
matchesarray<MatchItem>Detalle de coincidencias. Ver schema MatchItem.
hash_reportestringSHA-256 hex del reporte. Usable para verificación independiente.64 chars hex
sujeto_obligadoobject | nullEl sujeto obligado enviado, normalizado.{ razon_social, nit } · null
referencia_externastring | nullLa referencia enviada.
listas_consultadasarray<ListaConsultada>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_reportedatetimeTimestamp de la consulta en UTC.2026-09-08T14:32:00Z
clientestringNombre 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

CampoTipoReq.DescripciónValores
listastringSlug único de la lista. Estable a lo largo del tiempo.onu_consolidated · csn_colombia · pep_colombia · ofac_sdn · eu_consolidated …
lista_nombrestringNombre legible de la lista.
tierenumTier normativo. Determina la consecuencia legal.1_vinculante · 2_obligatoria · 3_referencia · 4_kyc_nacional
vinculante_colombiabooleanTrue si la consulta es legalmente exigible en Colombia.true · false
nombre_coincidenciastringNombre o alias de la entrada en lista que generó el match.
scorenumberScore combinado Jaro-Winkler 70% + Levenshtein 30%. 0.0 a 1.0.0.0 ≤ x ≤ 1.0
resultadoenumTipo de coincidencia.exacto (≥ 0.95) · posible (0.70 - 0.95)
fundamento_legalstringReferencia o programa que justifica la inclusión del nombre en la lista."UN Resolution 1267" · "SDNTK" · null
match_porenumPor qué campo coincidió.nombre · documento
documento_coincidenciaobject | nullDocumento que trae la ENTRADA de la lista (dato de la coincidencia, no identidad confirmada).{ tipo, numero, pais }
derivadobooleantrue si salió del segundo pase (revalidación con el dato complementario hallado).true · false
derivado_deobject | nullDe qué dato y lista se derivó.{ tipo, valor, lista_nombre }

ConsultaResumen · elemento de GET /api/v1/consultas

CampoTipoReq.DescripciónValores
consulta_iduuidIdentificador de la consulta.
nombre_consultadostringNombre original consultado.
documento_consultadostringDocumento concatenado (tipo+número)."CC 1077089147" · null
severidadenumSeveridad global de la consulta.alto · medio · bajo · informativo · sin_hallazgo
total_matchesintegerTotal de coincidencias.0+
referencia_externastringReferencia enviada en /validate.
sujeto_obligado_razon_socialstringSujeto obligado final.
sujeto_obligado_nitstringNIT normalizado.
creada_endatetimeTimestamp UTC.

6. Enums y valores aceptados

Severidad global

altoCoincidencia exacta en lista vinculante (Tier 1). Bloqueo + ROS UIAF.
medioCoincidencia exacta en lista obligatoria (Tier 2: PEP) o no vinculante (Tier 3: por ejemplo OFAC o UE).
bajoCoincidencia posible (puntaje 0.70 - 0.95). Sin coincidencia exacta.
informativoCoincidencia solo en referencia internacional sin vinculancia local.
sin_hallazgoSin coincidencias.

Tier (clasificación normativa de la lista)

1_vinculanteListas vinculantes legalmente en Colombia (ONU, CSN Colombia).
2_obligatoriaListas obligatorias sin fuente única (PEP Colombia via SIGEP).
3_referenciaListas 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

CCCédula de Ciudadanía (personas naturales colombianas).
CECédula de Extranjería.
NITNúmero de Identificación Tributaria (personas jurídicas).
PASPasaporte.

Resultado del match

exactoPuntaje ≥ 0.95. Coincidencia con muy alta probabilidad.
posiblePuntaje 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.

HTTPerrorDescripción y cómo corregir
400invalid_jsonEl cuerpo no es JSON válido.
400validation_errorPayload inválido. Revisa el campo issues (path + message) para detalle por campo.
400sujeto_obligado_requeridoEl cliente opera para terceros y falta sujeto_obligado { razon_social, nit }.
400idempotency_key_invalidaIdempotency-Key vacía, con espacios o de más de 64 caracteres.
401invalid_api_keyAPI key faltante, mal formada, revocada o de cliente inactivo. Verifica el header Authorization.
402paquete_vencido_sin_pagoCuenta 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.
404not_foundRecurso no encontrado o no pertenece al cliente autenticado.
409idempotency_errorLa Idempotency-Key ya se usó con un cuerpo distinto. Use una clave nueva.
409sin_plan_asignadoGET /cuenta/consumo de un cliente sin paquete asignado. /validate funciona igual.
500persistencia_errorLa consulta corrió pero no se guardó; no se cobró. Reintente con la misma Idempotency-Key.
500db_errorError 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.