n8n-nodes-sendit 1.3.1 → 1.3.2

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 CHANGED
@@ -4,11 +4,12 @@ This is an n8n community node for [SendIt](https://sendit.infiniteappsai.com), a
4
4
 
5
5
  [n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/reference/license/) workflow automation platform.
6
6
 
7
- ## Release Notes (v1.3.1)
7
+ ## Release Notes (v1.3.2)
8
8
 
9
- `1.3.1` is a verification-readiness release:
9
+ `1.3.2` is an n8n verification follow-up release:
10
10
 
11
11
  - **n8n verification readiness**: Added GitHub Actions provenance publishing support for npm releases
12
+ - **n8n review fixes**: Uses `NodeConnectionTypes.Main`, removes unused request defaults, adds a credential icon, and returns `NodeOperationError` for JSON object validation
12
13
  - **Cloud-safe media upload**: Removed host file path reads; media uploads now use n8n binary data only
13
14
  - **Standalone package fix**: Removed package imports from the SendIt server codebase
14
15
  - **Refactored architecture**: Monolithic 2,842-line node split into handler-per-resource dispatch map (23 handler modules)
@@ -52,7 +53,7 @@ Add a **SendIt Trigger** node as the first node in a new workflow. Select events
52
53
 
53
54
  Read content ideas from a spreadsheet, generate AI copy, publish to multiple platforms, and get notified on success.
54
55
 
55
- ## Node Coverage (v1.3.1)
56
+ ## Node Coverage (v1.3.2)
56
57
 
57
58
  ### Trigger
58
59
 
@@ -1,8 +1,9 @@
1
- import { IAuthenticateGeneric, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
1
+ import { IAuthenticateGeneric, ICredentialTestRequest, ICredentialType, Icon, INodeProperties } from 'n8n-workflow';
2
2
  export declare class SendItApi implements ICredentialType {
3
3
  name: string;
4
4
  displayName: string;
5
5
  documentationUrl: string;
6
+ icon: Icon;
6
7
  properties: INodeProperties[];
7
8
  authenticate: IAuthenticateGeneric;
8
9
  test: ICredentialTestRequest;
@@ -6,6 +6,7 @@ class SendItApi {
6
6
  this.name = 'sendItApi';
7
7
  this.displayName = 'SendIt API';
8
8
  this.documentationUrl = 'https://sendit.infiniteappsai.com/documentation.html';
9
+ this.icon = 'file:sendit.svg';
9
10
  this.properties = [
10
11
  {
11
12
  displayName: 'API Key',
@@ -0,0 +1,41 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60">
2
+ <defs>
3
+ <linearGradient id="bolt" x1="0%" y1="100%" x2="100%" y2="0%">
4
+ <stop offset="0%" stop-color="#00B4D8"/>
5
+ <stop offset="50%" stop-color="#00D68F"/>
6
+ <stop offset="100%" stop-color="#80F09A"/>
7
+ </linearGradient>
8
+ <linearGradient id="glow" x1="0%" y1="100%" x2="100%" y2="0%">
9
+ <stop offset="0%" stop-color="#00B4D8" stop-opacity="0.3"/>
10
+ <stop offset="100%" stop-color="#80F09A" stop-opacity="0.3"/>
11
+ </linearGradient>
12
+ </defs>
13
+ <rect width="60" height="60" rx="12" fill="#1A1F2E"/>
14
+ <!-- Lightning bolt S-shape (main stroke) -->
15
+ <path d="M36 5 L22 26 L32 26 L20 55 L44 28 L33 28 L44 10 Z"
16
+ fill="none" stroke="url(#bolt)" stroke-width="2.8"
17
+ stroke-linejoin="round" stroke-linecap="round"/>
18
+ <!-- Arrow tip at top-right -->
19
+ <path d="M38 8 L44 10 L40 15"
20
+ fill="none" stroke="url(#bolt)" stroke-width="2.2"
21
+ stroke-linejoin="round" stroke-linecap="round"/>
22
+ <!-- Inner circuit traces -->
23
+ <path d="M30 16 L30 22 L34 22"
24
+ fill="none" stroke="url(#bolt)" stroke-width="1.2"
25
+ stroke-linecap="round" opacity="0.7"/>
26
+ <path d="M28 36 L28 42 L32 42"
27
+ fill="none" stroke="url(#bolt)" stroke-width="1.2"
28
+ stroke-linecap="round" opacity="0.7"/>
29
+ <path d="M26 29 L30 33"
30
+ fill="none" stroke="url(#bolt)" stroke-width="1.2"
31
+ stroke-linecap="round" opacity="0.6"/>
32
+ <!-- Circuit nodes -->
33
+ <circle cx="34" cy="22" r="1.8" fill="#00D68F"/>
34
+ <circle cx="30" cy="16" r="1.4" fill="#00C4E0" opacity="0.8"/>
35
+ <circle cx="32" cy="42" r="1.8" fill="#80F09A"/>
36
+ <circle cx="28" cy="36" r="1.4" fill="#00D68F" opacity="0.8"/>
37
+ <circle cx="30" cy="33" r="1.2" fill="#00C4E0" opacity="0.6"/>
38
+ <!-- Subtle glow fill -->
39
+ <path d="M36 5 L22 26 L32 26 L20 55 L44 28 L33 28 L44 10 Z"
40
+ fill="url(#glow)" opacity="0.4"/>
41
+ </svg>
@@ -18,21 +18,14 @@ class SendIt {
18
18
  defaults: {
19
19
  name: 'SendIt',
20
20
  },
21
- inputs: ['main'],
22
- outputs: ['main'],
21
+ inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
22
+ outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
23
23
  credentials: [
24
24
  {
25
25
  name: 'sendItApi',
26
26
  required: true,
27
27
  },
28
28
  ],
29
- requestDefaults: {
30
- baseURL: constants_1.SENDIT_API_BASE_URL,
31
- headers: {
32
- Accept: 'application/json',
33
- 'Content-Type': 'application/json',
34
- },
35
- },
36
29
  properties: [
37
30
  {
38
31
  displayName: 'Resource',
@@ -40,29 +33,29 @@ class SendIt {
40
33
  type: 'options',
41
34
  noDataExpression: true,
42
35
  options: [
43
- { name: 'Post', value: 'post' },
44
- { name: 'Scheduled Post', value: 'scheduledPost' },
45
- { name: 'Media', value: 'media' },
36
+ { name: 'Account', value: 'account' },
37
+ { name: 'Advanced', value: 'advanced' },
46
38
  { name: 'AI', value: 'ai' },
47
39
  { name: 'AI Media', value: 'aiMedia' },
48
- { name: 'Content Score', value: 'contentScore' },
49
- { name: 'Inbox', value: 'inbox' },
50
- { name: 'Listening', value: 'listening' },
51
- { name: 'Account', value: 'account' },
52
- { name: 'Library', value: 'library' },
53
- { name: 'Brand Voice', value: 'brandVoice' },
54
- { name: 'Campaign', value: 'campaign' },
55
- { name: 'Approvals', value: 'approvals' },
56
40
  { name: 'Analytics', value: 'analytics' },
57
- { name: 'Validation', value: 'validation' },
58
- { name: 'Conversions', value: 'conversions' },
59
- { name: 'Webhooks', value: 'webhooks' },
60
- { name: 'Dead Letter', value: 'deadLetter' },
41
+ { name: 'Approval', value: 'approvals' },
61
42
  { name: 'Audit Log', value: 'auditLog' },
43
+ { name: 'Brand Voice', value: 'brandVoice' },
62
44
  { name: 'Bulk Schedule', value: 'bulkSchedule' },
45
+ { name: 'Campaign', value: 'campaign' },
63
46
  { name: 'Connect', value: 'connect' },
47
+ { name: 'Content Score', value: 'contentScore' },
48
+ { name: 'Conversion', value: 'conversions' },
49
+ { name: 'Dead Letter', value: 'deadLetter' },
50
+ { name: 'Inbox', value: 'inbox' },
51
+ { name: 'Library', value: 'library' },
52
+ { name: 'Listening', value: 'listening' },
53
+ { name: 'Media', value: 'media' },
64
54
  { name: 'Meta', value: 'meta' },
65
- { name: 'Advanced', value: 'advanced' },
55
+ { name: 'Post', value: 'post' },
56
+ { name: 'Scheduled Post', value: 'scheduledPost' },
57
+ { name: 'Validation', value: 'validation' },
58
+ { name: 'Webhook', value: 'webhooks' },
66
59
  ],
67
60
  default: 'post',
68
61
  },
@@ -71,14 +64,14 @@ class SendIt {
71
64
  name: 'teamId',
72
65
  type: 'string',
73
66
  default: '',
74
- description: 'Optional team scope. Sent as X-Team-ID header when provided',
67
+ description: 'Optional team scope. Sent as X-Team-ID header when provided.',
75
68
  },
76
69
  {
77
70
  displayName: 'Idempotency Key',
78
71
  name: 'idempotencyKey',
79
72
  type: 'string',
80
73
  default: '',
81
- description: 'Optional idempotency key. Sent as Idempotency-Key header when provided',
74
+ description: 'Optional idempotency key. Sent as Idempotency-Key header when provided.',
82
75
  },
83
76
  {
84
77
  displayName: 'Publishing operations are rate-limited to 50 requests per minute per API key.',
@@ -133,7 +126,7 @@ class SendIt {
133
126
  name: 'Publish with AI',
134
127
  value: 'publishAi',
135
128
  description: 'Generate content with AI and publish to platforms',
136
- action: 'Publish with AI-generated content',
129
+ action: 'Publish with ai generated content',
137
130
  },
138
131
  ],
139
132
  default: 'publish',
@@ -145,18 +138,18 @@ class SendIt {
145
138
  noDataExpression: true,
146
139
  displayOptions: { show: { resource: ['ai'] } },
147
140
  options: [
141
+ {
142
+ name: 'Feedback',
143
+ value: 'feedback',
144
+ description: 'Rate AI-generated content quality',
145
+ action: 'Submit AI feedback',
146
+ },
148
147
  {
149
148
  name: 'Generate Content',
150
149
  value: 'generate',
151
150
  description: 'Generate platform-specific content from media or prompt',
152
151
  action: 'Generate AI content',
153
152
  },
154
- {
155
- name: 'Reply Suggestions',
156
- value: 'replySuggestions',
157
- description: 'Get AI-drafted reply suggestions for a mention',
158
- action: 'Get AI reply suggestions',
159
- },
160
153
  {
161
154
  name: 'Mention Summary',
162
155
  value: 'mentionSummary',
@@ -164,10 +157,10 @@ class SendIt {
164
157
  action: 'Summarize mentions with AI',
165
158
  },
166
159
  {
167
- name: 'Feedback',
168
- value: 'feedback',
169
- description: 'Rate AI-generated content quality',
170
- action: 'Submit AI feedback',
160
+ name: 'Reply Suggestions',
161
+ value: 'replySuggestions',
162
+ description: 'Get AI-drafted reply suggestions for a mention',
163
+ action: 'Get AI reply suggestions',
171
164
  },
172
165
  ],
173
166
  default: 'generate',
@@ -201,18 +194,18 @@ class SendIt {
201
194
  description: 'Schedule a post for future publishing',
202
195
  action: 'Schedule a post',
203
196
  },
204
- {
205
- name: 'Get All',
206
- value: 'getAll',
207
- description: 'Get all scheduled posts',
208
- action: 'Get all scheduled posts',
209
- },
210
197
  {
211
198
  name: 'Delete',
212
199
  value: 'delete',
213
200
  description: 'Cancel a scheduled post',
214
201
  action: 'Cancel a scheduled post',
215
202
  },
203
+ {
204
+ name: 'Get Many',
205
+ value: 'getAll',
206
+ description: 'Get many scheduled posts',
207
+ action: 'Get many scheduled posts',
208
+ },
216
209
  {
217
210
  name: 'Trigger Now',
218
211
  value: 'trigger',
@@ -230,10 +223,10 @@ class SendIt {
230
223
  displayOptions: { show: { resource: ['account'] } },
231
224
  options: [
232
225
  {
233
- name: 'Get All',
226
+ name: 'Get Many',
234
227
  value: 'getAll',
235
- description: 'Get all connected accounts',
236
- action: 'Get all accounts',
228
+ description: 'Get many connected accounts',
229
+ action: 'Get many accounts',
237
230
  },
238
231
  ],
239
232
  default: 'getAll',
@@ -284,10 +277,10 @@ class SendIt {
284
277
  action: 'Create a brand voice',
285
278
  },
286
279
  {
287
- name: 'List',
288
- value: 'list',
289
- description: 'List all brand voice profiles',
290
- action: 'List brand voices',
280
+ name: 'Delete',
281
+ value: 'delete',
282
+ description: 'Delete a brand voice profile',
283
+ action: 'Delete a brand voice',
291
284
  },
292
285
  {
293
286
  name: 'Get',
@@ -295,18 +288,18 @@ class SendIt {
295
288
  description: 'Get a single brand voice profile',
296
289
  action: 'Get a brand voice',
297
290
  },
291
+ {
292
+ name: 'List',
293
+ value: 'list',
294
+ description: 'List all brand voice profiles',
295
+ action: 'List brand voices',
296
+ },
298
297
  {
299
298
  name: 'Update',
300
299
  value: 'update',
301
300
  description: 'Update a brand voice profile',
302
301
  action: 'Update a brand voice',
303
302
  },
304
- {
305
- name: 'Delete',
306
- value: 'delete',
307
- description: 'Delete a brand voice profile',
308
- action: 'Delete a brand voice',
309
- },
310
303
  ],
311
304
  default: 'create',
312
305
  },
@@ -317,18 +310,18 @@ class SendIt {
317
310
  noDataExpression: true,
318
311
  displayOptions: { show: { resource: ['campaign'] } },
319
312
  options: [
320
- {
321
- name: 'Plan',
322
- value: 'plan',
323
- description: 'Create a new campaign with AI-planned posts',
324
- action: 'Plan a campaign',
325
- },
326
313
  {
327
314
  name: 'List',
328
315
  value: 'list',
329
316
  description: 'List all campaigns',
330
317
  action: 'List campaigns',
331
318
  },
319
+ {
320
+ name: 'Plan',
321
+ value: 'plan',
322
+ description: 'Create a new campaign with AI-planned posts',
323
+ action: 'Plan a campaign',
324
+ },
332
325
  {
333
326
  name: 'Schedule',
334
327
  value: 'schedule',
@@ -345,6 +338,12 @@ class SendIt {
345
338
  noDataExpression: true,
346
339
  displayOptions: { show: { resource: ['inbox'] } },
347
340
  options: [
341
+ {
342
+ name: 'Get Thread',
343
+ value: 'getThread',
344
+ description: 'Get a single inbox thread with messages',
345
+ action: 'Get an inbox thread',
346
+ },
348
347
  {
349
348
  name: 'List',
350
349
  value: 'list',
@@ -357,12 +356,6 @@ class SendIt {
357
356
  description: 'Reply to an inbox thread',
358
357
  action: 'Reply to a thread',
359
358
  },
360
- {
361
- name: 'Get Thread',
362
- value: 'getThread',
363
- description: 'Get a single inbox thread with messages',
364
- action: 'Get an inbox thread',
365
- },
366
359
  {
367
360
  name: 'Update Status',
368
361
  value: 'updateStatus',
@@ -380,16 +373,9 @@ class SendIt {
380
373
  displayOptions: { show: { resource: ['listening'] } },
381
374
  options: [
382
375
  {
383
- name: 'Refresh',
384
- value: 'refresh',
385
- description: 'Trigger a refresh of social listening data for tracked keywords',
386
- action: 'Refresh social listening data',
387
- },
388
- {
389
- name: 'List Keywords',
390
- value: 'listKeywords',
391
- description: 'List tracked listening keywords',
392
- action: 'List listening keywords',
376
+ name: 'Archive Mentions',
377
+ value: 'archiveMentions',
378
+ action: 'Archive listening mentions',
393
379
  },
394
380
  {
395
381
  name: 'Create Keyword',
@@ -397,18 +383,6 @@ class SendIt {
397
383
  description: 'Create a listening keyword',
398
384
  action: 'Create listening keyword',
399
385
  },
400
- {
401
- name: 'Get Keyword',
402
- value: 'getKeyword',
403
- description: 'Get listening keyword by ID',
404
- action: 'Get listening keyword',
405
- },
406
- {
407
- name: 'Update Keyword',
408
- value: 'updateKeyword',
409
- description: 'Update listening keyword',
410
- action: 'Update listening keyword',
411
- },
412
386
  {
413
387
  name: 'Delete Keyword',
414
388
  value: 'deleteKeyword',
@@ -416,10 +390,15 @@ class SendIt {
416
390
  action: 'Delete listening keyword',
417
391
  },
418
392
  {
419
- name: 'List Mentions',
420
- value: 'listMentions',
421
- description: 'List mentions',
422
- action: 'List listening mentions',
393
+ name: 'Dismiss Alerts',
394
+ value: 'dismissAlerts',
395
+ action: 'Dismiss listening alerts',
396
+ },
397
+ {
398
+ name: 'Get Keyword',
399
+ value: 'getKeyword',
400
+ description: 'Get listening keyword by ID',
401
+ action: 'Get listening keyword',
423
402
  },
424
403
  {
425
404
  name: 'Get Mention',
@@ -428,16 +407,10 @@ class SendIt {
428
407
  action: 'Get listening mention',
429
408
  },
430
409
  {
431
- name: 'Mark Mentions Read',
432
- value: 'markMentionsRead',
433
- description: 'Mark mentions as read',
434
- action: 'Mark listening mentions as read',
435
- },
436
- {
437
- name: 'Archive Mentions',
438
- value: 'archiveMentions',
439
- description: 'Archive mentions',
440
- action: 'Archive listening mentions',
410
+ name: 'Get Summary',
411
+ value: 'getSummary',
412
+ description: 'Get listening summary',
413
+ action: 'Get listening summary',
441
414
  },
442
415
  {
443
416
  name: 'List Alerts',
@@ -445,6 +418,17 @@ class SendIt {
445
418
  description: 'List listening alerts',
446
419
  action: 'List listening alerts',
447
420
  },
421
+ {
422
+ name: 'List Keywords',
423
+ value: 'listKeywords',
424
+ description: 'List tracked listening keywords',
425
+ action: 'List listening keywords',
426
+ },
427
+ {
428
+ name: 'List Mentions',
429
+ value: 'listMentions',
430
+ action: 'List listening mentions',
431
+ },
448
432
  {
449
433
  name: 'Mark Alerts Read',
450
434
  value: 'markAlertsRead',
@@ -452,16 +436,22 @@ class SendIt {
452
436
  action: 'Mark listening alerts as read',
453
437
  },
454
438
  {
455
- name: 'Dismiss Alerts',
456
- value: 'dismissAlerts',
457
- description: 'Dismiss alerts',
458
- action: 'Dismiss listening alerts',
439
+ name: 'Mark Mentions Read',
440
+ value: 'markMentionsRead',
441
+ description: 'Mark mentions as read',
442
+ action: 'Mark listening mentions as read',
459
443
  },
460
444
  {
461
- name: 'Get Summary',
462
- value: 'getSummary',
463
- description: 'Get listening summary',
464
- action: 'Get listening summary',
445
+ name: 'Refresh',
446
+ value: 'refresh',
447
+ description: 'Trigger a refresh of social listening data for tracked keywords',
448
+ action: 'Refresh social listening data',
449
+ },
450
+ {
451
+ name: 'Update Keyword',
452
+ value: 'updateKeyword',
453
+ description: 'Update listening keyword',
454
+ action: 'Update listening keyword',
465
455
  },
466
456
  ],
467
457
  default: 'refresh',
@@ -495,18 +485,18 @@ class SendIt {
495
485
  noDataExpression: true,
496
486
  displayOptions: { show: { resource: ['meta'] } },
497
487
  options: [
488
+ {
489
+ name: 'Get Best Times',
490
+ value: 'getBestTimes',
491
+ description: 'Get optimal posting times for a platform',
492
+ action: 'Get best times to post',
493
+ },
498
494
  {
499
495
  name: 'Get Capabilities',
500
496
  value: 'getCapabilities',
501
497
  description: 'Get supported platform capabilities',
502
498
  action: 'Get capabilities',
503
499
  },
504
- {
505
- name: 'Get Requirements',
506
- value: 'getRequirements',
507
- description: 'Get content requirements for a platform',
508
- action: 'Get platform requirements',
509
- },
510
500
  {
511
501
  name: 'Get Platform Settings Schema',
512
502
  value: 'getPlatformSettingsSchema',
@@ -514,10 +504,10 @@ class SendIt {
514
504
  action: 'Get platform settings schema',
515
505
  },
516
506
  {
517
- name: 'Get Best Times',
518
- value: 'getBestTimes',
519
- description: 'Get optimal posting times for a platform',
520
- action: 'Get best times to post',
507
+ name: 'Get Requirements',
508
+ value: 'getRequirements',
509
+ description: 'Get content requirements for a platform',
510
+ action: 'Get platform requirements',
521
511
  },
522
512
  {
523
513
  name: 'Get Webhook Events Catalog',
@@ -557,13 +547,13 @@ class SendIt {
557
547
  noDataExpression: true,
558
548
  displayOptions: { show: { resource: ['library'] } },
559
549
  options: [
560
- { name: 'List', value: 'list', action: 'List library items' },
561
550
  { name: 'Create', value: 'create', action: 'Create library item' },
562
- { name: 'Get', value: 'get', action: 'Get library item' },
563
- { name: 'Update', value: 'update', action: 'Update library item' },
564
551
  { name: 'Delete', value: 'delete', action: 'Delete library item' },
552
+ { name: 'Get', value: 'get', action: 'Get library item' },
553
+ { name: 'List', value: 'list', action: 'List library items' },
565
554
  { name: 'List Categories', value: 'listCategories', action: 'List library categories' },
566
555
  { name: 'List Tags', value: 'listTags', action: 'List library tags' },
556
+ { name: 'Update', value: 'update', action: 'Update library item' },
567
557
  ],
568
558
  default: 'list',
569
559
  },
@@ -574,8 +564,8 @@ class SendIt {
574
564
  noDataExpression: true,
575
565
  displayOptions: { show: { resource: ['approvals'] } },
576
566
  options: [
577
- { name: 'List', value: 'list', action: 'List approvals' },
578
567
  { name: 'Approve', value: 'approve', action: 'Approve post' },
568
+ { name: 'List', value: 'list', action: 'List approvals' },
579
569
  { name: 'Reject', value: 'reject', action: 'Reject post' },
580
570
  ],
581
571
  default: 'list',
@@ -587,15 +577,15 @@ class SendIt {
587
577
  noDataExpression: true,
588
578
  displayOptions: { show: { resource: ['bulkSchedule'] } },
589
579
  options: [
590
- { name: 'List Imports', value: 'listImports', action: 'List bulk imports' },
591
- { name: 'Get Import', value: 'getImport', action: 'Get bulk import' },
592
- { name: 'Validate CSV', value: 'validateCsv', action: 'Validate CSV payload' },
593
- { name: 'Import CSV', value: 'importCsv', action: 'Import CSV payload' },
594
580
  {
595
581
  name: 'Download Template',
596
582
  value: 'downloadTemplate',
597
583
  action: 'Download bulk schedule template',
598
584
  },
585
+ { name: 'Get Import', value: 'getImport', action: 'Get bulk import' },
586
+ { name: 'Import CSV', value: 'importCsv', action: 'Import CSV payload' },
587
+ { name: 'List Imports', value: 'listImports', action: 'List bulk imports' },
588
+ { name: 'Validate CSV', value: 'validateCsv', action: 'Validate CSV payload' },
599
589
  ],
600
590
  default: 'listImports',
601
591
  },
@@ -606,11 +596,6 @@ class SendIt {
606
596
  noDataExpression: true,
607
597
  displayOptions: { show: { resource: ['connect'] } },
608
598
  options: [
609
- {
610
- name: 'Get Connect Action',
611
- value: 'getConnectAction',
612
- action: 'Get connect action for platform',
613
- },
614
599
  {
615
600
  name: 'Connect Token',
616
601
  value: 'connectToken',
@@ -621,6 +606,11 @@ class SendIt {
621
606
  value: 'connectWebhook',
622
607
  action: 'Connect with webhook credentials',
623
608
  },
609
+ {
610
+ name: 'Get Connect Action',
611
+ value: 'getConnectAction',
612
+ action: 'Get connect action for platform',
613
+ },
624
614
  ],
625
615
  default: 'getConnectAction',
626
616
  },
@@ -631,25 +621,25 @@ class SendIt {
631
621
  noDataExpression: true,
632
622
  displayOptions: { show: { resource: ['webhooks'] } },
633
623
  options: [
624
+ { name: 'Get', value: 'get', description: 'Get a webhook by ID', action: 'Get webhook' },
634
625
  {
635
626
  name: 'List',
636
627
  value: 'list',
637
628
  description: 'List all registered webhooks',
638
629
  action: 'List webhooks',
639
630
  },
640
- { name: 'Get', value: 'get', description: 'Get a webhook by ID', action: 'Get webhook' },
641
- {
642
- name: 'Update',
643
- value: 'update',
644
- description: 'Update a webhook subscription',
645
- action: 'Update webhook',
646
- },
647
631
  {
648
632
  name: 'Test Webhook',
649
633
  value: 'testWebhook',
650
634
  description: 'Send a test delivery to a webhook',
651
635
  action: 'Send a test webhook delivery',
652
636
  },
637
+ {
638
+ name: 'Update',
639
+ value: 'update',
640
+ description: 'Update a webhook subscription',
641
+ action: 'Update webhook',
642
+ },
653
643
  ],
654
644
  default: 'list',
655
645
  },
@@ -660,6 +650,12 @@ class SendIt {
660
650
  noDataExpression: true,
661
651
  displayOptions: { show: { resource: ['deadLetter'] } },
662
652
  options: [
653
+ {
654
+ name: 'Discard',
655
+ value: 'discard',
656
+ description: 'Permanently discard a dead letter post',
657
+ action: 'Discard dead letter post',
658
+ },
663
659
  {
664
660
  name: 'List',
665
661
  value: 'list',
@@ -672,12 +668,6 @@ class SendIt {
672
668
  description: 'Retry a failed post from the dead letter queue',
673
669
  action: 'Requeue dead letter post',
674
670
  },
675
- {
676
- name: 'Discard',
677
- value: 'discard',
678
- description: 'Permanently discard a dead letter post',
679
- action: 'Discard dead letter post',
680
- },
681
671
  ],
682
672
  default: 'list',
683
673
  },
@@ -807,14 +797,14 @@ class SendIt {
807
797
  description: 'When to publish the post',
808
798
  },
809
799
  {
810
- displayName: 'Scheduled Post',
800
+ displayName: 'Scheduled Post Name or ID',
811
801
  name: 'scheduleId',
812
802
  type: 'options',
813
803
  typeOptions: { loadOptionsMethod: 'getScheduledPosts' },
814
804
  default: '',
815
805
  required: true,
816
806
  displayOptions: { show: { resource: ['scheduledPost'], operation: ['delete', 'trigger'] } },
817
- description: 'Choose from the list, or specify an ID using an expression.',
807
+ description: 'Choose from the list, or specify an ID using an expression. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
818
808
  },
819
809
  {
820
810
  displayName: 'Platform Filter',
@@ -826,14 +816,14 @@ class SendIt {
826
816
  description: 'Filter scheduled posts by platform',
827
817
  },
828
818
  {
829
- displayName: 'Platform',
819
+ displayName: 'Platform Name or ID',
830
820
  name: 'analyticsPlatform',
831
821
  type: 'options',
832
822
  typeOptions: { loadOptionsMethod: 'getConnectedPlatforms' },
833
823
  default: '',
834
824
  required: true,
835
825
  displayOptions: { show: { resource: ['analytics'], operation: ['getAnalytics'] } },
836
- description: 'Choose from the list, or specify an ID using an expression.',
826
+ description: 'Choose from the list, or specify an ID using an expression. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
837
827
  },
838
828
  {
839
829
  displayName: 'Additional Options',
@@ -846,18 +836,23 @@ class SendIt {
846
836
  },
847
837
  options: [
848
838
  {
849
- displayName: 'Media URLs (for carousel)',
850
- name: 'mediaUrls',
851
- type: 'string',
852
- default: '',
853
- description: 'Comma-separated URLs for carousel posts',
839
+ displayName: 'Facebook Mode',
840
+ name: 'facebookMode',
841
+ type: 'options',
842
+ options: [
843
+ { name: 'Auto (Try Reels First)', value: 'auto' },
844
+ { name: 'Reel', value: 'reel' },
845
+ { name: 'Feed Video', value: 'feed' },
846
+ ],
847
+ default: 'auto',
848
+ description: 'How to publish videos to Facebook',
854
849
  },
855
850
  {
856
851
  displayName: 'Media Type',
857
852
  name: 'mediaType',
858
853
  type: 'options',
859
854
  options: [
860
- { name: 'Auto-detect', value: 'auto' },
855
+ { name: 'Auto-Detect', value: 'auto' },
861
856
  { name: 'Image', value: 'image' },
862
857
  { name: 'Video', value: 'video' },
863
858
  ],
@@ -865,16 +860,18 @@ class SendIt {
865
860
  description: 'Specify the media type',
866
861
  },
867
862
  {
868
- displayName: 'Facebook Mode',
869
- name: 'facebookMode',
870
- type: 'options',
871
- options: [
872
- { name: 'Auto (try Reels first)', value: 'auto' },
873
- { name: 'Reel', value: 'reel' },
874
- { name: 'Feed Video', value: 'feed' },
875
- ],
876
- default: 'auto',
877
- description: 'How to publish videos to Facebook',
863
+ displayName: 'Media URLs (for Carousel)',
864
+ name: 'mediaUrls',
865
+ type: 'string',
866
+ default: '',
867
+ description: 'Comma-separated URLs for carousel posts',
868
+ },
869
+ {
870
+ displayName: 'Pinterest Board ID',
871
+ name: 'pinterestBoardId',
872
+ type: 'string',
873
+ default: '',
874
+ description: 'Pinterest board ID to pin to',
878
875
  },
879
876
  {
880
877
  displayName: 'YouTube Mode',
@@ -888,13 +885,6 @@ class SendIt {
888
885
  default: 'auto',
889
886
  description: 'How to publish videos to YouTube',
890
887
  },
891
- {
892
- displayName: 'Pinterest Board ID',
893
- name: 'pinterestBoardId',
894
- type: 'string',
895
- default: '',
896
- description: 'Pinterest board ID to pin to',
897
- },
898
888
  ],
899
889
  },
900
890
  {
@@ -907,30 +897,43 @@ class SendIt {
907
897
  show: { resource: ['post', 'ai'], operation: ['publishAi', 'generate'] },
908
898
  },
909
899
  options: [
900
+ {
901
+ displayName: 'Call To Action',
902
+ name: 'callToAction',
903
+ type: 'string',
904
+ default: '',
905
+ description: 'Call-to-action to include in content',
906
+ },
907
+ {
908
+ displayName: 'Facebook Mode',
909
+ name: 'facebookMode',
910
+ type: 'options',
911
+ options: [
912
+ { name: 'Auto (Try Reels First)', value: 'auto' },
913
+ { name: 'Reel', value: 'reel' },
914
+ { name: 'Feed Video', value: 'feed' },
915
+ ],
916
+ default: 'auto',
917
+ description: 'How to publish videos to Facebook',
918
+ },
910
919
  {
911
920
  displayName: 'Hashtags',
912
921
  name: 'hashtags',
913
922
  type: 'options',
914
923
  options: [
915
924
  { name: 'Platform Default', value: 'platform_auto' },
916
- { name: 'On (include hashtags)', value: 'on' },
917
- { name: 'Off (no hashtags)', value: 'off' },
925
+ { name: 'On (Include Hashtags)', value: 'on' },
926
+ { name: 'Off (No Hashtags)', value: 'off' },
918
927
  ],
919
928
  default: 'platform_auto',
920
929
  description: 'Hashtag generation mode',
921
930
  },
922
931
  {
923
- displayName: 'Tone',
924
- name: 'tone',
925
- type: 'options',
926
- options: [
927
- { name: 'Professional', value: 'professional' },
928
- { name: 'Casual', value: 'casual' },
929
- { name: 'Energetic', value: 'energetic' },
930
- { name: 'Informative', value: 'informative' },
931
- ],
932
- default: 'professional',
933
- description: 'Content tone',
932
+ displayName: 'Strict AI',
933
+ name: 'strictAi',
934
+ type: 'boolean',
935
+ default: false,
936
+ description: 'Whether to fail if AI generation fails (otherwise use fallback templates)',
934
937
  },
935
938
  {
936
939
  displayName: 'Style',
@@ -946,30 +949,17 @@ class SendIt {
946
949
  description: 'Content style',
947
950
  },
948
951
  {
949
- displayName: 'Call To Action',
950
- name: 'callToAction',
951
- type: 'string',
952
- default: '',
953
- description: 'Call-to-action to include in content',
954
- },
955
- {
956
- displayName: 'Strict AI',
957
- name: 'strictAi',
958
- type: 'boolean',
959
- default: false,
960
- description: 'Fail if AI generation fails (otherwise use fallback templates)',
961
- },
962
- {
963
- displayName: 'Facebook Mode',
964
- name: 'facebookMode',
952
+ displayName: 'Tone',
953
+ name: 'tone',
965
954
  type: 'options',
966
955
  options: [
967
- { name: 'Auto (try Reels first)', value: 'auto' },
968
- { name: 'Reel', value: 'reel' },
969
- { name: 'Feed Video', value: 'feed' },
956
+ { name: 'Professional', value: 'professional' },
957
+ { name: 'Casual', value: 'casual' },
958
+ { name: 'Energetic', value: 'energetic' },
959
+ { name: 'Informative', value: 'informative' },
970
960
  ],
971
- default: 'auto',
972
- description: 'How to publish videos to Facebook',
961
+ default: 'professional',
962
+ description: 'Content tone',
973
963
  },
974
964
  {
975
965
  displayName: 'YouTube Mode',
@@ -1040,7 +1030,7 @@ class SendIt {
1040
1030
  },
1041
1031
  // ===== Brand voice fields =====
1042
1032
  {
1043
- displayName: 'Brand Voice',
1033
+ displayName: 'Brand Voice Name or ID',
1044
1034
  name: 'brandVoiceId',
1045
1035
  type: 'options',
1046
1036
  typeOptions: { loadOptionsMethod: 'getBrandVoices' },
@@ -1049,7 +1039,7 @@ class SendIt {
1049
1039
  displayOptions: {
1050
1040
  show: { resource: ['brandVoice'], operation: ['get', 'update', 'delete'] },
1051
1041
  },
1052
- description: 'Choose from the list, or specify an ID using an expression.',
1042
+ description: 'Choose from the list, or specify an ID using an expression. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
1053
1043
  },
1054
1044
  {
1055
1045
  displayName: 'Voice Name',
@@ -1156,14 +1146,14 @@ class SendIt {
1156
1146
  description: 'Optional campaign end date/time (ISO 8601)',
1157
1147
  },
1158
1148
  {
1159
- displayName: 'Campaign',
1149
+ displayName: 'Campaign Name or ID',
1160
1150
  name: 'campaignId',
1161
1151
  type: 'options',
1162
1152
  typeOptions: { loadOptionsMethod: 'getCampaigns' },
1163
1153
  default: '',
1164
1154
  required: true,
1165
1155
  displayOptions: { show: { resource: ['campaign'], operation: ['schedule'] } },
1166
- description: 'Choose from the list, or specify an ID using an expression.',
1156
+ description: 'Choose from the list, or specify an ID using an expression. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
1167
1157
  },
1168
1158
  // ===== Inbox fields =====
1169
1159
  {
@@ -1181,10 +1171,10 @@ class SendIt {
1181
1171
  type: 'options',
1182
1172
  options: [
1183
1173
  { name: 'All Statuses', value: '' },
1174
+ { name: 'Archived', value: 'archived' },
1175
+ { name: 'Closed', value: 'closed' },
1184
1176
  { name: 'Open', value: 'open' },
1185
1177
  { name: 'Replied', value: 'replied' },
1186
- { name: 'Closed', value: 'closed' },
1187
- { name: 'Archived', value: 'archived' },
1188
1178
  ],
1189
1179
  default: '',
1190
1180
  displayOptions: { show: { resource: ['inbox'], operation: ['list'] } },
@@ -1200,7 +1190,7 @@ class SendIt {
1200
1190
  description: 'Maximum number of threads to return (1-50)',
1201
1191
  },
1202
1192
  {
1203
- displayName: 'Inbox Thread',
1193
+ displayName: 'Inbox Thread Name or ID',
1204
1194
  name: 'inboxThreadId',
1205
1195
  type: 'options',
1206
1196
  typeOptions: { loadOptionsMethod: 'getInboxThreads' },
@@ -1212,7 +1202,7 @@ class SendIt {
1212
1202
  operation: ['reply', 'getThread', 'updateStatus'],
1213
1203
  },
1214
1204
  },
1215
- description: 'Choose from the list, or specify an ID using an expression.',
1205
+ description: 'Choose from the list, or specify an ID using an expression. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
1216
1206
  },
1217
1207
  {
1218
1208
  displayName: 'Reply Message',
@@ -1229,10 +1219,10 @@ class SendIt {
1229
1219
  name: 'inboxThreadStatus',
1230
1220
  type: 'options',
1231
1221
  options: [
1222
+ { name: 'Archived', value: 'archived' },
1223
+ { name: 'Closed', value: 'closed' },
1232
1224
  { name: 'Open', value: 'open' },
1233
1225
  { name: 'Replied', value: 'replied' },
1234
- { name: 'Closed', value: 'closed' },
1235
- { name: 'Archived', value: 'archived' },
1236
1226
  ],
1237
1227
  default: 'open',
1238
1228
  required: true,
@@ -1263,7 +1253,7 @@ class SendIt {
1263
1253
  description: 'Comma-separated keyword IDs to refresh',
1264
1254
  },
1265
1255
  {
1266
- displayName: 'Listening Keyword',
1256
+ displayName: 'Listening Keyword Name or ID',
1267
1257
  name: 'listeningKeywordId',
1268
1258
  type: 'options',
1269
1259
  typeOptions: { loadOptionsMethod: 'getListeningKeywords' },
@@ -1275,7 +1265,7 @@ class SendIt {
1275
1265
  operation: ['getKeyword', 'updateKeyword', 'deleteKeyword'],
1276
1266
  },
1277
1267
  },
1278
- description: 'Choose from the list, or specify an ID using an expression.',
1268
+ description: 'Choose from the list, or specify an ID using an expression. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
1279
1269
  },
1280
1270
  {
1281
1271
  displayName: 'Keyword',
@@ -1293,9 +1283,9 @@ class SendIt {
1293
1283
  options: [
1294
1284
  { name: 'Brand', value: 'brand' },
1295
1285
  { name: 'Competitor', value: 'competitor' },
1296
- { name: 'Product', value: 'product' },
1297
- { name: 'Hashtag', value: 'hashtag' },
1298
1286
  { name: 'Custom', value: 'custom' },
1287
+ { name: 'Hashtag', value: 'hashtag' },
1288
+ { name: 'Product', value: 'product' },
1299
1289
  ],
1300
1290
  default: 'brand',
1301
1291
  displayOptions: {
@@ -1312,7 +1302,7 @@ class SendIt {
1312
1302
  type: 'boolean',
1313
1303
  default: true,
1314
1304
  displayOptions: { show: { resource: ['listening'], operation: ['listKeywords'] } },
1315
- description: 'Only include active keywords',
1305
+ description: 'Whether to only include active keywords',
1316
1306
  },
1317
1307
  {
1318
1308
  displayName: 'Notify Email',
@@ -1322,7 +1312,7 @@ class SendIt {
1322
1312
  displayOptions: {
1323
1313
  show: { resource: ['listening'], operation: ['createKeyword', 'updateKeyword'] },
1324
1314
  },
1325
- description: 'Enable email notifications',
1315
+ description: 'Whether to enable email notifications',
1326
1316
  },
1327
1317
  {
1328
1318
  displayName: 'Notify Webhook',
@@ -1332,7 +1322,7 @@ class SendIt {
1332
1322
  displayOptions: {
1333
1323
  show: { resource: ['listening'], operation: ['createKeyword', 'updateKeyword'] },
1334
1324
  },
1335
- description: 'Enable webhook notifications',
1325
+ description: 'Whether to enable webhook notifications',
1336
1326
  },
1337
1327
  {
1338
1328
  displayName: 'Webhook URL',
@@ -1350,9 +1340,9 @@ class SendIt {
1350
1340
  type: 'options',
1351
1341
  options: [
1352
1342
  { name: 'Any', value: '' },
1353
- { name: 'Positive', value: 'positive' },
1354
- { name: 'Neutral', value: 'neutral' },
1355
1343
  { name: 'Negative', value: 'negative' },
1344
+ { name: 'Neutral', value: 'neutral' },
1345
+ { name: 'Positive', value: 'positive' },
1356
1346
  ],
1357
1347
  default: '',
1358
1348
  displayOptions: {
@@ -1361,7 +1351,6 @@ class SendIt {
1361
1351
  operation: ['createKeyword', 'updateKeyword', 'listMentions'],
1362
1352
  },
1363
1353
  },
1364
- description: 'Sentiment filter',
1365
1354
  },
1366
1355
  {
1367
1356
  displayName: 'Mention ID',
@@ -1370,7 +1359,6 @@ class SendIt {
1370
1359
  default: '',
1371
1360
  required: true,
1372
1361
  displayOptions: { show: { resource: ['listening'], operation: ['getMention'] } },
1373
- description: 'Mention ID',
1374
1362
  },
1375
1363
  {
1376
1364
  displayName: 'Mention IDs',
@@ -1389,7 +1377,7 @@ class SendIt {
1389
1377
  type: 'boolean',
1390
1378
  default: false,
1391
1379
  displayOptions: { show: { resource: ['listening'], operation: ['listAlerts'] } },
1392
- description: 'Only include unread alerts',
1380
+ description: 'Whether to only include unread alerts',
1393
1381
  },
1394
1382
  {
1395
1383
  displayName: 'Alert Priority',
@@ -1397,10 +1385,10 @@ class SendIt {
1397
1385
  type: 'options',
1398
1386
  options: [
1399
1387
  { name: 'Any', value: '' },
1388
+ { name: 'Critical', value: 'critical' },
1389
+ { name: 'High', value: 'high' },
1400
1390
  { name: 'Low', value: 'low' },
1401
1391
  { name: 'Medium', value: 'medium' },
1402
- { name: 'High', value: 'high' },
1403
- { name: 'Critical', value: 'critical' },
1404
1392
  ],
1405
1393
  default: '',
1406
1394
  displayOptions: { show: { resource: ['listening'], operation: ['listAlerts'] } },
@@ -1459,9 +1447,9 @@ class SendIt {
1459
1447
  name: 'listeningIsArchived',
1460
1448
  type: 'options',
1461
1449
  options: [
1450
+ { name: 'Active', value: 'false' },
1462
1451
  { name: 'Any', value: '' },
1463
1452
  { name: 'Archived', value: 'true' },
1464
- { name: 'Active', value: 'false' },
1465
1453
  ],
1466
1454
  default: '',
1467
1455
  displayOptions: { show: { resource: ['listening'], operation: ['listMentions'] } },
@@ -1492,10 +1480,10 @@ class SendIt {
1492
1480
  name: 'aiMediaProvider',
1493
1481
  type: 'options',
1494
1482
  options: [
1495
- { name: 'Sora', value: 'sora' },
1496
- { name: 'Runway', value: 'runway' },
1497
- { name: 'Pika', value: 'pika' },
1498
1483
  { name: 'Adobe Express', value: 'adobe-express' },
1484
+ { name: 'Pika', value: 'pika' },
1485
+ { name: 'Runway', value: 'runway' },
1486
+ { name: 'Sora', value: 'sora' },
1499
1487
  ],
1500
1488
  default: 'sora',
1501
1489
  required: true,
@@ -1584,14 +1572,14 @@ class SendIt {
1584
1572
  },
1585
1573
  // ===== Library fields =====
1586
1574
  {
1587
- displayName: 'Library Item',
1575
+ displayName: 'Library Item Name or ID',
1588
1576
  name: 'libraryItemId',
1589
1577
  type: 'options',
1590
1578
  typeOptions: { loadOptionsMethod: 'getLibraryItems' },
1591
1579
  default: '',
1592
1580
  required: true,
1593
1581
  displayOptions: { show: { resource: ['library'], operation: ['get', 'update', 'delete'] } },
1594
- description: 'Choose from the list, or specify an ID using an expression.',
1582
+ description: 'Choose from the list, or specify an ID using an expression. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
1595
1583
  },
1596
1584
  {
1597
1585
  displayName: 'Title',
@@ -1618,8 +1606,8 @@ class SendIt {
1618
1606
  type: 'options',
1619
1607
  options: [
1620
1608
  { name: 'Draft', value: 'draft' },
1621
- { name: 'Template', value: 'template' },
1622
1609
  { name: 'Evergreen', value: 'evergreen' },
1610
+ { name: 'Template', value: 'template' },
1623
1611
  ],
1624
1612
  default: 'draft',
1625
1613
  displayOptions: {
@@ -1688,7 +1676,7 @@ class SendIt {
1688
1676
  type: 'boolean',
1689
1677
  default: false,
1690
1678
  displayOptions: { show: { resource: ['library'], operation: ['create', 'update'] } },
1691
- description: 'Enable evergreen republishing',
1679
+ description: 'Whether to enable evergreen republishing',
1692
1680
  },
1693
1681
  {
1694
1682
  displayName: 'Evergreen Interval Days',
@@ -1771,7 +1759,7 @@ class SendIt {
1771
1759
  type: 'boolean',
1772
1760
  default: false,
1773
1761
  displayOptions: { show: { resource: ['bulkSchedule'], operation: ['importCsv'] } },
1774
- description: 'Continue import even if some rows fail validation',
1762
+ description: 'Whether to continue import even if some rows fail validation',
1775
1763
  },
1776
1764
  // ===== Connect fields =====
1777
1765
  {
@@ -1819,7 +1807,7 @@ class SendIt {
1819
1807
  },
1820
1808
  // ===== Webhook fields =====
1821
1809
  {
1822
- displayName: 'Webhook',
1810
+ displayName: 'Webhook Name or ID',
1823
1811
  name: 'webhookId',
1824
1812
  type: 'options',
1825
1813
  typeOptions: { loadOptionsMethod: 'getWebhooks' },
@@ -1828,7 +1816,7 @@ class SendIt {
1828
1816
  displayOptions: {
1829
1817
  show: { resource: ['webhooks'], operation: ['get', 'update', 'testWebhook'] },
1830
1818
  },
1831
- description: 'Choose from the list, or specify an ID using an expression.',
1819
+ description: 'Choose from the list, or specify an ID using an expression. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
1832
1820
  },
1833
1821
  {
1834
1822
  displayName: 'Webhook URL',
@@ -1862,8 +1850,8 @@ class SendIt {
1862
1850
  options: [
1863
1851
  { name: 'All Statuses', value: '' },
1864
1852
  { name: 'Dead', value: 'dead' },
1865
- { name: 'Requeued', value: 'requeued' },
1866
1853
  { name: 'Discarded', value: 'discarded' },
1854
+ { name: 'Requeued', value: 'requeued' },
1867
1855
  ],
1868
1856
  default: '',
1869
1857
  displayOptions: { show: { resource: ['deadLetter'], operation: ['list'] } },
@@ -1879,14 +1867,14 @@ class SendIt {
1879
1867
  description: 'Maximum number of dead letter posts to return',
1880
1868
  },
1881
1869
  {
1882
- displayName: 'Dead Letter Post',
1870
+ displayName: 'Dead Letter Post Name or ID',
1883
1871
  name: 'deadLetterId',
1884
1872
  type: 'options',
1885
1873
  typeOptions: { loadOptionsMethod: 'getDeadLetterPosts' },
1886
1874
  default: '',
1887
1875
  required: true,
1888
1876
  displayOptions: { show: { resource: ['deadLetter'], operation: ['requeue', 'discard'] } },
1889
- description: 'Choose from the list, or specify an ID using an expression.',
1877
+ description: 'Choose from the list, or specify an ID using an expression. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
1890
1878
  },
1891
1879
  // ===== Audit log fields =====
1892
1880
  {
@@ -2071,11 +2059,11 @@ class SendIt {
2071
2059
  name: 'advancedMethod',
2072
2060
  type: 'options',
2073
2061
  options: [
2062
+ { name: 'DELETE', value: 'DELETE' },
2074
2063
  { name: 'GET', value: 'GET' },
2075
- { name: 'POST', value: 'POST' },
2076
2064
  { name: 'PATCH', value: 'PATCH' },
2065
+ { name: 'POST', value: 'POST' },
2077
2066
  { name: 'PUT', value: 'PUT' },
2078
- { name: 'DELETE', value: 'DELETE' },
2079
2067
  ],
2080
2068
  default: 'GET',
2081
2069
  required: true,
@@ -2114,16 +2102,16 @@ class SendIt {
2114
2102
  name: 'advancedResponseMode',
2115
2103
  type: 'options',
2116
2104
  options: [
2105
+ { name: 'Binary', value: 'binary' },
2117
2106
  { name: 'JSON', value: 'json' },
2118
2107
  { name: 'Text', value: 'text' },
2119
- { name: 'Binary', value: 'binary' },
2120
2108
  ],
2121
2109
  default: 'json',
2122
2110
  displayOptions: { show: { resource: ['advanced'], operation: ['apiRequest'] } },
2123
2111
  description: 'How to decode the response payload',
2124
2112
  },
2125
2113
  {
2126
- displayName: 'Request Timeout (ms)',
2114
+ displayName: 'Request Timeout (Ms)',
2127
2115
  name: 'requestTimeoutMs',
2128
2116
  type: 'number',
2129
2117
  default: 30000,
@@ -2131,6 +2119,7 @@ class SendIt {
2131
2119
  description: 'Request timeout in milliseconds',
2132
2120
  },
2133
2121
  ],
2122
+ usableAsTool: true,
2134
2123
  };
2135
2124
  this.methods = {
2136
2125
  loadOptions: {
@@ -2296,7 +2285,8 @@ class SendIt {
2296
2285
  });
2297
2286
  continue;
2298
2287
  }
2299
- throw error;
2288
+ const message = error instanceof Error ? error.message : 'SendIt operation failed';
2289
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), message);
2300
2290
  }
2301
2291
  }
2302
2292
  return [returnData];
@@ -189,7 +189,7 @@ class SendItTrigger {
189
189
  name: 'SendIt Trigger',
190
190
  },
191
191
  inputs: [],
192
- outputs: ['main'],
192
+ outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
193
193
  credentials: [
194
194
  {
195
195
  name: 'sendItApi',
@@ -222,6 +222,7 @@ class SendItTrigger {
222
222
  description: 'Optional custom event string that overrides Event if set',
223
223
  },
224
224
  ],
225
+ usableAsTool: true,
225
226
  };
226
227
  this.webhookMethods = {
227
228
  default: {
@@ -22,7 +22,7 @@ const handleAdvanced = async (context, operation, i, optionalHeaders) => {
22
22
  const parsedQuery = (0, helpers_1.parseJsonInput)(context, queryJson, 'Query JSON');
23
23
  const parsedBody = (0, helpers_1.parseJsonInput)(context, bodyJson, 'Body JSON');
24
24
  const qs = parsedQuery
25
- ? (0, helpers_1.assertObject)(parsedQuery, 'Query JSON must parse to an object')
25
+ ? (0, helpers_1.assertObject)(context, parsedQuery, 'Query JSON must parse to an object')
26
26
  : undefined;
27
27
  const body = parsedBody === undefined ? undefined : parsedBody;
28
28
  return (0, helpers_1.sendRequest)(context, {
@@ -15,7 +15,7 @@ const handleConnect = async (context, operation, i, optionalHeaders) => {
15
15
  const platform = context.getNodeParameter('connectPlatform', i);
16
16
  const credentialsJson = context.getNodeParameter('connectCredentialsJson', i);
17
17
  const parsed = (0, helpers_1.parseJsonInput)(context, credentialsJson, 'Credentials JSON');
18
- const credentials = (0, helpers_1.assertObject)(parsed, 'Credentials JSON must parse to an object');
18
+ const credentials = (0, helpers_1.assertObject)(context, parsed, 'Credentials JSON must parse to an object');
19
19
  return (0, helpers_1.sendRequest)(context, {
20
20
  method: 'POST',
21
21
  url: '/connect/token',
@@ -29,7 +29,7 @@ const handleConnect = async (context, operation, i, optionalHeaders) => {
29
29
  const metadataJson = context.getNodeParameter('connectMetadataJson', i);
30
30
  const parsedMetadata = (0, helpers_1.parseJsonInput)(context, metadataJson, 'Metadata JSON');
31
31
  const metadata = parsedMetadata
32
- ? (0, helpers_1.assertObject)(parsedMetadata, 'Metadata JSON must parse to an object')
32
+ ? (0, helpers_1.assertObject)(context, parsedMetadata, 'Metadata JSON must parse to an object')
33
33
  : undefined;
34
34
  return (0, helpers_1.sendRequest)(context, {
35
35
  method: 'POST',
@@ -10,7 +10,7 @@ export declare function sendRequest(context: IExecuteFunctions, request: {
10
10
  url: string;
11
11
  [key: string]: unknown;
12
12
  }, optionalHeaders: Record<string, string>, baseURL?: string): Promise<unknown>;
13
- export declare function assertObject(value: unknown, message: string): Record<string, unknown>;
13
+ export declare function assertObject(context: IExecuteFunctions, value: unknown, message: string): Record<string, unknown>;
14
14
  export interface AiOptions {
15
15
  hashtags?: string;
16
16
  tone?: string;
@@ -112,12 +112,12 @@ async function sendRequest(context, request, optionalHeaders, baseURL = constant
112
112
  description: `The API rejected the request to ${request.method} ${request.url}. Check your parameters.`,
113
113
  });
114
114
  }
115
- throw error;
115
+ throw new n8n_workflow_1.NodeApiError(context.getNode(), error);
116
116
  }
117
117
  }
118
- function assertObject(value, message) {
118
+ function assertObject(context, value, message) {
119
119
  if (!value || typeof value !== 'object' || Array.isArray(value)) {
120
- throw new Error(message);
120
+ throw new n8n_workflow_1.NodeOperationError(context.getNode(), message);
121
121
  }
122
122
  return value;
123
123
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-sendit",
3
- "version": "1.3.1",
3
+ "version": "1.3.2",
4
4
  "description": "n8n community node for SendIt - Multi-platform social media publishing",
5
5
  "keywords": [
6
6
  "n8n-community-node-package",
@@ -27,7 +27,7 @@
27
27
  "main": "index.js",
28
28
  "scripts": {
29
29
  "build": "tsc && npm run copy:icons",
30
- "copy:icons": "mkdir -p dist/nodes/SendIt && cp nodes/SendIt/*.svg dist/nodes/SendIt/",
30
+ "copy:icons": "mkdir -p dist/nodes/SendIt dist/credentials && cp nodes/SendIt/*.svg dist/nodes/SendIt/ && cp nodes/SendIt/*.svg dist/credentials/",
31
31
  "dev": "tsc --watch",
32
32
  "format": "prettier nodes credentials --write",
33
33
  "lint": "eslint nodes credentials --fix",
@@ -59,7 +59,7 @@
59
59
  "@typescript-eslint/eslint-plugin": "^8.19.0",
60
60
  "@typescript-eslint/parser": "^8.19.0",
61
61
  "eslint": "^9.17.0",
62
- "n8n-workflow": "^1.0.0",
62
+ "n8n-workflow": "^2.16.0",
63
63
  "prettier": "^3.1.0",
64
64
  "typescript": "^5.3.0",
65
65
  "vitest": "^2.1.9"