Help center
Who can use this feature?
- An admin on Pro or Plus can create the calling API key. Reads need
helpdesk.helpcenter:read; writes needhelpdesk.helpcenter:write. Legacy unscoped keys are refused. - The store must use Helpdesk. Otherwise every route returns
403 HELPDESK_DISABLED. - Custom CSS needs the Plus plan.
All paths use the Public API base URL. Send X-Api-Key on every request. Reads are GET with no body and return 200.
| Method | Path | Returns |
|---|---|---|
| GET | /help-center/settings | Branding, contact, SEO, language and store page settings |
| GET | /help-center/overview | Article and category counts, preview link, store page status |
| GET | /help-center/search-analytics | What customers searched for, including searches with no result |
| PATCH | /help-center/settings | Changes settings, guarded by a revision number |
| PUT | /help-center/store-page | Publishes, moves or removes the Help center page on the Shopify store |
| POST | /help-center/store-colors/sync | Reads the store theme's colors again |
| POST | /help-center/assets/{kind} | Uploads a logo, white logo or favicon |
What helpdesk.helpcenter:write allows
The same scope behaves differently depending on where it is used:
- On this Public API and on Chatty MCP, it changes the Help center directly: settings, the store page, store colors and brand assets. Each change is saved straight away and recorded in the audit log with the calling key.
- On the Helpdesk agent API and the Helpdesk MCP tools, it lets an agent propose creating or updating articles and categories (deleting is not proposable) with the Helpdesk tools
propose_create_article,propose_update_article,propose_create_categoryandpropose_update_category. A person approves or rejects each proposal in Helpdesk, and can undo it; nothing changes until then. Over REST, the agent sends the same proposals with itsX-Api-KeytoPOST https://app.chatty.net/hd/v1/agent/help-center/proposalsand lists its own withGETon the same path.
Like other Helpdesk write scopes, it also grants every Helpdesk read scope. OAuth connections can only read the Help center.
Settings
GET /help-center/settings returns the stored settings merged over the defaults. A store that never changed them gets the defaults.
{
"data": {
"settings": {
"branding": {"title": "Help Center", "colorPreset": "store", "colorTheme": "light", "categoryLayout": "accordion"},
"customDomain": {"status": "unverified"},
"storePage": {"enabled": false, "handle": "helpcenter", "shopifyPageId": null},
"seo": {"metaTitle": "Help Center", "enableIndexing": true, "generateSitemap": true},
"contactMethods": {"liveChat": {"enabled": true, "label": "Chat with us"}, "email": {"enabled": false}},
"contactForm": {"enabled": false, "customFields": []},
"language": {"code": "en", "direction": "ltr"},
"revision": 0
}
}
}The example is an excerpt. customDomain.status is unverified, checking, active or failed. Stored settings can also include customCss, customDomain.domain and seo.ogImageUrl. The DNS record for domain verification is not part of this response.
Overview
{
"data": {
"articles": {"draft": 3, "published": 24, "internal": 2},
"categories": {"empty": 1, "total": 6},
"previewArticleSlug": "track-my-order",
"previewUrl": "https://help.example.com/hc/shop_123?preview=1",
"storePage": {"enabled": true, "handle": "helpcenter", "hasShopifyStore": true, "shopifyPageId": "gid://shopify/Page/123", "url": "https://shop.myshopify.com/pages/helpcenter"}
}
}articles.publishedcounts published public articles, the ones customers see.internalcounts published articles that are not public.categories.emptycounts categories with no article.previewArticleSlugis one published public article, ornull.previewUrlcan benull.storePage.urlisnullunless the store page is enabled.
Search analytics
periodDays is required and must be 7, 30 or 90. The window ends now and is counted in UTC.
curl 'https://app.chatty.net/v1/help-center/search-analytics?periodDays=30' \
-H 'X-Api-Key: sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'{
"data": {
"total": 412,
"zeroResult": 37,
"topQueries": [{"query": "refund", "count": 58, "resultsCount": 4, "lastSearchedAt": "2026-10-22T09:12:00.000Z"}],
"byDay": [{"date": "2026-10-21", "count": 19}],
"zeroResultQueries": [{"query": "warranty", "count": 9, "lastSearchedAt": "2026-10-22T07:40:00.000Z"}]
}
}topQueries and zeroResultQueries hold up to 50 queries each, most searched first. resultsCount is the highest number of results seen for that query. byDay is in date order. Queries with no result are a good list of articles to write next.
Change settings
PATCH /help-center/settings takes the revision you last read and any settings you want to change, in the same shape as the GET response's settings. Omitted fields keep their value.
curl -X PATCH 'https://app.chatty.net/v1/help-center/settings' \
-H 'X-Api-Key: sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"revision":3,"branding":{"title":"Support","primaryColor":"#1A1A1A"},"seo":{"metaTitle":"Support"}}'{"success":true,"revision":4}- Revision lock. If someone saved after your read, the
revisionno longer matches and the route returns409 STALE_SETTINGS. Read the settings again, reapply your change and retry with the newrevision. Each successful save adds 1. - Accepted top-level fields are
branding,contactMethods,contactForm,contactPage,customDomain,language,seoandcustomCss. Any other field returns400 VALIDATION_FAILED. The store page has its own route below. - Colors are hex values such as
#1A1A1A. Text fields have length limits, for exampleseo.metaTitleup to 70 characters. A map incontactPageneeds an address. customCss(up to 51,200 characters) needs the Plus plan; below Plus it returns403 CUSTOM_CSS_REQUIRES_PLUS. Sending back the stored value unchanged is allowed on any plan.
Store page
PUT /help-center/store-page takes {"enabled":true,"handle":"help"}. handle is optional, lowercase letters, numbers and hyphens, up to 255 characters; without it, the current handle or helpcenter is used.
enabled: truecreates or updates a page on the Shopify store that shows the Help center, and moves it when the handle changes. The first time, it also reads the store's colors.enabled: falseremoves that page from the store.- The response is
{"success":true}. ReadGET /help-center/overviewfor the page URL.
A handle already used by another page returns 409 STORE_PAGE_HANDLE_TAKEN. A store without a Shopify connection returns 400 STORE_PAGE_SHOPIFY_UNAVAILABLE. A Shopify failure returns 502.
Store colors
POST /help-center/store-colors/sync takes no body. It reads the colors of the store's current theme and saves them in branding.storeColors, which the store color preset uses. It returns {"success":true} and does not change revision, so a settings draft read earlier still saves. A theme whose colors cannot be read is saved with status: "unreadable". A store without a Shopify connection returns 400 STORE_COLORS_SHOPIFY_UNAVAILABLE.
Brand assets
POST /help-center/assets/{kind} uploads one image. kind is logo, whiteLogo or favicon.
kind | Formats | Maximum size |
|---|---|---|
logo, whiteLogo | PNG, JPEG, SVG | 1 MB |
favicon | PNG, ICO, SVG | 256 KB |
Send either multipart with exactly one file, or JSON with mimeType, dataBase64 and an optional name:
curl -X POST 'https://app.chatty.net/v1/help-center/assets/logo' \
-H 'X-Api-Key: sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
-F '[email protected]'{"data":{"url":"https://cdn.example.com/help-center/shop_123/logo/logo.png"}}Success is 201. The file content must match its type, and SVG files with scripts are refused: 400 INVALID_FILE. Uploading does not change the Help center yet. Save the returned url with PATCH /help-center/settings, for example in branding.logoUrl or branding.faviconUrl. A storage failure returns 502 STORAGE_UPLOAD_FAILED.
Every write attempt that reaches the route handler is recorded in the audit log with the calling key, whether it succeeds or fails. Requests refused earlier, for a missing scope or a bad key, are not recorded. Writes are not idempotent; read the settings before repeating an uncertain request.
Errors
| HTTP | Code | Meaning |
|---|---|---|
400 | VALIDATION_FAILED / VALIDATION_ERROR | Missing or invalid periodDays, an invalid settings field or store page handle. |
400 | INVALID_FILE | Wrong asset type, size or content, or not exactly one file. |
400 | STORE_PAGE_SHOPIFY_UNAVAILABLE / STORE_COLORS_SHOPIFY_UNAVAILABLE | The store has no Shopify connection. |
401 | UNAUTHENTICATED / INVALID_API_KEY | Missing, unknown or revoked key. |
403 | FORBIDDEN | Missing helpdesk.helpcenter:read or helpdesk.helpcenter:write, or a legacy key. |
403 | CUSTOM_CSS_REQUIRES_PLUS | customCss change below Plus. |
403 | HELPDESK_DISABLED | The store does not use Helpdesk. |
404 | NOT_FOUND | Store not found. |
409 | STALE_SETTINGS | revision is out of date. Read again and retry. |
409 | STORE_PAGE_HANDLE_TAKEN | The handle is already used on the store. |
429 | RATE_LIMITED | Shared Public API limit reached. |
502 / 503 | Shopify or storage code | A Shopify page, theme or storage call failed. Read the current state before retrying. |
On MCP, manage_help_center reads the same resources with an API key or OAuth, and performs the writes with an API key only. To search published articles, use the API-key tools search_help_center and get_help_center_search_terms. See the MCP tool reference.
Chatty Help Center