SEO
Tracked sites, keyword rank checks, site audits and the SEO overview.
13 endpoints· 5 called live· 8 not exercised here· verified against http://127.0.0.1:8741
13 endpoints
POST/api/v1/salesshift/seo/auditNot exercised hereCrawl + analyse a site on the tenant node, store the result, notify.
Request body (required) — AuditIn
| Field | Type | Required | Notes |
|---|---|---|---|
| site_id | string(uuid)? | optional | |
| url | string | optional | Default "". |
| max_pages | integer | optional | Default 20. min 1, max 50. |
Values in the request below are typed placeholders, not sample data.
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/seo/audit' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "site_id": "<string(uuid)>", "url": "", "max_pages": 20 }'Response · 200
{
"audit_id": "…",
"data": "…",
"site_id": "…",
"success": "…"
}Errors
| Status | detail |
|---|---|
| 400 | site_id or url is required |
| 400 | Enter a valid URL, e.g. https://example.com |
| 502 | computed at runtime: result.get('error') or 'Audit failed on the SEO engine' |
GET/api/v1/salesshift/seo/auditsCalled liveAudit history — summary rows only unless ``?full=1``.
Query parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| site_id | string(uuid)? | optional | |
| limit | integer | optional | Default 10. min 1. max 100. |
| full | integer | optional | Default 0. min 0. max 1. |
Request
curl 'https://api.vxcloud.io/api/v1/salesshift/seo/audits' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "bool",
"data": [
{
"id": "str",
"site_id": "str",
"url": "str",
"health_score": "int",
"pages_crawled": "int",
"total_issues": "int",
"ssl_valid": "bool",
"robots_found": "bool",
"sitemap_found": "bool",
"created_at": "str"
},
"...x2"
]
}GET/api/v1/salesshift/seo/audits/{audit_id}Called liveOne SEO audit with its full findings.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| audit_id | string(uuid) | required |
Request
curl 'https://api.vxcloud.io/api/v1/salesshift/seo/audits/{audit_id}' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "bool",
"data": {
"id": "str",
"site_id": "str",
"url": "str",
"health_score": "int",
"pages_crawled": "int",
"total_issues": "int",
"ssl_valid": "bool",
"robots_found": "bool",
"sitemap_found": "bool",
"created_at": "str",
"result": {
"ssl": {
"host": "...",
"valid": "...",
"issuer": "...",
"subject": "...",
"expires_at": "...",
"days_to_expiry": "..."
},
"url": "str",
"pages": [
"...",
"...x20"
],
"domain": "str",
"issues": [
"...",
"...x47"
],
"sitemap": {
"url": "...",
"found": "...",
"is_index": "...",
"url_count": "..."
},
"success": "bool",
"max_pages": "int",
"robots_txt": {
"url": "...",
"found": "...",
"status": "...",
"allows_crawl": "...",
"sitemap_urls": "..."
},
"performance": {
"slowest": "...",
"avg_load_ms": "...",
"max_load_ms": "...",
"pages_analyzed": "...",
"slow_pages_count": "..."
},
"generated_at": "str",
"health_score": "int",
"issue_counts": {
"info": "...",
"errors": "...",
"warnings": "..."
},
"total_issues": "int",
"pages_crawled": "int"
}
}
}Errors
| Status | detail |
|---|---|
| 404 | Audit not found |
GET/api/v1/salesshift/seo/keywordsCalled liveTracked keywords, optionally narrowed to one site.
Query parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| site_id | string(uuid)? | optional |
Request
curl 'https://api.vxcloud.io/api/v1/salesshift/seo/keywords' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "bool",
"data": [
{
"id": "str",
"site_id": "str",
"site_domain": "str",
"keyword": "str",
"country": "str",
"device": "str",
"current_rank": "null",
"previous_rank": "null",
"best_rank": "null",
"delta": "null",
"search_volume": "null",
"difficulty": "null",
"cpc": "null",
"landing_url": "null",
"last_checked_at": "null",
"is_tracking": "bool",
"history": [
"<empty list>"
],
"sparkline": [
"<empty list>"
],
"created_at": "str"
},
"...x4"
]
}POST/api/v1/salesshift/seo/keywordsNot exercised hereBulk-add tracked keywords (deduped against what's already tracked).
Request body (required) — KeywordsIn
| Field | Type | Required | Notes |
|---|---|---|---|
| site_id | string(uuid)? | optional | |
| keyword | string | optional | Default "". |
| keywords | string[] | optional | |
| country | string | optional | Default "us". |
| device | string | optional | Default "desktop". |
Values in the request below are typed placeholders, not sample data.
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/seo/keywords' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "site_id": "<string(uuid)>", "keyword": "", "keywords": [ "<string>" ], "country": "us", "device": "desktop" }'Response · 201
{
"added": "…",
"data": "…",
"skipped": "…",
"success": "…"
}Errors
| Status | detail |
|---|---|
| 400 | site_id is required |
| 400 | No keywords provided |
| 400 | Too many keywords at once ({...}) — {...} max |
DELETE/api/v1/salesshift/seo/keywords/{keyword_id}Not exercised hereStop tracking a keyword.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| keyword_id | string(uuid) | required |
Request
curl -X DELETE 'https://api.vxcloud.io/api/v1/salesshift/seo/keywords/{keyword_id}' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "…"
}Errors
| Status | detail |
|---|---|
| 404 | Keyword not found |
POST/api/v1/salesshift/seo/keywords/{keyword_id}/checkNot exercised hereReal SERP position check through the node engine, then persist it.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| keyword_id | string(uuid) | required |
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/seo/keywords/{keyword_id}/check' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"blocked": "…",
"data": "…",
"engine": "…",
"error": "…",
"results_parsed": "…",
"success": "…"
}Errors
| Status | detail |
|---|---|
| 404 | Keyword not found |
| 400 | Keyword is not attached to a site |
POST/api/v1/salesshift/seo/keywords/check-allNot exercised hereSequentially re-check up to 25 tracked keywords (small delay between SERP fetches).
Sequentially re-check up to 25 tracked keywords (small delay between SERP fetches). Blocked checks are reported, never guessed.
Query parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| site_id | string(uuid)? | optional |
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/seo/keywords/check-all' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"blocked": "…",
"checked": "…",
"declined": "…",
"failed": "…",
"improved": "…",
"remaining": "…",
"results": "…",
"stopped_early": "…",
"success": "…",
"total": "…"
}GET/api/v1/salesshift/seo/overviewCalled liveRollup across the org's sites, keywords and audits.
Query parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| site_id | string(uuid)? | optional |
Request
curl 'https://api.vxcloud.io/api/v1/salesshift/seo/overview' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "bool",
"data": {
"sites": "int",
"keywords_tracked": "int",
"keywords_ranked": "int",
"avg_position": "float",
"top_3": "int",
"top_10": "int",
"top_100": "int",
"improved": "int",
"declined": "int",
"improved_30d": "int",
"declined_30d": "int",
"last_audit": {
"id": "str",
"score": "int",
"issues": "int",
"pages_crawled": "int",
"url": "str",
"at": "str"
},
"movers_up": [
"<empty list>"
],
"movers_down": [
"<empty list>"
]
}
}GET/api/v1/salesshift/seo/sitesCalled liveThe organization's tracked sites with their keyword counts.
Request
curl 'https://api.vxcloud.io/api/v1/salesshift/seo/sites' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "bool",
"data": [
{
"id": "str",
"domain": "str",
"name": "str",
"health_score": "int",
"last_audit_at": "str",
"keywords_count": "int",
"created_at": "str"
},
"...x2"
]
}POST/api/v1/salesshift/seo/sitesNot exercised hereAdd a site to track, normalising and validating the domain.
Request body (required) — SiteIn
| Field | Type | Required | Notes |
|---|---|---|---|
| domain | string | required | ≤ 255 chars. |
| name | string | optional | Default "". |
Values in the request below are typed placeholders, not sample data.
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/seo/sites' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "domain": "<string>", "name": "" }'Response · 201
{
"data": "…",
"existing": "…",
"success": "…"
}Errors
| Status | detail |
|---|---|
| 400 | Enter a valid domain, e.g. example.com |
DELETE/api/v1/salesshift/seo/sites/{site_id}Not exercised hereRemoves the site and — via ON DELETE CASCADE — its keywords, rank history and audit history.
Removes the site and — via ON DELETE CASCADE — its keywords, rank history and audit history.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| site_id | string(uuid) | required |
Request
curl -X DELETE 'https://api.vxcloud.io/api/v1/salesshift/seo/sites/{site_id}' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "…"
}POST/api/v1/salesshift/seo/suggestNot exercised hereReal Google autocomplete suggestions via the node — no invented ideas.
Request body (required) — SuggestIn
| Field | Type | Required | Notes |
|---|---|---|---|
| seed | string | required | ≤ 300 chars. |
| country | string | optional | Default "us". |
Values in the request below are typed placeholders, not sample data.
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/seo/suggest' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "seed": "<string>", "country": "us" }'Response · 200
{
"error": "…",
"seed": "…",
"success": "…",
"suggestions": "…"
}Errors
| Status | detail |
|---|---|
| 400 | Enter a seed keyword |