# Structured Data (Schema.org) Matrix
A map of every JSON-LD `schema.org` type emitted across the docs site, the
source that emits it, and the pages/components it applies to. Introduced in
[PR #897](https://github.com/keploy/docs/pull/897) (site health + AI-citation
fixes). Use this as the single reference when adding, moving, or debugging
structured data.
> **Why this exists:** JSON-LD nodes that share an `@id` are merged by
> consumers (Google, LLM answer engines). Canonical entities are declared once
> in `src/schema/siteEntities.js` and referenced by `@id` everywhere else, so
> the graph stays consistent. See the header comment in that file.
## 1. Site-wide graph (every route)
Injected into the `
` of **every** page via `headTags` in
`docusaurus.config.js` (`innerHTML: JSON.stringify(siteGraph)`).
| Schema type | `@id` | Source | Applies to |
| --------------------- | --------------------------------- | ---------------------------------------------------------- | ---------- |
| `Organization` | `https://keploy.io/#organization` | `src/schema/siteEntities.js` → `siteGraph` | All routes |
| `WebSite` | `https://keploy.io/docs/#website` | `src/schema/siteEntities.js` → `siteGraph` | All routes |
| `SoftwareApplication` | `https://keploy.io/#keploy` | `src/schema/siteEntities.js` → `siteGraph` | All routes |
| `ImageObject` | `https://keploy.io/#logo` | nested in `Organization.logo` | All routes |
| `SearchAction` | — | nested in `WebSite.potentialAction` (sitelinks search box) | All routes |
These three nodes are referenced by `@id` (`organizationRef`, `websiteRef`)
from the per-page schemas below, so the per-page nodes never re-declare the
publisher/author organization.
## 2. Per-doc schema (Markdown pages via `DocItem`)
Emitted by `src/theme/DocItem/index.js` for pages rendered through the docs
theme. Type is chosen per page from front matter, path, and content.
| Schema type | When it applies | Key logic in `DocItem` |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------- | --------------------------- |
| `TechArticle` | Default for any normal doc page | `schemaType` fallback |
| `APIReference` | `/running-keploy/public-api` and `/running-keploy/cli-commands`, or `apiReference: true` / `type: api` front matter | `isApi` |
| `BlogPosting` | `type: blog` / `blog: true` front matter, or `blog` tag | `isBlog` |
| `[, LearningResource]` | Quickstart tutorials — `/quickstart//`; adds `learningResourceType: "Tutorial"` | `isQuickstart` |
| Custom via front matter | `schemaType:` / `schema_type:` front matter overrides all detection | `schemaTypeFromFrontMatter` |
| `DefinedTerm` | Glossary term pages — `/concepts/reference/glossary//`; joins the glossary `DefinedTermSet` by `@id` | `isGlossaryTerm` |
| `CollectionPage` | Section index pages (source is `index.md`/`README.md`, not the docs root) | `isCategoryHub` |
| _(suppressed)_ | Docs root, versioned roots (`/docs/4.0.0/`), category index pages — emit only breadcrumbs | `suppressArticleSchema` |
Every `Article`-family node references `organizationRef` (publisher/author
fallback) and `websiteRef` (`isPartOf`), and carries a fallback social-card
`image` (`static/img/keploy-docs-card.png`).
## 3. Breadcrumbs (docs pages)
| Schema type | Source | Applies to |
| ----------------------------- | ---------------------------------------------- | --------------------------------------- |
| `BreadcrumbList` + `ListItem` | `src/theme/DocBreadcrumbs/index.js` | Every docs page with a breadcrumb trail |
| `BreadcrumbList` + `ListItem` | `breadcrumbList()` helper in `siteEntities.js` | Bespoke React pages (see §5) |
## 4. Content-injected schema (Markdown authoring)
| Schema type | Source | Applies to |
| ------------------------------------------------------------------- | -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| `FAQPage` → `Question` / `Answer` | `src/remark/remarkFaqSchema.js` (remark plugin, wired in `docusaurus.config.js`) | `*-faq.md` pages: `keploy-explained/api-testing-faq`, `integration-testing-faq`, `unit-testing-faq` |
| `HowTo` → `HowToStep`, `HowToSupply`, `HowToTool`, `MonetaryAmount` | `src/components/HowTo.js` (used as `` in MDX) | ~44 quickstart / installation / server docs |
The `remarkFaqSchema` plugin auto-detects FAQ docs by the `-faq.md` filename,
turns each `##`/`###` heading into a `Question`, and only emits when it finds
≥2 Q&A pairs (skips the `## Related` divider).
## 5. Bespoke React pages (`src/pages/*`)
Each hand-built page emits its own JSON-LD, using `organizationRef` /
`websiteRef` / `breadcrumbList()` from `siteEntities.js` for consistency.
| Page (route) | Source | Schema types emitted |
| ---------------------------------------------------- | ------------------------------------------ | ----------------------------------------------------------- |
| Home (`/docs/`) | `src/pages/index.js` | `CollectionPage`, `ItemList` + `ListItem`, `BreadcrumbList` |
| About (`/about`) | `src/pages/about.js` | `AboutPage`, `BreadcrumbList` |
| Leadership (`/leadership`) | `src/pages/leadership.js` | `CollectionPage`, `ItemList` + `ListItem`, `Person` |
| Application Development (`/application-development`) | `src/pages/application-development.js` | `WebPage`, `ItemList` + `ListItem`, `BreadcrumbList` |
| Security (`/security`) | `src/pages/security.js` | `WebPage`, `Organization`, `ContactPoint` |
| Privacy Policy (`/privacy-policy`) | `src/pages/privacy-policy.js` | `DigitalDocument` |
| Glossary hub (`/concepts/reference/glossary/`) | `src/pages/concepts/reference/glossary.js` | `DefinedTermSet` + `DefinedTerm`, `BreadcrumbList` |
| Community | `src/components/Community.js` | `ItemList` + `ListItem` |
The glossary hub's `DefinedTermSet` (`@id` = `TERMSET_ID`) is the set that each
individual glossary term page's `DefinedTerm` (§2) joins via `inDefinedTermSet`.
## Quick reference: type → source
| Schema type | Emitted by |
| ---------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| `Organization` | `siteEntities.js` (site graph); `security.js` |
| `WebSite` | `siteEntities.js` (site graph) |
| `SoftwareApplication` | `siteEntities.js` (site graph) |
| `ImageObject` | `siteEntities.js` (nested in Organization) |
| `SearchAction` | `siteEntities.js` (nested in WebSite) |
| `TechArticle` / `APIReference` / `BlogPosting` | `DocItem/index.js` |
| `LearningResource` | `DocItem/index.js` (quickstarts) |
| `DefinedTerm` | `DocItem/index.js` (term pages); `glossary.js` (hub) |
| `DefinedTermSet` | `glossary.js` |
| `CollectionPage` | `DocItem/index.js` (section hubs); `index.js`; `leadership.js` |
| `BreadcrumbList` / `ListItem` | `DocBreadcrumbs/index.js`; `siteEntities.js` helper |
| `FAQPage` / `Question` / `Answer` | `remarkFaqSchema.js` |
| `HowTo` / `HowToStep` / `HowToSupply` / `HowToTool` / `MonetaryAmount` | `HowTo.js` |
| `AboutPage` | `about.js` |
| `WebPage` | `security.js`; `application-development.js` |
| `ContactPoint` | `security.js` |
| `DigitalDocument` | `privacy-policy.js` |
| `Person` | `leadership.js` |
| `ItemList` / `ListItem` | `index.js`; `leadership.js`; `application-development.js`; `Community.js` |
---
_Generated as a reference for the structured-data work in PR #897. When you add
a new schema emitter or change a type, update this table._