{"_id":"@crunchy-bytes/n8n-nodes-puppeteer","_rev":"5-3b8287bf8f04d9cf83617eeeb475f12f","name":"@crunchy-bytes/n8n-nodes-puppeteer","dist-tags":{"latest":"1.5.0-crunchy.puppeteer-22"},"versions":{"1.5.0-crunchy.1":{"name":"@crunchy-bytes/n8n-nodes-puppeteer","version":"1.5.0-crunchy.1","keywords":["n8n","node","puppeteer","scraper","screenshot","script","pdf","n8n-node","n8n-community-node-package"],"author":{"name":"Nicholas Penree","email":"nick@penree.com"},"license":"MIT","_id":"@crunchy-bytes/n8n-nodes-puppeteer@1.5.0-crunchy.1","maintainers":[{"name":"crunchy-bytes","email":"info@crunchy-bytes.com"}],"homepage":"https://github.com/link82/n8n-nodes-puppeteer","bugs":{"url":"https://github.com/link82/n8n-nodes-puppeteer/issues"},"n8n":{"nodes":["dist/nodes/Puppeteer/Puppeteer.node.js"],"credentials":[],"n8nNodesApiVersion":1},"dist":{"shasum":"80528440f80a9ea45932e5ea305dc7d6595b63ba","tarball":"https://registry.npmjs.org/@crunchy-bytes/n8n-nodes-puppeteer/-/n8n-nodes-puppeteer-1.5.0-crunchy.1.tgz","fileCount":13,"integrity":"sha512-7rDQU/WBADqEvWOVpaPBXS4tRwwVYsHBe6hrvug7qG0xfcnUBOui4Besj6DPMUJ1i78BU5AAFCZN9BiT8JqLQQ==","signatures":[{"sig":"MEUCIGZj+6w0NLdeIId8b32LR7gR6a54qx6SuZ79ivBBELN4AiEAgUD0sVMBuF4f9JsjBNJ6uzWY3JJaI/bzMDNHpv2WHJs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201820},"main":"index.js","gitHead":"7b5c77aea4891d6db92ae27b2a7c9f498f10a0e8","scripts":{"dev":"npm run watch","lint":"tslint -p tsconfig.json -c tslint.json","build":"tsc && gulp","watch":"tsc --watch","lintfix":"tslint --fix -p tsconfig.json -c tslint.json","docker:run":"docker run -it --rm -p 5678:5678 -v n8n_data:/home/node/.n8n n8n-nodes-puppeteer","nodelinter":"nodelinter","docker:test":"docker run --rm n8n-nodes-puppeteer n8n --version","docker:build":"docker build -t n8n-nodes-puppeteer .","docker:clean":"docker volume rm n8n_data 2>/dev/null || true","docker:shell":"docker run -it --rm --entrypoint sh n8n-nodes-puppeteer","docker:clean:all":"docker volume rm n8n_data 2>/dev/null || true && docker rmi n8n-nodes-puppeteer n8n-nodes-puppeteer:local 2>/dev/null || true","docker:run:fresh":"docker run -it --rm -p 5678:5678 n8n-nodes-puppeteer","docker:run:local":"docker run -it --rm -p 5678:5678 -v n8n_data:/home/node/.n8n n8n-nodes-puppeteer:local","docker:test:fresh":"npm run docker:clean && npm run docker:build && npm run docker:run:fresh","docker:build:local":"docker build -t n8n-nodes-puppeteer:local -f docker/Dockerfile .","docker:run:external-browser":"docker run -it --rm -p 5678:5678 -e PUPPETEER_BROWSER_WS_ENDPOINT=ws://host.docker.internal:9222 -v n8n_data:/home/node/.n8n n8n-nodes-puppeteer"},"_npmUser":{"name":"crunchy-bytes","email":"info@crunchy-bytes.com"},"overrides":{"lru-cache":"^10.0.0"},"repository":{"url":"git+https://github.com/link82/n8n-nodes-puppeteer.git","type":"git"},"_npmVersion":"10.9.4","description":"n8n node for browser automation using Puppeteer","directories":{},"_nodeVersion":"22.21.1","dependencies":{"@n8n/vm2":"^3.9.25","puppeteer":"^24.1.1","puppeteer-extra":"^3.3.6","puppeteer-extra-plugin-stealth":"^2.11.2","puppeteer-extra-plugin-human-typing":"github:0x7357/puppeteer-extra-plugin-human-typing","puppeteer-extra-plugin-user-preferences":"^2.4.1"},"_hasShrinkwrap":false,"devDependencies":{"gulp":"^5.0.0","eslint":"^9.17.0","prettier":"^3.4.2","typescript":"^5.7.2","n8n-workflow":"*","@typescript-eslint/parser":"^8.18.1","eslint-plugin-n8n-nodes-base":"^1.16.3"},"peerDependencies":{"n8n-workflow":"*"},"_npmOperationalInternal":{"tmp":"tmp/n8n-nodes-puppeteer_1.5.0-crunchy.1_1770212397628_0.7424394901907616","host":"s3://npm-registry-packages-npm-production"}},"1.5.0-crunchy.2":{"name":"@crunchy-bytes/n8n-nodes-puppeteer","version":"1.5.0-crunchy.2","keywords":["n8n","node","puppeteer","scraper","screenshot","script","pdf","n8n-node","n8n-community-node-package"],"author":{"name":"Nicholas Penree","email":"nick@penree.com"},"license":"MIT","_id":"@crunchy-bytes/n8n-nodes-puppeteer@1.5.0-crunchy.2","maintainers":[{"name":"crunchy-bytes","email":"info@crunchy-bytes.com"}],"homepage":"https://github.com/link82/n8n-nodes-puppeteer","bugs":{"url":"https://github.com/link82/n8n-nodes-puppeteer/issues"},"n8n":{"nodes":["dist/nodes/Puppeteer/Puppeteer.node.js"],"credentials":[],"n8nNodesApiVersion":1},"dist":{"shasum":"5659a6e75eeb262345c8195f1483c51594603fac","tarball":"https://registry.npmjs.org/@crunchy-bytes/n8n-nodes-puppeteer/-/n8n-nodes-puppeteer-1.5.0-crunchy.2.tgz","fileCount":13,"integrity":"sha512-6eda7S2yY3q9A/48drqvtRbMX3viv4ATQzn1e3bIAOYcpKJKg7mbBEI6moL71zp/MVN0FmRlDwcRGJUIFUZYZA==","signatures":[{"sig":"MEUCIQCC6ESLpA6nAMouOqO1sjnD17iNhlnL/NMVp5dj/jHsZAIgXcxGIxiYI4/1AAf8loHrndLTzn72kQBdfk7Lx/TICno=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":202486},"main":"index.js","gitHead":"964497ebd31a9fb4ee94ad64e2c25b9f5a06ea22","scripts":{"dev":"npm run watch","lint":"tslint -p tsconfig.json -c tslint.json","build":"tsc && gulp","watch":"tsc --watch","lintfix":"tslint --fix -p tsconfig.json -c tslint.json","docker:run":"docker run -it --rm -p 5678:5678 -v n8n_data:/home/node/.n8n n8n-nodes-puppeteer","nodelinter":"nodelinter","docker:test":"docker run --rm n8n-nodes-puppeteer n8n --version","docker:build":"docker build -t n8n-nodes-puppeteer .","docker:clean":"docker volume rm n8n_data 2>/dev/null || true","docker:shell":"docker run -it --rm --entrypoint sh n8n-nodes-puppeteer","docker:clean:all":"docker volume rm n8n_data 2>/dev/null || true && docker rmi n8n-nodes-puppeteer n8n-nodes-puppeteer:local 2>/dev/null || true","docker:run:fresh":"docker run -it --rm -p 5678:5678 n8n-nodes-puppeteer","docker:run:local":"docker run -it --rm -p 5678:5678 -v n8n_data:/home/node/.n8n n8n-nodes-puppeteer:local","docker:test:fresh":"npm run docker:clean && npm run docker:build && npm run docker:run:fresh","docker:build:local":"docker build -t n8n-nodes-puppeteer:local -f docker/Dockerfile .","docker:run:external-browser":"docker run -it --rm -p 5678:5678 -e PUPPETEER_BROWSER_WS_ENDPOINT=ws://host.docker.internal:9222 -v n8n_data:/home/node/.n8n n8n-nodes-puppeteer"},"_npmUser":{"name":"crunchy-bytes","email":"info@crunchy-bytes.com"},"overrides":{"yallist":"^4.0.0"},"repository":{"url":"git+https://github.com/link82/n8n-nodes-puppeteer.git","type":"git"},"_npmVersion":"10.9.4","description":"n8n node for browser automation using Puppeteer","directories":{},"_nodeVersion":"22.21.1","dependencies":{"yallist":"^4.0.0","@n8n/vm2":"^3.9.25","puppeteer":"^24.1.1","puppeteer-extra":"^3.3.6","puppeteer-extra-plugin-stealth":"^2.11.2","puppeteer-extra-plugin-human-typing":"github:0x7357/puppeteer-extra-plugin-human-typing","puppeteer-extra-plugin-user-preferences":"^2.4.1"},"_hasShrinkwrap":false,"devDependencies":{"gulp":"^5.0.0","eslint":"^9.17.0","prettier":"^3.4.2","typescript":"^5.7.2","n8n-workflow":"*","@typescript-eslint/parser":"^8.18.1","eslint-plugin-n8n-nodes-base":"^1.16.3"},"peerDependencies":{"n8n-workflow":"*"},"_npmOperationalInternal":{"tmp":"tmp/n8n-nodes-puppeteer_1.5.0-crunchy.2_1770280694805_0.07839844829369325","host":"s3://npm-registry-packages-npm-production"}},"1.5.0-crunchy.3":{"name":"@crunchy-bytes/n8n-nodes-puppeteer","version":"1.5.0-crunchy.3","keywords":["n8n","node","puppeteer","scraper","screenshot","script","pdf","n8n-node","n8n-community-node-package"],"author":{"name":"Nicholas Penree","email":"nick@penree.com"},"license":"MIT","_id":"@crunchy-bytes/n8n-nodes-puppeteer@1.5.0-crunchy.3","maintainers":[{"name":"crunchy-bytes","email":"info@crunchy-bytes.com"}],"homepage":"https://github.com/link82/n8n-nodes-puppeteer","bugs":{"url":"https://github.com/link82/n8n-nodes-puppeteer/issues"},"n8n":{"nodes":["dist/nodes/Puppeteer/Puppeteer.node.js"],"credentials":[],"n8nNodesApiVersion":1},"dist":{"shasum":"5b3d7909c326db229206babd426eacd8b60c734c","tarball":"https://registry.npmjs.org/@crunchy-bytes/n8n-nodes-puppeteer/-/n8n-nodes-puppeteer-1.5.0-crunchy.3.tgz","fileCount":13,"integrity":"sha512-ttfIK9kZDdRujDqAj22YFgXuqkOSmtoR2BVxR5nLVWUc5pYbraNFulLbKaYeCUp7DwZFta5i5RJWL/YP+Zw/TA==","signatures":[{"sig":"MEUCIERDu21irZH9aTI7GL2PyfeExdLEpk1K27/bClaTysxLAiEAnDohBQi6tIapbDRxNpcwoEIJs2g6xUxRm7BuhsZuhew=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201685},"main":"index.js","gitHead":"964497ebd31a9fb4ee94ad64e2c25b9f5a06ea22","scripts":{"dev":"npm run watch","lint":"tslint -p tsconfig.json -c tslint.json","build":"tsc && gulp","watch":"tsc --watch","lintfix":"tslint --fix -p tsconfig.json -c tslint.json","docker:run":"docker run -it --rm -p 5678:5678 -v n8n_data:/home/node/.n8n n8n-nodes-puppeteer","nodelinter":"nodelinter","docker:test":"docker run --rm n8n-nodes-puppeteer n8n --version","docker:build":"docker build -t n8n-nodes-puppeteer .","docker:clean":"docker volume rm n8n_data 2>/dev/null || true","docker:shell":"docker run -it --rm --entrypoint sh n8n-nodes-puppeteer","docker:clean:all":"docker volume rm n8n_data 2>/dev/null || true && docker rmi n8n-nodes-puppeteer n8n-nodes-puppeteer:local 2>/dev/null || true","docker:run:fresh":"docker run -it --rm -p 5678:5678 n8n-nodes-puppeteer","docker:run:local":"docker run -it --rm -p 5678:5678 -v n8n_data:/home/node/.n8n n8n-nodes-puppeteer:local","docker:test:fresh":"npm run docker:clean && npm run docker:build && npm run docker:run:fresh","docker:build:local":"docker build -t n8n-nodes-puppeteer:local -f docker/Dockerfile .","docker:run:external-browser":"docker run -it --rm -p 5678:5678 -e PUPPETEER_BROWSER_WS_ENDPOINT=ws://host.docker.internal:9222 -v n8n_data:/home/node/.n8n n8n-nodes-puppeteer"},"_npmUser":{"name":"crunchy-bytes","email":"info@crunchy-bytes.com"},"repository":{"url":"git+https://github.com/link82/n8n-nodes-puppeteer.git","type":"git"},"_npmVersion":"10.9.4","description":"n8n node for browser automation using Puppeteer","directories":{},"_nodeVersion":"22.21.1","dependencies":{"@n8n/vm2":"^3.9.25","puppeteer-core":"^24.1.1","puppeteer-extra":"^3.3.6","puppeteer-extra-plugin-stealth":"^2.11.2","puppeteer-extra-plugin-human-typing":"github:0x7357/puppeteer-extra-plugin-human-typing"},"_hasShrinkwrap":false,"devDependencies":{"gulp":"^5.0.0","eslint":"^9.17.0","prettier":"^3.4.2","typescript":"^5.7.2","n8n-workflow":"*","@typescript-eslint/parser":"^8.18.1","eslint-plugin-n8n-nodes-base":"^1.16.3"},"peerDependencies":{"n8n-workflow":"*"},"_npmOperationalInternal":{"tmp":"tmp/n8n-nodes-puppeteer_1.5.0-crunchy.3_1770281472487_0.22087603904844744","host":"s3://npm-registry-packages-npm-production"}},"1.5.0-crunchy.4":{"name":"@crunchy-bytes/n8n-nodes-puppeteer","version":"1.5.0-crunchy.4","keywords":["n8n","node","puppeteer","scraper","screenshot","script","pdf","n8n-node","n8n-community-node-package"],"author":{"name":"Nicholas Penree","email":"nick@penree.com"},"license":"MIT","_id":"@crunchy-bytes/n8n-nodes-puppeteer@1.5.0-crunchy.4","maintainers":[{"name":"crunchy-bytes","email":"info@crunchy-bytes.com"}],"homepage":"https://github.com/link82/n8n-nodes-puppeteer","bugs":{"url":"https://github.com/link82/n8n-nodes-puppeteer/issues"},"n8n":{"nodes":["dist/nodes/Puppeteer/Puppeteer.node.js"],"credentials":[],"n8nNodesApiVersion":1},"dist":{"shasum":"f18b59e56e970651cc53786ded8d600cd1791ff3","tarball":"https://registry.npmjs.org/@crunchy-bytes/n8n-nodes-puppeteer/-/n8n-nodes-puppeteer-1.5.0-crunchy.4.tgz","fileCount":13,"integrity":"sha512-71WvvWo67kF8ilwII1wOgJufi15muvH7n5Xj2APp9peDUIG547P7x1u4LvMBD1QX8IPAqTMm8PtZQtMehOj8fA==","signatures":[{"sig":"MEQCIGyVXw8v3ryHtbKNcnypwQxtRCSU90xKs7/5rsiRiO+kAiAQZTWh41rIe1cnQit9RucnLYLeB6lNNpWDcQZ/+lZi9g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":184853},"main":"index.js","gitHead":"964497ebd31a9fb4ee94ad64e2c25b9f5a06ea22","scripts":{"dev":"npm run watch","lint":"tslint -p tsconfig.json -c tslint.json","build":"tsc && gulp","watch":"tsc --watch","lintfix":"tslint --fix -p tsconfig.json -c tslint.json","docker:run":"docker run -it --rm -p 5678:5678 -v n8n_data:/home/node/.n8n n8n-nodes-puppeteer","nodelinter":"nodelinter","docker:test":"docker run --rm n8n-nodes-puppeteer n8n --version","docker:build":"docker build -t n8n-nodes-puppeteer .","docker:clean":"docker volume rm n8n_data 2>/dev/null || true","docker:shell":"docker run -it --rm --entrypoint sh n8n-nodes-puppeteer","docker:clean:all":"docker volume rm n8n_data 2>/dev/null || true && docker rmi n8n-nodes-puppeteer n8n-nodes-puppeteer:local 2>/dev/null || true","docker:run:fresh":"docker run -it --rm -p 5678:5678 n8n-nodes-puppeteer","docker:run:local":"docker run -it --rm -p 5678:5678 -v n8n_data:/home/node/.n8n n8n-nodes-puppeteer:local","docker:test:fresh":"npm run docker:clean && npm run docker:build && npm run docker:run:fresh","docker:build:local":"docker build -t n8n-nodes-puppeteer:local -f docker/Dockerfile .","docker:run:external-browser":"docker run -it --rm -p 5678:5678 -e PUPPETEER_BROWSER_WS_ENDPOINT=ws://host.docker.internal:9222 -v n8n_data:/home/node/.n8n n8n-nodes-puppeteer"},"_npmUser":{"name":"crunchy-bytes","email":"info@crunchy-bytes.com"},"repository":{"url":"git+https://github.com/link82/n8n-nodes-puppeteer.git","type":"git"},"_npmVersion":"10.9.4","description":"n8n node for browser automation using Puppeteer","directories":{},"_nodeVersion":"22.21.1","dependencies":{"@n8n/vm2":"^3.9.25","puppeteer-core":"^24.1.1"},"_hasShrinkwrap":false,"devDependencies":{"gulp":"^5.0.0","eslint":"^9.17.0","prettier":"^3.4.2","typescript":"^5.7.2","n8n-workflow":"*","@typescript-eslint/parser":"^8.18.1","eslint-plugin-n8n-nodes-base":"^1.16.3"},"peerDependencies":{"n8n-workflow":"*"},"_npmOperationalInternal":{"tmp":"tmp/n8n-nodes-puppeteer_1.5.0-crunchy.4_1770282332618_0.1617129471384069","host":"s3://npm-registry-packages-npm-production"}},"1.5.0-crunchy.puppeteer-22":{"name":"@crunchy-bytes/n8n-nodes-puppeteer","version":"1.5.0-crunchy.puppeteer-22","description":"n8n node for browser automation using Puppeteer","license":"MIT","homepage":"https://github.com/link82/n8n-nodes-puppeteer","author":{"name":"Nicholas Penree","email":"nick@penree.com"},"repository":{"type":"git","url":"git+https://github.com/link82/n8n-nodes-puppeteer.git"},"main":"index.js","scripts":{"dev":"npm run watch","build":"tsc && gulp","lint":"tslint -p tsconfig.json -c tslint.json","lintfix":"tslint --fix -p tsconfig.json -c tslint.json","nodelinter":"nodelinter","watch":"tsc --watch","docker:build":"docker build -t n8n-nodes-puppeteer .","docker:build:local":"docker build -t n8n-nodes-puppeteer:local -f docker/Dockerfile .","docker:run":"docker run -it --rm -p 5678:5678 -v n8n_data:/home/node/.n8n n8n-nodes-puppeteer","docker:run:local":"docker run -it --rm -p 5678:5678 -v n8n_data:/home/node/.n8n n8n-nodes-puppeteer:local","docker:run:fresh":"docker run -it --rm -p 5678:5678 n8n-nodes-puppeteer","docker:run:external-browser":"docker run -it --rm -p 5678:5678 -e PUPPETEER_BROWSER_WS_ENDPOINT=ws://host.docker.internal:9222 -v n8n_data:/home/node/.n8n n8n-nodes-puppeteer","docker:test":"docker run --rm n8n-nodes-puppeteer n8n --version","docker:test:fresh":"npm run docker:clean && npm run docker:build && npm run docker:run:fresh","docker:shell":"docker run -it --rm --entrypoint sh n8n-nodes-puppeteer","docker:clean":"docker volume rm n8n_data 2>/dev/null || true","docker:clean:all":"docker volume rm n8n_data 2>/dev/null || true && docker rmi n8n-nodes-puppeteer n8n-nodes-puppeteer:local 2>/dev/null || true"},"keywords":["n8n","node","puppeteer","scraper","screenshot","script","pdf","n8n-node","n8n-community-node-package"],"n8n":{"n8nNodesApiVersion":1,"credentials":[],"nodes":["dist/nodes/Puppeteer/Puppeteer.node.js"]},"devDependencies":{"@typescript-eslint/parser":"^8.18.1","eslint":"^9.17.0","eslint-plugin-n8n-nodes-base":"^1.16.3","gulp":"^5.0.0","n8n-workflow":"*","prettier":"^3.4.2","typescript":"^5.7.2"},"peerDependencies":{"n8n-workflow":"*"},"dependencies":{"@n8n/vm2":"^3.9.25","puppeteer-core":"22.6.2"},"_id":"@crunchy-bytes/n8n-nodes-puppeteer@1.5.0-crunchy.puppeteer-22","gitHead":"85b955f1ac947dc3eac5768d4e8a11c7165c3542","bugs":{"url":"https://github.com/link82/n8n-nodes-puppeteer/issues"},"_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-bK7nl1STIZOC4nvJXRD0SzUkHps4kCJtIg58MZ7TSbCZc2H1aOcwauseoclsLTX9Ww341UVaeDW3jE3uT22ZxQ==","shasum":"741d801889fa35e549fd4e74e5d6bc5f07cfdfd0","tarball":"https://registry.npmjs.org/@crunchy-bytes/n8n-nodes-puppeteer/-/n8n-nodes-puppeteer-1.5.0-crunchy.puppeteer-22.tgz","fileCount":13,"unpackedSize":184863,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCln+g6nWnFhdJVLmQIsGOFiD0qm35t1Vw0PS3FBQQ3tQIhAL1qWOLcdsHKNzOhV1j4NftYEVKQNGWTUtCoXiRYdUnU"}]},"_npmUser":{"name":"crunchy-bytes","email":"info@crunchy-bytes.com"},"directories":{},"maintainers":[{"name":"crunchy-bytes","email":"info@crunchy-bytes.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/n8n-nodes-puppeteer_1.5.0-crunchy.puppeteer-22_1770286677164_0.10243959176666695"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-04T13:39:57.510Z","modified":"2026-02-05T10:17:57.459Z","1.5.0-crunchy.1":"2026-02-04T13:39:57.778Z","1.5.0-crunchy.2":"2026-02-05T08:38:14.960Z","1.5.0-crunchy.3":"2026-02-05T08:51:12.620Z","1.5.0-crunchy.4":"2026-02-05T09:05:32.763Z","1.5.0-crunchy.puppeteer-22":"2026-02-05T10:17:57.337Z"},"bugs":{"url":"https://github.com/link82/n8n-nodes-puppeteer/issues"},"author":{"name":"Nicholas Penree","email":"nick@penree.com"},"license":"MIT","homepage":"https://github.com/link82/n8n-nodes-puppeteer","keywords":["n8n","node","puppeteer","scraper","screenshot","script","pdf","n8n-node","n8n-community-node-package"],"repository":{"type":"git","url":"git+https://github.com/link82/n8n-nodes-puppeteer.git"},"description":"n8n node for browser automation using Puppeteer","maintainers":[{"name":"crunchy-bytes","email":"info@crunchy-bytes.com"}],"readme":"# n8n-nodes-puppeteer\n\n![n8n.io - Workflow Automation](https://raw.githubusercontent.com/n8n-io/n8n/master/assets/n8n-logo.png)\n\n[n8n](https://www.n8n.io) node for browser automation using [Puppeteer](https://pptr.dev/). This node **connects only to a remote browser** (e.g. [Browserless](https://browserless.io) or any CDP/WebDriver BiDi endpoint). Execute custom scripts, capture screenshots and PDFs, scrape content, and automate web interactions. Full access to Puppeteer's API plus n8n's Code node capabilities. No local browser launch—you must set the WebSocket endpoint (per-node or via `PUPPETEER_BROWSER_WS_ENDPOINT` / `PUPPETEER_WS_ENDPOINT`).\n\n## How to install\n\n### Community Nodes (Recommended)\n\nFor n8n version 0.187 and later, you can install this node through the Community Nodes panel:\n\n1. Go to **Settings > Community Nodes**\n2. Select **Install**\n3. Enter `n8n-nodes-puppeteer` in **Enter npm package name**\n4. Agree to the [risks](https://docs.n8n.io/integrations/community-nodes/risks/) of using community nodes\n5. Select **Install**\n\n### Docker Installation (Recommended for Production)\n\nWe provide a ready-to-use Docker setup in the `docker/` directory. The image runs n8n with this node only; **the browser must be provided remotely** (e.g. [Browserless](https://browserless.io)). Set `PUPPETEER_BROWSER_WS_ENDPOINT` when running the container, or configure the endpoint in each node.\n\n1. Clone this repository\n\n2. Build your Docker image:\n```bash\nnpm run docker:build\n```\n\n3. Run the container:\n```bash\nnpm run docker:run\n```\n\nOr for testing without persistent data:\n```bash\nnpm run docker:run:fresh\n```\n\n#### Available Docker Scripts\n\n- `npm run docker:build` - Build the Docker image with Puppeteer node\n- `npm run docker:run` - Run n8n with persistent data volume\n- `npm run docker:run:fresh` - Run n8n without persistent data (clean start)\n- `npm run docker:run:external-browser` - Run with external browser connection example\n- `npm run docker:test` - Quick test to verify the image works\n- `npm run docker:shell` - Open a shell inside the container for debugging\n- `npm run docker:clean` - Remove the data volume\n- `npm run docker:clean:all` - Remove data volume and images\n\n### Manual Installation\n\nFor a standard installation without Docker:\n\n```bash\n# Navigate to your n8n root directory\ncd /path/to/n8n\n\n# Install the package\nnpm install n8n-nodes-puppeteer\n```\n\nNote: This package uses **puppeteer-core** and does not download or launch a browser. You must connect to a **remote browser** (e.g. Browserless) via WebSocket. Set the endpoint in Options or via `PUPPETEER_BROWSER_WS_ENDPOINT` / `PUPPETEER_WS_ENDPOINT`. This keeps installs small and avoids dependency issues in n8n Community Nodes.\n\n## Browser setup (remote only)\n\nThis node connects only to a remote browser. Use the \"Browser WebSocket Endpoint\" option (or the environment variables below). This approach:\n- Keeps no Chrome/browser dependencies in your n8n environment\n- Simplifies deployment and maintenance\n- Works great for cloud and containerized deployments\n- Supports Firefox via WebDriver BiDi protocol\n\nOptions include:\n- **Managed Services**: Use [browserless](https://browserless.io) or [browsercloud](https://browsercloud.io)\n- **Self-Hosted Chrome**: Run your own [browser container](https://docs.browserless.io/docker/config):\n  ```bash\n  docker run -p 3000:3000 -e \"TOKEN=6R0W53R135510\" ghcr.io/browserless/chromium\n  ```\n- **Self-Hosted Firefox**: Run Firefox with WebDriver BiDi support\n\n#### Configuring Remote Browser Connection\n\n**Per-Node Configuration:**\nIn any Puppeteer node, go to Options > Add Option:\n- Add \"Browser WebSocket Endpoint\" and enter your WebSocket URL (e.g., `ws://browserless:3000?token=6R0W53R135510`)\n- Add \"Protocol\" and select:\n  - **CDP (Chrome DevTools Protocol)** - for Chrome/Chromium (default)\n  - **WebDriver BiDi** - for Firefox\n\n**Global Configuration via Environment Variables (Recommended):**\n\nInstead of configuring each node individually, you can set environment variables:\n\n```bash\n# For Chrome/Chromium\ndocker run -it -p 5678:5678 \\\n  -e PUPPETEER_BROWSER_WS_ENDPOINT=ws://browserless:3000 \\\n  -e PUPPETEER_PROTOCOL=cdp \\\n  n8n-puppeteer\n\n# For Firefox\ndocker run -it -p 5678:5678 \\\n  -e PUPPETEER_BROWSER_WS_ENDPOINT=ws://firefox:4444 \\\n  -e PUPPETEER_PROTOCOL=webDriverBiDi \\\n  n8n-puppeteer\n```\n\nOr with Docker Compose:\n\n```yaml\nversion: '3.8'\nservices:\n  n8n:\n    image: n8n-puppeteer\n    environment:\n      - PUPPETEER_BROWSER_WS_ENDPOINT=ws://browserless:3000\n      - PUPPETEER_PROTOCOL=cdp\n    ports:\n      - \"5678:5678\"\n\n  browserless:\n    image: browserless/chrome\n    ports:\n      - \"3000:3000\"\n```\n\nWhen environment variables are set, a blue info banner will appear showing the configured endpoint. Individual nodes can still override these settings if needed.\n\n## Troubleshooting\n\nEnsure a remote browser WebSocket endpoint is set (Options or `PUPPETEER_BROWSER_WS_ENDPOINT` / `PUPPETEER_WS_ENDPOINT`). If the node reports that the endpoint is required, configure it and try again. For connection or protocol issues, see [Puppeteer's troubleshooting guide](https://pptr.dev/troubleshooting).\n\n## Node Reference\n\n- **Operations**\n\n  - Get the full HTML contents of the page\n  - Capture the contents of a page as a PDF document\n  - Capture screenshot of all or part of the page\n  - Execute custom script to interact with the page\n\n- **Options**\n\n  - All Operations\n\n    - **Batch Size**: Maximum number of pages to open simultaneously. More pages will consume more memory and CPU.\n    - **Browser WebSocket Endpoint**: (Required unless set via env.) The WebSocket URL of the remote browser to connect to (e.g. Browserless). Can also be set globally via `PUPPETEER_BROWSER_WS_ENDPOINT` or `PUPPETEER_WS_ENDPOINT`.\n    - **Protocol**: The protocol to use when connecting to the browser. Options:\n      - **CDP (Chrome DevTools Protocol)** - Default for Chrome/Chromium\n      - **WebDriver BiDi** - For Firefox and cross-browser automation\n      Can also be set globally via environment variable: `PUPPETEER_PROTOCOL`.\n    - **Emulate Device**: Allows you to specify a [device](https://github.com/puppeteer/puppeteer/blob/main/src/common/DeviceDescriptors.ts) to emulate when requesting the page.\n    - **Extra Headers**: Allows you add additional headers when requesting the page.\n    - **Timeout**: Allows you to specify the maximum navigation time in milliseconds. You can pass 0 to disable the timeout entirely.\n    - **Protocol Timeout**: Maximum time in milliseconds to wait for a protocol response. Pass 0 to disable timeout.\n    - **Wait Until**: Allows you to change how Puppeteer considers navigation completed.\n      - `load`: The load event is fired.\n      - `domcontentloaded`: The DOMContentLoaded event is fired.\n      - `networkidle0`: No more than 0 connections for at least 500 ms.\n      - `networkidle2`: No more than 2 connections for at least 500 ms.\n    - **Page Caching**: Allows you to toggle whether pages should be cached when requesting.\n    - **Capture Downloads**: When enabled, any files downloaded during script execution (via clicks, direct downloads, etc.) will be automatically captured and returned as binary data in the node output. Perfect for downloading PDFs, images, or other files triggered by user interactions. Files are automatically cleaned up after capture.\n\n  - Get PDF\n    - **File Name**: Allows you to specify the filename of the output file.\n    - **Page Ranges** field: Allows you to specify paper ranges to print, e.g. 1-5, 8, 11-13.\n    - **Scale**: Allows you to scale the rendering of the web page. Amount must be between 0.1 and 2\n    - **Prefer CSS Page Size**: Give any CSS @page size declared in the page priority over what is declared in the width or height or format option.\n    - **Format**: Allows you to specify the paper format types when printing a PDF. eg: Letter, A4.\n    - **Height**: Allows you to set the height of paper. You can pass in a number or a string with a unit.\n    - **Width**: Allows you to set the width of paper. You can pass in a number or a string with a unit.\n    - **Landscape**: Allows you to control whether to show the header and footer\n    - **Margin**: Allows you to specify top, left, right, and bottom margin.\n    - **Display Header/Footer**: Allows you to specify whether to show the header and footer.\n    - **Header Template**: Allows you to specify the HTML template for the print header. Should be valid HTML with the following classes used to inject values into them:\n      - `date`: Formatted print date\n      - `title`: Document title\n      - `url`: Document location\n      - `pageNumber` Current page number\n      - `totalPages` Total pages in the document\n    - **Footer Template**: Allows you to specify the HTML template for the print footer. Should be valid HTML with the following classes used to inject values into them:\n      - `date`: Formatted print date\n      - `title`: Document title\n      - `url`: Document location\n      - `pageNumber` Current page number\n      - `totalPages` Total pages in the document\n    - **Transparent Background**: Allows you to hide the default white background and allows generate PDFs with transparency.\n    - **Background Graphic**: Allows you to include background graphics.\n  - Get Screenshot\n    - **File Name**: Allows you to specify the filename of the output file.\n    - **Type** field: Allows you to specify the image format of the output file:\n      - JPEG\n      - PNG\n      - WebP\n    - **Quality**: Allows you to specify the quality of the image.\n      - Accepts a value between 0-100.\n      - Not applicable to PNG images.\n    - **Full Page**: Allows you to capture a screen of the full scrollable content.\n\n## Custom Scripts\n\nThe Custom Script operation gives you complete control over Puppeteer to automate complex browser interactions, scrape data, generate PDFs/screenshots, and more. Scripts run in a sandboxed environment with access to the full Puppeteer API and n8n's Code node features.\n\nBefore script execution, you can configure browser behavior using the operation's options like:\n\n- Emulate specific devices\n- Set custom headers\n- Enable stealth mode to avoid detection\n- Configure proxy settings\n- Set page load timeouts\n- And more\n\nAccess Puppeteer-specific objects using:\n\n- `$page` - Current page instance\n- `$browser` - Browser instance\n- `$puppeteer` - Puppeteer library\n- `$input.query` - Input query from AI agents (when used as a tool)\n\nPlus all special variables and methods from the Code node are available. For a complete reference, see the [n8n documentation](https://docs.n8n.io/code-examples/methods-variables-reference/). Just like n8n's Code node, anything you `console.log` will be shown in the browser's console during test mode or in stdout when configured.\n\n### AI Agent Integration\n\nWhen used as a tool by n8n AI agents, this node supports two powerful workflows:\n\n**1. AI-Generated Scripts**: AI agents can dynamically generate the entire Puppeteer script using `$fromAI()` on the Script Code parameter. The AI analyzes the task and writes the appropriate Puppeteer code to accomplish it.\n\n```javascript\n// AI agent generates script dynamically based on the task\nscriptCode: $fromAI('code', 'Generate a Puppeteer script to extract product prices from the homepage')\n```\n\n**2. Reusable Scripts with AI Input**: Write a reusable script that accepts dynamic input from AI agents via the Query parameter. Access the input using `$input.query` in your script.\n\n```javascript\n// Reusable script that processes AI-provided input\nconst url = $input.query || 'https://example.com';\nawait $page.goto(url);\n\nconst data = await $page.evaluate(() => {\n  return document.querySelector('h1').textContent;\n});\n\nreturn [{ url, title: data }];\n```\n\n```javascript\n// AI agent provides input dynamically\nquery: $fromAI('url', 'The website URL to scrape')\n```\n\nThis makes the node extremely flexible for AI-powered automation - agents can either write custom scripts for specific tasks or pass data to pre-built, reusable scripts.\n\n### Basic\n\n```javascript\n// Navigate to an IP lookup service\nawait $page.goto(\"https://httpbin.org/ip\");\n\n// Extract the IP address from the page content\nconst ipData = await $page.evaluate(() => {\n  const response = document.body.innerText;\n  const parsed = JSON.parse(response);\n  return parsed.origin; // Extract the 'origin' field, which typically contains the IP address\n});\n\nconsole.log(\"Hello, world!\");\n\nconsole.log(\"IP Address\", ipData);\n\n// Return the result in the required format (array)\nreturn [{ ip: ipData, ...$json }];\n```\n\n### Storing and re-using cookies\n\n#### Node 1\n\n```javascript\nawait $page.goto(\"https://www.example.com/login\");\n\n// Perform login\nawait $page.type(\"#login-username\", \"user\");\nawait $page.type(\"#login-password\", \"pass\");\nawait $page.click(\"#login-button\");\n\n// Store cookies for later use\nconst cookies = await $page.cookies();\n\nreturn [{ cookies }];\n```\n\n#### Node 2\n\n```javascript\nconst { cookies } = $input.first().json;\n\n// Restore cookies\nawait $page.setCookie(...cookies);\n\n// Navigate to authenticated page\nawait $page.goto(\"https://example.com/protected-page\");\n\n// Perform authenticated operations\nconst data = await $page.evaluate(() => {\n  return document.querySelector(\".protected-content\").textContent;\n});\n\nreturn [{ data }];\n```\n\n### Working with Binary Data\n\n```javascript\nawait $page.goto(\"https://www.google.com\");\nconst imageData = await $page.screenshot({ type: \"png\", encoding: \"base64\" });\nreturn [\n  {\n    binary: {\n      screenshot: {\n        data: imageData,\n        mimeType: \"image/png\",\n        fileName: \"screenshot.png\",\n      },\n    },\n  },\n];\n```\n\n### Downloading Files\n\nThe Capture Downloads option makes it easy to download files triggered by user interactions or scripts:\n\n```javascript\n// Navigate to a page with downloadable files\nawait $page.goto('https://example.com/downloads');\n\n// Click a download button - the file will be automatically captured\nawait $page.click('#download-pdf-button');\n\n// Wait a moment for the download to complete\nawait $page.waitForTimeout(2000);\n\n// Return the result - downloaded files will be attached as binary data\nreturn [{ json: { success: true } }];\n```\n\nWhen the \"Capture Downloads\" option is enabled:\n- All files downloaded during script execution are automatically captured\n- Files are returned as binary data in the node output\n- Multiple files are supported - each file gets its own binary property\n- Files are automatically cleaned up after capture\n- Works with direct downloads, click-triggered downloads, and programmatic downloads\n\nThis is particularly useful for:\n- Downloading PDFs from web applications\n- Capturing generated reports\n- Saving images or documents triggered by user actions\n- Testing download functionality in automated workflows\n\n## Environment Variables\n\nThe following environment variables configure the remote browser connection:\n\n- **`PUPPETEER_BROWSER_WS_ENDPOINT`** or **`PUPPETEER_WS_ENDPOINT`**: WebSocket URL of the remote browser to connect to (e.g. Browserless). Required unless set per-node in Options.\n- **`PUPPETEER_PROTOCOL`**: Protocol to use (`cdp` or `webDriverBiDi`). Useful for Firefox setups.\n\nExample:\n```bash\ndocker run -it -p 5678:5678 \\\n  -e PUPPETEER_BROWSER_WS_ENDPOINT=ws://browserless:3000 \\\n  -e PUPPETEER_PROTOCOL=cdp \\\n  n8n-puppeteer\n```\n\nNode-level settings always override environment variables when specified.\n\n## Firefox Support\n\nThis node supports Firefox through WebDriver BiDi protocol. To use Firefox:\n\n1. Set up a Firefox instance with WebDriver BiDi enabled\n2. Configure the connection either:\n   - **Per-node**: Options > Browser WebSocket Endpoint + Protocol (WebDriver BiDi)\n   - **Globally**: Environment variables `PUPPETEER_BROWSER_WS_ENDPOINT` + `PUPPETEER_PROTOCOL=webDriverBiDi`\n3. Execute your workflows with Firefox!\n\n## Screenshots\n\n### Run Custom Script\n\n![](images/script.png)\n\n### Get Page Content\n\n![](images/content.png)\n\n### Get Screenshot\n\n![](images/screenshot.png)\n\n## License\n\nMIT License\n\nCopyright (c) 2022-2026 Nicholas Penree <nick@penree.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","readmeFilename":"README.md"}