@seranking/n8n-nodes-seranking 1.3.7 → 1.3.9

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.
@@ -3,6 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DomainAnalysisOperations = DomainAnalysisOperations;
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 DomainAnalysisOperations(index) {
7
14
  const operation = this.getNodeParameter('operation', index);
8
15
  let endpoint = '';
@@ -33,45 +40,36 @@ async function DomainAnalysisOperations(index) {
33
40
  }
34
41
  const response = await apiRequest_1.apiRequest.call(this, method, endpoint, {}, params, index);
35
42
  if (Array.isArray(response)) {
36
- return response.map(item => ({
37
- ...item,
38
- _domain: (0, validators_1.validateDomain)(domain)
39
- }));
43
+ return response.map(item => ({ ...item, _domain: (0, validators_1.validateDomain)(domain) }));
40
44
  }
41
45
  else if (typeof response === 'object' && response !== null) {
42
- return {
43
- ...response,
44
- _domain: (0, validators_1.validateDomain)(domain)
45
- };
46
+ return { ...response, _domain: (0, validators_1.validateDomain)(domain) };
46
47
  }
47
48
  return response;
48
49
  }
49
50
  case 'getWorldwideAggregateUrl': {
50
51
  const url = this.getNodeParameter('url', index);
51
- const additionalFields = this.getNodeParameter('additionalFields', index, {});
52
- if (!url || url.trim() === '') {
52
+ const additionalOptions = this.getNodeParameter('additionalOptions', index, {});
53
+ if (!url || url.trim() === '')
53
54
  throw new Error('URL cannot be empty');
54
- }
55
- if (!url.match(/^https?:\/\//i)) {
55
+ if (!url.match(/^https?:\/\//i))
56
56
  throw new Error('URL must include http:// or https://');
57
- }
58
57
  endpoint = '/domain/overview/worldwide/url';
59
58
  params.url = url.trim();
60
- if (additionalFields.fields)
61
- params.fields = additionalFields.fields.join(',');
59
+ if (additionalOptions.fields)
60
+ params.fields = additionalOptions.fields.join(',');
62
61
  break;
63
62
  }
64
63
  case 'getDomainPages': {
65
64
  const target = this.getNodeParameter('target', index);
66
65
  const source = this.getNodeParameter('source', index);
67
66
  const type = this.getNodeParameter('type', index);
68
- const scope = this.getNodeParameter('scope', index, 'base_domain');
69
67
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
70
68
  endpoint = '/domain/pages';
71
69
  params.target = (0, validators_1.validateDomain)(target);
72
70
  params.source = (0, validators_1.validateSource)(source);
73
71
  params.type = type;
74
- params.scope = scope;
72
+ params.scope = additionalFields.scope || 'base_domain';
75
73
  if (additionalFields.limit)
76
74
  params.limit = additionalFields.limit;
77
75
  if (additionalFields.offset)
@@ -80,36 +78,46 @@ async function DomainAnalysisOperations(index) {
80
78
  params.order_field = additionalFields.orderField;
81
79
  if (additionalFields.orderType)
82
80
  params.order_type = additionalFields.orderType;
83
- if (additionalFields.filterDomainUrl)
81
+ if (additionalFields.filterDomainUrl) {
84
82
  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;
83
+ }
84
+ if (additionalFields.filterTrafficPercentFrom) {
85
+ params['filter[domain_traffic_percent][from]'] = additionalFields.filterTrafficPercentFrom;
86
+ }
87
+ if (additionalFields.filterTrafficPercentTo) {
88
+ params['filter[domain_traffic_percent][to]'] = additionalFields.filterTrafficPercentTo;
89
+ }
90
+ if (additionalFields.filterKeywordsCountFrom) {
91
+ params['filter[keywords_count][from]'] = additionalFields.filterKeywordsCountFrom;
92
+ }
93
+ if (additionalFields.filterKeywordsCountTo) {
94
+ params['filter[keywords_count][to]'] = additionalFields.filterKeywordsCountTo;
95
+ }
96
+ if (additionalFields.filterTrafficSumFrom) {
97
+ params['filter[traffic_sum][from]'] = additionalFields.filterTrafficSumFrom;
98
+ }
99
+ if (additionalFields.filterTrafficSumTo) {
100
+ params['filter[traffic_sum][to]'] = additionalFields.filterTrafficSumTo;
101
+ }
102
+ if (additionalFields.filterPriceSumFrom) {
103
+ params['filter[price_sum][from]'] = additionalFields.filterPriceSumFrom;
104
+ }
105
+ if (additionalFields.filterPriceSumTo) {
106
+ params['filter[price_sum][to]'] = additionalFields.filterPriceSumTo;
107
+ }
101
108
  break;
102
109
  }
103
110
  case 'getDomainSubdomains': {
104
111
  const target = this.getNodeParameter('target', index);
105
112
  const source = this.getNodeParameter('source', index);
113
+ const scope = this.getNodeParameter('scope', index);
106
114
  const type = this.getNodeParameter('type', index);
107
115
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
108
116
  endpoint = '/domain/subdomains';
109
117
  params.target = (0, validators_1.validateDomain)(target);
110
118
  params.source = (0, validators_1.validateSource)(source);
111
119
  params.type = type;
112
- params.scope = 'base_domain';
120
+ params.scope = scope;
113
121
  if (additionalFields.limit)
114
122
  params.limit = additionalFields.limit;
115
123
  if (additionalFields.offset)
@@ -118,24 +126,33 @@ async function DomainAnalysisOperations(index) {
118
126
  params.order_field = additionalFields.orderField;
119
127
  if (additionalFields.orderType)
120
128
  params.order_type = additionalFields.orderType;
121
- if (additionalFields.filterDomainUrl)
129
+ if (additionalFields.filterDomainUrl) {
122
130
  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;
131
+ }
132
+ if (additionalFields.filterTrafficPercentFrom) {
133
+ params['filter[domain_traffic_percent][from]'] = additionalFields.filterTrafficPercentFrom;
134
+ }
135
+ if (additionalFields.filterTrafficPercentTo) {
136
+ params['filter[domain_traffic_percent][to]'] = additionalFields.filterTrafficPercentTo;
137
+ }
138
+ if (additionalFields.filterKeywordsCountFrom) {
139
+ params['filter[keywords_count][from]'] = additionalFields.filterKeywordsCountFrom;
140
+ }
141
+ if (additionalFields.filterKeywordsCountTo) {
142
+ params['filter[keywords_count][to]'] = additionalFields.filterKeywordsCountTo;
143
+ }
144
+ if (additionalFields.filterTrafficSumFrom) {
145
+ params['filter[traffic_sum][from]'] = additionalFields.filterTrafficSumFrom;
146
+ }
147
+ if (additionalFields.filterTrafficSumTo) {
148
+ params['filter[traffic_sum][to]'] = additionalFields.filterTrafficSumTo;
149
+ }
150
+ if (additionalFields.filterPriceSumFrom) {
151
+ params['filter[price_sum][from]'] = additionalFields.filterPriceSumFrom;
152
+ }
153
+ if (additionalFields.filterPriceSumTo) {
154
+ params['filter[price_sum][to]'] = additionalFields.filterPriceSumTo;
155
+ }
139
156
  break;
140
157
  }
141
158
  case 'getOverviewHistory': {
@@ -157,31 +174,93 @@ async function DomainAnalysisOperations(index) {
157
174
  params.source = (0, validators_1.validateSource)(source);
158
175
  params.domain = (0, validators_1.validateDomain)(domain);
159
176
  params.type = type;
177
+ if (additionalFields.page)
178
+ params.page = additionalFields.page;
160
179
  if (additionalFields.limit)
161
180
  params.limit = additionalFields.limit;
162
- if (additionalFields.offset)
163
- params.offset = additionalFields.offset;
164
181
  if (additionalFields.withSubdomains !== undefined) {
165
182
  params.with_subdomains = additionalFields.withSubdomains ? 1 : 0;
166
183
  }
167
184
  if (additionalFields.cols)
168
- params.cols = additionalFields.cols.join(',');
185
+ params.cols = additionalFields.cols;
169
186
  if (additionalFields.orderField)
170
187
  params.order_field = additionalFields.orderField;
171
188
  if (additionalFields.orderType)
172
189
  params.order_type = additionalFields.orderType;
190
+ if (additionalFields.posChange)
191
+ params.pos_change = additionalFields.posChange;
173
192
  if (additionalFields.volumeFrom)
174
193
  params['filter[volume][from]'] = additionalFields.volumeFrom;
175
194
  if (additionalFields.volumeTo)
176
195
  params['filter[volume][to]'] = additionalFields.volumeTo;
196
+ if (additionalFields.trafficFrom)
197
+ params['filter[traffic][from]'] = additionalFields.trafficFrom;
198
+ if (additionalFields.trafficTo)
199
+ params['filter[traffic][to]'] = additionalFields.trafficTo;
200
+ if (additionalFields.trafficPercentFrom) {
201
+ params['filter[traffic_percent][from]'] = additionalFields.trafficPercentFrom;
202
+ }
203
+ if (additionalFields.trafficPercentTo) {
204
+ params['filter[traffic_percent][to]'] = additionalFields.trafficPercentTo;
205
+ }
177
206
  if (additionalFields.positionFrom)
178
207
  params['filter[position][from]'] = additionalFields.positionFrom;
179
208
  if (additionalFields.positionTo)
180
209
  params['filter[position][to]'] = additionalFields.positionTo;
210
+ if (additionalFields.keywordCountFrom) {
211
+ params['filter[keyword_count][from]'] = additionalFields.keywordCountFrom;
212
+ }
213
+ if (additionalFields.keywordCountTo) {
214
+ params['filter[keyword_count][to]'] = additionalFields.keywordCountTo;
215
+ }
216
+ if (additionalFields.charactersCountFrom) {
217
+ params['filter[characters_count][from]'] = additionalFields.charactersCountFrom;
218
+ }
219
+ if (additionalFields.charactersCountTo) {
220
+ params['filter[characters_count][to]'] = additionalFields.charactersCountTo;
221
+ }
181
222
  if (additionalFields.cpcFrom)
182
223
  params['filter[cpc][from]'] = additionalFields.cpcFrom;
183
224
  if (additionalFields.cpcTo)
184
225
  params['filter[cpc][to]'] = additionalFields.cpcTo;
226
+ if (additionalFields.priceFrom)
227
+ params['filter[price][from]'] = additionalFields.priceFrom;
228
+ if (additionalFields.priceTo)
229
+ params['filter[price][to]'] = additionalFields.priceTo;
230
+ if (additionalFields.competitionFrom) {
231
+ params['filter[competition][from]'] = additionalFields.competitionFrom;
232
+ }
233
+ if (additionalFields.competitionTo) {
234
+ params['filter[competition][to]'] = additionalFields.competitionTo;
235
+ }
236
+ if (additionalFields.difficultyFrom) {
237
+ params['filter[difficulty][from]'] = additionalFields.difficultyFrom;
238
+ }
239
+ if (additionalFields.difficultyTo) {
240
+ params['filter[difficulty][to]'] = additionalFields.difficultyTo;
241
+ }
242
+ if (additionalFields.serpFeatures) {
243
+ params['filter[serp_features]'] = additionalFields.serpFeatures;
244
+ }
245
+ if (additionalFields.intents && additionalFields.intents.length > 0) {
246
+ params['filter[intents]'] = additionalFields.intents.join(',');
247
+ }
248
+ if (additionalFields.multiKeywordIncluded) {
249
+ params['filter[multi_keyword_included]'] = JSON.stringify(buildMultiKeywordFilter(additionalFields.multiKeywordIncluded));
250
+ }
251
+ if (additionalFields.multiKeywordExcluded) {
252
+ params['filter[multi_keyword_excluded]'] = JSON.stringify(buildMultiKeywordFilter(additionalFields.multiKeywordExcluded));
253
+ }
254
+ if (additionalFields.serpFeatures2Mode && additionalFields.serpFeatures2Value) {
255
+ params['filter[serp_features_2][mode]'] = additionalFields.serpFeatures2Mode;
256
+ additionalFields.serpFeatures2Value
257
+ .split(',')
258
+ .map((v) => v.trim())
259
+ .filter(Boolean)
260
+ .forEach((val, i) => {
261
+ params[`filter[serp_features_2][value][${i}]`] = val;
262
+ });
263
+ }
185
264
  break;
186
265
  }
187
266
  case 'getKeywordsComparison': {
@@ -195,12 +274,12 @@ async function DomainAnalysisOperations(index) {
195
274
  params.domain = (0, validators_1.validateDomain)(domain);
196
275
  params.compare = (0, validators_1.validateDomain)(compareDomain);
197
276
  params.type = type;
277
+ if (additionalFields.page)
278
+ params.page = additionalFields.page;
198
279
  if (additionalFields.limit)
199
280
  params.limit = additionalFields.limit;
200
- if (additionalFields.offset)
201
- params.offset = additionalFields.offset;
202
281
  if (additionalFields.cols)
203
- params.cols = additionalFields.cols.join(',');
282
+ params.cols = additionalFields.cols;
204
283
  if (additionalFields.orderField)
205
284
  params.order_field = additionalFields.orderField;
206
285
  if (additionalFields.orderType)
@@ -234,9 +313,8 @@ async function DomainAnalysisOperations(index) {
234
313
  const keyword = this.getNodeParameter('keyword', index);
235
314
  const source = this.getNodeParameter('source', index);
236
315
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
237
- if (!keyword || keyword.trim() === '') {
316
+ if (!keyword || keyword.trim() === '')
238
317
  throw new Error('Keyword cannot be empty');
239
- }
240
318
  endpoint = '/domain/ads';
241
319
  params.source = (0, validators_1.validateSource)(source);
242
320
  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.9",
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",