Plan the editorial calendar
https://seolyticize.com /api/v1/tools/plan_content Builds and stores an editorial calendar for the coming months at a cadence (weekly ≈ 4 a month, fortnightly 2, monthly 1, or a number a month) from the topic map (Search Console clusters with no strong page: write; clusters on page two: refresh), extraKeywords not yet covered, the keyword registry (a keyword another page owns becomes a refresh of that page, never a second page), and seasonality (stored monthly volumes; trends: true reads Google Trends for the top items, paid): seasonal pieces land two months before their peak, the rest in order of value. Each item carries its keyword and cluster, ready-made build_content_brief arguments, target URL, internal links to add (to and from), search volume, estimated monthly clicks at position 3 and their value (clicks × CPC). hubs lays each pillar with three or more clusters out as a hub — one pillar (2,500–4,000 words), 2–5 clusters of 2–4 spokes (1,200–1,800 words), templates by intent, a link matrix (spoke ↔ pillar mandatory, 2–3 spoke-to-spoke, at most one cross-cluster) — and scores the live site's links against it: no orphans, pillar links both ways, 80% of planned links present. Answers 'what should we publish over the next quarter'. Read back with list_content_plan; change items with update_content_plan_item.
Parameters
Idempotency-KeystringheaderRequest body
application/json
clientIdstringrequiredmonthsintegercadencestring | integerstartMonthstringseedstringextraKeywordsstring[]trendsbooleanincludeRefreshesbooleanmaxCostMicrosintegerdryRunboolean{
"clientId": "string",
"months": 3,
"cadence": "weekly",
"startMonth": null,
"seed": null,
"extraKeywords": [],
"trends": false,
"includeRefreshes": true,
"maxCostMicros": 0,
"dryRun": true
}Code samples
cURL
curl -X POST "https://seolyticize.com/api/v1/tools/plan_content" \
-H "Authorization: Bearer $SEOLYTICIZE_API_KEY" \
-H "Idempotency-Key: <value>" \
-H "Content-Type: application/json" \
-d '{"clientId":"string","months":3,"cadence":"weekly","startMonth":null,"seed":null,"extraKeywords":[],"trends":false,"includeRefreshes":true,"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/plan_content
WWW-AuthenticatestringSame as 400 · POST /api/v1/tools/plan_content
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/plan_content
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/plan_content
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/plan_content
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/plan_content
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerRetry-AfterintegerSame as 400 · POST /api/v1/tools/plan_content
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-Resetinteger