@seranking/n8n-nodes-seranking 1.5.13 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -10
- package/dist/credentials/SeRankingApi.credentials.js +2 -2
- package/dist/nodes/SeRanking/SeRanking.node.js +3 -39
- package/dist/nodes/SeRanking/projectApi/descriptions/AiResultTrackerDescription.js +11 -0
- package/dist/nodes/SeRanking/projectApi/descriptions/ProjectManagementDescription.js +127 -0
- package/dist/nodes/SeRanking/projectApi/descriptions/WebsiteAuditDescription.js +107 -1
- package/dist/nodes/SeRanking/projectApi/operations/AccountSystemOperations.js +2 -2
- package/dist/nodes/SeRanking/projectApi/operations/AiResultTrackerOperations.js +20 -18
- package/dist/nodes/SeRanking/projectApi/operations/AirtGroupsOperations.js +9 -9
- package/dist/nodes/SeRanking/projectApi/operations/AnalyticsTrafficOperations.js +3 -3
- package/dist/nodes/SeRanking/projectApi/operations/BacklinkCheckerOperations.js +19 -20
- package/dist/nodes/SeRanking/projectApi/operations/CompetitorsOperations.js +11 -8
- package/dist/nodes/SeRanking/projectApi/operations/GeneralDataOperations.js +7 -8
- package/dist/nodes/SeRanking/projectApi/operations/KeywordGroupsOperations.js +6 -6
- package/dist/nodes/SeRanking/projectApi/operations/MarketingPlanOperations.js +5 -5
- package/dist/nodes/SeRanking/projectApi/operations/ProjectGroupsOperations.js +6 -6
- package/dist/nodes/SeRanking/projectApi/operations/ProjectManagementOperations.js +70 -32
- package/dist/nodes/SeRanking/projectApi/operations/SearchVolumeOperations.js +5 -22
- package/dist/nodes/SeRanking/projectApi/operations/SubAccountOperations.js +8 -8
- package/dist/nodes/SeRanking/projectApi/operations/UrlTagsOperations.js +4 -4
- package/dist/nodes/SeRanking/projectApi/operations/WebsiteAuditOperations.js +57 -16
- package/dist/nodes/SeRanking/utils/apiRequest.js +6 -30
- package/package.json +3 -4
- package/dist/credentials/SeRankingProjectApi.credentials.d.ts +0 -9
- package/dist/credentials/SeRankingProjectApi.credentials.js +0 -39
|
@@ -1,28 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SearchVolumeOperations = SearchVolumeOperations;
|
|
4
|
-
const apiRequest_1 = require("../../utils/apiRequest");
|
|
5
4
|
async function SearchVolumeOperations(index) {
|
|
6
5
|
const operation = this.getNodeParameter('operation', index);
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
case 'listVolumeChecks': {
|
|
14
|
-
return await apiRequest_1.apiRequest.call(this, 'GET', '/key-volume/', {}, {}, index);
|
|
15
|
-
}
|
|
16
|
-
case 'getVolumeResults': {
|
|
17
|
-
const taskId = this.getNodeParameter('taskId', index);
|
|
18
|
-
return await apiRequest_1.apiRequest.call(this, 'GET', `/key-volume/${taskId}`, {}, {}, index);
|
|
19
|
-
}
|
|
20
|
-
case 'deleteVolumeCheck': {
|
|
21
|
-
const taskId = this.getNodeParameter('taskId', index);
|
|
22
|
-
await apiRequest_1.apiRequest.call(this, 'DELETE', `/key-volume/${taskId}`, {}, {}, index);
|
|
23
|
-
return { success: true, deleted: true, task_id: taskId };
|
|
24
|
-
}
|
|
25
|
-
default:
|
|
26
|
-
throw new Error(`Unknown Search Volume operation: ${operation}`);
|
|
27
|
-
}
|
|
6
|
+
const message = `Search Volume operation "${operation}" is unavailable under the unified SE Ranking API ` +
|
|
7
|
+
'(the legacy /key-volume async task endpoints return HTTP 404 as of 2026-05-22). ' +
|
|
8
|
+
'Use Data API → Keyword Research → Export Keyword Metrics (/v1/keywords/export) instead — ' +
|
|
9
|
+
'it returns volume, CPC, competition, difficulty, intents, and history for up to 5000 keywords per request.';
|
|
10
|
+
throw new Error(message);
|
|
28
11
|
}
|
|
@@ -12,11 +12,11 @@ async function SubAccountOperations(index) {
|
|
|
12
12
|
query.limit = additionalFields.limit;
|
|
13
13
|
if (additionalFields.offset !== undefined)
|
|
14
14
|
query.offset = additionalFields.offset;
|
|
15
|
-
return await apiRequest_1.apiRequest.call(this, 'GET', '/users', {}, query, index);
|
|
15
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/users', {}, query, index);
|
|
16
16
|
}
|
|
17
17
|
case 'getSubAccount': {
|
|
18
18
|
const id = this.getNodeParameter('subAccountId', index);
|
|
19
|
-
return await apiRequest_1.apiRequest.call(this, 'GET',
|
|
19
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/users', {}, { user_id: id }, index);
|
|
20
20
|
}
|
|
21
21
|
case 'createSubAccount': {
|
|
22
22
|
const email = this.getNodeParameter('accountEmail', index);
|
|
@@ -43,11 +43,11 @@ async function SubAccountOperations(index) {
|
|
|
43
43
|
data.push({ access: accessArr });
|
|
44
44
|
}
|
|
45
45
|
const body = [{ key: 'data', value: data }];
|
|
46
|
-
return await apiRequest_1.apiRequest.call(this, 'POST', '/users', body, {}, index);
|
|
46
|
+
return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/users', body, {}, index);
|
|
47
47
|
}
|
|
48
48
|
case 'deleteSubAccount': {
|
|
49
49
|
const id = this.getNodeParameter('subAccountId', index);
|
|
50
|
-
await apiRequest_1.apiRequest.call(this, 'DELETE',
|
|
50
|
+
await apiRequest_1.apiRequest.call(this, 'DELETE', '/project-management/users', {}, { user_id: id }, index);
|
|
51
51
|
return { success: true, deleted: true, account_id: id };
|
|
52
52
|
}
|
|
53
53
|
case 'updateSubAccount': {
|
|
@@ -75,22 +75,22 @@ async function SubAccountOperations(index) {
|
|
|
75
75
|
data.push({ access: accessArr });
|
|
76
76
|
}
|
|
77
77
|
const body = [{ key: 'data', value: data }];
|
|
78
|
-
await apiRequest_1.apiRequest.call(this, 'PATCH', `/users
|
|
78
|
+
await apiRequest_1.apiRequest.call(this, 'PATCH', `/project-management/users?user_id=${id}`, body, {}, index);
|
|
79
79
|
return { success: true, account_id: id };
|
|
80
80
|
}
|
|
81
81
|
case 'listSharedSites': {
|
|
82
82
|
const id = this.getNodeParameter('subAccountId', index);
|
|
83
|
-
return await apiRequest_1.apiRequest.call(this, 'GET',
|
|
83
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/users/shared-sites', {}, { user_id: id }, index);
|
|
84
84
|
}
|
|
85
85
|
case 'listOwnedSites': {
|
|
86
86
|
const id = this.getNodeParameter('subAccountId', index);
|
|
87
|
-
return await apiRequest_1.apiRequest.call(this, 'GET',
|
|
87
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/users/owned-sites', {}, { user_id: id }, index);
|
|
88
88
|
}
|
|
89
89
|
case 'shareProjects': {
|
|
90
90
|
const id = this.getNodeParameter('subAccountId', index);
|
|
91
91
|
const siteIdsStr = this.getNodeParameter('siteIds', index);
|
|
92
92
|
const siteIds = siteIdsStr.split(',').map((s) => parseInt(s.trim(), 10));
|
|
93
|
-
return await apiRequest_1.apiRequest.call(this, 'POST',
|
|
93
|
+
return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/users/shared-sites', { site_ids: siteIds }, { user_id: id }, index);
|
|
94
94
|
}
|
|
95
95
|
default:
|
|
96
96
|
throw new Error(`Unknown Sub-Account operation: ${operation}`);
|
|
@@ -7,7 +7,7 @@ async function UrlTagsOperations(index) {
|
|
|
7
7
|
switch (operation) {
|
|
8
8
|
case 'listTags': {
|
|
9
9
|
const siteId = this.getNodeParameter('siteId', index);
|
|
10
|
-
return await apiRequest_1.apiRequest.call(this, 'GET',
|
|
10
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/sites/url-tags', {}, { site_id: siteId }, index);
|
|
11
11
|
}
|
|
12
12
|
case 'addTag': {
|
|
13
13
|
const siteId = this.getNodeParameter('siteId', index);
|
|
@@ -20,7 +20,7 @@ async function UrlTagsOperations(index) {
|
|
|
20
20
|
if (additionalFields.domains) {
|
|
21
21
|
body.domains = additionalFields.domains.split(',').map((d) => d.trim());
|
|
22
22
|
}
|
|
23
|
-
return await apiRequest_1.apiRequest.call(this, 'POST',
|
|
23
|
+
return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/sites/url-tags', body, { site_id: siteId }, index);
|
|
24
24
|
}
|
|
25
25
|
case 'updateAssignment': {
|
|
26
26
|
const siteId = this.getNodeParameter('siteId', index);
|
|
@@ -34,13 +34,13 @@ async function UrlTagsOperations(index) {
|
|
|
34
34
|
if (additionalFields.domains) {
|
|
35
35
|
body.domains = additionalFields.domains.split(',').map((d) => d.trim());
|
|
36
36
|
}
|
|
37
|
-
await apiRequest_1.apiRequest.call(this, '
|
|
37
|
+
await apiRequest_1.apiRequest.call(this, 'PATCH', `/project-management/sites/url-tags?site_id=${siteId}`, body, {}, index);
|
|
38
38
|
return { success: true, tag_ids: tagIds };
|
|
39
39
|
}
|
|
40
40
|
case 'deleteTag': {
|
|
41
41
|
const siteId = this.getNodeParameter('siteId', index);
|
|
42
42
|
const tagId = this.getNodeParameter('tagId', index);
|
|
43
|
-
await apiRequest_1.apiRequest.call(this, 'DELETE',
|
|
43
|
+
await apiRequest_1.apiRequest.call(this, 'DELETE', '/project-management/sites/url-tags', {}, { site_id: siteId, tag_id: tagId }, index);
|
|
44
44
|
return { success: true, deleted: true, tag_id: tagId };
|
|
45
45
|
}
|
|
46
46
|
default:
|
|
@@ -17,7 +17,7 @@ async function WebsiteAuditOperations(index) {
|
|
|
17
17
|
: additionalFields.settingsJson;
|
|
18
18
|
body.settings = settings;
|
|
19
19
|
}
|
|
20
|
-
return await apiRequest_1.apiRequest.call(this, 'POST', '/
|
|
20
|
+
return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/audits', body, {}, index);
|
|
21
21
|
}
|
|
22
22
|
case 'listAudits': {
|
|
23
23
|
const additionalFields = this.getNodeParameter('additionalFields', index, {});
|
|
@@ -32,52 +32,52 @@ async function WebsiteAuditOperations(index) {
|
|
|
32
32
|
query.date_start = additionalFields.dateStart;
|
|
33
33
|
if (additionalFields.dateEnd)
|
|
34
34
|
query.date_end = additionalFields.dateEnd;
|
|
35
|
-
return await apiRequest_1.apiRequest.call(this, 'GET', '/
|
|
35
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/audits', {}, query, index);
|
|
36
36
|
}
|
|
37
37
|
case 'getStatus': {
|
|
38
38
|
const auditId = this.getNodeParameter('auditId', index);
|
|
39
|
-
return await apiRequest_1.apiRequest.call(this, 'GET',
|
|
39
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/audits/status', {}, { audit_id: auditId }, index);
|
|
40
40
|
}
|
|
41
41
|
case 'getReport': {
|
|
42
42
|
const auditId = this.getNodeParameter('auditId', index);
|
|
43
|
-
return await apiRequest_1.apiRequest.call(this, 'GET',
|
|
43
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/audits/report', {}, { audit_id: auditId }, index);
|
|
44
44
|
}
|
|
45
45
|
case 'getPages': {
|
|
46
46
|
const auditId = this.getNodeParameter('auditId', index);
|
|
47
47
|
const additionalFields = this.getNodeParameter('additionalFields', index, {});
|
|
48
|
-
const query = {};
|
|
48
|
+
const query = { audit_id: auditId };
|
|
49
49
|
if (additionalFields.limit !== undefined)
|
|
50
50
|
query.limit = additionalFields.limit;
|
|
51
51
|
if (additionalFields.offset !== undefined)
|
|
52
52
|
query.offset = additionalFields.offset;
|
|
53
|
-
return await apiRequest_1.apiRequest.call(this, 'GET',
|
|
53
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/audits/pages', {}, query, index);
|
|
54
54
|
}
|
|
55
55
|
case 'getPagesByIssue': {
|
|
56
56
|
const auditId = this.getNodeParameter('auditId', index);
|
|
57
57
|
const code = this.getNodeParameter('issueCode', index);
|
|
58
58
|
const additionalFields = this.getNodeParameter('additionalFields', index, {});
|
|
59
|
-
const query = { code };
|
|
59
|
+
const query = { audit_id: auditId, code };
|
|
60
60
|
if (additionalFields.limit !== undefined)
|
|
61
61
|
query.limit = additionalFields.limit;
|
|
62
62
|
if (additionalFields.offset !== undefined)
|
|
63
63
|
query.offset = additionalFields.offset;
|
|
64
|
-
return await apiRequest_1.apiRequest.call(this, 'GET',
|
|
64
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/audits/issue-pages', {}, query, index);
|
|
65
65
|
}
|
|
66
66
|
case 'getIssues': {
|
|
67
67
|
const auditId = this.getNodeParameter('auditId', index);
|
|
68
|
-
const query = {};
|
|
68
|
+
const query = { audit_id: auditId };
|
|
69
69
|
const urlId = this.getNodeParameter('urlId', index, 0);
|
|
70
70
|
const pageUrl = this.getNodeParameter('pageUrl', index, '');
|
|
71
71
|
if (urlId)
|
|
72
72
|
query.url_id = urlId;
|
|
73
73
|
if (pageUrl)
|
|
74
74
|
query.url = pageUrl;
|
|
75
|
-
return await apiRequest_1.apiRequest.call(this, 'GET',
|
|
75
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/audits/issues', {}, query, index);
|
|
76
76
|
}
|
|
77
77
|
case 'getLinks': {
|
|
78
78
|
const auditId = this.getNodeParameter('auditId', index);
|
|
79
79
|
const additionalFields = this.getNodeParameter('additionalFields', index, {});
|
|
80
|
-
const query = {};
|
|
80
|
+
const query = { audit_id: auditId };
|
|
81
81
|
if (additionalFields.pageType)
|
|
82
82
|
query.page_type = additionalFields.pageType;
|
|
83
83
|
if (additionalFields.limit !== undefined)
|
|
@@ -99,27 +99,68 @@ async function WebsiteAuditOperations(index) {
|
|
|
99
99
|
});
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
|
-
return await apiRequest_1.apiRequest.call(this, 'GET',
|
|
102
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/audits/found-links', {}, query, index);
|
|
103
103
|
}
|
|
104
104
|
case 'getHistory': {
|
|
105
105
|
const auditId = this.getNodeParameter('auditId', index);
|
|
106
106
|
const date = this.getNodeParameter('historyDate', index);
|
|
107
|
-
return await apiRequest_1.apiRequest.call(this, 'GET',
|
|
107
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/audits/history', {}, { audit_id: auditId, date }, index);
|
|
108
108
|
}
|
|
109
109
|
case 'updateTitle': {
|
|
110
110
|
const auditId = this.getNodeParameter('auditId', index);
|
|
111
111
|
const title = this.getNodeParameter('newTitle', index);
|
|
112
|
-
await apiRequest_1.apiRequest.call(this, '
|
|
112
|
+
await apiRequest_1.apiRequest.call(this, 'PATCH', `/project-management/audits?audit_id=${auditId}`, { title }, {}, index);
|
|
113
113
|
return { success: true, audit_id: auditId };
|
|
114
114
|
}
|
|
115
115
|
case 'deleteAudit': {
|
|
116
116
|
const auditId = this.getNodeParameter('auditId', index);
|
|
117
|
-
await apiRequest_1.apiRequest.call(this, '
|
|
117
|
+
await apiRequest_1.apiRequest.call(this, 'DELETE', '/project-management/audits', {}, { audit_id: auditId }, index);
|
|
118
118
|
return { success: true, deleted: true, audit_id: auditId };
|
|
119
119
|
}
|
|
120
120
|
case 'recheckAudit': {
|
|
121
121
|
const auditId = this.getNodeParameter('auditId', index);
|
|
122
|
-
return await apiRequest_1.apiRequest.call(this, 'POST',
|
|
122
|
+
return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/audits/recheck', {}, { audit_id: auditId }, index);
|
|
123
|
+
}
|
|
124
|
+
case 'getAuditSettings': {
|
|
125
|
+
const auditId = this.getNodeParameter('auditId', index);
|
|
126
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/audits/settings', {}, { audit_id: auditId }, index);
|
|
127
|
+
}
|
|
128
|
+
case 'updateAuditSettings': {
|
|
129
|
+
const auditId = this.getNodeParameter('auditId', index);
|
|
130
|
+
const settingsJson = this.getNodeParameter('settingsJson', index);
|
|
131
|
+
const settings = typeof settingsJson === 'string' ? JSON.parse(settingsJson) : settingsJson;
|
|
132
|
+
await apiRequest_1.apiRequest.call(this, 'PATCH', `/project-management/audits/settings?audit_id=${auditId}`, { settings }, {}, index);
|
|
133
|
+
return { success: true, audit_id: auditId };
|
|
134
|
+
}
|
|
135
|
+
case 'resetAuditSettings': {
|
|
136
|
+
const auditId = this.getNodeParameter('auditId', index);
|
|
137
|
+
await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/audits/settings/reset', {}, { audit_id: auditId }, index);
|
|
138
|
+
return { success: true, reset: true, audit_id: auditId };
|
|
139
|
+
}
|
|
140
|
+
case 'listAuditSitemaps': {
|
|
141
|
+
const auditId = this.getNodeParameter('auditId', index);
|
|
142
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/audits/sitemaps', {}, { audit_id: auditId }, index);
|
|
143
|
+
}
|
|
144
|
+
case 'addAuditSitemap': {
|
|
145
|
+
const auditId = this.getNodeParameter('auditId', index);
|
|
146
|
+
const url = this.getNodeParameter('sitemapUrl', index);
|
|
147
|
+
return await apiRequest_1.apiRequest.call(this, 'POST', '/project-management/audits/sitemaps', { url }, { audit_id: auditId }, index);
|
|
148
|
+
}
|
|
149
|
+
case 'deleteAuditSitemap': {
|
|
150
|
+
const auditId = this.getNodeParameter('auditId', index);
|
|
151
|
+
const sitemapId = this.getNodeParameter('sitemapId', index);
|
|
152
|
+
await apiRequest_1.apiRequest.call(this, 'DELETE', '/project-management/audits/sitemaps', {}, { audit_id: auditId, sitemap_id: sitemapId }, index);
|
|
153
|
+
return { success: true, deleted: true, sitemap_id: sitemapId };
|
|
154
|
+
}
|
|
155
|
+
case 'listAuditSourcePages': {
|
|
156
|
+
const auditId = this.getNodeParameter('auditId', index);
|
|
157
|
+
return await apiRequest_1.apiRequest.call(this, 'GET', '/project-management/audits/source_pages', {}, { audit_id: auditId }, index);
|
|
158
|
+
}
|
|
159
|
+
case 'deleteAuditSourcePages': {
|
|
160
|
+
const auditId = this.getNodeParameter('auditId', index);
|
|
161
|
+
const listId = this.getNodeParameter('sourcePagesListId', index);
|
|
162
|
+
await apiRequest_1.apiRequest.call(this, 'DELETE', '/project-management/audits/source_pages', {}, { audit_id: auditId, list_id: listId }, index);
|
|
163
|
+
return { success: true, deleted: true, list_id: listId };
|
|
123
164
|
}
|
|
124
165
|
default:
|
|
125
166
|
throw new Error(`Unknown Website Audit operation: ${operation}`);
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.apiRequest = apiRequest;
|
|
4
4
|
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
const BASE_URL = 'https://api.seranking.com/v1';
|
|
6
|
+
const CREDENTIAL_TYPE = 'seRankingApi';
|
|
5
7
|
let lastRequestTime = 0;
|
|
6
8
|
const MIN_REQUEST_INTERVAL = 300;
|
|
7
9
|
async function apiRequest(method, endpoint, body = {}, query = {}, itemIndex = 0) {
|
|
@@ -13,23 +15,6 @@ async function apiRequest(method, endpoint, body = {}, query = {}, itemIndex = 0
|
|
|
13
15
|
await (0, n8n_workflow_1.sleep)(waitTime);
|
|
14
16
|
}
|
|
15
17
|
lastRequestTime = Date.now();
|
|
16
|
-
const DATA_API_RESOURCES = new Set([
|
|
17
|
-
'aiSearch',
|
|
18
|
-
'backlinks',
|
|
19
|
-
'domainAnalysis',
|
|
20
|
-
'keywordResearch',
|
|
21
|
-
'serpClassic',
|
|
22
|
-
'websiteAudit',
|
|
23
|
-
]);
|
|
24
|
-
let resource;
|
|
25
|
-
try {
|
|
26
|
-
resource = this.getNodeParameter('resource', itemIndex);
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
resource = '';
|
|
30
|
-
}
|
|
31
|
-
const isDataApi = DATA_API_RESOURCES.has(resource);
|
|
32
|
-
const credentialType = isDataApi ? 'seRankingApi' : 'seRankingProjectApi';
|
|
33
18
|
const httpMethod = method.toUpperCase();
|
|
34
19
|
const options = {
|
|
35
20
|
method: httpMethod,
|
|
@@ -44,10 +29,7 @@ async function apiRequest(method, endpoint, body = {}, query = {}, itemIndex = 0
|
|
|
44
29
|
options.json = false;
|
|
45
30
|
}
|
|
46
31
|
else {
|
|
47
|
-
|
|
48
|
-
? 'https://api.seranking.com/v1'
|
|
49
|
-
: 'https://api4.seranking.com';
|
|
50
|
-
options.url = `${baseUrl}${endpoint}`;
|
|
32
|
+
options.url = `${BASE_URL}${endpoint}`;
|
|
51
33
|
options.json = true;
|
|
52
34
|
}
|
|
53
35
|
if (Object.keys(query).length > 0) {
|
|
@@ -106,20 +88,14 @@ async function apiRequest(method, endpoint, body = {}, query = {}, itemIndex = 0
|
|
|
106
88
|
}
|
|
107
89
|
}
|
|
108
90
|
try {
|
|
109
|
-
const response = await this.helpers.httpRequestWithAuthentication.call(this,
|
|
91
|
+
const response = await this.helpers.httpRequestWithAuthentication.call(this, CREDENTIAL_TYPE, options);
|
|
110
92
|
return response;
|
|
111
93
|
}
|
|
112
94
|
catch (error) {
|
|
113
95
|
if (((_a = error.message) === null || _a === void 0 ? void 0 : _a.includes('does not require credentials')) || ((_b = error.message) === null || _b === void 0 ? void 0 : _b.includes('No credentials'))) {
|
|
114
|
-
|
|
115
|
-
? 'SE Ranking API credential not configured'
|
|
116
|
-
: 'SE Ranking Project API credential not configured';
|
|
117
|
-
const missingDesc = isDataApi
|
|
118
|
-
? 'This resource requires the SE Ranking API credential. Click the node, find the "SE Ranking API" credential slot, and create/select your Data API token.'
|
|
119
|
-
: 'This resource requires the SE Ranking Project API credential. Click the node, find the "SE Ranking Project API" credential slot, and create/select your Project API token.';
|
|
120
|
-
throw new n8n_workflow_1.NodeOperationError(this.getNode(), missingCred, {
|
|
96
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'SE Ranking API credential not configured', {
|
|
121
97
|
itemIndex,
|
|
122
|
-
description:
|
|
98
|
+
description: 'Click the node, find the "SE Ranking API" credential slot, and create/select your API token. As of 2026-05 a single unified token covers all endpoints.',
|
|
123
99
|
});
|
|
124
100
|
}
|
|
125
101
|
const errorData = ((_c = error.response) === null || _c === void 0 ? void 0 : _c.body) || ((_d = error.response) === null || _d === void 0 ? void 0 : _d.data) || {};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seranking/n8n-nodes-seranking",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "n8n connector for SE Ranking API
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "n8n connector for SE Ranking API (unified host, single token). Resources: AI Search, Backlinks, Domain Analysis, Keyword Research, Website Audit, Project Management, Project Groups, AI Result Tracker, AIRT Groups, Keyword Groups, Competitors, URL Tags, Analytics Traffic, Account System, Sub-Account Management, General Data, Marketing Plan, Backlink Checker, Search Volume",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/seranking/n8n-nodes-seranking",
|
|
7
7
|
"author": {
|
|
@@ -51,8 +51,7 @@
|
|
|
51
51
|
"dist/nodes/SeRanking/SeRanking.node.js"
|
|
52
52
|
],
|
|
53
53
|
"credentials": [
|
|
54
|
-
"dist/credentials/SeRankingApi.credentials.js"
|
|
55
|
-
"dist/credentials/SeRankingProjectApi.credentials.js"
|
|
54
|
+
"dist/credentials/SeRankingApi.credentials.js"
|
|
56
55
|
]
|
|
57
56
|
},
|
|
58
57
|
"scripts": {
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { IAuthenticateGeneric, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
|
|
2
|
-
export declare class SeRankingProjectApi implements ICredentialType {
|
|
3
|
-
name: string;
|
|
4
|
-
displayName: string;
|
|
5
|
-
documentationUrl: string;
|
|
6
|
-
properties: INodeProperties[];
|
|
7
|
-
authenticate: IAuthenticateGeneric;
|
|
8
|
-
test: ICredentialTestRequest;
|
|
9
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SeRankingProjectApi = void 0;
|
|
4
|
-
class SeRankingProjectApi {
|
|
5
|
-
constructor() {
|
|
6
|
-
this.name = 'seRankingProjectApi';
|
|
7
|
-
this.displayName = 'SE Ranking Project API';
|
|
8
|
-
this.documentationUrl = 'https://seranking.com/api-google-organic.html';
|
|
9
|
-
this.properties = [
|
|
10
|
-
{
|
|
11
|
-
displayName: 'API Token',
|
|
12
|
-
name: 'apiToken',
|
|
13
|
-
type: 'string',
|
|
14
|
-
typeOptions: {
|
|
15
|
-
password: true,
|
|
16
|
-
},
|
|
17
|
-
default: '',
|
|
18
|
-
required: true,
|
|
19
|
-
description: 'Your SE Ranking Project API token from the API Dashboard',
|
|
20
|
-
},
|
|
21
|
-
];
|
|
22
|
-
this.authenticate = {
|
|
23
|
-
type: 'generic',
|
|
24
|
-
properties: {
|
|
25
|
-
headers: {
|
|
26
|
-
'Authorization': '=Token {{$credentials.apiToken}}',
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
this.test = {
|
|
31
|
-
request: {
|
|
32
|
-
baseURL: 'https://api4.seranking.com',
|
|
33
|
-
url: '/sites',
|
|
34
|
-
method: 'GET',
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
exports.SeRankingProjectApi = SeRankingProjectApi;
|