Install
openclaw skills install bee-skillA unified Bee Website Builder Open API skill that helps an agent choose the correct Bee data operation from a user's desired business result. Use it when the user wants to read, create, update, delete, or analyze blogs, blog groups, products, product groups, inquiries, visitors, or keyword rankings on the Bee platform.
openclaw skills install bee-skillVersion: 2.11.21
This skill merges multiple Bee Website Builder Open API capabilities into a single publishable skill.
All future Bee capabilities added in this repository must be exposed through bee-openapi rather than published as separate primary skills.
This skill should be selected by the user's expected result, not only by API name.
When the user speaks in natural language such as "find the product", "show products under this category", "read one exact blog", "look at recent inquiries", "see which keywords are ranking in the top 100", or "delete these products", map that request to the matching action below and choose the narrowest valid filter.
Supported actions:
languages_getblog_createblog_updateblog_readblog_deletebloggroup_createbloggroup_updatebloggroup_readbloggroup_deleteproductsgroup_createproductsgroup_updateproductsgroup_deleteproductsgroup_readproducts_readproducts_createproducts_updateproducts_deleteinquiry_readvisitor_recentkeywords_rankChoose 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:
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 when the user asks to read, list, find, search, query, check, or analyze existing records.*_create when the user asks to add, create, publish, or insert new content.*_update when the user asks to modify existing blog, blog-group, product, or product-group content.*_delete when the user asks to delete, remove, or move content to the recycle bin.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.api_key (string)API authentication key used for caller identity verification and interface access control.
skills.entries.env.BEE_API_KEYaction (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": 10
}
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, or class-based styling. 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. 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.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."
}
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 itCommon 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 itCommon 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.
Common 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.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 itCommon 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 Bee capability in the future:
index.js action router.skill.json input schema.SKILL.md.Changes are not complete unless the unified bee-openapi entrypoint supports the new capability end to end.
{
"api_key": "your-api-key",
"action": "products_read",
"language": "en",
"products_id": 12345,
"pagination": {
"current_page": 1,
"page_size": 10
}
}
User: "帮我查一下产品分类"
Choose: productsgroup_read
Reason: the user wants product category data, not product data
User: "看一下这个分类下面有哪些产品"
Choose: products_read + productsgroup_id
Reason: the user wants product records under one group
User: "帮我找产品 12345"
Choose: products_read + products_id
Reason: the user wants one exact product
User: "看最近访客,顺便过滤这个 IP"
Choose: visitor_recent + ip
Reason: this is visitor analytics, not inquiry or product content
User: "查前 100 名关键词"
Choose: keywords_rank + rank=100
Reason: the user wants a top-N ranking slice, not one exact keyword