Do the template pages earn their place
https://seolyticize.com /api/v1/tools/check_programmatic_pages Finds the site's template pages (the same path with one variable segment, minVariants or more of them; or one template given as a glob such as /sms/*) in a crawl and, for every variant: how much of its text is its own (the share no more than a third of its siblings repeat) and how close its nearest sibling is (simhash bits), whether it is thin against the template's median, and its demand (Search Console clicks and impressions over 90 days, stored search volume for its H1) — with a verdict: keep, merge (all but a duplicate of a sibling with more demand: fold it in) or noindex (thin or boilerplate, and no demand). Each template also gets checks with six 0–100 sub-scores (data, template uniqueness, URL, linking, thin risk, index management; null where unmeasured): a gate (100+ unreviewed pages is a warning, 500+ says stop), thin content (under 40% own text is thin, under 30% fails, under 300 words flagged), descriptions that open with the title, end on a stock call to action or share one shape with the name swapped in, URL rules (lowercase, hyphens, under 100 characters, no query string, one trailing-slash style, no duplicate slugs), links to 3–5 siblings, self-referencing canonicals, and Google's indexing (URL Inspection) against the pages meant to be indexed. checks.extras adds near-duplicate records (title, H1 and description sharing more than 80% of their words), boilerplate (pages whose copy is over 60% words most of the template's pages share), a review sample of 5% of the template, thinnest first (up to 10% is better), noindexed variants the sitemaps still list, and a crawl-budget notice past 10,000 pages. Answers 'which of our location pages should exist' and 'are these programmatic pages thin'. For the demand of combinations not yet built, use get_demand_matrix. Free.
Parameters
Idempotency-KeystringheaderRequest body
application/json
clientIdstringrequiredcrawlIdstringtemplatestringminVariantsintegerlimitinteger{
"clientId": "string",
"crawlId": "latest",
"template": null,
"minVariants": 10,
"limit": 5
}Code samples
cURL
curl -X POST "https://seolyticize.com/api/v1/tools/check_programmatic_pages" \
-H "Authorization: Bearer $SEOLYTICIZE_API_KEY" \
-H "Idempotency-Key: <value>" \
-H "Content-Type: application/json" \
-d '{"clientId":"string","crawlId":"latest","template":null,"minVariants":10,"limit":5}'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/check_programmatic_pages
WWW-AuthenticatestringSame as 400 · POST /api/v1/tools/check_programmatic_pages
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/check_programmatic_pages
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/check_programmatic_pages
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/check_programmatic_pages
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/check_programmatic_pages
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerRetry-AfterintegerSame as 400 · POST /api/v1/tools/check_programmatic_pages
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-Resetinteger