Install
openclaw skills install tradebeev26.5.26.01 A unified Tradebee Website Builder Open API skill that helps an agent choose the correct Tradebee data operation from a user's desired business result. Use it only when the user clearly wants to operate on Tradebee blogs, blog groups, products, product groups, inquiries, visitors, keyword rankings, or tenant HTML rule retrieval, not for generic find/show/check/update/delete requests outside Tradebee platform data context. For all `*_update` actions, it also automatically reads the current record and writes a local JSON backup file before sending the update request.
openclaw skills install tradebeeVersion: 26.5.26.01
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:
MNskill/backups/<action>/.restore_payload on success.confirmation_summary, requested_update_payload, and restore_limitations together 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.
*_update and *_delete, require one explicit Tradebee object type plus one explicit record ID or explicitly confirmed ID list before routing.*_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", "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-deleteproductsgroup-createproductsgroup-updateproductsgroup-deleteproductsgroup-readproducts-readproducts-createproducts-updateproducts-deleteinquiry-readvisitor-recentkeywords-rankBefore generating any HTML fragment for:
blog.descriptionproducts.descriptionproductsgroup.section.topproductsgroup.section.bottomfirst call rule-get with:
languagescenerule-get call requirements:
language is requiredscene is requiredlanguage value already selected for the create or update actionlanguage valuescene valueMinimal request body:
{
"action": "rule-get",
"language": "en",
"scene": "products.description"
}
Example request pattern:
{
"action": "rule-get",
"language": "en",
"scene": "products.description"
}
Required execution order:
language first.scene that matches the target HTML field.rule-get.rule-get returns successfully.Failure rule:
rule-get fails, do not continue by guessing colors, fonts, links, layout, or other fragment rules.Scene mapping:
blog.description -> scene=blog.descriptionproducts.description -> scene=products.descriptionproductsgroup.section.top -> scene=productsgroup.section.topproductsgroup.section.bottom -> scene=productsgroup.section.bottomThe generated fragment must follow the returned rule payload, especially:
rule-get response is the source of truthChoose the action by the user's actual goal and the result they expect to see.
*_read action.*_create action.*_update action.*_delete action.*_read action.*_create action.*_update action.*_delete action.visitor-recent, keywords-rank, or inquiry-read instead of blog or product actions.languages-get when the user asks:
rule-get when the user asks:
blog-read when the user asks:
blog-create when the user asks:
blog-update when the user asks:
blog-delete when the user asks:
bloggroup-read when the user asks:
bloggroup-create when the user asks:
bloggroup-update when the user asks:
bloggroup-delete when the user asks:
products-read when the user asks:
products-create when the user asks:
products-update when the user asks:
products-delete when the user asks:
productsgroup-read when the user asks:
productsgroup-create when the user asks:
productsgroup-update when the user asks:
productsgroup-delete when the user asks:
inquiry-read when the user asks:
visitor-recent when the user asks:
keywords-rank when the user asks:
*-read only when the user explicitly wants to read or analyze existing Tradebee records and the Tradebee object type is already clear.*-create only when the user explicitly wants to create new Tradebee content and the target Tradebee object type is already clear.*-update only when the user explicitly wants to modify one existing Tradebee record and both the Tradebee object type and target record are already explicit.*-delete only 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.languages-get first.product -> products-*, product group/category -> productsgroup-*, blog/article -> blog-*, blog group/category -> bloggroup-*.Use this section when a request is phrased around a business outcome instead of an API term.
products-read.products-read with products_id.products-read with productsgroup_id.productsgroup-read with no filter or parent_productsgroup_id=0.productsgroup-read with parent_productsgroup_id.productsgroup-read with productsgroup_id.blog-read.blog-read with blog_id.blog-read with bloggroup_id.bloggroup-read, optionally with bloggroup_id.inquiry-read, optionally with recent_days.visitor-recent.visitor-recent with ip.keywords-rank with keywords.keywords-rank with rank.When multiple filters exist, choose the one that most directly matches the user's wording.
products-read
If the user names one exact product, use products_id.
If the user asks for products under one group, use productsgroup_id.
Do not send both together.productsgroup-read
If the user asks for one exact group, use productsgroup_id.
If the user asks for children under a parent, use parent_productsgroup_id.
If the user asks for top-level groups, omit both or use parent_productsgroup_id=0.blog-read
If the user names one exact blog, use blog_id.
If the user asks for blogs under one group, use bloggroup_id.
Do not send both together.bloggroup-read
If the user asks for one exact blog group, use bloggroup_id.
Otherwise omit it to read the list.visitor-recent
If the user gives one IP, use ip.
Otherwise omit it to read recent visitors across all IPs.keywords-rank
If the user gives one exact keyword text, use keywords.
If the user asks for "top N", use rank.
Do not send both together.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:
*-read action*-create action*-update action*-delete actionlanguage (string)Used by most content operations.
languages-get, such as en or frlanguages-get, show the language list to the user, then copy one exact language value the user confirmsbloggroup_id (integer)Used by blog-read and bloggroup-read.
bloggroup-read under the same language.blog-read, do not send this field together with blog_id. The rule is: omit both to read all blogs, or provide exactly one of them.bloggroup-read, omit this field to read all blog groups.bloggroup-read, if you need one specific blog group, send one positive existing bloggroup_id.blog_id (integer)Used by blog-read.
blog_id.blog-read, do not send this field together with bloggroup_id. The rule is: omit both to read all blogs, or provide exactly one of them.ip (string)Used by visitor-recent.
keywords (string)Used by keywords-rank.
keywords-rank, do not send this field together with rank. The rule is: omit both to read all records, or provide exactly one of them.rank (integer)Used by keywords-rank.
1 to 999.rank=100 means return keywords ranked within positions 1 through 100, not only keywords whose rank equals 100.keywords-rank, do not send this field together with keywords. The rule is: omit both to read all records, or provide exactly one of them.parent_productsgroup_id (integer)Used by productsgroup-read.
0 to read top-level groups.> 0), the API returns the direct child groups under that parent group.productsgroup_id for productsgroup-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.
products-read, omit this field to read products from all groups. If you need group filtering, use a positive leaf group ID selected from productsgroup-read where is_leaf === true.products-read, do not send this field together with products_id. The rule is: omit both to read all products, or provide exactly one of them.productsgroup-read, omit this field to avoid exact-group filtering. If provided, use one positive existing productsgroup_id.productsgroup-read, do not send this field together with parent_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.
products_id.products-read, do not send this field together with productsgroup_id. The rule is: omit both to read all products, or provide exactly one of them.pagination (object)Used by blog-read, bloggroup-read, products-read, inquiry-read, visitor-recent, and keywords-rank.
{
"current_page": 1,
"page_size": 5
}
products (object)Used by products-create and products-update.
This object contains the product payload.
products-create, send a complete new product payloadproducts-update, products_id is required and every other field is optionalproducts-update, omit any field that should stay unchangedFor products.productsgroup_id:
products-create, this field is required and must be a positive leaf group ID selected from productsgroup-read where is_leaf === true.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 for products-update. This is the real existing product ID to edit.products.product_name: product title. Omit it in products-update if the name should not change.products.model: product model. Omit it in products-update if the model should not change.products.upload_images: for products-create, provide 1 to 5 images; the first image becomes the main image. For products-update, omit this field if images should not change.products.attributes: optional visible attribute pairs such as material, size, or color. Omit in products-update if unchanged.products.tags: search keywords. For products-create, provide at least 1 tag and at most 6. For products-update, omit if unchanged.products.brief_description: short plain-text summary. Omit in products-update if unchanged.products.description: detailed HTML description. Only inline styles are allowed, such as <p style="color:red">.... Do not use markdown, <style> blocks, linked CSS, class-based styling, or any <h1> tag. Use <h2> to <h6> or normal block elements instead. Omit in products-update if unchanged.products.seo.keywords: one comma-separated string, not an array.blog (object)Used by blog-create and blog-update.
blog.blog_id: required for blog-update. This is the existing blog ID to edit.blog.bloggroup_id: required blog group ID for blog-create. In blog-update, omit it if the blog should stay in the current group.blog.publisher: optional publisher name, up to 100 characters. Omit it in blog-update if unchanged.blog.publication_date: optional display date in yyyy/M/d format, for example 2026/4/24. Omit it in blog-update if unchanged.blog.title: required blog title for blog-create, up to 500 characters. Omit it in blog-update if unchanged.blog.cover_image: optional cover image object with name and base64. Omit it in blog-update if the cover image should stay unchanged.blog.tags: required keyword list with 1 to 6 items for blog-create. Omit in blog-update if unchanged.blog.summary: required plain-text summary for blog-create, up to 500 characters. Omit in blog-update if unchanged.blog.description: required HTML content for blog-create, up to 100,000 characters. Do not include any <h1> tag; use <h2> to <h6> or normal block elements instead. Omit in blog-update if unchanged.blog.seo: optional SEO object with title, description, and keywords. Omit it in blog-update if SEO should stay unchanged.productsgroup (object)Used by productsgroup-create and productsgroup-update.
productsgroup.parent_productsgroup_id: optional parent group ID. Omit it or set 0 for a top-level group.productsgroup.productsgroup_id: required for productsgroup-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. Use inline styles only, do not include any <h1> tag, and prefer <h2> to <h6>. Maximum length: 100,000 characters. In productsgroup-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. Use inline styles only, do not include any <h1> tag, and prefer <h2> to <h6>. Maximum length: 100,000 characters. In productsgroup-update, omit this field or pass an empty string to keep the current bottom fragment unchanged.productsgroup.seo: optional for productsgroup-update. Omit it if SEO should stay unchanged.bloggroup (object)Used by bloggroup-create and bloggroup-update.
bloggroup.bloggroup_id: required for bloggroup-update. This is the existing blog group ID to edit.bloggroup.group_name: required blog group name for bloggroup-create, up to 100 characters. Omit it in bloggroup-update if unchanged.bloggroup.tags: required keyword list with 1 to 6 items for bloggroup-create. Omit it in bloggroup-update if unchanged.bloggroup.brief_description: optional short plain-text description, up to 300 characters. Omit it in bloggroup-update if unchanged.bloggroup.seo: optional SEO object with title, description, and keywords. Omit it in bloggroup-update if SEO should stay unchanged.id_list (array)Used by blog-delete, bloggroup-delete, productsgroup-delete, and products-delete.
confirmation (object)Required by blog-create, blog-update, blog-delete, bloggroup-create, bloggroup-update, bloggroup-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.
MNskill/backups/<action>/.confirmation_summary, raw_read_response, snapshot, requested_update_payload, restore_payload, and restore_limitations.backup.storage.file_path, backup.raw_read_response, backup.snapshot, and a best-effort backup.restore_payload.backup.restore_payload with the same *_update action to restore the previous state.languages-getReturns the list of enabled site languages.
Common user intents:
blog-createCreates 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:
blog-updateUpdates 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_id is requiredblog_id should be omitted unless the user explicitly wants to change itbackup.restore_payload on success so the same blog can be restored later if neededCommon user intents:
blog-readReturns published blog data with optional pagination, blog-group filtering, or exact blog filtering.
Common user intents:
blog-deleteMoves 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:
bloggroup-createCreates 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:
bloggroup-updateUpdates 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_id is requiredbloggroup_id should be omitted unless the user explicitly wants to change itbackup.restore_payload on success so the same blog group can be restored later if neededCommon user intents:
bloggroup-readReturns blog group data for a selected language with optional exact group filtering, field selection, and pagination.
Common user intents:
bloggroup-deleteDeletes 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:
productsgroup-createCreates 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:
productsgroup-updateUpdates 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_id is requiredproductsgroup_id should be omitted unless the user explicitly wants to change itproductsgroup.section is sent, top and bottom can be updated independently: omit one fragment or send an empty string to keep it unchangedbackup.restore_payload on success so the same product group can be restored later if neededCommon user intents:
productsgroup-deleteDeletes 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:
productsgroup-readReturns published product groups for a selected language.
Filter rules:
parent_productsgroup_id or set it to 0 to read top-level groups.parent_productsgroup_id to read the direct child groups under one parent group.productsgroup_id to read one exact product group.parent_productsgroup_id and productsgroup_id are mutually exclusive and must not be sent together.fields=["section"] or include section in the field list when the caller needs the custom top/bottom HTML fragments.Common user intents:
products-readReturns published product data with optional pagination, product group filtering, or exact product filtering.
Filter rules:
products_id and productsgroup_id to read all products.products_id to read one exact product.productsgroup_id to read products under one leaf group.products_id and productsgroup_id are mutually exclusive and must not be sent together.Common user intents:
products-createCreates 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.summaryCommon user intents:
products-updateUpdates 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_id is requiredproducts_id should be omitted unless the user explicitly wants to change itbackup.restore_payload on success so the same product can be restored later if neededCommon user intents:
products-deleteMoves 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:
inquiry-readReturns inquiry records with optional language, recent-day filtering, and pagination.
Common user intents:
visitor-recentReturns recent visitor analytics with optional exact IP filtering and pagination.
Common user intents:
keywords-rankReturns keyword ranking records with optional exact keyword filtering, optional top-N rank filtering, pagination, latest rank values, and rank history.
Common user intents:
When adding a new Tradebee capability in the future:
index.js action router.skill.json input schema.SKILL.md.Changes are not complete unless the unified tradebee entrypoint supports the new capability end to end.
{
"action": "products-read",
"language": "en",
"products_id": 12345,
"pagination": {
"current_page": 1,
"page_size": 5
}
}
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