@veriko-mx/sdk 0.4.6 → 0.4.8

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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,22 @@ versiones según [SemVer](https://semver.org/lang/es/).
7
7
 
8
8
  Sin cambios todavía.
9
9
 
10
+ ## [0.4.8] — 2026-09-27
11
+
12
+ ### Cambiado
13
+
14
+ - `validations.validateOcr()` y `validations.enqueueOcr()` documentan el comprobante en PDF, de 1 a
15
+ 3 páginas.
16
+ - `validations.image()` acepta un comprobante en PDF y lo nombra con la extensión `.pdf`.
17
+
18
+ ## [0.4.7] — 2026-09-26
19
+
20
+ ### Añadido
21
+
22
+ - El webhook de validación trae `data.attributes.banxico_confirmed` cuando
23
+ Banxico ya confirmó el pago: monto, fecha, clave de rastreo, ambos bancos y
24
+ la cuenta del beneficiario enmascarada.
25
+
10
26
  ## [0.4.6] — 2026-09-24
11
27
 
12
28
  ### Cambiado
package/README.md CHANGED
@@ -128,7 +128,7 @@ conserva el suyo (`banxico_status`, `processing_time_ms`), porque es el tipo gen
128
128
 
129
129
  Cada llamada consume cuota del plan, y se descuenta al aceptar la petición.
130
130
 
131
- ### Desde la imagen del comprobante
131
+ ### Desde el comprobante
132
132
 
133
133
  ```ts
134
134
  const validation = await client.validations.validateOcr({
@@ -137,11 +137,11 @@ const validation = await client.validations.validateOcr({
137
137
  });
138
138
  ```
139
139
 
140
- El SDK lee el archivo y lo codifica en base64. `imageUrl` recibe una imagen ya publicada en HTTPS, y
141
- si se envían `image` e `imageUrl`, la API sólo considera `image`. Formatos: JPEG, PNG o WebP, de
142
- hasta 12 MB.
140
+ El SDK lee el archivo y lo codifica en base64. `imageUrl` recibe un comprobante ya publicado en
141
+ HTTPS, y si se envían `image` e `imageUrl`, la API sólo considera `image`. Formatos: JPEG, PNG, WebP
142
+ o PDF de 1 a 3 páginas, de hasta 12 MB.
143
143
 
144
- La imagen de una validación por OCR se descarga con `client.validations.image(id)`.
144
+ El comprobante de una validación por OCR se descarga con `client.validations.image(id)`.
145
145
 
146
146
  ### Sin esperar al veredicto
147
147
 
@@ -370,6 +370,14 @@ para decidir el código de respuesta aparte. La comparación es en tiempo consta
370
370
 
371
371
  El receptor completo está en [`examples/express-webhook.mjs`](examples/express-webhook.mjs).
372
372
 
373
+ ### Lo que Banxico confirmó
374
+
375
+ Cuando `banxico_status` es `valid`, o `returned` con CEP descargado, `evento.data.attributes`
376
+ trae además `banxico_confirmed`: el monto, la fecha, la clave de rastreo, ambos bancos y la cuenta
377
+ del beneficiario (enmascarada a los últimos 4 dígitos), tal como los confirmó Banxico. Compáralo
378
+ contra el pedido antes de liberar la mercancía: la imagen de un comprobante puede mostrar un monto
379
+ distinto al que Banxico confirmó.
380
+
373
381
  ### Las cuatro cabeceras de una entrega
374
382
 
375
383
  | cabecera | contenido |
@@ -7,7 +7,7 @@ export declare const DEFAULT_TIMEOUT_MS = 30000;
7
7
  export declare const API_KEY_ENV_VAR = "VERIKO_API_KEY";
8
8
  export declare const BASE_URL_ENV_VAR = "VERIKO_BASE_URL";
9
9
  /** La versión que viaja en el `User-Agent`. `test/client.test.ts` la compara con `package.json`. */
10
- export declare const VERSION = "0.4.6";
10
+ export declare const VERSION = "0.4.8";
11
11
  export interface VerikoOptions {
12
12
  /** La clave de API. Por omisión, `VERIKO_API_KEY`. */
13
13
  apiKey?: string;
@@ -9,7 +9,7 @@ exports.DEFAULT_TIMEOUT_MS = 30_000;
9
9
  exports.API_KEY_ENV_VAR = 'VERIKO_API_KEY';
10
10
  exports.BASE_URL_ENV_VAR = 'VERIKO_BASE_URL';
11
11
  /** La versión que viaja en el `User-Agent`. `test/client.test.ts` la compara con `package.json`. */
12
- exports.VERSION = '0.4.6';
12
+ exports.VERSION = '0.4.8';
13
13
  /**
14
14
  * Cliente de la API de Veriko.
15
15
  *
@@ -117,9 +117,19 @@ export interface paths {
117
117
  put?: never;
118
118
  /**
119
119
  * Validar una transferencia SPEI (OCR)
120
- * @description Valida una transferencia SPEI a partir de la imagen de su comprobante. Extrae mediante reconocimiento óptico (OCR) los datos de la imagen y los valida en **Banxico** para obtener el CEP de la transacción.
120
+ * @description Valida una transferencia SPEI a partir de su comprobante, en imagen o en PDF. Extrae mediante reconocimiento óptico (OCR) los datos del comprobante y los valida en **Banxico** para obtener el CEP de la transacción.
121
121
  *
122
- * La imagen se envía como `image` o `image_url`. Si es enviada mediante una URL, el host destino deberá contar con protocolo seguro (SSL/HTTPS).
122
+ * El comprobante se envía como `image` o `image_url`. Si es enviado mediante una URL, el host destino deberá contar con protocolo seguro (SSL/HTTPS).
123
+ *
124
+ * {% callout type="info" %}
125
+ * **Comprobante en PDF:**\
126
+ * Se acepta un PDF de 1 a 3 páginas, con el mismo máximo de `12 MB` que una imagen.
127
+ * Se rechaza si está cifrado, si se modificó después de emitirse o si trae contenido activo u oculto.\
128
+ * Si el PDF es el CEP de Banxico, sus datos se leen de su texto sin OCR y `banxico_result._cep_upload` indica
129
+ * si su sello y su cadena original coinciden con los del CEP oficial. El veredicto no cambia por esa comparación.\
130
+ * Un PDF con más de un comprobante se rechaza con `pdf_multiple_receipts`.
131
+ *
132
+ * {% /callout %}
123
133
  *
124
134
  * {% callout type="info" %}
125
135
  * 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.\
@@ -137,7 +147,7 @@ export interface paths {
137
147
  *
138
148
  * {% callout type="info" %}
139
149
  * **Modo asíncrono:**\
140
- * Enviando `?async=1` en la URL, la imagen se comprueba antes de aceptar el trabajo y la respuesta es un estado HTTP `202` inmediato con el ID de la validación en el cuerpo.\
150
+ * Enviando `?async=1` en la URL, el comprobante se comprueba antes de aceptar el trabajo y la respuesta es un estado HTTP `202` inmediato con el ID de la validación en el cuerpo.\
141
151
  * \
142
152
  * El veredicto se recoge sondeando `GET /v1/validations/{id}` hasta un estado terminal, como describe {% concept slug="async-validations" %}las operaciones asíncronas{% /concept %}.
143
153
  *
@@ -153,10 +163,12 @@ export interface paths {
153
163
  *
154
164
  * {% callout type="warning" %}
155
165
  * **Políticas de cobro (cuota):**\
156
- * — Modo síncrono: Se descuenta la validación de la cuota al aceptar la petición, antes de comprobar la imagen. Es decir, una imagen inválida consume una validación.\
157
- * — Modo asíncrono: La imagen se comprueba primero, así que una imagen inválida no consume nada.\
166
+ * — Modo síncrono: Se descuenta la validación de la cuota al aceptar la petición, antes de comprobar el archivo. Es decir, un archivo inválido consume una validación.\
167
+ * — Modo asíncrono: El archivo se comprueba primero, así que un archivo inválido no consume nada.\
158
168
  * \
159
- * La cuota no se devuelve en ningún caso. Los reintentos automáticos posteriores no consumen una validación adicional, y el cómputo está en {% concept slug="quotas-and-plans" %}cuotas y planes{% /concept %}.
169
+ * Un CEP en PDF que se lee sin OCR cuenta como una validación, igual que uno leído por OCR.\
170
+ * \
171
+ * La cuota sólo se devuelve cuando la validación termina en `error` por un fallo de la plataforma. Los reintentos automáticos posteriores no consumen una validación adicional, y el cómputo está en {% concept slug="quotas-and-plans" %}cuotas y planes{% /concept %}.
160
172
  *
161
173
  * {% /callout %}
162
174
  */
@@ -343,7 +355,11 @@ export interface paths {
343
355
  };
344
356
  /**
345
357
  * Obtener la imagen del comprobante
346
- * @description Devuelve la imagen conservada de una validación por OCR, con disposición `inline` y caché privada.
358
+ * @description Devuelve el comprobante conservado de una validación por OCR, con caché privada:
359
+ *
360
+ * - Imagen: se entrega con disposición `inline`.
361
+ * - PDF: se entrega siempre como adjunto (`attachment`) y con `Content-Security-Policy: sandbox`,
362
+ * para que un navegador no lo abra dentro del propio origen.
347
363
  *
348
364
  * Si la validación no tiene imagen disponible, responde con un estado HTTP `404` (con `image_not_available` en el cuerpo).
349
365
  */
@@ -642,6 +658,7 @@ export interface paths {
642
658
  /**
643
659
  * Iniciar importación masiva de beneficiarios
644
660
  * @description Sube un archivo (CSV, XLS, XLSX, TXT o PDF) de hasta 20 MB y abre con él un trabajo de importación.
661
+ * 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.
645
662
  *
646
663
  * El modo de lectura decide cuánto trabajo hace el archivo y cuánto el servidor:
647
664
  *
@@ -2338,11 +2355,16 @@ export interface components {
2338
2355
  */
2339
2356
  etag_version?: number | null;
2340
2357
  /**
2341
- * @description Referencia relativa de la imagen del comprobante (solo si `validation_type` es del tipo `ocr`).
2358
+ * @description Referencia relativa del comprobante, imagen o PDF (solo si `validation_type` es del tipo `ocr`).
2342
2359
  * @example ocr/2026/04/a1b2c3d4.jpg
2343
2360
  */
2344
2361
  image_path?: string | null;
2345
- /** @description Campos extraídos mediante OCR (solo si `validation_type` es del tipo `ocr`). */
2362
+ /**
2363
+ * @description Campos extraídos del comprobante (solo si `validation_type` es del tipo `ocr`).
2364
+ *
2365
+ * `extraction_source` vale `cep_pdf` cuando el comprobante era el CEP de Banxico en PDF y sus datos se leyeron
2366
+ * de su texto, sin OCR. `comprobantes_detectados` es el número de comprobantes que se encontraron en un PDF.
2367
+ */
2346
2368
  ocr_result?: {
2347
2369
  [key: string]: unknown;
2348
2370
  } | null;
@@ -2361,13 +2383,81 @@ export interface components {
2361
2383
  /** @description Indica si el número de tarjeta está enmascarado en el comprobante cargado (solo si `validation_type` es del tipo `ocr`). */
2362
2384
  is_masked?: boolean | null;
2363
2385
  /**
2364
- * @description Datos devueltos por Banxico.
2386
+ * @description Datos devueltos por Banxico. Las propiedades tipadas abajo son las 20 que declara el esquema oficial del complemento SPEI.
2365
2387
  *
2366
2388
  * `_ocr_correction` conserva los campos corregidos, su lectura original (`requested`), el valor consultado (`used`) y la confirmación (`confirmed_by`). `status_query` indica una hipótesis confirmada por la consulta de estado; `cep` indica que también se obtuvo el comprobante. La consulta de estado por sí sola no verifica una transferencia.
2389
+ *
2390
+ * `_cep_upload` aparece cuando el comprobante subido era el CEP en PDF y Banxico confirmó el pago.
2391
+ * `authenticated` es `true` cuando su sello y su cadena original coinciden con los del CEP oficial;
2392
+ * con `false`, `differing_fields` lista los campos que difieren y `normalization_warnings` lo avisa.
2393
+ * El veredicto sigue siendo el de Banxico.
2367
2394
  */
2368
- banxico_result?: {
2395
+ banxico_result?: ({
2396
+ /**
2397
+ * @description Fecha de la operación tal como la reporta el CEP de Banxico (`AAAA-MM-DD`).
2398
+ * @example 2025-03-15
2399
+ */
2400
+ operationDate?: string;
2401
+ /**
2402
+ * @description Hora de la operación tal como la reporta el CEP de Banxico (`HH:MM:SS`).
2403
+ * @example 14:22:10
2404
+ */
2405
+ processingTime?: string;
2406
+ /** @description Clave de la operación dentro del sistema SPEI (`ClaveSPEI` del CEP). Distinta de la clave de rastreo. */
2407
+ speiKey?: string;
2408
+ /**
2409
+ * @description Clave de rastreo de la operación SPEI — la misma que se envía en la petición de validación.
2410
+ * @example MBAN01002503151422ABCDEF
2411
+ */
2412
+ trackingKey?: string;
2413
+ /** @description Sello digital del CEP (`sello`) — la firma que Banxico calcula sobre la operación. */
2414
+ digitalSignature?: string;
2415
+ /** @description Número del certificado digital que Banxico usó para sellar el CEP. */
2416
+ certificateNumber?: string;
2417
+ /** @description Cadena original de la operación (`cadenaCDA`): los 47 campos que la institución envió a Banxico, separados por `|`, incluidas ambas fechas (operación y captura) y el tipo de pago. Permite auditar el CEP sin volver a pedirlo. */
2418
+ cadenaCda?: string;
2419
+ /**
2420
+ * @description Banco emisor de la operación, tal como lo identifica el CEP.
2421
+ * @example BBVA
2422
+ */
2423
+ senderBank?: string;
2424
+ /** @description Nombre del ordenante de la operación, tal como lo reporta el CEP. */
2425
+ senderName?: string;
2426
+ /** @description Tipo de cuenta del ordenante (por ejemplo, CLABE o tarjeta), tal como lo reporta el CEP. */
2427
+ senderAccountType?: string;
2428
+ /** @description Cuenta del ordenante, tal como la reporta el CEP, sin enmascarar en este recurso (consulta privada, propia del dueño de la validación). */
2429
+ senderAccount?: string;
2430
+ /** @description RFC del ordenante, tal como lo reporta el CEP. */
2431
+ senderRfc?: string;
2432
+ /**
2433
+ * @description Banco receptor de la operación, tal como lo identifica el CEP.
2434
+ * @example STP
2435
+ */
2436
+ receiverBank?: string;
2437
+ /** @description Nombre del beneficiario de la operación, tal como lo reporta el CEP. */
2438
+ beneficiaryName?: string;
2439
+ /** @description Tipo de cuenta del beneficiario (por ejemplo, CLABE o tarjeta), tal como lo reporta el CEP. */
2440
+ beneficiaryAccountType?: string;
2441
+ /** @description Cuenta del beneficiario, tal como la reporta el CEP, sin enmascarar en este recurso (consulta privada, propia del dueño de la validación). Los webhooks salientes sí la enmascaran a los últimos 4 dígitos en `banxico_confirmed.beneficiaryAccount` (ver la guía de webhooks). */
2442
+ beneficiaryAccount?: string;
2443
+ /** @description RFC del beneficiario, tal como lo reporta el CEP. */
2444
+ beneficiaryRfc?: string;
2445
+ /**
2446
+ * Format: float
2447
+ * @description Monto de la operación que Banxico confirmó por el CEP, en pesos.
2448
+ * @example 1500
2449
+ */
2450
+ amount?: number;
2451
+ /**
2452
+ * Format: float
2453
+ * @description IVA de la operación reportado por el CEP, en pesos.
2454
+ */
2455
+ iva?: number;
2456
+ /** @description Concepto de pago de la operación, tal como lo reporta el CEP. */
2457
+ paymentConcept?: string;
2458
+ } & {
2369
2459
  [key: string]: unknown;
2370
- } | null;
2460
+ }) | null;
2371
2461
  /**
2372
2462
  * @description Mensaje legible del error terminal (si aplica).
2373
2463
  * @example Banxico no respondió tras tres intentos.
@@ -2466,17 +2556,17 @@ export interface components {
2466
2556
  playground?: boolean;
2467
2557
  };
2468
2558
  };
2469
- /** @description Cuerpo de `POST /v1/validate-ocr` con la imagen en `image` o `image_url`; exige al menos uno de ambos campos. */
2559
+ /** @description Cuerpo de `POST /v1/validate-ocr` con el comprobante en `image` o `image_url`; exige al menos uno de ambos campos. */
2470
2560
  OcrValidationRequest: {
2471
2561
  /**
2472
2562
  * Format: byte
2473
- * @description Imagen del comprobante codificada en base64. Si también se proporciona `image_url`, solo se considera `image`. Formatos aceptados: JPEG, PNG o WebP. Tamaño máximo: `12 MB`. Dimensiones máximas: `12000px` por lado.
2563
+ * @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,`.
2474
2564
  * @example iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==
2475
2565
  */
2476
2566
  image?: string;
2477
2567
  /**
2478
2568
  * Format: uri
2479
- * @description URL pública (HTTPS) de la imagen del comprobante. La imagen sigue los mismos límites de formato y tamaño que `image` (JPEG, PNG o WebP. Con un máximo de 12 MB).
2569
+ * @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`.
2480
2570
  * @example https://storage.example.com/receipts/comprobante-2025-03.jpg
2481
2571
  */
2482
2572
  image_url?: string;
@@ -2540,6 +2630,8 @@ export interface components {
2540
2630
  attributes: {
2541
2631
  /** @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`. */
2542
2632
  bank_name?: string;
2633
+ /** @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. */
2634
+ bank_code?: string | null;
2543
2635
  /** @description Etiqueta del beneficiario receptor registrado (si existe). */
2544
2636
  beneficiary_label?: string | null;
2545
2637
  /** @description Importe de la transferencia (en pesos mexicanos — MXN). */
@@ -5305,7 +5397,7 @@ export interface operations {
5305
5397
  401: components["responses"]["Unauthorized"];
5306
5398
  409: components["responses"]["IdempotencyKeyInProgress"];
5307
5399
  413: components["responses"]["PayloadTooLarge"];
5308
- /** @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`. 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`. */
5400
+ /** @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`. */
5309
5401
  422: {
5310
5402
  headers: {
5311
5403
  [name: string]: unknown;
@@ -5880,15 +5972,17 @@ export interface operations {
5880
5972
  };
5881
5973
  requestBody?: never;
5882
5974
  responses: {
5883
- /** @description Imagen del comprobante. `Content-Type` indica `image/png`, `image/jpeg` o `image/webp` según el formato; cualquier otro contenido se entrega como `application/octet-stream`. */
5975
+ /** @description Comprobante. `Content-Type` indica `image/png`, `image/jpeg`, `image/webp` o `application/pdf` según el formato; cualquier otro contenido se entrega como `application/octet-stream`. */
5884
5976
  200: {
5885
5977
  headers: {
5886
- /** @description Presentación en línea con un nombre derivado del identificador de la validación y la extensión del formato. */
5978
+ /** @description `inline` para una imagen y `attachment` para un PDF, con un nombre derivado del identificador de la validación y la extensión del formato. */
5887
5979
  "Content-Disposition"?: string;
5888
5980
  /** @description Permite un caché privado durante 1 hora. */
5889
5981
  "Cache-Control"?: string;
5890
5982
  /** @description Restringe el uso del recurso al mismo origen. */
5891
5983
  "Cross-Origin-Resource-Policy"?: string;
5984
+ /** @description Sólo con un PDF. `sandbox` impide ejecutar scripts y trata el documento como de otro origen si un visor lo abre. */
5985
+ "Content-Security-Policy"?: string;
5892
5986
  /** @description Impide que el navegador deduzca un tipo de contenido distinto. */
5893
5987
  "X-Content-Type-Options"?: string;
5894
5988
  [name: string]: unknown;
@@ -5897,6 +5991,7 @@ export interface operations {
5897
5991
  "image/png": string;
5898
5992
  "image/jpeg": string;
5899
5993
  "image/webp": string;
5994
+ "application/pdf": string;
5900
5995
  "application/octet-stream": string;
5901
5996
  };
5902
5997
  };