tradebee
Version: 26.6.2
Overview
This skill merges multiple Tradebee Website Builder Open API capabilities into a single publishable skill.
For all *_update actions, this skill does more than send a Tradebee update request:
- It reads the current record first.
- It writes a local JSON backup file under
backups/<action>/relative to the current installed skill root. - It returns backup metadata, the raw read response, the extracted snapshot, and a best-effort
restore_payloadon success. - The local backup file also keeps
confirmation_summary,requested_update_payload, andrestore_limitationstogether with that backup data.
All future Tradebee capabilities added in this repository must be exposed through tradebee rather than published as separate primary skills.
This skill should be selected by the user's expected result, not only by API name.
Only route into this skill after the Tradebee data domain and object type are explicit.
- Do not trigger this skill for generic requests such as "find", "show", "check", "update", or "delete" when Tradebee platform data is not clearly the target.
- For
*_updateand*_delete, require one explicit Tradebee object type plus one explicit record ID or explicitly confirmed ID list before routing. - For
*_read, still choose the narrowest valid Tradebee filter instead of broad listing when the user already gave an exact ID, group, keyword, or IP.
When the user speaks in natural language such as "find the Tradebee product", "show Tradebee products under this category", "read one exact Tradebee blog", "open this custom page", "look at recent Tradebee inquiries", "see which Tradebee keywords are ranking in the top 100", or "delete these Tradebee products", map that request to the matching action below and choose the narrowest valid filter.
Supported actions:
languages-getrule-getblog-createblog-updateblog-readblog-deletebloggroup-createbloggroup-updatebloggroup-readbloggroup-deletecustompage-createcustompage-updatecustompage-readcustompage-deleteproductsgroup-createproductsgroup-updateproductsgroup-deleteproductsgroup-readproducts-readproducts-createproducts-updateproducts-deleteinquiry-readvisitor-recentkeywords-rank
HTML Fragment Rules
Before generating any HTML fragment for:
blog.descriptionproducts.descriptionproductsgroup.section.topproductsgroup.section.bottomcustompage.content
first call rule-get with:
- the exact selected
language - the exact matching
scene
rule-get call requirements:
languageis requiredsceneis required- use the exact
languagevalue already selected for the create or update action - do not guess, translate, normalize, or replace the
languagevalue - do not invent, shorten, translate, or rename any
scenevalue - use only the fixed scene mapping below. Do not call the current frontend website domain for this rule API.
Minimal request body:
{
"action": "rule-get",
"language": "en",
"scene": "products.description"
}
Example request pattern:
{
"action": "rule-get",
"language": "en",
"scene": "products.description"
}
Required execution order:
- Select the exact site
languagefirst. - Select the exact fixed
scenethat matches the target HTML field. - Call
rule-get. - Generate the HTML fragment only after
rule-getreturns successfully.
Failure rule:
- If
rule-getfails, do not continue by guessing colors, fonts, links, layout, or other fragment rules. - Stop and report the rule-call failure instead of generating a fragment from assumptions.
Scene mapping:
blog.description->scene=blog.descriptionproducts.description->scene=products.descriptionproductsgroup.section.top->scene=productsgroup.section.topproductsgroup.section.bottom->scene=productsgroup.section.bottomcustompage.content->scene=custompage.content
The generated fragment must follow the returned rule payload, especially:
- use the exact selected language only
- follow the full returned rule payload, not only part of it
- do not guess, replace, shorten, rename, or partially ignore returned rule fields
- do not hardcode assumptions in this skill about future rule details; the
rule-getresponse is the source of truth
Quick Routing Guide
Choose the action by the user's actual goal and the result they expect to see.
Result-First Routing
- If the user wants to know "what exists", prefer a
*_readaction. - If the user wants to "add new content", prefer a
*_createaction. - If the user wants to "change existing content", prefer a
*_updateaction. - If the user wants to "remove existing content", prefer a
*_deleteaction. - If the user asks for analytics, visit history, inquiry records, or keyword performance, prefer the specialized read action instead of any content action.
How Users Usually Ask
- "show one", "check one", "list them", "see whether it exists", "find this", "read one"
Route these to the matching
*_readaction. - "add new", "create", "publish", "add"
Route these to the matching
*_createaction. - "modify", "edit", "update", "adjust"
Route these to the matching
*_updateaction. - "delete", "move to recycle bin", "remove"
Route these to the matching
*_deleteaction. - "recent visits", "visitor IP", "keyword ranking", "inquiry records"
Route these to
visitor-recent,keywords-rank, orinquiry-readinstead of blog or product actions.
Language Selection
- Use
languages-getwhen the user asks:- "What languages are enabled?"
- "Show available site languages"
- "Which language code should I use?"
- Use
rule-getwhen the user asks:- "Read the product description HTML rules"
- "Show the blog description rule payload"
- "Get the product group top section rules"
- "Check the exact Tradebee HTML generation rules for this scene"
Blog Operations
- Use
blog-readwhen the user asks:- "Read blogs"
- "List blog articles"
- "Find one exact blog"
- "Show blogs under this blog group"
- "help me check this blog post"
- "show blogs under a specific category"
- Use
blog-createwhen the user asks:- "Create a blog"
- "Publish an article"
- "Add a new blog post"
- Use
blog-updatewhen the user asks:- "Update blog 123"
- "Edit blog content"
- "Move a blog to another group"
- Use
blog-deletewhen the user asks:- "Delete blog 123"
- "Move these blogs to recycle bin"
Blog Group Operations
- Use
bloggroup-readwhen the user asks:- "List blog groups"
- "Read one exact blog group"
- "Show blog categories"
- "what blog categories are there"
- "check this blog category"
- Use
bloggroup-createwhen the user asks:- "Create a blog group"
- "Add a blog category"
- Use
bloggroup-updatewhen the user asks:- "Update blog group 456"
- "Rename a blog category"
- Use
bloggroup-deletewhen the user asks:- "Delete these blog groups"
Custom Page Operations
- Use
custompage-readwhen the user asks:- "Read custom pages"
- "List custom pages"
- "Find one exact custom page"
- "show custom page details"
- Use
custompage-createwhen the user asks:- "Create a custom page"
- "Add a custom page"
- "Publish a custom page"
- Use
custompage-updatewhen the user asks:- "Update custom page 123"
- "Edit custom page content"
- "Change custom page SEO"
- Use
custompage-deletewhen the user asks:- "Delete custom page 123"
- "Move these custom pages to recycle bin"
Product Operations
- Use
products-readwhen the user asks:- "Read products"
- "List product data"
- "Find one exact product"
- "Show products under this group"
- "help me find this product"
- "show products under this group"
- "read product details"
- Use
products-createwhen the user asks:- "Create a product"
- "Publish a new product"
- "Add a product listing"
- Use
products-updatewhen the user asks:- "Update product 123"
- "Modify product content"
- "Move a product to another group"
- Use
products-deletewhen the user asks:- "Delete product 123"
- "Move these products to recycle bin"
Product Group Operations
- Use
productsgroup-readwhen the user asks:- "List product groups"
- "Read top-level product groups"
- "Read child groups under this parent"
- "Find one exact product group"
- "what product categories are there"
- "what child categories are under this parent category"
- Use
productsgroup-createwhen the user asks:- "Create a product group"
- "Add a product category"
- Use
productsgroup-updatewhen the user asks:- "Update product group 456"
- "Edit product category info"
- Use
productsgroup-deletewhen the user asks:- "Delete these product groups"
Inquiry, Visitor, and Ranking Operations
- Use
inquiry-readwhen the user asks:- "Read inquiries"
- "List leads"
- "Show recent inquiry records"
- "what recent inquiries are there"
- "help me check recent customer messages"
- Use
visitor-recentwhen the user asks:- "Check recent visitors"
- "Find visitor by IP"
- "Show latest visitor behavior"
- "show recent visits"
- "check visits from this IP"
- Use
keywords-rankwhen the user asks:- "Check keyword ranking"
- "Find one exact keyword ranking"
- "Show keywords ranked within top 100"
- "show keyword performance"
- "check the top 100 keywords"
Selection Principles
- Prefer
*-readonly when the user explicitly wants to read or analyze existing Tradebee records and the Tradebee object type is already clear. - Prefer
*-createonly when the user explicitly wants to create new Tradebee content and the target Tradebee object type is already clear. - Prefer
*-updateonly when the user explicitly wants to modify one existing Tradebee record and both the Tradebee object type and target record are already explicit. - Prefer
*-deleteonly when the user explicitly wants to delete Tradebee content and both the Tradebee object type and target record ID or confirmed ID list are already explicit. - If the user mentions one exact ID, prefer the corresponding exact-ID read filter instead of a broader group filter.
- If the user mentions "under this group", "in this category", or "belonging to this group", prefer the corresponding group filter.
- If the request needs a language and the user has not provided one exact enabled code yet, call
languages-getfirst. - If the user gives both an exact ID and a group condition, prefer the exact ID if the API requires a mutually exclusive choice.
- If the user wants "details", "that one", or "the exact record", prefer the exact-ID filter over list-style filters.
- If the user wants "all", "recent", or "latest list", avoid adding unnecessary exact-ID filters.
- If the user asks for a business result but does not name the object type clearly, infer the object from nouns:
product->products-*,product group/category->productsgroup-*,blog/article->blog-*,blog group/category->bloggroup-*,custom page->custompage-*.
Preview URL Rule
For these read actions:
blog-readbloggroup-readcustompage-readproducts-readproductsgroup-read
when the returned result is a list, the agent must include one ID and one preview URL in the final answer so the user can decide whether to preview it.
- Do not tell the user they must preview it.
- Do not omit the preview URL when the API response already contains the corresponding URL field.
- Do not omit the ID when the API response already contains the corresponding ID field.
- If
fieldsis used, include the corresponding URL field so one preview URL is available in the returned list:blog_url,bloggroup_url,custompage_url,products_url, orproductsgroup_url. Also include the corresponding ID field:blog_id,bloggroup_id,custompage_id,products_id, orproductsgroup_id.
Routing by Expected Result
Use this section when a request is phrased around a business outcome instead of an API term.
- "I want to know what product data exists"
Use
products-read. - "I want one exact product"
Use
products-readwithproducts_id. - "I want products inside one category"
Use
products-readwithproductsgroup_id. - "I want all top-level product categories"
Use
productsgroup-readwith no filter orparent_productsgroup_id=0. - "I want subcategories under one parent category"
Use
productsgroup-readwithparent_productsgroup_id. - "I want one exact product category"
Use
productsgroup-readwithproductsgroup_id. - "I want blog articles"
Use
blog-read. - "I want one exact blog"
Use
blog-readwithblog_id. - "I want blogs inside one blog group"
Use
blog-readwithbloggroup_id. - "I want all blog groups or one exact blog group"
Use
bloggroup-read, optionally withbloggroup_id. - "I want custom pages"
Use
custompage-read. - "I want one exact custom page"
Use
custompage-readwithcustompage_id. - "I want inquiry records from recent days"
Use
inquiry-read, optionally withrecent_days. - "I want recent visitor data"
Use
visitor-recent. - "I want visitor data for one IP"
Use
visitor-recentwithip. - "I want keyword ranking for one keyword"
Use
keywords-rankwithkeywords. - "I want keywords ranking within the top N"
Use
keywords-rankwithrank.
Filter Selection Rules
When multiple filters exist, choose the one that most directly matches the user's wording.
products-readIf the user names one exact product, useproducts_id. If the user asks for products under one group, useproductsgroup_id. Do not send both together.productsgroup-readIf the user asks for one exact group, useproductsgroup_id. If the user asks for children under a parent, useparent_productsgroup_id. If the user asks for top-level groups, omit both or useparent_productsgroup_id=0.blog-readIf the user names one exact blog, useblog_id. If the user asks for blogs under one group, usebloggroup_id. Do not send both together.bloggroup-readIf the user asks for one exact blog group, usebloggroup_id. Otherwise omit it to read the list.custompage-readIf the user asks for one exact custom page, usecustompage_id. Otherwise omit it to read the list.visitor-recentIf the user gives one IP, useip. Otherwise omit it to read recent visitors across all IPs.keywords-rankIf the user gives one exact keyword text, usekeywords. If the user asks for "top N", userank. Do not send both together.
Required Parameters
Authentication uses only the configured BEE_API_KEY environment variable. Never provide API keys in tool inputs, prompts, examples, logs, or chat text. Tradebee requests send site and business data to the external Tradebee Website Builder API, so only send the minimum data needed for the user's stated task.
action (string)
Selects which capability to execute.
Practical routing rule:
- explicit Tradebee read or analysis request with a clear object type -> usually choose a
*-readaction - explicit Tradebee create or publish request with a clear object type -> usually choose a
*-createaction - explicit Tradebee update request for one known record -> usually choose a
*-updateaction - explicit Tradebee delete request for one known record or one confirmed ID list -> usually choose a
*-deleteaction
Common Parameters
language (string)
Used by most content operations.
- This must be the exact site language code returned by
languages-get, such asenorfr - Do not guess, translate, normalize, or invent the value
- First call
languages-get, show the language list to the user, then copy one exactlanguagevalue the user confirms
scene (string)
Used by rule-get.
- This field is required for
rule-get. - Use one exact supported scene value only:
blog.description,products.description,productsgroup.section.top,productsgroup.section.bottom, orcustompage.content. - Do not invent, shorten, translate, normalize, or rename the value.
- Choose the exact scene that matches the target HTML field before calling
rule-get.
bloggroup_id (integer)
Used by blog-read and bloggroup-read.
- Omit this field to read blogs from all groups.
- If you need blog-group filtering, use a positive blog group ID selected from
bloggroup-readunder the same language. - For
blog-read, do not send this field together withblog_id. The rule is: omit both to read all blogs, or provide exactly one of them. - For
bloggroup-read, omit this field to read all blog groups. - For
bloggroup-read, if you need one specific blog group, send one positive existingbloggroup_id.
custompage_id (integer)
Used by custompage-read.
- Omit this field to read all custom pages.
- If you need one specific custom page, send one positive existing
custompage_id.
blog_id (integer)
Used by blog-read.
- Omit this field to avoid exact-blog filtering.
- If you need one specific blog, send one positive existing
blog_id. - For
blog-read, do not send this field together withbloggroup_id. The rule is: omit both to read all blogs, or provide exactly one of them.
ip (string)
Used by visitor-recent.
- Omit this field to read recent visitors for all IPs.
- If you need one specific visitor IP, send one exact IPv4 or IPv6 address.
keywords (string)
Used by keywords-rank.
- Omit this field to read all keyword ranking records.
- If you need one specific keyword ranking record, send one exact non-empty keyword string.
- For
keywords-rank, do not send this field together withrank. The rule is: omit both to read all records, or provide exactly one of them.
rank (integer)
Used by keywords-rank.
- Omit this field to read all keyword ranking records.
- If you need keywords ranked within the top N positions, send one integer from
1to999. rank=100means return keywords ranked within positions1through100, not only keywords whose rank equals100.- For
keywords-rank, do not send this field together withkeywords. The rule is: omit both to read all records, or provide exactly one of them.
parent_productsgroup_id (integer)
Used by productsgroup-read.
- Omit this field or set
0to read top-level groups. - If provided as a positive integer (
> 0), the API returns the direct child groups under that parent group. - This is a parent group selector, not a leaf-group validator.
- Do not send this field together with
productsgroup_idforproductsgroup-read. The rule is: omit both to read top-level groups, or provide exactly one of them.
productsgroup_id (integer)
Used by products-read and productsgroup-read.
- For
products-read, omit this field to read products from all groups. If you need group filtering, use a positive leaf group ID selected fromproductsgroup-readwhereis_leaf === true. - For
products-read, do not send this field together withproducts_id. The rule is: omit both to read all products, or provide exactly one of them. - For
productsgroup-read, omit this field to avoid exact-group filtering. If provided, use one positive existingproductsgroup_id. - For
productsgroup-read, do not send this field together withparent_productsgroup_id. The rule is: omit both to read top-level groups, or provide exactly one of them.
products_id (integer)
Used by products-read.
- Omit this field to avoid exact-product filtering.
- If you need one specific product, send one positive existing
products_id. - For
products-read, do not send this field together withproductsgroup_id. The rule is: omit both to read all products, or provide exactly one of them.
pagination (object)
Used by blog-read, bloggroup-read, custompage-read, products-read, inquiry-read, visitor-recent, and keywords-rank.
{
"current_page": 1,
"page_size": 5
}
pagination.current_page (integer)
Used inside pagination.
- Use a positive integer starting from
1. - Omit it only if the action can rely on its server-side default.
pagination.page_size (integer)
Used inside pagination.
- Use a positive integer.
- Keep it as small as practical for the user's stated task.
- Omit it only if the action can rely on its server-side default.
recent_days (integer)
Used by inquiry-read.
- Omit this field to use the action without recent-day filtering.
- If provided, use one positive integer to limit the inquiry read to recent days only.
fields (array)
Used when a read action supports field selection, especially productsgroup-read.
- Omit this field to use the action's default field set.
- If the caller needs product group section HTML fragments, include
sectionin this array. - Do not guess undocumented field names.
products (object)
Used by products-create and products-update.
This object contains the product payload.
- For
products-create, send a complete new product payload - For
products-update,products_idis required and every other field is optional - For
products-update, omit any field that should stay unchanged - Do not send guessed IDs or guessed field values
For products.productsgroup_id:
- In
products-create, this field is required and must be a positive leaf group ID selected fromproductsgroup-readwhereis_leaf === true. - In
products-update, omit this field to keep the current group unchanged. If provided, it must follow the same leaf-group rule.
Field rules:
products.products_id: required only forproducts-update. This is the real existing product ID to edit.products.product_name: product title. Omit it inproducts-updateif the name should not change.products.model: product model. Omit it inproducts-updateif the model should not change.products.upload_images: forproducts-create, provide 1 to 5 images; the first image becomes the main image. Forproducts-update, omit this field if images should not change.products.attributes: optional visible attribute pairs such as material, size, or color. Omit inproducts-updateif unchanged.products.tags: search keywords. Forproducts-create, provide at least 1 tag and at most 6. Forproducts-update, omit if unchanged.products.brief_description: short plain-text summary. Omit inproducts-updateif unchanged.products.description: detailed HTML description. HTML fragment only. Do not include any<h1>tag, and prefer<h2>to<h6>. Follow therule-getpayload, including the current tenant structure rules such as one root<section>element and one embedded<style>block placed at the end of the fragment. Do not use inline style attributes as the main styling method. Omit inproducts-updateif unchanged.products.seo.keywords: one comma-separated string, not an array.
blog (object)
Used by blog-create and blog-update.
blog.blog_id: required forblog-update. This is the existing blog ID to edit.blog.bloggroup_id: required blog group ID forblog-create. Inblog-update, omit it if the blog should stay in the current group.blog.publisher: optional publisher name, up to 100 characters. Omit it inblog-updateif unchanged.blog.publication_date: optional display date inyyyy/M/dformat, for example2026/4/24. Omit it inblog-updateif unchanged.blog.title: required blog title forblog-create, up to 500 characters. Omit it inblog-updateif unchanged.blog.cover_image: optional cover image object withnameandbase64. Omit it inblog-updateif the cover image should stay unchanged.blog.tags: required keyword list with 1 to 6 items forblog-create. Omit inblog-updateif unchanged.blog.summary: required plain-text summary forblog-create, up to 500 characters. Omit inblog-updateif unchanged.blog.description: required HTML content forblog-create, up to 100,000 characters. Do not include any<h1>tag; use<h2>to<h6>or normal block elements instead. Omit inblog-updateif unchanged.blog.seo: optional SEO object withtitle,description, andkeywords. Omit it inblog-updateif SEO should stay unchanged.
productsgroup (object)
Used by productsgroup-create and productsgroup-update.
productsgroup.parent_productsgroup_id: optional parent group ID. Omit it or set0for a top-level group.productsgroup.productsgroup_id: required forproductsgroup-update. This is the existing product group ID to edit.productsgroup.group_name: required product group name, up to 200 characters.productsgroup.tags: required keyword list with 1 to 6 items. Each tag must contain 3 to 50 characters.productsgroup.brief_description: optional short plain-text description, up to 4,000 characters.productsgroup.section: optional custom HTML decoration object for the product group detail page body.productsgroup.section.top: optional product group page header decoration fragment. HTML fragment only. Do not include any<h1>tag, and prefer<h2>to<h6>. Maximum length: 100,000 characters after removing<img>tags. Follow therule-getpayload, including the current tenant structure rules such as one root<section>element and one embedded<style>block placed at the end of the fragment. Do not use inline style attributes as the main styling method. Inproductsgroup-update, omit this field or pass an empty string to keep the current top fragment unchanged.productsgroup.section.bottom: optional product group page footer decoration fragment. HTML fragment only. Do not include any<h1>tag, and prefer<h2>to<h6>. Maximum length: 100,000 characters after removing<img>tags. Follow therule-getpayload, including the current tenant structure rules such as one root<section>element and one embedded<style>block placed at the end of the fragment. Do not use inline style attributes as the main styling method. Inproductsgroup-update, omit this field or pass an empty string to keep the current bottom fragment unchanged.custompage.content: required HTML content forcustompage-create, up to 100,000 characters after removing<img>tags. Generate it only after callingrule-getwith exactlanguageand exactscene=custompage.content. Follow the returned rule payload, including the current tenant structure rules such as one root<section>element and one embedded<style>block placed at the end of the fragment. Do not use inline style attributes as the main styling method. Omit it incustompage-updateif unchanged.productsgroup.seo: optional forproductsgroup-update. Omit it if SEO should stay unchanged.
bloggroup (object)
Used by bloggroup-create and bloggroup-update.
bloggroup.bloggroup_id: required forbloggroup-update. This is the existing blog group ID to edit.bloggroup.group_name: required blog group name forbloggroup-create, up to 100 characters. Omit it inbloggroup-updateif unchanged.bloggroup.tags: required keyword list with 1 to 6 items forbloggroup-create. Omit it inbloggroup-updateif unchanged.bloggroup.brief_description: optional short plain-text description, up to 300 characters. Omit it inbloggroup-updateif unchanged.bloggroup.seo: optional SEO object withtitle,description, andkeywords. Omit it inbloggroup-updateif SEO should stay unchanged.
custompage (object)
Used by custompage-create and custompage-update.
custompage.custompage_id: required forcustompage-update. This is the existing custom page ID to edit.custompage.title: required title forcustompage-create, up to 100 characters. Omit it incustompage-updateif unchanged.custompage.content: required HTML content forcustompage-create, up to 100,000 characters after removing<img>tags. Generate it only after callingrule-getwith exactlanguageand exactscene=custompage.content. Follow the returned rule payload, including the current tenant structure rules such as one root<section>element and one embedded<style>block placed at the end of the fragment. Do not use inline style attributes as the main styling method. Omit it incustompage-updateif unchanged.custompage.seo: optional SEO object withtitle,content, andkeywords. Omit it incustompage-updateif SEO should stay unchanged.
id_list (array)
Used by blog-delete, bloggroup-delete, custompage-delete, productsgroup-delete, and products-delete.
confirmation (object)
Required by blog-create, blog-update, blog-delete, bloggroup-create, bloggroup-update, bloggroup-delete, custompage-create, custompage-update, custompage-delete, productsgroup-create, productsgroup-update, productsgroup-delete, products-create, products-update, and products-delete.
Before any create, update, or delete action, show the user the language and the exact payload or product IDs to be changed, then set:
{
"approved": true,
"summary": "Confirmed by user: update product 123 in language en with the shown payload."
}
For every *_update action, this skill also enforces a pre-update backup capture and file persistence step.
- The current record must be read successfully before the update request is sent.
- The backup must be written to a local JSON file under
backups/<action>/relative to the current installed skill root. - That local JSON file persists
confirmation_summary,raw_read_response,snapshot,requested_update_payload,restore_payload, andrestore_limitations. - That local backup file may contain sensitive business or personal data copied from the current record and requested update payload, so the user must be aware of and approve that local persistence before the update runs.
- If backup capture fails, or if the backup file cannot be written, the update must not run.
- If the update succeeds, the response includes
backup.storage.file_path,backup.raw_read_response,backup.snapshot, and a best-effortbackup.restore_payload. - If the user later says the edit result is wrong, reuse that
backup.restore_payloadwith the same*_updateaction to restore the previous state. - Uploaded images are only partially restorable because the read APIs do not return the original image base64 content.
Action Guide
languages-get
Returns the list of enabled site languages.
Common user intents:
- "Show enabled languages"
- "What language codes can I use?"
rule-get
Returns the tenant HTML generation rule payload for one exact language and one exact scene.
This action is the required source of truth before generating any supported HTML fragment.
Execution rules:
languageis required and must be one exact enabled site language.sceneis required and must be one exact supported scene value.- Call this action before generating
blog.description,products.description,productsgroup.section.top,productsgroup.section.bottom, orcustompage.content. - If this action fails, stop and report the failure instead of guessing colors, fonts, links, layout, or any other HTML fragment rule.
Common user intents:
- "Read the product description HTML rules"
- "Show the blog description rule payload"
- "Get the product group top section rules"
- "Check the exact Tradebee HTML generation rules for this scene"
blog-create
Creates and publishes a new blog under the selected language and blog group.
This action must not run unless the user has explicitly confirmed the language and exact blog payload to be created.
Common user intents:
- "Create a blog"
- "Publish an article"
blog-update
Updates an existing blog under the selected language.
This action must not run unless the user has explicitly confirmed the language, target blog ID, and exact payload to be changed.
Update rules:
blog.blog_idis required- Any field other than
blog_idshould be omitted unless the user explicitly wants to change it - Omitting a field means keep the existing value
- Do not move the blog group unless the user explicitly asks for that change
- Capture a pre-update backup snapshot first; if backup capture fails, abort the update
- Return
backup.restore_payloadon success so the same blog can be restored later if needed
Common user intents:
- "Update blog 123"
- "Edit blog information"
blog-read
Returns published blog data with optional pagination, blog-group filtering, or exact blog filtering.
Common user intents:
- "Read blogs"
- "List blog articles"
- "Find blog 123"
blog-delete
Moves one or more blogs to the recycle bin.
This action must not run unless the user has explicitly confirmed the language and exact blog IDs to be moved.
Common user intents:
- "Delete these blogs"
- "Move blog 123 to recycle bin"
bloggroup-create
Creates and publishes a new blog group under the selected language.
This action must not run unless the user has explicitly confirmed the language and exact blog group payload to be created.
Common user intents:
- "Create a blog group"
- "Add a blog category"
bloggroup-update
Updates an existing blog group under the selected language.
This action must not run unless the user has explicitly confirmed the language, target blog group ID, and exact payload to be changed.
Update rules:
bloggroup.bloggroup_idis required- Any field other than
bloggroup_idshould be omitted unless the user explicitly wants to change it - Omitting a field means keep the existing value
- Capture a pre-update backup snapshot first; if backup capture fails, abort the update
- Return
backup.restore_payloadon success so the same blog group can be restored later if needed
Common user intents:
- "Update blog group 456"
- "Edit blog category"
bloggroup-read
Returns blog group data for a selected language with optional exact group filtering, field selection, and pagination.
Common user intents:
- "List blog groups"
- "Read one exact blog group"
bloggroup-delete
Deletes one or more blog groups for a selected language and returns separate success and failure ID lists.
This action must not run unless the user has explicitly confirmed the language and exact blog group IDs to delete.
Common user intents:
- "Delete these blog groups"
custompage-create
Creates and publishes a new custom page under the selected language.
This action must not run unless the user has explicitly confirmed the language and exact custom page payload to be created.
Common user intents:
- "Create a custom page"
- "Publish a custom page"
custompage-update
Updates an existing custom page under the selected language.
This action must not run unless the user has explicitly confirmed the language, target custom page ID, and exact payload to be changed.
Update rules:
custompage.custompage_idis required- Any field other than
custompage_idshould be omitted unless the user explicitly wants to change it - Omitting a field means keep the existing value
- Capture a pre-update backup snapshot first; if backup capture fails, abort the update
- Return
backup.restore_payloadon success so the same custom page can be restored later if needed
Common user intents:
- "Update custom page 123"
- "Edit custom page information"
custompage-read
Returns custom page data with optional pagination, field selection, or exact custom page filtering.
Common user intents:
- "Read custom pages"
- "List custom pages"
- "Find custom page 123"
custompage-delete
Moves one or more custom pages to the recycle bin.
This action must not run unless the user has explicitly confirmed the language and exact custom page IDs to be moved.
Common user intents:
- "Delete these custom pages"
- "Move custom page 123 to recycle bin"
productsgroup-create
Creates and publishes a new product group under the selected language.
This action must not run unless the user has explicitly confirmed the language and exact product group payload to be created.
Common user intents:
- "Create a product group"
- "Add a product category"
productsgroup-update
Updates an existing product group under the selected language.
This action must not run unless the user has explicitly confirmed the language, target product group ID, and exact payload to be changed.
Update rules:
productsgroup.productsgroup_idis required- Any field other than
productsgroup_idshould be omitted unless the user explicitly wants to change it - Omitting a field means keep the existing value
- If
productsgroup.sectionis sent,topandbottomcan be updated independently: omit one fragment or send an empty string to keep it unchanged - Capture a pre-update backup snapshot first; if backup capture fails, abort the update
- Return
backup.restore_payloadon success so the same product group can be restored later if needed
Common user intents:
- "Update product group 456"
- "Edit product category"
productsgroup-delete
Deletes one or more product groups for a selected language and returns separate success and failure ID lists.
This action must not run unless the user has explicitly confirmed the language and exact product group IDs to delete.
Common user intents:
- "Delete these product groups"
productsgroup-read
Returns published product groups for a selected language.
Filter rules:
- Omit
parent_productsgroup_idor set it to0to read top-level groups. - Send
parent_productsgroup_idto read the direct child groups under one parent group. - Send
productsgroup_idto read one exact product group. parent_productsgroup_idandproductsgroup_idare mutually exclusive and must not be sent together.- Use
fields=["section"]or includesectionin the field list when the caller needs the custom top/bottom HTML fragments.
Common user intents:
- "List product groups"
- "Read top-level groups"
- "Read child groups under this parent"
- "Find product group 789"
products-read
Returns published product data with optional pagination, product group filtering, or exact product filtering.
Filter rules:
- You may omit both
products_idandproductsgroup_idto read all products. - You may send
products_idto read one exact product. - You may send
productsgroup_idto read products under one leaf group. products_idandproductsgroup_idare mutually exclusive and must not be sent together.
Common user intents:
- "Read products"
- "List products in this group"
- "Find product 123"
products-create
Creates a new product under the selected language and product group.
This action must not run unless the user has explicitly confirmed the language and exact product payload to be created.
Minimum practical payload:
languageproducts.productsgroup_idproducts.product_nameproducts.upload_imagesproducts.tagsproducts.brief_descriptionproducts.descriptionconfirmation.approved=trueconfirmation.summary
Common user intents:
- "Create a product"
- "Publish a new product"
products-update
Updates an existing product under the selected language.
This action must not run unless the user has explicitly confirmed the language, target product ID, and exact payload to be changed.
Update rules:
products.products_idis required- Any field other than
products_idshould be omitted unless the user explicitly wants to change it - Omitting a field means keep the existing value
- Do not move the product group unless the user explicitly asks for that change
- Capture a pre-update backup snapshot first; if backup capture fails, abort the update
- Return
backup.restore_payloadon success so the same product can be restored later if needed
Common user intents:
- "Update product 123"
- "Edit product information"
products-delete
Moves one or more products to the recycle bin.
This action must not run unless the user has explicitly confirmed the language and exact product IDs to be moved to the recycle bin.
Common user intents:
- "Delete these products"
- "Move product 123 to recycle bin"
inquiry-read
Returns inquiry records with optional language, recent-day filtering, and pagination.
Common user intents:
- "Read inquiries"
- "Show recent leads"
- "List inquiry records"
visitor-recent
Returns recent visitor analytics with optional exact IP filtering and pagination.
Common user intents:
- "Check recent visitors"
- "Find visitor by IP"
- "Show latest visitor behavior"
keywords-rank
Returns keyword ranking records with optional exact keyword filtering, optional top-N rank filtering, pagination, latest rank values, and rank history.
Common user intents:
- "Check keyword ranking"
- "Find one keyword ranking"
- "Show keywords ranked within top 100"
Extension Rule
When adding a new Tradebee capability in the future:
- Add or update the underlying implementation module.
- Register the new action in the root
index.jsaction router. - Add the new action to the root
skill.jsoninput schema. - Document the new action here in the root
SKILL.md.
Changes are not complete unless the unified tradebee entrypoint supports the new capability end to end.
Example
{
"action": "products-read",
"language": "en",
"products_id": 12345,
"pagination": {
"current_page": 1,
"page_size": 5
}
}
Decision Examples
User: "Help me check the product categories"
Choose: productsgroup-read
Reason: the user wants product category data, not product data
User: "Show what products are under this category"
Choose: products-read + productsgroup_id
Reason: the user wants product records under one group
User: "Help me find product 12345"
Choose: products-read + products_id
Reason: the user wants one exact product
User: "Show recent visits and filter this IP"
Choose: visitor-recent + ip
Reason: this is visitor analytics, not inquiry or product content
User: "Check the top 100 keywords"
Choose: keywords-rank + rank=100
Reason: the user wants a top-N ranking slice, not one exact keyword
Scan to join WeChat group