Skip to content

fix: untangle docs SEO metadata and add a Phone Search guide - #68

Merged
trichardswp merged 7 commits into
mainfrom
api-docs-seo-fixes
Oct 13, 2026
Merged

trichardswp merged 7 commits into
mainfrom
api-docs-seo-fixes

Conversation

@lhagenWP

@lhagenWP lhagenWP commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

Why

Person Search, Property Search, and Reverse Phone Lookup share their
frontmatter title with every internal anchor pointing at them, so pages
that compete with a consumer Whitepages surface for the same term read
as bare capability names everywhere a link points at them. The site
also shipped with no canonical tag, an incomplete Open Graph block, a
hardcoded Twitter card that drifted from Open Graph, no structured
data at all, and a public README that named the wrong product with no
description of what the API returns. Phone Search and Reverse Phone
Lookup also shared one guide with no entry point of its own in the
left rail, even though they answer different questions. Separately,
Person Search's parameter table had drifted out of sync with the
actual endpoint, missing email entirely.

What Changed

  • Person Search, Property Search, and Reverse Phone Lookup are now
    API-qualified in frontmatter and every hardcoded card, propagating
    to the H1, sidebar, cards, Related links, and llms.txt. Every page
    emits a self-referencing canonical link and a complete Open Graph
    block; Twitter tags inherit from Open Graph instead of drifting. The
    sitewide keywords tag and "comprehensive" are gone. A
    check-heading-case script, wired into just validate, fails CI on
    a Title Case H2 or H3.
  • Every page now renders one JSON-LD block (Organization, WebAPI,
    TechArticle, and a matching BreadcrumbList where one is visible).
  • The README names "Whitepages Pro API" and carries an About section;
    Getting Started and the structured data description use the same
    wording.
  • The Guides rail and the References rail now order the shared
    entities (person, property, phone, events, webhooks, regions) the
    same way: data APIs first, then agent-facing guides, then
    operational ones.
  • Phone Search is a new guide for the dedicated phone-lookup endpoint,
    separate from Reverse Phone Lookup's person-search-by-phone content.
    Each guide opens with a callout pointing at the other.
  • Patches a one-line bug in fumadocs-openapi that renders a <div>
    inside a <p> on every reference page's Authorization section,
    causing a hydration error. Upstream fixed it in 10.10.3, but that
    release needs a newer fumadocs-core/fumadocs-ui than this repo pins;
    bun patch applies just the fix to the installed 10.1.1.
  • Person Search's parameter table and the capability map now list
    email, radius, page, and page_size alongside the parameters
    they already documented, matching what GET /v2/person/ actually
    accepts.

Context

Seven independent commits, one per concern, so each can be reviewed
and reverted on its own: metadata/anchors, structured data, README,
rail order, Phone Search, the fumadocs-openapi patch, and the Person
Search parameter audit.

@lhagenWP
lhagenWP force-pushed the api-docs-seo-fixes branch 4 times, most recently from 5fb2b98 to f6df78e Compare October 13, 2026 17:17
Comment thread content/docs/documentation/getting-started.mdx Outdated
Comment thread content/docs/documentation/phone-search.mdx Outdated
Comment thread content/docs/documentation/phone-search.mdx Outdated
Comment thread content/docs/documentation/phone-search.mdx Outdated
Comment thread README.md Outdated
Fumadocs reuses one frontmatter title for four jobs: the sidebar
label, the H1, the <title> tag, and the anchor text of every card and
Related link pointing at that page. Person Search, Property Search,
and Reverse Phone Lookup compete with consumer Whitepages surfaces for
the same terms, so every internal link aimed at them read as a bare
capability name instead of the developer product. The site also
shipped with no canonical tag, an incomplete Open Graph block, a
hardcoded Twitter card that drifted from Open Graph and still called
the product "comprehensive," a keywords tag carrying a do-not-market
term, and heading case split between Title Case and sentence case.

Person Search, Property Search, and Reverse Phone Lookup are now
API-qualified in frontmatter and in every hardcoded card, so the title
change propagates to the H1, sidebar, cards, Related links, and
llms.txt from one edit per page. Pages with no competing consumer
surface keep their bare titles. Every page now emits a
self-referencing canonical link and a complete Open Graph block
(title, description, url, type, site_name); Twitter tags are no
longer hardcoded and inherit from Open Graph instead. The sitewide
keywords tag and "comprehensive" are gone. A check-heading-case script,
wired into `just validate`, fails CI on a Title Case H2 or H3 in
content/docs/, and every existing heading has been converted to
sentence case.
No page on the Pro API docs site emits any structured data, so the
entity "Whitepages Pro API" resolves to nothing machine-readable. A
model reading these docs has to infer what the product is from prose
instead of reading a typed assertion.

Every page now renders one JSON-LD block with an Organization and a
WebAPI node, both defined once as fixed constants so their @id values
stay byte-identical across all pages, plus a page-specific TechArticle
node carrying that page's own headline and description. Pages that
render a breadcrumb trail also get a matching BreadcrumbList, built
from the same page tree data the visible breadcrumb uses so the two
can never disagree.
This repo is public, so the README and MDX source reach AI training
data independently of the rendered site. The README named the wrong
product and said nothing about what the API returns, going straight
from a six-word line into install instructions.

The README now names "Whitepages Pro API" in its heading and opening
line, and carries an About section above Development stating what the
API returns, that coverage is U.S.-only and varies by record, and that
it is not FCRA-regulated. Getting Started and the structured data's
WebAPI description use the same wording, so the three surfaces agree.
The Guides section listed person search, webhooks, events, regions,
property search, MCP, agentic guidance, and FAQ in no particular
order, so the two core data guides sat apart and operational guides
preceded the second data guide. The References rail ordered the same
entities differently again, so the two sidebars disagreed with each
other.

Reorders Guides to person search, property search, MCP, agentic
guidance, events, webhooks, regions, FAQ: both data APIs first, then
the agent-facing guides, then the operational ones. Reorders the
matching References entries (person, property, phone, events,
webhooks, regions) to the same relative sequence; account has no
Guides counterpart and moves to the end of that run.
GET /v2/phone/{phone} and GET /v2/person/ with phone= answer different
questions but shared one guide, so a reader looking for the number's
own facts and a reader looking to rank people against a number landed
on the same page with no clear entry point of its own in the left
rail.

Adds Phone Search as its own top-level guide covering the dedicated
endpoint: line type, carrier, the businesses it returns that person
search cannot, and the spellings that resolve to one resource. Reverse
Phone Lookup keeps the person-search-by-phone content it already had.
Each guide opens with a callout pointing at the other for the opposite
use case, and the capability map, Getting Started, the changelog entry,
and the phone reference page now point at whichever guide fits the
question being answered.
Every reference page renders an Authorization section through
fumadocs-openapi's Operation component. When an endpoint declares
exactly one security scheme — true for every endpoint here, since they
all use the same API key header — it wraps that scheme's label, built
as a <div>, inside a <p> tag. A <div> cannot be a descendant of a <p>,
so React logs a hydration error on every reference page.

The fix landed upstream in 10.10.3, but that release also bumps the
fumadocs-core/fumadocs-ui peer requirement past what this repo pins,
breaking the build on an unrelated i18n export. Patches the one-line
change directly onto the installed 10.1.1 via `bun patch` instead of
taking the wider upgrade.
Person Search's Request Parameters table listed 14 of the 18
parameters GET /v2/person/ actually accepts. email was absent
entirely, and radius, page, and page_size were each already
documented on their own dedicated guide but never made it into the
page that bills itself as the parameter reference. The capability map
had the same gap: every other way to find a person had a row, but
searching by email did not.

Adds the four missing parameters to Person Search's table, linking out
to Search by Radius and Pagination for the parameters with more
behavior to explain, and adds a "find a person by email" row to the
capability map's People table.
@trichardswp
trichardswp merged commit 0c915d4 into main Oct 13, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants