Docs menu
Markdown

Content API

Your site's server code reads its pages, SEO tags and sitemap from SuperDuperSEO, then renders them on your own domain. The SDK wraps all of this.

  • Base URL: https://content.superduperseo.com/v1/
  • Auth: Authorization: Bearer <site key> (sds_live_...). The key selects the site. Create it with the MCP tool create_site_key, or in the app on the site's Content API page.
  • Server side only. Keep the key in your server environment (e.g. SUPERDUPERSEO_CONTENT_KEY), never in code or the browser. There is no CORS, so browsers cannot call the API.
  • Never public, never indexed. Without a valid key every request answers 401, and every response carries X-Robots-Tag: noindex, nofollow, noarchive. Your domain is the only public copy.
  • Caching: responses are Cache-Control: private, max-age=60 with an ETag; send If-None-Match to get 304. Cache on your side and refresh on our webhook.
  • Limits: 20 requests a second per key (bursts of 200), then 429 with Retry-After.
  • Errors: 401 wrong or revoked key; 404 no such file (a post that does not exist); 429 slow down.

Serving a request

For every path under your blog, in this order:

  1. Redirects first. If the path is in redirects.json, answer 301 to to, or 410 when to is null.
  2. The page. If posts/{slug}.json exists and its path is the request path, render it.
  3. Otherwise a real 404, never a 200 page that says "not found".

Render on the server:

  • <title> from seo.title;
  • head_html in the <head>, removing your own description, canonical, Open Graph and Article JSON-LD so nothing is duplicated;
  • the title as the only <h1>;
  • then html.

Files

site.json (json)

The site: name, routes, feed, structured data.

Field Type Meaning
name string The site's name (as in og:site_name and structured data)
url string The site's home URL
language string Default content language
description string | null What the site is about
logo string | null Logo URL
routes { index, post, author, topic } Where each kind of page lives, e.g. post: "/blog/{slug}"
feed string The RSS feed URL to serve
json_ld object Organization and WebSite structured data, for your home page

posts/index.json (json)

Published pages, newest first, 100 per file: { page, pages, total, next, posts: [summary] }. Follow next (posts/index-2.json...).

Field Type Meaning
id string Stable id of the page
collection "blog" | "pages" Blog post, or a service/SaaS/product page
slug string The public slug
path string The exact path to serve it at, e.g. /blog/my-post (no trailing slash)
url string The canonical URL on your domain
title string Title, rendered as the page's only

summary string | null One or two sentences: the meta description and the answer first
feature_image { url, alt, width, height, srcset, credit: { name, url, source } } | null Feature image, with dimensions and srcset; show the credit when present
author { slug, name, url } | null The byline's author
topics Array<{ slug, name, url }> Topic (cluster) the post belongs to
reading_time number Minutes
published_at ISO 8601 First publish date (datePublished)
updated_at ISO 8601 Last change to the content (dateModified, sitemap lastmod)

posts/{slug}.json (json)

One page with everything to render it.

Field Type Meaning
id string Stable id of the page
collection "blog" | "pages" Blog post, or a service/SaaS/product page
slug string The public slug
path string The exact path to serve it at, e.g. /blog/my-post (no trailing slash)
url string The canonical URL on your domain
title string Title, rendered as the page's only

summary string | null One or two sentences: the meta description and the answer first
feature_image { url, alt, width, height, srcset, credit: { name, url, source } } | null Feature image, with dimensions and srcset; show the credit when present
author { slug, name, url } | null The byline's author
topics Array<{ slug, name, url }> Topic (cluster) the post belongs to
reading_time number Minutes
published_at ISO 8601 First publish date (datePublished)
updated_at ISO 8601 Last change to the content (dateModified, sitemap lastmod)
html string The body: no

, headings with ids, byline, calls to action and footer included. Render it as is, on the server

markdown string The same body as markdown (for /blog/{slug}.md or other renderers)
toc Array<{ id, text, level }> Table of contents from the h2/h3 headings
word_count number Words in the body
language string Content language, for
version number Increases with every content change
content_hash string Changes when the content changes
seo { title, description, canonical, robots, og, twitter } Everything for the , as fields
json_ld object Structured data (@graph: Organization, WebSite, WebPage, BlogPosting, Person, BreadcrumbList, FAQPage...)
head_html string Ready-made tags: description, canonical, robots, Open Graph, Twitter and the JSON-LD. Not the : set it from seo.title</td> </tr> <tr> <td><code>breadcrumbs</code></td> <td><code>Array<{ name, url }></code></td> <td>Home > Blog > Post</td> </tr> <tr> <td><code>related</code></td> <td><code>Array<summary></code></td> <td>Related posts (same topic first)</td> </tr> <tr> <td><code>alternates</code></td> <td><code>Array<{ hreflang, url }></code></td> <td>Other languages of the page (empty until translations exist)</td> </tr> </tbody></table> <h3><code>authors/index.json</code> (json)</h3> <p>Authors: { authors: [{ slug, name, url, job_title, posts }] }.</p> <h3><code>authors/{slug}.json</code> (json)</h3> <p>An author page: name, job_title, bio, image, profiles, posts, seo, json_ld (ProfilePage), head_html.</p> <h3><code>topics/index.json</code> (json)</h3> <p>Topics: { topics: [{ slug, name, url, posts, indexable }] }.</p> <h3><code>topics/{slug}.json</code> (json)</h3> <p>A topic page: name, posts, seo (noindex under 3 posts), json_ld (CollectionPage), head_html.</p> <h3><code>redirects.json</code> (json)</h3> <p>{ redirects: [{ from, to, status }] }: answer 301 to <code>to</code>, or 410 when <code>to</code> is null, before rendering anything.</p> <h3><code>sitemap.xml</code> (xml)</h3> <p>Indexable URLs only, honest lastmod, image entries. Serve at /sitemap.xml or merge into yours.</p> <h3><code>feed.xml</code> (xml)</h3> <p>RSS 2.0, newest 50 posts. Serve at site.feed.</p> <h3><code>llms.txt</code> (text)</h3> <p>For AI search engines. Serve at /llms.txt.</p> <h3><code>search.json</code> (json)</h3> <p>For on-site search: { entries: [{ title, summary, url, topics }] }.</p> <h3><code>changes.json</code> (json)</h3> <p>What changed, newest first: { cursor, changes: [{ id, event, path, url, version, at }] }. For incremental builds and missed webhooks.</p> <h3><code>indexnow.txt</code> (text)</h3> <p>The site's IndexNow key: serve it as text at /{key}.txt.</p> </div></article><!--$--><!--/$--></div></div></div><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section><script id="_R_">(globalThis["TURBOPACK"] || (globalThis["TURBOPACK"] = [])).push({"otherChunks":["static/chunks/2n2b5xl2zdujg.js","static/chunks/1ts2x9_k-qw5u.js","static/chunks/1b-71rcl1-p6y.js","static/chunks/0du6qnm4ee-qx.js"],"runtimeModuleIds":[494553]});</script><script src="/_next/static/chunks/2n2b5xl2zdujg.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:\"/_next/static/chunks/333xhc06b9hzt.js\"\n3:\"/_next/static/chunks/2cl5krd9c4u11.js\"\n4:I[881064,[\"$2\",\"$3\"],\"ThemeProvider\"]\n5:I[339756,[\"$2\",\"$3\"],\"default\"]\n6:I[837457,[\"$2\",\"$3\"],\"default\"]\n7:I[203484,[\"$2\",\"$3\"],\"Toaster\"]\n9:\"/_next/static/chunks/1z9u-8dawzdxx.js\"\na:I[522016,[\"$2\",\"$3\",\"$9\"],\"\"]\n16:\"ViewportBoundary\"\n17:I[897367,[\"$2\",\"$3\"],\"$16\"]\n19:\"MetadataBoundary\"\n1a:I[897367,[\"$2\",\"$3\"],\"$19\"]\n1b:\"$Sreact.suspense\"\n1d:I[168027,[\"$2\",\"$3\"],\"default\",1]\n:HL[\"/_next/static/chunks/0k_lie2-dvs5y.css\",\"style\"]\n:HL[\"/_next/static/chunks/1x96_hjw2j1_f.css\",\"style\"]\n:HL[\"/_next/static/media/Geist_400-s.p.0wepk1jkdx2t3.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/Geist_500-s.p.3jdsnffercngn.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/Geist_600-s.p.420jvuh0kho27.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n13:X\n14:[[\"children\",{\"s\":\"__PAGE__\",\"d\":{\"r\":\"$L15\",\"p\":false,\"v\":null}}]]\n11:[[\"children\",{\"s\":{\"n\":\"slug\",\"t\":\"oc\",\"k\":\"content-api\",\"s\":[\"agent-spec\",\"llms-full.txt\",\"llms.txt\"]},\"d\":{\"r\":\"$L12\",\"p\":false,\"v\":\"$13\"},\"c\":\"$Q14\"}]]\n8:[[\"children\",{\"s\":\"docs\",\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/1z9u-8dawzdxx.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"div\",null,{\"className\":\"min-h-screen bg-background text-foreground\",\"children\":[[\"$\",\"header\",null,{\"className\":\"sticky top-0 z-20 border-b border-border bg-background/95 backdrop-blur\",\"children\":[\"$\",\"div\",null,{\"className\":\"mx-auto flex h-14 max-w-6xl items-center justify-between gap-4 px-4 sm:px-6\",\"children\":[[\"$\",\"$La\",null,{\"href\":\"/docs\",\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 64 64\",\"width\":26,\"height\":26,\"role\":\"img\",\"aria-label\":\"SuperDuperSEO\",\"aria-hidden\":\"$undefined\",\"className\":\"shrink-0\",\"children\":[[\"$\",\"path\",null,{\"d\":\"M12 8H60Q62 8 61.8 10L57.8 54Q57.6 56 55.6 56H6Q4 56 4.2 54L8.2 10Q8.4 8 10.4 8Z\",\"fill\":\"var(--highlighter)\"}],[\"$\",\"path\",null,{\"d\":\"M16 29L32 14L48 29M16 47L32 32L48 47\",\"fill\":\"none\",\"stroke\":\"var(--on-highlighter)\",\"strokeWidth\":\"8.5\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\"}]]}],[\"$\",\"span\",null,{\"className\":\"font-semibold tracking-tight\",\"children\":\"SuperDuperSEO\"}],[\"$\",\"span\",null,{\"className\":\"text-muted-foreground\",\"children\":\"/\"}],[\"$\",\"span\",null,{\"className\":\"text-sm text-muted-foreground\",\"children\":\"Docs\"}]]}],[\"$\",\"div\",null,{\"className\":\"flex items-center gap-3 text-sm\",\"children\":[[\"$\",\"a\",null,{\"href\":\"https://app.superduperseo.com/login\",\"className\":\"text-muted-foreground hover:text-foreground\",\"children\":\"Sign in\"}],[\"$\",\"a\",null,{\"href\":\"https://app.superduperseo.com/signup\",\"className\":\"rounded-lg bg-indigo-600 px-3 py-1.5 font-medium text-white hover:bg-indigo-700\",\"children\":\"Get started\"}]]}]]}]}],[\"$\",\"div\",null,{\"className\":\"mx-auto flex w-full max-w-6xl gap-10 px-4 py-6 sm:px-6 md:py-10\",\"children\":[[\"$\",\"aside\",null,{\"className\":\"hidden w-56 flex-shrink-0 md:block\",\"children\":[\"$\",\"div\",null,{\"className\":\"sticky top-20\",\"children\":[\"$\",\"nav\",null,{\"aria-label\":\"Docs\",\"className\":\"space-y-5 text-sm\",\"children\":[[\"$\",\"div\",\"Start\",{\"children\":[[\"$\",\"p\",null,{\"className\":\"px-3 text-xs font-medium uppercase tracking-wider text-muted-foreground\",\"children\":\"Start\"}],[\"$\",\"ul\",null,{\"className\":\"mt-1.5 space-y-0.5\",\"children\":[[[\"$\",\"li\",\"\",{\"children\":\"$Lb\"}],\"$Lc\",\"$Ld\"],false]}]]}],\"$Le\",\"$Lf\"]}]}]}],\"$L10\"]}]]}]]}],\"p\":false,\"v\":null},\"c\":\"$Q11\"}]]\n0:{\"P\":null,\"c\":[\"\",\"docs\",\"content-api\"],\"q\":\"\",\"i\":false,\"t\":{\"t\":{\"s\":\"\",\"h\":16,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0k_lie2-dvs5y.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1x96_hjw2j1_f.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/333xhc06b9hzt.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/2cl5krd9c4u11.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"vzANEG_variable eOZHQW_variable rzE-BW_variable\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"antialiased bg-background text-foreground\",\"children\":[\"$\",\"$L4\",null,{\"children\":[[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],[\"$\",\"$L7\",null,{}]]}]}]}]]}],\"p\":false,\"v\":null},\"c\":\"$Q8\"},\"h\":{\"r\":[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L17\",null,{\"children\":\"$L18\"}],[\"$\",\"$L1a\",null,{\"children\":[[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$1b\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L1c\"}]}],null]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],\"p\":false,\"v\":null}},\"m\":\"$undefined\",\"G\":[\"$1d\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0k_lie2-dvs5y.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1x96_hjw2j1_f.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":false,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"mFgdJZhY6tGbjwCbg-fMT\"}\n1f:I[897367,[\"$2\",\"$3\"],\"OutletBoundary\"]\nb:[\"$\",\"$La\",null,{\"href\":\"/docs\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Overview\"}]\nc:[\"$\",\"li\",\"quickstart\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/quickstart\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Put your blog on SuperDuperSEO\"}]}]\nd:[\"$\",\"li\",\"writing\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/writing\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Write and publish with an agent\"}]}]\ne:[\"$\",\"div\",\"Reference\",{\"children\":[[\"$\",\"p\",null,{\"className\":\"px-3 text-xs font-medium uppercase tracking-wider text-muted-foreground\",\"children\":\"Reference\"}],[\"$\",\"ul\",null,{\"className\":\"mt-1.5 space-y-0.5\",\"children\":[[[\"$\",\"li\",\"mcp\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/mcp\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"MCP server\"}]}],[\"$\",\"li\",\"content-api\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/content-api\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Content API\"}]}],[\"$\",\"li\",\"sdk\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/sdk\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"SDK\"}]}],[\"$\",\"li\",\"webhooks\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/webhooks\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Webhooks\"}]}],[\"$\",\"li\",\"site-check\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/site-check\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Site check\"}]}]],[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"https://app.superduperseo.com/docs/agent-spec\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"REST API (v1)\"}]}]]}]]}]\nf:[\"$\",\"div\",\"Starters\",{\"children\":[[\"$\",\"p\",null,{\"className\":\"px-3 text-xs font-medium uppercase tracking-wider text-muted-foreground\",\"children\":\"Starters\"}],[\"$\",\"ul\",null,{\"className\":\"mt-1.5 space-y-0.5\",\"children\":[[[\"$\",\"li\",\"starter-nextjs\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/starter-nextjs\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Next.js starter\"}]}],[\"$\",\"li\",\"starter-cloudflare\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/starter-cloudflare\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Cloudflare starter\"}]}]],false]}]]}]\n10:[\"$\",\"div\",null,{\"className\":\"min-w-0 flex-1\",\"children\":[[\"$\",\"details\",null,{\"className\":\"mb-6 rounded-lg border border-border md:hidden\",\"children\":[[\"$\",\"summary\",null,{\"className\":\"cursor-pointer px-4 py-3 text-sm font-medium\",\"children\":\"Docs menu\"}],[\"$\",\"div\",null,{\"className\":\"border-t border-border p-2\",\"children\":[\"$\",\"nav\",null,{\"aria-label\":\"Docs\",\"className\":\"space-y-5 text-sm\",\"children\":[[\"$\",\"div\",\"Start\",{\"children\":[[\"$\",\"p\",null,{\"className\":\"px-3 text-xs font-medium uppercase tracking-wider text-muted-foreground\",\"children\":\"Start\"}],[\"$\",\"ul\",null,{\"className\":\"mt-1.5 space-y-0.5\",\"children\":[[[\"$\",\"li\",\"\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Overview\"}]}],[\"$\",\"li\",\"quickstart\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/quickstart\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Put your blog on SuperDuperSEO\"}]}],[\"$\",\"li\",\"writing\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/writing\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Write and publish with an agent\"}]}]],false]}]]}],[\"$\",\"div\",\"Reference\",{\"children\":[[\"$\",\"p\",null,{\"className\":\"px-3 text-xs font-medium uppercase tracking-wider text-muted-foreground\",\"children\":\"Reference\"}],[\"$\",\"ul\",null,{\"className\":\"mt-1.5 space-y-0.5\",\"children\":[[[\"$\",\"li\",\"mcp\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/mcp\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"MCP server\"}]}],[\"$\",\"li\",\"content-api\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/content-api\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Content API\"}]}],[\"$\",\"li\",\"sdk\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/sdk\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"SDK\"}]}],[\"$\",\"li\",\"webhooks\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/webhooks\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Webhooks\"}]}],[\"$\",\"li\",\"site-check\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/site-check\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Site check\"}]}]],[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"https://app.superduperseo.com/docs/agent-spec\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"REST API (v1)\"}]}]]}]]}],[\"$\",\"div\",\"Starters\",{\"children\":[[\"$\",\"p\",null,{\"className\":\"px-3 text-xs font-medium uppercase tracking-wider text-muted-foreground\",\"children\":\"Starters\"}],[\"$\",\"ul\",null,{\"className\":\"mt-1.5 space-y-0.5\",\"children\":[[[\"$\",\"li\",\"starter-nextjs\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/starter-nextjs\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Next.js starter\"}]}],[\"$\",\"li\",\"starter-cloudflare\",{\"children\":[\"$\",\"$La\",null,{\"href\":\"/docs/starter-cloudflare\",\"className\":\"block rounded-lg px-3 py-2 text-foreground/80 hover:bg-muted hover:text-foreground\",\"children\":\"Cloudflare starter\"}]}]],false]}]]}]]}]}]]}],[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n12:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n15:[\"$\",\"$1\",\"c\",{\"children\":[\"$L1e\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/3l_ppucgwqlse.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L1f\",null,{\"children\":[\"$\",\"$1b\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@20\"}]}]]}]\n21:\"/_next/static/chunks/3l_ppucgwqlse.js\"\n22:I[843462,[\"$2\",\"$3\",\"$9\",\"$21\"],\"DocsActions\"]\n13:C\n23:T52c,text-[15px] leading-7 text-foreground/90 [\u0026_h1]:mb-4 [\u0026_h1]:text-3xl [\u0026_h1]:font-bold [\u0026_h1]:tracking-tight [\u0026_h1]:text-foreground [\u0026_h2]:mt-10 [\u0026_h2]:mb-3 [\u0026_h2]:border-b [\u0026_h2]:border-border [\u0026_h2]:pb-2 [\u0026_h2]:text-xl [\u0026_h2]:font-semibold [\u0026_h2]:text-foreground [\u0026_h3]:mt-8 [\u0026_h3]:mb-2 [\u0026_h3]:text-base [\u0026_h3]:font-semibold [\u0026_h3]:text-foreground [\u0026_p]:my-3 [\u0026_ul]:my-3 [\u0026_ul]:list-disc [\u0026_ul]:pl-6 [\u0026_ol]:my-3 [\u0026_ol]:list-decimal [\u0026_ol]:pl-6 [\u0026_li]:my-1 [\u0026_a]:text-indigo-600 [\u0026_a]:underline-offset-2 hover:[\u0026_a]:underline dark:[\u0026_a]:text-indigo-400 [\u0026_code]:rounded [\u0026_code]:bg-muted [\u0026_code]:px-1.5 [\u0026_code]:py-0.5 [\u0026_code]:font-mono [\u0026_code]:text-[13px] [\u0026_pre]:my-4 [\u0026_pre]:overflow-x-auto [\u0026_pre]:rounded-xl [\u0026_pre]:border [\u0026_pre]:border-border [\u0026_pre]:bg-muted/60 [\u0026_pre]:p-4 [\u0026_pre]:text-[13px] [\u0026_pre]:leading-6 [\u0026_pre_code]:bg-transparent [\u0026_pre_code]:p-0 [\u0026_table]:my-4 [\u0026_table]:block [\u0026_table]:w-full [\u0026_table]:overflow-x-auto [\u0026_table]:text-sm [\u0026_th]:border-b [\u0026_th]:border-border [\u0026_th]:px-3 [\u0026_th]:py-2 [\u0026_th]:text-left [\u0026_th]:font-semibold [\u0026_th]:text-foreground [\u0026_td]:border-b [\u0026_td]:border-border [\u0026_td]:px-3 [\u0026_td]:py-2 [\u0026_td]:align-top [\u0026_blockquote]:my-4 [\u0026_blockquote]:border-l-4 [\u0026_blockquote]:border-border [\u0026_blockquote]:pl-4 [\u0026_blockquote]:text-muted-foreground [\u0026_hr]:my-8 [\u0026_hr]:border-border24:T2aad,\u003ch1\u003eContent API\u003c/h1\u003e\n\u003cp\u003eYour site\u0026#39;s server code reads its pages, SEO tags and sitemap from SuperDuperSEO, then renders them on your own domain. The \u003ca href=\"https://superduperseo.com/docs/sdk\"\u003eSDK\u003c/a\u003e wraps all of this.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eBase URL:\u003c/strong\u003e \u003ccode\u003ehttps://content.superduperseo.com/v1/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAuth:\u003c/strong\u003e \u003ccode\u003eAuthorization: Bearer \u0026lt;site key\u0026gt;\u003c/code\u003e (\u003ccode\u003esds_live_...\u003c/code\u003e). The key selects the site. Create it with the MCP tool \u003ccode\u003ecreate_site_key\u003c/code\u003e, or in the app on the site\u0026#39;s Content API page.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eServer side only.\u003c/strong\u003e Keep the key in your server environment (e.g. \u003ccode\u003eSUPERDUPERSEO_CONTENT_KEY\u003c/code\u003e), never in code or the browser. There is no CORS, so browsers cannot call the API.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNever public, never indexed.\u003c/strong\u003e Without a valid key every request answers 401, and every response carries \u003ccode\u003eX-Robots-Tag: noindex, nofollow, noarchive\u003c/code\u003e. Your domain is the only public copy.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCaching:\u003c/strong\u003e responses are \u003ccode\u003eCache-Control: private, max-age=60\u003c/code\u003e with an \u003ccode\u003eETag\u003c/code\u003e; send \u003ccode\u003eIf-None-Match\u003c/code\u003e to get \u003ccode\u003e304\u003c/code\u003e. Cache on your side and refresh on our \u003ca href=\"https://superduperseo.com/docs/webhooks\"\u003ewebhook\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLimits:\u003c/strong\u003e 20 requests a second per key (bursts of 200), then \u003ccode\u003e429\u003c/code\u003e with \u003ccode\u003eRetry-After\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eErrors:\u003c/strong\u003e \u003ccode\u003e401\u003c/code\u003e wrong or revoked key; \u003ccode\u003e404\u003c/code\u003e no such file (a post that does not exist); \u003ccode\u003e429\u003c/code\u003e slow down.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eServing a request\u003c/h2\u003e\n\u003cp\u003eFor every path under your blog, in this order:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eRedirects first.\u003c/strong\u003e If the path is in \u003ccode\u003eredirects.json\u003c/code\u003e, answer \u003ccode\u003e301\u003c/code\u003e to \u003ccode\u003eto\u003c/code\u003e, or \u003ccode\u003e410\u003c/code\u003e when \u003ccode\u003eto\u003c/code\u003e is null.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eThe page.\u003c/strong\u003e If \u003ccode\u003eposts/{slug}.json\u003c/code\u003e exists and its \u003ccode\u003epath\u003c/code\u003e is the request path, render it.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOtherwise a real \u003ccode\u003e404\u003c/code\u003e,\u003c/strong\u003e never a \u003ccode\u003e200\u003c/code\u003e page that says \u0026quot;not found\u0026quot;.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eRender on the server:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e\u0026lt;title\u0026gt;\u003c/code\u003e from \u003ccode\u003eseo.title\u003c/code\u003e;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehead_html\u003c/code\u003e in the \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e, removing your own description, canonical, Open Graph and Article JSON-LD so nothing is duplicated;\u003c/li\u003e\n\u003cli\u003ethe title as the only \u003ccode\u003e\u0026lt;h1\u0026gt;\u003c/code\u003e;\u003c/li\u003e\n\u003cli\u003ethen \u003ccode\u003ehtml\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eFiles\u003c/h2\u003e\n\u003ch3\u003e\u003ccode\u003esite.json\u003c/code\u003e (json)\u003c/h3\u003e\n\u003cp\u003eThe site: name, routes, feed, structured data.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eMeaning\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe site\u0026#39;s name (as in og:site_name and structured data)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eurl\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe site\u0026#39;s home URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elanguage\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault content language\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edescription\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring | null\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWhat the site is about\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elogo\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring | null\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLogo URL\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eroutes\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{ index, post, author, topic }\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWhere each kind of page lives, e.g. post: \u0026quot;/blog/{slug}\u0026quot;\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe RSS feed URL to serve\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejson_ld\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eobject\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOrganization and WebSite structured data, for your home page\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003ch3\u003e\u003ccode\u003eposts/index.json\u003c/code\u003e (json)\u003c/h3\u003e\n\u003cp\u003ePublished pages, newest first, 100 per file: { page, pages, total, next, posts: [summary] }. Follow \u003ccode\u003enext\u003c/code\u003e (posts/index-2.json...).\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eMeaning\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eid\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStable id of the page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecollection\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;blog\u0026quot; | \u0026quot;pages\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBlog post, or a service/SaaS/product page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe public slug\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epath\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe exact path to serve it at, e.g. /blog/my-post (no trailing slash)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eurl\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe canonical URL on your domain\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTitle, rendered as the page\u0026#39;s only \u003ch1\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esummary\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring | null\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOne or two sentences: the meta description and the answer first\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeature_image\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{ url, alt, width, height, srcset, credit: { name, url, source } } | null\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFeature image, with dimensions and srcset; show the credit when present\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauthor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{ slug, name, url } | null\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe byline\u0026#39;s author\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etopics\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eArray\u0026lt;{ slug, name, url }\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTopic (cluster) the post belongs to\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereading_time\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003enumber\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMinutes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epublished_at\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eISO 8601\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFirst publish date (datePublished)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eupdated_at\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eISO 8601\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLast change to the content (dateModified, sitemap lastmod)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003ch3\u003e\u003ccode\u003eposts/{slug}.json\u003c/code\u003e (json)\u003c/h3\u003e\n\u003cp\u003eOne page with everything to render it.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eMeaning\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eid\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStable id of the page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecollection\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026quot;blog\u0026quot; | \u0026quot;pages\u0026quot;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBlog post, or a service/SaaS/product page\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslug\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe public slug\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epath\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe exact path to serve it at, e.g. /blog/my-post (no trailing slash)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eurl\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe canonical URL on your domain\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etitle\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTitle, rendered as the page\u0026#39;s only \u003ch1\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esummary\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring | null\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOne or two sentences: the meta description and the answer first\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efeature_image\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{ url, alt, width, height, srcset, credit: { name, url, source } } | null\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFeature image, with dimensions and srcset; show the credit when present\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eauthor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{ slug, name, url } | null\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe byline\u0026#39;s author\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etopics\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eArray\u0026lt;{ slug, name, url }\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTopic (cluster) the post belongs to\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereading_time\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003enumber\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMinutes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epublished_at\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eISO 8601\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFirst publish date (datePublished)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eupdated_at\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eISO 8601\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLast change to the content (dateModified, sitemap lastmod)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehtml\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe body: no \u003ch1\u003e, headings with ids, byline, calls to action and footer included. Render it as is, on the server\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emarkdown\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe same body as markdown (for /blog/{slug}.md or other renderers)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etoc\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eArray\u0026lt;{ id, text, level }\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTable of contents from the h2/h3 headings\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eword_count\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003enumber\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWords in the body\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elanguage\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eContent language, for \u003chtml lang\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eversion\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003enumber\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eIncreases with every content change\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econtent_hash\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChanges when the content changes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eseo\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{ title, description, canonical, robots, og, twitter }\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEverything for the \u003chead\u003e, as fields\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ejson_ld\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eobject\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eStructured data (@graph: Organization, WebSite, WebPage, BlogPosting, Person, BreadcrumbList, FAQPage...)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehead_html\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estring\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReady-made \u003chead\u003e tags: description, canonical, robots, Open Graph, Twitter and the JSON-LD. Not the \u003ctitle\u003e: set it from seo.title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebreadcrumbs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eArray\u0026lt;{ name, url }\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHome \u0026gt; Blog \u0026gt; Post\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erelated\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eArray\u0026lt;summary\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRelated posts (same topic first)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ealternates\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eArray\u0026lt;{ hreflang, url }\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOther languages of the page (empty until translations exist)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003ch3\u003e\u003ccode\u003eauthors/index.json\u003c/code\u003e (json)\u003c/h3\u003e\n\u003cp\u003eAuthors: { authors: [{ slug, name, url, job_title, posts }] }.\u003c/p\u003e\n\u003ch3\u003e\u003ccode\u003eauthors/{slug}.json\u003c/code\u003e (json)\u003c/h3\u003e\n\u003cp\u003eAn author page: name, job_title, bio, image, profiles, posts, seo, json_ld (ProfilePage), head_html.\u003c/p\u003e\n\u003ch3\u003e\u003ccode\u003etopics/index.json\u003c/code\u003e (json)\u003c/h3\u003e\n\u003cp\u003eTopics: { topics: [{ slug, name, url, posts, indexable }] }.\u003c/p\u003e\n\u003ch3\u003e\u003ccode\u003etopics/{slug}.json\u003c/code\u003e (json)\u003c/h3\u003e\n\u003cp\u003eA topic page: name, posts, seo (noindex under 3 posts), json_ld (CollectionPage), head_html.\u003c/p\u003e\n\u003ch3\u003e\u003ccode\u003eredirects.json\u003c/code\u003e (json)\u003c/h3\u003e\n\u003cp\u003e{ redirects: [{ from, to, status }] }: answer 301 to \u003ccode\u003eto\u003c/code\u003e, or 410 when \u003ccode\u003eto\u003c/code\u003e is null, before rendering anything.\u003c/p\u003e\n\u003ch3\u003e\u003ccode\u003esitemap.xml\u003c/code\u003e (xml)\u003c/h3\u003e\n\u003cp\u003eIndexable URLs only, honest lastmod, image entries. Serve at /sitemap.xml or merge into yours.\u003c/p\u003e\n\u003ch3\u003e\u003ccode\u003efeed.xml\u003c/code\u003e (xml)\u003c/h3\u003e\n\u003cp\u003eRSS 2.0, newest 50 posts. Serve at site.feed.\u003c/p\u003e\n\u003ch3\u003e\u003ccode\u003ellms.txt\u003c/code\u003e (text)\u003c/h3\u003e\n\u003cp\u003eFor AI search engines. Serve at /llms.txt.\u003c/p\u003e\n\u003ch3\u003e\u003ccode\u003esearch.json\u003c/code\u003e (json)\u003c/h3\u003e\n\u003cp\u003eFor on-site search: { entries: [{ title, summary, url, topics }] }.\u003c/p\u003e\n\u003ch3\u003e\u003ccode\u003echanges.json\u003c/code\u003e (json)\u003c/h3\u003e\n\u003cp\u003eWhat changed, newest first: { cursor, changes: [{ id, event, path, url, version, at }] }. For incremental builds and missed webhooks.\u003c/p\u003e\n\u003ch3\u003e\u003ccode\u003eindexnow.txt\u003c/code\u003e (text)\u003c/h3\u003e\n\u003cp\u003eThe site\u0026#39;s IndexNow key: serve it as text at /{key}.txt.\u003c/p\u003e\n1e:[\"$\",\"article\",null,{\"children\":[[\"$\",\"$L22\",null,{\"markdownUrl\":\"https://superduperseo.com/docs/content-api.md\"}],[\"$\",\"div\",null,{\"className\":\"$23\",\"dangerouslySetInnerHTML\":{\"__html\":\"$24\"}}]]}]\n18:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n25:I[27201,[\"$2\",\"$3\"],\"IconMark\"]\n1c:[[\"$\",\"title\",\"0\",{\"children\":\"Content API · Docs | SuperDuperSEO\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Auth, caching, the serving rules and every file and field.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"canonical\",\"href\":\"https://superduperseo.com/docs/content-api\"}],[\"$\",\"link\",\"3\",{\"rel\":\"alternate\",\"type\":\"text/markdown\",\"href\":\"https://superduperseo.com/docs/content-api.md\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:title\",\"content\":\"Content API · SuperDuperSEO docs\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:description\",\"content\":\"Auth, caching, the serving rules and every file and field.\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:url\",\"content\":\"https://superduperseo.com/docs/content-api\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"$\",\"meta\",\"8\",{\"name\":\"twitter:card\",\"content\":\"summary\"}],[\"$\",\"meta\",\"9\",{\"name\":\"twitter:title\",\"content\":\"Content API · SuperDuperSEO docs\"}],[\"$\",\"meta\",\"10\",{\"name\":\"twitter:description\",\"content\":\"Auth, caching, the serving rules and every file and field.\"}],[\"$\",\"link\",\"11\",{\"rel\":\"icon\",\"href\":\"/icon.svg?icon.32h6349gi_fc3.svg\",\"sizes\":\"any\",\"type\":\"image/svg+xml\"}],[\"$\",\"$L25\",\"12\",{}]]\n20:null\n"])</script></body></html>