# Site · Content Delivery API

> Content Delivery API reference for site: GET /site.

> Markdown version of https://kanorio.com/en/developers/delivery-api/site. Append `.md` to any developer docs URL for this format. Index: https://kanorio.com/llms.txt · MCP: https://app.kanorio.com/api/mcp

Base URL: `https://{site}/api/v1` · [Errors](https://kanorio.com/en/developers/basics/errors) · [Pagination](https://kanorio.com/en/developers/basics/pagination)

### Public site meta

`GET /site`

- Stability: beta
- Authentication: none

**Response** (200)

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | yes | — |
| `name` | string \| null | yes | — |
| `description` | string \| null | yes | — |
| `locale` | string \| null | yes | — |
| `primaryLocale` | string \| null | no | Primary locale code; its pages have no URL prefix |
| `locales` | object[] | no | Published locales (primary first). Each secondary locale lives under `/{pathPrefix}/`. |
| `locales[].locale` | string | yes | BCP 47 locale code (`en-US`, `zh-Hant`); pass it (or `pathPrefix`) as `?locale=` |
| `locales[].isPrimary` | boolean | yes | — |
| `locales[].label` | string | yes | Language name written in that language (`English`, `Deutsch`, `Français`), for a language switcher |
| `locales[].pathPrefix` | string \| null | yes | URL path prefix of this locale without slashes (`en`, `en-gb`, or a custom word); null for the primary locale, which has no prefix. Hosted pages, sitemaps and hreflang use the same prefix, so a custom frontend should route `/{pathPrefix}/…` to this locale. |
| `timezone` | string \| null | yes | — |
| `currency` | string \| null | yes | — |
| `frontendMode` | "HOSTED" \| "HEADLESS" | yes | — |
| `homeUrl` | string \| null | yes | — |
| `publicVersion` | string \| null | yes | — |
| `brand` | object | yes | Brand identity set under Site settings › Brand: the same colors, logo, fonts, corner radius and color scheme Kanorio applies to the hosted checkout, sign-in, customer account and emails. Values are resolved, so a front end can use them directly; `@kanorio/elements` applies them automatically. Changes take effect immediately, without publishing. |
| `brand.displayName` | string \| null | yes | — |
| `brand.logo` | object | yes | The logo to show on a light background and on a dark background (the same asset when the owner uploaded only one) |
| `brand.logo.light` | object \| null | yes | — |
| `brand.logo.dark` | object \| null | yes | — |
| `brand.colors` | object | yes | — |
| `brand.colors.primary` | object | yes | Brand color for light and dark color schemes |
| `brand.cornerRadius` | "soft" \| "normal" \| "sharp" | yes | — |
| `brand.colorScheme` | "system" \| "light" \| "dark" | yes | Color scheme the owner chose: `system` follows the visitor's device; `light` or `dark` fixes Kanorio's hosted checkout, sign-in and customer account to that scheme, and `logo` then returns that scheme's logo for both backgrounds |
| `brand.radius` | object | yes | CSS lengths for the corner radius scale (`sm`, `md`, `lg`, `xl`, `2xl`, `3xl`, `card`, `media`, `button`); Kanorio-hosted pages expose the same values as `--site-radius-*` |
| `brand.typography` | object | yes | Font id per locale group |
| `brand.typography.bodyEnFontId` | string | yes | — |
| `brand.typography.bodyZhHantFontId` | string | yes | — |
| `brand.typography.bodyZhHansFontId` | string | yes | — |
| `brand.typography.bodyJaFontId` | string | yes | — |
| `brand.typography.bodyKoFontId` | string | yes | — |
| `brand.fonts` | object[] | yes | The fonts `typography` refers to, deduplicated, with their stylesheets |
| `brand.fonts[].id` | string | yes | Font id, as referenced by `typography` |
| `brand.fonts[].family` | string | yes | Ready-to-use `font-family` value, fallbacks included |
| `brand.fonts[].stylesheetUrl` | string \| null | yes | Stylesheet with the `@font-face` rules; null for system fonts |
| `brand.fonts[].locales` | string[] | yes | Locales this font is used for (`en`, `zh-Hant`, `zh-Hans`, `ja`, `ko`) |
| `mediaProtection` | object | no | The owner's media protection settings. allowDownload: visitors may download images from the lightbox; deterrence: block right-click, drag and long-press on images and hide lightbox download and share (overrides allowDownload); keepCopyright: downloaded images keep the copyright field; watermark: a watermark is active (watermarked image URLs are already in content and assets). |
| `mediaProtection.allowDownload` | boolean | yes | — |
| `mediaProtection.keepCopyright` | boolean | yes | — |
| `mediaProtection.deterrence` | boolean | yes | — |
| `mediaProtection.watermark` | boolean | yes | — |
| `customerAccess` | object | yes | Customer sign-in settings the sign-in panel needs before anyone is signed in. methods: the sign-in methods this site has turned on and the platform can provide right now, in display order (passkey, google, ..., email_code, email_link; email_code is always present); showNavEntry: whether signed-out visitors should see a sign-in entry; allowSignup: whether visitors without a purchase may register with their email. |
| `customerAccess.showNavEntry` | boolean | yes | — |
| `customerAccess.allowSignup` | boolean | yes | — |
| `customerAccess.methods` | "passkey" \| "google" \| "apple" \| "line" \| "kakao" \| "external_oidc" \| "email_code" \| "email_link"[] | yes | — |
| `botProtection` | object | yes | Bot protection the site uses for anonymous forms and customer sign-in. provider is kanorio (built-in proof-of-work: fetch the challenge from GET /forms/{id}/challenge or GET /customer/auth/protection) or the third-party service the owner picked with their own keys: turnstile, recaptcha or hcaptcha. For a third-party provider, render that provider's widget with entries.<entry>.siteKey and entries.<entry>.action (forms, customer_login) and send its token as captchaToken; the server decides the provider from the site settings. recaptchaVersion is v2 (checkbox) or v3 (score) for recaptcha, otherwise null. |
| `botProtection.provider` | "kanorio" \| "turnstile" \| "recaptcha" \| "hcaptcha" | yes | — |
| `botProtection.recaptchaVersion` | "v2" \| "v3" \| null | yes | — |
| `botProtection.entries` | object | yes | Per entry point (forms, customer_login): the widget site key and the action to pass to the widget. Empty when provider is kanorio. |
| `crawlerRules` | object | no | AI crawler block rules for @kanorio/sdk/edge middleware (invalidated via the ai-crawler-rules cache tag) |
| `crawlerRules.blockedTokens` | string[] | no | — |
| `crawlerRules.listVersion` | string | no | — |
| `indexNowKey` | string | no | IndexNow key (public by protocol; served at /<key>.txt). @kanorio/sdk/edge uses it to answer the key verification file on an external storefront domain. null until the first IndexNow notification is sent. |
| `listings` | object | no | State of the Kanorio-managed listing pages (blog home, post category/tag/author pages, shop home, product category pages). live: served and has content, index it; empty: served but nothing to list yet, render it with robots noindex (seo.listingRobots in @kanorio/sdk does this); off: not served (hidden by the owner, or not declared in externalListings on a HEADLESS site), do not link to it. Kanorio's sitemap.xml, IndexNow notifications and llms.txt only include live listings. |
| `listings.blogIndex` | "live" \| "empty" \| "off" | yes | — |
| `listings.blogCategory` | "live" \| "empty" \| "off" | yes | — |
| `listings.blogTag` | "live" \| "empty" \| "off" | yes | — |
| `listings.blogAuthor` | "live" \| "empty" \| "off" | yes | — |
| `listings.shopIndex` | "live" \| "empty" \| "off" | yes | — |
| `listings.productCategory` | "live" \| "empty" \| "off" | yes | — |

```bash
curl -X GET "https://{site}/api/v1/site"
```
