@seranking/n8n-nodes-seranking 1.5.13 → 2.0.1

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.
Files changed (26) hide show
  1. package/README.md +60 -29
  2. package/dist/credentials/SeRankingApi.credentials.js +2 -2
  3. package/dist/nodes/SeRanking/SeRanking.node.js +3 -39
  4. package/dist/nodes/SeRanking/projectApi/descriptions/AiResultTrackerDescription.js +11 -0
  5. package/dist/nodes/SeRanking/projectApi/descriptions/BacklinkCheckerDescription.js +14 -0
  6. package/dist/nodes/SeRanking/projectApi/descriptions/ProjectManagementDescription.js +127 -0
  7. package/dist/nodes/SeRanking/projectApi/descriptions/WebsiteAuditDescription.js +107 -1
  8. package/dist/nodes/SeRanking/projectApi/operations/AccountSystemOperations.js +2 -2
  9. package/dist/nodes/SeRanking/projectApi/operations/AiResultTrackerOperations.js +20 -18
  10. package/dist/nodes/SeRanking/projectApi/operations/AirtGroupsOperations.js +9 -9
  11. package/dist/nodes/SeRanking/projectApi/operations/AnalyticsTrafficOperations.js +3 -3
  12. package/dist/nodes/SeRanking/projectApi/operations/BacklinkCheckerOperations.js +19 -20
  13. package/dist/nodes/SeRanking/projectApi/operations/CompetitorsOperations.js +11 -8
  14. package/dist/nodes/SeRanking/projectApi/operations/GeneralDataOperations.js +7 -8
  15. package/dist/nodes/SeRanking/projectApi/operations/KeywordGroupsOperations.js +7 -7
  16. package/dist/nodes/SeRanking/projectApi/operations/MarketingPlanOperations.js +5 -5
  17. package/dist/nodes/SeRanking/projectApi/operations/ProjectGroupsOperations.js +6 -6
  18. package/dist/nodes/SeRanking/projectApi/operations/ProjectManagementOperations.js +70 -32
  19. package/dist/nodes/SeRanking/projectApi/operations/SearchVolumeOperations.js +5 -22
  20. package/dist/nodes/SeRanking/projectApi/operations/SubAccountOperations.js +13 -8
  21. package/dist/nodes/SeRanking/projectApi/operations/UrlTagsOperations.js +4 -4
  22. package/dist/nodes/SeRanking/projectApi/operations/WebsiteAuditOperations.js +57 -16
  23. package/dist/nodes/SeRanking/utils/apiRequest.js +6 -30
  24. package/package.json +3 -4
  25. package/dist/credentials/SeRankingProjectApi.credentials.d.ts +0 -9
  26. package/dist/credentials/SeRankingProjectApi.credentials.js +0 -39
@@ -7,7 +7,7 @@ async function AiResultTrackerOperations(index) {
7
7
  const siteId = this.getNodeParameter('siteId', index);
8
8
  switch (operation) {
9
9
  case 'getSiteBrand': {
10
- return await apiRequest_1.apiRequest.call(this, 'GET', `/sites/${siteId}/airt/brands`, {}, {}, index);
10
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/airt/brand', {}, { site_id: siteId }, index);
11
11
  }
12
12
  case 'saveSiteBrand': {
13
13
  const brand = this.getNodeParameter('brandName', index);
@@ -17,14 +17,14 @@ async function AiResultTrackerOperations(index) {
17
17
  if (brand.trim().length > 255) {
18
18
  throw new Error('Brand name cannot exceed 255 characters');
19
19
  }
20
- return await apiRequest_1.apiRequest.call(this, 'POST', `/sites/${siteId}/airt/brands`, { brand: brand.trim() }, {}, index);
20
+ return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/airt/brand', { brand: brand.trim() }, { site_id: siteId }, index);
21
21
  }
22
22
  case 'listLlmEngines': {
23
- return await apiRequest_1.apiRequest.call(this, 'GET', `/sites/${siteId}/airt/llm`, {}, {}, index);
23
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/airt/llm', {}, { site_id: siteId }, index);
24
24
  }
25
25
  case 'getLlmEngine': {
26
26
  const llmId = this.getNodeParameter('llmId', index);
27
- return await apiRequest_1.apiRequest.call(this, 'GET', `/sites/${siteId}/airt/llm/${llmId}`, {}, {}, index);
27
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/airt/llm', {}, { site_id: siteId, llm_id: llmId }, index);
28
28
  }
29
29
  case 'createLlmEngine': {
30
30
  const baseName = this.getNodeParameter('baseName', index);
@@ -38,7 +38,7 @@ async function AiResultTrackerOperations(index) {
38
38
  body.region_name = additionalFields.regionName;
39
39
  if (additionalFields.langCode)
40
40
  body.lang_code = additionalFields.langCode;
41
- return await apiRequest_1.apiRequest.call(this, 'POST', `/sites/${siteId}/airt/llm`, body, {}, index);
41
+ return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/airt/llm', body, { site_id: siteId }, index);
42
42
  }
43
43
  case 'updateLlmEngine': {
44
44
  const llmId = this.getNodeParameter('llmId', index);
@@ -48,38 +48,38 @@ async function AiResultTrackerOperations(index) {
48
48
  body.region_name = updateFields.regionName || null;
49
49
  if (updateFields.langCode !== undefined)
50
50
  body.lang_code = updateFields.langCode || null;
51
- return await apiRequest_1.apiRequest.call(this, 'PATCH', `/sites/${siteId}/airt/llm/${llmId}`, body, {}, index);
51
+ return await apiRequest_1.apiRequest.call(this, 'PATCH', `/project-management/airt/llm?site_id=${siteId}&llm_id=${llmId}`, body, {}, index);
52
52
  }
53
53
  case 'deleteLlmEngine': {
54
54
  const llmId = this.getNodeParameter('llmId', index);
55
- await apiRequest_1.apiRequest.call(this, 'DELETE', `/sites/${siteId}/airt/llm/${llmId}`, {}, {}, index);
55
+ await apiRequest_1.apiRequest.call(this, 'DELETE', '/project-management/airt/llm', {}, { site_id: siteId, llm_id: llmId }, index);
56
56
  return { success: true, deleted: true, llm_id: llmId };
57
57
  }
58
58
  case 'getLlmStatus': {
59
59
  const llmId = this.getNodeParameter('llmId', index);
60
- return await apiRequest_1.apiRequest.call(this, 'GET', `/sites/${siteId}/airt/llm/${llmId}/status`, {}, {}, index);
60
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/airt/llm/status', {}, { site_id: siteId, llm_id: llmId }, index);
61
61
  }
62
62
  case 'getLlmStatistics': {
63
63
  const llmId = this.getNodeParameter('llmId', index);
64
64
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
65
- const query = {};
65
+ const query = { site_id: siteId, llm_id: llmId };
66
66
  if (additionalFields.from)
67
67
  query.from = additionalFields.from;
68
68
  if (additionalFields.to)
69
69
  query.to = additionalFields.to;
70
70
  if (additionalFields.top !== undefined)
71
71
  query.top = additionalFields.top;
72
- return await apiRequest_1.apiRequest.call(this, 'GET', `/sites/${siteId}/airt/llm/${llmId}/statistics`, {}, query, index);
72
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/airt/llm/statistics', {}, query, index);
73
73
  }
74
74
  case 'listPrompts': {
75
75
  const llmId = this.getNodeParameter('llmId', index);
76
76
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
77
- const query = {};
77
+ const query = { site_id: siteId, llm_id: llmId };
78
78
  if (additionalFields.limit !== undefined)
79
79
  query.limit = additionalFields.limit;
80
80
  if (additionalFields.offset !== undefined)
81
81
  query.offset = additionalFields.offset;
82
- let endpoint = `/sites/${siteId}/airt/llm/${llmId}/prompts`;
82
+ let endpoint = '/project-management/airt/prompts';
83
83
  if (additionalFields.groupIds) {
84
84
  const ids = additionalFields.groupIds.split(',').map((id) => id.trim());
85
85
  endpoint += '?' + ids.map((id) => `group_ids[]=${encodeURIComponent(id)}`).join('&');
@@ -94,19 +94,19 @@ async function AiResultTrackerOperations(index) {
94
94
  const body = { prompts };
95
95
  if (additionalFields.groupId)
96
96
  body.group_id = additionalFields.groupId;
97
- return await apiRequest_1.apiRequest.call(this, 'POST', `/sites/${siteId}/airt/llm/${llmId}/prompts`, body, {}, index);
97
+ return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/airt/prompts', body, { site_id: siteId, llm_id: llmId }, index);
98
98
  }
99
99
  case 'deletePrompts': {
100
100
  const llmId = this.getNodeParameter('llmId', index);
101
101
  const idsStr = this.getNodeParameter('k2siteLlmIds', index);
102
102
  const k2siteLlmIds = idsStr.split(',').map((id) => parseInt(id.trim(), 10));
103
- await apiRequest_1.apiRequest.call(this, 'DELETE', `/sites/${siteId}/airt/llm/${llmId}/prompts`, { k2site_llm_ids: k2siteLlmIds }, {}, index);
103
+ await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/airt/prompts/delete', { k2site_llm_ids: k2siteLlmIds }, { site_id: siteId, llm_id: llmId }, index);
104
104
  return { success: true, deleted: true, k2site_llm_ids: k2siteLlmIds };
105
105
  }
106
106
  case 'getPromptRankings': {
107
107
  const llmId = this.getNodeParameter('llmId', index);
108
108
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
109
- const query = {};
109
+ const query = { site_id: siteId, llm_id: llmId };
110
110
  if (additionalFields.dateFrom)
111
111
  query.date_from = additionalFields.dateFrom;
112
112
  if (additionalFields.dateTo)
@@ -115,7 +115,9 @@ async function AiResultTrackerOperations(index) {
115
115
  query.limit = additionalFields.limit;
116
116
  if (additionalFields.offset !== undefined)
117
117
  query.offset = additionalFields.offset;
118
- let endpoint = `/sites/${siteId}/airt/llm/${llmId}/prompts/rankings`;
118
+ if (additionalFields.mode)
119
+ query.mode = additionalFields.mode;
120
+ let endpoint = '/project-management/airt/prompts/rankings';
119
121
  if (additionalFields.groupIds) {
120
122
  const ids = additionalFields.groupIds.split(',').map((id) => id.trim());
121
123
  endpoint += '?' + ids.map((id) => `group_ids[]=${encodeURIComponent(id)}`).join('&');
@@ -126,10 +128,10 @@ async function AiResultTrackerOperations(index) {
126
128
  const llmId = this.getNodeParameter('llmId', index);
127
129
  const k2siteLlmId = this.getNodeParameter('k2siteLlmId', index);
128
130
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
129
- const query = {};
131
+ const query = { site_id: siteId, llm_id: llmId, k2site_llm_id: k2siteLlmId };
130
132
  if (additionalFields.date)
131
133
  query.date = additionalFields.date;
132
- return await apiRequest_1.apiRequest.call(this, 'GET', `/sites/${siteId}/airt/llm/${llmId}/prompts/${k2siteLlmId}/answer`, {}, query, index);
134
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/airt/prompts/answer', {}, query, index);
133
135
  }
134
136
  default:
135
137
  throw new Error(`Unknown AI Result Tracker operation: ${operation}`);
@@ -8,7 +8,7 @@ async function AirtGroupsOperations(index) {
8
8
  switch (operation) {
9
9
  case 'listPromptGroups': {
10
10
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
11
- const query = {};
11
+ const query = { site_id: siteId };
12
12
  if (additionalFields.keysCount === true) {
13
13
  query.keys_count = 1;
14
14
  }
@@ -21,14 +21,14 @@ async function AirtGroupsOperations(index) {
21
21
  query['site_llm_ids[]'] = ids;
22
22
  }
23
23
  }
24
- return await apiRequest_1.apiRequest.call(this, 'GET', `/sites/${siteId}/airt/prompt-groups`, {}, query, index);
24
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/airt/prompts/groups', {}, query, index);
25
25
  }
26
26
  case 'createPromptGroup': {
27
27
  const name = this.getNodeParameter('groupName', index);
28
28
  if (!name || name.trim() === '') {
29
29
  throw new Error('Group name cannot be empty');
30
30
  }
31
- return await apiRequest_1.apiRequest.call(this, 'POST', `/sites/${siteId}/airt/prompt-groups`, { name: name.trim() }, {}, index);
31
+ return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/airt/prompts/groups', { name: name.trim() }, { site_id: siteId }, index);
32
32
  }
33
33
  case 'renamePromptGroup': {
34
34
  const groupId = this.getNodeParameter('groupId', index);
@@ -36,11 +36,11 @@ async function AirtGroupsOperations(index) {
36
36
  if (!name || name.trim() === '') {
37
37
  throw new Error('Group name cannot be empty');
38
38
  }
39
- return await apiRequest_1.apiRequest.call(this, 'PATCH', `/sites/${siteId}/airt/prompt-groups/${groupId}`, { name: name.trim() }, {}, index);
39
+ return await apiRequest_1.apiRequest.call(this, 'PATCH', `/project-management/airt/prompts/groups?site_id=${siteId}&group_id=${groupId}`, { name: name.trim() }, {}, index);
40
40
  }
41
41
  case 'deletePromptGroup': {
42
42
  const groupId = this.getNodeParameter('groupId', index);
43
- await apiRequest_1.apiRequest.call(this, 'DELETE', `/sites/${siteId}/airt/prompt-groups/${groupId}`, {}, {}, index);
43
+ await apiRequest_1.apiRequest.call(this, 'DELETE', '/project-management/airt/prompts/groups', {}, { site_id: siteId, group_id: groupId }, index);
44
44
  return { success: true, deleted: true, group_id: groupId };
45
45
  }
46
46
  case 'changeGroupOrder': {
@@ -57,12 +57,12 @@ async function AirtGroupsOperations(index) {
57
57
  body.before_id = beforeId;
58
58
  if (hasAfter)
59
59
  body.after_id = afterId;
60
- await apiRequest_1.apiRequest.call(this, 'POST', `/sites/${siteId}/airt/prompt-groups/${groupId}/order`, body, {}, index);
60
+ await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/airt/prompts/groups/order', body, { site_id: siteId, group_id: groupId }, index);
61
61
  return { success: true, group_id: groupId, ...body };
62
62
  }
63
63
  case 'deleteAllPromptsInGroup': {
64
64
  const groupId = this.getNodeParameter('groupId', index);
65
- await apiRequest_1.apiRequest.call(this, 'DELETE', `/sites/${siteId}/airt/prompt-groups/${groupId}/keywords`, {}, {}, index);
65
+ await apiRequest_1.apiRequest.call(this, 'DELETE', '/project-management/airt/prompts/groups/prompts', {}, { site_id: siteId, group_id: groupId }, index);
66
66
  return { success: true, emptied: true, group_id: groupId };
67
67
  }
68
68
  case 'movePromptsToGroup': {
@@ -75,7 +75,7 @@ async function AirtGroupsOperations(index) {
75
75
  if (ids.length === 0) {
76
76
  throw new Error('Provide at least one k2site_llm_id');
77
77
  }
78
- await apiRequest_1.apiRequest.call(this, 'POST', `/sites/${siteId}/airt/prompt-groups/${groupId}/moveKeywords`, { k2site_llm_ids: ids }, {}, index);
78
+ await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/airt/prompts/groups/move', { k2site_llm_ids: ids }, { site_id: siteId, group_id: groupId }, index);
79
79
  return { success: true, group_id: groupId, moved: ids };
80
80
  }
81
81
  case 'moveAllPromptsBetweenGroups': {
@@ -84,7 +84,7 @@ async function AirtGroupsOperations(index) {
84
84
  if (fromGroupId === toGroupId) {
85
85
  throw new Error('Source and Target Group ID must differ');
86
86
  }
87
- await apiRequest_1.apiRequest.call(this, 'POST', `/sites/${siteId}/airt/prompt-groups/moveGroupKeywords`, { from_group_id: fromGroupId, to_group_id: toGroupId }, {}, index);
87
+ await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/airt/prompts/groups/transfer', { from_group_id: fromGroupId, to_group_id: toGroupId }, { site_id: siteId }, index);
88
88
  return { success: true, from_group_id: fromGroupId, to_group_id: toGroupId };
89
89
  }
90
90
  default:
@@ -7,18 +7,18 @@ async function AnalyticsTrafficOperations(index) {
7
7
  const siteId = this.getNodeParameter('siteId', index);
8
8
  switch (operation) {
9
9
  case 'getGscData': {
10
- return await apiRequest_1.apiRequest.call(this, 'GET', `/analytics/${siteId}/google`, {}, {}, index);
10
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/analytics/gsc/queries', {}, { site_id: siteId }, index);
11
11
  }
12
12
  case 'getSeoPotential': {
13
13
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
14
- const query = {};
14
+ const query = { site_id: siteId };
15
15
  if (additionalFields.topN !== undefined)
16
16
  query.top_n = additionalFields.topN;
17
17
  if (additionalFields.leadPrice !== undefined)
18
18
  query.lead_price = additionalFields.leadPrice;
19
19
  if (additionalFields.conversionRate !== undefined)
20
20
  query.conversion_rate = additionalFields.conversionRate;
21
- return await apiRequest_1.apiRequest.call(this, 'GET', `/analytics/${siteId}/potential`, {}, query, index);
21
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/analytics/seo-potential', {}, query, index);
22
22
  }
23
23
  default:
24
24
  throw new Error(`Unknown Analytics Traffic operation: ${operation}`);
@@ -8,12 +8,12 @@ async function BacklinkCheckerOperations(index) {
8
8
  switch (operation) {
9
9
  case 'listBacklinks': {
10
10
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
11
- const query = {};
11
+ const query = { site_id: siteId };
12
12
  if (additionalFields.limit !== undefined)
13
13
  query.limit = additionalFields.limit;
14
14
  if (additionalFields.offset !== undefined)
15
15
  query.offset = additionalFields.offset;
16
- return await apiRequest_1.apiRequest.call(this, 'GET', `/backlinks/${siteId}`, {}, query, index);
16
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/backlinks', {}, query, index);
17
17
  }
18
18
  case 'addBacklink': {
19
19
  const url = this.getNodeParameter('backlinkUrl', index);
@@ -27,7 +27,7 @@ async function BacklinkCheckerOperations(index) {
27
27
  body.charge_period = additionalFields.chargePeriod;
28
28
  if (additionalFields.chargeStart)
29
29
  body.charge_start = additionalFields.chargeStart;
30
- return await apiRequest_1.apiRequest.call(this, 'POST', `/backlinks/${siteId}`, body, {}, index);
30
+ return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/backlinks', body, { site_id: siteId }, index);
31
31
  }
32
32
  case 'importList': {
33
33
  const urlsStr = this.getNodeParameter('backlinkUrls', index);
@@ -46,24 +46,23 @@ async function BacklinkCheckerOperations(index) {
46
46
  body.group_id = additionalFields.groupId;
47
47
  if (additionalFields.manager)
48
48
  body.manager = additionalFields.manager;
49
- return await apiRequest_1.apiRequest.call(this, 'POST', `/backlinks/${siteId}/list`, body, {}, index);
49
+ return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/backlinks/import', body, { site_id: siteId }, index);
50
50
  }
51
51
  case 'updateImportSettings': {
52
52
  const gscAutoimport = this.getNodeParameter('gscAutoimport', index);
53
- await apiRequest_1.apiRequest.call(this, 'PUT', `/backlinks/${siteId}/settings`, { gsc_autoimport: gscAutoimport }, {}, index);
53
+ await apiRequest_1.apiRequest.call(this, 'PATCH', `/project-management/backlinks/gsc/settings?site_id=${siteId}`, { gsc_autoimport: gscAutoimport }, {}, index);
54
54
  return { success: true, gsc_autoimport: gscAutoimport };
55
55
  }
56
56
  case 'startGscImport': {
57
- return await apiRequest_1.apiRequest.call(this, 'POST', `/backlinks/${siteId}/import-gsc`, {}, {}, index);
57
+ return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/backlinks/gsc/import', {}, { site_id: siteId }, index);
58
58
  }
59
59
  case 'getGscImportStatus': {
60
- const token = this.getNodeParameter('importToken', index);
61
- return await apiRequest_1.apiRequest.call(this, 'GET', `/backlinks/${siteId}/import-gsc/${token}`, {}, {}, index);
60
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/backlinks/gsc/import', {}, { site_id: siteId }, index);
62
61
  }
63
62
  case 'deleteBacklinks': {
64
63
  const idsStr = this.getNodeParameter('backlinkIds', index);
65
64
  const backlinkIds = idsStr.split(',').map((id) => parseInt(id.trim(), 10));
66
- await apiRequest_1.apiRequest.call(this, 'POST', `/backlinks/${siteId}/delete`, { backlink_ids: backlinkIds }, {}, index);
65
+ await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/backlinks/delete', { backlink_ids: backlinkIds }, { site_id: siteId }, index);
67
66
  return { success: true, deleted: true, backlink_ids: backlinkIds };
68
67
  }
69
68
  case 'recheckBacklinks': {
@@ -73,46 +72,46 @@ async function BacklinkCheckerOperations(index) {
73
72
  const body = { backlink_ids: backlinkIds };
74
73
  if (additionalFields.recheckType)
75
74
  body.recheck_type = additionalFields.recheckType;
76
- return await apiRequest_1.apiRequest.call(this, 'POST', `/backlinks/${siteId}/recheck`, body, {}, index);
75
+ return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/backlinks/recheck', body, { site_id: siteId }, index);
77
76
  }
78
77
  case 'getStats': {
79
- return await apiRequest_1.apiRequest.call(this, 'GET', `/backlinks/${siteId}/stat`, {}, {}, index);
78
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/backlinks/stats', {}, { site_id: siteId }, index);
80
79
  }
81
80
  case 'listDisavowed': {
82
81
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
83
- const query = {};
82
+ const query = { site_id: siteId };
84
83
  if (additionalFields.limit !== undefined)
85
84
  query.limit = additionalFields.limit;
86
85
  if (additionalFields.offset !== undefined)
87
86
  query.offset = additionalFields.offset;
88
- return await apiRequest_1.apiRequest.call(this, 'GET', `/backlink-disavow/${siteId}`, {}, query, index);
87
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/backlinks/disavowed', {}, query, index);
89
88
  }
90
89
  case 'addDisavowed': {
91
90
  const urlsStr = this.getNodeParameter('disavowUrls', index);
92
91
  const list = urlsStr.split(',').map((u) => u.trim()).filter((u) => u.length > 0);
93
- return await apiRequest_1.apiRequest.call(this, 'POST', `/backlink-disavow/${siteId}`, { list }, {}, index);
92
+ return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/backlinks/disavowed', { list }, { site_id: siteId }, index);
94
93
  }
95
94
  case 'deleteDisavowed': {
96
95
  const disavowId = this.getNodeParameter('disavowId', index);
97
- await apiRequest_1.apiRequest.call(this, 'DELETE', `/backlink-disavow/${siteId}`, {}, { id: disavowId }, index);
96
+ await apiRequest_1.apiRequest.call(this, 'DELETE', '/project-management/backlinks/disavowed', {}, { site_id: siteId, id: disavowId }, index);
98
97
  return { success: true, deleted: true, id: disavowId };
99
98
  }
100
99
  case 'listGroups': {
101
- return await apiRequest_1.apiRequest.call(this, 'GET', `/backlink-groups/${siteId}`, {}, {}, index);
100
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/backlinks/groups', {}, { site_id: siteId }, index);
102
101
  }
103
102
  case 'createGroup': {
104
103
  const name = this.getNodeParameter('groupName', index);
105
- return await apiRequest_1.apiRequest.call(this, 'POST', `/backlink-groups/${siteId}`, { name }, {}, index);
104
+ return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/backlinks/groups', { name }, { site_id: siteId }, index);
106
105
  }
107
106
  case 'deleteGroup': {
108
107
  const groupId = this.getNodeParameter('groupId', index);
109
- await apiRequest_1.apiRequest.call(this, 'DELETE', `/backlink-groups/${siteId}`, {}, { id: groupId }, index);
108
+ await apiRequest_1.apiRequest.call(this, 'DELETE', '/project-management/backlinks/groups', {}, { site_id: siteId, id: groupId }, index);
110
109
  return { success: true, deleted: true, group_id: groupId };
111
110
  }
112
111
  case 'renameGroup': {
113
112
  const groupId = this.getNodeParameter('groupId', index);
114
113
  const name = this.getNodeParameter('newGroupName', index);
115
- await apiRequest_1.apiRequest.call(this, 'PUT', `/backlink-groups/${siteId}`, { id: groupId, name }, {}, index);
114
+ await apiRequest_1.apiRequest.call(this, 'PATCH', `/project-management/backlinks/groups?site_id=${siteId}`, { id: groupId, name }, {}, index);
116
115
  return { success: true, group_id: groupId };
117
116
  }
118
117
  case 'moveToGroup': {
@@ -126,7 +125,7 @@ async function BacklinkCheckerOperations(index) {
126
125
  if (groupIdsStr) {
127
126
  body.group_ids = groupIdsStr.split(',').map((id) => parseInt(id.trim(), 10));
128
127
  }
129
- return await apiRequest_1.apiRequest.call(this, 'POST', `/backlink-groups/${siteId}/move`, body, {}, index);
128
+ return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/backlinks/groups/move', body, { site_id: siteId }, index);
130
129
  }
131
130
  default:
132
131
  throw new Error(`Unknown Backlink Checker operation: ${operation}`);
@@ -17,16 +17,16 @@ async function CompetitorsOperations(index) {
17
17
  body.name = additionalFields.name;
18
18
  if (additionalFields.subdomainMatch !== undefined)
19
19
  body.subdomain_match = additionalFields.subdomainMatch;
20
- return await apiRequest_1.apiRequest.call(this, 'POST', '/competitors', body, {}, index);
20
+ return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/competitors', body, {}, index);
21
21
  }
22
22
  case 'listCompetitors': {
23
23
  const siteId = this.getNodeParameter('siteId', index);
24
- return await apiRequest_1.apiRequest.call(this, 'GET', `/competitors/site/${siteId}`, {}, {}, index);
24
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/competitors', {}, { site_id: siteId }, index);
25
25
  }
26
26
  case 'getPositions': {
27
27
  const competitorId = this.getNodeParameter('competitorId', index);
28
28
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
29
- const query = {};
29
+ const query = { competitor_id: competitorId };
30
30
  if (additionalFields.dateFrom)
31
31
  query.date_from = additionalFields.dateFrom;
32
32
  if (additionalFields.dateTo)
@@ -35,11 +35,11 @@ async function CompetitorsOperations(index) {
35
35
  query.site_engine_id = additionalFields.siteEngineId;
36
36
  if (additionalFields.withSerpFeatures !== undefined)
37
37
  query.with_serp_features = additionalFields.withSerpFeatures;
38
- return await apiRequest_1.apiRequest.call(this, 'GET', `/competitors/${competitorId}/positions`, {}, query, index);
38
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/competitors/positions', {}, query, index);
39
39
  }
40
40
  case 'deleteCompetitor': {
41
41
  const competitorId = this.getNodeParameter('competitorId', index);
42
- await apiRequest_1.apiRequest.call(this, 'DELETE', `/competitors/${competitorId}`, {}, {}, index);
42
+ await apiRequest_1.apiRequest.call(this, 'DELETE', '/project-management/competitors', {}, { competitor_id: competitorId }, index);
43
43
  return { success: true, deleted: true, competitor_id: competitorId };
44
44
  }
45
45
  case 'getTop10': {
@@ -48,11 +48,12 @@ async function CompetitorsOperations(index) {
48
48
  const siteEngineId = this.getNodeParameter('siteEngineId', index);
49
49
  const keywordId = this.getNodeParameter('keywordId', index);
50
50
  const query = {
51
+ site_id: siteId,
51
52
  date,
52
53
  site_engine_id: siteEngineId,
53
54
  keyword_id: keywordId,
54
55
  };
55
- return await apiRequest_1.apiRequest.call(this, 'GET', `/competitors/top10/${siteId}`, {}, query, index);
56
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/competitors/serp10', {}, query, index);
56
57
  }
57
58
  case 'getTop100': {
58
59
  const siteId = this.getNodeParameter('siteId', index);
@@ -61,13 +62,14 @@ async function CompetitorsOperations(index) {
61
62
  const keywordId = this.getNodeParameter('keywordId', index);
62
63
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
63
64
  const query = {
65
+ site_id: siteId,
64
66
  date,
65
67
  site_engine_id: siteEngineId,
66
68
  keyword_id: keywordId,
67
69
  };
68
70
  if (additionalFields.top !== undefined)
69
71
  query.top = additionalFields.top;
70
- return await apiRequest_1.apiRequest.call(this, 'GET', `/competitors/top100/${siteId}`, {}, query, index);
72
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/competitors/serp100', {}, query, index);
71
73
  }
72
74
  case 'getAllCompetitors': {
73
75
  const siteId = this.getNodeParameter('siteId', index);
@@ -75,6 +77,7 @@ async function CompetitorsOperations(index) {
75
77
  const siteEngineId = this.getNodeParameter('siteEngineId', index);
76
78
  const additionalFields = this.getNodeParameter('additionalFields', index, {});
77
79
  const query = {
80
+ site_id: siteId,
78
81
  date,
79
82
  site_engine_id: siteEngineId,
80
83
  };
@@ -86,7 +89,7 @@ async function CompetitorsOperations(index) {
86
89
  query[`tags[${i}]`] = id;
87
90
  });
88
91
  }
89
- return await apiRequest_1.apiRequest.call(this, 'GET', `/competitors/all/${siteId}`, {}, query, index);
92
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/competitors/metrics', {}, query, index);
90
93
  }
91
94
  default:
92
95
  throw new Error(`Unknown Competitors operation: ${operation}`);
@@ -6,20 +6,19 @@ async function GeneralDataOperations(index) {
6
6
  const operation = this.getNodeParameter('operation', index);
7
7
  switch (operation) {
8
8
  case 'listSearchEngines': {
9
- return await apiRequest_1.apiRequest.call(this, 'GET', '/system/search-engines', {}, {}, index);
9
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/system/search-engines', {}, {}, index);
10
10
  }
11
11
  case 'listGoogleLangs': {
12
- return await apiRequest_1.apiRequest.call(this, 'GET', '/system/google-langs', {}, {}, index);
12
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/system/google/languages', {}, {}, index);
13
13
  }
14
14
  case 'listVolumeRegions': {
15
- return await apiRequest_1.apiRequest.call(this, 'GET', '/system/volume-regions', {}, {}, index);
15
+ throw new Error('listVolumeRegions: The /system/volume-regions endpoint is not available under the unified API (HTTP 404 as of 2026-05-22). ' +
16
+ 'SE Ranking has not yet published a replacement in the unified docs. ' +
17
+ 'For keyword volume data, use the Data API endpoint Keyword Research → Export Keyword Metrics (/v1/keywords/export) instead.');
16
18
  }
17
19
  case 'getKeywordVolume': {
18
- const regionId = this.getNodeParameter('regionId', index);
19
- const keywordsStr = this.getNodeParameter('keywords', index);
20
- const keywords = keywordsStr.split(',').map((k) => k.trim()).filter((k) => k.length > 0);
21
- const query = { region_id: regionId, _keywordArray: keywords };
22
- return await apiRequest_1.apiRequest.call(this, 'GET', '/system/volume', {}, query, index);
20
+ throw new Error('getKeywordVolume: The /system/volume endpoint is not available under the unified API (HTTP 404 as of 2026-05-22). ' +
21
+ 'Use the Data API endpoint Keyword Research → Export Keyword Metrics (/v1/keywords/export) instead — it returns the same volume + CPC + difficulty data for up to 5000 keywords per request.');
23
22
  }
24
23
  default:
25
24
  throw new Error(`Unknown General Data operation: ${operation}`);
@@ -7,7 +7,7 @@ async function KeywordGroupsOperations(index) {
7
7
  switch (operation) {
8
8
  case 'listGroups': {
9
9
  const siteId = this.getNodeParameter('siteId', index);
10
- return await apiRequest_1.apiRequest.call(this, 'GET', `/keyword-groups/${siteId}`, {}, {}, index);
10
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/keywords/groups', {}, { site_id: siteId }, index);
11
11
  }
12
12
  case 'addGroup': {
13
13
  const siteId = this.getNodeParameter('siteId', index);
@@ -15,7 +15,7 @@ async function KeywordGroupsOperations(index) {
15
15
  if (!name || name.trim() === '') {
16
16
  throw new Error('Group name cannot be empty');
17
17
  }
18
- return await apiRequest_1.apiRequest.call(this, 'POST', '/keyword-groups', {
18
+ return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/keywords/groups', {
19
19
  name: name.trim(),
20
20
  site_id: siteId,
21
21
  }, {}, index);
@@ -24,9 +24,9 @@ async function KeywordGroupsOperations(index) {
24
24
  const groupId = this.getNodeParameter('groupId', index);
25
25
  const keywordIdsStr = this.getNodeParameter('keywordIds', index);
26
26
  const keywordIds = keywordIdsStr.split(',').map((id) => parseInt(id.trim(), 10));
27
- await apiRequest_1.apiRequest.call(this, 'POST', `/keyword-groups/${groupId}/keywords`, {
28
- keyword_ids: keywordIds,
29
- }, {}, index);
27
+ await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/keywords/groups/move', {
28
+ keywords_ids: keywordIds,
29
+ }, { group_id: groupId }, index);
30
30
  return { success: true, group_id: groupId, moved_keywords: keywordIds };
31
31
  }
32
32
  case 'renameGroup': {
@@ -35,14 +35,14 @@ async function KeywordGroupsOperations(index) {
35
35
  if (!name || name.trim() === '') {
36
36
  throw new Error('Group name cannot be empty');
37
37
  }
38
- await apiRequest_1.apiRequest.call(this, 'PUT', `/keyword-groups/${groupId}`, {
38
+ await apiRequest_1.apiRequest.call(this, 'PATCH', `/project-management/keywords/groups?group_id=${groupId}`, {
39
39
  name: name.trim(),
40
40
  }, {}, index);
41
41
  return { success: true, group_id: groupId, name: name.trim() };
42
42
  }
43
43
  case 'deleteGroup': {
44
44
  const groupId = this.getNodeParameter('groupId', index);
45
- await apiRequest_1.apiRequest.call(this, 'DELETE', `/keyword-groups/${groupId}`, {}, {}, index);
45
+ await apiRequest_1.apiRequest.call(this, 'DELETE', '/project-management/keywords/groups', {}, { group_id: groupId }, index);
46
46
  return { success: true, deleted: true, group_id: groupId };
47
47
  }
48
48
  default:
@@ -7,7 +7,7 @@ async function MarketingPlanOperations(index) {
7
7
  const siteId = this.getNodeParameter('siteId', index);
8
8
  switch (operation) {
9
9
  case 'listPlanItems': {
10
- return await apiRequest_1.apiRequest.call(this, 'GET', `/checklist/${siteId}`, {}, {}, index);
10
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/marketing-plan', {}, { site_id: siteId }, index);
11
11
  }
12
12
  case 'addTask': {
13
13
  const title = this.getNodeParameter('taskTitle', index);
@@ -16,13 +16,13 @@ async function MarketingPlanOperations(index) {
16
16
  const body = { title, text };
17
17
  if (additionalFields.forAll !== undefined)
18
18
  body.for_all = additionalFields.forAll;
19
- return await apiRequest_1.apiRequest.call(this, 'POST', `/checklist/${siteId}/task`, body, {}, index);
19
+ return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/marketing-plan/tasks', body, { site_id: siteId }, index);
20
20
  }
21
21
  case 'updateTask': {
22
22
  const taskId = this.getNodeParameter('taskId', index);
23
23
  const title = this.getNodeParameter('taskTitle', index);
24
24
  const text = this.getNodeParameter('taskText', index);
25
- await apiRequest_1.apiRequest.call(this, 'PUT', `/checklist/${siteId}/task`, {
25
+ await apiRequest_1.apiRequest.call(this, 'PATCH', `/project-management/marketing-plan/tasks?site_id=${siteId}`, {
26
26
  task_id: taskId,
27
27
  title,
28
28
  text,
@@ -32,7 +32,7 @@ async function MarketingPlanOperations(index) {
32
32
  case 'setTaskStatus': {
33
33
  const taskId = this.getNodeParameter('taskId', index);
34
34
  const checked = this.getNodeParameter('checked', index);
35
- await apiRequest_1.apiRequest.call(this, 'PUT', `/checklist/${siteId}/task`, {
35
+ await apiRequest_1.apiRequest.call(this, 'PATCH', `/project-management/marketing-plan/tasks?site_id=${siteId}`, {
36
36
  task_id: taskId,
37
37
  checked,
38
38
  }, {}, index);
@@ -40,7 +40,7 @@ async function MarketingPlanOperations(index) {
40
40
  }
41
41
  case 'deleteTask': {
42
42
  const taskId = this.getNodeParameter('deleteTaskId', index);
43
- await apiRequest_1.apiRequest.call(this, 'DELETE', `/checklist/${siteId}/task/${taskId}`, {}, {}, index);
43
+ await apiRequest_1.apiRequest.call(this, 'DELETE', '/project-management/marketing-plan/tasks', {}, { site_id: siteId, task_id: taskId }, index);
44
44
  return { success: true, deleted: true, task_id: taskId };
45
45
  }
46
46
  default:
@@ -10,7 +10,7 @@ async function ProjectGroupsOperations(index) {
10
10
  if (!name || name.trim() === '') {
11
11
  throw new Error('Group name cannot be empty');
12
12
  }
13
- return await apiRequest_1.apiRequest.call(this, 'POST', '/site-groups', { name: name.trim() }, {}, index);
13
+ return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/sites/groups', { name: name.trim() }, {}, index);
14
14
  }
15
15
  case 'renameGroup': {
16
16
  const groupId = this.getNodeParameter('groupId', index);
@@ -18,24 +18,24 @@ async function ProjectGroupsOperations(index) {
18
18
  if (!name || name.trim() === '') {
19
19
  throw new Error('Group name cannot be empty');
20
20
  }
21
- await apiRequest_1.apiRequest.call(this, 'PUT', `/site-groups/${groupId}`, { name: name.trim() }, {}, index);
21
+ await apiRequest_1.apiRequest.call(this, 'PATCH', `/project-management/sites/groups?group_id=${groupId}`, { name: name.trim() }, {}, index);
22
22
  return { success: true, group_id: groupId, name: name.trim() };
23
23
  }
24
24
  case 'deleteGroup': {
25
25
  const groupId = this.getNodeParameter('groupId', index);
26
- await apiRequest_1.apiRequest.call(this, 'DELETE', `/site-groups/${groupId}`, {}, {}, index);
26
+ await apiRequest_1.apiRequest.call(this, 'DELETE', '/project-management/sites/groups', {}, { group_id: groupId }, index);
27
27
  return { success: true, deleted: true, group_id: groupId };
28
28
  }
29
29
  case 'listGroups': {
30
- return await apiRequest_1.apiRequest.call(this, 'GET', '/site-groups', {}, {}, index);
30
+ return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/sites/groups', {}, {}, index);
31
31
  }
32
32
  case 'moveProjects': {
33
33
  const groupId = this.getNodeParameter('groupId', index);
34
34
  const siteIdsStr = this.getNodeParameter('siteIds', index);
35
35
  const siteIds = siteIdsStr.split(',').map((id) => parseInt(id.trim(), 10));
36
- await apiRequest_1.apiRequest.call(this, 'POST', `/site-groups/${groupId}/sites`, {
36
+ await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/sites/groups/move', {
37
37
  site_ids: siteIds,
38
- }, {}, index);
38
+ }, { group_id: groupId }, index);
39
39
  return { success: true, group_id: groupId, moved_sites: siteIds };
40
40
  }
41
41
  default: