NexoID

Qué cambia, y cuándo

Cambios de la API de NexoID

Lo que cambia para quien integra, versión a versión. No es la bitácora de operación —esa vive en docs/operacion/bitacora.md y es interna— ni el registro de decisiones, que son los ADR.

🔒 Política de cambios (§15.7). Un cambio aditivo —un campo nuevo en una respuesta, un endpoint nuevo, un valor nuevo en un enum— no sube la versión mayor y puede llegar cualquier día: tu integración tiene que ignorar lo que no conoce. Un cambio incompatible abriría /v2, y /v1 seguiría sirviendo doce meses. Hoy no existe /v2 ni está previsto.

1.29.1 · 2026-10-13

1.29.0 · 2026-10-13

1.28.0 · 2026-10-10

1.27.0 · 2026-10-09

1.26.0 · 2026-10-08

1.25.1 · 2026-10-08

1.25.0 · 2026-10-08

1.24.0 · 2026-10-08

1.23.0 · 2026-10-08

1.22.0 · 2026-10-07

1.21.0 · 2026-10-06

1.20.0 · 2026-10-06

1.19.0 · 2026-10-06

1.18.0 · 2026-10-06

1.17.0 · 2026-10-06

1.16.0 · 2026-10-05

1.15.0 · 2026-10-04

El tipo de cambio dice de dónde viene cada cotización. Desde el 3 de octubre el BCRP no responde a las consultas automatizadas. Mientras dure, la cotización del día sale de la SUNAT, que publica el mismo tipo de cambio de la SBS.

1.14.0 · 2026-10-04

Sin cambios en la API. Dos cosas nuevas en el panel de tu cuenta, /cuenta:

1.13.0 · 2026-10-03

Sin cambios en la API. Dos cosas alrededor de ella:

1.12.1 · 2026-10-03

Sin cambios en la API. Desplegar una versión nueva ya no deja peticiones esperando: la nueva arranca junto a la anterior y la sustituye cuando está lista. Hasta ahora, una consulta que llegaba justo en el cambio podía tardar hasta 15 s o quedarse sin respuesta.

1.12.0 · 2026-10-03

Nuevo, y aditivo: la cuota del mes en cada respuesta.

1.11.1 · 2026-10-03

Sin cambios en la API. El padrón del 2026-10-03 no se publicó: el archivo de la SUNAT traía un RUC repetido y la carga se detuvo. Hasta que se publique de nuevo, la API sirve el del 2026-10-02 con su fecha_dato. Ahora un RUC repetido se publica una vez, con su fila activa.

1.11.0 · 2026-09-27

Nuevo, y aditivo: las bolsas prepago.

1.10.1 · 2026-09-27

Sin cambios en la API.

1.10.0 · 2026-09-27

Sin cambios en la API. https://nexoid.victorllerena.com/ sirve ahora la página del producto: qué ofrece cada API, los precios y cómo empezar. La documentación sigue en /docs, el estado en /estado y la API en /id/v1. El plan gratuito pasa de 500 a 1,000 consultas al mes.

1.9.7 · 2026-09-26

Sin cambios en la API. Los ejemplos de la documentación —el portal, las guías, el contrato y la colección de Postman— usan ahora el DNI del titular del servicio (72492353, RUC 10724923530) y el sintético 99999999, en vez de un documento que no le pertenecía. El ejemplo de la ficha de DNI del contrato trae además su RUC con el dígito verificador correcto: 10999999994. Si copiaste alguno de los ejemplos anteriores en tus tests, sustitúyelo por estos.

1.9.6 · 2026-09-26

Sin cambios en la API. Si una petición se queda sin respuesta durante un despliegue, ahora falla en segundos en vez de esperar hasta el timeout de tu cliente: a los 15 s, un GET se reintenta contra la instancia nueva y un POST recibe un 504. Un 504 en un POST /ruc/batch o /dni/batch significa que el lote pudo llegar a procesarse; repítelo con la misma Idempotency-Key para no consultar dos veces. Ninguna consulta legítima de la API se acerca a ese límite: la más lenta medida en producción tardó 4.7 s.

1.9.5 · 2026-09-25

Sin cambios en la API. Un despliegue ya no deja caer peticiones con cuerpo: antes, un POST /ruc/batch o POST /dni/batch que llegara justo cuando se retiraba la instancia saliente podía recibir un 502, porque esa instancia a veces no terminaba de apagarse y lo que le entraba no lo contestaba nadie. Ahora se la saca de la circulación antes de pararla, y tu petición espera los segundos del cambio en vez de fallar. Esto corrige lo que decía la nota de 1.9.3.

1.9.4 · 2026-09-24

Sin cambios en la API. Cambios internos de operación: los avisos de latencia que genera un despliegue salen con menos severidad y lo dicen, y hay un informe de los objetivos de latencia con su muestra.

1.9.3 · 2026-09-24

Sin cambios en la API. Un despliegue retiene menos tiempo tus peticiones: la instancia saliente tiene 2 s para pararse, en vez de 10. Si una consulta de DNI que sale al proveedor externo sigue en curso justo en ese momento, puede recibir un 502; se reintenta sin más.

1.9.2 · 2026-09-24

El contrato OpenAPI dice por fin lo que la API devuelve, en las 21 operaciones. Hasta hoy solo se contrastaban las fichas de RUC y DNI con respuestas reales; el resto se escribió a mano y había envejecido. Las respuestas no cambian —salvo una, abajo—: cambia su descripción. Si generaste tipos desde /openapi.json, regenéralos.

Dónde El contrato decía Lo que se devuelve, y ahora se declara
WatchLista rucs, creado_en vigilados
WatchEvento tipo, valor_antes, valor_despues evento, campo, antes, despues, fecha_dato
POST /watch/listas y POST /watch/webhooks 200 201
/me, /uso y Watch meta con origen obligatorio meta con solo request_id (MetaDeRespuesta)
/ruc/buscar sin resumen, cuatro campos y un parámetro limite resumen, los campos de ubicación, y sin limite: el servicio siempre devolvió como mucho 20 y lo ignoraba
/tipo-cambio/rango sin resumen resumen.dias y resumen.limite
/tipo-cambio — meta.fecha_solicitada, meta.antiguedad_dias y meta.aviso
/health hora, dependencias sin forma fuentes con su umbral y dependencias campo a campo
/me, /uso, agregar y quitar RUC, probar un webhook objetos sin propiedades cada campo declarado

El único cambio en una respuesta: /uso → consultas.por_servicio es un mapa servicio → consultas, y cuando estaba vacío salía como lista ([]). Ahora sale como objeto ({}). Si lo recorrías como lista, léelo como mapa.

1.9.1 · 2026-09-24

Un campo más en /health, aditivo. fuentes.padron_extendido aparece ahora siempre —también como sin_datos si nunca se cargó— y trae su umbral_h: 840 horas, 35 días. Pasado ese plazo sale como degradado. Como el tipo de cambio, informa y no cambia estado: el padrón extendido es mensual y de un tercero, y sin él la API sigue resolviendo; lo que envejece es el ubigeo y la ficha ampliada.

Si tu monitor mira solo estado, no notas nada. Si recorre fuentes, ahora hay una más con umbral.

1.9.0 · 2026-09-23

🚩 Un código de error nuevo en Watch, y un despliegue que ya no te corta.

Nada más cambia: las 21 operaciones, sus respuestas y el resto de los códigos son los mismos.

1.8.0 · 2026-09-21

🚩 Dos cambios en la entrega de webhooks de Watch. Ninguno cambia un endpoint ni una respuesta de la API, pero pueden alcanzar a tu receptor:

Si tu receptor sigue una de las dos cosas de arriba, verás las entregas en pendiente y, a los 20 fallos seguidos, el endpoint deshabilitado con motivo: entregas_fallidas, como siempre.

1.7.0 · 2026-09-20

Para quien integra, no cambia nada. Las 21 operaciones, sus respuestas y sus códigos de error son los mismos; el contrato generado solo cambia el número de versión.

Lo que cambió es cómo se prueba el servicio antes de que te llegue: un entorno de staging, junto a producción, donde se provoca a propósito lo que aquí no se puede —el proveedor externo caído, el circuito abierto, el presupuesto agotado— contra un doble del proveedor, sin gastar crédito real ni enviar un documento a nadie.

🚩 Un detalle de Watch que te beneficia sin que hagas nada. Si el cálculo de cambios del padrón fallaba por un error interno, antes se registraba como aviso y no se reintentaba: podías quedarte un día sin los webhooks de ese día. Ahora se reintenta y el fallo nos llega. Y la cadena entera —del padrón nuevo al webhook firmado— se ha ensayado de punta a punta contra un receptor que verifica la firma exactamente como describe esta documentación.

1.6.0 · 2026-09-20

Para quien integra, no cambia nada. Las 21 operaciones, sus respuestas y sus códigos de error son exactamente los mismos, y el contrato generado solo cambia el número de versión que lleva dentro. Esta entrada existe porque el changelog documenta todas las versiones que se sirven, también las que no te piden hacer nada.

Lo que cambió es el panel de operación, que es interno: una página de puesta en marcha que dice qué falta configurar y qué código de error produce cada ausencia, cuatro gráficos en el escritorio, y un repaso de todos sus textos.

🚩 Un detalle que sí puede alcanzarte, aunque no es de la API. El estado fallido de una entrega de webhook, que la base admitía y ningún código escribía, se ha retirado. Si alguna vez leíste ese valor en algún sitio: no existía. Una entrega fallida con reintento pendiente es pendiente; una sin reintentos, descartado.

1.5.0 · 2026-09-20

Es un campo nuevo en una respuesta, así que es aditivo: si tu integración ignora lo que no conoce, no tienes que hacer nada.

Lo demás de esta versión es interno y no cambia la API: Watch en el panel, el expediente de los ejercicios ARCO, la factura final de una suscripción cancelada y el detector de disco.

1.4.0 · 2026-09-20

Ningún cambio es incompatible: lo que se servía antes se sigue sirviendo igual.

1.3.0 · 2026-09-19

1.2.0 · 2026-09-19

1.1.2 · 2026-09-19

La versión que estás leyendo la sirve este mismo despliegue: aparece en el pie, en /id/v1/health y dentro del contrato.