n8n-nodes-snaprender 0.1.0

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/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # n8n-nodes-snaprender
2
+
3
+ [n8n](https://n8n.io) community node for [SnapRender Screenshot API](https://snap-render.com). Capture website screenshots as PNG, JPEG, WebP, or PDF directly in your n8n workflows.
4
+
5
+ ## Install
6
+
7
+ In your n8n instance:
8
+
9
+ 1. Go to **Settings** > **Community Nodes**
10
+ 2. Enter `n8n-nodes-snaprender`
11
+ 3. Click **Install**
12
+
13
+ ## Credentials
14
+
15
+ 1. Sign up at [app.snap-render.com](https://app.snap-render.com/auth/signup) — free, no credit card
16
+ 2. Create an API key in your dashboard
17
+ 3. In n8n, go to **Credentials** > **New** > **SnapRender API**
18
+ 4. Paste your API key (starts with `sk_live_`)
19
+
20
+ ## Operations
21
+
22
+ ### Take Screenshot
23
+
24
+ Capture any website as PNG, JPEG, WebP, or PDF.
25
+
26
+ - **URL** — Website to capture
27
+ - **Format** — PNG, JPEG, WebP, or PDF
28
+ - **Full Page** — Capture entire scrollable page
29
+ - **Device** — iPhone 14, iPhone 15 Pro, Pixel 7, iPad Pro, MacBook Pro
30
+ - **Dark Mode** — Enable dark mode CSS emulation
31
+ - **Block Ads** — Remove advertisements
32
+ - **Block Cookie Banners** — Remove cookie consent popups
33
+ - **Output** — Binary (image file) or JSON (base64 data URI)
34
+ - **Additional Options** — Width, height, quality, delay, hide selectors, click selector
35
+
36
+ ### Check Cache
37
+
38
+ Check if a screenshot is cached without capturing. Free, doesn't count against quota.
39
+
40
+ ### Get Usage
41
+
42
+ Get current month's screenshot usage statistics.
43
+
44
+ ## Example Workflow
45
+
46
+ 1. **Trigger** (e.g., webhook, schedule, form)
47
+ 2. **SnapRender** node — Take Screenshot with URL from trigger
48
+ 3. **Send Email** / **Save to S3** / **Slack** — Use the binary output
49
+
50
+ ## Free Tier
51
+
52
+ 50 screenshots/month, no credit card required. Paid plans up to 10,000/month.
53
+
54
+ ## Links
55
+
56
+ - [SnapRender Website](https://snap-render.com)
57
+ - [API Documentation](https://app.snap-render.com/docs)
58
+ - [GitHub](https://github.com/User0856/snaprender-integrations/tree/main/n8n)
59
+
60
+ ## License
61
+
62
+ MIT
@@ -0,0 +1,9 @@
1
+ import type { IAuthenticateGeneric, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
2
+ export declare class SnapRenderApi implements ICredentialType {
3
+ name: string;
4
+ displayName: string;
5
+ documentationUrl: string;
6
+ properties: INodeProperties[];
7
+ authenticate: IAuthenticateGeneric;
8
+ test: ICredentialTestRequest;
9
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SnapRenderApi = void 0;
4
+ class SnapRenderApi {
5
+ constructor() {
6
+ this.name = 'snapRenderApi';
7
+ this.displayName = 'SnapRender API';
8
+ this.documentationUrl = 'https://snap-render.com';
9
+ this.properties = [
10
+ {
11
+ displayName: 'API Key',
12
+ name: 'apiKey',
13
+ type: 'string',
14
+ typeOptions: { password: true },
15
+ default: '',
16
+ placeholder: 'sk_live_...',
17
+ description: 'Your SnapRender API key. Get a free key at https://app.snap-render.com/auth/signup',
18
+ },
19
+ ];
20
+ this.authenticate = {
21
+ type: 'generic',
22
+ properties: {
23
+ headers: {
24
+ 'X-API-Key': '={{$credentials.apiKey}}',
25
+ },
26
+ },
27
+ };
28
+ this.test = {
29
+ request: {
30
+ baseURL: 'https://app.snap-render.com',
31
+ url: '/v1/usage',
32
+ method: 'GET',
33
+ },
34
+ };
35
+ }
36
+ }
37
+ exports.SnapRenderApi = SnapRenderApi;
38
+ //# sourceMappingURL=SnapRenderApi.credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SnapRenderApi.credentials.js","sourceRoot":"","sources":["../../credentials/SnapRenderApi.credentials.ts"],"names":[],"mappings":";;;AAOA,MAAa,aAAa;IAA1B;QACC,SAAI,GAAG,eAAe,CAAC;QACvB,gBAAW,GAAG,gBAAgB,CAAC;QAC/B,qBAAgB,GAAG,yBAAyB,CAAC;QAE7C,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,SAAS;gBACtB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,aAAa;gBAC1B,WAAW,EACV,oFAAoF;aACrF;SACD,CAAC;QAEF,iBAAY,GAAyB;YACpC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACX,OAAO,EAAE;oBACR,WAAW,EAAE,0BAA0B;iBACvC;aACD;SACD,CAAC;QAEF,SAAI,GAA2B;YAC9B,OAAO,EAAE;gBACR,OAAO,EAAE,6BAA6B;gBACtC,GAAG,EAAE,WAAW;gBAChB,MAAM,EAAE,KAAK;aACb;SACD,CAAC;IACH,CAAC;CAAA;AAlCD,sCAkCC"}
@@ -0,0 +1,5 @@
1
+ import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
+ export declare class SnapRender implements INodeType {
3
+ description: INodeTypeDescription;
4
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
5
+ }
@@ -0,0 +1,309 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SnapRender = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ class SnapRender {
6
+ constructor() {
7
+ this.description = {
8
+ displayName: 'SnapRender',
9
+ name: 'snapRender',
10
+ icon: 'file:snaprender.svg',
11
+ group: ['transform'],
12
+ version: 1,
13
+ subtitle: '={{$parameter["operation"]}}',
14
+ description: 'Capture website screenshots as PNG, JPEG, WebP, or PDF',
15
+ defaults: { name: 'SnapRender' },
16
+ inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
17
+ outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
18
+ usableAsTool: true,
19
+ credentials: [
20
+ {
21
+ name: 'snapRenderApi',
22
+ required: true,
23
+ },
24
+ ],
25
+ requestDefaults: {
26
+ baseURL: 'https://app.snap-render.com',
27
+ },
28
+ properties: [
29
+ {
30
+ displayName: 'Operation',
31
+ name: 'operation',
32
+ type: 'options',
33
+ noDataExpression: true,
34
+ options: [
35
+ {
36
+ name: 'Take Screenshot',
37
+ value: 'screenshot',
38
+ description: 'Capture a screenshot of a website',
39
+ action: 'Capture a screenshot of a website',
40
+ },
41
+ {
42
+ name: 'Check Cache',
43
+ value: 'checkCache',
44
+ description: 'Check if a screenshot is cached (free, no quota cost)',
45
+ action: 'Check if a screenshot is cached',
46
+ },
47
+ {
48
+ name: 'Get Usage',
49
+ value: 'getUsage',
50
+ description: 'Get current month screenshot usage statistics',
51
+ action: 'Get usage statistics',
52
+ },
53
+ ],
54
+ default: 'screenshot',
55
+ },
56
+ {
57
+ displayName: 'URL',
58
+ name: 'url',
59
+ type: 'string',
60
+ default: '',
61
+ required: true,
62
+ placeholder: 'https://example.com',
63
+ description: 'URL of the website to capture',
64
+ displayOptions: {
65
+ show: { operation: ['screenshot', 'checkCache'] },
66
+ },
67
+ },
68
+ {
69
+ displayName: 'Format',
70
+ name: 'format',
71
+ type: 'options',
72
+ options: [
73
+ { name: 'PNG', value: 'png' },
74
+ { name: 'JPEG', value: 'jpeg' },
75
+ { name: 'WebP', value: 'webp' },
76
+ { name: 'PDF', value: 'pdf' },
77
+ ],
78
+ default: 'png',
79
+ description: 'Output image format',
80
+ displayOptions: {
81
+ show: { operation: ['screenshot', 'checkCache'] },
82
+ },
83
+ },
84
+ {
85
+ displayName: 'Full Page',
86
+ name: 'fullPage',
87
+ type: 'boolean',
88
+ default: false,
89
+ description: 'Whether to capture the entire scrollable page',
90
+ displayOptions: { show: { operation: ['screenshot'] } },
91
+ },
92
+ {
93
+ displayName: 'Device',
94
+ name: 'device',
95
+ type: 'options',
96
+ options: [
97
+ { name: 'Desktop (Default)', value: '' },
98
+ { name: 'iPhone 14', value: 'iphone_14' },
99
+ { name: 'iPhone 15 Pro', value: 'iphone_15_pro' },
100
+ { name: 'Pixel 7', value: 'pixel_7' },
101
+ { name: 'iPad Pro', value: 'ipad_pro' },
102
+ { name: 'MacBook Pro', value: 'macbook_pro' },
103
+ ],
104
+ default: '',
105
+ description: 'Device preset for viewport emulation',
106
+ displayOptions: { show: { operation: ['screenshot'] } },
107
+ },
108
+ {
109
+ displayName: 'Dark Mode',
110
+ name: 'darkMode',
111
+ type: 'boolean',
112
+ default: false,
113
+ description: 'Whether to enable dark mode CSS emulation',
114
+ displayOptions: { show: { operation: ['screenshot'] } },
115
+ },
116
+ {
117
+ displayName: 'Block Ads',
118
+ name: 'blockAds',
119
+ type: 'boolean',
120
+ default: true,
121
+ description: 'Whether to block advertisements and trackers',
122
+ displayOptions: { show: { operation: ['screenshot'] } },
123
+ },
124
+ {
125
+ displayName: 'Block Cookie Banners',
126
+ name: 'blockCookieBanners',
127
+ type: 'boolean',
128
+ default: true,
129
+ description: 'Whether to remove cookie consent banners',
130
+ displayOptions: { show: { operation: ['screenshot'] } },
131
+ },
132
+ {
133
+ displayName: 'Additional Options',
134
+ name: 'additionalOptions',
135
+ type: 'collection',
136
+ placeholder: 'Add Option',
137
+ default: {},
138
+ displayOptions: { show: { operation: ['screenshot'] } },
139
+ options: [
140
+ {
141
+ displayName: 'Width',
142
+ name: 'width',
143
+ type: 'number',
144
+ default: 1280,
145
+ description: 'Viewport width in pixels (320-3840)',
146
+ typeOptions: { minValue: 320, maxValue: 3840 },
147
+ },
148
+ {
149
+ displayName: 'Height',
150
+ name: 'height',
151
+ type: 'number',
152
+ default: 800,
153
+ description: 'Viewport height in pixels (200-10000)',
154
+ typeOptions: { minValue: 200, maxValue: 10000 },
155
+ },
156
+ {
157
+ displayName: 'Quality',
158
+ name: 'quality',
159
+ type: 'number',
160
+ default: 90,
161
+ description: 'Image quality for JPEG/WebP (1-100)',
162
+ typeOptions: { minValue: 1, maxValue: 100 },
163
+ },
164
+ {
165
+ displayName: 'Delay',
166
+ name: 'delay',
167
+ type: 'number',
168
+ default: 0,
169
+ description: 'Milliseconds to wait after page load (0-10000)',
170
+ typeOptions: { minValue: 0, maxValue: 10000 },
171
+ },
172
+ {
173
+ displayName: 'Hide Selectors',
174
+ name: 'hideSelectors',
175
+ type: 'string',
176
+ default: '',
177
+ description: 'Comma-separated CSS selectors to hide before capture',
178
+ },
179
+ {
180
+ displayName: 'Click Selector',
181
+ name: 'clickSelector',
182
+ type: 'string',
183
+ default: '',
184
+ description: 'CSS selector to click before capture',
185
+ },
186
+ ],
187
+ },
188
+ {
189
+ displayName: 'Output',
190
+ name: 'output',
191
+ type: 'options',
192
+ options: [
193
+ { name: 'Binary (Image File)', value: 'binary' },
194
+ { name: 'JSON (Base64 Data URI)', value: 'json' },
195
+ ],
196
+ default: 'binary',
197
+ description: 'How to return the screenshot',
198
+ displayOptions: { show: { operation: ['screenshot'] } },
199
+ },
200
+ ],
201
+ };
202
+ }
203
+ async execute() {
204
+ const items = this.getInputData();
205
+ const returnData = [];
206
+ for (let i = 0; i < items.length; i++) {
207
+ try {
208
+ const operation = this.getNodeParameter('operation', i);
209
+ if (operation === 'getUsage') {
210
+ const response = await this.helpers.httpRequestWithAuthentication.call(this, 'snapRenderApi', {
211
+ method: 'GET',
212
+ url: 'https://app.snap-render.com/v1/usage',
213
+ json: true,
214
+ });
215
+ returnData.push({ json: response });
216
+ }
217
+ else if (operation === 'checkCache') {
218
+ const url = this.getNodeParameter('url', i);
219
+ const format = this.getNodeParameter('format', i);
220
+ const response = await this.helpers.httpRequestWithAuthentication.call(this, 'snapRenderApi', {
221
+ method: 'GET',
222
+ url: 'https://app.snap-render.com/v1/screenshot/info',
223
+ qs: { url, format },
224
+ json: true,
225
+ });
226
+ returnData.push({ json: response });
227
+ }
228
+ else if (operation === 'screenshot') {
229
+ const url = this.getNodeParameter('url', i);
230
+ const format = this.getNodeParameter('format', i);
231
+ const fullPage = this.getNodeParameter('fullPage', i);
232
+ const device = this.getNodeParameter('device', i);
233
+ const darkMode = this.getNodeParameter('darkMode', i);
234
+ const blockAds = this.getNodeParameter('blockAds', i);
235
+ const blockCookieBanners = this.getNodeParameter('blockCookieBanners', i);
236
+ const output = this.getNodeParameter('output', i);
237
+ const additionalOptions = this.getNodeParameter('additionalOptions', i);
238
+ const qs = {
239
+ url,
240
+ format,
241
+ full_page: fullPage,
242
+ dark_mode: darkMode,
243
+ block_ads: blockAds,
244
+ block_cookie_banners: blockCookieBanners,
245
+ };
246
+ if (device)
247
+ qs.device = device;
248
+ if (additionalOptions.width)
249
+ qs.width = additionalOptions.width;
250
+ if (additionalOptions.height)
251
+ qs.height = additionalOptions.height;
252
+ if (additionalOptions.quality)
253
+ qs.quality = additionalOptions.quality;
254
+ if (additionalOptions.delay)
255
+ qs.delay = additionalOptions.delay;
256
+ if (additionalOptions.hideSelectors)
257
+ qs.hide_selectors = additionalOptions.hideSelectors;
258
+ if (additionalOptions.clickSelector)
259
+ qs.click_selector = additionalOptions.clickSelector;
260
+ if (output === 'json') {
261
+ qs.response_type = 'json';
262
+ const response = await this.helpers.httpRequestWithAuthentication.call(this, 'snapRenderApi', {
263
+ method: 'GET',
264
+ url: 'https://app.snap-render.com/v1/screenshot',
265
+ qs,
266
+ json: true,
267
+ });
268
+ returnData.push({ json: response });
269
+ }
270
+ else {
271
+ const response = await this.helpers.httpRequestWithAuthentication.call(this, 'snapRenderApi', {
272
+ method: 'GET',
273
+ url: 'https://app.snap-render.com/v1/screenshot',
274
+ qs,
275
+ encoding: 'arraybuffer',
276
+ returnFullResponse: true,
277
+ });
278
+ const mimeTypes = {
279
+ png: 'image/png',
280
+ jpeg: 'image/jpeg',
281
+ webp: 'image/webp',
282
+ pdf: 'application/pdf',
283
+ };
284
+ const binaryData = await this.helpers.prepareBinaryData(Buffer.from(response.body), `screenshot.${format === 'jpeg' ? 'jpg' : format}`, mimeTypes[format] || 'image/png');
285
+ returnData.push({
286
+ json: {
287
+ url,
288
+ format,
289
+ success: true,
290
+ },
291
+ binary: { data: binaryData },
292
+ });
293
+ }
294
+ }
295
+ }
296
+ catch (error) {
297
+ if (this.continueOnFail()) {
298
+ returnData.push({ json: { error: error.message } });
299
+ }
300
+ else {
301
+ throw error;
302
+ }
303
+ }
304
+ }
305
+ return [returnData];
306
+ }
307
+ }
308
+ exports.SnapRender = SnapRender;
309
+ //# sourceMappingURL=SnapRender.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SnapRender.node.js","sourceRoot":"","sources":["../../../nodes/SnapRender/SnapRender.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "n8n-nodes-snaprender",
3
+ "version": "0.1.0",
4
+ "description": "n8n node to capture website screenshots using SnapRender API. PNG, JPEG, WebP, PDF with device emulation, dark mode, ad blocking.",
5
+ "license": "MIT",
6
+ "homepage": "https://snap-render.com",
7
+ "keywords": [
8
+ "n8n-community-node-package",
9
+ "n8n",
10
+ "screenshot",
11
+ "web-capture",
12
+ "snaprender"
13
+ ],
14
+ "author": {
15
+ "name": "SnapRender",
16
+ "email": "support@snap-render.com"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/User0856/snaprender-integrations.git",
21
+ "directory": "n8n"
22
+ },
23
+ "engines": {
24
+ "node": ">=20.15"
25
+ },
26
+ "main": "index.js",
27
+ "scripts": {
28
+ "build": "tsc",
29
+ "dev": "tsc --watch",
30
+ "prepublishOnly": "npm run build"
31
+ },
32
+ "files": [
33
+ "dist"
34
+ ],
35
+ "n8n": {
36
+ "n8nNodesApiVersion": 1,
37
+ "credentials": [
38
+ "dist/credentials/SnapRenderApi.credentials.js"
39
+ ],
40
+ "nodes": [
41
+ "dist/nodes/SnapRender/SnapRender.node.js"
42
+ ]
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^25.3.0",
46
+ "n8n-workflow": "^2.9.0",
47
+ "typescript": "^5.8.0"
48
+ },
49
+ "peerDependencies": {
50
+ "n8n-workflow": "*"
51
+ }
52
+ }
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "n8n-nodes-snaprender",
3
+ "version": "0.1.0",
4
+ "description": "n8n node to capture website screenshots using SnapRender API. PNG, JPEG, WebP, PDF with device emulation, dark mode, ad blocking.",
5
+ "license": "MIT",
6
+ "homepage": "https://snap-render.com",
7
+ "keywords": [
8
+ "n8n-community-node-package",
9
+ "n8n",
10
+ "screenshot",
11
+ "web-capture",
12
+ "snaprender"
13
+ ],
14
+ "author": {
15
+ "name": "SnapRender",
16
+ "email": "support@snap-render.com"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/User0856/snaprender-integrations.git",
21
+ "directory": "n8n"
22
+ },
23
+ "engines": {
24
+ "node": ">=20.15"
25
+ },
26
+ "main": "index.js",
27
+ "scripts": {
28
+ "build": "tsc",
29
+ "dev": "tsc --watch",
30
+ "prepublishOnly": "npm run build"
31
+ },
32
+ "files": [
33
+ "dist"
34
+ ],
35
+ "n8n": {
36
+ "n8nNodesApiVersion": 1,
37
+ "credentials": [
38
+ "dist/credentials/SnapRenderApi.credentials.js"
39
+ ],
40
+ "nodes": [
41
+ "dist/nodes/SnapRender/SnapRender.node.js"
42
+ ]
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^25.3.0",
46
+ "n8n-workflow": "^2.9.0",
47
+ "typescript": "^5.8.0"
48
+ },
49
+ "peerDependencies": {
50
+ "n8n-workflow": "*"
51
+ }
52
+ }