@seranking/n8n-nodes-seranking 1.3.7 → 1.3.8

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.
@@ -33,45 +33,36 @@ async function DomainAnalysisOperations(index) {
33
33
  }
34
34
  const response = await apiRequest_1.apiRequest.call(this, method, endpoint, {}, params, index);
35
35
  if (Array.isArray(response)) {
36
- return response.map(item => ({
37
- ...item,
38
- _domain: (0, validators_1.validateDomain)(domain)
39
- }));
36
+ return response.map(item => ({ ...item, _domain: (0, validators_1.validateDomain)(domain) }));
40
37
  }
41
38
  else if (typeof response === 'object' && response !== null) {
42
- return {
43
- ...response,
44
- _domain: (0, validators_1.validateDomain)(domain)
45
- };
39
+ return { ...response, _domain: (0, validators_1.validateDomain)(domain) };
46
40
  }
47
41
  return response;
48
42
  }
49
43
  case 'getWorldwideAggregateUrl': {
50
44
  const url = this.getNodeParameter('url', index);
51
- const additionalFields = this.getNodeParameter('additionalFields', index, {});
52
- if (!url || url.trim() === '') {
45
+ const additionalOptions = this.getNodeParameter('additionalOptions', index, {});
46
+ if (!url || url.trim() === '')
53
47
  throw new Error('URL cannot be empty');
54
- }
55
- if (!url.match(/^https?:\/\//i)) {
48
+ if (!url.match(/^https?:\/\//i))
56
49
  throw new Error('URL must include http:// or https://');
57
- }
58
50
  endpoint = '/domain/overview/worldwide/url';
59
51
  params.url = url.trim();
60
- if (additionalFields.fields)
61
- params.fields = additionalFields.fields.join(',');
52
+ if (additionalOptions.fields)
53
+ params.fields = additionalOptions.fields.join(',');
62
54
  break;
63
55
  }
64
56
  case 'getDomainPages': {
65
57
  const target = this.getNodeParameter('target', index);
66
58
  const source = this.getNodeParameter('source', index);
67
59
  const type = this.getNodeParameter('type', index);
68
- const scope = this.getNodeParameter('scope', index, 'base_domain');
69
60
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
70
61
  endpoint = '/domain/pages';
71
62
  params.target = (0, validators_1.validateDomain)(target);
72
63
  params.source = (0, validators_1.validateSource)(source);
73
64
  params.type = type;
74
- params.scope = scope;
65
+ params.scope = additionalFields.scope || 'base_domain';
75
66
  if (additionalFields.limit)
76
67
  params.limit = additionalFields.limit;
77
68
  if (additionalFields.offset)
@@ -80,36 +71,46 @@ async function DomainAnalysisOperations(index) {
80
71
  params.order_field = additionalFields.orderField;
81
72
  if (additionalFields.orderType)
82
73
  params.order_type = additionalFields.orderType;
83
- if (additionalFields.filterDomainUrl)
74
+ if (additionalFields.filterDomainUrl) {
84
75
  params['filter[domain_url]'] = additionalFields.filterDomainUrl;
85
- if (additionalFields.trafficPercentFrom)
86
- params['filter[domain_traffic_percent][from]'] = additionalFields.trafficPercentFrom;
87
- if (additionalFields.trafficPercentTo)
88
- params['filter[domain_traffic_percent][to]'] = additionalFields.trafficPercentTo;
89
- if (additionalFields.keywordsCountFrom)
90
- params['filter[keywords_count][from]'] = additionalFields.keywordsCountFrom;
91
- if (additionalFields.keywordsCountTo)
92
- params['filter[keywords_count][to]'] = additionalFields.keywordsCountTo;
93
- if (additionalFields.trafficSumFrom)
94
- params['filter[traffic_sum][from]'] = additionalFields.trafficSumFrom;
95
- if (additionalFields.trafficSumTo)
96
- params['filter[traffic_sum][to]'] = additionalFields.trafficSumTo;
97
- if (additionalFields.priceSumFrom)
98
- params['filter[price_sum][from]'] = additionalFields.priceSumFrom;
99
- if (additionalFields.priceSumTo)
100
- params['filter[price_sum][to]'] = additionalFields.priceSumTo;
76
+ }
77
+ if (additionalFields.filterTrafficPercentFrom) {
78
+ params['filter[domain_traffic_percent][from]'] = additionalFields.filterTrafficPercentFrom;
79
+ }
80
+ if (additionalFields.filterTrafficPercentTo) {
81
+ params['filter[domain_traffic_percent][to]'] = additionalFields.filterTrafficPercentTo;
82
+ }
83
+ if (additionalFields.filterKeywordsCountFrom) {
84
+ params['filter[keywords_count][from]'] = additionalFields.filterKeywordsCountFrom;
85
+ }
86
+ if (additionalFields.filterKeywordsCountTo) {
87
+ params['filter[keywords_count][to]'] = additionalFields.filterKeywordsCountTo;
88
+ }
89
+ if (additionalFields.filterTrafficSumFrom) {
90
+ params['filter[traffic_sum][from]'] = additionalFields.filterTrafficSumFrom;
91
+ }
92
+ if (additionalFields.filterTrafficSumTo) {
93
+ params['filter[traffic_sum][to]'] = additionalFields.filterTrafficSumTo;
94
+ }
95
+ if (additionalFields.filterPriceSumFrom) {
96
+ params['filter[price_sum][from]'] = additionalFields.filterPriceSumFrom;
97
+ }
98
+ if (additionalFields.filterPriceSumTo) {
99
+ params['filter[price_sum][to]'] = additionalFields.filterPriceSumTo;
100
+ }
101
101
  break;
102
102
  }
103
103
  case 'getDomainSubdomains': {
104
104
  const target = this.getNodeParameter('target', index);
105
105
  const source = this.getNodeParameter('source', index);
106
+ const scope = this.getNodeParameter('scope', index);
106
107
  const type = this.getNodeParameter('type', index);
107
108
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
108
109
  endpoint = '/domain/subdomains';
109
110
  params.target = (0, validators_1.validateDomain)(target);
110
111
  params.source = (0, validators_1.validateSource)(source);
111
112
  params.type = type;
112
- params.scope = 'base_domain';
113
+ params.scope = scope;
113
114
  if (additionalFields.limit)
114
115
  params.limit = additionalFields.limit;
115
116
  if (additionalFields.offset)
@@ -118,24 +119,33 @@ async function DomainAnalysisOperations(index) {
118
119
  params.order_field = additionalFields.orderField;
119
120
  if (additionalFields.orderType)
120
121
  params.order_type = additionalFields.orderType;
121
- if (additionalFields.filterDomainUrl)
122
+ if (additionalFields.filterDomainUrl) {
122
123
  params['filter[domain_url]'] = additionalFields.filterDomainUrl;
123
- if (additionalFields.trafficPercentFrom)
124
- params['filter[domain_traffic_percent][from]'] = additionalFields.trafficPercentFrom;
125
- if (additionalFields.trafficPercentTo)
126
- params['filter[domain_traffic_percent][to]'] = additionalFields.trafficPercentTo;
127
- if (additionalFields.keywordsCountFrom)
128
- params['filter[keywords_count][from]'] = additionalFields.keywordsCountFrom;
129
- if (additionalFields.keywordsCountTo)
130
- params['filter[keywords_count][to]'] = additionalFields.keywordsCountTo;
131
- if (additionalFields.trafficSumFrom)
132
- params['filter[traffic_sum][from]'] = additionalFields.trafficSumFrom;
133
- if (additionalFields.trafficSumTo)
134
- params['filter[traffic_sum][to]'] = additionalFields.trafficSumTo;
135
- if (additionalFields.priceSumFrom)
136
- params['filter[price_sum][from]'] = additionalFields.priceSumFrom;
137
- if (additionalFields.priceSumTo)
138
- params['filter[price_sum][to]'] = additionalFields.priceSumTo;
124
+ }
125
+ if (additionalFields.filterTrafficPercentFrom) {
126
+ params['filter[domain_traffic_percent][from]'] = additionalFields.filterTrafficPercentFrom;
127
+ }
128
+ if (additionalFields.filterTrafficPercentTo) {
129
+ params['filter[domain_traffic_percent][to]'] = additionalFields.filterTrafficPercentTo;
130
+ }
131
+ if (additionalFields.filterKeywordsCountFrom) {
132
+ params['filter[keywords_count][from]'] = additionalFields.filterKeywordsCountFrom;
133
+ }
134
+ if (additionalFields.filterKeywordsCountTo) {
135
+ params['filter[keywords_count][to]'] = additionalFields.filterKeywordsCountTo;
136
+ }
137
+ if (additionalFields.filterTrafficSumFrom) {
138
+ params['filter[traffic_sum][from]'] = additionalFields.filterTrafficSumFrom;
139
+ }
140
+ if (additionalFields.filterTrafficSumTo) {
141
+ params['filter[traffic_sum][to]'] = additionalFields.filterTrafficSumTo;
142
+ }
143
+ if (additionalFields.filterPriceSumFrom) {
144
+ params['filter[price_sum][from]'] = additionalFields.filterPriceSumFrom;
145
+ }
146
+ if (additionalFields.filterPriceSumTo) {
147
+ params['filter[price_sum][to]'] = additionalFields.filterPriceSumTo;
148
+ }
139
149
  break;
140
150
  }
141
151
  case 'getOverviewHistory': {
@@ -157,31 +167,77 @@ async function DomainAnalysisOperations(index) {
157
167
  params.source = (0, validators_1.validateSource)(source);
158
168
  params.domain = (0, validators_1.validateDomain)(domain);
159
169
  params.type = type;
170
+ if (additionalFields.page)
171
+ params.page = additionalFields.page;
160
172
  if (additionalFields.limit)
161
173
  params.limit = additionalFields.limit;
162
- if (additionalFields.offset)
163
- params.offset = additionalFields.offset;
164
174
  if (additionalFields.withSubdomains !== undefined) {
165
175
  params.with_subdomains = additionalFields.withSubdomains ? 1 : 0;
166
176
  }
167
177
  if (additionalFields.cols)
168
- params.cols = additionalFields.cols.join(',');
178
+ params.cols = additionalFields.cols;
169
179
  if (additionalFields.orderField)
170
180
  params.order_field = additionalFields.orderField;
171
181
  if (additionalFields.orderType)
172
182
  params.order_type = additionalFields.orderType;
183
+ if (additionalFields.posChange)
184
+ params.pos_change = additionalFields.posChange;
173
185
  if (additionalFields.volumeFrom)
174
186
  params['filter[volume][from]'] = additionalFields.volumeFrom;
175
187
  if (additionalFields.volumeTo)
176
188
  params['filter[volume][to]'] = additionalFields.volumeTo;
189
+ if (additionalFields.trafficFrom)
190
+ params['filter[traffic][from]'] = additionalFields.trafficFrom;
191
+ if (additionalFields.trafficTo)
192
+ params['filter[traffic][to]'] = additionalFields.trafficTo;
193
+ if (additionalFields.trafficPercentFrom) {
194
+ params['filter[traffic_percent][from]'] = additionalFields.trafficPercentFrom;
195
+ }
196
+ if (additionalFields.trafficPercentTo) {
197
+ params['filter[traffic_percent][to]'] = additionalFields.trafficPercentTo;
198
+ }
177
199
  if (additionalFields.positionFrom)
178
200
  params['filter[position][from]'] = additionalFields.positionFrom;
179
201
  if (additionalFields.positionTo)
180
202
  params['filter[position][to]'] = additionalFields.positionTo;
203
+ if (additionalFields.keywordCountFrom) {
204
+ params['filter[keyword_count][from]'] = additionalFields.keywordCountFrom;
205
+ }
206
+ if (additionalFields.keywordCountTo) {
207
+ params['filter[keyword_count][to]'] = additionalFields.keywordCountTo;
208
+ }
209
+ if (additionalFields.charactersCountFrom) {
210
+ params['filter[characters_count][from]'] = additionalFields.charactersCountFrom;
211
+ }
212
+ if (additionalFields.charactersCountTo) {
213
+ params['filter[characters_count][to]'] = additionalFields.charactersCountTo;
214
+ }
181
215
  if (additionalFields.cpcFrom)
182
216
  params['filter[cpc][from]'] = additionalFields.cpcFrom;
183
217
  if (additionalFields.cpcTo)
184
218
  params['filter[cpc][to]'] = additionalFields.cpcTo;
219
+ if (additionalFields.priceFrom)
220
+ params['filter[price][from]'] = additionalFields.priceFrom;
221
+ if (additionalFields.priceTo)
222
+ params['filter[price][to]'] = additionalFields.priceTo;
223
+ if (additionalFields.competitionFrom) {
224
+ params['filter[competition][from]'] = additionalFields.competitionFrom;
225
+ }
226
+ if (additionalFields.competitionTo) {
227
+ params['filter[competition][to]'] = additionalFields.competitionTo;
228
+ }
229
+ if (additionalFields.difficultyFrom) {
230
+ params['filter[difficulty][from]'] = additionalFields.difficultyFrom;
231
+ }
232
+ if (additionalFields.difficultyTo) {
233
+ params['filter[difficulty][to]'] = additionalFields.difficultyTo;
234
+ }
235
+ if (additionalFields.serpFeatures) {
236
+ params['filter[serp_features]'] = additionalFields.serpFeatures;
237
+ }
238
+ if (additionalFields.intents && additionalFields.intents.length > 0) {
239
+ params['filter[intents]'] = additionalFields.intents.join(',');
240
+ }
185
241
  break;
186
242
  }
187
243
  case 'getKeywordsComparison': {
@@ -195,12 +251,12 @@ async function DomainAnalysisOperations(index) {
195
251
  params.domain = (0, validators_1.validateDomain)(domain);
196
252
  params.compare = (0, validators_1.validateDomain)(compareDomain);
197
253
  params.type = type;
254
+ if (additionalFields.page)
255
+ params.page = additionalFields.page;
198
256
  if (additionalFields.limit)
199
257
  params.limit = additionalFields.limit;
200
- if (additionalFields.offset)
201
- params.offset = additionalFields.offset;
202
258
  if (additionalFields.cols)
203
- params.cols = additionalFields.cols.join(',');
259
+ params.cols = additionalFields.cols;
204
260
  if (additionalFields.orderField)
205
261
  params.order_field = additionalFields.orderField;
206
262
  if (additionalFields.orderType)
@@ -234,9 +290,8 @@ async function DomainAnalysisOperations(index) {
234
290
  const keyword = this.getNodeParameter('keyword', index);
235
291
  const source = this.getNodeParameter('source', index);
236
292
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
237
- if (!keyword || keyword.trim() === '') {
293
+ if (!keyword || keyword.trim() === '')
238
294
  throw new Error('Keyword cannot be empty');
239
- }
240
295
  endpoint = '/domain/ads';
241
296
  params.source = (0, validators_1.validateSource)(source);
242
297
  params.keyword = keyword.trim();
@@ -3,6 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.KeywordResearchOperations = KeywordResearchOperations;
4
4
  const apiRequest_1 = require("../../utils/apiRequest");
5
5
  const validators_1 = require("../../utils/validators");
6
+ function buildMultiKeywordFilter(csv) {
7
+ return csv
8
+ .split(',')
9
+ .map((w) => w.trim())
10
+ .filter(Boolean)
11
+ .map((word) => [{ type: 'contains', value: word }]);
12
+ }
6
13
  async function KeywordResearchOperations(index) {
7
14
  const operation = this.getNodeParameter('operation', index);
8
15
  let endpoint = '';
@@ -34,9 +41,8 @@ async function KeywordResearchOperations(index) {
34
41
  const source = this.getNodeParameter('source', index);
35
42
  const keyword = this.getNodeParameter('keyword', index);
36
43
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
37
- if (!keyword || keyword.trim() === '') {
44
+ if (!keyword || keyword.trim() === '')
38
45
  throw new Error('Keyword cannot be empty');
39
- }
40
46
  endpoint = '/keywords/similar';
41
47
  params.source = (0, validators_1.validateSource)(source);
42
48
  params.keyword = keyword.trim();
@@ -55,27 +61,54 @@ async function KeywordResearchOperations(index) {
55
61
  params['filter[volume][from]'] = additionalFields.volumeFrom;
56
62
  if (additionalFields.volumeTo)
57
63
  params['filter[volume][to]'] = additionalFields.volumeTo;
58
- if (additionalFields.difficultyFrom)
64
+ if (additionalFields.difficultyFrom) {
59
65
  params['filter[difficulty][from]'] = additionalFields.difficultyFrom;
60
- if (additionalFields.difficultyTo)
66
+ }
67
+ if (additionalFields.difficultyTo) {
61
68
  params['filter[difficulty][to]'] = additionalFields.difficultyTo;
69
+ }
62
70
  if (additionalFields.cpcFrom)
63
71
  params['filter[cpc][from]'] = additionalFields.cpcFrom;
64
72
  if (additionalFields.cpcTo)
65
73
  params['filter[cpc][to]'] = additionalFields.cpcTo;
66
- if (additionalFields.competitionFrom)
74
+ if (additionalFields.competitionFrom) {
67
75
  params['filter[competition][from]'] = additionalFields.competitionFrom;
68
- if (additionalFields.competitionTo)
76
+ }
77
+ if (additionalFields.competitionTo) {
69
78
  params['filter[competition][to]'] = additionalFields.competitionTo;
79
+ }
80
+ if (additionalFields.keywordCountFrom) {
81
+ params['filter[keyword_count][from]'] = additionalFields.keywordCountFrom;
82
+ }
83
+ if (additionalFields.keywordCountTo) {
84
+ params['filter[keyword_count][to]'] = additionalFields.keywordCountTo;
85
+ }
86
+ if (additionalFields.charactersCountFrom) {
87
+ params['filter[characters_count][from]'] = additionalFields.charactersCountFrom;
88
+ }
89
+ if (additionalFields.charactersCountTo) {
90
+ params['filter[characters_count][to]'] = additionalFields.charactersCountTo;
91
+ }
92
+ if (additionalFields.serpFeatures) {
93
+ params['filter[serp_features]'] = additionalFields.serpFeatures;
94
+ }
95
+ if (additionalFields.intents && additionalFields.intents.length > 0) {
96
+ params['filter[intents]'] = additionalFields.intents.join(',');
97
+ }
98
+ if (additionalFields.multiKeywordIncluded) {
99
+ params['filter[multi_keyword_included]'] = JSON.stringify(buildMultiKeywordFilter(additionalFields.multiKeywordIncluded));
100
+ }
101
+ if (additionalFields.multiKeywordExcluded) {
102
+ params['filter[multi_keyword_excluded]'] = JSON.stringify(buildMultiKeywordFilter(additionalFields.multiKeywordExcluded));
103
+ }
70
104
  break;
71
105
  }
72
106
  case 'getRelated': {
73
107
  const source = this.getNodeParameter('source', index);
74
108
  const keyword = this.getNodeParameter('keyword', index);
75
109
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
76
- if (!keyword || keyword.trim() === '') {
110
+ if (!keyword || keyword.trim() === '')
77
111
  throw new Error('Keyword cannot be empty');
78
- }
79
112
  endpoint = '/keywords/related';
80
113
  params.source = (0, validators_1.validateSource)(source);
81
114
  params.keyword = keyword.trim();
@@ -94,27 +127,54 @@ async function KeywordResearchOperations(index) {
94
127
  params['filter[volume][from]'] = additionalFields.volumeFrom;
95
128
  if (additionalFields.volumeTo)
96
129
  params['filter[volume][to]'] = additionalFields.volumeTo;
97
- if (additionalFields.difficultyFrom)
130
+ if (additionalFields.difficultyFrom) {
98
131
  params['filter[difficulty][from]'] = additionalFields.difficultyFrom;
99
- if (additionalFields.difficultyTo)
132
+ }
133
+ if (additionalFields.difficultyTo) {
100
134
  params['filter[difficulty][to]'] = additionalFields.difficultyTo;
135
+ }
101
136
  if (additionalFields.cpcFrom)
102
137
  params['filter[cpc][from]'] = additionalFields.cpcFrom;
103
138
  if (additionalFields.cpcTo)
104
139
  params['filter[cpc][to]'] = additionalFields.cpcTo;
105
- if (additionalFields.competitionFrom)
140
+ if (additionalFields.competitionFrom) {
106
141
  params['filter[competition][from]'] = additionalFields.competitionFrom;
107
- if (additionalFields.competitionTo)
142
+ }
143
+ if (additionalFields.competitionTo) {
108
144
  params['filter[competition][to]'] = additionalFields.competitionTo;
145
+ }
146
+ if (additionalFields.keywordCountFrom) {
147
+ params['filter[keyword_count][from]'] = additionalFields.keywordCountFrom;
148
+ }
149
+ if (additionalFields.keywordCountTo) {
150
+ params['filter[keyword_count][to]'] = additionalFields.keywordCountTo;
151
+ }
152
+ if (additionalFields.charactersCountFrom) {
153
+ params['filter[characters_count][from]'] = additionalFields.charactersCountFrom;
154
+ }
155
+ if (additionalFields.charactersCountTo) {
156
+ params['filter[characters_count][to]'] = additionalFields.charactersCountTo;
157
+ }
158
+ if (additionalFields.serpFeatures) {
159
+ params['filter[serp_features]'] = additionalFields.serpFeatures;
160
+ }
161
+ if (additionalFields.intents && additionalFields.intents.length > 0) {
162
+ params['filter[intents]'] = additionalFields.intents.join(',');
163
+ }
164
+ if (additionalFields.multiKeywordIncluded) {
165
+ params['filter[multi_keyword_included]'] = JSON.stringify(buildMultiKeywordFilter(additionalFields.multiKeywordIncluded));
166
+ }
167
+ if (additionalFields.multiKeywordExcluded) {
168
+ params['filter[multi_keyword_excluded]'] = JSON.stringify(buildMultiKeywordFilter(additionalFields.multiKeywordExcluded));
169
+ }
109
170
  break;
110
171
  }
111
172
  case 'getQuestions': {
112
173
  const source = this.getNodeParameter('source', index);
113
174
  const keyword = this.getNodeParameter('keyword', index);
114
175
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
115
- if (!keyword || keyword.trim() === '') {
176
+ if (!keyword || keyword.trim() === '')
116
177
  throw new Error('Keyword cannot be empty');
117
- }
118
178
  endpoint = '/keywords/questions';
119
179
  params.source = (0, validators_1.validateSource)(source);
120
180
  params.keyword = keyword.trim();
@@ -133,19 +193,54 @@ async function KeywordResearchOperations(index) {
133
193
  params['filter[volume][from]'] = additionalFields.volumeFrom;
134
194
  if (additionalFields.volumeTo)
135
195
  params['filter[volume][to]'] = additionalFields.volumeTo;
136
- if (additionalFields.difficultyFrom)
196
+ if (additionalFields.difficultyFrom) {
137
197
  params['filter[difficulty][from]'] = additionalFields.difficultyFrom;
138
- if (additionalFields.difficultyTo)
198
+ }
199
+ if (additionalFields.difficultyTo) {
139
200
  params['filter[difficulty][to]'] = additionalFields.difficultyTo;
201
+ }
202
+ if (additionalFields.cpcFrom)
203
+ params['filter[cpc][from]'] = additionalFields.cpcFrom;
204
+ if (additionalFields.cpcTo)
205
+ params['filter[cpc][to]'] = additionalFields.cpcTo;
206
+ if (additionalFields.competitionFrom) {
207
+ params['filter[competition][from]'] = additionalFields.competitionFrom;
208
+ }
209
+ if (additionalFields.competitionTo) {
210
+ params['filter[competition][to]'] = additionalFields.competitionTo;
211
+ }
212
+ if (additionalFields.keywordCountFrom) {
213
+ params['filter[keyword_count][from]'] = additionalFields.keywordCountFrom;
214
+ }
215
+ if (additionalFields.keywordCountTo) {
216
+ params['filter[keyword_count][to]'] = additionalFields.keywordCountTo;
217
+ }
218
+ if (additionalFields.charactersCountFrom) {
219
+ params['filter[characters_count][from]'] = additionalFields.charactersCountFrom;
220
+ }
221
+ if (additionalFields.charactersCountTo) {
222
+ params['filter[characters_count][to]'] = additionalFields.charactersCountTo;
223
+ }
224
+ if (additionalFields.serpFeatures) {
225
+ params['filter[serp_features]'] = additionalFields.serpFeatures;
226
+ }
227
+ if (additionalFields.intents && additionalFields.intents.length > 0) {
228
+ params['filter[intents]'] = additionalFields.intents.join(',');
229
+ }
230
+ if (additionalFields.multiKeywordIncluded) {
231
+ params['filter[multi_keyword_included]'] = JSON.stringify(buildMultiKeywordFilter(additionalFields.multiKeywordIncluded));
232
+ }
233
+ if (additionalFields.multiKeywordExcluded) {
234
+ params['filter[multi_keyword_excluded]'] = JSON.stringify(buildMultiKeywordFilter(additionalFields.multiKeywordExcluded));
235
+ }
140
236
  break;
141
237
  }
142
238
  case 'getLongtail': {
143
239
  const source = this.getNodeParameter('source', index);
144
240
  const keyword = this.getNodeParameter('keyword', index);
145
241
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
146
- if (!keyword || keyword.trim() === '') {
242
+ if (!keyword || keyword.trim() === '')
147
243
  throw new Error('Keyword cannot be empty');
148
- }
149
244
  endpoint = '/keywords/longtail';
150
245
  params.source = (0, validators_1.validateSource)(source);
151
246
  params.keyword = keyword.trim();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seranking/n8n-nodes-seranking",
3
- "version": "1.3.7",
3
+ "version": "1.3.8",
4
4
  "description": "n8n connector for SE Ranking API - AI Search, Backlinks, Domain Analysis, Keyword Research, and Website Audit",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/seranking/n8n-nodes-seranking",