@veriko-mx/sdk 0.4.7 → 0.4.9

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.9] — 2026-09-28
11
+
12
+ ### Añadido
13
+
14
+ - Los tipos de `usage.summary()` y `billing.getSubscription()` añaden `quota_kind` (`cycle` o
15
+ `trial`) y `renews`: una cuenta que aún no activa el plan gratuito consume validaciones de
16
+ prueba, que no se reponen. `account.myProfile()` añade `plan_name` a la suscripción.
17
+
18
+ ## [0.4.8] — 2026-09-27
19
+
20
+ ### Cambiado
21
+
22
+ - `validations.validateOcr()` y `validations.enqueueOcr()` documentan el comprobante en PDF, de 1 a
23
+ 3 páginas.
24
+ - `validations.image()` acepta un comprobante en PDF y lo nombra con la extensión `.pdf`.
25
+
10
26
  ## [0.4.7] — 2026-09-26
11
27
 
12
28
  ### Añadido
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
 
@@ -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.7";
10
+ export declare const VERSION = "0.4.9";
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.7';
12
+ exports.VERSION = '0.4.9';
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
  */
@@ -2051,6 +2067,11 @@ export interface components {
2051
2067
  * @example pro
2052
2068
  */
2053
2069
  plan_slug?: string;
2070
+ /**
2071
+ * @description Nombre visible del plan activo, tal como lo muestra el catálogo de planes. Es `null` cuando no se pudo leer el catálogo.
2072
+ * @example Pro
2073
+ */
2074
+ plan_name?: string | null;
2054
2075
  /**
2055
2076
  * @description Estado actual de la suscripción según el ciclo de facturación. `active`: Al corriente; `trialing`: En periodo de prueba; `past_due`: Con cobros pendientes; `canceled`: Cancelada; `paused`: En pausa.
2056
2077
  * @example active
@@ -2339,11 +2360,16 @@ export interface components {
2339
2360
  */
2340
2361
  etag_version?: number | null;
2341
2362
  /**
2342
- * @description Referencia relativa de la imagen del comprobante (solo si `validation_type` es del tipo `ocr`).
2363
+ * @description Referencia relativa del comprobante, imagen o PDF (solo si `validation_type` es del tipo `ocr`).
2343
2364
  * @example ocr/2026/04/a1b2c3d4.jpg
2344
2365
  */
2345
2366
  image_path?: string | null;
2346
- /** @description Campos extraídos mediante OCR (solo si `validation_type` es del tipo `ocr`). */
2367
+ /**
2368
+ * @description Campos extraídos del comprobante (solo si `validation_type` es del tipo `ocr`).
2369
+ *
2370
+ * `extraction_source` vale `cep_pdf` cuando el comprobante era el CEP de Banxico en PDF y sus datos se leyeron
2371
+ * de su texto, sin OCR. `comprobantes_detectados` es el número de comprobantes que se encontraron en un PDF.
2372
+ */
2347
2373
  ocr_result?: {
2348
2374
  [key: string]: unknown;
2349
2375
  } | null;
@@ -2365,11 +2391,16 @@ export interface components {
2365
2391
  * @description Datos devueltos por Banxico. Las propiedades tipadas abajo son las 20 que declara el esquema oficial del complemento SPEI.
2366
2392
  *
2367
2393
  * `_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.
2394
+ *
2395
+ * `_cep_upload` aparece cuando el comprobante subido era el CEP en PDF y Banxico confirmó el pago.
2396
+ * `authenticated` es `true` cuando su sello y su cadena original coinciden con los del CEP oficial;
2397
+ * con `false`, `differing_fields` lista los campos que difieren y `normalization_warnings` lo avisa.
2398
+ * El veredicto sigue siendo el de Banxico.
2368
2399
  */
2369
2400
  banxico_result?: ({
2370
2401
  /**
2371
- * @description Fecha de la operación tal como la reporta el CEP de Banxico (`DD-MM-AAAA`).
2372
- * @example 15-03-2025
2402
+ * @description Fecha de la operación tal como la reporta el CEP de Banxico (`AAAA-MM-DD`).
2403
+ * @example 2025-03-15
2373
2404
  */
2374
2405
  operationDate?: string;
2375
2406
  /**
@@ -2530,17 +2561,17 @@ export interface components {
2530
2561
  playground?: boolean;
2531
2562
  };
2532
2563
  };
2533
- /** @description Cuerpo de `POST /v1/validate-ocr` con la imagen en `image` o `image_url`; exige al menos uno de ambos campos. */
2564
+ /** @description Cuerpo de `POST /v1/validate-ocr` con el comprobante en `image` o `image_url`; exige al menos uno de ambos campos. */
2534
2565
  OcrValidationRequest: {
2535
2566
  /**
2536
2567
  * Format: byte
2537
- * @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.
2568
+ * @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,`.
2538
2569
  * @example iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==
2539
2570
  */
2540
2571
  image?: string;
2541
2572
  /**
2542
2573
  * Format: uri
2543
- * @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).
2574
+ * @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`.
2544
2575
  * @example https://storage.example.com/receipts/comprobante-2025-03.jpg
2545
2576
  */
2546
2577
  image_url?: string;
@@ -4189,6 +4220,17 @@ export interface components {
4189
4220
  tone: "ok" | "warn" | "danger";
4190
4221
  resets_at: components["schemas"]["TimestampUTC"];
4191
4222
  next_reset_at: components["schemas"]["TimestampUTC"];
4223
+ /**
4224
+ * @description Origen de esta cuota: `cycle` (ciclo de suscripción de siempre) o `trial` (asignación de prueba inicial de una cuenta sin reclamar el plan). Aditivo.
4225
+ * @example cycle
4226
+ * @enum {string}
4227
+ */
4228
+ quota_kind?: "cycle" | "trial";
4229
+ /**
4230
+ * @description `true` cuando esta cuota se repone al iniciar el siguiente ciclo. `false` para `quota_kind=trial`.
4231
+ * @example true
4232
+ */
4233
+ renews?: boolean;
4192
4234
  };
4193
4235
  /** @description Historial mensual de consumo para el número de meses solicitado. */
4194
4236
  GetUsageHistoryAttributes: {
@@ -4964,6 +5006,17 @@ export interface components {
4964
5006
  */
4965
5007
  remaining?: number;
4966
5008
  resets_at?: components["schemas"]["TimestampUTC"];
5009
+ /**
5010
+ * @description Origen de esta cuota: `cycle` (ciclo de suscripción de siempre) o `trial` (asignación de prueba inicial de una cuenta sin reclamar el plan). Aditivo — un cliente que no lo lea sigue funcionando igual.
5011
+ * @example cycle
5012
+ * @enum {string}
5013
+ */
5014
+ quota_kind?: "cycle" | "trial";
5015
+ /**
5016
+ * @description `true` cuando esta cuota se repone al iniciar el siguiente ciclo. `false` para `quota_kind=trial`: `resets_at` es el fin del periodo técnico, no una promesa de más unidades.
5017
+ * @example true
5018
+ */
5019
+ renews?: boolean;
4967
5020
  };
4968
5021
  /** @description Suscripción activa y resumen de cuota devueltos por `GET /v1/billing/subscription`. */
4969
5022
  BillingSubscriptionResponse: components["schemas"]["SuccessEnvelope"] & {
@@ -5371,7 +5424,7 @@ export interface operations {
5371
5424
  401: components["responses"]["Unauthorized"];
5372
5425
  409: components["responses"]["IdempotencyKeyInProgress"];
5373
5426
  413: components["responses"]["PayloadTooLarge"];
5374
- /** @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`. */
5427
+ /** @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`. */
5375
5428
  422: {
5376
5429
  headers: {
5377
5430
  [name: string]: unknown;
@@ -5946,15 +5999,17 @@ export interface operations {
5946
5999
  };
5947
6000
  requestBody?: never;
5948
6001
  responses: {
5949
- /** @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`. */
6002
+ /** @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`. */
5950
6003
  200: {
5951
6004
  headers: {
5952
- /** @description Presentación en línea con un nombre derivado del identificador de la validación y la extensión del formato. */
6005
+ /** @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. */
5953
6006
  "Content-Disposition"?: string;
5954
6007
  /** @description Permite un caché privado durante 1 hora. */
5955
6008
  "Cache-Control"?: string;
5956
6009
  /** @description Restringe el uso del recurso al mismo origen. */
5957
6010
  "Cross-Origin-Resource-Policy"?: string;
6011
+ /** @description Sólo con un PDF. `sandbox` impide ejecutar scripts y trata el documento como de otro origen si un visor lo abre. */
6012
+ "Content-Security-Policy"?: string;
5958
6013
  /** @description Impide que el navegador deduzca un tipo de contenido distinto. */
5959
6014
  "X-Content-Type-Options"?: string;
5960
6015
  [name: string]: unknown;
@@ -5963,6 +6018,7 @@ export interface operations {
5963
6018
  "image/png": string;
5964
6019
  "image/jpeg": string;
5965
6020
  "image/webp": string;
6021
+ "application/pdf": string;
5966
6022
  "application/octet-stream": string;
5967
6023
  };
5968
6024
  };