Generación de PDF
Descargar tipos de TypeScriptSDK
import { PGSClient } from '@ircg/pgs'
const apiKey = process.env.IRCG_PGS_API_KEY
if (!apiKey) throw new Error('IRCG_PGS_API_KEY is required')
const pgs = new PGSClient({ apiKey })El método generate devuelve { response, billing } o { error }. Usa generateUnsafe si prefieres recibir la respuesta
directamente y controlar las excepciones.
Dry run
Configura dryRun: true para recibir un PDF sintético válido y facturación en cero, sin
cargar la URL, realizar solicitudes HTTP ni consumir créditos. El nombre respeta el formato público de fileName y la respuesta incluye Cache-Control: no-store.
const pgs = new PGSClient({ apiKey: 'unused', dryRun: true })
const result = await pgs.generate({ fileName: 'invoice.pdf', url: 'https://example.com/invoice' })
if (result.error) throw new Error(result.error.message)
const pdf = await result.response.arrayBuffer()
console.log(result.billing, pdf.byteLength)API REST
- La ruta usa
Authorization: Bearercon una API key de PGS. - El cuerpo requiere
Content-Type: application/json. - PGS no habilita CORS. Llama la API desde tu servidor y nunca publiques una API key.
| Método | Ruta | Descripción |
|---|---|---|
| POST | /api/v1/pdfs | Generar y descargar un PDF. |
Generar PDF POST
POST /api/v1/pdfs
import { writeFile } from 'node:fs/promises'
const input = {
url: 'https://example.com/invoices/123',
fileName: 'invoice-123.pdf',
timeoutSeconds: 10,
pdfOptions: { format: 'a4', printBackground: true }
}
// SDK
const result = await pgs.generate(input)
if (result.error) throw new Error(result.error.message)
await writeFile('invoice-123.pdf', Buffer.from(await result.response.arrayBuffer()))
console.log(result.billing)
// REST
const response = await fetch('https://ircg.dev/api/v1/pdfs', {
method: 'POST',
headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
body: JSON.stringify(input)
})
if (!response.ok) throw new Error(`PGS failed: ${response.status}`)
await writeFile('invoice-123.pdf', Buffer.from(await response.arrayBuffer()))
console.log({
billableSeconds: Number(response.headers.get('X-IRCG-Billable-Seconds')),
creditsConsumed: Number(response.headers.get('X-IRCG-Credits-Consumed')),
requestId: response.headers.get('X-IRCG-Request-ID')
})Encabezados
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
| Authorization | Bearer sk_pg_… | Sí | API key de PGS. |
| Content-Type | application/json | Sí | Tipo del cuerpo de la solicitud. |
Cuerpo
| Campo | Tipo | Requerido | Por defecto | Descripción |
|---|---|---|---|---|
| fileName | string | No | document.pdf | Nombre de descarga de hasta 128 caracteres. PGS agrega .pdf cuando falta. |
| mediaType | PDFMediaType | No | screen | Usa estilos CSS de pantalla o impresión. |
| pdfOptions | PDFOptions | No | { format: 'a4', printBackground: true } | Opciones cerradas de generación. |
| pdfOptions.displayHeaderFooter | boolean | No | false | Muestra las plantillas de encabezado y pie. |
| pdfOptions.footerTemplate | string | No | '' | Plantilla HTML de pie; máximo 16,000 caracteres. |
| pdfOptions.format | PDFFormat | No | a4 | letter | legal | tabloid | ledger | a0 | a1 | a2 | a3 | a4 | a5 | a6 |
| pdfOptions.headerTemplate | string | No | '' | Plantilla HTML de encabezado; máximo 16,000 caracteres. |
| pdfOptions.height | number | `${number}px|in|cm|mm` | No | 11.7in (A4) | Alto personalizado. Debe enviarse junto con width. |
| pdfOptions.landscape | boolean | No | false | Usa orientación horizontal. |
| pdfOptions.margin | object | No | { top: 0, right: 0, bottom: 0, left: 0 } | Márgenes superior, derecho, inferior e izquierdo. |
| pdfOptions.margin.top | number | `${number}px|in|cm|mm` | No | 0 | Margen top. |
| pdfOptions.margin.right | number | `${number}px|in|cm|mm` | No | 0 | Margen right. |
| pdfOptions.margin.bottom | number | `${number}px|in|cm|mm` | No | 0 | Margen bottom. |
| pdfOptions.margin.left | number | `${number}px|in|cm|mm` | No | 0 | Margen left. |
| pdfOptions.omitBackground | boolean | No | false | Hace transparente el fondo de la página. |
| pdfOptions.outline | boolean | No | false | Incluye el esquema del documento. |
| pdfOptions.pageRanges | string | No | '' (todas las páginas) | Rangos como 1-3,5; máximo 256 caracteres. |
| pdfOptions.preferCSSPageSize | boolean | No | false | Prefiere el tamaño declarado por CSS. |
| pdfOptions.printBackground | boolean | No | true | Imprime gráficos de fondo. |
| pdfOptions.scale | number | No | 1 | Escala entre 0.1 y 2. |
| pdfOptions.tagged | boolean | No | false | Genera un PDF etiquetado para accesibilidad. |
| pdfOptions.width | number | `${number}px|in|cm|mm` | No | 8.27in (A4) | Ancho personalizado. Debe enviarse junto con height. |
| timeoutSeconds | integer | No | 10 | Tiempo máximo de carga, entre 5 y 60 segundos. |
| url | string | Sí | — | URL HTTPS, sin credenciales ni puerto, cuyo hostname exacto debe estar autorizado. |
| waitUntil | PDFWaitUntil | No | networkidle2 | load | domcontentloaded | networkidle0 | networkidle2 |
format no puede combinarse con width o height. Si defines dimensiones personalizadas debes enviar ambas.
Encabezados de respuesta
| Nombre | Tipo | Descripción |
|---|---|---|
| Content-Type | application/pdf | Tipo del cuerpo exitoso. |
| Content-Disposition | string | Nombre sugerido para la descarga. |
| Cache-Control | no-store | Impide almacenar la respuesta en caché. |
| X-IRCG-Request-ID | UUID | Identificador para diagnóstico. |
| X-IRCG-Billable-Seconds | integer | Segundos facturables redondeados. |
| X-IRCG-Credits-Consumed | integer | Créditos consumidos. |
Los tres encabezados X-IRCG-* también aparecen en errores que alcanzaron el navegador.
Un rechazo anterior al navegador consume cero créditos.
PGS no conserva el PDF y todavía no ofrece una clave de idempotencia que permita repetir el binario. No reintentes automáticamente una generación: una nueva solicitud puede iniciar otro render y consumir créditos.
Respuestas
Límites y costos
- Cada segundo iniciado de navegador cuesta 3 créditos. Por ejemplo,
1,250 msse redondean a 2 segundos y consumen 6 créditos. - Los fallos, timeouts e intentos solo se cobran cuando se registra tiempo de navegador facturable. Las validaciones y rechazos previos no se cobran.
timeoutSecondscontrola el tiempo máximo de cada solicitud: permite cortar una carga atascada y ajustar el límite a lo que normalmente tarda el recurso. También limita el costo máximo posible atimeoutSeconds × 3créditos. Acepta enteros entre5y60; su valor predeterminado es10.- El límite de tiempo del render se comporta igual en suscripciones free y de paga. En free se reservan al
inicio
timeoutSeconds × 3créditos y al terminar se devuelve la parte que no corresponda a segundos facturables registrados. En suscripciones de paga no hay reserva previa. - La URL debe usar HTTPS y su hostname debe añadirse previamente a la lista de hosts permitidos de PGS. No se admiten comodines, credenciales en la URL, puertos personalizados ni destinos locales o privados.
- PGS transmite el PDF y no lo conserva. Para persistirlo, sube la respuesta a FSS como una operación y un cargo independientes.