n8n-nodes-rendex 1.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Copperline Labs LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,142 @@
1
+ # n8n-nodes-rendex
2
+
3
+ > n8n community node for [Rendex](https://rendex.dev) — capture screenshots, generate PDFs, and render HTML to images via the Rendex rendering API.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/n8n-nodes-rendex)](https://www.npmjs.com/package/n8n-nodes-rendex)
6
+ [![license](https://img.shields.io/npm/l/n8n-nodes-rendex)](LICENSE)
7
+
8
+ This is a community node for [n8n](https://n8n.io), the fair-code workflow automation platform. It lets your workflows talk to [api.rendex.dev](https://api.rendex.dev) to render web pages and raw HTML into high-quality PNG, JPEG, WebP, or PDF output.
9
+
10
+ ---
11
+
12
+ ## Features
13
+
14
+ - **Capture screenshots** of live URLs or raw HTML (up to 5 MB of HTML)
15
+ - **Generate PDFs** with configurable page size, margins, landscape, and scale
16
+ - **Async mode** — submit a capture and receive an HMAC-signed webhook when it's done
17
+ - **Batch mode** — submit up to 500 URLs in a single request (plan-dependent)
18
+ - **Geo-targeted captures** — render pages as seen from a specific country, city, or state *(Pro/Enterprise)*
19
+ - **Element capture** — screenshot a specific CSS selector instead of the full page
20
+ - **Ad blocking**, resource blocking, CSS/JS injection, cookie injection, custom headers, dark mode emulation, full-page auto-scroll
21
+
22
+ Rendex is built on Cloudflare Workers with Browser Rendering and backs a live v1.0.0 production API. See [rendex.dev/docs](https://rendex.dev/docs) for full API documentation.
23
+
24
+ ---
25
+
26
+ ## Installation
27
+
28
+ ### n8n Cloud & self-hosted
29
+
30
+ 1. Open your n8n instance → **Settings → Community Nodes**
31
+ 2. Click **Install** and paste: `n8n-nodes-rendex`
32
+ 3. Accept the community-node warning and click **Install**
33
+ 4. Once installed, add a **Rendex** node to any workflow
34
+
35
+ ### Manual (npm)
36
+
37
+ ```bash
38
+ npm install n8n-nodes-rendex
39
+ ```
40
+
41
+ ---
42
+
43
+ ## Authentication
44
+
45
+ 1. Sign in to [rendex.dev/dashboard](https://rendex.dev/dashboard) (free plan available)
46
+ 2. Go to **API Keys** and click **Create Key**
47
+ 3. Copy the key — it starts with `rdx_`
48
+ 4. In n8n, create a new **Rendex API** credential and paste the key into the **API Key** field
49
+
50
+ Rendex keys are bearer tokens sent as `Authorization: Bearer rdx_...`. The node handles the header automatically.
51
+
52
+ ---
53
+
54
+ ## Operations
55
+
56
+ ### Screenshot
57
+
58
+ | Operation | What it does |
59
+ |---|---|
60
+ | **Capture** | Sync request that returns an image or PDF. Output is written to the node's binary property (default `data`) plus a JSON metadata object. |
61
+ | **Capture Async** | Submits a job and returns immediately with a `jobId`. Optional `webhookUrl` is called with an HMAC-signed payload when the capture completes. |
62
+
63
+ ### Job
64
+
65
+ | Operation | What it does |
66
+ |---|---|
67
+ | **Get Status** | Polls an async job by `jobId` and returns its current status + signed result URL once ready. |
68
+
69
+ ### Batch
70
+
71
+ | Operation | What it does |
72
+ |---|---|
73
+ | **Submit** | Submits up to 500 URLs for parallel capture. Accepts per-URL defaults and an optional completion webhook. |
74
+ | **Get Status** | Polls a batch by `batchId` and returns status + all child job results. |
75
+
76
+ ---
77
+
78
+ ## Example: sync capture
79
+
80
+ 1. Add a **Rendex** node after any trigger
81
+ 2. Set **Resource** = `Screenshot`, **Operation** = `Capture`
82
+ 3. Set **Source** = `URL` and enter `https://example.com`
83
+ 4. Leave **Format** = `png`
84
+ 5. Click **Execute Node** — the output tab shows the metadata JSON and the binary `data` property holds the PNG. Wire it into **Write Binary File**, **Upload to S3**, **HTTP Request** (to forward it), or any other binary-capable node.
85
+
86
+ ## Example: async + webhook trigger
87
+
88
+ 1. Add a **Rendex** node, set **Operation** = `Capture Async`
89
+ 2. Paste a webhook URL in the **Webhook URL** field (use another workflow's **Webhook** node production URL)
90
+ 3. Execute. The first workflow returns immediately with the `jobId`.
91
+ 4. In the receiving workflow, verify the HMAC signature on the `rendex-signature` header, then download the signed result URL from the payload.
92
+
93
+ ## Example: batch of URLs
94
+
95
+ 1. Add a **Rendex** node, set **Resource** = `Batch`, **Operation** = `Submit`
96
+ 2. Paste one URL per line in the **URLs** field
97
+ 3. Fill **Defaults (JSON)** with shared options, e.g. `{"format":"png","fullPage":true}`
98
+ 4. Execute — you get back a `batchId` and the list of queued jobs
99
+ 5. Wire a **Schedule Trigger** or **Wait** node to another **Rendex** node with **Resource** = `Batch`, **Operation** = `Get Status` to poll completion.
100
+
101
+ ---
102
+
103
+ ## Plan limits
104
+
105
+ | Limit | Free | Starter | Pro | Enterprise |
106
+ |---|---|---|---|---|
107
+ | Rate limit (req/min) | 10 | 60 | 300 | 1000 |
108
+ | Batch size | 5 | 25 | 100 | 500 |
109
+ | Concurrent async jobs | 10 | 50 | 200 | 1000 |
110
+ | Geo-targeting | — | — | ✓ | ✓ |
111
+
112
+ See [rendex.dev/pricing](https://rendex.dev/pricing) for current pricing.
113
+
114
+ ---
115
+
116
+ ## Advanced options
117
+
118
+ The **Capture** and **Capture Async** operations expose an **Additional Options** collection with the full Rendex v1.0.0 parameter surface:
119
+
120
+ - **Viewport**: Width, Height, Device Scale Factor, Full Page, Dark Mode
121
+ - **Output**: Quality (for JPEG/WebP)
122
+ - **Wait strategy**: Wait Until, Timeout, Delay, Wait For Selector, Best Attempt
123
+ - **Element capture**: Element Selector
124
+ - **Blocking**: Block Ads, Block Resource Types
125
+ - **Injection**: Custom CSS, Custom JavaScript, Custom Headers (JSON), Cookies (JSON), User Agent
126
+ - **PDF**: PDF Page Format, PDF Landscape, PDF Print Background, PDF Scale, PDF Margins (JSON)
127
+ - **Geo-targeting**: Geo Country, Geo City, Geo State *(Pro/Enterprise)*
128
+ - **Async**: Cache TTL
129
+
130
+ Everything maps 1:1 to the [REST API parameters](https://rendex.dev/docs/api-reference).
131
+
132
+ ---
133
+
134
+ ## Support
135
+
136
+ - **Docs**: [rendex.dev/docs](https://rendex.dev/docs)
137
+ - **Issues**: [github.com/copperline-labs/rendex-n8n/issues](https://github.com/copperline-labs/rendex-n8n/issues)
138
+ - **Email**: [support@rendex.dev](mailto:support@rendex.dev)
139
+
140
+ ## License
141
+
142
+ MIT © Copperline Labs LLC
@@ -0,0 +1,10 @@
1
+ import type { IAuthenticateGeneric, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
2
+ export declare class RendexApi implements ICredentialType {
3
+ name: string;
4
+ displayName: string;
5
+ documentationUrl: string;
6
+ icon: "file:rendex.svg";
7
+ properties: INodeProperties[];
8
+ authenticate: IAuthenticateGeneric;
9
+ test: ICredentialTestRequest;
10
+ }
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RendexApi = void 0;
4
+ class RendexApi {
5
+ constructor() {
6
+ this.name = 'rendexApi';
7
+ this.displayName = 'Rendex API';
8
+ this.documentationUrl = 'https://rendex.dev/docs/authentication';
9
+ this.icon = 'file:rendex.svg';
10
+ this.properties = [
11
+ {
12
+ displayName: 'API Key',
13
+ name: 'apiKey',
14
+ type: 'string',
15
+ typeOptions: { password: true },
16
+ default: '',
17
+ required: true,
18
+ description: 'Your Rendex API key. Create one at <a href="https://rendex.dev/dashboard/keys" target="_blank">rendex.dev/dashboard/keys</a>. Starts with <code>rdx_</code>.',
19
+ placeholder: 'rdx_...',
20
+ },
21
+ {
22
+ displayName: 'Base URL',
23
+ name: 'baseUrl',
24
+ type: 'string',
25
+ default: 'https://api.rendex.dev',
26
+ description: 'Override the Rendex API base URL. Leave as default unless self-hosting.',
27
+ },
28
+ ];
29
+ this.authenticate = {
30
+ type: 'generic',
31
+ properties: {
32
+ headers: {
33
+ Authorization: '=Bearer {{$credentials.apiKey}}',
34
+ },
35
+ },
36
+ };
37
+ this.test = {
38
+ request: {
39
+ baseURL: '={{$credentials.baseUrl}}',
40
+ url: '/v1/jobs/credential-check',
41
+ method: 'GET',
42
+ },
43
+ rules: [
44
+ {
45
+ type: 'responseCode',
46
+ properties: {
47
+ value: 401,
48
+ message: 'Invalid API key — check your key at rendex.dev/dashboard/keys',
49
+ },
50
+ },
51
+ {
52
+ type: 'responseCode',
53
+ properties: {
54
+ value: 403,
55
+ message: 'API key is disabled or revoked',
56
+ },
57
+ },
58
+ ],
59
+ };
60
+ }
61
+ }
62
+ exports.RendexApi = RendexApi;
63
+ //# sourceMappingURL=RendexApi.credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RendexApi.credentials.js","sourceRoot":"","sources":["../../credentials/RendexApi.credentials.ts"],"names":[],"mappings":";;;AAOA,MAAa,SAAS;IAAtB;QACC,SAAI,GAAG,WAAW,CAAC;QAEnB,gBAAW,GAAG,YAAY,CAAC;QAE3B,qBAAgB,GAAG,wCAAwC,CAAC;QAE5D,SAAI,GAAG,iBAA0B,CAAC;QAElC,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,QAAQ,EAAE,IAAI;gBACd,WAAW,EACV,8JAA8J;gBAC/J,WAAW,EAAE,SAAS;aACtB;YACD;gBACC,WAAW,EAAE,UAAU;gBACvB,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,wBAAwB;gBACjC,WAAW,EAAE,yEAAyE;aACtF;SACD,CAAC;QAEF,iBAAY,GAAyB;YACpC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACX,OAAO,EAAE;oBACR,aAAa,EAAE,iCAAiC;iBAChD;aACD;SACD,CAAC;QAEF,SAAI,GAA2B;YAC9B,OAAO,EAAE;gBACR,OAAO,EAAE,2BAA2B;gBACpC,GAAG,EAAE,2BAA2B;gBAChC,MAAM,EAAE,KAAK;aACb;YACD,KAAK,EAAE;gBACN;oBACC,IAAI,EAAE,cAAc;oBACpB,UAAU,EAAE;wBACX,KAAK,EAAE,GAAG;wBACV,OAAO,EAAE,+DAA+D;qBACxE;iBACD;gBACD;oBACC,IAAI,EAAE,cAAc;oBACpB,UAAU,EAAE;wBACX,KAAK,EAAE,GAAG;wBACV,OAAO,EAAE,gCAAgC;qBACzC;iBACD;aACD;SACD,CAAC;IACH,CAAC;CAAA;AA9DD,8BA8DC"}
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
2
+ <rect width="32" height="32" rx="6" fill="#0c0a09"/>
3
+ <defs>
4
+ <linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
5
+ <stop offset="0%" stop-color="#EA580C"/>
6
+ <stop offset="100%" stop-color="#06B6D4"/>
7
+ </linearGradient>
8
+ </defs>
9
+ <text x="16" y="24" text-anchor="middle" fill="url(#g)" font-size="24" font-weight="800" font-family="system-ui, -apple-system, sans-serif">R</text>
10
+ </svg>
@@ -0,0 +1,5 @@
1
+ import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
+ export declare class Rendex implements INodeType {
3
+ description: INodeTypeDescription;
4
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
5
+ }
@@ -0,0 +1,708 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Rendex = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ class Rendex {
6
+ constructor() {
7
+ this.description = {
8
+ displayName: 'Rendex',
9
+ name: 'rendex',
10
+ icon: 'file:rendex.svg',
11
+ group: ['transform'],
12
+ version: 1,
13
+ subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
14
+ description: 'Capture screenshots, generate PDFs, and render HTML via Rendex',
15
+ defaults: {
16
+ name: 'Rendex',
17
+ },
18
+ inputs: ['main'],
19
+ outputs: ['main'],
20
+ usableAsTool: true,
21
+ credentials: [
22
+ {
23
+ name: 'rendexApi',
24
+ required: true,
25
+ },
26
+ ],
27
+ requestDefaults: {
28
+ baseURL: '={{$credentials.baseUrl}}',
29
+ headers: {
30
+ Accept: 'application/json',
31
+ 'Content-Type': 'application/json',
32
+ },
33
+ },
34
+ properties: [
35
+ {
36
+ displayName: 'Resource',
37
+ name: 'resource',
38
+ type: 'options',
39
+ noDataExpression: true,
40
+ options: [
41
+ { name: 'Screenshot', value: 'screenshot' },
42
+ { name: 'Job', value: 'job' },
43
+ { name: 'Batch', value: 'batch' },
44
+ ],
45
+ default: 'screenshot',
46
+ },
47
+ {
48
+ displayName: 'Operation',
49
+ name: 'operation',
50
+ type: 'options',
51
+ noDataExpression: true,
52
+ displayOptions: { show: { resource: ['screenshot'] } },
53
+ options: [
54
+ {
55
+ name: 'Capture',
56
+ value: 'capture',
57
+ description: 'Capture a screenshot or PDF synchronously and return the result',
58
+ action: 'Capture a screenshot or PDF',
59
+ },
60
+ {
61
+ name: 'Capture Async',
62
+ value: 'captureAsync',
63
+ description: 'Submit a capture job and return immediately with a job ID',
64
+ action: 'Submit an async capture job',
65
+ },
66
+ ],
67
+ default: 'capture',
68
+ },
69
+ {
70
+ displayName: 'Operation',
71
+ name: 'operation',
72
+ type: 'options',
73
+ noDataExpression: true,
74
+ displayOptions: { show: { resource: ['job'] } },
75
+ options: [
76
+ {
77
+ name: 'Get Status',
78
+ value: 'getStatus',
79
+ description: 'Poll the status of an async job',
80
+ action: 'Get job status',
81
+ },
82
+ ],
83
+ default: 'getStatus',
84
+ },
85
+ {
86
+ displayName: 'Operation',
87
+ name: 'operation',
88
+ type: 'options',
89
+ noDataExpression: true,
90
+ displayOptions: { show: { resource: ['batch'] } },
91
+ options: [
92
+ {
93
+ name: 'Submit',
94
+ value: 'submit',
95
+ description: 'Submit a batch of URLs for capture (up to 500 per plan limit)',
96
+ action: 'Submit a batch',
97
+ },
98
+ {
99
+ name: 'Get Status',
100
+ value: 'getStatus',
101
+ description: 'Poll the status of a batch and its jobs',
102
+ action: 'Get batch status',
103
+ },
104
+ ],
105
+ default: 'submit',
106
+ },
107
+ {
108
+ displayName: 'Source',
109
+ name: 'source',
110
+ type: 'options',
111
+ displayOptions: { show: { resource: ['screenshot'] } },
112
+ options: [
113
+ { name: 'URL', value: 'url' },
114
+ { name: 'HTML', value: 'html' },
115
+ ],
116
+ default: 'url',
117
+ description: 'Whether to capture a live URL or render raw HTML',
118
+ },
119
+ {
120
+ displayName: 'URL',
121
+ name: 'url',
122
+ type: 'string',
123
+ required: true,
124
+ default: '',
125
+ placeholder: 'https://example.com',
126
+ displayOptions: {
127
+ show: {
128
+ resource: ['screenshot'],
129
+ source: ['url'],
130
+ },
131
+ },
132
+ description: 'The URL to capture',
133
+ },
134
+ {
135
+ displayName: 'HTML',
136
+ name: 'html',
137
+ type: 'string',
138
+ typeOptions: {
139
+ rows: 6,
140
+ },
141
+ required: true,
142
+ default: '',
143
+ displayOptions: {
144
+ show: {
145
+ resource: ['screenshot'],
146
+ source: ['html'],
147
+ },
148
+ },
149
+ description: 'Raw HTML to render (max 5 MB)',
150
+ },
151
+ {
152
+ displayName: 'Format',
153
+ name: 'format',
154
+ type: 'options',
155
+ displayOptions: { show: { resource: ['screenshot'] } },
156
+ options: [
157
+ { name: 'PNG', value: 'png' },
158
+ { name: 'JPEG', value: 'jpeg' },
159
+ { name: 'WebP', value: 'webp' },
160
+ { name: 'PDF', value: 'pdf' },
161
+ ],
162
+ default: 'png',
163
+ description: 'Output format. PDF ignores image-specific options and uses PDF options instead.',
164
+ },
165
+ {
166
+ displayName: 'Binary Property',
167
+ name: 'binaryPropertyName',
168
+ type: 'string',
169
+ displayOptions: {
170
+ show: {
171
+ resource: ['screenshot'],
172
+ operation: ['capture'],
173
+ },
174
+ },
175
+ default: 'data',
176
+ description: 'Name of the output binary property the image or PDF will be written to',
177
+ },
178
+ {
179
+ displayName: 'Webhook URL',
180
+ name: 'webhookUrl',
181
+ type: 'string',
182
+ displayOptions: {
183
+ show: {
184
+ resource: ['screenshot'],
185
+ operation: ['captureAsync'],
186
+ },
187
+ },
188
+ default: '',
189
+ placeholder: 'https://example.com/rendex-callback',
190
+ description: 'Optional URL to receive an HMAC-signed webhook when the capture completes',
191
+ },
192
+ {
193
+ displayName: 'Additional Options',
194
+ name: 'additionalOptions',
195
+ type: 'collection',
196
+ placeholder: 'Add Option',
197
+ default: {},
198
+ displayOptions: {
199
+ show: {
200
+ resource: ['screenshot'],
201
+ operation: ['capture', 'captureAsync'],
202
+ },
203
+ },
204
+ options: [
205
+ {
206
+ displayName: 'Best Attempt',
207
+ name: 'bestAttempt',
208
+ type: 'boolean',
209
+ default: true,
210
+ description: 'Whether to return a partial capture on timeout instead of erroring',
211
+ },
212
+ {
213
+ displayName: 'Block Ads',
214
+ name: 'blockAds',
215
+ type: 'boolean',
216
+ default: true,
217
+ description: 'Whether to block ads, trackers, and chat widgets during capture',
218
+ },
219
+ {
220
+ displayName: 'Block Resource Types',
221
+ name: 'blockResourceTypes',
222
+ type: 'multiOptions',
223
+ options: [
224
+ { name: 'Font', value: 'font' },
225
+ { name: 'Image', value: 'image' },
226
+ { name: 'Media', value: 'media' },
227
+ { name: 'Other', value: 'other' },
228
+ { name: 'Stylesheet', value: 'stylesheet' },
229
+ ],
230
+ default: [],
231
+ description: 'Additional resource types to block during capture',
232
+ },
233
+ {
234
+ displayName: 'Cache TTL (Seconds)',
235
+ name: 'cacheTtl',
236
+ type: 'number',
237
+ typeOptions: { minValue: 3600, maxValue: 2592000 },
238
+ default: 86400,
239
+ description: 'For async captures, how long the signed result URL stays valid (3600–2592000 seconds)',
240
+ },
241
+ {
242
+ displayName: 'Cookies (JSON Array)',
243
+ name: 'cookies',
244
+ type: 'json',
245
+ default: '[]',
246
+ description: 'Cookies to set before navigation, as a JSON array of { name, value, domain?, path?, httpOnly?, secure?, sameSite?, expires? } objects (max 50)',
247
+ },
248
+ {
249
+ displayName: 'Custom CSS',
250
+ name: 'css',
251
+ type: 'string',
252
+ typeOptions: { rows: 3 },
253
+ default: '',
254
+ description: 'CSS to inject into the page before capture (max 50 KB)',
255
+ },
256
+ {
257
+ displayName: 'Custom Headers (JSON)',
258
+ name: 'headers',
259
+ type: 'json',
260
+ default: '{}',
261
+ description: 'HTTP headers to send with the navigation request, as a JSON object. Cannot override Host, Connection, Content-Length, or Transfer-Encoding.',
262
+ },
263
+ {
264
+ displayName: 'Custom JavaScript',
265
+ name: 'js',
266
+ type: 'string',
267
+ typeOptions: { rows: 3 },
268
+ default: '',
269
+ description: 'JavaScript to execute in the page before capture (max 50 KB)',
270
+ },
271
+ {
272
+ displayName: 'Dark Mode',
273
+ name: 'darkMode',
274
+ type: 'boolean',
275
+ default: false,
276
+ description: 'Whether to emulate prefers-color-scheme: dark',
277
+ },
278
+ {
279
+ displayName: 'Delay (Ms)',
280
+ name: 'delay',
281
+ type: 'number',
282
+ typeOptions: { minValue: 0, maxValue: 10000 },
283
+ default: 0,
284
+ description: 'Extra delay after load before capture, in milliseconds (0–10000)',
285
+ },
286
+ {
287
+ displayName: 'Device Scale Factor',
288
+ name: 'deviceScaleFactor',
289
+ type: 'number',
290
+ typeOptions: { minValue: 1, maxValue: 3, numberPrecision: 1 },
291
+ default: 2,
292
+ description: 'Device pixel ratio (1–3). Higher = sharper but larger files.',
293
+ },
294
+ {
295
+ displayName: 'Element Selector',
296
+ name: 'selector',
297
+ type: 'string',
298
+ default: '',
299
+ placeholder: '#hero, .card',
300
+ description: 'CSS selector to capture a specific element instead of the full page',
301
+ },
302
+ {
303
+ displayName: 'Full Page',
304
+ name: 'fullPage',
305
+ type: 'boolean',
306
+ default: false,
307
+ description: 'Whether to capture the entire scrollable page with auto-scroll',
308
+ },
309
+ {
310
+ displayName: 'Geo City',
311
+ name: 'geoCity',
312
+ type: 'string',
313
+ default: '',
314
+ description: 'City for more precise geo-targeting. Requires Geo Country to be set.',
315
+ },
316
+ {
317
+ displayName: 'Geo Country',
318
+ name: 'geo',
319
+ type: 'string',
320
+ default: '',
321
+ placeholder: 'US',
322
+ description: 'ISO 3166-1 alpha-2 country code for geo-targeted capture (e.g. US, DE, JP). Pro or Enterprise plan required.',
323
+ },
324
+ {
325
+ displayName: 'Geo State',
326
+ name: 'geoState',
327
+ type: 'string',
328
+ default: '',
329
+ description: 'State or region for more precise geo-targeting. Requires Geo Country to be set.',
330
+ },
331
+ {
332
+ displayName: 'Height',
333
+ name: 'height',
334
+ type: 'number',
335
+ typeOptions: { minValue: 240, maxValue: 2160 },
336
+ default: 800,
337
+ description: 'Viewport height in pixels (240–2160)',
338
+ },
339
+ {
340
+ displayName: 'PDF Landscape',
341
+ name: 'pdfLandscape',
342
+ type: 'boolean',
343
+ default: false,
344
+ description: 'Whether the PDF is oriented landscape (only applies when Format = PDF)',
345
+ },
346
+ {
347
+ displayName: 'PDF Margins (JSON)',
348
+ name: 'pdfMargin',
349
+ type: 'json',
350
+ default: '{"top":"0","right":"0","bottom":"0","left":"0"}',
351
+ description: 'PDF margins as a JSON object with CSS unit strings, e.g. { "top": "1cm", "right": "20px", "bottom": "1cm", "left": "20px" }',
352
+ },
353
+ {
354
+ displayName: 'PDF Page Format',
355
+ name: 'pdfFormat',
356
+ type: 'options',
357
+ options: [
358
+ { name: 'A3', value: 'A3' },
359
+ { name: 'A4', value: 'A4' },
360
+ { name: 'Legal', value: 'Legal' },
361
+ { name: 'Letter', value: 'Letter' },
362
+ { name: 'Tabloid', value: 'Tabloid' },
363
+ ],
364
+ default: 'A4',
365
+ description: 'PDF page size (only applies when Format = PDF)',
366
+ },
367
+ {
368
+ displayName: 'PDF Print Background',
369
+ name: 'pdfPrintBackground',
370
+ type: 'boolean',
371
+ default: true,
372
+ description: 'Whether to print background colors and images in the PDF',
373
+ },
374
+ {
375
+ displayName: 'PDF Scale',
376
+ name: 'pdfScale',
377
+ type: 'number',
378
+ typeOptions: { minValue: 0.1, maxValue: 2, numberPrecision: 2 },
379
+ default: 1,
380
+ description: 'PDF scale factor (0.1–2)',
381
+ },
382
+ {
383
+ displayName: 'Quality',
384
+ name: 'quality',
385
+ type: 'number',
386
+ typeOptions: { minValue: 1, maxValue: 100 },
387
+ default: 80,
388
+ description: 'JPEG/WebP compression quality (1–100). Ignored for PNG and PDF.',
389
+ },
390
+ {
391
+ displayName: 'Timeout (Seconds)',
392
+ name: 'timeout',
393
+ type: 'number',
394
+ typeOptions: { minValue: 5, maxValue: 60 },
395
+ default: 30,
396
+ description: 'Page load timeout in seconds (5–60)',
397
+ },
398
+ {
399
+ displayName: 'User Agent',
400
+ name: 'userAgent',
401
+ type: 'string',
402
+ default: '',
403
+ description: 'Override the browser user-agent string',
404
+ },
405
+ {
406
+ displayName: 'Wait For Selector',
407
+ name: 'waitForSelector',
408
+ type: 'string',
409
+ default: '',
410
+ description: 'Wait for a CSS selector to appear before capture',
411
+ },
412
+ {
413
+ displayName: 'Wait Until',
414
+ name: 'waitUntil',
415
+ type: 'options',
416
+ options: [
417
+ { name: 'DOM Content Loaded', value: 'domcontentloaded' },
418
+ { name: 'Load', value: 'load' },
419
+ { name: 'Network Idle 0', value: 'networkidle0' },
420
+ { name: 'Network Idle 2', value: 'networkidle2' },
421
+ ],
422
+ default: 'networkidle2',
423
+ description: 'Navigation wait condition before capture',
424
+ },
425
+ {
426
+ displayName: 'Width',
427
+ name: 'width',
428
+ type: 'number',
429
+ typeOptions: { minValue: 320, maxValue: 3840 },
430
+ default: 1280,
431
+ description: 'Viewport width in pixels (320–3840)',
432
+ },
433
+ ],
434
+ },
435
+ {
436
+ displayName: 'Job ID',
437
+ name: 'jobId',
438
+ type: 'string',
439
+ required: true,
440
+ default: '',
441
+ displayOptions: {
442
+ show: {
443
+ resource: ['job'],
444
+ operation: ['getStatus'],
445
+ },
446
+ },
447
+ description: 'ID of the async job returned by Capture Async',
448
+ },
449
+ {
450
+ displayName: 'URLs',
451
+ name: 'urls',
452
+ type: 'string',
453
+ typeOptions: { rows: 5 },
454
+ required: true,
455
+ default: '',
456
+ displayOptions: {
457
+ show: {
458
+ resource: ['batch'],
459
+ operation: ['submit'],
460
+ },
461
+ },
462
+ placeholder: 'https://example.com\nhttps://another.com',
463
+ description: 'Newline-separated list of URLs to capture (up to 500 per plan limit)',
464
+ },
465
+ {
466
+ displayName: 'Defaults (JSON)',
467
+ name: 'defaults',
468
+ type: 'json',
469
+ default: '{"format":"png","fullPage":true}',
470
+ displayOptions: {
471
+ show: {
472
+ resource: ['batch'],
473
+ operation: ['submit'],
474
+ },
475
+ },
476
+ description: 'Default capture options applied to every URL in the batch. JSON object using the same shape as Additional Options on Capture.',
477
+ },
478
+ {
479
+ displayName: 'Webhook URL',
480
+ name: 'webhookUrl',
481
+ type: 'string',
482
+ default: '',
483
+ displayOptions: {
484
+ show: {
485
+ resource: ['batch'],
486
+ operation: ['submit'],
487
+ },
488
+ },
489
+ description: 'Optional URL called with an HMAC-signed payload when the whole batch completes',
490
+ },
491
+ {
492
+ displayName: 'Cache TTL (Seconds)',
493
+ name: 'cacheTtl',
494
+ type: 'number',
495
+ typeOptions: { minValue: 3600, maxValue: 2592000 },
496
+ default: 86400,
497
+ displayOptions: {
498
+ show: {
499
+ resource: ['batch'],
500
+ operation: ['submit'],
501
+ },
502
+ },
503
+ description: 'How long signed result URLs stay valid (3600–2592000 seconds)',
504
+ },
505
+ {
506
+ displayName: 'Batch ID',
507
+ name: 'batchId',
508
+ type: 'string',
509
+ required: true,
510
+ default: '',
511
+ displayOptions: {
512
+ show: {
513
+ resource: ['batch'],
514
+ operation: ['getStatus'],
515
+ },
516
+ },
517
+ description: 'ID of the batch returned by Submit',
518
+ },
519
+ ],
520
+ };
521
+ }
522
+ async execute() {
523
+ var _a;
524
+ const items = this.getInputData();
525
+ const returnData = [];
526
+ for (let i = 0; i < items.length; i++) {
527
+ try {
528
+ const resource = this.getNodeParameter('resource', i);
529
+ const operation = this.getNodeParameter('operation', i);
530
+ if (resource === 'screenshot' && operation === 'capture') {
531
+ const body = buildCaptureBody.call(this, i);
532
+ const response = (await this.helpers.httpRequestWithAuthentication.call(this, 'rendexApi', {
533
+ method: 'POST',
534
+ url: '/v1/screenshot/json',
535
+ body,
536
+ json: true,
537
+ }));
538
+ if (!((_a = response === null || response === void 0 ? void 0 : response.data) === null || _a === void 0 ? void 0 : _a.image)) {
539
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Rendex returned no image data — check that the URL or HTML is valid.', { itemIndex: i });
540
+ }
541
+ const binaryPropertyName = this.getNodeParameter('binaryPropertyName', i, 'data');
542
+ const imageBuffer = Buffer.from(response.data.image, 'base64');
543
+ const extension = response.data.format === 'pdf' ? 'pdf' : response.data.format;
544
+ const filename = `rendex-${Date.now()}.${extension}`;
545
+ const binaryData = await this.helpers.prepareBinaryData(imageBuffer, filename, response.data.contentType);
546
+ const { image: _image, ...metadata } = response.data;
547
+ returnData.push({
548
+ json: { ...metadata, meta: response.meta },
549
+ binary: { [binaryPropertyName]: binaryData },
550
+ pairedItem: { item: i },
551
+ });
552
+ }
553
+ else if (resource === 'screenshot' && operation === 'captureAsync') {
554
+ const body = buildCaptureBody.call(this, i);
555
+ body.async = true;
556
+ const webhookUrl = this.getNodeParameter('webhookUrl', i, '');
557
+ if (webhookUrl)
558
+ body.webhookUrl = webhookUrl;
559
+ const response = (await this.helpers.httpRequestWithAuthentication.call(this, 'rendexApi', {
560
+ method: 'POST',
561
+ url: '/v1/screenshot',
562
+ body,
563
+ json: true,
564
+ }));
565
+ returnData.push({
566
+ json: response,
567
+ pairedItem: { item: i },
568
+ });
569
+ }
570
+ else if (resource === 'job' && operation === 'getStatus') {
571
+ const jobId = this.getNodeParameter('jobId', i);
572
+ const response = (await this.helpers.httpRequestWithAuthentication.call(this, 'rendexApi', {
573
+ method: 'GET',
574
+ url: `/v1/jobs/${encodeURIComponent(jobId)}`,
575
+ json: true,
576
+ }));
577
+ returnData.push({ json: response, pairedItem: { item: i } });
578
+ }
579
+ else if (resource === 'batch' && operation === 'submit') {
580
+ const urlsRaw = this.getNodeParameter('urls', i);
581
+ const urls = urlsRaw
582
+ .split('\n')
583
+ .map((u) => u.trim())
584
+ .filter(Boolean);
585
+ if (urls.length === 0) {
586
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Provide at least one URL for the batch.', { itemIndex: i });
587
+ }
588
+ const defaultsRaw = this.getNodeParameter('defaults', i, '{}');
589
+ const defaults = typeof defaultsRaw === 'string'
590
+ ? safeJsonParse.call(this, defaultsRaw, {}, 'Defaults', i)
591
+ : defaultsRaw;
592
+ const body = { urls, defaults };
593
+ const webhookUrl = this.getNodeParameter('webhookUrl', i, '');
594
+ if (webhookUrl)
595
+ body.webhookUrl = webhookUrl;
596
+ const cacheTtl = this.getNodeParameter('cacheTtl', i, 86400);
597
+ if (cacheTtl)
598
+ body.cacheTtl = cacheTtl;
599
+ const response = (await this.helpers.httpRequestWithAuthentication.call(this, 'rendexApi', {
600
+ method: 'POST',
601
+ url: '/v1/screenshot/batch',
602
+ body,
603
+ json: true,
604
+ }));
605
+ returnData.push({ json: response, pairedItem: { item: i } });
606
+ }
607
+ else if (resource === 'batch' && operation === 'getStatus') {
608
+ const batchId = this.getNodeParameter('batchId', i);
609
+ const response = (await this.helpers.httpRequestWithAuthentication.call(this, 'rendexApi', {
610
+ method: 'GET',
611
+ url: `/v1/batches/${encodeURIComponent(batchId)}`,
612
+ json: true,
613
+ }));
614
+ returnData.push({ json: response, pairedItem: { item: i } });
615
+ }
616
+ else {
617
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unknown operation "${resource}.${operation}"`, { itemIndex: i });
618
+ }
619
+ }
620
+ catch (error) {
621
+ if (this.continueOnFail()) {
622
+ returnData.push({
623
+ json: { error: error.message },
624
+ pairedItem: { item: i },
625
+ });
626
+ continue;
627
+ }
628
+ throw error;
629
+ }
630
+ }
631
+ return [returnData];
632
+ }
633
+ }
634
+ exports.Rendex = Rendex;
635
+ const ADDITIONAL_OPTION_KEYS = [
636
+ 'width',
637
+ 'height',
638
+ 'fullPage',
639
+ 'deviceScaleFactor',
640
+ 'darkMode',
641
+ 'quality',
642
+ 'selector',
643
+ 'waitUntil',
644
+ 'timeout',
645
+ 'delay',
646
+ 'waitForSelector',
647
+ 'bestAttempt',
648
+ 'blockAds',
649
+ 'blockResourceTypes',
650
+ 'css',
651
+ 'js',
652
+ 'userAgent',
653
+ 'pdfFormat',
654
+ 'pdfLandscape',
655
+ 'pdfPrintBackground',
656
+ 'pdfScale',
657
+ 'geo',
658
+ 'geoCity',
659
+ 'geoState',
660
+ 'cacheTtl',
661
+ ];
662
+ const JSON_OPTION_KEYS = ['headers', 'cookies', 'pdfMargin'];
663
+ function buildCaptureBody(itemIndex) {
664
+ const source = this.getNodeParameter('source', itemIndex);
665
+ const format = this.getNodeParameter('format', itemIndex);
666
+ const body = { format };
667
+ if (source === 'url') {
668
+ body.url = this.getNodeParameter('url', itemIndex);
669
+ }
670
+ else {
671
+ body.html = this.getNodeParameter('html', itemIndex);
672
+ }
673
+ const additional = this.getNodeParameter('additionalOptions', itemIndex, {});
674
+ for (const key of ADDITIONAL_OPTION_KEYS) {
675
+ const value = additional[key];
676
+ if (value === undefined || value === null || value === '')
677
+ continue;
678
+ if (Array.isArray(value) && value.length === 0)
679
+ continue;
680
+ body[key] = value;
681
+ }
682
+ for (const key of JSON_OPTION_KEYS) {
683
+ const raw = additional[key];
684
+ if (raw === undefined || raw === null || raw === '')
685
+ continue;
686
+ if (typeof raw === 'string') {
687
+ const parsed = safeJsonParse.call(this, raw, undefined, key, itemIndex);
688
+ if (parsed !== undefined)
689
+ body[key] = parsed;
690
+ }
691
+ else {
692
+ body[key] = raw;
693
+ }
694
+ }
695
+ return body;
696
+ }
697
+ function safeJsonParse(raw, fallback, field, itemIndex) {
698
+ const trimmed = raw.trim();
699
+ if (!trimmed)
700
+ return fallback;
701
+ try {
702
+ return JSON.parse(trimmed);
703
+ }
704
+ catch {
705
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `"${field}" must be valid JSON`, { itemIndex });
706
+ }
707
+ }
708
+ //# sourceMappingURL=Rendex.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rendex.node.js","sourceRoot":"","sources":["../../../nodes/Rendex/Rendex.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ {
2
+ "node": "n8n-nodes-base.rendex",
3
+ "nodeVersion": "1.0",
4
+ "codexVersion": "1.0",
5
+ "categories": ["Development", "Marketing", "Productivity"],
6
+ "resources": {
7
+ "credentialDocumentation": [
8
+ {
9
+ "url": "https://rendex.dev/docs/authentication"
10
+ }
11
+ ],
12
+ "primaryDocumentation": [
13
+ {
14
+ "url": "https://github.com/copperline-labs/rendex-n8n#readme"
15
+ }
16
+ ]
17
+ },
18
+ "alias": ["screenshot", "pdf", "html", "render", "capture", "rendex"]
19
+ }
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
2
+ <rect width="32" height="32" rx="6" fill="#0c0a09"/>
3
+ <defs>
4
+ <linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
5
+ <stop offset="0%" stop-color="#EA580C"/>
6
+ <stop offset="100%" stop-color="#06B6D4"/>
7
+ </linearGradient>
8
+ </defs>
9
+ <text x="16" y="24" text-anchor="middle" fill="url(#g)" font-size="24" font-weight="800" font-family="system-ui, -apple-system, sans-serif">R</text>
10
+ </svg>
package/index.js ADDED
@@ -0,0 +1,3 @@
1
+ // n8n loads nodes and credentials from the paths declared in package.json#n8n.
2
+ // This file exists so npm has a valid "main" target; n8n does not call it.
3
+ module.exports = {};
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "n8n-nodes-rendex",
3
+ "version": "1.0.0",
4
+ "description": "n8n community node for Rendex — capture screenshots, generate PDFs, and render HTML via Rendex's rendering API",
5
+ "keywords": [
6
+ "n8n-community-node-package",
7
+ "n8n",
8
+ "rendex",
9
+ "screenshot",
10
+ "pdf",
11
+ "html-to-image",
12
+ "rendering",
13
+ "web-capture"
14
+ ],
15
+ "license": "MIT",
16
+ "homepage": "https://rendex.dev",
17
+ "author": {
18
+ "name": "Copperline Labs LLC",
19
+ "email": "support@rendex.dev",
20
+ "url": "https://rendex.dev"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/copperline-labs/rendex-n8n.git"
25
+ },
26
+ "bugs": {
27
+ "url": "https://github.com/copperline-labs/rendex-n8n/issues"
28
+ },
29
+ "engines": {
30
+ "node": ">=20.15"
31
+ },
32
+ "main": "index.js",
33
+ "scripts": {
34
+ "build": "tsc && mkdir -p dist/nodes/Rendex dist/credentials && cp nodes/Rendex/*.svg dist/nodes/Rendex/ && cp credentials/*.svg dist/credentials/",
35
+ "dev": "tsc --watch",
36
+ "typecheck": "tsc --noEmit",
37
+ "lint": "eslint nodes credentials package.json",
38
+ "lintfix": "eslint nodes credentials package.json --fix",
39
+ "prepublishOnly": "bun run build && bun run lint"
40
+ },
41
+ "files": [
42
+ "dist",
43
+ "index.js"
44
+ ],
45
+ "n8n": {
46
+ "n8nNodesApiVersion": 1,
47
+ "credentials": [
48
+ "dist/credentials/RendexApi.credentials.js"
49
+ ],
50
+ "nodes": [
51
+ "dist/nodes/Rendex/Rendex.node.js"
52
+ ]
53
+ },
54
+ "devDependencies": {
55
+ "@typescript-eslint/parser": "^8.32.0",
56
+ "eslint": "^8.57.0",
57
+ "eslint-plugin-n8n-nodes-base": "^1.16.3",
58
+ "typescript": "^5.7.0"
59
+ },
60
+ "peerDependencies": {
61
+ "n8n-workflow": "*"
62
+ }
63
+ }