Vidamos

API Vidamos — cumplimiento RDA e RIPS

Versión del contrato 1.0 · generada automáticamente desde el OpenAPI que sirve la propia API en GET /openapi.json.

Disponibilidad: cualquier ruta puede responder 503 con cuerpo { "error", "codigo": "bd-arrancando", "reintentarEnSegundos" } y cabecera Retry-After mientras la base de datos despierta tras un periodo de inactividad (±20 s). Reintente pasado ese tiempo; ninguna operación se ejecutó.

API REST del motor de cumplimiento de Vidamos para prestadores y software de salud en Colombia:

Integración 100% headless: toda la operación se realiza desde el código del sistema del cliente. Los errores llegan accionables y en español (dónde está el problema en términos de negocio, qué está mal y cómo corregirlo) — ver el esquema ErrorAccionable.

La autenticación es por API key de la entidad (header X-Api-Key), emitida durante el onboarding. Las credenciales ante el Ministerio (Entra ID para IHCE, SISPRO para el MUV) son de cada entidad y se configuran una sola vez.

Cómo empezar

Servidor: https://api.vidamos.co — Producción (el host definitivo se entrega en el onboarding)

Autenticación: API key de la entidad (formato rda_…), emitida en el onboarding. Autentica al SISTEMA del prestador (anexo Res. 1888/2025, 6.2.a nivel i) con todos los permisos. Se envía en la cabecera X-Api-Key en cada petición, salvo en las de estado del servicio.

Flujo recomendado: primero POST /rips/validar o POST /rda/validar hasta que valid sea true; después la operación que transmite. Todos los hallazgos llegan en el esquema ErrorAccionable: dónde, qué y cómo corregir.

curl -X POST https://api.vidamos.co/rips/validar \
  -H "X-Api-Key: $VIDAMOS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"rips": { ... }}'

Operaciones

RIPS

Validación y radicación RIPS→MUV (Res. 948/2026)

POST /rips/validar

Validar un RIPS sin transmitir (dry-run)

Autenticación: cabecera X-Api-Key

Ejecuta la puerta local de validación (reglas del Documento Técnico 1 v003 + catálogos oficiales) SIN tocar el MUV ni persistir nada. Ideal para integrar en el flujo del cliente ANTES de radicar: se corrige hasta que valid sea true.

Cuerpo de la petición application/json

CampoTipoDescripción
rips obligatorio objeto

El RIPS en la estructura JSON del DocTec1 (§6).

Ejemplo mínimo
{
  "rips": {}
}

Respuestas

CódigoSignificadoCuerpo
200

Resultado de la validación con errores explicados.

valid (booleano), issues (lista de RipsIssue), errores (lista de ErrorAccionable)
400

Cuerpo inválido — error (y detalles cuando aplica) explican qué falta.

401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

GET /rips

Listar radicaciones de la entidad

Autenticación: cabecera X-Api-Key

Últimas 100 radicaciones (cada intento es una fila — evidencia append-only).

Respuestas

CódigoSignificadoCuerpo
200

Lista con conteos de hallazgos por fila.

items (lista de Radicacion)
401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

POST /rips

Radicar un RIPS ante el MUV (obtiene el CUV)

Autenticación: cabecera X-Api-Key

Valida localmente, transmite al Mecanismo Único de Validación con las credenciales SISPRO de la entidad y persiste la evidencia del intento. La operación del MUV se elige sola según rips.tipoNota: factura (null), NC, ND, NA (nota de ajuste, sin adjunto) o RS (RIPS sin factura, sin adjunto).

La puerta local revisa dos cosas antes de gastar el viaje al MUV: el RIPS contra el Documento Técnico 1 y el XML de la factura contra el Documento Técnico 2 (contenedor AttachedDocument con factura y ApplicationResponse embebidos, apartados obligatorios, extensión del sector salud, pagos anticipados, periodo de facturación y el cruce PFP001: el número de la factura del XML debe ser idéntico a rips.numFactura). Los rechazos salen como rechazado-local con los mismos códigos del MUV (FED*, VFE*, PFE*, PFP001, RVG018…) y su comoCorregir; las notificaciones del DocTec2 las emite el propio MUV al radicar.

Cuerpo de la petición application/json

CampoTipoDescripción
rips obligatorio objeto

El RIPS en la estructura JSON del DocTec1.

xmlFevFile texto

AttachedDocument de la FEV en base64 (el contenedor que emite el proveedor tecnológico DIAN con la factura firmada y la respuesta de validación embebidas; una factura suelta se rechaza con PFE001). Obligatorio con factura y notas NC/ND; se omite con tipoNota NA o RS (el manual exige adjunto vacío).

Ejemplo mínimo
{
  "rips": {},
  "xmlFevFile": ""
}

Respuestas

CódigoSignificadoCuerpo
200

Idempotencia: la factura (mismo numFactura y numDocumentoIdObligado) ya fue radicada por esta entidad desde Vidamos. Se devuelve la radicación existente con repetida: true, sin volver al MUV ni crear evidencia nueva (una factura tiene un solo CUV). Aplica a facturas; las notas NC/ND/NA/RS siempre van al MUV.

201

Radicado — el MUV emitió CUV.

id (texto (uuid)), estado (uno de: radicado), cuv (texto), avisos (lista de ErrorAccionable)
400

Cuerpo inválido — error (y detalles cuando aplica) explican qué falta.

401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

422

Rechazado. estado distingue el origen: rechazado-local (la puerta local lo atrapó — el MUV nunca lo vio) o rechazado (veredicto del MUV). En ambos casos errores trae la lista accionable y el intento queda como evidencia.

id (texto (uuid)), estado (uno de: rechazado-local, rechazado), errores (lista de ErrorAccionable)
502

El MUV no está disponible (no hubo radicación — reintentar).

503

Transmisión RIPS o credenciales SISPRO no configuradas para la entidad.

GET /rips/{id}

Detalle de una radicación con sus errores accionables

Autenticación: cabecera X-Api-Key

Parámetros

NombreEnTipoDescripción
id obligatoriopathtexto (uuid)

Respuestas

CódigoSignificadoCuerpo
200

La radicación completa; errores siempre viene explicado.

id (texto (uuid)), numFactura (texto), estado (uno de: radicado, rechazado), cuv (texto (puede ser null)), procesoId (entero (puede ser null)), fechaRadicacion (texto (puede ser null)), motivo (texto (puede ser null)), nErrores (entero), nAvisos (entero), createdAt (texto), errores (lista de ErrorAccionable)
401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

404

No existe (o pertenece a otra entidad — el aislamiento es total).

GET /rips/{id}/cuv

Verificar el CUV de una radicación ante el MUV (lo que consulta el pagador)

Autenticación: cabecera X-Api-Key

Consulta ConsultarCUV del Mecanismo Único de Validación (manual API-Docker v4.3 §8.14) con el obligado y el número de documento de la radicación, y compara el CUV que devuelve el Ministerio con el que Vidamos guardó. verificado es true solo si el MUV conoce el documento y el CUV coincide. La operación no requiere credenciales SISPRO: es la misma consulta que hace la entidad responsable de pago.

Parámetros

NombreEnTipoDescripción
id obligatoriopathtexto (uuid)

Respuestas

CódigoSignificadoCuerpo
200

Resultado de la verificación.

id (texto (uuid)), numFactura (texto), cuv (texto), verificado (booleano), registro (objeto (puede ser null)), consultadoEn (texto (date-time))
401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

404

No existe (o pertenece a otra entidad — el aislamiento es total).

409

La radicación no tiene CUV (fue rechazada): nada que verificar.

502

El MUV no respondió a la consulta.

503

Consulta al MUV no configurada en este ambiente.

RDA

Generación, validación y transmisión RDA→IHCE (Res. 1888/2025)

GET /rda/{id}/ihce

Recuperar el RDA propio tal como quedó registrado en IHCE

Autenticación: cabecera X-Api-Key

Consulta GET /Composition/{id}/$document del gateway (manual de operaciones v1.4 §5.5 op. 10) con el id de Composition que IHCE devolvió al aceptar el RDA, y reenvía el Bundle completo al tenant que lo transmitió. Vidamos no persiste ni registra el contenido clínico; la consulta queda en la auditoría del envío. Solo aplica a RDA aceptado.

Parámetros

NombreEnTipoDescripción
id obligatoriopathtexto (uuid)

Respuestas

CódigoSignificadoCuerpo
200

El Bundle FHIR con la Composition y sus recursos, como lo entrega IHCE.

401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

404

No existe, pertenece a otra entidad, o IHCE no encontró el documento.

409

El RDA no está aceptado (IHCE solo conserva los aceptados) o no tiene id de Composition.

502

IHCE no respondió o rechazó la consulta.

503

Credenciales IHCE no configuradas para este tenant.

POST /rda/consultas

Listar los RDA de un paciente registrados en IHCE (consulta del profesional autorizado)

Autenticación: cabecera X-Api-Key

Consulta $consultar-rda-paciente (RDA de paciente) o $consultar-rda-encuentros-clinicos (urgencias, hospitalización, consulta externa) del gateway, manual de operaciones v1.4 §5.5 op. 7 y 8. El Ministerio exige y audita quién consulta (§5.4 n.º 9): humanuser es la identificación de la persona, normalmente el profesional de la salud, y es obligatoria. Vidamos la deja en su propia auditoría como actor y no persiste el número del paciente. La respuesta se reduce a metadatos (id de Composition, VIDA, fecha, tipo); el documento completo se pide con GET /rda/{id}/ihce cuando es propio. Paginación token-based: si siguiente no es null, repita la llamada con ese valor en cursor; un cursor vencido responde 410.

Cuerpo de la petición application/json

CampoTipoDescripción
alcance uno de: paciente, encuentros
paciente obligatorio objeto
paciente.tipo obligatorio texto

Ejemplo: CC

paciente.numero obligatorio texto

Ejemplo: 000000099

humanuser obligatorio objeto

Persona que realiza la consulta (profesional de la salud). Obligatoria y auditada.

humanuser.tipo obligatorio texto

Ejemplo: CC

humanuser.numero obligatorio texto

Ejemplo: 111111199

cursor texto

El valor de siguiente de la página anterior.

Ejemplo mínimo
{
  "alcance": "paciente",
  "paciente": {
    "tipo": "CC",
    "numero": "000000099"
  },
  "humanuser": {
    "tipo": "CC",
    "numero": "111111199"
  },
  "cursor": ""
}

Respuestas

CódigoSignificadoCuerpo
200

Página de resultados.

alcance (uno de: paciente, encuentros), items (lista de objeto), siguiente (texto (puede ser null)), total (entero (puede ser null))
400

Faltan paciente o humanuser, o tienen forma inválida (detalles en español).

401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

410

El cursor de paginación venció en IHCE: repita desde la primera página.

502

IHCE no respondió o rechazó la consulta.

503

Credenciales IHCE no configuradas para este tenant.

POST /rda/validar

Validar un Bundle RDA sin transmitir (linter estructural)

Autenticación: cabecera X-Api-Key

Cuerpo de la petición application/json

CampoTipoDescripción
bundle obligatorio objeto

Bundle FHIR R4 del RDA.

Ejemplo mínimo
{
  "bundle": {}
}

Respuestas

CódigoSignificadoCuerpo
200

Issues del linter + errores explicados.

valid (booleano), issues (lista de objeto), errores (lista de ErrorAccionable)
400

Cuerpo inválido — error (y detalles cuando aplica) explican qué falta.

401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

POST /rda/validar-oficial

Validar un Bundle contra el validador oficial HL7 (conformidad de perfiles)

Autenticación: cabecera X-Api-Key

Dry-run contra el validador oficial del estándar con los paquetes minsalud.fhir.co.rda y FHIR Core CO — la vara de conformidad del Ministerio, más estricta que el linter de /rda/validar. Es pesado (arranca una JVM): pensado para diagnóstico y certificación, no para cada transmisión. Responde 503 si el ambiente no tiene validador configurado.

Cuerpo de la petición application/json

CampoTipoDescripción
bundle obligatorio objeto

Bundle FHIR R4 del RDA.

Ejemplo mínimo
{
  "bundle": {}
}

Respuestas

CódigoSignificadoCuerpo
200

Hallazgos del validador oficial, con conteo por severidad.

porSeveridad (objeto (valores: entero)), issues (lista de objeto), errores (lista de ErrorAccionable)
400

Cuerpo inválido — error (y detalles cuando aplica) explican qué falta.

401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

503

Este ambiente no tiene validador oficial configurado.

POST /rda/desde-datos

Transmitir un RDA desde datos planos (sin saber FHIR)

Autenticación: cabecera X-Api-Key

La promesa del producto: el cliente envía el modelo intermedio en español (paciente, autor, prestador, atención, diagnósticos…) y la plataforma construye el Bundle conforme a los perfiles oficiales, lo valida y lo transmite a IHCE. Si faltan datos que el perfil oficial exige, responde 400 con la lista campo por campo en español.

Cuerpo de la petición application/json

CampoTipoDescripción
tipo obligatorio uno de: paciente, consulta-externa, hospitalizacion, urgencias
datos obligatorio objeto

Modelo intermedio (documentación detallada en el onboarding).

Ejemplo mínimo
{
  "tipo": "paciente",
  "datos": {}
}

Respuestas

CódigoSignificadoCuerpo
201

Aceptado por IHCE — la respuesta incluye el número VIDA.

202

En proceso (reintento automático en curso).

400

Datos incompletos — detalles lista cada campo faltante en español.

401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

422

Rechazado — motivo y errores accionables incluidos.

GET /rda

Listar transmisiones RDA

Autenticación: cabecera X-Api-Key

Parámetros

NombreEnTipoDescripción
estadoqueryuno de: generado, validado, enviado, aceptado, rechazado

Respuestas

CódigoSignificadoCuerpo
200

Lista paginada (limit/offset) con total.

401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

POST /rda

Transmitir un Bundle RDA ya construido

Autenticación: cabecera X-Api-Key

Cuerpo de la petición application/json

CampoTipoDescripción
tipo obligatorio uno de: paciente, consulta-externa, hospitalizacion, urgencias
bundle obligatorio objeto
Ejemplo mínimo
{
  "tipo": "paciente",
  "bundle": {}
}

Respuestas

CódigoSignificadoCuerpo
201

Aceptado — incluye número VIDA.

202

En proceso.

401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

422

Rechazado — motivo incluido.

GET /rda/{id}

Detalle de una transmisión RDA (errores accionables incluidos)

Autenticación: cabecera X-Api-Key

Parámetros

NombreEnTipoDescripción
id obligatoriopathtexto (uuid)

Respuestas

CódigoSignificadoCuerpo
200

La transmisión; si fue rechazada, errores viene explicado.

401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

404

No existe o pertenece a otra entidad.

GET /rda/{id}/eventos

Trazabilidad completa de una transmisión (auditoría)

Autenticación: cabecera X-Api-Key

Parámetros

NombreEnTipoDescripción
id obligatoriopathtexto (uuid)

Respuestas

CódigoSignificadoCuerpo
200

Eventos append-only del envío (el trail que pide la Supersalud).

401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

404

No existe o pertenece a otra entidad.

GET /resumen

Resumen de cumplimiento (conteos por estado y tipo)

Autenticación: cabecera X-Api-Key

Respuestas

CódigoSignificadoCuerpo
200

porEstado y porTipo.

401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

Estado

Salud del servicio

GET /sesion

Con qué entidad, papel, módulos y permisos entra la credencial

Autenticación: cabecera X-Api-Key

Devuelve el tenant (slug, nombre, tipoEntidad, módulos contratados), la identidad (api-key, o usuario con su rol) y los permisos efectivos: los del rol cuyo módulo está contratado. El panel construye la navegación desde esta respuesta. Un módulo no contratado responde 403 con codigo/modulo en cualquiera de sus rutas.

Respuestas

CódigoSignificadoCuerpo
200

tenant, identidad y permisos.

401

Credencial inválida o ausente (X-Api-Key o Authorization: Bearer).

GET /health

Liveness

Sin autenticación

Respuestas

CódigoSignificadoCuerpo
200

ok

GET /ready

Readiness (estado real de cada dependencia)

Sin autenticación

Respuestas

CódigoSignificadoCuerpo
200

ok

503

degradado

Esquemas

ErrorAccionable

Un hallazgo explicado para humanos: DÓNDE está el problema en términos de negocio, QUÉ está mal y CÓMO corregirlo. Diseñado para que el personal operativo resuelva sin escalar a soporte.

CampoTipoDescripción
codigo texto

Código citable de la regla oficial (RVG03, RVC019, T03, RDA05…).

severidad uno de: rechazo, aviso-gradualidad, aviso-conformidad, informativo

rechazo = impide la operación, el documento no llega al Ministerio. aviso-gradualidad (RIPS) = hoy pasa pero será rechazo cuando el Ministerio lo determine (§1.6) — la radicación SÍ quedó en firme. aviso-conformidad (RDA) = el gateway lo acepta y devuelve VIDA, pero incumple los perfiles minsalud.fhir.co.rda del validador oficial — el envío NO se bloquea.

fuente uno de: linter-local, muv, linter-rda, ihce, validador-hl7
ubicacion objeto
ubicacion.factura texto
ubicacion.usuarioIndex entero

Base 0.

ubicacion.documentoUsuario texto

Identificación del paciente (ej. CC 1234567) — dato personal: no registrar en logs.

ubicacion.tipoServicio texto
ubicacion.servicioIndex entero
ubicacion.campo texto
ubicacion.campoNombre texto

Nombre de negocio del campo.

ubicacion.descripcion texto

Frase lista para mostrar: "Factura FE123 · Paciente CC 1234567 · Consulta 1 · Valor del servicio".

titulo texto

Qué está mal

explicacion texto
comoCorregir texto

Acción concreta en el sistema origen.

mensajeOriginal texto

Detalle técnico para soporte.

RipsIssue

CampoTipoDescripción
severity uno de: error, warning
regla texto

Regla oficial del DocTec1.

path texto

Ejemplo: usuarios[0].servicios.consultas[1].vrServicio

message texto

Radicacion

CampoTipoDescripción
id texto (uuid)
numFactura texto
estado uno de: radicado, rechazado
cuv texto (puede ser null)
procesoId entero (puede ser null)
fechaRadicacion texto (puede ser null)
motivo texto (puede ser null)
nErrores entero
nAvisos entero
createdAt texto

Descargas

Contrato OpenAPI 3.0 (YAML) Colección Postman v2.1

La colección trae las variables baseUrl y apiKey; la segunda se entrega en el onboarding y nunca debe compartirse ni versionarse.

Dudas de integración: contacto@vidamos.co.