Group keywords into topics
https://seolyticize.com /api/v1/tools/cluster_keywords Groups keywords into topics by how much their Google results overlap: keywords whose top results share at least minShared pages are one topic, which one page should target. Each topic has its parent topic (the highest-volume keyword), total volume, intent, the pages that rank across it, and where the client already ranks. overlap lists keyword pairs by shared top-ten results: 7–10 merge (one page), 4–6 same cluster, 2–3 interlink, 0–1 separate, after leaving out up to the 5 commonest domains that rank on over half the results pages (Wikipedia, Reddit and the like). architecture leaves navigational keywords out and lays the topics out as one pillar (2,500–4,000 words) with 2–5 clusters of 2–4 spokes (1,200–1,800 words), one of eight templates picked by intent and wording (ultimate guide, how-to, listicle, explainer, comparison, review, best-of, landing page), a link matrix {from, to, type, anchor} whose anchors vary so no one carries over 40% of a page's inbound links: spoke ↔ pillar mandatory, 2–3 spoke-to-spoke, at most one cross-cluster, at least 3 inbound per post, every post within 2 clicks of the pillar, 5–21 posts in all, and JSON-LD for the pillar (Article, BreadcrumbList, ItemList of spokes) and each spoke (Article isPartOf the pillar). scorecard checks the client's live pages against it from the latest crawl: no orphans, pillar links 100% both ways, 80% of the planned links present. Answers 'which of these keywords belong on one page' and 'how many pages do we need'. Give keywords (up to 200) or a keyword listId. One results page per keyword, each a paid lookup on the client's account unless someone bought it in the last day — quote with estimate_cost first.
Parameters
Idempotency-KeystringheaderRequest body
application/json
clientIdstringrequiredkeywordsstring[]listIdstringminSharedintegerdepthintegermodestringlocationCodeintegerlanguageCodestringmaxCostMicrosintegerdryRunboolean{
"clientId": "string",
"keywords": null,
"listId": null,
"minShared": 3,
"depth": 10,
"mode": "head",
"locationCode": null,
"languageCode": null,
"maxCostMicros": 0,
"dryRun": true
}Code samples
cURL
curl -X POST "https://seolyticize.com/api/v1/tools/cluster_keywords" \
-H "Authorization: Bearer $SEOLYTICIZE_API_KEY" \
-H "Idempotency-Key: <value>" \
-H "Content-Type: application/json" \
-d '{"clientId":"string","keywords":null,"listId":null,"minShared":3,"depth":10,"mode":"head","locationCode":null,"languageCode":null,"maxCostMicros":0,"dryRun":true}'TypeScript
Python
Go
PHP
Ruby
Java
Responses
data, and its meta.Example
{
"data": {},
"meta": {
"requestId": "string",
"costMicros": 0,
"cached": true,
"cachedFrom": "string",
"dataAsOf": "string",
"sources": [
"string"
],
"partial": true,
"next": [
{
"tool": "string",
"args": {},
"why": "string"
}
],
"nextCursor": "string",
"dryRun": true
}
}Schema
datarequiredmetaobjectrequiredShow child parameters
requestIdstringrequiredcostMicrosintegerrequiredcachedbooleanrequiredcachedFromstringdataAsOfstringsourcesstring[]partialbooleanrequirednextobject[]requiredShow child parameters
toolstringargsobjectwhystringnextCursorstringdryRunbooleanX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-Request-IdstringExample
{
"error": "string",
"code": "string",
"next": "string",
"requestId": "string"
}Schema
errorstringrequiredcodestringnextstringrequestIdstringX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/cluster_keywords
WWW-AuthenticatestringSame as 400 · POST /api/v1/tools/cluster_keywords
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/cluster_keywords
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/cluster_keywords
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/cluster_keywords
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/cluster_keywords
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerRetry-AfterintegerSame as 400 · POST /api/v1/tools/cluster_keywords
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-Resetinteger