How to Architect JSON-LD Entity Graphs for AI Search & LLM Citation (GEO) Farrukh Abdullah Advisory published a three-layer JSON-LD entity-graph approach for making brands machine-verifiable to AI answer engines such as Google AI Overviews, ChatGPT Search and Perplexity. The method assigns each entity a persistent @id on a canonical "Entity Home" page, corroborates identity through sameAs links to Wikidata, ORCID, GitHub and B2B directories, and maps services and local entities with attribute-rich markup, with credentials and published research attached via hasCredential and CreativeWork nodes rather than sameAs. Entity SEO for AI search runs on 3 layers: a canonical Entity Home, cross-platform sameAs corroboration, and attribute-rich service and local entity mapping. This post shows the JSON-LD behind each layer, as we apply it at Farrukh Abdullah Advisory, where AI SEO Consulting & Visibility Measurement https://farrukh.top/services/ai-seo-consulting restructures websites into verifiable knowledge graphs. Entity SEO differs from keyword SEO in its unit of optimization: the entity an organization, person, service, or place rather than the keyword string. Google AI Overviews, ChatGPT Search, and Perplexity each compose answers from retrieved sources, so a brand with no unambiguous entity markup gives those systems less to verify. JSON-LD is a disambiguation signal, not a ranking switch. Layer 1 turns that principle into markup by giving each entity one permanent address. An Entity Home is the single page on your domain that holds the canonical record of one entity , identified in JSON-LD by a persistent @id . Assign each entity one @id as a URI fragment, such as https://yourdomain.com/ organization and https://yourdomain.com/ person , and reference that @id from every service page and article instead of redeclaring the entity. Markup without an @id creates an anonymous node, so two pages that each declare an Organization produce two unconnected Organizations instead of one shared one. A service page that references the Entity Home's @id joins the existing node: json { "@context": " https://schema.org https://schema.org ", "@type": "Service", "name": "Local SEO for HVAC Companies", "provider": { "@id": " https://farrukh.top/ organization https://farrukh.top/ organization " } } Once each entity has an @id, layer 2 connects that node to Wikidata, ORCID, GitHub, and Crunchbase. Layer 2: What belongs in a sameAs array? Four types of identity nodes belong in a sameAs array: structured knowledge bases, researcher registries, developer hubs, and B2B verification directories. Each entry is an independent page describing the same entity, so each one corroborates your Entity Home. Structured knowledge bases, such as Wikidata item Q141886354 Researcher registries, such as ORCID profile 0009-0001-9570-3897 Developer hubs, such as the GitHub profile yes155 B2B verification directories, such as GoodFirms, Clutch, and Crunchbase Each node belongs on the entity it describes: a Crunchbase person profile belongs on the Person, and a GoodFirms or Clutch company profile belongs on the Organization. Two further node types attach through other properties. Published research, such as the Zenodo whitepaper DOI 10.5281/zenodo.23701870 , belongs on a CreativeWork node whose author is your Person @id. Industry credentials from IBM, Moz, and BrightLocal belong under hasCredential. Those pages describe your work and qualifications rather than your identity, so sameAs is the wrong property for them. The full graph looks like this: JSON { "@context": " https://schema.org https://schema.org ", "@graph": { "@type": "Organization", "@id": " https://farrukh.top/ organization https://farrukh.top/ organization ", "name": "Farrukh Abdullah Advisory", "url": " https://farrukh.top/ https://farrukh.top/ ", "sameAs": " https://www.goodfirms.co/company/farrukh-abdullah-geo-semantic-seo-consultant https://www.goodfirms.co/company/farrukh-abdullah-geo-semantic-seo-consultant ", " https://clutch.co/pk/affiliate-marketing?page=2 https://clutch.co/pk/affiliate-marketing?page=2 " }, { "@type": "Person", "@id": " https://farrukh.top/ person https://farrukh.top/ person ", "name": "Farrukh Abdullah", "jobTitle": "Semantic SEO & GEO Consultant", "worksFor": { "@id": " https://farrukh.top/ organization https://farrukh.top/ organization " }, "sameAs": " https://orcid.org/0009-0001-9570-3897 https://orcid.org/0009-0001-9570-3897 ", " https://www.wikidata.org/wiki/Q141886354 https://www.wikidata.org/wiki/Q141886354 ", " https://github.com/yes155 https://github.com/yes155 ", " https://www.crunchbase.com/person/farrukh-abdullah https://www.crunchbase.com/person/farrukh-abdullah " }, { "@type": "CreativeWork", "name": "Entity-First Generative Engine Optimization GEO : Structuring Machine-Readable Knowledge Graphs for AI Search Citation", "url": " https://zenodo.org/records/23701870 https://zenodo.org/records/23701870 ", "identifier": " https://doi.org/10.5281/zenodo.23701870 https://doi.org/10.5281/zenodo.23701870 ", "author": { "@id": " https://farrukh.top/ person https://farrukh.top/ person " } } } Which attributes must match across every node? Three attributes must match character for character on every node: the entity name, the job title, and the third-person description. Entity reconciliation compares strings first, so "SEO Consultant" on one profile and "SEO Specialist" on another introduces an ambiguity that a single canonical string prevents. Copy each value from the Entity Home into every external profile, and re-check them whenever one changes. With identity established, layer 3 attaches areaServed and outcome metrics to those entities. Layer 3: How do you map service and local entities? To map service and local entities, declare areaServed with an explicit City or GeoShape in markup, and publish at least one verifiable outcome metric on the same page. The pattern holds for every local service vertical, and Local Entity SEO: Accurate Business Information and Useful Service Content covers the general case. The following example declares one named city and a 50 km radius for a hypothetical HVAC business: JSON { "@context": " https://schema.org https://schema.org ", "@type": "HVACBusiness", "@id": " https://example-hvac.com/ organization https://example-hvac.com/ organization ", "name": "Example HVAC Co.", "areaServed": { "@type": "City", "name": "Austin" }, { "@type": "GeoCircle", "geoMidpoint": { "@type": "GeoCoordinates", "latitude": 30.2672, "longitude": -97.7431 }, "geoRadius": 50000 } } areaServed accepts City, GeoShape, and plain text; a typed City or GeoCircle states the service area exactly, while plain text leaves it open to interpretation. The case studies below show what those attributes produced. Does entity clustering produce measurable results? Entity clustering produced measurable results in two documented case studies: +112% organic lead growth in 6 months and 1,200+ attributed inbound calls in 12 months. The +112% organic lead growth came from FinTech platform Windcave windcave.com , where payment category entity clusters and a payment-processing taxonomy restructuring drove the 6-month deployment. The 1,200+ inbound calls came from 12 regional US service assets in four competitive verticals contractors, HVAC, plumbing, and legal , attributed through dedicated call-tracking numbers, with the assets ranked in the Google Local 3-Pack. Each metric names its measurement source, which keeps the figure verifiable. The SEO Case Studies page documents both results. Where can developers find the open-source GEO toolkit? The open-source GEO toolkit lives at github.com/yes155/awesome-geo-seo, the curated collection for generative engine optimization.