Recursos

Diccionario · Versión 1.4

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 septiembre 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 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
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 }

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

CampoTipoReq.DescripciónValores
modalidadenumModalidad del contrato de consumo (campo de la raíz de la respuesta). Con bolsa, plan y periodo vienen en null.mensual · bolsa
bolsa.estadoenumvigente se puede consultar; agotada y vencida están cortadas: POST /validate responde 402.vigente · agotada · vencida
bolsa.bloqueadabooleantrue si la bolsa está agotada o vencida.true · false
bolsa.activada_endatetimeMomento en que se activó la bolsa vigente.2026-09-14T20:38:51Z
bolsa.vence_endatetimeVencimiento: 6 meses desde la entrega de credenciales.2027-03-14T20:38:51Z
bolsa.dias_para_vencerintegerDías que faltan para el vencimiento, redondeado hacia arriba; 0 si ya venció.0+
bolsa.consultas_compradasintegerConsultas compradas en esta bolsa.20000
bolsa.consumidasintegerConsultas cobrables desde activada_en. Nunca supera las compradas.0+
bolsa.saldointegerconsultas_compradas − consumidas. Nunca negativo: no hay excedente.0+
bolsa.precio_totalnumberPrecio pagado por la bolsa, COP sin IVA.1400000
bolsa.precio_unitarionumberprecio_total / consultas_compradas.70
bolsa.pago_referenciastringReferencia del pago que abrió la bolsa."CC-0042"

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».

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.