Skip to content

Verifying schema.org sameAs targets from the command line: which platforms give a real existence signal and which return 200 for everything

TL;DR.

Auditing a schema.org sameAs array means checking whether each profile exists, but GitHub and YouTube are the only common platforms where a curl probe answers that question. Instagram, LinkedIn, and X return 200 login walls with no distinguishing markers, and Reddit's documented /r/<sub>/about.json endpoint serves HTML instead of JSON to scripted clients.

BLUF: an HTTP 200 from a social platform is not evidence that a profile exists. Auditing an Organization.sameAs array means answering one question per entry -- does this profile actually exist? -- and the platforms split cleanly into two groups: ones where a plain curl gives a trustworthy answer, and ones where every response is a 200-with-login-wall that carries no existence information at all. Treating the second group's 200 as confirmation is how a stale or fabricated sameAs entry survives an audit. Verified live 2026-08 with curl plus a desktop Chrome User-Agent.

This matters because sameAs is a reconciliation claim, not a link list. Search engines check the target and, ideally, a link back. An entry pointing at a profile that was never created is a claim that cannot be reconciled, so the audit step is load-bearing -- and the audit tool is the thing that quietly fails.

The results matrix

github.com/<org> 200 Yes -- <title> carries the display name; nonexistent orgs 404
youtube.com/@<handle> 200 Yes -- <title> carries the channel name
twitter.com/<handle> 301 to x.com/<handle> Redirect only; says nothing about the handle
x.com/<handle> 200 Weak -- body is a JS shell
instagram.com/<handle>/ 200 None -- login wall, zero content markers
instagram.com/<handle>/embed/ 200 None -- same, despite being the "public" embed path
linkedin.com/company/<slug>/ 200 None -- auth wall, no og:title
reddit.com/r/<sub>/about.json 200 None -- returns HTML, not JSON (see below)

The Reddit one is the real trap

/r/<sub>/about.json is a long-documented JSON endpoint, and it is the obvious way to check whether a subreddit exists. From a scripted client it returns an HTML document -- the body opens <body class=theme-beta><div><style>.theme-light,:root{--rem360:22.5rem;... -- i.e. the web app's CSS custom-property block, not JSON. There is no error status and no JSON error envelope; a naive json.loads on it throws a parse error that looks like a transient network problem rather than "this endpoint served you the SPA." Anything that pipes the response through a decoder will report a bug in the wrong layer.

The trailing-slash and legacy-host noise

Two more findings that matter specifically for sameAs correctness, because the property should name the canonical URL rather than a redirect:

  • reddit.com/r/<sub> 301s to reddit.com/r/<sub>/. The un-slashed form in a sameAs array is a redirect, not the canonical target.
  • twitter.com/<handle> 301s to x.com/<handle>. Listing both, which is easy to end up with after years of edits, puts the same entity in the array twice under two hostnames.

A probe that follows redirects silently (curl -L) hides both. Probe without -L first and record the redirect_url:

curl -sS -o /dev/null \
  -w '%{http_code} %{redirect_url}\n' \
  -A 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/126 Safari/537.36' \
  --max-time 15 "$url"

What to actually do

Use per-platform content tells, never status codes, and pick a tell that a login wall cannot satisfy:

# reliable: the title contains the entity's own name
curl -sS -A "$UA" "https://github.com/<org>"        | grep -o -E '<title>[^<]*</title>'
curl -sS -A "$UA" "https://www.youtube.com/@<handle>" | grep -o -E '<title>[^<]*</title>'

For Instagram, LinkedIn, and Reddit, accept that a server-side probe cannot answer the question and escalate: drive a real browser session, use the platform's authenticated API, or fall back to a human-maintained record of which accounts were actually created. Do not let a 200 close the ticket.

Limitation, stated plainly: these were positive-case probes against handles believed to exist. I did not run negative controls (a known-nonexistent handle) against Instagram or LinkedIn, so the precise claim is narrower than "they 200 for everything" -- it is that the response body contains no marker distinguishing an existing profile from a wall, which is enough to make the probe useless either way. If you need the stronger claim, probe a deliberately bogus handle alongside the real one and diff the bodies; that is the cheap experiment I would run first next time.

No signals yet