Settings と機能
ストアの設定を取得し、書き込み可能なフィールドを確認して、必要な項目だけ更新できます。これらのエンドポイントは Public API のベース URL を使用します。/chat は付けません。
この機能をご利用いただける方
API キーには Pro または Plus プランが必要です。すべてのリクエストに X-Api-Key: sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx と、以下に示すスコープが必要です。従来のフルアクセスキーではこれらの設定権限は付与されないため、スコープを明示したキーを使用してください。Product Quiz とスパム対策には、ストアが Pro 以上のプランであることも必要です。
リクエストとレスポンスの共通ルール
書き込み時は Content-Type: application/json を指定し、JSON を送信します。成功時は HTTP 200 を返します。GET リクエストにボディは不要です。読み取り結果は data に入りますが、フィールドカタログは fields と total を返します。設定の PATCH は、実際に変わった内容を changed 配列で返します。
{
"changed": [
{"field": "enableLiveChat", "before": false, "after": true}
]
}変更がなければ {"changed":[]} を返します。保存されていなかったフィールドでは before が省略されることがあります。設定の PATCH で指定できるのは最大 50 フィールドです。送信前にフィールドカタログで型、列挙値、範囲、書き込み権限を確認してください。ウィジェットの更新には GET レスポンス全体を送らないでください。
ページ末尾のエラー一覧は、以下のすべてのエンドポイントに適用されます。このページのすべてのルートでは、上記の Pro / Plus の API キーを使用します。
ウィジェット設定
| メソッド | パス | スコープ | リクエスト | レスポンス例 |
|---|---|---|---|---|
| GET | /settings | settings:read | ボディなし | {"data":{"enableLiveChat":true,"enableAIAssistant":false}} |
| GET | /settings/:domain | settings:read | 例: /settings/root | {"data":{"enableLiveChat":true,"enableAIAssistant":false}} |
| PATCH | /settings | settings.widget:write | {"enableLiveChat":true} | {"changed":[{"field":"enableLiveChat","before":false,"after":true}]} |
読み取り例は保存済みフィールドの一部です。/settings は公開対象のウィジェット設定のみを返します。その他の設定は、以下のコレクション用エンドポイントで取得します。未保存のフィールドは省略され、カタログのデフォルト値では補完されません。
ウィジェットで指定できるドメインは root、appearance、aiAgent、availability、prechatContact、tracking、internalFlags(受信トレイ、チーム、メールのオプション)です。別名の ai-agent と prechat-contact も使用できます。存在しないドメインは {"data":{}} を返します。
ウィジェットの更新には、フラットな V2 フィールドパスを使用します。
curl -X PATCH 'https://app.chatty.net/v1/settings' \
-H 'X-Api-Key: sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"aiAgent.persona.name":"Store assistant"}'{
"changed": [
{"field": "aiAgent.persona.name", "before": "Assistant", "after": "Store assistant"}
]
}オブジェクト型のフィールドは、保存済みのオブジェクトにマージされます。例えば {"aiAgent.storeAvailability":{"outOfStockMessage":"Ask us about stock"}} だけを送信しても、保存済みの enabled の値は保持されます。その中の配列や最上位の配列は置き換えられます。
一部のウィジェットフィールドには追加のルールがあります。
| フィールド | ルール |
|---|---|
aiAgent.pricing | 価格の表示ルールです。display は label または hide、labelPhrase は Call for Price、Contact for pricing、Price on request、Request a quote のいずれかで、when.tags と when.productTypes には各 200 文字までの値を最大 100 個指定できます。 |
aiAgent.storeAvailability | enabled(boolean)と outOfStockMessage(1,000 文字まで)のみです。 |
internalFlags.emailSubjectTemplate | 500 文字までで、使えるトークンは page_name、customer_name、customer_email、shop_name、case_tag、status のみです。"" でデフォルトに戻ります。 |
internalFlags.inbox.assignableMemberIds | このストアのメンバーの ID です。 |
internalFlags.inbox.maxOpen | 整数です。0 は上限なしです。 |
internalFlags.enableSpamProtection | 有効にするには Pro 以上が必要で、そうでない場合は 403 PLAN_LIMIT を返します。無効にする操作はどのプランでも可能です。 |
enableAIAssistant を有効にすると enableLiveChat も有効になります。enableLiveChat を無効にすると AI アシスタントも無効になります。AI アシスタントを有効にしながらライブチャットを無効にする更新は、COUPLING_CONFLICT で失敗します。レスポンスには、連動して実際に変わったフィールドも含まれます。
フィールドを確認する
GET /settings/fields — スコープは settings:read、プランは Pro / Plus です。以下のクエリパラメーターは任意です。
| パラメーター | 内容 |
|---|---|
collection | widgetSettings や similarMatchingSettings などの正確なコレクション名 |
domain | ドメイン名。ウィジェットの読み取りと同じ別名を使用できます |
q | フィールドパスと説明を、大文字・小文字を区別せず部分一致で検索 |
例えば、ボディなしで /settings/fields?collection=similarMatchingSettings をリクエストします。
{
"fields": [
{
"collection": "similarMatchingSettings",
"domain": "shop",
"path": "similarMatchingSettings.forceSimilarByTags",
"type": "boolean",
"default": false,
"description": "Limits similar-product matching to configured priority tags.",
"affects": "agent-behavior",
"writeScope": "settings.shop:write",
"public": true
}
],
"total": 1
}カタログには 257 個のフィールドがあります。一致する項目がない場合は {"fields":[],"total":0} を返します。writeScope がないフィールドは読み取り専用です。カタログには他のリソースのフィールドも含まれます。それらを更新する場合は、/settings ではなく対応するリソースのエンドポイントを使用してください。
コレクション設定
以下の GET には settings:read が必要です。PATCH には各設定の書き込みスコープが必要です。すべて Pro / Plus で利用できます。読み取り例とオブジェクトの before/after の例は抜粋です。オブジェクト設定を編集する際は、既存の値を保持してください。
| メソッド | パス | スコープ |
|---|---|---|
| GET | /settings/shop | settings:read |
| PATCH | /settings/shop | settings.shop:write |
| GET | /settings/similar-matching | settings:read |
| PATCH | /settings/similar-matching | settings.shop:write |
| GET | /settings/notifications | settings:read |
| PATCH | /settings/notifications | settings.notifications:write |
| GET | /settings/satisfaction | settings:read |
| PATCH | /settings/satisfaction | settings.satisfaction:write |
| GET | /settings/product-quiz | settings:read |
| PATCH | /settings/product-quiz | settings.product-quiz:write |
| GET | /settings/faq-page | settings:read |
| PATCH | /settings/faq-page | settings.faq-page:write |
コレクションの更新では、GET レスポンスの data 内と同じネスト形式、またはカタログのドット区切りのフィールド名を使用できます。data のラッパーは含めません。同じフィールドを両方の形式で送ると検証エラーになります。
| リソース | GET レスポンス例 | PATCH リクエスト例 | PATCH レスポンス例 |
|---|---|---|---|
shop | {"data":{"shopSettings":{"markets":[]}}} | {"shopSettings":{"markets":[]}} | {"changed":[]}(すでに空の場合) |
similar-matching | {"data":{"similarMatchingSettings":{"forceSimilarByTags":false}}} | {"similarMatchingSettings.forceSimilarByTags":true} | {"changed":[{"field":"similarMatchingSettings.forceSimilarByTags","before":false,"after":true}]} |
notifications | {"data":{"notificationSettings":{"emails":[]}}} | {"notificationSettings":{"emails":["[email protected]"]}} | {"changed":[{"field":"notificationSettings","before":{"emails":[]},"after":{"emails":["[email protected]"]}}]} |
satisfaction | {"data":{"satisfactionSurveys":{"intro":"How did we do?"}}} | {"satisfactionSurveys":{"intro":"Rate your experience"}} | {"changed":[{"field":"satisfactionSurveys","before":{"intro":"How did we do?"},"after":{"intro":"Rate your experience"}}]} |
product-quiz | {"data":{"productQuizSettings":{"enabled":false}}} | {"productQuizSettings":{"enabled":true}} | {"changed":[{"field":"productQuizSettings.enabled","before":false,"after":true}]} |
faq-page | {"data":{"faqPageSetting":{"customUrl":"avada-faqs"}}} | {"faqPageSetting":{"customUrl":"store-faqs"}} | {"changed":[{"field":"faqPageSetting.customUrl","before":"avada-faqs","after":"store-faqs"}]} |
配列は以前の配列全体を置き換えます。特に shopSettings.markets を空にするとマーケット一覧が削除され、通知の emails 配列を空にすると宛先が削除されます。先に読み取り、保持する要素をすべて含めて送信してください。通知と満足度調査の設定は、カタログ上ではオブジェクト型のフィールドです。変更の比較対象には、保存済みメタデータを含むオブジェクト全体が使われます。オブジェクト型のフィールドは、ウィジェットの書き込みと同様に、保存済みのオブジェクトにマージされます。
- Product quiz にはストアが Pro 以上のプランであることが必要で、そうでない場合 PATCH は
403 PLAN_LIMITを返します。書き込み可能なフィールドはenabled、collectionScope({"type":"all"}または{"type":"specific","collectionIds":[...]})、maxQuestions(3、5、7)、numRecommendations(1、2、3)、intentTriggers(クイズを提案するフレーズ)です。 - FAQ page は、
header、description、カラーフィールド、theme、layout、バナーフィールド、faqPageCustomCssなどのコンテンツと外観のフィールドに加え、customUrlと SEO フィールドを受け付けます。contactUsにはheaderとurl(500 文字まで)、description(1,000 文字まで)、action(chatboxまたはanotherTab)、displayを指定できます。変更は使用している言語に翻訳され、ストアフロントに公開されます。 - Similar matching は
similarityPriorityTagsも受け付けます。これはタグのリストで、前後の空白を除去し、先頭の 50 個までが保持されます。未設定のフィールドはデフォルト値として読み取られます。
パス、型、デフォルト値の完全な一覧は、フィールドカタログで確認してください。
ショップの環境設定とストアの所在地
| Method | Path | Scope | Request | Response example |
|---|---|---|---|---|
| GET | /settings/shop-preferences | settings:read | ボディなし | {"data":{"emailFooterName":"Store support","hideChatLinkInEmail":false,"enableChatbox":true}} |
| PATCH | /settings/shop-preferences | settings.shop:write | {"enableChatbox":true} | {"changed":[{"field":"enableChatbox","before":false,"after":true}]} |
| GET | /settings/store-availability/locations | settings:read | ボディなし | {"data":[{"id":"location_123","name":"Main warehouse","city":"Hanoi"}]} |
ショップの環境設定には、ストア全体のメールとウィジェットのオプションが含まれます。PATCH では次のフィールドのうち少なくとも 1 つを指定でき、複数も指定できます。
| フィールド | 型 |
|---|---|
emailFooterName | string、500 文字まで |
emailReplyHint | string、500 文字まで。Chatty が使用している言語に翻訳します |
hideChatLinkInEmail | boolean |
showEmailSignature | boolean |
enableChatbox | boolean。ストアフロントのウィジェットを更新します |
pushOpenStandalone | boolean |
GET は読み取り専用の emailSender も返します。ボディが空、未知のフィールド、または型が誤っている場合は 400 VALIDATION_FAILED を返します。
所在地のルートは、ストアで有効な Shopify のロケーションを一覧します。AI エージェントの店舗在庫の回答(aiAgent.storeAvailability)で選択するために使えます。住所に市区町村がある場合は city が含まれます。一覧は 10 分間キャッシュされます。Shopify に接続できない場合は 502 UPSTREAM_ERROR を返すため、後で再試行してください。
マーケット別の設定
Shopify のマーケットごとに、AI 名やショップ名を変更できます。上書きできるのは aiAgent.persona.name と appearance.shopName のみです。その他の設定にはストア共通の値が使われます。
| メソッド | パス | スコープ | リクエスト |
|---|---|---|---|
| GET | /settings/market-overrides | settings:read | ボディなし |
| PUT | /settings/market-overrides/:marketId | settings.widget:write | フラットなフィールドの更新。例は以下を参照 |
| DELETE | /settings/market-overrides/:marketId | settings.widget:write | ボディなし |
3 つのルートすべてが Pro / Plus で利用できます。GET はマーケット、現在の上書き設定、対応するフィールドを返します。以下はレスポンスの抜粋です。
{
"data": {
"markets": [{"marketId":"market_123","handle":"international","name":"International","primary":false}],
"overrides": [],
"overridableFields": ["aiAgent.persona.name", "appearance.shopName"]
}
}market_123 は GET が返す marketId に置き換えてください。PUT は指定したフィールドをそのマーケットの既存設定にマージします。他のマーケットは変更しません。
PUT /settings/market-overrides/market_123
X-Api-Key: sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
{"aiAgent.persona.name":"Store assistant"}{"success":true,"marketId":"market_123","updatedFields":["aiAgent.persona.name"]}PUT には登録済みのマーケットと、空ではない更新内容が必要です。マーケットが存在しない場合や、保存済みのマーケット一覧を更新する必要がある場合は MARKET_NOT_FOUND を返します。ストアのマーケット設定を更新してから再試行してください。
DELETE /settings/market-overrides/market_123 はそのマーケットの上書き設定を削除し、ストア共通の設定に戻します。
{"success":true,"marketId":"market_123","removed":true}上書き設定が存在しない場合も成功し、removed: false を返します。
商品レコメンド
レコメンドは、特定の検索語に対して AI がどの商品を提案するかを指定します。これらのルートは、読み取りに knowledge:read、書き込みに knowledge:write を使い、Pro / Plus のキーが必要です。ボディとクエリは厳格で、未知のフィールドは 400 VALIDATION_FAILED を返します。
| Method | Path | Scope | Request example | Response example |
|---|---|---|---|---|
| GET | /recommendations | knowledge:read | ?limit=20&sort=updatedAt_desc | {"data":[{"id":"rec_123","title":"Gifts","searchTerms":["gift"],"conditions":{"productIds":["123"]},"enabled":true,"isCustom":true}],"count":1,"pagination":{"hasPre":false,"hasNext":false}} |
| GET | /recommendations/{id} | knowledge:read | ボディなし | {"data":{"id":"rec_123","title":"Gifts","enabled":true}} |
| POST | /recommendations | knowledge:write | {"title":"Gifts","searchTerms":["gift","present"],"products":["123"],"enabled":true} | 201 {"data":{"id":"rec_123","title":"Gifts","isCustom":true}} |
| PATCH | /recommendations/{id} | knowledge:write | {"searchTerms":["gift"]} | {"success":true} |
| DELETE | /recommendations/{id} | knowledge:write | ボディなし | {"success":true} |
| POST | /recommendations/toggle | knowledge:write | {"ids":["rec_123","best_selling"],"enabled":false} | {"success":true} |
| GET | /recommendations/meta-tags/{metaTag} | knowledge:read | ボディなし | {"data":{"metaTag":"best_selling","enabled":true,"smartSyncEnabled":true}} |
| PUT | /recommendations/meta-tags/{metaTag} | knowledge:write | {"smartSyncEnabled":false} | {"success":true} |
| GET | /recommendations/shopify-settings | knowledge:read | ボディなし | {"data":{"enableRelated":true,"enableComplementary":true}} |
| PATCH | /recommendations/shopify-settings | knowledge:write | {"enableComplementary":false} | {"success":true} |
例は抜粋です。
- 作成と更新。 作成時は
titleが必須です(1~500 文字)。searchTermsは最大 50 個です。productsとcollectionsは最大 1,000 個の ID のリストで、conditions.productIdsとconditions.collectionIdsに保存されます。PATCH には少なくとも 1 つのフィールドが必要で、conditionsは保存済みの値とマージされます。 - 一覧。
limitは 1~100(デフォルト 20)です。sortはupdatedAt、createdAt、titleのいずれかに_ascまたは_descを付けたもの(デフォルトupdatedAt_desc)です。ページングにはafter(このページの最後の ID)またはbeforeを使います。hasCount=trueを付けるとtotalとpagination.totalPageが追加されます。一覧されるのは自分のレコメンドだけです。 - テンプレート。
special_occasionsとsale_promotionは組み込みのテンプレートです。GET は保存するまでテンプレートをそのまま返し、PATCH は変更内容を付けて保存し、DELETE は非表示にします。 - 切り替え。 最大 200 件のレコメンド、テンプレート、メタタグを一度にオンまたはオフにします。未知の ID が 1 つでもあると何も変更されず、
404 NOT_FOUNDを返します。 - メタタグ。 サポートされるタグは
best_sellingとnewestの 2 つで、それ以外の値は404 NOT_FOUNDを返します。一度も保存されていないタグはenabledとsmartSyncEnabledがともにtrueで始まり、読み取るとそのデフォルトが保存されます。 - Shopify 設定。
enableRelatedとenableComplementaryは、Shopify の関連商品と補完商品の提案をオンまたはオフにします。未設定の値はtrueとして読み取られます。
未知の、または他のストアのレコメンド ID は 404 NOT_FOUND を返します。すべての書き込みは監査ログに記録されます。
機能の有効化と無効化
機能ごとに、必要な設定フィールドがまとめられています。更新するフィールドを個別に組み立てずに機能を有効・無効にしたい場合は、これらのエンドポイントを使用します。
| メソッド | パス | スコープ | リクエスト |
|---|---|---|---|
| GET | /features | settings:read | ボディなし |
| GET | /features/:key | settings:read | 例: /features/live_chat。ボディなし |
| POST | /features/:key/enable | settings.widget:write | 例: /features/live_chat/enable。ボディなし |
| POST | /features/:key/disable | settings.widget:write | 例: /features/live_chat/disable。ボディなし |
4 つのルートすべてが Pro / Plus で利用できます。使用できるキーは以下のとおりです。
| キー | 設定フィールド |
|---|---|
ai_assistant | enableAIAssistant |
live_chat | enableLiveChat |
faq_lookup | aiAgent.knowledge.enableFaqs |
product_lookup | aiAgent.knowledge.enableProducts |
shipping_quote | aiAgent.knowledge.enableShippingQuote |
discounts | aiAgent.knowledge.enableDiscounts, aiAgent.knowledge.discountsAutoSync |
multi_currency | aiAgent.knowledge.enableMultiCurrency |
order_tracking | aiAgent.scenarios.enableOrderTrackingTool |
after_sale_support | aiAgent.scenarios.enableAfterSaleSupport |
human_agent_transfer | aiAgent.scenarios.enableHumanAgentRequest |
size_guide | aiAgent.scenarios.enableSizeGuide |
follow_up_questions | aiAgent.enableFollowUpProductQuestions, aiAgent.scenarios.followUp.enabled |
ai_mode | ショップのフィールド enableAiMode |
GET /features/live_chat のレスポンス例:
{"data":{"key":"live_chat","enabled":false,"fields":["enableLiveChat"],"settings":{"enableLiveChat":false}}}GET /features は、キーごとにこの形式のオブジェクトを data 配列に入れて返します。複数のフィールドを持つ機能は、すべてのフィールドが true の場合のみ有効と判定されます。
ライブチャットが無効だった場合、POST /features/live_chat/enable は次のように返します。
{"changed":[{"field":"enableLiveChat","before":false,"after":true}]}ライブチャットが有効で、AI アシスタントがすでに無効だった場合、POST /features/live_chat/disable は次のように返します。
{"changed":[{"field":"enableLiveChat","before":true,"after":false}]}これらの操作にも、上記の AI とライブチャットの連動ルールが適用されます。ai_mode はショップのフィールド enableAiMode を変更し、同じ changed 形式で返します。存在しないキーは 404 NOT_FOUND を返します。
エラー
エラーレスポンスは {"error":{"code":"…","message":"…"}} 形式で、必要に応じて details が付加されます。バージョンとレート制限の共通ルールは Errors and rate limits をご覧ください。
| HTTP | コード | 対象と対処 |
|---|---|---|
| 401 | UNAUTHENTICATED, INVALID_API_KEY | すべてのルート:有効な X-Api-Key を指定してください |
| 403 | FORBIDDEN | すべてのルート:必要なスコープを付与してください |
| 403 | FIELD_NOT_PERMITTED | 設定、機能、マーケット設定の書き込み:未知のフィールド、読み取り専用、異なるコレクション、上書き不可のフィールド |
| 400 | VALIDATION_FAILED | 書き込み:型・列挙値・範囲が不正、nested/dotted 形式の重複、または PATCH が 50 フィールドを超過 |
| 400 | VALIDATION_ERROR | ウィジェット・機能の書き込み:個別フィールドの値が不正 |
| 400 | MISSING_PARAMS | ウィジェットまたはマーケット設定の更新内容が空、または必要なマーケット識別子が不足 |
| 400 | COUPLING_CONFLICT | ウィジェット・機能の書き込み:AI とライブチャットの設定が矛盾 |
| 403 | PLAN_LIMIT | Product Quiz の書き込み、またはスパム対策を Pro 未満で有効化 |
| 502 | UPSTREAM_ERROR | ストアの所在地を Shopify から読み込めませんでした。後で再試行してください |
| 404 | MARKET_NOT_FOUND | マーケット設定の PUT:保存済みのマーケット一覧に対象が存在しません |
| 404 | NOT_FOUND | 機能キーが存在しない、AI Mode の対象ショップがない、マーケット設定の書き込み時にウィジェット設定がない、または未知のレコメンドやメタタグ |
| 429 | RATE_LIMITED | すべてのルート:時間を置いて再試行してください |
| 500 | INTERNAL_ERROR | 予期しないエラー:サポートへの問い合わせ用にレスポンスを保存してください |
検証エラーには、拒否されたフィールドごとの情報が含まれる場合があります。
{
"error": {
"code": "VALIDATION_FAILED",
"message": "One or more settings fields are invalid",
"details": {
"fields": [{"field":"enableLiveChat","code":"INVALID_TYPE","expected":"boolean"}]
}
}
}MCP と監査記録
MCP では、Widget の変更に update_settings、コレクションの更新に update_settings_resource、ショップの環境設定に update_shop_preferences、マーケット別設定に manage_market_overrides、機能の切り替えに set_feature、レコメンドに manage_recommendations を使用します。get_settings_resource は、ショップの環境設定(shop_preferences)とストアの所在地(store_availability_locations)を読み取ります。各ツール・action には対応する REST 操作と同じスコープが必要です。設定、環境設定、マーケット別設定、レコメンドの書き込みでは、失敗した試行も含めて、認証された実行者が変更の監査記録に渡されます。クライアントが独自の実行者情報を指定するものではありません。入力と認証方式別の利用可否は MCP tool reference をご覧ください。
Chatty Help Center