@veriko-mx/sdk 0.4.11 → 0.4.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +196 -38
  3. package/dist/cjs/client.d.ts +3 -2
  4. package/dist/cjs/client.d.ts.map +1 -1
  5. package/dist/cjs/client.js +3 -2
  6. package/dist/cjs/client.js.map +1 -1
  7. package/dist/cjs/generated/openapi.d.ts +1353 -195
  8. package/dist/cjs/generated/openapi.d.ts.map +1 -1
  9. package/dist/cjs/http.d.ts +2 -0
  10. package/dist/cjs/http.d.ts.map +1 -1
  11. package/dist/cjs/http.js +1 -1
  12. package/dist/cjs/http.js.map +1 -1
  13. package/dist/cjs/index.d.ts +1 -1
  14. package/dist/cjs/index.d.ts.map +1 -1
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/cjs/resources.d.ts +104 -16
  17. package/dist/cjs/resources.d.ts.map +1 -1
  18. package/dist/cjs/resources.js +233 -34
  19. package/dist/cjs/resources.js.map +1 -1
  20. package/dist/cjs/types.d.ts +182 -22
  21. package/dist/cjs/types.d.ts.map +1 -1
  22. package/dist/cjs/types.js +6 -0
  23. package/dist/cjs/types.js.map +1 -1
  24. package/dist/esm/client.d.ts +3 -2
  25. package/dist/esm/client.d.ts.map +1 -1
  26. package/dist/esm/client.js +3 -2
  27. package/dist/esm/client.js.map +1 -1
  28. package/dist/esm/generated/openapi.d.ts +1353 -195
  29. package/dist/esm/generated/openapi.d.ts.map +1 -1
  30. package/dist/esm/http.d.ts +2 -0
  31. package/dist/esm/http.d.ts.map +1 -1
  32. package/dist/esm/http.js +1 -1
  33. package/dist/esm/http.js.map +1 -1
  34. package/dist/esm/index.d.ts +1 -1
  35. package/dist/esm/index.d.ts.map +1 -1
  36. package/dist/esm/index.js.map +1 -1
  37. package/dist/esm/resources.d.ts +104 -16
  38. package/dist/esm/resources.d.ts.map +1 -1
  39. package/dist/esm/resources.js +232 -34
  40. package/dist/esm/resources.js.map +1 -1
  41. package/dist/esm/types.d.ts +182 -22
  42. package/dist/esm/types.d.ts.map +1 -1
  43. package/dist/esm/types.js +6 -0
  44. package/dist/esm/types.js.map +1 -1
  45. package/package.json +1 -1
@@ -65,9 +65,11 @@ export interface paths {
65
65
  * - Clave de rastreo / Referencia numérica.
66
66
  * - Banco emisor.
67
67
  * - Banco receptor.
68
- * - Cuenta beneficiaria.
68
+ * - Cuenta beneficiaria, o una lista de cuentas candidatas.
69
+ *
70
+ * La cuenta beneficiaria (`cuenta_beneficiaria`) es obligatoria en esta operación, salvo que se envíe `cuentas_candidatas`. Si faltan las dos, la petición se rechaza con `422 preflight_failed` y el error de campo `cuenta_required`: el servicio no la busca entre los beneficiarios guardados.
69
71
  *
70
- * La cuenta beneficiaria (`cuenta_beneficiaria`) es obligatoria en esta operación. Si falta, la petición se rechaza con `422 preflight_failed` y el error de campo `cuenta_required`: el servicio no la busca entre los beneficiarios guardados.
72
+ * Cuando no se sabe a cuál de varias cuentas se hizo el pago, `cuentas_candidatas` sustituye a `cuenta_beneficiaria`: de 2 cuentas al máximo que admite el servicio (3 de forma predeterminada) en una sola validación y con una sola unidad de cuota. La consulta recorre las candidatas en el orden enviado y adopta la primera que coincide con la transferencia; esa cuenta vuelve completa en `normalized_data.cuenta_beneficiaria` y su posición en `candidate_match`. Si ninguna coincide, la respuesta es un estado HTTP `422` con el motivo en `code`. Las dos formas no pueden enviarse juntas (`422 cuenta_y_candidatas_excluyentes`) y una lista que no cumple se rechaza con `422 cuentas_candidatas_invalidas`, las dos antes de consumir cuota.
71
73
  *
72
74
  * El veredicto final (estado terminal) de una validación puede ser alguno de estos:
73
75
  *
@@ -135,7 +137,17 @@ export interface paths {
135
137
  *
136
138
  * {% callout type="info" %}
137
139
  * El campo `cuenta_beneficiaria` permite enviar explícitamente la cuenta receptora de la transferencia, enviarlo es especialmente útil cuando la imagen no lleva este dato o lo lleva incompleto.\
138
- * Un beneficiario guardado (con `POST /v1/beneficiaries`) no sustituye a este campo: solo sirve para completar los dígitos de la cuenta que la imagen sí muestra. Si la imagen no trae dígitos suficientes, la validación se rechaza con `cuenta_unresolvable`, porque las cuentas guardadas no se prueban una por una.
140
+ * Un beneficiario guardado (con `POST /v1/beneficiaries`) no sustituye a este campo: solo sirve para completar los dígitos de la cuenta que la imagen sí muestra. Si la imagen no trae dígitos suficientes, la validación se rechaza con `cuenta_unresolvable`, porque las cuentas guardadas no se prueban una por una.\
141
+ * \
142
+ * Cuando no se sabe cuál de varias cuentas recibió el pago, `cuentas_candidatas` las prueba en una sola validación (de 2 cuentas al máximo que admite el servicio, 3 de forma predeterminada; una sola unidad de cuota, también con `?async=1`) y sustituye a `cuenta_beneficiaria`: enviar las dos se rechaza con `422 cuenta_y_candidatas_excluyentes`, y una lista que no cumple, con `422 cuentas_candidatas_invalidas`, las dos antes de consumir cuota. La lista tiene prioridad sobre la cuenta que se lea en la imagen; la ganadora vuelve completa en `normalized_data.cuenta_beneficiaria` y su posición en `candidate_match`. Si ninguna coincide, la respuesta es un estado HTTP `422` con el motivo en `code`.
143
+ *
144
+ * {% /callout %}
145
+ *
146
+ * {% callout type="info" %}
147
+ * **Retención del comprobante:**\
148
+ * De forma predeterminada el archivo del comprobante se conserva y se sirve con `GET /v1/validations/{id}/image`. Con `retain_image=false`, se borra cuando la validación llega a un estado terminal del que ya no se necesita, y el veredicto y los datos extraídos se conservan. La validación publica `image_retained=false` y la imagen responde un estado HTTP `410` (con `image_not_retained` en el cuerpo).\
149
+ * \
150
+ * Un valor que no es booleano responde un estado HTTP `422` (con `invalid_retain_image` en el cuerpo), antes de consumir cuota. Para borrar después una validación y todo lo que dejó, está `POST /v1/validations/{id}/purge/prepare`, descrito en {% concept slug="data-retention" %}la retención de comprobantes y datos{% /concept %}.
139
151
  *
140
152
  * {% /callout %}
141
153
  *
@@ -281,6 +293,12 @@ export interface paths {
281
293
  * Si el `ETag` enviado en `If-None-Match` sigue vigente, responde con un estado HTTP `304` sin cuerpo, como describe {% concept slug="conditional-caching" %}la caché condicional{% /concept %}.
282
294
  *
283
295
  * {% /callout %}
296
+ *
297
+ * {% callout type="info" %}
298
+ * **Validaciones purgadas:**\
299
+ * Una validación purgada con `POST /v1/validations/{id}/purge/execute` responde con un estado HTTP `200` y queda como una lápida: conserva el veredicto, las fechas y el monto, y trae `purged_at`. Ya no tiene `request_data`, `ocr_result`, `banxico_result` ni archivos.
300
+ *
301
+ * {% /callout %}
284
302
  */
285
303
  get: operations["getValidation"];
286
304
  put?: never;
@@ -290,6 +308,8 @@ export interface paths {
290
308
  * @description Retira una validación del historial de validaciones del usuario autenticado.
291
309
  *
292
310
  * La eliminación es lógica, no física. Lo que quiere decir que puede seguir apareciendo en las listas como `GET /v1/validations` si se usa el filtro `with_deleted` u otros.
311
+ *
312
+ * El registro, el CEP, los datos extraídos y el archivo del comprobante se conservan. Para borrarlos de forma definitiva está `POST /v1/validations/{id}/purge/prepare`, seguido de `POST /v1/validations/{id}/purge/execute`.
293
313
  */
294
314
  delete: operations["deleteValidation"];
295
315
  options?: never;
@@ -306,7 +326,7 @@ export interface paths {
306
326
  };
307
327
  /**
308
328
  * Descargar el CEP oficial
309
- * @description Descarga el {% concept slug="cep-concept" %}Comprobante Electrónico de Pago (CEP){% /concept %} emitido por Banxico de una validación con veredicto `valid`.
329
+ * @description Descarga el {% concept slug="cep-concept" %}Comprobante Electrónico de Pago (CEP){% /concept %} emitido por Banxico de una validación con veredicto `valid`, o `returned` cuando el CEP se descargó antes de conocerse la devolución.
310
330
  *
311
331
  * El formato predeterminado es `xml`; con `format=pdf` se solicita el documento en PDF.
312
332
  *
@@ -364,6 +384,8 @@ export interface paths {
364
384
  * para que un navegador no lo abra dentro del propio origen.
365
385
  *
366
386
  * Si la validación no tiene imagen disponible, responde con un estado HTTP `404` (con `image_not_available` en el cuerpo).
387
+ *
388
+ * Si la validación se creó con `retain_image=false`, responde con un estado HTTP `410` (con `image_not_retained` en el cuerpo); si se purgó, con un estado HTTP `410` (con `validation_purged` en el cuerpo). Un `410` no se resuelve reintentando: el archivo no existe.
367
389
  */
368
390
  get: operations["getValidationImage"];
369
391
  put?: never;
@@ -416,13 +438,13 @@ export interface paths {
416
438
  * **No se admite en tres casos:**\
417
439
  * — Validaciones que llegaron por importación masiva.\
418
440
  * — Validaciones ya resueltas.\
419
- * — Validaciones fuera de la antigüedad que permite el plan.
441
+ * — Validaciones con más de siete días de antigüedad.
420
442
  *
421
443
  * {% /callout %}
422
444
  *
423
445
  * Un ciclo de reintentos puede devolver `terminal_state="exhausted"` cuando se alcanzan el máximo de reintentos configurado. También puede devolver `terminal_state="cancelled"` cuando el usuario cancela manualmente los reintentos de la validación.
424
446
  *
425
- * En ambos casos, el ciclo puede reactivarse mientras conserve reintentos disponibles.
447
+ * En ambos casos, el ciclo puede reactivarse hasta tres veces; pasado ese tope, la petición se rechaza con `422 reactivation_cap_exceeded`.
426
448
  *
427
449
  * El estado completo de una validación se obtiene con `GET /v1/validations/{id}`, y los límites están descritos en {% concept slug="retry-policy" %}la política de reintentos{% /concept %}.
428
450
  */
@@ -458,6 +480,146 @@ export interface paths {
458
480
  patch?: never;
459
481
  trace?: never;
460
482
  };
483
+ "/validations/{id}/recheck": {
484
+ parameters: {
485
+ query?: never;
486
+ header?: never;
487
+ path?: never;
488
+ cookie?: never;
489
+ };
490
+ get?: never;
491
+ put?: never;
492
+ /**
493
+ * Volver a consultar el estado de pago de una validación
494
+ * @description Vuelve a consultar a Banxico el estado del pago de una validación `valid` y, si lo reporta devuelto, la pasa a `returned`.
495
+ *
496
+ * Un veredicto `valid` es la foto del momento de la consulta: el CEP acredita que la transferencia se liquidó, no que el dinero siguiera en la cuenta del beneficiario, y la institución receptora puede devolverlo horas o días después. Esta operación hace sólo esa consulta, con los datos que la validación ya guardó:
497
+ *
498
+ * - No usa IA ni descarga otro CEP.
499
+ * - **No consume cuota** ni cuenta como una validación nueva.
500
+ * - Guarda la respuesta de Banxico en `banxico_result._payment_status`.
501
+ * - Con el estado `devuelto` o `en_proceso_devolucion`, cambia `status` y `banxico_status` a `returned`, conserva el CEP y emite el webhook `validation.returned`.
502
+ *
503
+ * Qué admite:
504
+ *
505
+ * - `valid` creada hace 72 horas como máximo: se consulta. Pasado ese plazo responde con un estado HTTP `422` (con `recheck_window_expired` en el cuerpo).
506
+ * - `returned`: responde su estado actual sin consultar a Banxico, con `meta.recheck.checked_at` en `null`.
507
+ * - Cualquier otro estado: responde con un estado HTTP `422` (con `recheck_not_eligible` en el cuerpo).
508
+ *
509
+ * Cada validación admite una consulta cada 10 minutos. Si se repite antes, responde con un estado HTTP `429` (con `recheck_rate_limited` en el cuerpo) y la cabecera `Retry-After` indica los segundos que faltan. Ese tope se suma a los de la clave de API.
510
+ *
511
+ * La respuesta es la misma validación que devuelve `GET /v1/validations/{id}`, con el resultado de la revisión en `meta.recheck`:
512
+ *
513
+ * - `checked_at`: Fecha y hora de la consulta a Banxico, en ISO 8601 UTC. `null` cuando no se consultó nada porque la validación ya estaba `returned`.
514
+ * - `changed`: `true` cuando esta consulta pasó la validación de `valid` a `returned`.
515
+ * - `previous_status`: Veredicto de Banxico antes de la consulta, `valid` o `returned`.
516
+ *
517
+ * {% callout type="info" %}
518
+ * **Si Banxico no responde:**\
519
+ * Cuando Banxico no entrega un estado legible, responde con un estado HTTP `503` (con `recheck_unavailable` en el cuerpo) y la validación conserva su intervalo: se puede reintentar de inmediato. Un `503` no dice nada sobre la transferencia.
520
+ *
521
+ * {% /callout %}
522
+ *
523
+ * El significado de `valid` y de `returned` está en {% concept slug="cep-concept" %}el CEP y sus veredictos{% /concept %}, y la entrega del evento en {% concept slug="webhooks-architecture" %}la arquitectura de webhooks{% /concept %}.
524
+ */
525
+ post: operations["recheckValidation"];
526
+ delete?: never;
527
+ options?: never;
528
+ head?: never;
529
+ patch?: never;
530
+ trace?: never;
531
+ };
532
+ "/validations/{id}/purge/prepare": {
533
+ parameters: {
534
+ query?: never;
535
+ header?: never;
536
+ path?: never;
537
+ cookie?: never;
538
+ };
539
+ get?: never;
540
+ put?: never;
541
+ /**
542
+ * Preparar el borrado definitivo de una validación
543
+ * @description Describe lo que borraría el borrado definitivo de una validación propia y emite el token con el que `POST /v1/validations/{id}/purge/execute` lo confirma. No cambia nada: la validación y sus archivos quedan como estaban.
544
+ *
545
+ * `DELETE /v1/validations/{id}` solo retira la validación del historial; el registro, el CEP, los datos extraídos y el archivo del comprobante siguen existiendo. El borrado definitivo, en dos pasos, los elimina.
546
+ *
547
+ * La respuesta incluye:
548
+ *
549
+ * - `confirmation_token`: Token de un solo uso, atado a la cuenta y a esta validación, que caduca en `expires_in` segundos.
550
+ * - `will_delete`: Lo que se borrará: el archivo, el CEP, los campos con contenido y la cantidad de registros derivados.
551
+ * - `will_keep`: Los campos que conserva la lápida en que queda la validación.
552
+ * - `cancels_pending_retries`: `true` cuando hay un ciclo de reintentos abierto, que el borrado cancela.
553
+ * - `same_image_validation_ids`: Otras validaciones de la cuenta con el mismo comprobante, que no se tocan.
554
+ * - `irreversible`: `true` siempre.
555
+ *
556
+ * Solo se admite una validación propia en un estado terminal. Una validación en curso responde un estado HTTP `409` (con `purge_validation_in_progress` en el cuerpo), y una ya purgada, un estado HTTP `410` (con `validation_purged` en el cuerpo).
557
+ *
558
+ * {% callout type="warning" %}
559
+ * **El borrado es irreversible:**\
560
+ * Lo borrado no se recupera, ni siquiera desde la plataforma. La validación queda como una lápida y **no devuelve cuota**.\
561
+ * Los respaldos de infraestructura no se alteran: conservan una copia hasta que el ciclo de respaldos la retira.
562
+ *
563
+ * {% /callout %}
564
+ *
565
+ * La lápida, lo que se borra y las limitaciones están en {% concept slug="data-retention" %}la retención de comprobantes y datos{% /concept %}.
566
+ */
567
+ post: operations["prepareValidationPurge"];
568
+ delete?: never;
569
+ options?: never;
570
+ head?: never;
571
+ patch?: never;
572
+ trace?: never;
573
+ };
574
+ "/validations/{id}/purge/execute": {
575
+ parameters: {
576
+ query?: never;
577
+ header?: never;
578
+ path?: never;
579
+ cookie?: never;
580
+ };
581
+ get?: never;
582
+ put?: never;
583
+ /**
584
+ * Ejecutar el borrado definitivo de una validación
585
+ * @description Borra de forma definitiva el contenido de una validación propia, con el token que emitió `POST /v1/validations/{id}/purge/prepare`. Es el segundo paso de un flujo de dos pasos: sin ese token no se borra nada.
586
+ *
587
+ * Se borra:
588
+ *
589
+ * - El archivo del comprobante, imagen o PDF.
590
+ * - El CEP, en XML y en PDF.
591
+ * - `request_data`, `ocr_result`, `banxico_result` y las advertencias de normalización. De `normalized_data` solo se conserva el monto.
592
+ * - Los registros derivados con datos personales: intentos de reintento, sondeos de cuenta, respuestas guardadas de `Idempotency-Key` y notificaciones de la bandeja.
593
+ * - El cuerpo enviado y la respuesta del receptor en las entregas de webhook de esa validación, y el contenido de sus notificaciones. El registro de cada entrega se conserva.
594
+ * - Los cuerpos de las filas de auditoría que nombran la validación, y el contexto libre de sus eventos de seguridad.
595
+ *
596
+ * La validación queda como una lápida: conserva `id`, `validation_type`, `status`, `banxico_status`, las fechas, `processing_time_ms`, `error_code`, el monto y `purged_at`. Con eso la cuota, las estadísticas, finanzas y el historial siguen cuadrando. **El borrado no devuelve cuota.**
597
+ *
598
+ * Después del borrado, `GET /v1/validations/{id}` responde la lápida con un estado HTTP `200` y `purged_at`. La imagen, el CEP, los reintentos y la revisión posterior responden un estado HTTP `410` (con `validation_purged` en el cuerpo), y los webhooks, los reintentos y los barridos la ignoran. Un ciclo de reintentos abierto se cancela.
599
+ *
600
+ * El token se verifica antes de borrar:
601
+ *
602
+ * - Falta, está mal formado, su firma no es válida o venció: responde un estado HTTP `422` con su código (`confirmation_token_missing`, `confirmation_token_malformed`, `confirmation_token_signature_invalid` o `confirmation_token_expired`).
603
+ * - Es de otra validación, de otra cuenta o de otra operación: responde un estado HTTP `422` (con `purge_token_mismatch` o `confirmation_token_operation_mismatch` en el cuerpo).
604
+ * - Ya se usó: responde un estado HTTP `409` (con `confirmation_token_already_used` en el cuerpo).
605
+ *
606
+ * Si la respuesta no llega, `GET /v1/validations/{id}` dice si el borrado se completó: una validación purgada trae `purged_at`. Repetir este paso sobre una validación purgada responde un estado HTTP `410`.
607
+ *
608
+ * {% callout type="warning" %}
609
+ * **El borrado es irreversible:**\
610
+ * Lo borrado no se recupera, ni siquiera desde la plataforma. Los respaldos de infraestructura no se alteran y el catálogo global de cuentas, que no guarda vínculo con la validación, no se toca.
611
+ *
612
+ * {% /callout %}
613
+ *
614
+ * Lo que se borra, la lápida y las limitaciones están en {% concept slug="data-retention" %}la retención de comprobantes y datos{% /concept %}.
615
+ */
616
+ post: operations["executeValidationPurge"];
617
+ delete?: never;
618
+ options?: never;
619
+ head?: never;
620
+ patch?: never;
621
+ trace?: never;
622
+ };
461
623
  "/public/banks": {
462
624
  parameters: {
463
625
  query?: never;
@@ -506,6 +668,41 @@ export interface paths {
506
668
  patch?: never;
507
669
  trace?: never;
508
670
  };
671
+ "/public/spei-calendar/{year}": {
672
+ parameters: {
673
+ query?: never;
674
+ header?: never;
675
+ path?: never;
676
+ cookie?: never;
677
+ };
678
+ /**
679
+ * Obtener el calendario de días inhábiles SPEI de un año
680
+ * @description Devuelve el calendario de días inhábiles SPEI de un año, con la disposición oficial de la que sale.
681
+ *
682
+ * La respuesta incluye:
683
+ *
684
+ * - `non_business_days`: Los días inhábiles que caen de lunes a viernes, en orden y con formato `YYYY-MM-DD`.
685
+ * - `source`: La disposición de la **Comisión Nacional Bancaria y de Valores (CNBV)** publicada en el **Diario Oficial de la Federación (DOF)**, con su título y su fecha de publicación.
686
+ *
687
+ * Los sábados y los domingos también son inhábiles, siempre, y no se repiten en `non_business_days`.
688
+ *
689
+ * El calendario determina el día de operación de una transferencia. El SPEI opera todos los días, pero el día hábil cambia a las 18:00 (hora del centro de México): lo enviado a partir de esa hora, en sábado, en domingo o en un día inhábil opera el siguiente día hábil. Ese día es el `operationDate` de `banxico_result`, y puede diferir de la fecha de envío.
690
+ *
691
+ * La consulta no consume cuota de validaciones. Un año sin calendario responde un estado HTTP `404` (con `spei_calendar_year_not_covered` en el cuerpo), y `meta.covered_years` lista los años disponibles. El calendario de cada año se añade cuando la CNBV publica su disposición, normalmente en diciembre del año anterior.
692
+ *
693
+ * La respuesta es cacheable: incluye la cabecera `ETag`, que puede enviarse en otra petición como `If-None-Match`; si el calendario no ha cambiado, responde con un estado HTTP `304` (sin cuerpo).
694
+ *
695
+ * La diferencia entre la fecha de envío y la de operación está en {% concept slug="timezone-handling" %}fechas y zona horaria{% /concept %}.
696
+ */
697
+ get: operations["getSpeiCalendar"];
698
+ put?: never;
699
+ post?: never;
700
+ delete?: never;
701
+ options?: never;
702
+ head?: never;
703
+ patch?: never;
704
+ trace?: never;
705
+ };
509
706
  "/beneficiaries/export": {
510
707
  parameters: {
511
708
  query?: never;
@@ -515,7 +712,7 @@ export interface paths {
515
712
  };
516
713
  /**
517
714
  * Exportar los beneficiarios de la cuenta de usuario
518
- * @description Descarga las cuentas beneficiarias del usuario autenticado como archivo, usa el mismo filtro `with_archived` que `GET /v1/beneficiaries/list-beneficiaries`.
715
+ * @description Descarga las cuentas beneficiarias del usuario autenticado como archivo, usa el mismo filtro `with_archived` que `GET /v1/beneficiaries`.
519
716
  *
520
717
  * El formato de descarga se elige con `?format` (`csv` por defecto, `xlsx` como alternativa). El tope de filas es de 100 000, y `?limit` sirve para pedir menos, nunca más.
521
718
  *
@@ -557,11 +754,11 @@ export interface paths {
557
754
  * - Tarjeta (16 dígitos): `bank_code` es opcional, se deriva del BIN.
558
755
  * - Celular/DiMo (10 dígitos): `bank_code` es **obligatorio** en el cuerpo, ya que el número por sí solo no identifica a la institución bancaria.
559
756
  *
560
- * Si la cuenta a registrar no existe previamente, se registra y responde con un estado HTTP `200`.
757
+ * Si la cuenta a registrar no existe previamente, se registra y responde con un estado HTTP `201`.
561
758
  *
562
759
  * Si se intenta registrar una cuenta activa, responde con un estado HTTP `422` (con `beneficiary_already_registered` en el cuerpo).
563
760
  *
564
- * Si existe pero está archivada, el alta la **reactiva** y responde con un estado HTTP `200` (con `meta.reactivated=true` en el cuerpo).
761
+ * Si existe pero está archivada, el alta la **reactiva** y responde con un estado HTTP `200` (con `meta.reactivated=true` en el cuerpo). Si la petición no trae `label`, la reactivación conserva el alias que la cuenta ya tenía; si lo trae, lo reemplaza.
565
762
  */
566
763
  post: operations["createBeneficiary"];
567
764
  delete?: never;
@@ -583,10 +780,12 @@ export interface paths {
583
780
  * @description Actualiza un beneficiario ya registrado. El cuerpo admite la envoltura JSON:API o un objeto plano, y lo que se envíe determina el alcance del cambio:
584
781
  *
585
782
  * - Solo `label`: Se guarda, sin tocar la cuenta.
586
- * - Un `account_number` nuevo, o el alias antiguo: vuelven a derivarse `account_type`, `bank_code` y `bank_name`. Si el nuevo número es un celular (phone), el cuerpo debe llevar `bank_code`.
587
- * - Solo `bank_code`: se aplica únicamente sobre un beneficiario de tipo celular. En una CLABE o una tarjeta el banco se deriva del número, así que el valor enviado se descarta sin error.
783
+ * - Un `account_number` nuevo: vuelven a derivarse `account_type`, `bank_code` y `bank_name`. Si el nuevo número es un celular (phone), el cuerpo debe llevar `bank_code`.
784
+ * - Solo `bank_code`: se aplica únicamente sobre un beneficiario de tipo celular. En una CLABE o una tarjeta el banco se deriva del número, así que el valor enviado se descarta sin error; si era el único campo, responde con `no_valid_fields`.
588
785
  *
589
786
  * Un cuerpo sin ningún campo editable responde con un estado HTTP `422` (con `no_valid_fields` en el cuerpo).
787
+ *
788
+ * Si el `account_number` nuevo ya está registrado para la misma cuenta de usuario, activo o archivado, responde con un estado HTTP `422` (con `beneficiary_already_registered` en el cuerpo) y el beneficiario no cambia.
590
789
  */
591
790
  put: operations["updateBeneficiary"];
592
791
  post?: never;
@@ -635,9 +834,9 @@ export interface paths {
635
834
  };
636
835
  /**
637
836
  * Descargar la plantilla de importación de beneficiarios
638
- * @description Devuelve un **archivo plantilla para la importación de beneficiarios** en el formato solicitado, con encabezados en español o inglés y filas de ejemplo para CLABE, tarjeta y celular/DiMo. Sirve de punto de partida para {% concept slug="bulk-imports" %}la importación masiva{% /concept %}.
837
+ * @description Devuelve un **archivo plantilla para la importación de beneficiarios** en el formato solicitado, con los encabezados fijos `alias`, `cuenta` y `banco` y filas de ejemplo para CLABE, tarjeta y celular/DiMo. Sirve de punto de partida para {% concept slug="bulk-imports" %}la importación masiva{% /concept %}.
639
838
  *
640
- * El idioma de los encabezados se negocia con la cabecera `Accept-Language`; de forma predeterminada se entregan en español, acepta después encabezados en ambos idiomas de forma insensible a acentos.
839
+ * Los encabezados no cambian con el idioma: la cabecera `Accept-Language` sólo elige el idioma de las filas de ejemplo y del nombre de la hoja; de forma predeterminada se entregan en español. La importación acepta después encabezados en ambos idiomas de forma insensible a acentos.
641
840
  */
642
841
  get: operations["downloadBeneficiaryImportTemplate"];
643
842
  put?: never;
@@ -659,7 +858,7 @@ export interface paths {
659
858
  put?: never;
660
859
  /**
661
860
  * Iniciar importación masiva de beneficiarios
662
- * @description Sube un archivo (CSV, XLS, XLSX, TXT o PDF) de hasta 20 MB y abre con él un trabajo de importación.
861
+ * @description Sube un archivo (CSV, XLS, XLSX, TXT, JSON o PDF) de hasta 20 MB y abre con él un trabajo de importación.
663
862
  * Las hojas XLSX/XLS admiten hasta 10 000 filas y 64 columnas. Las fórmulas XLSX se leen como texto, sin ejecutarlas. Los PDF admiten hasta 50 páginas y limitan a 8 MiB la descompresión de cada flujo.
664
863
  *
665
864
  * El modo de lectura decide cuánto trabajo hace el archivo y cuánto el servidor:
@@ -729,7 +928,7 @@ export interface paths {
729
928
  * Previsualizar las filas extraídas de la importación
730
929
  * @description Devuelve las filas extraídas del archivo en un trabajo de importación (paginadas y filtrables por grupo).
731
930
  *
732
- * Disponible solo cuando la importación está en `preview_ready` o estados posteriores con `total_rows>0`.
931
+ * Responde en cualquier estado del trabajo; antes de `preview_ready` la lista sale vacía.
733
932
  *
734
933
  * {% callout type="warning" %}
735
934
  * En este endpoint los datos de CLABEs, tarjetas o celulares NO son enmascarados. Se presume que el usuario solicitante de la importación ya tiene en su poder dichos datos, por lo que no hay motivos para tratarlos bajo nuestra política de {% concept slug="pii-masking" %}enmascarado de datos{% /concept %}
@@ -810,8 +1009,8 @@ export interface paths {
810
1009
  *
811
1010
  * Reglas de la confirmación:
812
1011
  *
813
- * - Filas `valid` y `correctable`: Se persisten (con sufijo de alias si hubo colisión de alias).
814
- * - Filas `fatal` y `duplicate_account`: Se omiten.
1012
+ * - Filas `valid` y `correctable`: Se persisten (con sufijo de alias si hubo colisión de alias). La excepción es un celular sin banco válido (`bank_code_required_for_phone` o `invalid_bank_code`): se corrige eligiendo el banco en la vista previa, y si al confirmar sigue sin banco no se guarda, queda como `fatal` con ese mismo código y cuenta en `skipped_count`.
1013
+ * - Filas `fatal` y `duplicate_account`: Se omiten, salvo una `duplicate_account` cuya cuenta está archivada, que se reactiva.
815
1014
  * - Cuentas previamente archivadas con el mismo número: Se reactivan en lugar de duplicarse.
816
1015
  */
817
1016
  post: operations["commitBeneficiaryImport"];
@@ -860,9 +1059,9 @@ export interface paths {
860
1059
  * Obtener métricas de uso de la API
861
1060
  * @description Devuelve las métricas de uso de la API del usuario autenticado:
862
1061
  *
863
- * - Peticiones a la API hoy y en el mes.
1062
+ * - Peticiones con clave de API hoy y en el mes.
864
1063
  * - Cuota del plan vigente.
865
- * - Últimas peticiones a la API.
1064
+ * - Últimas 15 peticiones con clave de API.
866
1065
  * - Validaciones consumidas por mes.
867
1066
  * - Estado actual del servicio Banxico CEP.
868
1067
  */
@@ -886,7 +1085,7 @@ export interface paths {
886
1085
  * Obtener el resumen del panel
887
1086
  * @description Devuelve los contadores agregados del usuario: el total histórico, el total
888
1087
  * del mes UTC en curso, las validaciones con veredicto `valid`, el contador
889
- * mensual de los estados `pending` y `processing`, el monto promedio y la
1088
+ * mensual de los estados `queued` y `processing`, el monto promedio y la
890
1089
  * tasa de éxito. Incluye también la cantidad de beneficiarios activos.
891
1090
  *
892
1091
  * `relationships.recent_validations` contiene las validaciones no retiradas
@@ -974,7 +1173,10 @@ export interface paths {
974
1173
  * - `degraded`: Problemas parciales — latencia elevada o errores
975
1174
  * intermitentes.
976
1175
  * - `down`: El servicio es por el momento inaccesible.
977
- * - `unknown`: Aún no hay datos de chequeos de salud disponibles.
1176
+ * - `unknown`: No hay datos de salud vigentes: aún no se ha ejecutado ningún
1177
+ * chequeo, o el último es más viejo que tres veces `check_interval_seconds`
1178
+ * porque el chequeo automático dejó de correr. En ese caso `last_verified_at`
1179
+ * conserva la fecha de ese último chequeo.
978
1180
  *
979
1181
  * La respuesta se cachea 60 segundos en el cliente con `Cache-Control`, y ese
980
1182
  * plazo se configura en el despliegue. Cualquier usuario autenticado puede
@@ -1067,7 +1269,8 @@ export interface paths {
1067
1269
  *
1068
1270
  * Cada endpoint puede suscribirse a diferentes eventos, entre ellos:
1069
1271
  *
1070
- * - Eventos `validation.*`: Esperan cualquier estado terminal de una validación para notificar ese estado mediante el webhook (p. ej: `validation.completed`, `validation.error`, etc).
1272
+ * - Eventos `validation.*`: Avisan de cada veredicto de una validación y de cada paso de sus reintentos automáticos (p. ej: `validation.completed`, `validation.error`, etc).
1273
+ * - Evento `validation.returned`: avisa cuando una validación que ya había salido `valid` pasa después a `returned` porque Banxico reportó la devolución; no se emite al crear la validación, donde el evento es `validation.completed`. Para recibirlo hay que suscribirse a él además de a `validation.completed`.
1071
1274
  * - Eventos `billing.*`: No producen entregas hasta que haya algún movimiento en la suscripción del usuario (p. ej: `billing.subscription_canceled`, `billing.payment_succeeded`, cuotas de uso, etc).
1072
1275
  *
1073
1276
  * Si se alcanza el tope de endpoints registrados, la creación responde con un estado HTTP `422` (con `webhook_limit_reached` en el cuerpo) y con el valor del límite en el campo `meta.limit`.
@@ -1240,7 +1443,7 @@ export interface paths {
1240
1443
  * Listar entregas de todos los endpoints webhook
1241
1444
  * @description Devuelve una vista consolidada de las entregas hechas a los endpoints webhook del usuario autenticado.
1242
1445
  *
1243
- * Se puede filtrar por endpoint, estado y tipo de evento.
1446
+ * Se puede buscar por texto con `q` y filtrar por endpoint, estado, tipo de evento, validación, código HTTP, rango de fechas, número de intento y tiempo de respuesta.
1244
1447
  */
1245
1448
  get: operations["listAllDeliveries"];
1246
1449
  put?: never;
@@ -1261,8 +1464,7 @@ export interface paths {
1261
1464
  /**
1262
1465
  * Exportar todas las entregas webhook como CSV o XLSX
1263
1466
  * @description Descarga el historial de entregas de **todos** los endpoints de la cuenta de usuario en
1264
- * un archivo, con los mismos filtros que el listado: endpoint, estado y tipo de
1265
- * evento.
1467
+ * un archivo, con los mismos filtros y la misma búsqueda (`q`) que el listado.
1266
1468
  *
1267
1469
  * {% concept slug="exports-and-formats" %}El formato se elige{% /concept %} con `?format` —`csv` por defecto, `xlsx` como
1268
1470
  * alternativa— y el tope es de 100 000 filas, que `?limit` puede bajar.
@@ -1393,8 +1595,9 @@ export interface paths {
1393
1595
  };
1394
1596
  /**
1395
1597
  * Consultar índices de consumo mes a mes
1396
- * @description Devuelve el consumo mensual de validaciones del usuario autenticado en los
1397
- * últimos `months` meses, de más reciente a más antiguo.
1598
+ * @description Devuelve el consumo mensual de validaciones del usuario autenticado en hasta
1599
+ * `months` meses con consumo, de más reciente a más antiguo. Los meses sin
1600
+ * consumo no aparecen.
1398
1601
  *
1399
1602
  * {% callout type="warning" %}
1400
1603
  * El límite que acompaña a cada fila es el de hoy, no el que regía aquel mes:
@@ -1419,7 +1622,7 @@ export interface paths {
1419
1622
  };
1420
1623
  /**
1421
1624
  * Desglosar consumo por operación
1422
- * @description Desglosa el consumo del periodo indicado por tipo de operación contabilizada (`validation`, `validation_ocr`, etc.).
1625
+ * @description Desglosa el consumo del periodo indicado por tipo de operación contabilizada (`validation` y `sms_2fa`).
1423
1626
  *
1424
1627
  * El parámetro `period` acepta `current` para el mes en curso o una cadena `YYYY-MM` para un mes específico.
1425
1628
  */
@@ -1443,13 +1646,20 @@ export interface paths {
1443
1646
  * Consultar los límites de tasa (rate-limits)
1444
1647
  * @description Devuelve los límites de tasa aplicables al usuario autenticado, por contexto.
1445
1648
  *
1446
- * Los dos contextos no llevan los mismos límites: `api` limita por IP y por
1447
- * minuto; `login` limita por IP y por correo electrónico, cada uno por minuto y
1448
- * por hora.
1649
+ * Los contextos no llevan los mismos límites. `api` limita las peticiones
1650
+ * autenticadas por clave y por minuto, con el valor del plan de la cuenta
1651
+ * (`key_per_minute`), y suma un techo por IP (`ip_ceiling_per_minute`); las
1652
+ * peticiones sin clave se limitan por IP (`ip_per_minute`). `webhooks` fija las
1653
+ * entregas por minuto que la cuenta puede enviar hacia un mismo host destino,
1654
+ * según su plan (`host_per_minute`), y el tope de todos los clientes juntos
1655
+ * sobre ese host (`host_global_per_minute`). `login` limita por IP y por correo
1656
+ * electrónico, cada uno por minuto y por hora.
1449
1657
  *
1450
1658
  * No devuelve contadores en vivo, sólo la configuración vigente. Estos límites
1451
1659
  * son ajenos a la cuota mensual de validaciones, que devuelve
1452
- * [`GET /v1/usage/summary`](/es/v1/usage/get-usage-summary).
1660
+ * [`GET /v1/usage/summary`](/es/v1/usage/get-usage-summary). El consumo de la
1661
+ * ventana en curso lo informan, en cada respuesta autenticada de la API, las
1662
+ * cabeceras `X-RateLimit-*`.
1453
1663
  *
1454
1664
  * {% callout type="note" %}
1455
1665
  * Al superarse uno de estos límites, la operación afectada responde con estado
@@ -1920,7 +2130,7 @@ export interface components {
1920
2130
  api_version?: string;
1921
2131
  /**
1922
2132
  * @description Identificador único de la petición (hex).
1923
- * @example a1b2c3d4e5f6
2133
+ * @example a1b2c3d4e5f66f5e4d3c2b1a
1924
2134
  */
1925
2135
  request_id?: string;
1926
2136
  datetime?: components["schemas"]["DatetimeMeta"];
@@ -1944,8 +2154,8 @@ export interface components {
1944
2154
  */
1945
2155
  version?: string;
1946
2156
  /**
1947
- * @description Identificador único de la petición (UUID hex).
1948
- * @example a1b2c3d4e5f6
2157
+ * @description Identificador único de la petición (24 caracteres hex).
2158
+ * @example a1b2c3d4e5f66f5e4d3c2b1a
1949
2159
  */
1950
2160
  request_id?: string;
1951
2161
  };
@@ -1968,7 +2178,7 @@ export interface components {
1968
2178
  api_version?: string;
1969
2179
  /**
1970
2180
  * @description Identificador único de la petición (hex).
1971
- * @example a1b2c3d4e5f6
2181
+ * @example a1b2c3d4e5f66f5e4d3c2b1a
1972
2182
  */
1973
2183
  request_id?: string;
1974
2184
  datetime?: components["schemas"]["DatetimeMeta"];
@@ -2016,17 +2226,17 @@ export interface components {
2016
2226
  */
2017
2227
  name?: string;
2018
2228
  /**
2019
- * @description Rol de la cuenta de usuario en la organización. Decide qué permisos tienen sus sesiones — `owner`: Es la titular; `admin`: La administra; `user`: La usa; `viewer`: Solo lee.
2229
+ * @description Rol de la cuenta de usuario en la organización. Decide qué permisos tienen sus sesiones — `owner`: Es la titular; `admin`: La administra; `user`: La usa.
2020
2230
  * @example user
2021
2231
  * @enum {string}
2022
2232
  */
2023
- role?: "owner" | "admin" | "user" | "viewer";
2233
+ role?: "owner" | "admin" | "user";
2024
2234
  /**
2025
- * @description Estado de la cuenta de usuario — `active`: Permite operar con normalidad; `suspended`: Cuenta suspendida; `pending_verification`: Falta verificación de correo electrónico.
2235
+ * @description Estado de la cuenta de usuario — `active`: Permite operar con normalidad; `suspended`: Cuenta suspendida; `revoked`: Eliminada por el usuario.
2026
2236
  * @example active
2027
2237
  * @enum {string}
2028
2238
  */
2029
- status?: "active" | "suspended" | "pending_verification";
2239
+ status?: "active" | "suspended" | "revoked";
2030
2240
  /**
2031
2241
  * @description Zona horaria IANA con la que se presentan las fechas al usuario.
2032
2242
  * @example America/Mexico_City
@@ -2054,7 +2264,7 @@ export interface components {
2054
2264
  api_key?: {
2055
2265
  /**
2056
2266
  * @description Primeros 8 caracteres de la clave de API.
2057
- * @example veriko_a1b2
2267
+ * @example veriko_
2058
2268
  */
2059
2269
  prefix?: string;
2060
2270
  /**
@@ -2108,7 +2318,7 @@ export interface components {
2108
2318
  */
2109
2319
  enabled?: boolean;
2110
2320
  /**
2111
- * @description Canal por el que se entrega el código de autenticación (OTP) — `sms`: Por mensaje de texto; `email`: Por correo electrónico; `null`: La autenticación de 2 factores (2FA) está desactivada.
2321
+ * @description Canal por el que se entrega el código de autenticación (OTP) — `sms`: Por mensaje de texto; `email`: Por correo electrónico; `null`: La cuenta de usuario nunca lo ha configurado. Al desactivar la 2FA se conserva el último canal usado.
2112
2322
  * @example sms
2113
2323
  * @enum {string|null}
2114
2324
  */
@@ -2141,7 +2351,7 @@ export interface components {
2141
2351
  telegram_linked?: boolean;
2142
2352
  };
2143
2353
  /**
2144
- * @description `true` cuando hay una aceptación vigente de los Términos de Servicio y el Aviso de Privacidad (ambos documentos). `false` cuando falta cualquiera de los dos, o cuando quedó antes de `LEGAL_REACCEPT_SINCE` (vacía por defecto). Gatea el modal de consentimiento post-login.
2354
+ * @description `true` cuando no queda pendiente la aceptación de ningún documento: ni los Términos de Servicio ni el Aviso de Privacidad. `false` cuando falta la aceptación de cualquiera de los dos, o cuando el equipo exigió aceptar una versión que la cuenta todavía no ha aceptado. Gatea el modal de consentimiento post-login, que lista lo pendiente en `GET /users/me/legal/pending`.
2145
2355
  * @example true
2146
2356
  */
2147
2357
  legal_accepted?: boolean;
@@ -2180,11 +2390,11 @@ export interface components {
2180
2390
  */
2181
2391
  outcomes?: ("not_found" | "cep_unavailable" | "error")[];
2182
2392
  };
2183
- /** @description Cuerpo de `POST /v1/validate` para una validación manual SPEI; exige `cuenta_beneficiaria` y `clave_rastreo` o `referencia_numerica`. */
2184
- ValidationRequest: {
2393
+ /** @description Cuerpo de `POST /v1/validate` para una validación manual SPEI; exige `clave_rastreo` o `referencia_numerica`, y una sola de las dos formas de indicar la cuenta: `cuenta_beneficiaria` o `cuentas_candidatas`. */
2394
+ ValidationRequest: ({
2185
2395
  /**
2186
2396
  * Format: date
2187
- * @description Fecha de la transferencia en formato ISO 8601 (YYYY-MM-DD).
2397
+ * @description Fecha de envío de la transferencia en formato ISO 8601 (YYYY-MM-DD). Con ella Banxico localiza el CEP, y puede diferir del día de operación que el CEP imprime (`banxico_result.operationDate`).
2188
2398
  * @example 2025-03-15
2189
2399
  */
2190
2400
  fecha: string;
@@ -2195,12 +2405,12 @@ export interface components {
2195
2405
  */
2196
2406
  monto: number;
2197
2407
  /**
2198
- * @description Clave de rastreo de la transferencia (entre 1 a 30 caracteres). Acepta letras, números, guiones, diagonales y espacios. Se recorta y se le quitan caracteres invisibles de ancho cero antes de validarse, para que la misma clave copiada y pegada compare igual en toda la plataforma. Requerida si `referencia_numerica` no es enviada; ambas pueden incluirse simultáneamente para mayor precisión de búsqueda.
2408
+ * @description Clave de rastreo de la transferencia (entre 1 a 30 caracteres). Acepta letras, números, espacios y los signos de puntuación que admite Banxico (como guiones, diagonales, puntos, comas, `#`, `@` o `_`), pero no `<`, `>` ni la barra invertida. Se recorta y se le quitan caracteres invisibles de ancho cero antes de validarse, para que la misma clave copiada y pegada compare igual en toda la plataforma. Requerida si `referencia_numerica` no es enviada. Si vienen las dos, la consulta a Banxico se hace sólo por la clave.
2199
2409
  * @example MXBA20250315001234
2200
2410
  */
2201
2411
  clave_rastreo?: string;
2202
2412
  /**
2203
- * @description Referencia numérica de la transferencia (entre 1 y 7 dígitos). Acepta solo números y espacios. Requerida si `clave_rastreo` no es enviada; ambas pueden incluirse simultáneamente para mayor precisión de búsqueda.
2413
+ * @description Referencia numérica de la transferencia (entre 1 y 7 dígitos). Acepta solo números y espacios. Requerida si `clave_rastreo` no es enviada. Si viene `clave_rastreo`, la consulta se hace sólo por la clave, y una referencia mal formada no se rechaza: se ignora y se deja un aviso.
2204
2414
  * @example 1234567
2205
2415
  */
2206
2416
  referencia_numerica?: string;
@@ -2215,10 +2425,22 @@ export interface components {
2215
2425
  */
2216
2426
  receptor?: string;
2217
2427
  /**
2218
- * @description Cuenta bancaria receptora de la transferencia. Es obligatoria: si falta, la respuesta es un estado HTTP `422` (con `preflight_failed` y el error de campo `cuenta_required`). Puede ser CLABE (18 dígitos), tarjeta (16 dígitos) o celular DiMo (10 dígitos), y el tipo se identifica por la longitud de sus dígitos. Los espacios y guiones que separan grupos ("0121 8000 4412 345678") se ignoran automáticamente antes de contar la longitud. Para celular DiMo, si el banco receptor no puede resolverse por el campo `receptor`, por los beneficiarios registrados ni por el directorio de cuentas, la respuesta es un estado HTTP `422` (con `bank_code_unresolvable_for_phone` en el cuerpo).
2428
+ * @description Cuenta bancaria receptora de la transferencia. Es obligatoria cuando no se envía `cuentas_candidatas`: si faltan las dos, la respuesta es un estado HTTP `422` (con `preflight_failed` y el error de campo `cuenta_required`); si vienen las dos, un `422` con `cuenta_y_candidatas_excluyentes`. Puede ser CLABE (18 dígitos), tarjeta (16 dígitos) o celular DiMo (10 dígitos), y el tipo se identifica por la longitud de sus dígitos. Los espacios y guiones que separan grupos ("0121 8000 4412 345678") se ignoran automáticamente antes de contar la longitud. Para celular DiMo, si el banco receptor no puede resolverse por el campo `receptor`, por los beneficiarios registrados ni por el directorio de cuentas, la respuesta es un estado HTTP `422` (con `bank_code_unresolvable_for_phone` en el cuerpo).
2219
2429
  * @example 012180004412345678
2220
2430
  */
2221
- cuenta_beneficiaria: string;
2431
+ cuenta_beneficiaria?: string;
2432
+ /**
2433
+ * @description Cuentas entre las que está la receptora de la transferencia, para cuando no se sabe cuál fue. Va en lugar de `cuenta_beneficiaria`: enviar las dos responde un estado HTTP `422` (con `cuenta_y_candidatas_excluyentes` en el cuerpo).
2434
+ *
2435
+ * Admite de 2 al máximo vigente de la plataforma, 3 por defecto y nunca más de 10; el `422` por exceso informa el máximo en `meta.max`. Cada cuenta es una CLABE (18 dígitos), una tarjeta (16) o un celular DiMo (10), con su dígito verificador válido y sin repetirse. Una lista que no cumple responde un `422` con `cuentas_candidatas_invalidas`, y señala en `field_errors` la posición que falló. Los dos errores ocurren antes de consumir cuota.
2436
+ *
2437
+ * Consume una sola unidad de cuota, lleve las cuentas que lleve. La consulta recorre las candidatas en el orden enviado y adopta la primera que coincide con la transferencia. La ganadora se publica completa en `normalized_data.cuenta_beneficiaria`, y `candidate_match` indica su posición. Si ninguna coincide, la respuesta es un estado HTTP `422` con el motivo en `code` (`cuenta_unresolvable_after_probes` cuando no hay un diagnóstico más preciso).
2438
+ * @example [
2439
+ * "012180004412345678",
2440
+ * "002010077777777771"
2441
+ * ]
2442
+ */
2443
+ cuentas_candidatas?: string[];
2222
2444
  /**
2223
2445
  * @description Indica si el beneficiario de la transferencia es directamente la institución receptora del pago («Pago a Banco» en el CEP de Banxico) y no uno de sus cuentahabientes. `0` para una transferencia a un cuentahabiente (valor por defecto); `1` para pagos cuyo beneficiario es el banco —pago de tarjeta de crédito, de crédito o de servicios a la propia institución. Opcional: si se omite se asume `0`.
2224
2446
  * @default 0
@@ -2233,16 +2455,13 @@ export interface components {
2233
2455
  * @example orden-4812
2234
2456
  */
2235
2457
  client_ref?: string;
2236
- } | unknown | unknown;
2237
- /**
2238
- * @description Código estable del fallo de una validación.
2239
- * @enum {string}
2240
- */
2241
- ValidationErrorCode: "network" | "captcha" | "max_retries_exceeded" | "ttl_expired" | "preflight_failed" | "rate_limit_exhausted" | "dispatch_failed" | "bank_code_unresolvable_for_phone" | "intra_bank_no_cep" | "not_found_identity" | "not_found_account" | "not_found_amount" | "not_found_account_and_amount" | "not_found_account_or_amount";
2458
+ } & (unknown | unknown)) | unknown | unknown;
2459
+ /** @description Código estable del fallo de una validación. La lista no es cerrada: un fallo inesperado trae `internal_error` y otros fallos pueden traer el código de su causa, así que trata un valor desconocido como un fallo genérico. */
2460
+ ValidationErrorCode: string | ("network" | "captcha" | "max_retries_exceeded" | "ttl_expired" | "preflight_failed" | "rate_limit_exhausted" | "dispatch_failed" | "bank_code_unresolvable_for_phone" | "intra_bank_no_cep" | "not_found_identity" | "not_found_account" | "not_found_amount" | "not_found_account_and_amount" | "not_found_account_or_amount" | "internal_error");
2242
2461
  /** @description Estado completo del ciclo de reintentos, con configuración, avance y situación actual. */
2243
2462
  RetryStateFull: {
2244
2463
  /**
2245
- * @description `true` cuando existe un ciclo de reintentos activo.
2464
+ * @description `true` cuando la validación tiene reintentos configurados, aunque su ciclo ya haya terminado (`terminal_state`).
2246
2465
  * @example true
2247
2466
  */
2248
2467
  enabled?: boolean;
@@ -2319,7 +2538,7 @@ export interface components {
2319
2538
  */
2320
2539
  status?: "queued" | "processing" | "valid" | "not_found" | "cep_unavailable" | "invalid" | "returned" | "failed" | "error";
2321
2540
  /**
2322
- * @description Veredicto reportado por Banxico. Puede ser: `valid`, `not_found`, `cep_unavailable`, `invalid`, `returned` o `error`. Permanece `pending` mientras no exista un veredicto de Banxico. `returned` significa que la operación se liquidó y la institución beneficiaria la devolvió después — el CEP, si existe, se sigue entregando. Solo toma `error` cuando la petición llegó a Banxico y el servicio falló; `error_code` identifica la causa.
2541
+ * @description Veredicto reportado por Banxico. Puede ser: `valid`, `not_found`, `cep_unavailable`, `invalid`, `returned` o `error`. Permanece `pending` mientras no exista un veredicto de Banxico. `returned` significa que la operación se liquidó y la institución beneficiaria la devolvió después — el CEP, si existe, se sigue entregando. Un `valid` no es definitivo: es el veredicto del momento de la consulta, y pasa a `returned` cuando Banxico reporta la devolución en una revisión posterior, que se pide con `POST /v1/validations/{id}/recheck` o que el servicio hace solo durante las primeras 72 horas (se emite el webhook `validation.returned`). Solo toma `error` cuando la petición llegó a Banxico y el servicio falló; `error_code` identifica la causa.
2323
2542
  * @example valid
2324
2543
  */
2325
2544
  banxico_status?: string | null;
@@ -2328,7 +2547,7 @@ export interface components {
2328
2547
  * @example 1320
2329
2548
  */
2330
2549
  processing_time_ms?: number | null;
2331
- /** @description Copia de los campos de la petición original. */
2550
+ /** @description Copia de los campos de la petición original. `fecha` conserva la fecha de envío tal como se envió, aunque Banxico haya encontrado el pago con otra (`banxico_result._fecha`). */
2332
2551
  request_data?: {
2333
2552
  [key: string]: unknown;
2334
2553
  };
@@ -2363,7 +2582,7 @@ export interface components {
2363
2582
  processing_started_at?: string | null;
2364
2583
  /**
2365
2584
  * Format: date-time
2366
- * @description Fecha y hora, en ISO 8601 UTC, de expiración para validaciones en cola. Tras esta marca, la validación pasa a `failed`.
2585
+ * @description Fecha y hora, en ISO 8601 UTC, de expiración para validaciones en cola. Tras esta marca, la validación pasa a `error` con `error_code` `ttl_expired`.
2367
2586
  * @example 2026-04-30T10:15:00Z
2368
2587
  */
2369
2588
  expires_at?: string | null;
@@ -2373,10 +2592,25 @@ export interface components {
2373
2592
  */
2374
2593
  etag_version?: number | null;
2375
2594
  /**
2376
- * @description Referencia relativa del comprobante, imagen o PDF (solo si `validation_type` es del tipo `ocr`).
2377
- * @example ocr/2026/04/a1b2c3d4.jpg
2595
+ * @description Referencia relativa del comprobante, imagen o PDF (solo si `validation_type` es del tipo `ocr`). No se publica cuando el archivo no se conserva: ver `image_retained`.
2596
+ * @example comprobantes/3fa85f64-5717-4562-b3fc-2c963f66afa6.jpg
2378
2597
  */
2379
2598
  image_path?: string | null;
2599
+ /**
2600
+ * @description `true` cuando la plataforma conserva el archivo del comprobante; `false` cuando no, porque la petición envió `retain_image=false` o porque la validación se purgó. Solo aparece en las validaciones de tipo `ocr`.
2601
+ *
2602
+ * Con `false`, `GET /v1/validations/{id}/image` responde un estado HTTP `410` (con `image_not_retained` o `validation_purged` en el cuerpo).
2603
+ * @example true
2604
+ */
2605
+ image_retained?: boolean;
2606
+ /**
2607
+ * Format: date-time
2608
+ * @description Fecha y hora, en ISO 8601 UTC, en que la validación se purgó con `POST /v1/validations/{id}/purge/execute`. Solo aparece en una validación purgada, que queda como una lápida.
2609
+ *
2610
+ * Una lápida conserva `id`, `validation_type`, `status`, `banxico_status`, las fechas, `processing_time_ms`, `error_code` y el monto en `normalized_data.monto`. No conserva el archivo, el CEP, `request_data`, `ocr_result` ni `banxico_result`, y sus recursos derivados responden un estado HTTP `410` (con `validation_purged` en el cuerpo).
2611
+ * @example 2026-10-02T09:30:00Z
2612
+ */
2613
+ purged_at?: string;
2380
2614
  /**
2381
2615
  * @description Campos extraídos del comprobante (solo si `validation_type` es del tipo `ocr`).
2382
2616
  *
@@ -2392,7 +2626,7 @@ export interface components {
2392
2626
  * @example 0.94
2393
2627
  */
2394
2628
  ocr_confidence?: number | null;
2395
- /** @description Campos normalizados después de la extracción OCR (solo si `validation_type` es del tipo `ocr`). */
2629
+ /** @description Campos normalizados después de la extracción OCR (si `validation_type` es del tipo `ocr`), o la cuenta ganadora en `cuenta_beneficiaria` cuando una validación directa envió `cuentas_candidatas`. Una lápida conserva aquí solo el monto. */
2396
2630
  normalized_data?: {
2397
2631
  [key: string]: unknown;
2398
2632
  } | null;
@@ -2418,9 +2652,9 @@ export interface components {
2418
2652
  created_at: string;
2419
2653
  };
2420
2654
  /**
2421
- * @description Conflicto entre la cuenta enviada y la que muestra la imagen. Solo aparece en validaciones de tipo `ocr`, cuando se envió `cuenta_beneficiaria` y la imagen muestra otra cuenta completa de la misma longitud, válida y con confianza suficiente.
2655
+ * @description Conflicto entre la cuenta enviada y la que muestra la imagen. Solo aparece en validaciones de tipo `ocr`, cuando se envió `cuenta_beneficiaria` y la imagen muestra otra cuenta completa de la misma longitud, válida y con confianza suficiente, o una cuenta enmascarada cuyos dígitos finales visibles (3 o más) no son el final de la cuenta enviada.
2422
2656
  *
2423
- * Prevalece la cuenta enviada, que es la que se consulta en Banxico: el campo no cambia el veredicto. Si el pago fue a la cuenta de la imagen, lo esperable es un `not_found`. Solo trae los últimos 4 dígitos de cada cuenta, y el conflicto también se añade a `normalization_warnings`.
2657
+ * Prevalece la cuenta enviada, que es la que se consulta en Banxico: el campo no cambia el veredicto. Si el pago fue a la cuenta de la imagen, lo esperable es un `not_found`. Solo trae los últimos 4 dígitos de cada cuenta, y el conflicto también se añade a `normalization_warnings`. Con una cuenta enmascarada, `read_last4` trae los dígitos finales que el propio comprobante muestra (3 o 4), nunca más.
2424
2658
  */
2425
2659
  account_conflict?: {
2426
2660
  /**
@@ -2429,11 +2663,28 @@ export interface components {
2429
2663
  */
2430
2664
  sent_last4: string;
2431
2665
  /**
2432
- * @description Últimos 4 dígitos de la cuenta completa que muestra la imagen.
2666
+ * @description Últimos 4 dígitos de la cuenta que muestra la imagen (los visibles, 3 o 4, si está enmascarada).
2433
2667
  * @example 9012
2434
2668
  */
2435
2669
  read_last4: string;
2436
2670
  };
2671
+ /**
2672
+ * @description Cuál de las `cuentas_candidatas` enviadas ganó. Solo aparece cuando la petición llevó esa lista y una de las cuentas coincidió con la transferencia.
2673
+ *
2674
+ * La cuenta completa va en `normalized_data.cuenta_beneficiaria`; este objeto indica qué posición de la lista es, para correlacionarla con la entidad propia del integrador sin comparar cuentas. No cambia el veredicto.
2675
+ */
2676
+ candidate_match?: {
2677
+ /**
2678
+ * @description Posición (desde 0) de la cuenta ganadora en el arreglo `cuentas_candidatas`, tal como se envió.
2679
+ * @example 1
2680
+ */
2681
+ index: number;
2682
+ /**
2683
+ * @description Últimos 4 dígitos de la cuenta ganadora.
2684
+ * @example 7771
2685
+ */
2686
+ account_last4: string;
2687
+ };
2437
2688
  /** @description Indica si la cuenta beneficiaria viene enmascarada en el comprobante cargado, sea una CLABE, una tarjeta o un celular. Solo se incluye cuando vale `true` y solo si `validation_type` es del tipo `ocr`. */
2438
2689
  is_masked?: boolean | null;
2439
2690
  /**
@@ -2445,15 +2696,32 @@ export interface components {
2445
2696
  * `authenticated` es `true` cuando su sello y su cadena original coinciden con los del CEP oficial;
2446
2697
  * con `false`, `differing_fields` lista los campos que difieren y `normalization_warnings` lo avisa.
2447
2698
  * El veredicto sigue siendo el de Banxico.
2699
+ *
2700
+ * `_payment_status` es el estado oficial del pago, tal como lo dio Banxico la última vez que se le preguntó:
2701
+ * `code` (`liquidado`, `en_proceso`, `cancelado`, `rechazado`, `en_proceso_devolucion`, `devuelto` o `desconocido`),
2702
+ * `label`, `settled`, `reversed` y `checked_at` (ISO 8601 UTC).
2703
+ * Su ausencia significa que no se pudo saber, nunca que el pago esté liquidado.
2704
+ * Se actualiza en cada revisión posterior, y con `devuelto` o `en_proceso_devolucion` la validación pasa a `returned`.
2705
+ *
2706
+ * `_fecha` aparece cuando Banxico no encontró el pago con la fecha enviada y sí con otra.
2707
+ * `used` es la fecha con la que se encontró, `requested` es la fecha con la que se consultó primero
2708
+ * y `reason` es el motivo por el que se probó `used`.
2709
+ * Valores de `reason`:
2710
+ * `clave_embedded_date`: La clave de rastreo incrusta otra fecha, a un día hábil SPEI o menos de la enviada;
2711
+ * `cutoff_18h`: La clave no incrusta fecha y el comprobante indica una hora cercana al corte de las 18:00,
2712
+ * así que se probó el día siguiente;
2713
+ * `dia_operacion`: La clave incrusta la fecha enviada, porque el comprobante trae la de operación,
2714
+ * y se probó un día anterior hasta el día hábil previo.
2715
+ * El veredicto sigue siendo el de Banxico, y `request_data.fecha` conserva la fecha enviada.
2448
2716
  */
2449
2717
  banxico_result?: ({
2450
2718
  /**
2451
- * @description Fecha de la operación tal como la reporta el CEP de Banxico (`AAAA-MM-DD`).
2719
+ * @description Día hábil SPEI que Banxico asignó a la operación, tal como lo reporta el CEP (`YYYY-MM-DD`), en hora del centro de México. Puede diferir de la fecha de envío: lo enviado a partir de las 18:00, en sábado, en domingo o en un día inhábil opera el siguiente día hábil.
2452
2720
  * @example 2025-03-15
2453
2721
  */
2454
2722
  operationDate?: string;
2455
2723
  /**
2456
- * @description Hora de la operación tal como la reporta el CEP de Banxico (`HH:MM:SS`).
2724
+ * @description Hora de la operación tal como la reporta el CEP (`HH:MM:SS`), en hora del centro de México y no en UTC.
2457
2725
  * @example 14:22:10
2458
2726
  */
2459
2727
  processingTime?: string;
@@ -2544,13 +2812,13 @@ export interface components {
2544
2812
  */
2545
2813
  self?: string;
2546
2814
  /**
2547
- * @description URL del CEP en formato XML. `null` cuando `status` no es `valid`, o es `returned` sin comprobante (la operación se devolvió antes de emitirse un CEP).
2548
- * @example /v1/validations/a1b2c3d4-e5f6-7890-abcd-ef0123456789/cep.xml
2815
+ * @description URL del CEP en formato XML. Solo aparece cuando `banxico_status` es `valid`, o es `returned` con comprobante, y la validación no se purgó; si no, se omite el objeto `links`.
2816
+ * @example /v1/validations/a1b2c3d4-e5f6-4890-abcd-ef0123456789/cep?format=xml
2549
2817
  */
2550
2818
  cep_xml?: string | null;
2551
2819
  /**
2552
- * @description URL del CEP en formato PDF. `null` cuando `status` no es `valid`, o es `returned` sin comprobante (la operación se devolvió antes de emitirse un CEP).
2553
- * @example /v1/validations/a1b2c3d4-e5f6-7890-abcd-ef0123456789/cep.pdf
2820
+ * @description URL del CEP en formato PDF. Solo aparece cuando `banxico_status` es `valid`, o es `returned` con comprobante, y la validación no se purgó; si no, se omite el objeto `links`.
2821
+ * @example /v1/validations/a1b2c3d4-e5f6-4890-abcd-ef0123456789/cep?format=pdf
2554
2822
  */
2555
2823
  cep_pdf?: string | null;
2556
2824
  };
@@ -2615,25 +2883,47 @@ export interface components {
2615
2883
  playground?: boolean;
2616
2884
  };
2617
2885
  };
2618
- /** @description Cuerpo de `POST /v1/validate-ocr` con el comprobante en `image` o `image_url`; exige al menos uno de ambos campos. */
2886
+ /** @description Cuerpo de `POST /v1/validate-ocr` con el comprobante en `image` o `image_url`; exige al menos uno de ambos campos. `cuenta_beneficiaria` y `cuentas_candidatas` no pueden ir juntas. */
2619
2887
  OcrValidationRequest: {
2620
2888
  /**
2621
2889
  * Format: byte
2622
- * @description Comprobante codificado en base64, en imagen o en PDF. Si también se proporciona `image_url`, solo se considera `image`. Formatos aceptados: JPEG, PNG, WebP o PDF de 1 a 3 páginas. Tamaño máximo: `12 MB`. Dimensiones máximas de una imagen: `12000px` por lado. Admite el prefijo `data:image/...;base64,` o `data:application/pdf;base64,`.
2890
+ * @description Comprobante codificado en base64, en imagen o en PDF. Si también se proporciona `image_url`, solo se considera `image_url`. Formatos aceptados: JPEG, PNG, WebP o PDF de 1 a 3 páginas. Tamaño máximo: `12 MB`. Dimensiones máximas de una imagen: `12000px` por lado. Admite el prefijo `data:image/...;base64,` o `data:application/pdf;base64,`.
2623
2891
  * @example iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==
2624
2892
  */
2625
2893
  image?: string;
2626
2894
  /**
2627
2895
  * Format: uri
2628
- * @description URL pública (HTTPS) del comprobante. Sigue los mismos límites de formato y tamaño que `image`: JPEG, PNG, WebP o PDF de 1 a 3 páginas, con un máximo de `12 MB`.
2896
+ * @description URL pública (HTTPS) del comprobante. Sigue los mismos límites de formato y tamaño que `image`: JPEG, PNG, WebP o PDF de 1 a 3 páginas, con un máximo de `12 MB`. Una URL `http` responde un estado HTTP `422` (con `invalid_url_scheme` en el cuerpo), y una redirección hacia `http` no se sigue.
2629
2897
  * @example https://storage.example.com/receipts/comprobante-2025-03.jpg
2630
2898
  */
2631
2899
  image_url?: string;
2632
2900
  /**
2633
- * @description Cuenta receptora de la transferencia (útil cuando falta o está incompleta en la imagen). Requerida para celular DiMo; opcional si la imagen muestra la cuenta completa o sus últimos dígitos, que se completan con los beneficiarios guardados (estos no sustituyen a este campo). Acepta CLABE (18 dígitos), tarjeta (16 dígitos) o celular DiMo (10 dígitos).
2901
+ * @description Cuenta receptora de la transferencia (útil cuando falta o está incompleta en la imagen). Requerida para celular DiMo; opcional si la imagen muestra la cuenta completa o sus últimos dígitos, que se completan con los beneficiarios guardados (estos no sustituyen a este campo). Acepta CLABE (18 dígitos), tarjeta (16 dígitos) o celular DiMo (10 dígitos). No puede enviarse junto con `cuentas_candidatas`: enviar las dos responde un estado HTTP `422` (con `cuenta_y_candidatas_excluyentes` en el cuerpo).
2634
2902
  * @example 012180004412345678
2635
2903
  */
2636
2904
  cuenta_beneficiaria?: string;
2905
+ /**
2906
+ * @description Cuentas entre las que está la receptora de la transferencia, para cuando la imagen no la muestra y no se sabe cuál fue. Va en lugar de `cuenta_beneficiaria`: enviar las dos responde un estado HTTP `422` (con `cuenta_y_candidatas_excluyentes` en el cuerpo). Tiene prioridad sobre la cuenta que se lea en la imagen.
2907
+ *
2908
+ * Admite de 2 al máximo vigente de la plataforma, 3 por defecto y nunca más de 10; el `422` por exceso informa el máximo en `meta.max`. Cada cuenta es una CLABE (18 dígitos), una tarjeta (16) o un celular DiMo (10), con su dígito verificador válido y sin repetirse. Una lista que no cumple responde un `422` con `cuentas_candidatas_invalidas`, y señala en `field_errors` la posición que falló. Los dos errores ocurren antes de consumir cuota.
2909
+ *
2910
+ * Consume una sola unidad de cuota, lleve las cuentas que lleve, también con `?async=1`. La consulta recorre las candidatas en el orden enviado y adopta la primera que coincide con la transferencia. La ganadora se publica completa en `normalized_data.cuenta_beneficiaria`, y `candidate_match` indica su posición. Si ninguna coincide, la respuesta es un estado HTTP `422` con el motivo en `code` (`cuenta_unresolvable_after_probes` cuando no hay un diagnóstico más preciso).
2911
+ * @example [
2912
+ * "012180004412345678",
2913
+ * "002010077777777771"
2914
+ * ]
2915
+ */
2916
+ cuentas_candidatas?: string[];
2917
+ /**
2918
+ * @description **Código SPEI** del banco emisor (4 o 5 dígitos, p. ej. `40012`), para corregir el que se leyó del comprobante. Sustituye al leído antes de consultar Banxico. Un valor que no son 4 o 5 dígitos (un nombre, por ejemplo) se ignora y se conserva el leído.
2919
+ * @example 40012
2920
+ */
2921
+ banco_emisor?: string;
2922
+ /**
2923
+ * @description **Código SPEI** del banco receptor (4 o 5 dígitos, p. ej. `40002`), para corregir el que se leyó del comprobante. Sustituye al leído antes de consultar Banxico. Un valor que no son 4 o 5 dígitos (un nombre, por ejemplo) se ignora y se conserva el leído.
2924
+ * @example 40002
2925
+ */
2926
+ banco_receptor?: string;
2637
2927
  /** @description Política de reintentos automáticos para esta validación. Si se omite, se aplica la política general del usuario, configurada en `PUT /v1/users/me/retry-policy`. **Los reintentos no consumen cuota de validaciones**. */
2638
2928
  retry_policy?: components["schemas"]["RetryPolicy"];
2639
2929
  /**
@@ -2641,11 +2931,21 @@ export interface components {
2641
2931
  * @example orden-4812
2642
2932
  */
2643
2933
  client_ref?: string;
2934
+ /**
2935
+ * @description `true` cuando la plataforma conserva el archivo del comprobante después de validarlo, que es lo habitual. Con `false`, el archivo se borra en cuanto la validación llega a un estado terminal del que ya no se necesita; el veredicto y los datos extraídos se conservan.
2936
+ *
2937
+ * Con `false`, la validación publica `image_retained=false` y `GET /v1/validations/{id}/image` responde un estado HTTP `410` (con `image_not_retained` en el cuerpo). Vale igual con `?async=1`.
2938
+ *
2939
+ * El archivo existe mientras la validación se procesa. Si entró como un CEP en PDF y tiene reintentos automáticos activos, el borrado espera a que ese ciclo cierre, porque cada reintento vuelve a comparar el sello del PDF. Un valor que no es booleano responde un estado HTTP `422` (con `invalid_retain_image` en el cuerpo), antes de consumir cuota.
2940
+ * @default true
2941
+ * @example false
2942
+ */
2943
+ retain_image: boolean;
2644
2944
  } | unknown | unknown;
2645
2945
  /** @description Estado resumido del ciclo de reintentos, con la configuración representada como `null`. */
2646
2946
  RetryStateCompact: {
2647
2947
  /**
2648
- * @description `true` cuando existe un ciclo de reintentos activo.
2948
+ * @description `true` cuando la validación tiene reintentos configurados, aunque su ciclo ya haya terminado (`terminal_state`).
2649
2949
  * @example true
2650
2950
  */
2651
2951
  enabled?: boolean;
@@ -2692,7 +2992,7 @@ export interface components {
2692
2992
  id: string;
2693
2993
  /** @description Datos mostrados en el historial de validaciones. */
2694
2994
  attributes: {
2695
- /** @description Nombre del banco de la contraparte. Prioriza `receptor_name` o `emisor_name` guardado; si falta, intenta resolver el código de receptor o emisor. Si tampoco puede resolverlo, devuelve ese código o `Banco no identificado`. */
2995
+ /** @description Nombre del banco de la contraparte. Prioriza `receptor_name` o `emisor_name` guardado; si falta, intenta resolver el código de receptor o emisor. Si tampoco puede resolverlo, devuelve el valor guardado cuando no es una clave numérica, o `Banco no identificado` (en inglés, `Unidentified bank`). */
2696
2996
  bank_name?: string;
2697
2997
  /** @description Clave Banxico canónica (3-5 dígitos) del banco de la contraparte, resuelta por la autoridad del dominio. `null` cuando el banco no pudo resolverse. Es aditiva respecto de `bank_name`: sirve para resolver recursos/avatares por clave, nunca por el nombre visible. */
2698
2998
  bank_code?: string | null;
@@ -2726,6 +3026,8 @@ export interface components {
2726
3026
  created_at?: components["schemas"]["TimestampUTC"];
2727
3027
  /** @description Fecha de retiro del historial, en ISO 8601 UTC. */
2728
3028
  deleted_at?: components["schemas"]["TimestampUTC"] | null;
3029
+ /** @description Fecha y hora, en ISO 8601 UTC, en que la validación se purgó. Solo aparece en una validación purgada, que queda como una lápida con su veredicto, sus fechas y su monto. */
3030
+ purged_at?: components["schemas"]["TimestampUTC"];
2729
3031
  retry_state?: components["schemas"]["RetryStateCompact"];
2730
3032
  /**
2731
3033
  * @description Referencia propia enviada al validar (`client_ref`), devuelta tal cual. Solo aparece cuando la petición la incluyó.
@@ -2915,6 +3217,211 @@ export interface components {
2915
3217
  CancelValidationRetriesAttributes: {
2916
3218
  retry_state?: components["schemas"]["RetryStateFull"];
2917
3219
  };
3220
+ /** @description Resultado de la revisión que acompaña, dentro de `meta`, la respuesta de `POST /v1/validations/{id}/recheck`. */
3221
+ ValidationRecheckMeta: {
3222
+ /**
3223
+ * Format: date-time
3224
+ * @description Fecha y hora, en ISO 8601 UTC, en que se consultó el estado del pago a Banxico. `null` cuando no se consultó nada porque la validación ya estaba en `returned`.
3225
+ * @example 2026-10-01T18:42:07Z
3226
+ */
3227
+ checked_at: string | null;
3228
+ /**
3229
+ * @description `true` cuando esta consulta pasó la validación de `valid` a `returned`. En ese caso también se emitió el webhook `validation.returned`.
3230
+ * @example false
3231
+ */
3232
+ changed: boolean;
3233
+ /**
3234
+ * @description Veredicto de Banxico antes de esta consulta — `valid`: La validación seguía confirmada; `returned`: La validación ya estaba devuelta y no se consultó nada.
3235
+ * @example valid
3236
+ * @enum {string}
3237
+ */
3238
+ previous_status: "valid" | "returned";
3239
+ };
3240
+ /** @description Respuesta de `POST /v1/validations/{id}/purge/prepare`: lo que borraría el borrado definitivo, lo que conservaría y el token que lo confirma. Todavía no ha cambiado nada. */
3241
+ ValidationPurgePrepareResponse: {
3242
+ /** @description Recurso JSON:API de la preparación. Su `id` es el de la validación. */
3243
+ data: components["schemas"]["JsonApiResourceBase"] & {
3244
+ /**
3245
+ * @description Tipo del recurso, fijo para esta operación. Forma parte de su identidad en la envoltura JSON:API. Siempre `validation_purge`.
3246
+ * @example validation_purge
3247
+ * @enum {string}
3248
+ */
3249
+ type: "validation_purge";
3250
+ /**
3251
+ * Format: uuid
3252
+ * @description Identificador de la validación que se borraría.
3253
+ * @example 3fa85f64-5717-4562-b3fc-2c963f66afa6
3254
+ */
3255
+ id: string;
3256
+ /** @description Resumen del borrado y token de confirmación. */
3257
+ attributes: {
3258
+ /**
3259
+ * @description Token de un solo uso, atado a la cuenta y a esta validación, que `POST /v1/validations/{id}/purge/execute` exige para borrar. Caduca en `expires_in` segundos.
3260
+ * @example eyJhZG1pbl9pZCI6Ii4uLiJ9.q1w2e3r4t5y6u7i8o9p0
3261
+ */
3262
+ confirmation_token: string;
3263
+ /**
3264
+ * @description Segundos de vigencia del token.
3265
+ * @example 120
3266
+ */
3267
+ expires_in: number;
3268
+ /**
3269
+ * @description `true` siempre: el borrado no se puede deshacer. Un respaldo de infraestructura no lo revierte para el cliente.
3270
+ * @example true
3271
+ */
3272
+ irreversible: boolean;
3273
+ /** @description Lo que borraría el borrado definitivo. */
3274
+ will_delete: {
3275
+ /**
3276
+ * @description `true` cuando hay un archivo del comprobante (imagen o PDF) que se borraría.
3277
+ * @example true
3278
+ */
3279
+ image: boolean;
3280
+ /**
3281
+ * @description `true` cuando hay un CEP (el XML o el PDF) que se borraría.
3282
+ * @example true
3283
+ */
3284
+ cep: boolean;
3285
+ /**
3286
+ * @description Campos de la validación con contenido que se vaciarían. De `normalized_data` se conserva únicamente el monto.
3287
+ * @example [
3288
+ * "request_data",
3289
+ * "ocr_result",
3290
+ * "normalized_data",
3291
+ * "banxico_result"
3292
+ * ]
3293
+ */
3294
+ stored_data: ("request_data" | "ocr_result" | "normalized_data" | "normalization_warnings" | "banxico_result")[];
3295
+ /**
3296
+ * @description Cantidad de intentos de reintento que se borrarían.
3297
+ * @example 2
3298
+ */
3299
+ retry_attempts: number;
3300
+ /**
3301
+ * @description Cantidad de sondeos de cuenta candidata que se borrarían.
3302
+ * @example 0
3303
+ */
3304
+ probe_attempts: number;
3305
+ /**
3306
+ * @description Cantidad de entregas de webhook de esta validación a las que se les quitaría el cuerpo enviado y la respuesta del receptor. El registro de cada entrega se conserva.
3307
+ * @example 1
3308
+ */
3309
+ webhook_deliveries: number;
3310
+ /**
3311
+ * @description Cantidad de entregas de notificación de esta validación cuyo contenido se vaciaría. Las notificaciones de la bandeja de la cuenta se borrarían.
3312
+ * @example 1
3313
+ */
3314
+ notifications: number;
3315
+ /**
3316
+ * @description Cantidad de respuestas guardadas de `Idempotency-Key` que se borrarían.
3317
+ * @example 1
3318
+ */
3319
+ idempotency_responses: number;
3320
+ /**
3321
+ * @description `true` siempre: los cuerpos de las filas de auditoría que nombran la validación se quitarían, y el contexto libre de sus eventos de seguridad se reduciría a ids y códigos.
3322
+ * @example true
3323
+ */
3324
+ audit_traces: boolean;
3325
+ };
3326
+ /**
3327
+ * @description Campos que conserva la lápida en que queda la validación: bastan para que la cuota, las estadísticas, finanzas y el historial sigan cuadrando.
3328
+ * @example [
3329
+ * "id",
3330
+ * "validation_type",
3331
+ * "status",
3332
+ * "banxico_status",
3333
+ * "amount",
3334
+ * "created_at",
3335
+ * "purged_at"
3336
+ * ]
3337
+ */
3338
+ will_keep: string[];
3339
+ /**
3340
+ * @description `true` cuando la validación tiene un ciclo de reintentos abierto, que el borrado cancela.
3341
+ * @example false
3342
+ */
3343
+ cancels_pending_retries: boolean;
3344
+ /**
3345
+ * @description `false` siempre: el borrado no devuelve cuota ni cambia lo cobrado.
3346
+ * @example false
3347
+ */
3348
+ refunds_quota: boolean;
3349
+ /**
3350
+ * @description Identificadores de otras validaciones de la misma cuenta con el mismo comprobante (hasta 20). No se tocan: cada una guarda su propia copia de lo extraído y se borra por separado.
3351
+ * @example []
3352
+ */
3353
+ same_image_validation_ids: string[];
3354
+ };
3355
+ };
3356
+ };
3357
+ /** @description Cuerpo de `POST /v1/validations/{id}/purge/execute`: el token del paso de preparación. */
3358
+ ValidationPurgeExecuteRequest: {
3359
+ /**
3360
+ * @description Token que devolvió `POST /v1/validations/{id}/purge/prepare` para esta misma validación y esta misma cuenta. Es de un solo uso y caduca en el plazo que indicó `expires_in`.
3361
+ * @example eyJhZG1pbl9pZCI6Ii4uLiJ9.q1w2e3r4t5y6u7i8o9p0
3362
+ */
3363
+ confirmation_token: string;
3364
+ };
3365
+ /** @description Respuesta de `POST /v1/validations/{id}/purge/execute`: la validación quedó purgada y esto es lo que se borró. */
3366
+ ValidationPurgeExecuteResponse: {
3367
+ /** @description Recurso JSON:API del borrado. Su `id` es el de la validación. */
3368
+ data: components["schemas"]["JsonApiResourceBase"] & {
3369
+ /**
3370
+ * @description Tipo del recurso, fijo para esta operación. Forma parte de su identidad en la envoltura JSON:API. Siempre `validation_purge`.
3371
+ * @example validation_purge
3372
+ * @enum {string}
3373
+ */
3374
+ type: "validation_purge";
3375
+ /**
3376
+ * Format: uuid
3377
+ * @description Identificador de la validación purgada.
3378
+ * @example 3fa85f64-5717-4562-b3fc-2c963f66afa6
3379
+ */
3380
+ id: string;
3381
+ /** @description Resultado del borrado. */
3382
+ attributes: {
3383
+ /**
3384
+ * Format: date-time
3385
+ * @description Fecha y hora, en ISO 8601 UTC, en que la validación quedó purgada.
3386
+ * @example 2026-10-02T09:30:00Z
3387
+ */
3388
+ purged_at: string;
3389
+ /**
3390
+ * @description Estado del borrado de los archivos — `complete`: Los archivos ya no existen; `pending`: Algún archivo no se pudo borrar en este momento y el barrido diario lo termina. El contenido de la base de datos ya está borrado en los dos casos y el archivo no se sirve.
3391
+ * @example complete
3392
+ * @enum {string}
3393
+ */
3394
+ file_removal: "complete" | "pending";
3395
+ /** @description Lo que se borró. Los contadores cuentan filas tocadas; los booleanos dicen si había algo que borrar. */
3396
+ deleted: {
3397
+ /** @description `true` cuando había un archivo del comprobante. */
3398
+ image?: boolean;
3399
+ /** @description `true` cuando había un PDF del CEP. */
3400
+ cep_pdf?: boolean;
3401
+ /** @description `true` cuando el borrado cerró un ciclo de reintentos que seguía abierto. */
3402
+ retry_cycle_cancelled?: boolean;
3403
+ /** @description Intentos de reintento borrados. */
3404
+ retry_attempts?: number;
3405
+ /** @description Sondeos de cuenta candidata borrados. */
3406
+ probe_attempts?: number;
3407
+ /** @description Entregas de webhook a las que se les quitó el cuerpo enviado y la respuesta del receptor. */
3408
+ webhook_deliveries?: number;
3409
+ /** @description Entregas de notificación cuyo contenido se vació. */
3410
+ notification_deliveries?: number;
3411
+ /** @description Notificaciones de la bandeja que se borraron. */
3412
+ notifications?: number;
3413
+ /** @description Respuestas guardadas de `Idempotency-Key` que se borraron. */
3414
+ idempotency_responses?: number;
3415
+ /** @description Filas de importación masiva cuyo contenido se vació. */
3416
+ import_rows?: number;
3417
+ /** @description Filas de auditoría a las que se les quitaron los cuerpos. Falta cuando ese barrido no se pudo completar. */
3418
+ audit_log_rows?: number;
3419
+ /** @description Eventos de seguridad cuyo contexto se redactó. Falta cuando ese barrido no se pudo completar. */
3420
+ security_events_rows?: number;
3421
+ };
3422
+ };
3423
+ };
3424
+ };
2918
3425
  /** @description Banco participante del catálogo SPEI, en formato JSON:API. `id` y `attributes.code` son siempre iguales (`id` se conserva como identificador estable del recurso aunque `code` lo duplique). */
2919
3426
  BankResource: components["schemas"]["JsonApiResourceBase"] & {
2920
3427
  /**
@@ -2976,7 +3483,7 @@ export interface components {
2976
3483
  */
2977
3484
  bin: string;
2978
3485
  /**
2979
- * @description Nombre oficial del banco, resuelto a partir de su `bank_code`.
3486
+ * @description Nombre del banco registrado para ese BIN.
2980
3487
  * @example BBVA MEXICO
2981
3488
  */
2982
3489
  bank_name: string;
@@ -3011,25 +3518,103 @@ export interface components {
3011
3518
  BinLookupResponse: components["schemas"]["SuccessEnvelope"] & {
3012
3519
  data: components["schemas"]["BinResource"];
3013
3520
  };
3014
- /** @description Cupo de beneficiarios activos del plan y ocupación actual de la cuenta autenticada. */
3015
- BeneficiaryCapacity: {
3016
- /** @description Tope de beneficiarios activos. `-1` significa sin tope. */
3017
- max?: number;
3018
- /** @description Cantidad de beneficiarios activos guardados, independientemente del filtro de archivados. */
3019
- current?: number;
3020
- /** @description Cantidad de lugares necesarios para crear o reactivar cuentas del trabajo de importación. */
3021
- required?: number;
3022
- /** @description `true` cuando el trabajo de importación necesita lugares nuevos y supera el cupo disponible. */
3023
- exceeded?: boolean;
3024
- };
3025
- /** @description Cuenta beneficiaria registrada como recurso JSON:API. Puede ser una CLABE, un número de tarjeta o un número de celular DiMo. El tipo de cuenta se autodetecta por longitud al momento de inserción. */
3026
- Beneficiary: components["schemas"]["JsonApiResourceBase"] & {
3521
+ /** @description Calendario de días inhábiles SPEI de un año, en formato JSON:API. `id` y `attributes.year` son siempre iguales: el año del calendario. */
3522
+ SpeiCalendarResource: components["schemas"]["JsonApiResourceBase"] & {
3027
3523
  /**
3028
- * @description Tipo de recurso JSON:API. Siempre `beneficiary`.
3029
- * @example beneficiary
3524
+ * @description Tipo de recurso JSON:API. Siempre `spei_calendar`.
3525
+ * @example spei_calendar
3030
3526
  * @enum {string}
3031
3527
  */
3032
- type: "beneficiary";
3528
+ type: "spei_calendar";
3529
+ /**
3530
+ * @description Año del calendario (cuatro dígitos).
3531
+ * @example 2026
3532
+ */
3533
+ id: string;
3534
+ /** @description Datos del calendario del año. */
3535
+ attributes: {
3536
+ /**
3537
+ * @description Año del calendario (cuatro dígitos). Mismo valor que `id`.
3538
+ * @example 2026
3539
+ */
3540
+ year: number;
3541
+ /**
3542
+ * @description Días inhábiles que caen de lunes a viernes (`YYYY-MM-DD`), de menor a mayor. Los sábados y los domingos también son inhábiles y no se repiten aquí.
3543
+ * @example [
3544
+ * "2026-01-01",
3545
+ * "2026-02-02",
3546
+ * "2026-03-16",
3547
+ * "2026-04-02",
3548
+ * "2026-04-03",
3549
+ * "2026-05-01",
3550
+ * "2026-09-16",
3551
+ * "2026-11-02",
3552
+ * "2026-11-16",
3553
+ * "2026-12-25"
3554
+ * ]
3555
+ */
3556
+ non_business_days: string[];
3557
+ /** @description Disposición oficial de la que sale el calendario. */
3558
+ source: {
3559
+ /**
3560
+ * @description Siglas de la autoridad que emite la disposición, por ejemplo `CNBV`.
3561
+ * @example CNBV
3562
+ */
3563
+ issuer: string;
3564
+ /**
3565
+ * @description Siglas del medio oficial en el que se publicó la disposición, por ejemplo `DOF`.
3566
+ * @example DOF
3567
+ */
3568
+ published_in: string;
3569
+ /**
3570
+ * Format: date
3571
+ * @description Fecha de publicación de la disposición (`YYYY-MM-DD`).
3572
+ * @example 2025-12-10
3573
+ */
3574
+ published_on: string;
3575
+ /**
3576
+ * @description Título oficial de la disposición, en español.
3577
+ * @example Disposiciones de carácter general que señalan los días del año 2026 en que las entidades financieras sujetas a la supervisión de la Comisión Nacional Bancaria y de Valores deberán cerrar sus puertas y suspender operaciones
3578
+ */
3579
+ title: string;
3580
+ };
3581
+ };
3582
+ };
3583
+ /** @description Respuesta de `GET /v1/public/spei-calendar/{year}`. Un único recurso con los días inhábiles SPEI del año y su fuente, y en `meta.covered_years` los años que tienen calendario. Un año sin calendario responde `404`, no este cuerpo. */
3584
+ SpeiCalendarResponse: components["schemas"]["SuccessEnvelope"] & {
3585
+ data: components["schemas"]["SpeiCalendarResource"];
3586
+ /** @description Metadatos de la respuesta. */
3587
+ meta?: {
3588
+ /**
3589
+ * @description Años con calendario publicado, de menor a mayor.
3590
+ * @example [
3591
+ * 2024,
3592
+ * 2025,
3593
+ * 2026
3594
+ * ]
3595
+ */
3596
+ covered_years?: number[];
3597
+ };
3598
+ };
3599
+ /** @description Cupo de beneficiarios activos del plan y ocupación actual de la cuenta autenticada. */
3600
+ BeneficiaryCapacity: {
3601
+ /** @description Tope de beneficiarios activos. `-1` significa sin tope. */
3602
+ max?: number;
3603
+ /** @description Cantidad de beneficiarios activos guardados, independientemente del filtro de archivados. */
3604
+ current?: number;
3605
+ /** @description Cantidad de lugares necesarios para crear o reactivar cuentas del trabajo de importación. */
3606
+ required?: number;
3607
+ /** @description `true` cuando el trabajo de importación necesita lugares nuevos y supera el cupo disponible. */
3608
+ exceeded?: boolean;
3609
+ };
3610
+ /** @description Cuenta beneficiaria registrada como recurso JSON:API. Puede ser una CLABE, un número de tarjeta o un número de celular DiMo. El tipo de cuenta se autodetecta por longitud al momento de inserción. */
3611
+ Beneficiary: components["schemas"]["JsonApiResourceBase"] & {
3612
+ /**
3613
+ * @description Tipo de recurso JSON:API. Siempre `beneficiary`.
3614
+ * @example beneficiary
3615
+ * @enum {string}
3616
+ */
3617
+ type: "beneficiary";
3033
3618
  /**
3034
3619
  * @description Identificador numérico del beneficiario en el sistema.
3035
3620
  * @example 42
@@ -3049,12 +3634,12 @@ export interface components {
3049
3634
  */
3050
3635
  account_type: "clabe" | "card" | "phone";
3051
3636
  /**
3052
- * @description Código SPEI (5 dígitos) del banco resuelto.
3637
+ * @description Código SPEI (5 dígitos) del banco resuelto. Es la cadena vacía (`""`) cuando la cuenta no tiene un banco conocido: una tarjeta cuyo BIN no está en el directorio. En ese caso `bank_name` trae un texto de relleno en el idioma de la petición.
3053
3638
  * @example 40012
3054
3639
  */
3055
3640
  bank_code: string;
3056
3641
  /**
3057
- * @description Nombre oficial del banco, resuelto a partir de su `bank_code`.
3642
+ * @description Nombre oficial del banco, resuelto a partir de su `bank_code`. Con un `bank_code` vacío es un texto de relleno («BIN no reconocido (411111)»), que se traduce al idioma de la petición.
3058
3643
  * @example BBVA MEXICO
3059
3644
  */
3060
3645
  bank_name: string;
@@ -3152,7 +3737,7 @@ export interface components {
3152
3737
  */
3153
3738
  account_type: "clabe" | "card" | "phone";
3154
3739
  /**
3155
- * @description Código SPEI (5 dígitos) del banco resuelto.
3740
+ * @description Código SPEI (5 dígitos) del banco resuelto. Es la cadena vacía (`""`) para una tarjeta cuyo BIN no está en el directorio.
3156
3741
  * @example 40012
3157
3742
  */
3158
3743
  bank_code: string;
@@ -3176,12 +3761,13 @@ export interface components {
3176
3761
  CreateBeneficiaryImportRequest: {
3177
3762
  /**
3178
3763
  * Format: binary
3179
- * @description Archivo a importar. Formatos aceptados: CSV, XLS, XLSX, TXT o PDF. Tamaño máximo: 20 MB.
3764
+ * @description Archivo a importar. Formatos aceptados: CSV, XLS, XLSX, TXT, JSON o PDF. Tamaño máximo: 20 MB.
3180
3765
  * @example beneficiarios-marzo.csv
3181
3766
  */
3182
3767
  file: string;
3183
3768
  /**
3184
3769
  * @description Modo de lectura del archivo — `template`: Respeta los encabezados canónicos; `free`: Formato libre, el sistema deduce la estructura.
3770
+ * @default template
3185
3771
  * @example template
3186
3772
  * @enum {string}
3187
3773
  */
@@ -3237,11 +3823,11 @@ export interface components {
3237
3823
  */
3238
3824
  status?: "pending" | "parsing" | "preview_ready" | "committing" | "completed" | "failed" | "cancelled";
3239
3825
  /**
3240
- * @description Formato del archivo subido. Aceptados: `csv`, `xls`, `xlsx`, `txt` o `pdf`.
3826
+ * @description Formato del archivo subido. Aceptados: `csv`, `xls`, `xlsx`, `txt`, `json` o `pdf`.
3241
3827
  * @example csv
3242
3828
  * @enum {string}
3243
3829
  */
3244
- file_format?: "csv" | "xls" | "xlsx" | "txt" | "pdf";
3830
+ file_format?: "csv" | "xls" | "xlsx" | "txt" | "json" | "pdf";
3245
3831
  /**
3246
3832
  * @description Modo de lectura del archivo — `template`: Respeta los encabezados canónicos; `free`: Formato libre, el sistema deduce la estructura.
3247
3833
  * @example template
@@ -3289,7 +3875,7 @@ export interface components {
3289
3875
  */
3290
3876
  llm_invoked?: boolean;
3291
3877
  /**
3292
- * @description Código estable del fallo del trabajo. `null` cuando no terminó en `failed`. Por ejemplo, `file_corrupt` o `plan_cap_exceeded`.
3878
+ * @description Código estable del fallo del trabajo. `null` cuando no terminó en `failed`. Por ejemplo, `file_corrupt` o `empty_file`.
3293
3879
  * @example null
3294
3880
  */
3295
3881
  error_code?: string | null;
@@ -3395,7 +3981,7 @@ export interface components {
3395
3981
  [key: string]: unknown;
3396
3982
  };
3397
3983
  /**
3398
- * @description Fragmento del archivo original para diagnóstico. Los dígitos de 6 o más caracteres consecutivos aparecen enmascarados (`••••`) para evitar exposición de números de tarjeta en los cuerpos de depuración.
3984
+ * @description Fragmento del archivo original para diagnóstico. Las series de 13 a 19 dígitos que no son una CLABE (18 dígitos) aparecen enmascaradas (`••••` y los últimos cuatro), igual que un número de celular de 10 dígitos cuando lo precede una etiqueta como «cuenta» o «celular», para evitar exposición de números de tarjeta en los cuerpos de depuración.
3399
3985
  * @example {}
3400
3986
  */
3401
3987
  raw_preview?: {
@@ -3532,17 +4118,17 @@ export interface components {
3532
4118
  /** @description Estadísticas de uso de la API, cuota de validaciones y estado de Banxico para la cuenta. */
3533
4119
  ApiUsage: {
3534
4120
  /**
3535
- * @description Cantidad de peticiones a la API del usuario en el día calendario actual (UTC).
4121
+ * @description Cantidad de peticiones del usuario con clave de API en el día calendario actual (UTC).
3536
4122
  * @example 42
3537
4123
  */
3538
4124
  requests_today?: number;
3539
4125
  /**
3540
- * @description Cantidad de peticiones a la API del usuario en el mes calendario actual (UTC).
4126
+ * @description Cantidad de peticiones del usuario con clave de API en el mes calendario actual (UTC).
3541
4127
  * @example 580
3542
4128
  */
3543
4129
  requests_month?: number;
3544
4130
  quota?: components["schemas"]["PlanQuotaState"];
3545
- /** @description Últimas peticiones a la API del usuario, de la más reciente a la más antigua. */
4131
+ /** @description Últimas 15 peticiones del usuario con clave de API, de la más reciente a la más antigua. */
3546
4132
  recent_requests?: {
3547
4133
  /**
3548
4134
  * @description Verbo HTTP de la petición. Uno de `GET`, `POST`, `PUT`, `PATCH` o `DELETE`.
@@ -3613,7 +4199,7 @@ export interface components {
3613
4199
  */
3614
4200
  monthly_validations?: number;
3615
4201
  /**
3616
- * @description Cantidad de validaciones no retiradas del mes UTC en curso cuyo estado almacenado es `pending` o `processing`.
4202
+ * @description Cantidad de validaciones no retiradas del mes UTC en curso cuyo estado almacenado es `queued` o `processing`.
3617
4203
  * @example 3
3618
4204
  */
3619
4205
  pending_month?: number;
@@ -3629,7 +4215,7 @@ export interface components {
3629
4215
  avg_ticket?: number;
3630
4216
  /**
3631
4217
  * @description Tasa de éxito, expresada de `0` a `100`: `valid_validations` entre `total_validations`, redondeada a un decimal. La población histórica es la misma e incluye las validaciones retiradas y las del banco de pruebas (Playground); devuelve `0` cuando el total es `0`.
3632
- * @example 0
4218
+ * @example 90.3
3633
4219
  */
3634
4220
  success_rate_percent?: number;
3635
4221
  /**
@@ -3658,11 +4244,16 @@ export interface components {
3658
4244
  /**
3659
4245
  * Format: uuid
3660
4246
  * @description Identificador único de la validación (UUID v4).
3661
- * @example a1b2c3d4-e5f6-7890-abcd-ef0123456789
4247
+ * @example a1b2c3d4-e5f6-4890-abcd-ef0123456789
3662
4248
  */
3663
4249
  id?: string;
3664
4250
  /** @description Datos resumidos de la validación reciente mostrados en el panel. */
3665
4251
  attributes?: {
4252
+ /**
4253
+ * @description Clave Banxico canónica del banco, si se puede resolver.
4254
+ * @example 40012
4255
+ */
4256
+ bank_code?: string | null;
3666
4257
  /**
3667
4258
  * @description Nombre del banco de la contraparte. Prioriza `receptor_name` o `emisor_name` guardado; si falta, intenta resolver el código de receptor o emisor. Si tampoco puede resolverlo, devuelve ese código o `Banco no identificado`.
3668
4259
  * @example BBVA MEXICO
@@ -3736,6 +4327,33 @@ export interface components {
3736
4327
  /** @description Veredictos que admiten reintentos automáticos. */
3737
4328
  eligible_outcomes?: string[];
3738
4329
  };
4330
+ /** @description Política de reintentos guardada de la cuenta: activación, límite, intervalo y resultados elegibles. Desactivada o sin configurar, trae `enabled=false`, `max_retries=0`, `interval_seconds=0` y `outcomes` vacío. */
4331
+ SavedRetryPolicy: {
4332
+ /**
4333
+ * @description `true` cuando el ciclo de reintentos está activo. Si es `false`, los demás campos pueden ser ignorados.
4334
+ * @example true
4335
+ */
4336
+ enabled?: boolean;
4337
+ /**
4338
+ * @description Número máximo de reintentos automáticos. Una vez alcanzado, el ciclo pasa al estado terminal `exhausted`.
4339
+ * @example 3
4340
+ */
4341
+ max_retries?: number;
4342
+ /**
4343
+ * @description Segundos de espera entre cada reintento. Valores válidos: 300–86400 (5 min a 24h).
4344
+ * @example 600
4345
+ */
4346
+ interval_seconds?: number;
4347
+ /**
4348
+ * @description Resultados que originan un reintento. De forma predeterminada son `not_found`, `cep_unavailable` y `error`; la combinación `["not_found", "cep_unavailable"]` excluye `error`.
4349
+ * @example [
4350
+ * "not_found",
4351
+ * "cep_unavailable",
4352
+ * "error"
4353
+ * ]
4354
+ */
4355
+ outcomes?: ("not_found" | "cep_unavailable" | "error")[];
4356
+ };
3739
4357
  UserRetryPolicyResponse: components["schemas"]["SuccessEnvelope"] & {
3740
4358
  /** @description Metadatos de la respuesta y límites efectivos de reintentos. */
3741
4359
  meta?: {
@@ -3745,7 +4363,7 @@ export interface components {
3745
4363
  data?: {
3746
4364
  /** @enum {string} */
3747
4365
  type?: "retry_policy";
3748
- attributes?: components["schemas"]["RetryPolicy"];
4366
+ attributes?: components["schemas"]["SavedRetryPolicy"];
3749
4367
  };
3750
4368
  };
3751
4369
  /** @description Cuerpo de la petición para actualizar la política de reintentos por defecto del usuario (aplica a futuras validaciones). */
@@ -3755,7 +4373,7 @@ export interface components {
3755
4373
  /** @description Estado público del servicio de verificación de Banxico, tal como lo devuelve `GET /v1/status/banxico`. Muestra el estado operativo actual y una explicación legible. */
3756
4374
  BanxicoPublicStatus: {
3757
4375
  /**
3758
- * @description Estado agregado del servicio de verificación de Banxico — `operational`: Todas las pruebas pasan y la latencia es normal; `degraded`: Problemas parciales (latencia elevada o errores intermitentes); `down`: Servicio inaccesible; `unknown`: Aún no hay datos de salud disponibles.
4376
+ * @description Estado agregado del servicio de verificación de Banxico — `operational`: Todas las pruebas pasan y la latencia es normal; `degraded`: Problemas parciales (latencia elevada o errores intermitentes); `down`: Servicio inaccesible; `unknown`: no hay datos de salud vigentes, porque aún no se ha ejecutado ningún chequeo o porque el último tiene más de tres veces `check_interval_seconds` de antigüedad (el chequeo automático dejó de correr).
3759
4377
  * @example operational
3760
4378
  * @enum {string}
3761
4379
  */
@@ -3771,7 +4389,7 @@ export interface components {
3771
4389
  */
3772
4390
  message: string;
3773
4391
  /**
3774
- * @description Timestamp del último chequeo de salud ejecutado. `null` cuando aún no se ha ejecutado ningún chequeo.
4392
+ * @description Timestamp del último chequeo de salud ejecutado. `null` cuando aún no se ha ejecutado ningún chequeo. Cuando `status` es `unknown` por un chequeo demasiado viejo, conserva la fecha de ese chequeo: dice desde cuándo no hay dato.
3775
4393
  * @example 2026-04-11T15:30:00Z
3776
4394
  */
3777
4395
  last_verified_at: components["schemas"]["TimestampUTC"] | null;
@@ -3882,7 +4500,7 @@ export interface components {
3882
4500
  */
3883
4501
  url: string;
3884
4502
  /** @description Eventos a los que se suscribe el endpoint webhook. Entre 1 y 10. */
3885
- events: ("validation.completed" | "validation.failed" | "validation.error" | "validation.retry.scheduled" | "validation.retry.resolved" | "validation.retry.exhausted" | "billing.payment_succeeded" | "billing.payment_failed" | "billing.trial_will_end" | "billing.subscription_canceled" | "billing.invoice_upcoming")[];
4503
+ events: ("validation.completed" | "validation.failed" | "validation.error" | "validation.retry.scheduled" | "validation.retry.resolved" | "validation.retry.exhausted" | "validation.returned" | "billing.payment_succeeded" | "billing.payment_failed" | "billing.trial_will_end" | "billing.subscription_canceled" | "billing.invoice_upcoming")[];
3886
4504
  /**
3887
4505
  * @description Etiqueta libre para distinguir el endpoint webhook de los demás.
3888
4506
  * @example Alta de pagos en el ERP
@@ -3919,12 +4537,12 @@ export interface components {
3919
4537
  CreateWebhookRequest: {
3920
4538
  /**
3921
4539
  * Format: uri
3922
- * @description URL receptora del webhook. En producción se rechaza si no usa HTTPS, si resuelve a una dirección privada o si pasa de 2048 caracteres.
4540
+ * @description URL receptora del webhook. Se rechaza si resuelve a una dirección privada o si pasa de 2048 caracteres y, en producción, también si no usa HTTPS.
3923
4541
  * @example https://example.com/webhooks/entregas
3924
4542
  */
3925
4543
  url: string;
3926
4544
  /** @description Eventos a los que se suscribe el endpoint webhook. Entre 1 y 10. */
3927
- events: ("validation.completed" | "validation.failed" | "validation.error" | "validation.retry.scheduled" | "validation.retry.resolved" | "validation.retry.exhausted" | "billing.payment_succeeded" | "billing.payment_failed" | "billing.trial_will_end" | "billing.subscription_canceled" | "billing.invoice_upcoming")[];
4545
+ events: ("validation.completed" | "validation.failed" | "validation.error" | "validation.retry.scheduled" | "validation.retry.resolved" | "validation.retry.exhausted" | "validation.returned" | "billing.payment_succeeded" | "billing.payment_failed" | "billing.trial_will_end" | "billing.subscription_canceled" | "billing.invoice_upcoming")[];
3928
4546
  /**
3929
4547
  * @description Etiqueta libre para distinguir el endpoint webhook de los demás. `null` la omite; más de 255 caracteres responde `422 webhook_description_too_long`.
3930
4548
  * @example Alta de pagos en el ERP
@@ -3935,12 +4553,12 @@ export interface components {
3935
4553
  UpdateWebhookRequest: {
3936
4554
  /**
3937
4555
  * Format: uri
3938
- * @description Nueva URL receptora del webhook. En producción se rechaza si no usa HTTPS, si no resuelve a una dirección pública o si supera 2048 caracteres.
4556
+ * @description Nueva URL receptora del webhook. Se rechaza si no resuelve a una dirección pública o si supera 2048 caracteres y, en producción, también si no usa HTTPS.
3939
4557
  * @example https://example.com/webhooks/entregas
3940
4558
  */
3941
4559
  url?: string;
3942
4560
  /** @description Nuevos eventos a los que se suscribe el endpoint webhook. Sustituyen a la lista anterior. Entre 1 y 10. */
3943
- events?: ("validation.completed" | "validation.failed" | "validation.error" | "validation.retry.scheduled" | "validation.retry.resolved" | "validation.retry.exhausted" | "billing.payment_succeeded" | "billing.payment_failed" | "billing.trial_will_end" | "billing.subscription_canceled" | "billing.invoice_upcoming")[];
4561
+ events?: ("validation.completed" | "validation.failed" | "validation.error" | "validation.retry.scheduled" | "validation.retry.resolved" | "validation.retry.exhausted" | "validation.returned" | "billing.payment_succeeded" | "billing.payment_failed" | "billing.trial_will_end" | "billing.subscription_canceled" | "billing.invoice_upcoming")[];
3944
4562
  /**
3945
4563
  * @description Nueva etiqueta libre para distinguir el endpoint webhook de los demás. `null` la elimina; más de 255 caracteres responde `422 webhook_description_too_long`.
3946
4564
  * @example Alta de pagos en el ERP
@@ -4007,7 +4625,7 @@ export interface components {
4007
4625
  * @example validation.completed
4008
4626
  * @enum {string}
4009
4627
  */
4010
- event_type: "validation.completed" | "validation.failed" | "validation.error" | "validation.retry.scheduled" | "validation.retry.resolved" | "validation.retry.exhausted" | "billing.payment_succeeded" | "billing.payment_failed" | "billing.trial_will_end" | "billing.subscription_canceled" | "billing.invoice_upcoming" | "test";
4628
+ event_type: "validation.completed" | "validation.failed" | "validation.error" | "validation.retry.scheduled" | "validation.retry.resolved" | "validation.retry.exhausted" | "validation.returned" | "billing.payment_succeeded" | "billing.payment_failed" | "billing.trial_will_end" | "billing.subscription_canceled" | "billing.invoice_upcoming" | "test";
4011
4629
  /**
4012
4630
  * Format: uuid
4013
4631
  * @description Identificador único de la validación (UUID v4) asociada cuando el evento es `validation.*`. `null` cuando el evento es otro.
@@ -4272,13 +4890,13 @@ export interface components {
4272
4890
  */
4273
4891
  remaining: number;
4274
4892
  /**
4275
- * @description Porcentaje del límite consumido en el ciclo actual, redondeado a 2 decimales.
4893
+ * @description Porcentaje del límite consumido en el ciclo actual, redondeado a 2 decimales. Puede pasar de 100 si hay excedente.
4276
4894
  * @example 70.5
4277
4895
  */
4278
4896
  used_percent: number;
4279
4897
  /**
4280
4898
  * @description Nivel de alerta según el consumo: `ok` (<70 %), `warn` (70–89 %), `danger` (≥90 % o cuota agotada).
4281
- * @example ok
4899
+ * @example warn
4282
4900
  * @enum {string}
4283
4901
  */
4284
4902
  tone: "ok" | "warn" | "danger";
@@ -4391,10 +5009,30 @@ export interface components {
4391
5009
  type?: "usage_limits";
4392
5010
  /** @description Datos de los límites: los límites por contexto y sus notas. */
4393
5011
  attributes?: {
4394
- /** @description Límites de tasa por contexto. Cada entrada trae sólo los que ese contexto aplica: `api` lleva `ip_per_minute`; `login`, los cuatro. */
5012
+ /** @description Límites de tasa por contexto. Cada entrada trae sólo los que ese contexto aplica: `api` lleva `key_per_minute`, `ip_ceiling_per_minute` e `ip_per_minute`; `webhooks`, `host_per_minute` y `host_global_per_minute`; `login`, los cuatro de IP y correo electrónico. `key_per_minute` y `host_per_minute` los fija el plan de la cuenta. */
4395
5013
  rate_limits?: {
4396
5014
  [key: string]: {
4397
- /** @description Cantidad máxima de peticiones por dirección IP por minuto. */
5015
+ /**
5016
+ * @description Peticiones por minuto de una clave de la cuenta en la API, según su plan. Rige a las peticiones autenticadas.
5017
+ * @example 240
5018
+ */
5019
+ key_per_minute?: number;
5020
+ /**
5021
+ * @description Techo de peticiones por minuto por dirección IP para las peticiones autenticadas, todas las claves de un mismo origen juntas.
5022
+ * @example 1200
5023
+ */
5024
+ ip_ceiling_per_minute?: number;
5025
+ /**
5026
+ * @description Entregas de webhook por minuto que la cuenta puede enviar hacia un mismo host destino, según su plan.
5027
+ * @example 60
5028
+ */
5029
+ host_per_minute?: number;
5030
+ /**
5031
+ * @description Tope de entregas de webhook por minuto hacia un mismo host destino, todos los clientes juntos.
5032
+ * @example 600
5033
+ */
5034
+ host_global_per_minute?: number;
5035
+ /** @description Cantidad máxima de peticiones por dirección IP por minuto. En `api` sólo rige a las peticiones anónimas, sin clave. */
4398
5036
  ip_per_minute?: number;
4399
5037
  /** @description Cantidad máxima de peticiones por dirección IP por hora. */
4400
5038
  ip_per_hour?: number;
@@ -4432,12 +5070,12 @@ export interface components {
4432
5070
  /** @description Lista de celdas del mapa; cada entrada es una combinación de `day_of_week` y `hour_of_day` con su conteo. */
4433
5071
  buckets?: {
4434
5072
  /**
4435
- * @description Día de la semana (0 = domingo … 6 = sábado).
5073
+ * @description Día de la semana en UTC (0 = domingo … 6 = sábado).
4436
5074
  * @example 0
4437
5075
  */
4438
5076
  day_of_week?: number;
4439
5077
  /**
4440
- * @description Hora del día (0–23), hora del servidor.
5078
+ * @description Hora del día (0–23), en UTC.
4441
5079
  * @example 0
4442
5080
  */
4443
5081
  hour_of_day?: number;
@@ -4632,22 +5270,20 @@ export interface components {
4632
5270
  */
4633
5271
  month?: string;
4634
5272
  /**
4635
- * Format: date-time
4636
- * @description Inicio del mes en UTC (ISO 8601).
4637
- * @example 2026-04-01T06:00:00Z
5273
+ * @description Inicio del mes en UTC, con formato `YYYY-MM-DD HH:MM:SS`.
5274
+ * @example 2026-04-01 06:00:00
4638
5275
  */
4639
5276
  from_utc?: string;
4640
5277
  /**
4641
- * Format: date-time
4642
- * @description Fin del mes en UTC (ISO 8601, exclusivo).
4643
- * @example 2026-05-01T06:00:00Z
5278
+ * @description Fin del mes en UTC (exclusivo), con formato `YYYY-MM-DD HH:MM:SS`.
5279
+ * @example 2026-05-01 06:00:00
4644
5280
  */
4645
5281
  to_utc?: string;
4646
5282
  };
4647
5283
  /** @description Conteos de validaciones por veredicto, más retiros mediante borrado lógico del periodo (informativo). */
4648
5284
  counts?: {
4649
5285
  /**
4650
- * @description Cantidad de validaciones completadas en el periodo (excluyendo las validaciones con estado `pending`).
5286
+ * @description Cantidad de validaciones del periodo, incluidas las que tienen estado `pending`.
4651
5287
  * @example 287
4652
5288
  */
4653
5289
  total?: number;
@@ -4736,7 +5372,7 @@ export interface components {
4736
5372
  verified_share_pct?: number;
4737
5373
  };
4738
5374
  /**
4739
- * @description Tasa de éxito: porcentaje de validaciones con resultado `valid` sobre el total completado, expresado de 0 a 100.
5375
+ * @description Tasa de éxito: porcentaje de validaciones con resultado `valid` sobre `counts.total`, expresado de 0 a 100.
4740
5376
  * @example 79.4
4741
5377
  */
4742
5378
  success_rate?: number;
@@ -4891,9 +5527,20 @@ export interface components {
4891
5527
  * @description Nombres de las columnas para formato CSV (en el mismo orden que las filas en `rows`).
4892
5528
  * @example [
4893
5529
  * "Fecha",
4894
- * "Monto",
5530
+ * "Folio plataforma",
5531
+ * "Tipo",
4895
5532
  * "Clave de rastreo",
4896
- * "Estado"
5533
+ * "Fecha operación",
5534
+ * "Monto",
5535
+ * "Banco emisor",
5536
+ * "CLABE emisora",
5537
+ * "Banco receptor",
5538
+ * "CLABE receptora",
5539
+ * "Beneficiario",
5540
+ * "Veredicto Banxico",
5541
+ * "CEP disponible",
5542
+ * "Folio CEP",
5543
+ * "Tiempo (ms)"
4897
5544
  * ]
4898
5545
  */
4899
5546
  headers?: string[];
@@ -4901,10 +5548,21 @@ export interface components {
4901
5548
  * @description Primeras 20 filas (máximo) de datos del reporte.
4902
5549
  * @example [
4903
5550
  * [
5551
+ * "2026-04-15 10:32:00",
5552
+ * "c3d4e5f6-a7b8-9012-cdef-123456789012",
5553
+ * "direct",
5554
+ * "MXBA20260415001234",
4904
5555
  * "2026-04-15",
4905
5556
  * "15000.50",
4906
- * "MXBA20260415001234",
4907
- * "valid"
5557
+ * "BBVA MEXICO",
5558
+ * "012180001234567891",
5559
+ * "BANORTE",
5560
+ * "072180009876543210",
5561
+ * "Comercializadora Ejemplo SA de CV",
5562
+ * "valid",
5563
+ * "Sí",
5564
+ * "",
5565
+ * "412"
4908
5566
  * ]
4909
5567
  * ]
4910
5568
  */
@@ -4924,7 +5582,7 @@ export interface components {
4924
5582
  plan_slug?: string;
4925
5583
  /**
4926
5584
  * @description Nombre del plan que muestran las interfaces.
4927
- * @example Pro
5585
+ * @example Personal
4928
5586
  */
4929
5587
  plan_name?: string;
4930
5588
  /**
@@ -5051,17 +5709,59 @@ export interface components {
5051
5709
  BillingSubscriptionQuotaMeta: {
5052
5710
  /**
5053
5711
  * @description Identificador único y legible del plan. Coincide con `data.attributes.plan_slug`.
5054
- * @example pro
5712
+ * @example personal
5713
+ */
5714
+ plan_slug?: string;
5715
+ /**
5716
+ * @description Nombre del plan que muestran las interfaces.
5717
+ * @example Personal
5718
+ */
5719
+ plan_name?: string;
5720
+ /**
5721
+ * @description Modelo de facturación del plan — `free`: Sin cobro; `tiered`: Cuota fija; `metered`: Cobro por consumo; `hybrid`: Cuota fija más consumo.
5722
+ * @example hybrid
5723
+ * @enum {string}
5724
+ */
5725
+ billing_model?: "free" | "tiered" | "metered" | "hybrid";
5726
+ /**
5727
+ * @description Origen de la suscripción — `stripe`: Pago mediante Stripe; `admin_granted`: Concesión administrativa; `system_default`: Plan asignado por el sistema.
5728
+ * @example stripe
5729
+ * @enum {string}
5055
5730
  */
5056
- plan?: string;
5731
+ source?: "stripe" | "admin_granted" | "system_default";
5732
+ /**
5733
+ * @description `true` cuando el usuario aceptó cobro por excedente en un plan `hybrid`. En ese caso, `effective_limit` salta de `included_validations` a `monthly_validation_limit`.
5734
+ * @example false
5735
+ */
5736
+ overage_enabled?: boolean;
5737
+ /**
5738
+ * @description `true` cuando el plan es `hybrid` y el cobro por excedente todavía no está activo: el usuario puede activarlo.
5739
+ * @example false
5740
+ */
5741
+ overage_available?: boolean;
5742
+ /**
5743
+ * @description Límite del ciclo fijado por un administrador para esta suscripción. Cuando existe, manda sobre el del plan. `null` sin ajuste.
5744
+ * @example null
5745
+ */
5746
+ monthly_limit_override?: number | null;
5747
+ /**
5748
+ * @description Validaciones incluidas en la cuota base antes del cobro por excedentes. `null` cuando el plan no tiene cuota base.
5749
+ * @example 500
5750
+ */
5751
+ included_validations?: number | null;
5752
+ /**
5753
+ * @description Tope de validaciones por ciclo de la suscripción. `0` no permite validaciones. En planes `hybrid`, es el tope duro cuando `overage_enabled` es `true`; cuando es `false`, `effective_limit` usa `included_validations`. En los demás modelos, es el límite efectivo salvo que exista un ajuste administrativo.
5754
+ * @example 10000
5755
+ */
5756
+ monthly_validation_limit?: number;
5057
5757
  /**
5058
5758
  * @description Validaciones consumidas en el ciclo actual.
5059
- * @example 420
5759
+ * @example 220
5060
5760
  */
5061
5761
  used?: number;
5062
5762
  /**
5063
- * @description Límite efectivo de validaciones para el ciclo actual. Tiene el mismo valor que `data.attributes.effective_limit`.
5064
- * @example 500
5763
+ * @description Límite efectivo de validaciones para el ciclo actual. Tiene el mismo valor que `data.attributes.effective_limit`, salvo con `quota_kind=trial`: entonces es la asignación de prueba.
5764
+ * @example 300
5065
5765
  */
5066
5766
  limit?: number;
5067
5767
  /**
@@ -5119,7 +5819,31 @@ export interface components {
5119
5819
  * ],
5120
5820
  * "meta": {
5121
5821
  * "version": "1.51.0",
5122
- * "request_id": "1a2b3c4d5e6f"
5822
+ * "request_id": "1a2b3c4d5e6ff6e5d4c3b2a1"
5823
+ * }
5824
+ * }
5825
+ */
5826
+ "application/json": components["schemas"]["ErrorResponse"];
5827
+ };
5828
+ };
5829
+ /** @description El cuerpo de la petición llegó vacío cuando la operación necesita datos (`body_empty`). */
5830
+ BodyEmpty: {
5831
+ headers: {
5832
+ [name: string]: unknown;
5833
+ };
5834
+ content: {
5835
+ /**
5836
+ * @example {
5837
+ * "errors": [
5838
+ * {
5839
+ * "status": "400",
5840
+ * "code": "body_empty",
5841
+ * "detail": "El cuerpo de la petición está vacío."
5842
+ * }
5843
+ * ],
5844
+ * "meta": {
5845
+ * "version": "1.51.0",
5846
+ * "request_id": "2b3c4d5e6f7aa7f6e5d4c3b2"
5123
5847
  * }
5124
5848
  * }
5125
5849
  */
@@ -5143,7 +5867,7 @@ export interface components {
5143
5867
  * ],
5144
5868
  * "meta": {
5145
5869
  * "version": "1.51.0",
5146
- * "request_id": "c4d5e6f7a8b9"
5870
+ * "request_id": "c4d5e6f7a8b99b8a7f6e5d4c"
5147
5871
  * }
5148
5872
  * }
5149
5873
  */
@@ -5155,11 +5879,11 @@ export interface components {
5155
5879
  headers: {
5156
5880
  /** @description Segundos a esperar antes de reintentar. Coincide con la ventana de rate-limit del endpoint (típicamente 60s para listas, 1-5s para operaciones idempotentes en vuelo). */
5157
5881
  "Retry-After"?: number;
5158
- /** @description Límite de solicitudes configurado para este bucket (emitido sólo en 429). */
5882
+ /** @description Límite de solicitudes configurado para este bucket. Se emite en cada 429 y, en la API autenticada, también en las respuestas correctas, donde es el tope por clave del plan de la cuenta. */
5159
5883
  "X-RateLimit-Limit"?: number;
5160
- /** @description Solicitudes restantes en la ventana actual — siempre 0 en el momento del 429 (emitido sólo en 429). */
5884
+ /** @description Solicitudes restantes en la ventana actual. Siempre 0 en el momento del 429; en una respuesta correcta de la API autenticada es lo que queda del tope por clave. */
5161
5885
  "X-RateLimit-Remaining"?: number;
5162
- /** @description Unix epoch absoluto (segundos) en que se reinicia la ventana. Emitido sólo en 429, junto con Retry-After. Puede existir sobreescritura por endpoint (p. ej. `rate_limited_login`). */
5886
+ /** @description Unix epoch absoluto (segundos) en que se reinicia la ventana. Se emite en cada 429, junto con Retry-After, y en las respuestas correctas de la API autenticada. Puede existir sobreescritura por endpoint (p. ej. `rate_limited_login`). */
5163
5887
  "X-RateLimit-Reset"?: number;
5164
5888
  [name: string]: unknown;
5165
5889
  };
@@ -5175,7 +5899,7 @@ export interface components {
5175
5899
  * ],
5176
5900
  * "meta": {
5177
5901
  * "version": "1.51.0",
5178
- * "request_id": "f7a8b9c0d1e2",
5902
+ * "request_id": "f7a8b9c0d1e22e1d0c9b8a7f",
5179
5903
  * "retry_after": 45
5180
5904
  * }
5181
5905
  * }
@@ -5221,7 +5945,7 @@ export interface components {
5221
5945
  * ],
5222
5946
  * "meta": {
5223
5947
  * "version": "1.51.0",
5224
- * "request_id": "3c4d5e6f7a8b"
5948
+ * "request_id": "3c4d5e6f7a8bb8a7f6e5d4c3"
5225
5949
  * }
5226
5950
  * }
5227
5951
  */
@@ -5247,7 +5971,7 @@ export interface components {
5247
5971
  * ],
5248
5972
  * "meta": {
5249
5973
  * "version": "1.51.0",
5250
- * "request_id": "2b3c4d5e6f7a"
5974
+ * "request_id": "2b3c4d5e6f7aa7f6e5d4c3b2"
5251
5975
  * }
5252
5976
  * }
5253
5977
  */
@@ -5274,13 +5998,37 @@ export interface components {
5274
5998
  * "errors": [
5275
5999
  * {
5276
6000
  * "status": "403",
5277
- * "code": "forbidden",
6001
+ * "code": "permission_denied",
5278
6002
  * "detail": "No tienes permiso para acceder a este recurso."
5279
6003
  * }
5280
6004
  * ],
5281
6005
  * "meta": {
5282
6006
  * "version": "1.51.0",
5283
- * "request_id": "d5e6f7a8b9c0"
6007
+ * "request_id": "d5e6f7a8b9c00c9b8a7f6e5d"
6008
+ * }
6009
+ * }
6010
+ */
6011
+ "application/json": components["schemas"]["ErrorResponse"];
6012
+ };
6013
+ };
6014
+ /** @description La validación se purgó y este recurso ya no existe (`validation_purged`). */
6015
+ ValidationPurged: {
6016
+ headers: {
6017
+ [name: string]: unknown;
6018
+ };
6019
+ content: {
6020
+ /**
6021
+ * @example {
6022
+ * "errors": [
6023
+ * {
6024
+ * "status": "410",
6025
+ * "code": "validation_purged",
6026
+ * "detail": "La validación se purgó y este recurso ya no existe."
6027
+ * }
6028
+ * ],
6029
+ * "meta": {
6030
+ * "version": "1.61.0",
6031
+ * "request_id": "1a2b3c4d5e6ff6e5d4c3b2a1"
5284
6032
  * }
5285
6033
  * }
5286
6034
  */
@@ -5316,7 +6064,7 @@ export interface components {
5316
6064
  * ],
5317
6065
  * "meta": {
5318
6066
  * "version": "1.51.0",
5319
- * "request_id": "e6f7a8b9c0d1"
6067
+ * "request_id": "e6f7a8b9c0d11d0c9b8a7f6e"
5320
6068
  * }
5321
6069
  * }
5322
6070
  */
@@ -5340,7 +6088,7 @@ export interface components {
5340
6088
  * ],
5341
6089
  * "meta": {
5342
6090
  * "version": "1.51.0",
5343
- * "request_id": "d5e6f7a8b9c1"
6091
+ * "request_id": "d5e6f7a8b9c11c9b8a7f6e5d"
5344
6092
  * }
5345
6093
  * }
5346
6094
  */
@@ -5355,7 +6103,7 @@ export interface components {
5355
6103
  AsyncQueryParam: "0" | "1" | "true" | "false" | "yes";
5356
6104
  /** @description Identificador (UUID) de la validación */
5357
6105
  ValidationId: string;
5358
- /** @description **ETag** recibido en peticiones anteriores. Si los datos no han cambiado y el `etag_version` sigue igual, el server responde `304 Not Modified` (sin cuerpo) — evita recibir los datos de nuevo cuando el estado del recurso NO ha cambiado. */
6106
+ /** @description **ETag** recibido en una respuesta anterior, tal cual (débil `W/"…"` en una validación, fuerte en los catálogos públicos). Si el recurso no ha cambiado, el server responde `304 Not Modified` (sin cuerpo) y evita mandar los datos de nuevo. */
5359
6107
  IfNoneMatchHeader: string;
5360
6108
  };
5361
6109
  requestBodies: never;
@@ -5430,7 +6178,7 @@ export interface operations {
5430
6178
  401: components["responses"]["Unauthorized"];
5431
6179
  409: components["responses"]["IdempotencyKeyInProgress"];
5432
6180
  413: components["responses"]["PayloadTooLarge"];
5433
- /** @description Falló la validación de la petición. Códigos típicos: `clave_or_ref_required`, `required` (fecha/monto), `invalid_date`, `invalid_amount`, `invalid_account_format`, `invalid_account_length`, `invalid_clabe_checksum`, `invalid_card_luhn`, `invalid_bank_code` (`emisor`/`receptor` no reconocidos), `intra_bank_no_cep` (emisor y receptor son el mismo banco), `invalid_field_type` (un campo que debe ser texto llegó como arreglo u objeto — p. ej. `emisor`, `receptor` o `referencia_numerica`), `invalid_receptor_participante`, `retry_policy_invalid`, `retry_pending_cap_exceeded`. También se emite cuando se reutiliza `Idempotency-Key` con un cuerpo distinto (`idempotency_key_reused`). Cuando los datos se contradicen entre sí, la petición se rechaza antes de consultar a Banxico con `preflight_failed` y el detalle por campo en `errors` (`clabe_receptor_mismatch` y `tarjeta_receptor_mismatch`: la cuenta pertenece a otro banco que el `receptor`; `cuenta_invalid_luhn`; `clave_fecha_incoherente`; `clave_longitud_invalida`). También se rechaza con `preflight_failed` cuando falta `cuenta_beneficiaria` (`cuenta_required`). Ningún rechazo `preflight_failed` de esta ruta consume cuota, sea por datos que se contradicen, por un campo mal formado o por una cuenta ausente. */
6181
+ /** @description Falló la validación de la petición. Códigos típicos: `clave_or_ref_required`, `required` (fecha/monto), `invalid_date`, `invalid_amount`, `invalid_account_format`, `invalid_account_length`, `invalid_clabe_checksum`, `invalid_card_luhn`, `invalid_bank_code` (`emisor`/`receptor` no reconocidos), `intra_bank_no_cep` (emisor y receptor son el mismo banco), `invalid_field_type` (un campo que debe ser texto llegó como arreglo u objeto — p. ej. `emisor`, `receptor` o `referencia_numerica`), `invalid_receptor_participante`, `retry_policy_invalid`, `retry_pending_cap_exceeded`, `cuenta_y_candidatas_excluyentes` (`cuenta_beneficiaria` y `cuentas_candidatas` juntas), `cuentas_candidatas_invalidas` (la lista no tiene de 2 al máximo vigente de cuentas válidas y distintas) y `cuenta_unresolvable_after_probes` (ninguna candidata coincidió con la transferencia). También se emite cuando se reutiliza `Idempotency-Key` con un cuerpo distinto (`idempotency_key_reused`). Cuando los datos se contradicen entre sí, la petición se rechaza antes de consultar a Banxico con `preflight_failed` y el detalle por campo en `errors` (`clabe_receptor_mismatch` y `tarjeta_receptor_mismatch`: la cuenta pertenece a otro banco que el `receptor`; `cuenta_invalid_luhn`; `clave_fecha_incoherente`; `clave_longitud_invalida`). También se rechaza con `preflight_failed` cuando falta `cuenta_beneficiaria` (`cuenta_required`). Ningún rechazo `preflight_failed` de esta ruta consume cuota, sea por datos que se contradicen, por un campo mal formado o por una cuenta ausente. */
5434
6182
  422: {
5435
6183
  headers: {
5436
6184
  [name: string]: unknown;
@@ -5488,7 +6236,7 @@ export interface operations {
5488
6236
  401: components["responses"]["Unauthorized"];
5489
6237
  409: components["responses"]["IdempotencyKeyInProgress"];
5490
6238
  413: components["responses"]["PayloadTooLarge"];
5491
- /** @description La imagen o los datos de la petición no son válidos. Códigos posibles: `image_or_image_url_required`, `invalid_image`, `invalid_image_format`, `image_too_large`, `invalid_url`, `invalid_url_scheme`, `url_ssrf_blocked`, `invalid_clabe_checksum`. También puede devolver: `image_too_small`, `image_mime_mismatch`, `image_dimensions_too_large`, `image_decompression_bomb`, `image_polyglot_detected`, `image_url_unreachable`, `image_url_too_large`, `image_url_too_many_redirects`. Con un PDF: `pdf_invalid_structure`, `pdf_encrypted`, `pdf_active_content`, `pdf_hidden_content`, `pdf_modified_after_issue`, `pdf_too_many_pages`, `pdf_unsupported_image`, `pdf_text_layer_too_large` y `pdf_multiple_receipts`. En modo asíncrono, un fallo genérico de la imagen se reporta como `image_invalid`. Reutilizar `Idempotency-Key` con un cuerpo distinto produce `idempotency_key_reused`. */
6239
+ /** @description La imagen o los datos de la petición no son válidos. Códigos posibles: `image_or_image_url_required`, `invalid_image`, `invalid_image_format`, `image_too_large`, `invalid_url`, `invalid_url_scheme`, `url_ssrf_blocked`, `invalid_clabe_checksum`. También puede devolver: `image_too_small`, `image_mime_mismatch`, `image_dimensions_too_large`, `image_decompression_bomb`, `image_polyglot_detected`, `image_url_unreachable`, `image_url_too_large`, `image_url_too_many_redirects`. Con un PDF: `pdf_invalid_structure`, `pdf_encrypted`, `pdf_active_content`, `pdf_hidden_content`, `pdf_modified_after_issue`, `pdf_too_many_pages`, `pdf_unsupported_image`, `pdf_text_layer_too_large` y `pdf_multiple_receipts`. Con `retain_image` que no es booleano: `invalid_retain_image`. Con `cuentas_candidatas`: `cuenta_y_candidatas_excluyentes`, `cuentas_candidatas_invalidas` y, si ninguna candidata coincide, `cuenta_unresolvable_after_probes`. En modo asíncrono, un fallo genérico de la imagen se reporta como `image_invalid`. Reutilizar `Idempotency-Key` con un cuerpo distinto produce `idempotency_key_reused`. */
5492
6240
  422: {
5493
6241
  headers: {
5494
6242
  [name: string]: unknown;
@@ -5572,6 +6320,11 @@ export interface operations {
5572
6320
  * @example 012
5573
6321
  */
5574
6322
  bank?: string;
6323
+ /**
6324
+ * @description Filtro — Varias claves SPEI separadas por coma (hasta 50); devuelve las validaciones cuyo banco emisor o receptor sea cualquiera de ellas. Si un elemento no tiene de 1 a 5 dígitos, responde con estado HTTP `422` e `invalid_filter`. Se combina con `bank`: si mandas los dos, se cumplen ambos.
6325
+ * @example 40012,40014,40072
6326
+ */
6327
+ banks?: string;
5575
6328
  /**
5576
6329
  * @description Filtro — Importe mínimo inclusivo, como número. El servidor también tolera enviarlo como texto con separador de miles o símbolo de moneda ("1,000.50", "$500") y lo normaliza con el mismo algoritmo que el resto de la plataforma, pero el contrato es un número: un cliente tipado debe mandarlo así. Un valor no vacío que no se reconozca como número devuelve un estado HTTP `422` con `invalid_filter`, en vez de ignorarse en silencio. Se aplica de forma independiente de `amount_max`.
5577
6330
  * @example 1000.5
@@ -5677,6 +6430,11 @@ export interface operations {
5677
6430
  * @example 012
5678
6431
  */
5679
6432
  bank?: string;
6433
+ /**
6434
+ * @description Filtro — Varias claves SPEI separadas por coma (hasta 50); devuelve las validaciones cuyo banco emisor o receptor sea cualquiera de ellas. Si un elemento no tiene de 1 a 5 dígitos, responde con estado HTTP `422` e `invalid_filter`. Se combina con `bank`: si mandas los dos, se cumplen ambos.
6435
+ * @example 40012,40014,40072
6436
+ */
6437
+ banks?: string;
5680
6438
  /**
5681
6439
  * @description Filtro — Importe mínimo inclusivo de las validaciones contadas.
5682
6440
  * @example 1000.5
@@ -5790,6 +6548,11 @@ export interface operations {
5790
6548
  * @example 012
5791
6549
  */
5792
6550
  bank?: string;
6551
+ /**
6552
+ * @description Filtro — Varias claves SPEI separadas por coma (hasta 50); devuelve las validaciones cuyo banco emisor o receptor sea cualquiera de ellas. Si un elemento no tiene de 1 a 5 dígitos, responde con estado HTTP `422` e `invalid_filter`. Se combina con `bank`: si mandas los dos, se cumplen ambos.
6553
+ * @example 40012,40014,40072
6554
+ */
6555
+ banks?: string;
5793
6556
  /**
5794
6557
  * @description Filtro — Importe mínimo inclusivo. Se aplica de forma independiente de `amount_max`.
5795
6558
  * @example 1000.5
@@ -5840,7 +6603,7 @@ export interface operations {
5840
6603
  parameters: {
5841
6604
  query?: never;
5842
6605
  header?: {
5843
- /** @description **ETag** recibido en peticiones anteriores. Si los datos no han cambiado y el `etag_version` sigue igual, el server responde `304 Not Modified` (sin cuerpo) — evita recibir los datos de nuevo cuando el estado del recurso NO ha cambiado. */
6606
+ /** @description **ETag** recibido en una respuesta anterior, tal cual (débil `W/"…"` en una validación, fuerte en los catálogos públicos). Si el recurso no ha cambiado, el server responde `304 Not Modified` (sin cuerpo) y evita mandar los datos de nuevo. */
5844
6607
  "If-None-Match"?: components["parameters"]["IfNoneMatchHeader"];
5845
6608
  };
5846
6609
  path: {
@@ -5971,7 +6734,7 @@ export interface operations {
5971
6734
  };
5972
6735
  401: components["responses"]["Unauthorized"];
5973
6736
  403: components["responses"]["Forbidden"];
5974
- /** @description Validación no encontrada (`not_found`) o el CEP no está disponible para esta validación (`cep_not_available`). Este último código se devuelve cuando `banxico_status` no es `valid` o falta el archivo solicitado. */
6737
+ /** @description Validación no encontrada (`not_found`) o el CEP no está disponible para esta validación (`cep_not_available`). Este último código se devuelve cuando `banxico_status` no es `valid` ni `returned` o falta el archivo solicitado. */
5975
6738
  404: {
5976
6739
  headers: {
5977
6740
  [name: string]: unknown;
@@ -5980,6 +6743,7 @@ export interface operations {
5980
6743
  "application/json": components["schemas"]["ErrorResponse"];
5981
6744
  };
5982
6745
  };
6746
+ 410: components["responses"]["ValidationPurged"];
5983
6747
  /** @description UUID inválido en la ruta (`invalid_uuid`). */
5984
6748
  422: {
5985
6749
  headers: {
@@ -6046,6 +6810,7 @@ export interface operations {
6046
6810
  "application/json": components["schemas"]["ErrorResponse"];
6047
6811
  };
6048
6812
  };
6813
+ 410: components["responses"]["ValidationPurged"];
6049
6814
  /** @description UUID inválido en la ruta (`invalid_uuid`). */
6050
6815
  422: {
6051
6816
  headers: {
@@ -6112,6 +6877,15 @@ export interface operations {
6112
6877
  "application/json": components["schemas"]["ErrorResponse"];
6113
6878
  };
6114
6879
  };
6880
+ /** @description La imagen no existe por decisión del cliente: la validación se creó con `retain_image=false` (`image_not_retained`) o se purgó (`validation_purged`). */
6881
+ 410: {
6882
+ headers: {
6883
+ [name: string]: unknown;
6884
+ };
6885
+ content: {
6886
+ "application/json": components["schemas"]["ErrorResponse"];
6887
+ };
6888
+ };
6115
6889
  /** @description UUID inválido en la ruta (`invalid_uuid`). */
6116
6890
  422: {
6117
6891
  headers: {
@@ -6157,6 +6931,7 @@ export interface operations {
6157
6931
  "application/json": components["schemas"]["ErrorResponse"];
6158
6932
  };
6159
6933
  };
6934
+ 410: components["responses"]["ValidationPurged"];
6160
6935
  /** @description UUID inválido en la ruta (`invalid_uuid`). */
6161
6936
  422: {
6162
6937
  headers: {
@@ -6227,6 +7002,7 @@ export interface operations {
6227
7002
  "application/json": components["schemas"]["ErrorResponse"];
6228
7003
  };
6229
7004
  };
7005
+ 410: components["responses"]["ValidationPurged"];
6230
7006
  413: components["responses"]["PayloadTooLarge"];
6231
7007
  /** @description Política inválida o precondición no cumplida. `retry_policy_invalid`, la forma, el rango o el resultado no se admiten; `retry_not_supported_for_bulk`, la validación nació de una importación; `retry_not_applicable`, su estado queda fuera de los tres que admiten reintento (`not_found`, `cep_unavailable`, `error`) o cambió mientras tanto; `retry_already_resolved`, el ciclo ya cerró; `retry_age_exceeded`, la validación es más vieja que `max_age_seconds`; `retry_pending_cap_exceeded`, se alcanzó el tope de pendientes de la cuenta de usuario o el de despachados en 24 horas; `reactivation_cap_exceeded`, se alcanzó el tope de reactivaciones de esa validación. */
6232
7008
  422: {
@@ -6285,6 +7061,7 @@ export interface operations {
6285
7061
  "application/json": components["schemas"]["ErrorResponse"];
6286
7062
  };
6287
7063
  };
7064
+ 410: components["responses"]["ValidationPurged"];
6288
7065
  /** @description No hay ciclo de reintentos activo que cancelar (código `retry_not_active`). UUID inválido (`invalid_uuid`). */
6289
7066
  422: {
6290
7067
  headers: {
@@ -6296,11 +7073,203 @@ export interface operations {
6296
7073
  };
6297
7074
  };
6298
7075
  };
7076
+ recheckValidation: {
7077
+ parameters: {
7078
+ query?: never;
7079
+ header?: never;
7080
+ path: {
7081
+ /** @description Identificador (UUID) de la validación */
7082
+ id: components["parameters"]["ValidationId"];
7083
+ };
7084
+ cookie?: never;
7085
+ };
7086
+ requestBody?: never;
7087
+ responses: {
7088
+ /** @description Estado de pago consultado. Devuelve la validación y, en `meta.recheck`, cuándo se consultó, si cambió a `returned` y qué veredicto tenía antes. */
7089
+ 200: {
7090
+ headers: {
7091
+ /** @description ETag débil de la validación después de la consulta. Sigue el formato `W/"{etag_version}-{status}"` y sube en cada consulta, aunque el veredicto no cambie. */
7092
+ ETag?: string;
7093
+ [name: string]: unknown;
7094
+ };
7095
+ content: {
7096
+ "application/json": components["schemas"]["SuccessEnvelope"] & {
7097
+ data?: components["schemas"]["Validation"];
7098
+ meta?: {
7099
+ recheck?: components["schemas"]["ValidationRecheckMeta"];
7100
+ };
7101
+ };
7102
+ };
7103
+ };
7104
+ 401: components["responses"]["Unauthorized"];
7105
+ 403: components["responses"]["Forbidden"];
7106
+ /** @description Validación no encontrada, retirada o ajena a la cuenta de usuario (`not_found`). */
7107
+ 404: {
7108
+ headers: {
7109
+ [name: string]: unknown;
7110
+ };
7111
+ content: {
7112
+ "application/json": components["schemas"]["ErrorResponse"];
7113
+ };
7114
+ };
7115
+ 410: components["responses"]["ValidationPurged"];
7116
+ /** @description La validación no se puede consultar: su estado no es `valid` ni `returned` (código `recheck_not_eligible`, con el estado en `meta.status`) o tiene más horas que la ventana (código `recheck_window_expired`, con la ventana en `meta.window_hours`). UUID inválido (`invalid_uuid`). */
7117
+ 422: {
7118
+ headers: {
7119
+ [name: string]: unknown;
7120
+ };
7121
+ content: {
7122
+ "application/json": components["schemas"]["ErrorResponse"];
7123
+ };
7124
+ };
7125
+ /** @description La validación se consultó hace menos de 10 minutos (código `recheck_rate_limited`). `Retry-After` y `meta.retry_after` dan los segundos que faltan. También responde así el límite de peticiones de la clave de API (`rate_limit_exceeded`). */
7126
+ 429: {
7127
+ headers: {
7128
+ /** @description Segundos que faltan para poder consultar esta validación de nuevo. */
7129
+ "Retry-After"?: number;
7130
+ [name: string]: unknown;
7131
+ };
7132
+ content: {
7133
+ "application/json": components["schemas"]["ErrorResponse"];
7134
+ };
7135
+ };
7136
+ /** @description Banxico no entregó un estado legible, o la consulta de estado está apagada (código `recheck_unavailable`). La validación no cambia y conserva su intervalo. `Retry-After` y `meta.retry_after` sugieren esperar 60 segundos. */
7137
+ 503: {
7138
+ headers: {
7139
+ /** @description Segundos que se sugiere esperar antes de reintentar. */
7140
+ "Retry-After"?: number;
7141
+ [name: string]: unknown;
7142
+ };
7143
+ content: {
7144
+ "application/json": components["schemas"]["ErrorResponse"];
7145
+ };
7146
+ };
7147
+ };
7148
+ };
7149
+ prepareValidationPurge: {
7150
+ parameters: {
7151
+ query?: never;
7152
+ header?: never;
7153
+ path: {
7154
+ /** @description Identificador (UUID) de la validación */
7155
+ id: components["parameters"]["ValidationId"];
7156
+ };
7157
+ cookie?: never;
7158
+ };
7159
+ requestBody?: never;
7160
+ responses: {
7161
+ /** @description Resumen de lo que se borraría y token de confirmación. La validación no cambió. */
7162
+ 200: {
7163
+ headers: {
7164
+ [name: string]: unknown;
7165
+ };
7166
+ content: {
7167
+ "application/json": components["schemas"]["SuccessEnvelope"] & components["schemas"]["ValidationPurgePrepareResponse"];
7168
+ };
7169
+ };
7170
+ 401: components["responses"]["Unauthorized"];
7171
+ 403: components["responses"]["Forbidden"];
7172
+ /** @description Validación no encontrada, o ajena a la cuenta de usuario (`not_found`). */
7173
+ 404: {
7174
+ headers: {
7175
+ [name: string]: unknown;
7176
+ };
7177
+ content: {
7178
+ "application/json": components["schemas"]["ErrorResponse"];
7179
+ };
7180
+ };
7181
+ /** @description La validación sigue en curso (`queued` o `processing`) y todavía no se puede purgar (`purge_validation_in_progress`, con el estado en `meta.status`). */
7182
+ 409: {
7183
+ headers: {
7184
+ [name: string]: unknown;
7185
+ };
7186
+ content: {
7187
+ "application/json": components["schemas"]["ErrorResponse"];
7188
+ };
7189
+ };
7190
+ 410: components["responses"]["ValidationPurged"];
7191
+ /** @description UUID inválido en la ruta (`invalid_uuid`). */
7192
+ 422: {
7193
+ headers: {
7194
+ [name: string]: unknown;
7195
+ };
7196
+ content: {
7197
+ "application/json": components["schemas"]["ErrorResponse"];
7198
+ };
7199
+ };
7200
+ 429: components["responses"]["RateLimited"];
7201
+ };
7202
+ };
7203
+ executeValidationPurge: {
7204
+ parameters: {
7205
+ query?: never;
7206
+ header?: never;
7207
+ path: {
7208
+ /** @description Identificador (UUID) de la validación */
7209
+ id: components["parameters"]["ValidationId"];
7210
+ };
7211
+ cookie?: never;
7212
+ };
7213
+ requestBody: {
7214
+ content: {
7215
+ /**
7216
+ * @example {
7217
+ * "confirmation_token": "eyJhZG1pbl9pZCI6Ii4uLiJ9.q1w2e3r4t5y6u7i8o9p0"
7218
+ * }
7219
+ */
7220
+ "application/json": components["schemas"]["ValidationPurgeExecuteRequest"];
7221
+ };
7222
+ };
7223
+ responses: {
7224
+ /** @description Validación purgada. Devuelve cuándo se purgó, el estado del borrado de los archivos y lo que se borró. */
7225
+ 200: {
7226
+ headers: {
7227
+ [name: string]: unknown;
7228
+ };
7229
+ content: {
7230
+ "application/json": components["schemas"]["SuccessEnvelope"] & components["schemas"]["ValidationPurgeExecuteResponse"];
7231
+ };
7232
+ };
7233
+ 400: components["responses"]["BodyEmpty"];
7234
+ 401: components["responses"]["Unauthorized"];
7235
+ 403: components["responses"]["Forbidden"];
7236
+ /** @description Validación no encontrada, o ajena a la cuenta de usuario (`not_found`). */
7237
+ 404: {
7238
+ headers: {
7239
+ [name: string]: unknown;
7240
+ };
7241
+ content: {
7242
+ "application/json": components["schemas"]["ErrorResponse"];
7243
+ };
7244
+ };
7245
+ /** @description El token ya se usó (`confirmation_token_already_used`), o la validación sigue en curso y todavía no se puede purgar (`purge_validation_in_progress`, con el estado en `meta.status`). */
7246
+ 409: {
7247
+ headers: {
7248
+ [name: string]: unknown;
7249
+ };
7250
+ content: {
7251
+ "application/json": components["schemas"]["ErrorResponse"];
7252
+ };
7253
+ };
7254
+ 410: components["responses"]["ValidationPurged"];
7255
+ 413: components["responses"]["PayloadTooLarge"];
7256
+ /** @description El token no sirve. Códigos posibles: `confirmation_token_missing`, `confirmation_token_malformed`, `confirmation_token_signature_invalid`, `confirmation_token_expired`, `confirmation_token_operation_mismatch` y `purge_token_mismatch` (el token es de otra validación o de otra cuenta). UUID inválido en la ruta (`invalid_uuid`). */
7257
+ 422: {
7258
+ headers: {
7259
+ [name: string]: unknown;
7260
+ };
7261
+ content: {
7262
+ "application/json": components["schemas"]["ErrorResponse"];
7263
+ };
7264
+ };
7265
+ 429: components["responses"]["RateLimited"];
7266
+ };
7267
+ };
6299
7268
  listBanks: {
6300
7269
  parameters: {
6301
7270
  query?: never;
6302
7271
  header?: {
6303
- /** @description **ETag** recibido en peticiones anteriores. Si los datos no han cambiado y el `etag_version` sigue igual, el server responde `304 Not Modified` (sin cuerpo) — evita recibir los datos de nuevo cuando el estado del recurso NO ha cambiado. */
7272
+ /** @description **ETag** recibido en una respuesta anterior, tal cual (débil `W/"…"` en una validación, fuerte en los catálogos públicos). Si el recurso no ha cambiado, el server responde `304 Not Modified` (sin cuerpo) y evita mandar los datos de nuevo. */
6304
7273
  "If-None-Match"?: components["parameters"]["IfNoneMatchHeader"];
6305
7274
  };
6306
7275
  path?: never;
@@ -6363,6 +7332,109 @@ export interface operations {
6363
7332
  429: components["responses"]["RateLimited"];
6364
7333
  };
6365
7334
  };
7335
+ getSpeiCalendar: {
7336
+ parameters: {
7337
+ query?: never;
7338
+ header?: {
7339
+ /** @description **ETag** recibido en una respuesta anterior, tal cual (débil `W/"…"` en una validación, fuerte en los catálogos públicos). Si el recurso no ha cambiado, el server responde `304 Not Modified` (sin cuerpo) y evita mandar los datos de nuevo. */
7340
+ "If-None-Match"?: components["parameters"]["IfNoneMatchHeader"];
7341
+ };
7342
+ path: {
7343
+ /**
7344
+ * @description Año del calendario, de cuatro dígitos.
7345
+ * @example 2026
7346
+ */
7347
+ year: number;
7348
+ };
7349
+ cookie?: never;
7350
+ };
7351
+ requestBody?: never;
7352
+ responses: {
7353
+ /** @description Calendario de días inhábiles SPEI del año, con su fuente. */
7354
+ 200: {
7355
+ headers: {
7356
+ /** @description Firma del calendario actual. Pasar como `If-None-Match` en peticiones posteriores. */
7357
+ ETag?: string;
7358
+ /** @description TTL de caché en el cliente (1 h). */
7359
+ "Cache-Control"?: string;
7360
+ [name: string]: unknown;
7361
+ };
7362
+ content: {
7363
+ "application/json": components["schemas"]["SpeiCalendarResponse"];
7364
+ };
7365
+ };
7366
+ /** @description No modificado: el calendario no ha cambiado según el ETag enviado. */
7367
+ 304: {
7368
+ headers: {
7369
+ /** @description ETag actual del calendario. */
7370
+ ETag?: string;
7371
+ /** @description TTL de caché en el cliente (1 h). */
7372
+ "Cache-Control"?: string;
7373
+ [name: string]: unknown;
7374
+ };
7375
+ content?: never;
7376
+ };
7377
+ /** @description El año no tiene calendario (código `spei_calendar_year_not_covered`). `meta.covered_years` lista los años disponibles. */
7378
+ 404: {
7379
+ headers: {
7380
+ [name: string]: unknown;
7381
+ };
7382
+ content: {
7383
+ /**
7384
+ * @example {
7385
+ * "errors": [
7386
+ * {
7387
+ * "status": "404",
7388
+ * "code": "spei_calendar_year_not_covered",
7389
+ * "detail": "No tenemos el calendario de 2030. Los años disponibles van de 2024 a 2026."
7390
+ * }
7391
+ * ],
7392
+ * "meta": {
7393
+ * "version": "1.63.0",
7394
+ * "request_id": "c1d2e3f4a5b66b5a4f3e2d1c",
7395
+ * "covered_years": [
7396
+ * 2024,
7397
+ * 2025,
7398
+ * 2026
7399
+ * ]
7400
+ * }
7401
+ * }
7402
+ */
7403
+ "application/json": components["schemas"]["ErrorResponse"] & {
7404
+ meta?: {
7405
+ /** @description Años con calendario publicado, de menor a mayor. */
7406
+ covered_years?: number[];
7407
+ };
7408
+ };
7409
+ };
7410
+ };
7411
+ /** @description El año no tiene cuatro dígitos (código `spei_calendar_year_invalid`). */
7412
+ 422: {
7413
+ headers: {
7414
+ [name: string]: unknown;
7415
+ };
7416
+ content: {
7417
+ /**
7418
+ * @example {
7419
+ * "errors": [
7420
+ * {
7421
+ * "status": "422",
7422
+ * "code": "spei_calendar_year_invalid",
7423
+ * "detail": "El año debe tener cuatro dígitos, por ejemplo 2026."
7424
+ * }
7425
+ * ],
7426
+ * "meta": {
7427
+ * "version": "1.63.0",
7428
+ * "request_id": "d2e3f4a5b6c77c6b5a4f3e2d"
7429
+ * }
7430
+ * }
7431
+ */
7432
+ "application/json": components["schemas"]["ErrorResponse"];
7433
+ };
7434
+ };
7435
+ 429: components["responses"]["RateLimited"];
7436
+ };
7437
+ };
6366
7438
  exportBeneficiaries: {
6367
7439
  parameters: {
6368
7440
  query?: {
@@ -6461,7 +7533,6 @@ export interface operations {
6461
7533
  * "attributes": {
6462
7534
  * "account_number": "012180004412345678",
6463
7535
  * "account_type": "clabe",
6464
- * "clabe": "012180004412345678",
6465
7536
  * "bank_code": "40012",
6466
7537
  * "bank_name": "BBVA MEXICO",
6467
7538
  * "label": "Proveedor ABC",
@@ -6501,7 +7572,7 @@ export interface operations {
6501
7572
  401: components["responses"]["Unauthorized"];
6502
7573
  403: components["responses"]["Forbidden"];
6503
7574
  413: components["responses"]["PayloadTooLarge"];
6504
- /** @description La cuenta no pasó la validación, o el alta chocó con un tope. Los códigos posibles son `account_number_required`, `account_number_invalid_type`, `label_invalid_type`, `invalid_account_length`, `clabe_prefix_not_recognized`, `bank_code_required_for_phone`, `beneficiary_already_registered` y `plan_cap_exceeded`. `account_number_invalid_type` y `label_invalid_type` aparecen cuando el campo llega con un tipo distinto de cadena de texto. Todo error de campo trae `source.pointer`. */
7575
+ /** @description La cuenta no pasó la validación, o el alta chocó con un tope. Los códigos posibles son `account_number_required`, `account_number_invalid_type`, `label_invalid_type`, `invalid_account_format`, `invalid_account_length`, `invalid_clabe_checksum`, `invalid_card_luhn`, `clabe_prefix_not_recognized`, `bank_code_required_for_phone`, `invalid_bank_code`, `max_length_exceeded`, `beneficiary_already_registered` y `plan_cap_exceeded`. `account_number_invalid_type` y `label_invalid_type` aparecen cuando el campo llega con un tipo distinto de cadena de texto. Todo error de campo trae `source.pointer`. */
6505
7576
  422: {
6506
7577
  headers: {
6507
7578
  [name: string]: unknown;
@@ -6545,7 +7616,6 @@ export interface operations {
6545
7616
  * "attributes": {
6546
7617
  * "account_number": "5512345678",
6547
7618
  * "account_type": "phone",
6548
- * "clabe": "5512345678",
6549
7619
  * "bank_code": "40021",
6550
7620
  * "bank_name": "HSBC",
6551
7621
  * "label": "Cuenta DiMo HSBC",
@@ -6576,7 +7646,7 @@ export interface operations {
6576
7646
  403: components["responses"]["Forbidden"];
6577
7647
  404: components["responses"]["NotFound"];
6578
7648
  413: components["responses"]["PayloadTooLarge"];
6579
- /** @description El cuerpo no pasó la validación. Los códigos posibles son `no_valid_fields`, `invalid_account_length`, `clabe_prefix_not_recognized`, `bank_code_required_for_phone`, `account_number_invalid_type` y `label_invalid_type`. Las dos últimas aparecen cuando `account_number` o `label` llegan con un tipo distinto de cadena de texto (por ejemplo, un número o un arreglo). Todo error de campo trae `source.pointer`. */
7649
+ /** @description El cuerpo no pasó la validación. Los códigos posibles son `no_valid_fields`, `invalid_account_format`, `invalid_account_length`, `invalid_clabe_checksum`, `invalid_card_luhn`, `clabe_prefix_not_recognized`, `bank_code_required_for_phone`, `invalid_bank_code`, `max_length_exceeded`, `beneficiary_already_registered`, `account_number_invalid_type` y `label_invalid_type`. Las dos últimas aparecen cuando `account_number` o `label` llegan con un tipo distinto de cadena de texto (por ejemplo, un número o un arreglo). Todo error de campo trae `source.pointer`. */
6580
7650
  422: {
6581
7651
  headers: {
6582
7652
  [name: string]: unknown;
@@ -6667,7 +7737,7 @@ export interface operations {
6667
7737
  * "meta": {
6668
7738
  * "version": "1.47.0",
6669
7739
  * "api_version": "v1",
6670
- * "request_id": "b2c3d4e5f6a7"
7740
+ * "request_id": "b2c3d4e5f6a77a6f5e4d3c2b"
6671
7741
  * }
6672
7742
  * }
6673
7743
  */
@@ -6724,7 +7794,7 @@ export interface operations {
6724
7794
  * "meta": {
6725
7795
  * "version": "1.47.0",
6726
7796
  * "api_version": "v1",
6727
- * "request_id": "c5d6e7f8a9b0"
7797
+ * "request_id": "c5d6e7f8a9b00b9a8f7e6d5c"
6728
7798
  * }
6729
7799
  * }
6730
7800
  */
@@ -6764,7 +7834,7 @@ export interface operations {
6764
7834
  * "meta": {
6765
7835
  * "version": "1.47.0",
6766
7836
  * "api_version": "v1",
6767
- * "request_id": "e1f2a3b4c5d6"
7837
+ * "request_id": "e1f2a3b4c5d66d5c4b3a2f1e"
6768
7838
  * }
6769
7839
  * }
6770
7840
  */
@@ -6773,7 +7843,7 @@ export interface operations {
6773
7843
  };
6774
7844
  401: components["responses"]["Unauthorized"];
6775
7845
  403: components["responses"]["Forbidden"];
6776
- /** @description Falló la validación o la pre-condición. Códigos posibles: `file_required`, `file_too_large`, `unsupported_format` e `import_already_in_flight`. */
7846
+ /** @description Falló la validación o la pre-condición. Códigos posibles: `file_required`, `upload_error`, `file_too_large`, `invalid_parse_mode`, `unsupported_format`, `import_already_in_flight` y `persist_failed`. */
6777
7847
  422: {
6778
7848
  headers: {
6779
7849
  [name: string]: unknown;
@@ -6791,7 +7861,7 @@ export interface operations {
6791
7861
  * "meta": {
6792
7862
  * "version": "1.47.0",
6793
7863
  * "api_version": "v1",
6794
- * "request_id": "f2a3b4c5d6e7"
7864
+ * "request_id": "f2a3b4c5d6e77e6d5c4b3a2f"
6795
7865
  * }
6796
7866
  * }
6797
7867
  */
@@ -6871,7 +7941,7 @@ export interface operations {
6871
7941
  * "meta": {
6872
7942
  * "version": "1.47.0",
6873
7943
  * "api_version": "v1",
6874
- * "request_id": "f8a9b0c1d2e3"
7944
+ * "request_id": "f8a9b0c1d2e33e2d1c0b9a8f"
6875
7945
  * }
6876
7946
  * }
6877
7947
  */
@@ -7011,10 +8081,10 @@ export interface operations {
7011
8081
  * "parsed_account_type": "phone",
7012
8082
  * "parsed_bank_code": "40012",
7013
8083
  * "parsed_bank_name": "BBVA MEXICO",
7014
- * "parsed_label": null,
8084
+ * "parsed_label": "Cuenta",
7015
8085
  * "error_codes": [],
7016
8086
  * "corrections_applied": {
7017
- * "alias_auto_assigned": "Beneficiario 002"
8087
+ * "alias_auto_assigned": "Cuenta"
7018
8088
  * },
7019
8089
  * "user_overrides": {
7020
8090
  * "parsed_account_type": "phone",
@@ -7031,7 +8101,7 @@ export interface operations {
7031
8101
  * "meta": {
7032
8102
  * "version": "1.47.0",
7033
8103
  * "api_version": "v1",
7034
- * "request_id": "c1d2e3f4a5b6"
8104
+ * "request_id": "c1d2e3f4a5b66b5a4f3e2d1c"
7035
8105
  * }
7036
8106
  * }
7037
8107
  */
@@ -7095,7 +8165,7 @@ export interface operations {
7095
8165
  * "meta": {
7096
8166
  * "version": "1.47.0",
7097
8167
  * "api_version": "v1",
7098
- * "request_id": "f4a5b6c7d8e9"
8168
+ * "request_id": "f4a5b6c7d8e99e8d7c6b5a4f"
7099
8169
  * }
7100
8170
  * }
7101
8171
  */
@@ -7123,7 +8193,7 @@ export interface operations {
7123
8193
  * "meta": {
7124
8194
  * "version": "1.47.0",
7125
8195
  * "api_version": "v1",
7126
- * "request_id": "a5b6c7d8e9f0"
8196
+ * "request_id": "a5b6c7d8e9f00f9e8d7c6b5a"
7127
8197
  * }
7128
8198
  * }
7129
8199
  */
@@ -7750,21 +8820,65 @@ export interface operations {
7750
8820
  */
7751
8821
  per_page?: number;
7752
8822
  /**
7753
- * @description Filtro — Identificador único del endpoint webhook (UUID v4).
7754
- * @example 7c9e6679-7425-40de-944b-e07fc1f90ae7
8823
+ * @description Filtro — Identificador único del endpoint webhook (UUID v4). Hasta 20, separados por comas.
8824
+ * @example [
8825
+ * "7c9e6679-7425-40de-944b-e07fc1f90ae7"
8826
+ * ]
7755
8827
  */
7756
- endpoint_id?: string;
8828
+ endpoint_id?: string[];
7757
8829
  /**
7758
- * @description Filtro — Estado de la entrega. `success` llegó. `failed` es el resultado del último intento; Messenger puede programar otro si el fallo es recuperable. `retrying` se pospuso por el límite de salida y Messenger la reintentará. `pending` todavía no se ha intentado.
7759
- * @example failed
8830
+ * @description Filtro — Estado de la entrega. `success` llegó. `failed` es el resultado del último intento; Messenger puede programar otro si el fallo es recuperable. `retrying` se pospuso por el límite de salida y Messenger la reintentará. `pending` todavía no se ha intentado. Varios estados, separados por comas.
8831
+ * @example [
8832
+ * "failed"
8833
+ * ]
7760
8834
  */
7761
- status?: "success" | "failed" | "retrying" | "pending";
8835
+ status?: ("success" | "failed" | "retrying" | "pending")[];
7762
8836
  /**
7763
- * @description Filtro — Tipo de evento que originó la entrega. **De validaciones**: `validation.completed` cuando termina bien, `validation.failed` cuando termina mal y `validation.error` cuando hay un error del servicio. **De los reintentos automáticos:** `validation.retry.scheduled` al programar un reintento automático, `validation.retry.resolved` cuando un reintento automático encuentra el CEP, y `validation.retry.exhausted` cuando los reintentos se agotan sin encontrar el CEP.\
7764
- * **De la suscripción:** `billing.payment_succeeded` y `billing.payment_failed` por cada cobro, `billing.invoice_upcoming` antes de la siguiente factura, `billing.trial_will_end` antes de que acabe la prueba gratuita, y `billing.subscription_canceled` al cancelar la suscripción. Las entregas sintéticas (envío de prueba) se marcan como `test`.
7765
- * @example validation.completed
8837
+ * @description Filtro — Tipo de evento que originó la entrega. **De validaciones**: `validation.completed` cuando hay veredicto de Banxico, sea cual sea (también inválida o no encontrada, y aunque se abran reintentos), `validation.failed` cuando la entrada se rechaza y `validation.error` ante cualquier otro fallo. **De los reintentos automáticos:** `validation.retry.scheduled` al programar un reintento automático, `validation.retry.resolved` cuando un reintento automático encuentra el CEP, y `validation.retry.exhausted` cuando los reintentos se agotan sin encontrar el CEP. **De la revisión posterior de un `valid`:** `validation.returned` cuando una validación que había salido `valid` pasa a `returned` porque Banxico reportó la devolución.\
8838
+ * **De la suscripción:** `billing.payment_succeeded` y `billing.payment_failed` por cada cobro, `billing.invoice_upcoming` antes de la siguiente factura, `billing.trial_will_end` antes de que acabe la prueba gratuita, y `billing.subscription_canceled` al cancelar la suscripción. Las entregas sintéticas (envío de prueba) se marcan como `test`. Varios tipos, separados por comas.
8839
+ * @example [
8840
+ * "validation.completed"
8841
+ * ]
8842
+ */
8843
+ event_type?: ("validation.completed" | "validation.failed" | "validation.error" | "validation.retry.scheduled" | "validation.retry.resolved" | "validation.retry.exhausted" | "validation.returned" | "billing.payment_succeeded" | "billing.payment_failed" | "billing.trial_will_end" | "billing.subscription_canceled" | "billing.invoice_upcoming" | "test")[];
8844
+ /**
8845
+ * @description Filtro — Busca en el identificador de la entrega, el identificador, la URL y la descripción del endpoint, el tipo de evento, el identificador de la validación y el código HTTP de la respuesta. No distingue mayúsculas; `%` y `_` se buscan tal cual. Más de 100 caracteres se recortan.
8846
+ * @example webhook.example.com
8847
+ */
8848
+ q?: string;
8849
+ /**
8850
+ * @description Filtro — Sólo las entregas de esta validación (UUID v4).
8851
+ * @example 3fa85f64-5717-4562-b3fc-2c963f66afa6
7766
8852
  */
7767
- event_type?: "validation.completed" | "validation.failed" | "validation.error" | "validation.retry.scheduled" | "validation.retry.resolved" | "validation.retry.exhausted" | "billing.payment_succeeded" | "billing.payment_failed" | "billing.trial_will_end" | "billing.subscription_canceled" | "billing.invoice_upcoming" | "test";
8853
+ validation_id?: string;
8854
+ /**
8855
+ * @description Filtro — Código HTTP con que respondió el receptor, separados por comas. Vale un código exacto (`404`), una familia (`2xx`, `4xx`, `5xx`) o `none` para las que no tuvieron respuesta (tiempo agotado, conexión rechazada o todavía sin intentar). Varios valores suman resultados.
8856
+ * @example [
8857
+ * "5xx",
8858
+ * "none"
8859
+ * ]
8860
+ */
8861
+ response_status?: string[];
8862
+ /**
8863
+ * @description Filtro — Entregas creadas desde este momento, incluido. Acepta fecha (`2026-10-01`, medianoche UTC) o fecha y hora ISO 8601 con zona.
8864
+ * @example 2026-10-01T00:00:00Z
8865
+ */
8866
+ from?: string;
8867
+ /**
8868
+ * @description Filtro — Entregas creadas hasta este momento, incluido. Una fecha sola llega al final de ese día en UTC.
8869
+ * @example 2026-10-15T23:59:59Z
8870
+ */
8871
+ to?: string;
8872
+ /**
8873
+ * @description Filtro — Sólo las entregas cuyo número de intento es al menos este. Con `2` quedan las que se reintentaron.
8874
+ * @example 2
8875
+ */
8876
+ min_attempt?: number;
8877
+ /**
8878
+ * @description Filtro — Sólo las entregas cuyo receptor tardó al menos estos milisegundos en responder.
8879
+ * @example 3000
8880
+ */
8881
+ min_response_time_ms?: number;
7768
8882
  };
7769
8883
  header?: never;
7770
8884
  path?: never;
@@ -7804,22 +8918,66 @@ export interface operations {
7804
8918
  parameters: {
7805
8919
  query?: {
7806
8920
  /**
7807
- * @description Filtro — Identificador único del endpoint webhook (UUID v4).
7808
- * @example 7c9e6679-7425-40de-944b-e07fc1f90ae7
8921
+ * @description Filtro — Identificador único del endpoint webhook (UUID v4). Hasta 20, separados por comas.
8922
+ * @example [
8923
+ * "7c9e6679-7425-40de-944b-e07fc1f90ae7"
8924
+ * ]
7809
8925
  */
7810
- endpoint_id?: string;
8926
+ endpoint_id?: string[];
7811
8927
  /**
7812
8928
  * @description \
7813
- * Filtro — Estado de la entrega. `success` llegó. `failed` es el resultado del último intento; Messenger puede programar otro si el fallo es recuperable. `retrying` se pospuso por el límite de salida y Messenger la reintentará. `pending` todavía no se ha intentado.
7814
- * @example failed
8929
+ * Filtro — Estado de la entrega. `success` llegó. `failed` es el resultado del último intento; Messenger puede programar otro si el fallo es recuperable. `retrying` se pospuso por el límite de salida y Messenger la reintentará. `pending` todavía no se ha intentado. Varios estados, separados por comas.
8930
+ * @example [
8931
+ * "failed"
8932
+ * ]
7815
8933
  */
7816
- status?: "success" | "failed" | "retrying" | "pending";
8934
+ status?: ("success" | "failed" | "retrying" | "pending")[];
7817
8935
  /**
7818
- * @description Filtro — Tipo de evento que originó la entrega. **De validaciones**: `validation.completed` cuando termina bien, `validation.failed` cuando termina mal y `validation.error` cuando hay un error del servicio. **De los reintentos automáticos:** `validation.retry.scheduled` al programar un reintento automático, `validation.retry.resolved` cuando un reintento automático encuentra el CEP, y `validation.retry.exhausted` cuando los reintentos se agotan sin encontrar el CEP.\
7819
- * **De la suscripción:** `billing.payment_succeeded` y `billing.payment_failed` por cada cobro, `billing.invoice_upcoming` antes de la siguiente factura, `billing.trial_will_end` antes de que acabe la prueba gratuita, y `billing.subscription_canceled` al cancelar la suscripción. Las entregas sintéticas (envío de prueba) se marcan como `test`.
7820
- * @example validation.completed
8936
+ * @description Filtro — Tipo de evento que originó la entrega. **De validaciones**: `validation.completed` cuando hay veredicto de Banxico, sea cual sea (también inválida o no encontrada, y aunque se abran reintentos), `validation.failed` cuando la entrada se rechaza y `validation.error` ante cualquier otro fallo. **De los reintentos automáticos:** `validation.retry.scheduled` al programar un reintento automático, `validation.retry.resolved` cuando un reintento automático encuentra el CEP, y `validation.retry.exhausted` cuando los reintentos se agotan sin encontrar el CEP. **De la revisión posterior de un `valid`:** `validation.returned` cuando una validación que había salido `valid` pasa a `returned` porque Banxico reportó la devolución.\
8937
+ * **De la suscripción:** `billing.payment_succeeded` y `billing.payment_failed` por cada cobro, `billing.invoice_upcoming` antes de la siguiente factura, `billing.trial_will_end` antes de que acabe la prueba gratuita, y `billing.subscription_canceled` al cancelar la suscripción. Las entregas sintéticas (envío de prueba) se marcan como `test`. Varios tipos, separados por comas.
8938
+ * @example [
8939
+ * "validation.completed"
8940
+ * ]
8941
+ */
8942
+ event_type?: ("validation.completed" | "validation.failed" | "validation.error" | "validation.retry.scheduled" | "validation.retry.resolved" | "validation.retry.exhausted" | "validation.returned" | "billing.payment_succeeded" | "billing.payment_failed" | "billing.trial_will_end" | "billing.subscription_canceled" | "billing.invoice_upcoming" | "test")[];
8943
+ /**
8944
+ * @description Filtro — Busca en el identificador de la entrega, el identificador, la URL y la descripción del endpoint, el tipo de evento, el identificador de la validación y el código HTTP de la respuesta. No distingue mayúsculas; `%` y `_` se buscan tal cual. Más de 100 caracteres se recortan.
8945
+ * @example webhook.example.com
8946
+ */
8947
+ q?: string;
8948
+ /**
8949
+ * @description Filtro — Sólo las entregas de esta validación (UUID v4).
8950
+ * @example 3fa85f64-5717-4562-b3fc-2c963f66afa6
8951
+ */
8952
+ validation_id?: string;
8953
+ /**
8954
+ * @description Filtro — Código HTTP con que respondió el receptor, separados por comas. Vale un código exacto (`404`), una familia (`2xx`, `4xx`, `5xx`) o `none` para las que no tuvieron respuesta (tiempo agotado, conexión rechazada o todavía sin intentar). Varios valores suman resultados.
8955
+ * @example [
8956
+ * "5xx",
8957
+ * "none"
8958
+ * ]
8959
+ */
8960
+ response_status?: string[];
8961
+ /**
8962
+ * @description Filtro — Entregas creadas desde este momento, incluido. Acepta fecha (`2026-10-01`, medianoche UTC) o fecha y hora ISO 8601 con zona.
8963
+ * @example 2026-10-01T00:00:00Z
8964
+ */
8965
+ from?: string;
8966
+ /**
8967
+ * @description Filtro — Entregas creadas hasta este momento, incluido. Una fecha sola llega al final de ese día en UTC.
8968
+ * @example 2026-10-15T23:59:59Z
8969
+ */
8970
+ to?: string;
8971
+ /**
8972
+ * @description Filtro — Sólo las entregas cuyo número de intento es al menos este. Con `2` quedan las que se reintentaron.
8973
+ * @example 2
8974
+ */
8975
+ min_attempt?: number;
8976
+ /**
8977
+ * @description Filtro — Sólo las entregas cuyo receptor tardó al menos estos milisegundos en responder.
8978
+ * @example 3000
7821
8979
  */
7822
- event_type?: "validation.completed" | "validation.failed" | "validation.error" | "validation.retry.scheduled" | "validation.retry.resolved" | "validation.retry.exhausted" | "billing.payment_succeeded" | "billing.payment_failed" | "billing.trial_will_end" | "billing.subscription_canceled" | "billing.invoice_upcoming" | "test";
8980
+ min_response_time_ms?: number;
7823
8981
  /**
7824
8982
  * @description Formato del archivo a descargar. Valores aceptados: `csv` y `xlsx`. Cualquier otro valor se sirve como `csv`.
7825
8983
  * @example csv