squirrelscan
GitHub

entities

Query the entity map of a stored audit

Every audit builds an entity map: the JSON-LD your pages declare, collapsed across the whole site into one graph. Two pages that both describe the same Organization become one entity with two declaring pages, and a publisher reference that points at an @id nothing declares becomes a dangling edge.

The entities command queries that map without re-crawling anything.

Usage

squirrel entities [query] [options]

Arguments

ArgumentDescription
queryAn entity @id, key or name (optional, defaults to a summary)

Options

OptionAliasDescriptionDefault
--list-lList stored audits and their entity countsfalse
--crawlCrawl ID (or 8-character prefix) to readlatest
--typeOnly entities of these @type values (repeatable or comma-separated)all
--pageOnly entities declared on a page whose URL contains this text (repeatable)all
--problemOnly entities with these problems: no-id, conflict, dangling, single-page, split-identityall
--format-fOutput format: json, jsonld, html, markdown, csv, dot, graphml, mermaidconsole, or markdown when piped
--output-oWrite to a file instead of stdout-
--input-iRead an exported entity map JSON instead of the store-
--diffCompare two audits: the previous and latest by defaultfalse

Summary

With no arguments, you get the ten most-declared entities and anything worth fixing.

squirrel entities
ENTITY MAP
https://docs.squirrelscan.com/ · 4f2ab91c · 13/09/2026, 00:23

183 entities, 489 references, 100% with a stable @id, across 60 pages

squirrelscan (WebSite) 60x on 60 page(s) https://docs.squirrelscan.com/#website
Introduction (WebPage) 1x on 1 page(s) https://docs.squirrelscan.com/

One entity

Pass an @id, a key or a name. Names match loosely and case-insensitively, so squirrel entities acme finds Acme Widgets Ltd.

squirrel entities "https://example.com/#organization"
squirrel entities acme

The lookup prints the entity’s properties, every page that declares it, its outgoing references, and any property whose value disagrees between pages.

Filters

--type, --page and --problem apply to every output format, not just the console view. -f graphml --type Organization hands your graph tool the filtered graph, and the summary counts describe what survived the filter rather than the whole site.

squirrel entities --type Organization,Person
squirrel entities --page /blog/ -f csv
squirrel entities --problem no-id --problem conflict

Problems

ValueWhat it selects
no-idDeclared on several pages with no @id to reconcile them by
conflictA property whose value disagrees between pages
danglingReferences an @id that nothing on the site declares
single-pageDeclared on exactly one page
split-identityOne thing declared under two or more identities

Export formats

FormatUse it for
jsonThe canonical document, including every page
jsonldA @graph you can paste into a validator
htmlAn interactive, self-contained graph you can open in a browser
markdownA table for a pull request or an agent
csvTwo tables, entities and references, for a spreadsheet
dotGraphviz
graphmlGephi, yEd, Cytoscape
mermaidA diagram inside a Markdown file
squirrel entities -f graphml -o entities.graphml
squirrel entities -f dot | dot -Tsvg > entities.svg

Comparing two audits

--diff reports what changed between two audits of the same site: entities added and removed, entities that gained or lost an @id, new and resolved conflicts, and new and resolved dangling references.

squirrel entities --diff
squirrel entities --diff --crawl 4f2ab91c --crawl 9c1de77a
squirrel entities --diff --input before.json --input new.json
squirrel entities --diff -f json

With no arguments it compares the latest audit against the previous audit of the same site. One --crawl names the newer side and the previous audit of that site becomes the older one. Two name both sides. --input takes exactly two files when used with --diff, and it is repeat-only, because a path can contain a comma.

--diff accepts -f markdown (the default) or -f json.

Not crawled again

Two audits of a site rarely cover the same pages. A smaller crawl, a changed page cap or a section that started returning 404 all shrink the page set, and a naive comparison reports every entity on a page that simply was not visited as removed.

So an entity is only removed when every page that declared it was crawled again. Everything else is reported separately as not crawled again, and the diff lists the pages each audit saw that the other did not.

The same rule governs fixes. A conflict or a dangling reference counts as resolved only when the entity survived and all of its declaring pages were visited again, because a conflict needs two declarations to exist and seeing one of them tells you nothing.

An entity that gained or lost an @id is matched across the key change on its type and name, so it is reported once rather than as a removal plus an addition. That match says the entity changed, not that the pages which were wrong are the pages that were fixed, so each row carries a coverage column.

proven needs both halves: the newer audit visited every page that declared the old version, and it found the replacement on all of them. partial means one of those could not be established. Either half alone is satisfied by a site that is not fixed. Recrawling the broken pages proves nothing if the markup was deleted there and the identified entity turned up elsewhere; finding it elsewhere proves nothing about pages that were never revisited.

A missing row is not proof of failure either. The match needs the type and the name to be unchanged, so changing the @id and the name together appears as a removal plus an addition.

Listing stored maps

squirrel entities --list
Entity maps:
==============================================================================================
ID         Date                  Pages   Entities  Stable @id  Conflicts  Site
----------------------------------------------------------------------------------------------
4f2ab91c   13/09/2026, 00:23     60      183       100%        0          https://docs.squirrelscan.com/
9c1de77a   12/09/2026, 23:04     60      0         0%          0          https://docs.squirrelscan.com/

Exit codes

entities exits 0 on every path that produced an answer, including a site that declares no JSON-LD at all. That is a finding, not a failure. Only a usage mistake or an unreadable store exits 1.

References

Type to search…

↑↓ navigate↵ openesc close