Entity Hub

Entity schema integration

The Entity Hub is the single source of truth for who you are: your Organization, WebSite, the people behind it, and your products. SEO Beast serves it as a JSON-LD graph from a public endpoint. Render that graph on every page and search engines and AI assistants see one consistent set of entities, updated the moment you edit them in the dashboard, with no deploy.

No authenticationCached 5 minutesCORS enabled

What the endpoint returns

GEThttps://api.seobeast.io/v1/public/{websiteSlug}/schema

data.graph is the ready-to-print JSON-LD document. data.ids lists the canonical @id of every entity so your page-level schema can reference them.

{
  "success": true,
  "data": {
    "ids": {
      "organization": "https://example.com/#organization",
      "website": "https://example.com/#website",
      "entities": {
        "jane-doe": "https://example.com/#/schema/person/jane-doe"
      }
    },
    "graph": {
      "@context": "https://schema.org",
      "@graph": [
        { "@type": "Organization", "@id": "https://example.com/#organization",
          "name": "Example Co", "url": "https://example.com",
          "logo": { "@type": "ImageObject", "url": "https://example.com/logo.png" },
          "sameAs": ["https://www.linkedin.com/company/example"],
          "founder": { "@id": "https://example.com/#/schema/person/jane-doe" } },
        { "@type": "WebSite", "@id": "https://example.com/#website",
          "url": "https://example.com", "name": "Example Co",
          "publisher": { "@id": "https://example.com/#organization" } },
        { "@type": "Person", "@id": "https://example.com/#/schema/person/jane-doe",
          "name": "Jane Doe", "jobTitle": "Founder",
          "worksFor": { "@id": "https://example.com/#organization" },
          "knowsAbout": ["Strength training"], "sameAs": ["https://x.com/janedoe"] }
      ]
    },
    "entities": [ /* raw Entity Hub rows */ ],
    "updatedAt": "2026-09-30T00:00:00.000Z"
  }
}

@id convention

Organization https://{domain}/#organization

WebSite https://{domain}/#website

Anything else https://{domain}/#/schema/{entityType}/{slug}

Why server-side matters

ChatGPT, Perplexity, Claude and most other AI crawlers fetch the raw HTML of a page and never execute JavaScript. Googlebot renders JS, but on a delayed second pass. If your JSON-LD is injected by a client-side script, a tag manager, or a React effect, the AI engines simply never see it.

Every integration below fetches the graph on the server and prints it into the document, so the <script type="application/ld+json"> tag is present in the first byte of HTML. The response is cached (by SEO Beast for 5 minutes and by your site for the window you choose), so it adds no meaningful latency and survives an API outage.

Quick check: open any page, choose “View page source” (not the DevTools element inspector) and search for #organization. If it is not there, AI crawlers cannot see it either.

Install

A single dependency-free TypeScript file for the App Router. It fetches the graph with ISR, times out after 4 seconds, never throws, and falls back to a graph you supply (or a minimal Organization built from a name and URL) if the endpoint is unreachable.

Download seobeast-schema.ts
  1. Copy the file into your project (e.g. lib/seobeast-schema.ts) and create the instance once.
    // lib/schema.ts
    import { createSeobeastSchema, ids } from "./seobeast-schema";
    
    export const site = ids("example.com"); // the domain set in SEO Beast
    
    export const { getEntityGraph, EntityGraphScript } = createSeobeastSchema({
      websiteSlug: "your-website-slug",     // from the SEO Beast dashboard
      revalidateSeconds: 3600,              // optional, default 1 hour
      fallback: { name: "Example Co", url: "https://example.com" }, // or a full graph
    });
  2. Add <EntityGraphScript /> to your root layout. It is an async server component, so the graph is in the raw HTML of every page.
    // app/layout.tsx
    import { EntityGraphScript } from "@/lib/schema";
    
    export default function RootLayout({ children }: { children: React.ReactNode }) {
      return (
        <html lang="en">
          <head>
            <EntityGraphScript />
          </head>
          <body>{children}</body>
        </html>
      );
    }
  3. Reference entities by @id from page-level schema. Use ids(domain) and ref(id) instead of repeating the author or publisher details on every page.
    // app/blog/[slug]/page.tsx — reference entities by @id, don't repeat them
    import { ref } from "@/lib/seobeast-schema";
    import { site } from "@/lib/schema";
    
    const article = {
      "@context": "https://schema.org",
      "@type": "Article",
      headline: post.title,
      author: ref(site.person("jane-doe")),  // https://example.com/#/schema/person/jane-doe
      publisher: ref(site.organization),     // https://example.com/#organization
    };

Options

  • websiteSlug — required, from the SEO Beast dashboard.
  • baseUrl — defaults to https://api.seobeast.io/v1/public.
  • revalidateSeconds — ISR window, default 3600.
  • fallback — a full graph object, or { name, url } for a minimal Organization + WebSite. Omit to render nothing on failure.

Referencing entities by @id

Once the graph is on every page, your page-level schema (Article, Product, FAQ, Course…) should point at the entities instead of redefining them. A reference is just { "@id": "…" }:

"author":    { "@id": "https://example.com/#/schema/person/jane-doe" },
"publisher": { "@id": "https://example.com/#organization" }

Search engines and AI models merge the reference with the full node, so every article on the site is attributed to the same well-described person and organisation. That consistency is what earns citations.

More docs