Build a comparison page
https://seolyticize.com /api/v1/tools/build_comparison_page Plans an honest comparison page — vs (the client against one rival), alternatives (to the first competitor), roundup (best tools in a category) or table — from what each product publishes: its pricing and feature pages (and any sourceUrls) are read and a feature matrix filled, each cell ✅, ⚠️ partial, ❌ or 'Not publicly available' with its source URL, and every price 'as of' the read. Gives the title from the pageType's template, an H1 under 70 characters, a sourced outline of at least 1,500 words with calls to action above the fold, after the table and at the end (never inside a competitor's section), each competitor's strengths acknowledged, the client's product named as the client's, JSON-LD (SoftwareApplication with offers; ItemList in ranked order for roundups; no AggregateRating without real review data) checked against Google's requirements; each product's hidden costs from its pricing page (setup fees, per-user pricing, overages, transaction fees, annual-only billing, minimum seats), a 'Last updated' stamp, related comparisons to link, and checks that the outline carries a methodology section, the hidden costs and related comparisons; and the comparison searches by pattern ('[a] vs [b]', '[a] vs [b] pricing', 'is [a] better than [b]', '[a] alternatives', '[a] alternatives [year]', '[a] review [year]', 'best [category] tools', '[category] comparison'), with demand: true their volumes (one paid keyword-metrics read). Answers 'write a vs page against our rival' and 'what should our alternatives page say'. The outline is one metered Claude call; quote with estimate_cost.
Parameters
Idempotency-KeystringheaderRequest body
application/json
clientIdstringrequiredpageTypestringrequiredcompetitorsobject[]requiredShow child parameters
namestringrequireddomainstringrequiredfeaturesstring[]sourceUrlsstring[]categorystringdemandbooleaninstructionsstringmaxCostMicrosintegerdryRunboolean{
"clientId": "string",
"pageType": "vs",
"competitors": [
{
"name": "string",
"domain": "string"
}
],
"features": [],
"sourceUrls": [],
"category": null,
"demand": true,
"instructions": null,
"maxCostMicros": 0,
"dryRun": true
}Code samples
cURL
curl -X POST "https://seolyticize.com/api/v1/tools/build_comparison_page" \
-H "Authorization: Bearer $SEOLYTICIZE_API_KEY" \
-H "Idempotency-Key: <value>" \
-H "Content-Type: application/json" \
-d '{"clientId":"string","pageType":"vs","competitors":[{"name":"string","domain":"string"}],"features":[],"sourceUrls":[],"category":null,"demand":true,"instructions":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/build_comparison_page
WWW-AuthenticatestringSame as 400 · POST /api/v1/tools/build_comparison_page
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/build_comparison_page
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/build_comparison_page
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/build_comparison_page
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/build_comparison_page
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerRetry-AfterintegerSame as 400 · POST /api/v1/tools/build_comparison_page
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-Resetinteger