Recursos

Diccionario · Versión 1.5

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: 5 de octubre 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 restrictivas nacionales e internacionales. 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 son por cliente (workspace ONE o externo), con formato vk_ + 64 caracteres hexadecimales, y en base de datos solo queda su hash SHA-256. El cliente las genera, regenera y revoca en el portal de clientes (/portal). Si pierdes la clave en texto plano no se puede recuperar: se regenera, y la anterior sigue válida 24 horas.

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 mensual (periodo vigente y estado de cobro) o de la bolsa prepagada (saldo, sin periodo)
GET/api/v1/cuenta/consumo/historialPeriodos anteriores, o bolsas anteriores si la modalidad es bolsa
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
tipoenumSíTipo de sujeto a validar.natural · juridica
nombrestring—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.tipoenum—Tipo de documento. Si se incluye y hay match por documento, severidad escala automáticamente.CC · CE · NIT · PAS
documento.numerostring—Número de documento (sin guiones ni espacios). Mínimo 3 caracteres.—
fecha_nacimientodate—YYYY-MM-DD. Opcional para personas naturales.1985-03-15
paisstring—Código país ISO 3166-1 alpha-2 (2 letras).CO · US · MX · ES …
referencia_externastring—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_socialstring—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.nitstring—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

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

CampoTipoReq.DescripciónValores
consulta_iduuidSíIdentificador interno de la consulta. Persiste 10 años.—
severidadenumSíSeveridad global derivada de los matches.alto · medio · bajo · informativo · sin_hallazgo
total_matchesintegerSíCantidad de coincidencias encontradas.0+
consulta_parcialbooleanSítrue si la consulta trajo solo nombre o solo documento.true · false
matchesarray<MatchItem>SíDetalle de coincidencias. Ver schema MatchItem.—
hash_reportestringSíSHA-256 hex del reporte. Usable para verificación independiente.64 chars hex
sujeto_obligadoobject | nullSíEl sujeto obligado enviado, normalizado.{ razon_social, nit } · null
referencia_externastring | nullSíLa referencia enviada.—
listas_consultadasarray<ListaConsultada>SíVersión de cada lista contra la que corrió la consulta: slug, nombre, tier, version_id, hash_contenido, fetched_en, total_entradas y fuente_publicada_en (cuándo la fuente declara haber publicado; null si no lo declara). Queda grabada; el PDF la lee de ahí.—
fecha_reportedatetimeSíTimestamp de la consulta en UTC.2026-09-08T14:32:00Z
clientestringSí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

CampoTipoReq.DescripciónValores
listastringSíSlug único de la lista. Estable a lo largo del tiempo.onu_consolidated · csn_colombia · pep_colombia · ofac_sdn · eu_consolidated …
lista_nombrestringSíNombre legible de la lista.—
tierenumSíTier normativo. Determina la consecuencia legal.1_vinculante · 2_obligatoria · 3_referencia · 4_kyc_nacional
vinculante_colombiabooleanSíPropiedad de la lista en el catálogo: true para ONU, CSN Colombia y PEP. En OFAC, UE y FTO vale false porque su carácter vinculante no lo fija el catálogo: depende del supervisor del sujeto obligado. Para esas listas, lea vinculancia.true · false
vinculanciaobject | nullSíRótulo de una coincidencia con OFAC, UE o FTO. Muestre rotulo y efecto junto al resultado. null en ONU, CSN y PEP.{ rotulo, codigo (T2 · T3), categoria (k1 terrorismo · k2 resto), efecto, version }
nombre_coincidenciastringSíNombre o alias de la entrada en lista que generó el match.—
scorenumberSíScore combinado Jaro-Winkler 70% + Levenshtein 30%. 0.0 a 1.0.0.0 ≤ x ≤ 1.0
resultadoenumSíTipo de coincidencia.exacto (≥ 0.95) · posible (0.70 - 0.95)
fundamento_legalstring—Referencia o programa que justifica la inclusión del nombre en la lista."UN Resolution 1267" · "SDNTK" · null
match_porenumSíPor qué campo coincidió.nombre · documento
documento_coincidenciaobject | null—Documento que trae la ENTRADA de la lista (dato de la coincidencia, no identidad confirmada).{ tipo, numero, pais }
derivadobooleanSítrue si salió del segundo pase (revalidación con el dato complementario hallado).true · false
derivado_deobject | null—De qué dato y lista se derivó.{ tipo, valor, lista_nombre }

BolsaConsumo · campo bolsa de GET /api/v1/cuenta/consumo (modalidad bolsa)

CampoTipoReq.DescripciónValores
modalidadenumSíModalidad del contrato de consumo (campo de la raíz de la respuesta). Con bolsa, plan y periodo vienen en null.mensual · bolsa
bolsa.estadoenumSívigente se puede consultar; agotada y vencida están cortadas: POST /validate responde 402.vigente · agotada · vencida
bolsa.bloqueadabooleanSítrue si la bolsa está agotada o vencida.true · false
bolsa.activada_endatetimeSíMomento en que se activó la bolsa vigente.2026-09-14T20:38:51Z
bolsa.vence_endatetimeSíVencimiento: 6 meses desde la entrega de credenciales.2027-03-14T20:38:51Z
bolsa.dias_para_vencerintegerSíDías que faltan para el vencimiento, redondeado hacia arriba; 0 si ya venció.0+
bolsa.consultas_compradasintegerSíConsultas compradas en esta bolsa.20000
bolsa.consumidasintegerSíConsultas cobrables desde activada_en. Nunca supera las compradas.0+
bolsa.saldointegerSíconsultas_compradas − consumidas. Nunca negativo: no hay excedente.0+
bolsa.precio_totalnumberSíPrecio pagado por la bolsa, COP sin IVA.1400000
bolsa.precio_unitarionumberSíprecio_total / consultas_compradas.70
bolsa.pago_referenciastringSíReferencia del pago que abrió la bolsa."CC-0042"

ConsultaResumen · elemento de GET /api/v1/consultas

CampoTipoReq.DescripciónValores
consulta_iduuidSíIdentificador de la consulta.—
nombre_consultadostringSíNombre original consultado.—
documento_consultadostring—Documento concatenado (tipo+número)."CC 1077089147" · null
severidadenumSíSeveridad global de la consulta.alto · medio · bajo · informativo · sin_hallazgo
total_matchesintegerSíTotal de coincidencias.0+
referencia_externastring—Referencia enviada en /validate.—
sujeto_obligado_razon_socialstring—Sujeto obligado final.—
sujeto_obligado_nitstring—NIT normalizado.—
creada_endatetimeSíTimestamp UTC.—

6. Enums y valores aceptados

Severidad global

altoExacto en lista vinculante (Tier 1), o exacto con una designación de terrorismo de EE. UU. o de la UE (rótulo VERIFIQUE CON SU SUPERVISOR).
medioExacto en lista obligatoria (Tier 2: PEP) o en el resto del Tier 3 (rótulo LISTA RESTRICTIVA).
bajoCoincidencia posible (puntaje 0.70 - 0.95). Sin coincidencia exacta.
informativoReservado: el motor SARLAFT no emite hoy esta severidad.
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 internacionales (OFAC, UE, FTO) cuyo carácter vinculante depende del supervisor del sujeto obligado. El nombre del valor se conserva por compatibilidad. El detalle lo declara el documento «Explicación de listas de consulta».

Modalidad de consumo

mensualPaquete de consultas por mes calendario (America/Bogotá). El contador vuelve a cero el día 1.
bolsaBolsa prepagada con vencimiento (6 meses desde la entrega de credenciales). Se corta con lo primero: se agota o vence. Sin excedente, sin arrastre y sin bloqueo por mora.

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, vencida (regenerada hace más de 24 horas) o de cliente inactivo. Verifica el header Authorization.
402paquete_vencido_sin_pagoSolo paquete mensual. 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.
402bolsa_agotadaBolsa prepagada: se usaron todas las consultas compradas. La consulta rechazada no se registró ni se cobró. Compre una bolsa nueva con soporte.
402bolsa_vencidaBolsa prepagada: llegó a su vencimiento, aunque quede saldo. Compre una bolsa nueva con soporte.
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 mensual ni bolsa prepagada. /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.