Do the template pages earn their place

Embed
Preview of the card
<a href="https://seolyticize.com/docs/ref-check-programmatic-pages"><img src="https://seolyticize.com/docs/_api/public/orgs/71cb2b7a-a719-4003-b3ea-6321dc1db8ab/spaces/3bf2dbf7-3faa-473c-ba3b-30588f5f8de4/pages/0ec2401d-f08c-46a6-b3d3-00b7eae10ea3/social-card.svg?v=3e7ae33eec8b" alt="Do the template pages earn their place" width="600" height="315"></a>
POSThttps://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-Keystringheader
Any unique string, up to 200 characters. A retry with the same key and body is answered from the first answer (Idempotent-Replayed: true) for a day, so it never buys or writes twice; the same key with another body is refused.

Request body

application/json
clientIdstringrequired
crawlIdstring
A crawl id from list_crawls, or "latest" for the newest complete one.
= latest
templatestring
= null
minVariantsinteger
= 10
limitinteger
= 5
{
  "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

200 The tool's result under 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
datarequired
metaobjectrequired
Beside every answer: what it cost, whether it came from cache, how fresh it is, whether it is complete, and what to call next.
Show child parameters
requestIdstringrequired
costMicrosintegerrequired
Charged by this call, micro-USD (1,000,000 = $1).
cachedbooleanrequired
True when nothing was bought.
cachedFromstring
When the oldest cached answer used was bought.
dataAsOfstring
sourcesstring[]
partialbooleanrequired
True when the data is incomplete: a running crawl, unfinished days, unread pages.
nextobject[]required
Show child parameters
toolstring
argsobject
whystring
nextCursorstring
Pass as cursor for the next page.
dryRunboolean
Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
X-Request-Idstring
The id to quote about this request.
400 The body was not JSON or did not match the tool's input schema.
Example
{
  "error": "string",
  "code": "string",
  "next": "string",
  "requestId": "string"
}
Schema
errorstringrequired
A sentence written for the caller. Internal failures are reduced to 'The request could not be completed.' and never carry detail.
codestring
A stable snake_case reason to branch on; GET /api/v1/errors lists them all.
nextstring
The call or step that fixes it, when there is one.
requestIdstring
Quote it when asking about a failure.
Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
401 No key, or a key that is unknown or revoked.

Same as 400 · POST /api/v1/tools/check_programmatic_pages

Headers
WWW-Authenticatestring
403 The key's role does not permit the tool, or the key may not reach the named client.

Same as 400 · POST /api/v1/tools/check_programmatic_pages

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
404 No tool by that name.

Same as 400 · POST /api/v1/tools/check_programmatic_pages

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
409 A request with this Idempotency-Key is still running.

Same as 400 · POST /api/v1/tools/check_programmatic_pages

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
422 A well-formed request the product declined, with the reason — a duplicate name, a plan limit, nothing configured to run.

Same as 400 · POST /api/v1/tools/check_programmatic_pages

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
429 This key has used its window.

Same as 400 · POST /api/v1/tools/check_programmatic_pages

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
Retry-Afterinteger
Seconds to wait before retrying.
500 The request could not be completed.

Same as 400 · POST /api/v1/tools/check_programmatic_pages

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
Updated