API 参考
Site
Content Delivery API: GET /site
Response 200
idstringrequirednamestring | nullrequireddescriptionstring | nullrequiredlocalestring | nullrequiredprimaryLocalestring | nullPrimary locale code; its pages have no URL prefix
localesobject[]Published locales (primary first). Each secondary locale lives under `/{pathPrefix}/`.
locales[].localestringrequiredBCP 47 locale code (`en-US`, `zh-Hant`); pass it (or `pathPrefix`) as `?locale=`
locales[].isPrimarybooleanrequiredlocales[].labelstringrequiredLanguage name written in that language (`English`, `Deutsch`, `Français`), for a language switcher
locales[].pathPrefixstring | nullrequiredURL 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.
timezonestring | nullrequiredcurrencystring | nullrequiredfrontendMode"HOSTED" | "HEADLESS"requiredhomeUrlstring | nullrequiredpublicVersionstring | nullrequiredbrandobjectrequiredBrand 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.displayNamestring | nullrequiredbrand.logoobjectrequiredThe logo to show on a light background and on a dark background (the same asset when the owner uploaded only one)
brand.logo.lightobject | nullrequiredbrand.logo.darkobject | nullrequiredbrand.colorsobjectrequiredbrand.colors.primaryobjectrequiredBrand color for light and dark color schemes
brand.cornerRadius"soft" | "normal" | "sharp"requiredbrand.colorScheme"system" | "light" | "dark"requiredColor 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.radiusobjectrequiredCSS 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.typographyobjectrequiredFont id per locale group
brand.typography.bodyEnFontIdstringrequiredbrand.typography.bodyZhHantFontIdstringrequiredbrand.typography.bodyZhHansFontIdstringrequiredbrand.typography.bodyJaFontIdstringrequiredbrand.typography.bodyKoFontIdstringrequiredbrand.fontsobject[]requiredThe fonts `typography` refers to, deduplicated, with their stylesheets
brand.fonts[].idstringrequiredFont id, as referenced by `typography`
brand.fonts[].familystringrequiredReady-to-use `font-family` value, fallbacks included
brand.fonts[].stylesheetUrlstring | nullrequiredStylesheet with the `@font-face` rules; null for system fonts
brand.fonts[].localesstring[]requiredLocales this font is used for (`en`, `zh-Hant`, `zh-Hans`, `ja`, `ko`)
mediaProtectionobjectThe 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.allowDownloadbooleanrequiredmediaProtection.keepCopyrightbooleanrequiredmediaProtection.deterrencebooleanrequiredmediaProtection.watermarkbooleanrequiredcustomerAccessobjectrequiredCustomer 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.showNavEntrybooleanrequiredcustomerAccess.allowSignupbooleanrequiredcustomerAccess.methods"passkey" | "google" | "apple" | "line" | "kakao" | "external_oidc" | "email_code" | "email_link"[]requiredbotProtectionobjectrequiredBot 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"requiredbotProtection.recaptchaVersion"v2" | "v3" | nullrequiredbotProtection.entriesobjectrequiredPer entry point (forms, customer_login): the widget site key and the action to pass to the widget. Empty when provider is kanorio.
crawlerRulesobjectAI crawler block rules for @kanorio/sdk/edge middleware (invalidated via the ai-crawler-rules cache tag)
crawlerRules.blockedTokensstring[]crawlerRules.listVersionstringindexNowKeystringIndexNow 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.
listingsobjectState 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"requiredlistings.blogCategory"live" | "empty" | "off"requiredlistings.blogTag"live" | "empty" | "off"requiredlistings.blogAuthor"live" | "empty" | "off"requiredlistings.shopIndex"live" | "empty" | "off"requiredlistings.productCategory"live" | "empty" | "off"required
curl -X GET "https://{site}/api/v1/site"