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.
sort | Returns | Use for |
|---|---|---|
recent (default) | newest tracked pages first | "what got added recently?" |
score_low | worst feature score first | "what should I fix?" |
score_high | best feature score first | "show me the wins" |
citations | most cited in last 30d first | "what's already getting picked up?" |
last_checked | most 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_lowto 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 itsavg_scoretrend.
See also
- Reference:
/api/v1/page-vitals - The full feature-score catalog is documented in your dashboard under Settings → Page features.
Last updated