{"_id":"pdfmonkey","_rev":"5-a01fc51f7315273ed6935a5939512446","name":"pdfmonkey","dist-tags":{"latest":"1.4.0"},"versions":{"1.0.0":{"name":"pdfmonkey","version":"1.0.0","keywords":["pdfmonkey","pdf","pdf-generation","api","sdk","node","typescript","document","html-to-pdf","webhook"],"author":{"url":"https://www.pdfmonkey.io","name":"PDFMonkey","email":"tinymonkey@pdfmonkey.io"},"license":"MIT","_id":"pdfmonkey@1.0.0","maintainers":[{"name":"tiny-monkey","email":"accounts@pdfmonkey.io"}],"homepage":"https://github.com/pdfmonkey/pdfmonkey-node#readme","bugs":{"url":"https://github.com/pdfmonkey/pdfmonkey-node/issues"},"dist":{"shasum":"2e4231e8a4a2494c0e8afc1766d4162abdc7a47a","tarball":"https://registry.npmjs.org/pdfmonkey/-/pdfmonkey-1.0.0.tgz","fileCount":8,"integrity":"sha512-shqilLu6OhujlNS2RQ/2PZ9s3Z70xk0CHCFbYoJOgZTNHaFSuPgDN1JDh6L+/myYG3kU6Z66btoYMx47Y/gY7A==","signatures":[{"sig":"MEUCIQCe1/tquxYZRnJwft96wynazDK0FOKe5Ys0NnfNpJWYnAIgNzhKXoWJv/z4nvvL9d9hU+PZOLXAXtbTM7/+8EpzTm4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":145217},"main":"./dist/index.cjs","pnpm":{"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"gitHead":"703d4d31cc48ad63183d7de0f2d18a8c65b2a7e8","scripts":{"dev":"tsup --watch","attw":"attw --pack .","lint":"biome check .","test":"vitest run","build":"tsup","format":"biome format --write .","publint":"publint","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm run build && pnpm run typecheck && pnpm run test && pnpm run attw && pnpm run publint"},"_npmUser":{"name":"tiny-monkey","email":"accounts@pdfmonkey.io"},"repository":{"url":"git+https://github.com/pdfmonkey/pdfmonkey-node.git","type":"git"},"_npmVersion":"11.8.0","description":"Official PDFMonkey Node.js SDK — generate PDFs from HTML/CSS templates","directories":{},"sideEffects":false,"_nodeVersion":"25.6.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.30.3","devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.10","publint":"^0.3.23","typescript":"^5.9.3","@biomejs/biome":"^2.5.8","@changesets/cli":"^3.0.0","@arethetypeswrong/cli":"^0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/pdfmonkey_1.0.0_1786964667424_0.6773020196513977","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"pdfmonkey","version":"1.1.0","keywords":["pdfmonkey","pdf","pdf-generation","api","sdk","node","typescript","document","html-to-pdf","webhook"],"author":{"url":"https://www.pdfmonkey.io","name":"PDFMonkey","email":"tinymonkey@pdfmonkey.io"},"license":"MIT","_id":"pdfmonkey@1.1.0","maintainers":[{"name":"tiny-monkey","email":"accounts@pdfmonkey.io"}],"homepage":"https://github.com/pdfmonkey/pdfmonkey-node#readme","bugs":{"url":"https://github.com/pdfmonkey/pdfmonkey-node/issues"},"dist":{"shasum":"bd698675df192ef7f81b59c217ab6cd6fe0f5b97","tarball":"https://registry.npmjs.org/pdfmonkey/-/pdfmonkey-1.1.0.tgz","fileCount":8,"integrity":"sha512-g2agoLDssUGZZe+bNGKD9q/WF/xoB5YoP2uqBjB+l9qMN75rimvioRANFHT8civEkW5uiTnL9smsLS+x37nR/w==","signatures":[{"sig":"MEUCIQCaPY4Iwf2dAl3bpSeFfduZBkcA5jnbWETHOo0MKI/oegIgLkWSlZlJyEFgz6STG1etH3IJ8+tFbWk2XJCWMk5ZiSc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEMCH2i04tE0FuMQFRF3uQaV4XVzAUOGKDYWcTcFRXzV1l4CIGWBO+9IBOnb9lloxx6qCaHQaA07CKphP6PzAAkoXmka","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfmonkey@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":150823},"main":"./dist/index.cjs","type":"module","_from":"file:pdfmonkey-1.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","attw":"attw --pack .","lint":"biome check .","test":"vitest run","build":"tsup","format":"biome format --write .","publint":"publint","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"tiny-monkey","email":"accounts@pdfmonkey.io"},"_resolved":"/tmp/cd983c0c39945d1d9949e9cb33a14ddf/pdfmonkey-1.1.0.tgz","_integrity":"sha512-g2agoLDssUGZZe+bNGKD9q/WF/xoB5YoP2uqBjB+l9qMN75rimvioRANFHT8civEkW5uiTnL9smsLS+x37nR/w==","repository":{"url":"git+https://github.com/pdfmonkey/pdfmonkey-node.git","type":"git"},"_npmVersion":"10.9.9","description":"Official PDFMonkey Node.js SDK — generate PDFs from HTML/CSS templates","directories":{},"sideEffects":false,"_nodeVersion":"22.23.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.10","publint":"^0.3.23","typescript":"^5.9.3","@biomejs/biome":"^2.5.8","@changesets/cli":"^3.0.0","@arethetypeswrong/cli":"^0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/pdfmonkey_1.1.0_1790949897691_0.07519886533018405","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"pdfmonkey","version":"1.2.0","keywords":["pdfmonkey","pdf","pdf-generation","api","sdk","node","typescript","document","html-to-pdf","webhook"],"author":{"url":"https://www.pdfmonkey.io","name":"PDFMonkey","email":"tinymonkey@pdfmonkey.io"},"license":"MIT","_id":"pdfmonkey@1.2.0","maintainers":[{"name":"tiny-monkey","email":"accounts@pdfmonkey.io"}],"homepage":"https://github.com/pdfmonkey/pdfmonkey-node#readme","bugs":{"url":"https://github.com/pdfmonkey/pdfmonkey-node/issues"},"dist":{"shasum":"1d8d845417ccefe9a193e0a63bbc6697060bb2f1","tarball":"https://registry.npmjs.org/pdfmonkey/-/pdfmonkey-1.2.0.tgz","fileCount":8,"integrity":"sha512-kS+3SoYsRMOwAyYTnrrxs0+TM6ixrjYW7IkrjTlA+1nmcbRpEj+GH5ZODLpJy0mZQG+n9bNbXlZnHRsb3o5OXw==","signatures":[{"sig":"MEQCIC+OZCbup5JNn4/v5iIGWaurq+YJtpZAR5ge6QI0KiIxAiAKG6r74thXk7em3Ctz9a6ZtNVG/8fiaJx4JfCmPlX+7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDdEoIFwVyZz50dl/zusE97HtYZCtjfmrPkDuZBDuXeEwIhAPDcVsxLL6C2TKzJKTgSd5KtIE1IghyApB1gk8mHAjEt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfmonkey@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":152677},"main":"./dist/index.cjs","type":"module","_from":"file:pdfmonkey-1.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","attw":"attw --pack .","lint":"biome check .","test":"vitest run","build":"tsup","format":"biome format --write .","publint":"publint","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","test:integration":"PDFMONKEY_INTEGRATION=1 vitest run api.integration"},"_npmUser":{"name":"tiny-monkey","email":"accounts@pdfmonkey.io"},"_resolved":"/tmp/9e53416550b8e9669cc5bbd56f0181ea/pdfmonkey-1.2.0.tgz","_integrity":"sha512-kS+3SoYsRMOwAyYTnrrxs0+TM6ixrjYW7IkrjTlA+1nmcbRpEj+GH5ZODLpJy0mZQG+n9bNbXlZnHRsb3o5OXw==","repository":{"url":"git+https://github.com/pdfmonkey/pdfmonkey-node.git","type":"git"},"_npmVersion":"10.9.9","description":"Official PDFMonkey Node.js SDK — generate PDFs from HTML/CSS templates","directories":{},"sideEffects":false,"_nodeVersion":"22.23.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.10","publint":"^0.3.23","typescript":"^5.9.3","@biomejs/biome":"^2.5.8","@changesets/cli":"^3.0.0","@arethetypeswrong/cli":"^0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/pdfmonkey_1.2.0_1791203183451_0.44941066670779706","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"pdfmonkey","version":"1.3.0","keywords":["pdfmonkey","pdf","pdf-generation","api","sdk","node","typescript","document","html-to-pdf","webhook"],"author":{"url":"https://www.pdfmonkey.io","name":"PDFMonkey","email":"tinymonkey@pdfmonkey.io"},"license":"MIT","_id":"pdfmonkey@1.3.0","maintainers":[{"name":"tiny-monkey","email":"accounts@pdfmonkey.io"}],"homepage":"https://github.com/pdfmonkey/pdfmonkey-node#readme","bugs":{"url":"https://github.com/pdfmonkey/pdfmonkey-node/issues"},"dist":{"shasum":"606813b33ff40b4f851ea0d2dd369ca482104ffd","tarball":"https://registry.npmjs.org/pdfmonkey/-/pdfmonkey-1.3.0.tgz","fileCount":8,"integrity":"sha512-O9VvmATqewpj1MeTGujMfN7WTEI3UHKgUGlJUYBJpMakpunRELlR3BQqRQ2Ms2kODxJ8yrKYT9LjWh2jLlAs3A==","signatures":[{"sig":"MEYCIQD0MNixkTDLKBIBJ+3t2Q2tCattkKIDk7UWpW/Oz6e9XQIhAILpYtlth93BBHpppJTCi+sW4L+wOianjhUqX2QYsvdZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC67NrL/C+4EKJUK32qHjjgXD/0qx6JxZhp6BU79TC3EwIhANGMJhTCCRnTahVHo0gMPnNYjMphWVGMjg/fCKARbZz+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfmonkey@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":157069},"main":"./dist/index.cjs","type":"module","_from":"file:pdfmonkey-1.3.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","attw":"attw --pack .","lint":"biome check .","test":"vitest run","build":"tsup","format":"biome format --write .","publint":"publint","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","test:integration":"PDFMONKEY_INTEGRATION=1 vitest run api.integration"},"_npmUser":{"name":"tiny-monkey","email":"accounts@pdfmonkey.io"},"_resolved":"/tmp/716223962d4f5468cd5794a36f4cbe16/pdfmonkey-1.3.0.tgz","_integrity":"sha512-O9VvmATqewpj1MeTGujMfN7WTEI3UHKgUGlJUYBJpMakpunRELlR3BQqRQ2Ms2kODxJ8yrKYT9LjWh2jLlAs3A==","repository":{"url":"git+https://github.com/pdfmonkey/pdfmonkey-node.git","type":"git"},"_npmVersion":"10.9.9","description":"Official PDFMonkey Node.js SDK — generate PDFs from HTML/CSS templates","directories":{},"sideEffects":false,"_nodeVersion":"22.23.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.10","publint":"^0.3.23","typescript":"^5.9.3","@biomejs/biome":"^2.5.8","@changesets/cli":"^3.0.0","@arethetypeswrong/cli":"^0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/pdfmonkey_1.3.0_1791205315515_0.6954691748992605","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"_id":"pdfmonkey@1.4.0","bugs":{"url":"https://github.com/pdfmonkey/pdfmonkey-node/issues"},"dist":{"shasum":"ff2154c08090c8e14aca3157b4417b2a14dab4ed","tarball":"https://registry.npmjs.org/pdfmonkey/-/pdfmonkey-1.4.0.tgz","fileCount":8,"integrity":"sha512-pWk0ZDBZ6KH7IdDDaq3NXTmnZu9bQ0RNrF+k7ZOcICCFHHygwpTHiS6y0KTYbpXqOLf54XvozKFzUPty/PUu9w==","signatures":[{"sig":"MEUCIHX8nTVIwvACePSmKc0wRKSDKtF0YbnP4D1Q8W9h2cu+AiEA2FvqtOEF2YWE1QrA8FRubQbgNBVfSSC/sGM6D4uy/tw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEKlH2ZqGhDzCRvwg9NiAoIcUM2e8YcqvKe0cmDf0swuAiEA5loXxhSL5HtwhE85IspXs5RrW1UO2p8vA/Ox2e3iO0c="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pdfmonkey@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":159806},"main":"./dist/index.cjs","name":"pdfmonkey","type":"module","_from":"file:pdfmonkey-1.4.0.tgz","types":"./dist/index.d.ts","author":{"url":"https://www.pdfmonkey.io","name":"PDFMonkey","email":"tinymonkey@pdfmonkey.io"},"module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"license":"MIT","scripts":{"dev":"tsup --watch","attw":"attw --pack .","lint":"biome check .","test":"vitest run","build":"tsup","format":"biome format --write .","publint":"publint","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","test:integration":"PDFMONKEY_INTEGRATION=1 vitest run api.integration"},"version":"1.4.0","_npmUser":{"name":"tiny-monkey","email":"accounts@pdfmonkey.io"},"homepage":"https://github.com/pdfmonkey/pdfmonkey-node#readme","keywords":["pdfmonkey","pdf","pdf-generation","api","sdk","node","typescript","document","html-to-pdf","webhook"],"_resolved":"/tmp/2a9098ebd7187862114ce50398eff225/pdfmonkey-1.4.0.tgz","_integrity":"sha512-pWk0ZDBZ6KH7IdDDaq3NXTmnZu9bQ0RNrF+k7ZOcICCFHHygwpTHiS6y0KTYbpXqOLf54XvozKFzUPty/PUu9w==","repository":{"url":"git+https://github.com/pdfmonkey/pdfmonkey-node.git","type":"git"},"_npmVersion":"10.9.9","description":"Official PDFMonkey Node.js SDK — generate PDFs from HTML/CSS templates","directories":{},"maintainers":[{"name":"tiny-monkey","email":"accounts@pdfmonkey.io"}],"sideEffects":false,"_nodeVersion":"22.23.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.10","publint":"^0.3.23","typescript":"^5.9.3","@biomejs/biome":"^2.5.8","@changesets/cli":"^3.0.0","@arethetypeswrong/cli":"^0.18.5"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pdfmonkey_1.4.0_1791239342990_0.2946779581134542"}}},"time":{"created":"2026-08-17T11:04:27.297Z","modified":"2026-10-05T22:29:03.426Z","1.0.0":"2026-08-17T11:04:27.579Z","1.1.0":"2026-10-02T14:04:57.790Z","1.2.0":"2026-10-05T12:26:23.545Z","1.3.0":"2026-10-05T13:01:55.601Z","1.4.0":"2026-10-05T22:29:03.076Z"},"bugs":{"url":"https://github.com/pdfmonkey/pdfmonkey-node/issues"},"author":{"url":"https://www.pdfmonkey.io","name":"PDFMonkey","email":"tinymonkey@pdfmonkey.io"},"license":"MIT","homepage":"https://github.com/pdfmonkey/pdfmonkey-node#readme","keywords":["pdfmonkey","pdf","pdf-generation","api","sdk","node","typescript","document","html-to-pdf","webhook"],"repository":{"url":"git+https://github.com/pdfmonkey/pdfmonkey-node.git","type":"git"},"description":"Official PDFMonkey Node.js SDK — generate PDFs from HTML/CSS templates","maintainers":[{"name":"tiny-monkey","email":"accounts@pdfmonkey.io"}],"readme":"# pdfmonkey\n\n[![CI](https://github.com/pdfmonkey/pdfmonkey-node/actions/workflows/ci.yml/badge.svg)](https://github.com/pdfmonkey/pdfmonkey-node/actions/workflows/ci.yml)\n[![npm version](https://img.shields.io/npm/v/pdfmonkey.svg)](https://www.npmjs.com/package/pdfmonkey)\n[![npm downloads](https://img.shields.io/npm/dm/pdfmonkey.svg)](https://www.npmjs.com/package/pdfmonkey)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)\n\nOfficial Node.js SDK for the [PDFMonkey](https://www.pdfmonkey.io) API. Zero runtime dependencies, dual ESM + CommonJS, Node 20+ and edge-runtime compatible (uses Web Crypto only).\n\n## Installation\n\n```sh\nnpm install pdfmonkey\n```\n\n## Usage\n\n```ts\nimport { PDFMonkey } from 'pdfmonkey';\n\nconst client = new PDFMonkey('your-api-key');\n```\n\n### Documents\n\n> **No `client.documents.list()`** — listing returns a lightweight summary, so it lives on `client.documentCards.list()` (see [Pagination](#pagination)). All update endpoints use HTTP `PUT` (full document replacement) to match the PDFMonkey API contract; the SDK does not currently expose `PATCH`.\n\n```ts\n// Create a document (starts as draft)\nconst doc = await client.documents.create({\n  document_template_id: 'tpl_xxx',\n  payload: { name: 'Alice', amount: 42 }, // object — auto-stringified to JSON\n  status: 'pending', // set to 'pending' to start generation immediately\n});\n\n// Get a document\nconst doc = await client.documents.get('doc_xxx');\n\n// Update a document\nconst updated = await client.documents.update('doc_xxx', {\n  payload: { name: 'Bob' },\n});\n\n// Delete a document\nawait client.documents.delete('doc_xxx');\n```\n\n### Document Meta (Password & Filename)\n\nUse the `meta` field to password-protect or set a custom filename on generated PDFs:\n\n```ts\nconst doc = await client.documents.create({\n  document_template_id: 'tpl_xxx',\n  payload: { name: 'Alice' },\n  meta: {\n    _password: 'secret123',      // encrypts the PDF (AES-256)\n    _filename: 'invoice-42.pdf', // sets the download filename\n    customField: 'any value',    // your own metadata\n  },\n  status: 'pending',\n});\n```\n\n`meta` accepts either an object (auto-serialized to JSON) or a pre-serialized JSON string. Works on `create`, `update`, and `generateSync`.\n\n### Downloading the PDF\n\n```ts\n// As a Uint8Array\nconst bytes = await client.documents.download(doc); // or doc.id\n\n// As a ReadableStream — pipe straight to disk or an HTTP response\nconst stream = await client.documents.downloadStream(doc.id);\n```\n\nThe helpers throw `PDFMonkeyError` if the document has no `download_url` yet — wait for generation to complete first.\n\n### Reading meta back\n\n`Document.meta` is a JSON string on the wire. Use `parseMeta` to recover the structured object you sent:\n\n```ts\nimport { parseMeta } from 'pdfmonkey';\n\nconst decoded = parseMeta(doc.meta); // DocumentMeta | null\nif (decoded?._filename) console.log(decoded._filename);\n```\n\n### Synchronous Generation\n\nGenerate a PDF and wait for it to complete in a single request:\n\n```ts\nconst card = await client.documents.generateSync({\n  document_template_id: 'tpl_xxx',\n  payload: { invoice_number: 1234 },\n});\n\nconsole.log(card.download_url);\n```\n\n### Polling for Completion\n\nCreate a document then poll until generation completes:\n\n```ts\nconst doc = await client.documents.create({\n  document_template_id: 'tpl_xxx',\n  payload: { data: 'value' },\n  status: 'pending',\n});\n\nconst completed = await client.documents.waitForGeneration(doc.id, {\n  interval: 2000,  // poll every 2s (default)\n  timeout: 120000, // give up after 120s (default)\n  signal: AbortSignal.timeout(30000), // optional AbortSignal\n});\n\nconsole.log(completed.download_url);\n```\n\n### Document Status\n\nDocuments and document cards share a `DocumentStatus` type:\n\n```ts\nimport type { DocumentStatus } from 'pdfmonkey';\n// 'draft' | 'pending' | 'generating' | 'success' | 'failure'\n```\n\n### Document Templates\n\n```ts\nconst page = await client.documentTemplates.list({ workspace_id: 'ws_xxx' });\nconst template = await client.documentTemplates.get('tpl_xxx');\nconst created = await client.documentTemplates.create({\n  identifier: 'invoice',\n  workspace_id: 'ws_xxx',\n});\nconst updated = await client.documentTemplates.update('tpl_xxx', { identifier: 'receipt' });\nawait client.documentTemplates.delete('tpl_xxx');\n```\n\n> Leave `pdf_engine_draft_id` unset on `create`/`update` — the API auto-selects the latest engine. Override only when an end-user explicitly asks to pin a specific engine version (see PDF Engines below).\n\n### PDF Engines (advanced)\n\nRead-only list of available rendering engines. Most callers do not need this. Use only when an end-user explicitly wants to pin a template to a specific engine version.\n\n```ts\nconst engines = await client.pdfEngines.list();\n// [{ id: 'eng_xxx', name: 'chromium', version: 6, deprecated_on: null }, ...]\n\nawait client.documentTemplates.update('tpl_xxx', {\n  pdf_engine_draft_id: engines[0]!.id,\n});\n```\n\n### Pagination\n\nAll list methods return a `Page<T>` with built-in navigation:\n\n```ts\nconst page = await client.documentCards.list({ document_template_id: 'tpl_xxx' });\n\n// Filter by filename (or exact document ID) and any of several statuses\nconst inProgress = await client.documentCards.list({ search: 'invoice', status: ['pending', 'generating'] });\n\nconsole.log(page.data);        // items on this page\nconsole.log(page.currentPage); // 1\nconsole.log(page.totalPages);  // 5\n\nif (page.hasNextPage()) {\n  const next = await page.getNextPage();\n}\n```\n\nWorkspaces, workspace cards, document templates, snippets and template folders also expose `listAll()`, which fetches every item in a single request (`page=all`) and returns a plain array. Document cards do not support it, so iterate with `for await (const card of page)` instead.\n\n```ts\nconst workspaces = await client.workspaces.listAll();\nconst templates = await client.documentTemplates.listAll({ workspace_id: 'ws_xxx' });\nconst snippets = await client.snippets.listAll({ workspace_id: 'ws_xxx' });\nconst folders = await client.templateFolders.listAll({ workspace_id: 'ws_xxx' });\n```\n\n### Webhooks\n\nRegister webhook endpoints:\n\n```ts\nconst hook = await client.restHooks.create({\n  url: 'https://example.com/webhook',\n  workspace_id: 'ws_xxx',\n  events: ['documents.generation.success', 'documents.generation.failure'],\n});\n\nawait client.restHooks.delete(hook.id);\n```\n\nVerify incoming webhook signatures (Svix HMAC-SHA256):\n\n```ts\nimport { verifyWebhook } from 'pdfmonkey';\n\nconst payload = await verifyWebhook(\n  rawBody,\n  {\n    'svix-id': req.headers['svix-id'],\n    'svix-timestamp': req.headers['svix-timestamp'],\n    'svix-signature': req.headers['svix-signature'],\n  },\n  process.env.WEBHOOK_SECRET,\n);\n\n// Generation events carry the document card; `quota.warning` carries usage figures\nif ('document' in payload) {\n  if (payload.document.status === 'success') {\n    console.log(payload.document.download_url);\n  } else {\n    console.log(payload.document.failure_cause);\n  }\n} else {\n  console.log(`${payload.available_documents} documents left`);\n}\n```\n\n#### Framework recipes\n\nTwo integrations have small but easy-to-miss requirements. Everything else is the verify call above.\n\n**Express** — capture the raw body, otherwise the JSON body parser mutates it and the signature stops matching:\n\n```ts\nimport express from 'express';\nimport { verifyWebhook } from 'pdfmonkey';\n\nconst app = express();\n\napp.post(\n  '/pdfmonkey-webhook',\n  express.raw({ type: 'application/json' }),\n  async (req, res) => {\n    try {\n      const payload = await verifyWebhook(\n        req.body.toString('utf8'),\n        {\n          'svix-id': req.header('svix-id') ?? '',\n          'svix-timestamp': req.header('svix-timestamp') ?? '',\n          'svix-signature': req.header('svix-signature') ?? '',\n        },\n        process.env.WEBHOOK_SECRET ?? '',\n      );\n      // handle payload\n      res.status(204).end();\n    } catch {\n      res.status(400).send('Invalid signature');\n    }\n  },\n);\n```\n\n**Next.js App Router** — pick the runtime (`'nodejs'` or `'edge'`, both work) and read the raw body via `request.text()`:\n\n```ts\n// app/api/pdfmonkey-webhook/route.ts\nimport { verifyWebhook } from 'pdfmonkey';\n\nexport const runtime = 'nodejs';\n\nexport async function POST(request: Request): Promise<Response> {\n  const rawBody = await request.text();\n  try {\n    const payload = await verifyWebhook(\n      rawBody,\n      {\n        'svix-id': request.headers.get('svix-id') ?? '',\n        'svix-timestamp': request.headers.get('svix-timestamp') ?? '',\n        'svix-signature': request.headers.get('svix-signature') ?? '',\n      },\n      process.env.WEBHOOK_SECRET ?? '',\n    );\n    // handle payload\n    return new Response(null, { status: 204 });\n  } catch {\n    return new Response('Invalid signature', { status: 400 });\n  }\n}\n```\n\n### Other Resources\n\n```ts\n// Snippets\nconst snippets = await client.snippets.list({ workspace_id: 'ws_xxx' });\nawait client.snippets.create({ identifier: 'header', code: '<div>Header</div>', workspace_id: 'ws_xxx' });\n\n// Template Folders\nconst folders = await client.templateFolders.list({ workspace_id: 'ws_xxx' });\n\n// Workspaces\nconst workspaces = await client.workspaces.list();\n\n// Workspace Cards (includes the admin's plan)\nconst cards = await client.workspaceCards.list();\nawait client.workspaceCards.update('ws_xxx', { identifier: 'New name' });\n\n// Current User\nconst user = await client.currentUser.get();\n```\n\n## Configuration\n\n```ts\nconst client = new PDFMonkey({\n  apiKey: 'your-api-key',           // or set PDFMONKEY_API_KEY in the environment\n  baseURL: 'https://api.pdfmonkey.io/api/v1', // default\n  timeout: 30_000,                  // request timeout in ms (default: 30s)\n  maxRetries: 2,                    // retry on 408/429/5xx (default: 2)\n  fetch: customFetch,               // bring your own fetch implementation\n  logger: console,                  // debug logging\n  retryDelay: (attempt) => attempt * 250, // custom backoff (optional)\n  hooks: {                          // request/response/error interceptors\n    onRequest: (ctx) => { ctx.headers['X-Trace-Id'] = newTraceId(); },\n    onResponse: (ctx) => metrics.observe(ctx.durationMs, ctx.response.status),\n  },\n});\n```\n\nWhen `apiKey` is omitted, the client reads `process.env.PDFMONKEY_API_KEY`.\n\n### Per-request options\n\nEvery resource method accepts a trailing options object for `signal`, `timeout`, and `maxRetries`:\n\n```ts\nawait client.documents.create(\n  { document_template_id: 'tpl_xxx', payload: { invoice: 1 } },\n  {\n    signal: AbortSignal.timeout(10_000),\n    timeout: 60_000,\n  },\n);\n```\n\nDynamic per-call headers (trace IDs, etc.) go through the `onRequest` hook in `ClientOptions.hooks` — mutate `ctx.headers` there.\n\n### Browser & edge runtimes\n\nThe SDK uses only Web Crypto + global `fetch`, so `verifyWebhook` and the client both run on Cloudflare Workers, Vercel Edge, Deno, and Bun in addition to Node 20+. Pass a custom `fetch` if your runtime needs a wrapped one.\n\n## Error Handling\n\n```ts\nimport { APIConnectionError, AuthenticationError, NotFoundError, RateLimitError } from 'pdfmonkey';\n\ntry {\n  await client.documents.get('doc_xxx');\n} catch (error) {\n  if (error instanceof AuthenticationError) {\n    // Invalid API key (401)\n  } else if (error instanceof NotFoundError) {\n    // Resource not found (404)\n  } else if (error instanceof RateLimitError) {\n    console.log(error.retryAfter); // seconds from Retry-After header\n  } else if (error instanceof APIConnectionError) {\n    console.log(error.cause); // original network error (native Error.cause)\n  }\n}\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}