42ADocs
Analytics

Page vitals

Per-page feature scores. Sort by score_low to find what to fix.

Page vitals are the per-page feature scores for each tracked page on your brand's site — JS rendering quality, content depth, schema correctness, etc. They're scored 0-1 per feature, with a reason string explaining each score.

For site-wide config (robots.txt, llms.txt, sitemap, canonical setup, etc.), see general vitals — that's the right starting point for "what should I fix on my website?". Use page vitals to drill into specific pages once site-wide config is in good shape.

Sort by score_low to surface the worst-performing pages first.

Worst-scoring pages first

curl -H "Authorization: Bearer $KEY" \
  "https://api.42a.ai/api/v1/page-vitals?brand_id=brn_xxx&sort=score_low&limit=5"
const url = new URL("https://api.42a.ai/api/v1/page-vitals");
url.searchParams.set("brand_id", "brn_xxx");
url.searchParams.set("sort", "score_low");
url.searchParams.set("limit", "5");

const pages = await fetch(url, {
  headers: { Authorization: `Bearer ${KEY}` },
}).then((r) => r.json());

for (const p of pages.data) {
  const failing = p.feature_scores.filter((s) => s.score < 0.5);
  console.log(p.url, "→ fix:", failing.map((s) => s.feature_id).join(", "));
}
import requests

pages = requests.get(
    "https://api.42a.ai/api/v1/page-vitals",
    params={"brand_id": "brn_xxx", "sort": "score_low", "limit": 5},
    headers={"Authorization": f"Bearer {KEY}"},
).json()

for p in pages["data"]:
    failing = [s for s in p["feature_scores"] if s["score"] < 0.5]
    print(p["url"], "→ fix:", ", ".join(s["feature_id"] for s in failing))

Sort options

The sort query param picks the order pages come back in. Pagination is correct under the chosen order - the cursor encodes the active sort key.

sortReturnsUse for
recent (default)newest tracked pages first"what got added recently?"
score_lowworst feature score first"what should I fix?"
score_highbest feature score first"show me the wins"
citationsmost cited in last 30d first"what's already getting picked up?"
last_checkedmost recently rescanned first"what did the latest crawl find?"

Response

Each page in the response has a feature_scores array - one entry per quality dimension we measure. The reason field on each score is a human-readable explanation of why we marked it that way.

{
  "data": [
    {
      "id": "tpg_xxx",
      "url": "https://acme.com/pricing",
      "title": "Pricing | Acme",
      "page_type": "pricing_page",
      "citation_count_30d": 12,
      "citation_trend_30d": [0, 1, 0, 2, 1, ...],
      "avg_score": 0.43,
      "feature_scores": [
        {
          "feature_id": "has_llms_txt",
          "score": 0.0,
          "reason": "No /llms.txt found at root.",
          "created_at": 1730000000000
        },
        {
          "feature_id": "js_rendering_ssr",
          "score": 0.6,
          "reason": "Critical content rendered client-side; LLMs may miss it.",
          "created_at": 1730000000000
        }
      ],
      "last_checked_at": 1730000000000
    }
  ]
}

Common questions this answers

  • "What should I improve on my website to lift visibility?" → start with general vitals for site-wide config; then this endpoint with sort=score_low to drill into per-page issues.
  • "Which pages are doing the most for me?"sort=citations. These are the pages already getting picked up.
  • "Did my recent fix work?"sort=last_checked, look for the page you fixed and check its avg_score trend.

See also

Last updated