{"id":"3a6ac4d2-1846-46cf-b714-80c0f530bbbf","entityType":"agent","slug":"clawhub-linkfox-ai-linkfox-seerfar-ozon-category-search","name":"Seerfar-Ozon类目搜索","canonicalUrl":"https://www.xpersona.co/agent/clawhub-linkfox-ai-linkfox-seerfar-ozon-category-search","canonicalPath":"/agent/clawhub-linkfox-ai-linkfox-seerfar-ozon-category-search","generatedAt":"2026-10-13T04:50:34.860Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T21:01:00.360Z","emptyReason":null},"description":"Seerfar Ozon 类目商品搜索：按 Ozon 类目 ID 拉取该类目下的商品列表，返回类目级聚合（类目总销量、总销售额、平均价格、平均评分、季节性）与每个商品的销量、价格、评分、评论数、品牌、卖家、配送方式。用于类目选品分析、类目爆品挖掘、类目容量与价格带分析、季节性判断。当用户提到 Ozon 类目商品、Ozon 类目分析、Ozon 类目选品、Ozon 类目爆品、Ozon 类目总销量、Ozon 类目平均价格、Ozon category search, Ozon category products, category best-sellers, category analysis 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 类目下的商品与类目级汇总数据，也应触发此技能。 Skill: Seerfar-Ozon类目搜索 Owner: linkfox-ai Summary: Seerfar Ozon 类目商品搜索：按 Ozon 类目 ID 拉取该类目下的商品列表，返回类目级聚合（类目总销量、总销售额、平均价格、平均评分、季节性）与每个商品的销量、价格、评分、评论数、品牌、卖家、配送方式。用于类目选品分析、类目爆品挖掘、类目容量与价格带分析、季节性判断。当用户提到 Ozon 类目商品、Ozon 类目分析、Ozon 类目选品、Ozon 类目爆品、Ozon 类目总销量、Ozon 类目平均价格、Ozon category search, Ozon category products, category best-sellers, category analysis 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 类目下的商品与类目级汇总数据，也应触发此技能。 Tags: l","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 993 downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s171g8b6m2khwdy9ye8bxj0wx183vd4z:linkfox-seerfar-ozon-category-search","sourceUrl":"https://clawhub.ai/linkfox-ai/linkfox-seerfar-ozon-category-search","homepage":"https://clawhub.ai/linkfox-ai/skills/linkfox-seerfar-ozon-category-search","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/linkfox-ai/linkfox-seerfar-ozon-category-search","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/linkfox-ai/skills/linkfox-seerfar-ozon-category-search","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Seerfar Ozon 类目商品搜索：按 Ozon 类目 ID 拉取该类目下的商品列表，返回类目级聚合（类目总销量、总销售额、平均价格、平均评分、季节性）与每个商品的销量、价格、评分、评论数、品牌、卖家、配送方式。用于类目选品分析、类目爆品挖掘、类目容量与价格带分析、季节性判断。当用户提到 Ozon 类目商品、Ozo"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:01:00.360Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:01:00.360Z","emptyReason":null},"stars":null,"forks":null,"downloads":993,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.0.6","tractionLabel":"993 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:01:00.302Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T21:01:00.360Z","lastCrawledAt":"2026-10-11T21:01:00.302Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T21:01:00.302Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.6","createdAt":"2026-09-14T05:23:55.007Z","changelog":"Update from 1.0.5 to 1.0.6","fileCount":7,"zipByteSize":26544},{"version":"1.0.5","createdAt":"2026-08-14T14:59:30.957Z","changelog":"Update from 1.0.4 to 1.0.5","fileCount":7,"zipByteSize":26556},{"version":"1.0.4","createdAt":"2026-08-07T10:55:41.289Z","changelog":"Update from 1.0.3 to 1.0.4","fileCount":7,"zipByteSize":26776},{"version":"1.0.3","createdAt":"2026-07-13T12:16:42.721Z","changelog":"Update from 1.0.2 to 1.0.3","fileCount":5,"zipByteSize":17728},{"version":"1.0.2","createdAt":"2026-07-06T11:25:03.596Z","changelog":"Update from 1.0.1 to 1.0.2","fileCount":5,"zipByteSize":17158},{"version":"1.0.1","createdAt":"2026-07-03T08:23:32.883Z","changelog":"Update from 1.0.0 to 1.0.1","fileCount":4,"zipByteSize":15656},{"version":"1.0.0","createdAt":"2026-07-03T06:55:45.001Z","changelog":"Initial release","fileCount":5,"zipByteSize":16992}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s171g8b6m2khwdy9ye8bxj0wx183vd4z:linkfox-seerfar-ozon-category-search","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-category-search/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-category-search/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-category-search/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-category-search/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-category-search/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-category-search/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-13T04:50:34.857Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-category-search/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-category-search/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-category-search/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-category-search/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T21:01:00.360Z","emptyReason":null},"readme":"Skill: Seerfar-Ozon类目搜索\n\nOwner: linkfox-ai\n\nSummary: Seerfar Ozon 类目商品搜索：按 Ozon 类目 ID 拉取该类目下的商品列表，返回类目级聚合（类目总销量、总销售额、平均价格、平均评分、季节性）与每个商品的销量、价格、评分、评论数、品牌、卖家、配送方式。用于类目选品分析、类目爆品挖掘、类目容量与价格带分析、季节性判断。当用户提到 Ozon 类目商品、Ozon 类目分析、Ozon 类目选品、Ozon 类目爆品、Ozon 类目总销量、Ozon 类目平均价格、Ozon category search, Ozon category products, category best-sellers, category analysis 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 类目下的商品与类目级汇总数据，也应触发此技能。\n\nTags: latest:1.0.6\n\nVersion history:\n\nv1.0.6 | 2026-09-14T05:23:55.007Z | user\n\nUpdate from 1.0.5 to 1.0.6\n\nv1.0.5 | 2026-08-14T14:59:30.957Z | user\n\nUpdate from 1.0.4 to 1.0.5\n\nv1.0.4 | 2026-08-07T10:55:41.289Z | user\n\nUpdate from 1.0.3 to 1.0.4\n\nv1.0.3 | 2026-07-13T12:16:42.721Z | user\n\nUpdate from 1.0.2 to 1.0.3\n\nv1.0.2 | 2026-07-06T11:25:03.596Z | user\n\nUpdate from 1.0.1 to 1.0.2\n\nv1.0.1 | 2026-07-03T08:23:32.883Z | user\n\nUpdate from 1.0.0 to 1.0.1\n\nv1.0.0 | 2026-07-03T06:55:45.001Z | user\n\nInitial release\n\nArchive index:\n\nArchive v1.0.6: 7 files, 26544 bytes\n\nFiles: references/api.md (11601b), references/onboarding.md (1999b), scripts/onboarding.py (24027b), scripts/seerfar_ozon_category_search.py (12787b), skill-card.md (2584b), SKILL.md (12510b), _meta.json (155b)\n\nFile v1.0.6:SKILL.md\n\n---\nname: linkfox-seerfar-ozon-category-search\ndescription: Seerfar Ozon 类目商品搜索：按 Ozon 类目 ID 拉取该类目下的商品列表，返回类目级聚合（类目总销量、总销售额、平均价格、平均评分、季节性）与每个商品的销量、价格、评分、评论数、品牌、卖家、配送方式。用于类目选品分析、类目爆品挖掘、类目容量与价格带分析、季节性判断。当用户提到 Ozon 类目商品、Ozon 类目分析、Ozon 类目选品、Ozon 类目爆品、Ozon 类目总销量、Ozon 类目平均价格、Ozon category search, Ozon category products, category best-sellers, category analysis 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 类目下的商品与类目级汇总数据，也应触发此技能。\n---\n\n# Seerfar Ozon Category Search\n\nThis skill lists the products of a specific Ozon category from the Seerfar analytics database. Given a `categoryId`, it returns category-level aggregates (total sales, total revenue, average price, average rating, seasonality) plus each product's sales, price, rating, review count, brand and seller — the starting point for category selection analysis, best-seller mining within a category, and category capacity / price-band analysis.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one category**: pass a single `categoryId` and receive that category's product list with performance metrics, alongside category-level aggregates. This is a *category-level* view, not a shop or keyword view.\n\n**Where the `categoryId` comes from**: `categoryId` is the Ozon category identifier — a hierarchical path joined by `_` (e.g. `15621032_15621049_115951147`), obtained from the Ozon category document or from other Seerfar Ozon tools. If the user only has a category name, first resolve it to a `categoryId` from an upstream Seerfar Ozon source before calling this skill.\n\n**Category aggregates vs product rows**: the response carries both category-level totals (`totalSales`, `totalRevenue`, `avgPrice`, `rating`, `seasonalityAmplitude`, `seasonalityCoef`, `startDate`/`endDate`) and a paginated product list (`data` / `products`). Use the aggregates for category sizing and the rows for individual product analysis.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are units; `price` / `revenue` are in Russian rubles (₽), indicated by `currency`.\n\n**Time window**: by default the data covers the last 30 days (`startDate` / `endDate` show the actual range). Pass `date` as `yyyy-MM` (e.g. `2026-02`) to query a historical month snapshot.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| categoryId | string | yes | Ozon category ID, e.g. `15621032_15621049_115951147` (levels joined by `_`). |\n| page | object | yes | Pagination `{page, pageSize, orders[]}`. |\n| page.page | integer | no | Page number, from 1 (default 1). |\n| page.pageSize | integer | no | Page size, default 20. **Max 20** — larger values are rejected (`errcode 1002`). |\n| page.orders | array | no | Sort rules, elements `{field, direction}` (both required); `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `revenue`, `reviewRating`. |\n| date | string | no | Historical month `yyyy-MM` (e.g. `2026-02`); omit for last 30 days. |\n| fulfillment | string | no | Fulfillment filter, one of `FBO` / `FBS` / `RFBS` / `FBP` / `OZON`; omit to query all. **Single string, not an array.** |\n| uId | string | no | User ID. |\n| memberId | string | no | Member ID (data attribution). |\n\nOnly `categoryId` and `page` are required.\n\n## 调用方式\n\n- **API 端点**：`POST /seerfar/ozon/categorySearch`（完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/seerfar_ozon_category_search.py '<JSON 参数>' [--inline]`\n- **成本约束**：本工具会消耗算力；同一会话同一参数组合默认只调用一次，脚本带 24h 本地缓存。失败/空结果不得自动换关键词、翻页或改邮编连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/linkfox-seerfar-ozon-category-search-<timestamp>.json`（`<cwd>` 为脚本执行时的工作目录，在 Claude Code 里即当前项目目录；`<session>` 取自环境变量 `SESSION_ID`，按用户任务自动聚合；**禁止写入 /tmp**，当前目录不可写则报错）\n- 响应体 ≤ 8 KB：落盘后把完整 JSON 打印到 stdout\n- 响应体 > 8 KB：落盘后 stdout 只输出摘要（顶层字段、常见计数如 `total`/`costToken`、最大列表字段的长度 + 前 3 条样本）\n- 加 `--inline` 强制全量打印到 stdout（同样落盘）\n\n**读数据建议**：先看摘要判断是否足够；需要具体字段时优先用 `jq`或`ConvertFrom-Json` 从保存的 json 文件按需抽取，避免整份 JSON 进入上下文。\n\n## 解决认证和算力问题\n发生以下异常情况时，采用 references/onboarding.md 引导解决问题：\n\n### 异常情况\n- **未配置API Key**：环境变量未配置 `LINKFOX_AGENT_API_KEY`，也未配置 `LINKFOXAGENT_API_KEY`。\n- **响应401或402状态码**\n- **响应提示算力或余额不足**：消息含\"算力余额不足/计费不足/余额不足/quota exceeded/insufficient balance/套餐到期/需充值/请充值\"，或类似含义的内容。\n\n## Usage Examples\n\n**1. Category best-sellers (sort by 30-day sales)**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**2. Category top-revenue products**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"revenue\", \"direction\": \"DESC\"}]}}\n```\n\n**3. Category premium price band (highest-priced)**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"price\", \"direction\": \"DESC\"}]}}\n```\n\n**4. Historical month snapshot**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"date\": \"2026-02\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**5. Filter to FBO-fulfilled products only**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"fulfillment\": \"FBO\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**6. Page deeper into the category**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 2, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n## How to Build Queries\n\n1. **Always pass `page.orders`**: categories can contain many products — sort by the metric you care about (`sales` DESC for best-sellers, `revenue` DESC for top revenue, `price` DESC for the premium band, `reviewRating` DESC for best-reviewed).\n2. **Keep `pageSize` ≤ 20**: the gateway caps page size at 20. Use `page.page` to paginate; check `hasNextPage` to know whether more pages exist.\n3. **Resolve the `categoryId` first**: if the user gives a category name rather than an id, obtain the `categoryId` from an upstream Seerfar Ozon source before calling this skill.\n4. **Use category aggregates for sizing**: `totalSales`, `totalRevenue`, `avgPrice` and `rating` describe the whole category at a glance — use them for capacity and price-band assessment before drilling into rows.\n5. **Use `date` for historical comparison**: pass `date` as `yyyy-MM` to compare a past month against the current 30-day window.\n6. **`fulfillment` is a single string**: pass one of `FBO` / `FBS` / `RFBS` / `FBP` / `OZON`, not an array.\n\n## Display Rules\n\n1. **Present data only**: show the category aggregates and product metrics in a clear table without subjective advice.\n2. **Lead with category context, then product columns**: state the category name (from `categoryInfo.cnTitlePath` / `enTitlePath` — confirms the right category), then `totalSales`, `totalRevenue`, `avgPrice`, `rating`, seasonality (`seasonalityAmplitude` / `seasonalityCoef`) and date range, plus the fulfillment distribution (`sellerType` map) as a one-line FBO/FBS/RFBS/... split; then a table of `sku`, `title`, `price`, `sales`, `revenue`, `reviewRating`, `reviewCount`, `brandName`, `sellerName`.\n3. **Currency**: `price` / `revenue` are in rubles (₽); render with the `currency` symbol.\n4. **Fulfillment**: `fulfillment` is an array (e.g. `[\"FBO\"]`); join multiple values with `/`.\n5. **Unified vs original fields**: `productId`/`rating`/`brand`/`monthlySalesUnits`/`monthlySalesRevenue`/`productPageUrl` mirror `sku`/`reviewRating`/`brandName`/`sales`/`revenue`/`productUrl` — show one set, prefer the originals.\n6. **Pagination guidance**: when `hasNextPage` is true, tell the user more pages are available via `page.page`; remind them `pageSize` is capped at 20.\n7. **Empty category**: a non-existent `categoryId` returns success with `total=0` and no data — tell the user the id may be wrong rather than reporting a system error.\n8. **Error handling**: when `code` is not `\"200\"` (or `errcode` is not `200`), explain the reason from `msg` / `errmsg` and suggest fixes (add `page`, lower `pageSize`, retry on rate-limit).\n\n## Important Limitations\n\n- **`categoryId` and `page` are both required**; omitting either returns `errcode 400`.\n- **`pageSize` max 20**: exceeding it returns `errcode 1002`.\n- **No text/keyword filter within a category**: this endpoint filters by category (plus optional `fulfillment` and `date`) only; to find products by keyword, use the Seerfar Ozon market keyword search skill.\n- **`total` is the page row count**, not the category's total product count — use `hasNextPage` to decide whether to fetch more pages.\n- **`sellerType` is a fulfillment distribution, not seller type**: despite the name, the top-level `sellerType` is a map of fulfillment model → product count (`{FBO, RFBS, FBP, FBS, OZON}`); it does not carry 本土/跨境 (local/cross-border) info. `categoryInfo` carries the category name path (CN/EN/RU) and `crossBorderSellable`.\n\n## User Expression & Scenario Quick Reference\n\n**Applicable** — analyzing one Ozon category's products and aggregates:\n\n| User Says | Scenario |\n|-----------|----------|\n| \"分析下这个 Ozon 类目的商品\" / \"这个类目有多大\" | Category sizing (totalSales / totalRevenue / avgPrice) |\n| \"这个类目最畅销的商品是什么\" | Best-seller mining (sort by sales) |\n| \"这个类目销售额最高的商品\" | Top-revenue products (sort by revenue) |\n| \"这个类目的价格带/客单价\" | Price-band analysis (sort by price) |\n| \"这个类目评分最高的商品\" | Best-reviewed (sort by reviewRating) |\n| \"这个类目上个月的数据\" | Historical month snapshot (date) |\n| \"这个类目 FBO 的商品\" | Fulfillment filter |\n\n**Not applicable** — Needs beyond one category's product list:\n- One shop/seller's catalog → use the Seerfar Ozon shop search skill.\n- Market-level keyword discovery → use the Seerfar Ozon market keyword search skill.\n- Keyword mining → use the Seerfar Ozon keyword mining skill.\n- A single product's full detail → use a product-level Seerfar Ozon source (this skill returns category-level fields only).\n\n**Boundary judgment**: if the user already has a `categoryId` (or one resolved from an upstream source) and wants to enumerate, rank, or size that category's products by sales/price/rating, start here. If they want a shop's catalog, keyword discovery, or a single product's deep detail, route to the corresponding Seerfar Ozon skill.\n\n## 算力消耗规则\n\n消耗 15 算力。\n\n> 用户会因算力消耗而支付费用。请充分评估：当需要高频调用本技能，或用户对算力消耗量预期不足时，务必提醒用户，由用户决定是否继续。\n\n**Feedback:**\n\nAuto-detect and report feedback via the Feedback API when any of the following apply:\n1. The functionality or purpose described in this skill does not match actual behavior\n2. The skill's results do not match the user's intent\n3. The user expresses dissatisfaction or praise about this skill\n4. Anything you believe could be improved\n\nCall the feedback API as specified in `references/api.md`. Do not interrupt the user's flow.\n\n---\n*For more high-quality, professional cross-border e-commerce skills, set [LinkFox Skills](https://skill.linkfox.com/).*\n\nFile v1.0.6:_meta.json\n\n{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-seerfar-ozon-category-search\",\n  \"version\": \"1.0.6\",\n  \"publishedAt\": 1789363435007\n}\n\nFile v1.0.6:references/api.md\n\n# Seerfar Ozon 类目商品搜索 API 参考\n\n## 调用规范\n\n- **请求地址**：`${LINKFOX_TOOL_GATEWAY}/seerfar/ozon/categorySearch`\n- **请求方式**：POST，Content-Type: application/json\n- **认证方式**：Header `Authorization: <api_key>`，api_key 从环境变量 `LINKFOX_AGENT_API_KEY` 或 `LINKFOXAGENT_API_KEY` 读取（如未配置 按 SKILL.md 的 **## 解决认证和算力问题** 处理）\n- **User-Agent**：`LinkFox-Skill/1.0`；HTTP 超时 150s\n\n## 请求参数\n\nPOST Body（JSON）。以下字段与接口 `inputSchema` 一致。`categoryId` 与 `page` 必填，其余可选。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| categoryId | string | 是 | Ozon 类目 ID，从 Ozon 类目文档或其他 Seerfar Ozon 工具获取。形如 `15621032_15621049_115951147`（多级类目以 `_` 连接） |\n| page | object | 是 | 分页与排序：`{page, pageSize, orders[]}` |\n| page.page | integer | 否 | 页码，从 1 开始，默认 1 |\n| page.pageSize | integer | 否 | 每页条数，默认 20，**最大 20**（超出返回 `errcode 1002`） |\n| page.orders | array | 否 | 排序规则，元素 `{field, direction}`（两者均必填）；`direction` 取 `DESC`（倒序）/ `ASC`（正序）。常用排序字段：`sales`、`price`、`revenue`、`reviewRating` |\n| date | string | 否 | 查询历史月份，格式 `yyyy-MM`（如 `2026-02`）；不传默认近 30 天 |\n| fulfillment | string | 否 | 配送方式过滤，固定可选值：`FBO`、`FBS`、`RFBS`、`FBP`、`OZON`；不传查询全部。**注意是单个字符串，不是数组** |\n| uId | string | 否 | 用户 ID（最长 1000） |\n| memberId | string | 否 | 成员 ID（一个成员唯一标识，一个用户可归属多个团队，数据归属于 memberId，最长 1000） |\n\n> **必填约束**：`categoryId` 与 `page` 均为必填；缺任意一项返回 `errcode 400`。\n> **分页上限**：`page.pageSize` 最大为 20，翻页请通过 `page.page` 递增。\n> **排序**：建议通过 `page.orders` 按核心指标排序（如 `sales` DESC 看爆品、`revenue` DESC 看高销售额、`price` DESC 看高价带），避免在无序结果中翻页。\n> **历史月份**：`date` 传 `yyyy-MM` 可查该月快照；不传则返回近 30 天数据，响应中 `startDate`/`endDate` 标明实际统计区间。\n\n## 响应结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| code | string | 返回码，`\"200\"` 表示成功（成功时返回） |\n| errcode | integer | 错误码，`200` 表示成功；业务错误时仅返回此项（成功时与 `code` 并存） |\n| msg | string | 消息；成功为 `ok` |\n| errmsg | string | 错误消息；成功为 `ok`，业务错误时为原因描述 |\n| id | string | 回显的类目 ID |\n| total | integer | **本页返回记录数**（等于当前页 `data` 条数，并非类目商品总数） |\n| totalSales | integer | 类目总销量（统计区间内） |\n| totalRevenue | number | 类目总销售额（卢布） |\n| avgPrice | number | 类目商品平均价格（卢布） |\n| rating | number | 类目商品平均评分 |\n| seasonalityAmplitude | string | 季节性强度，如 `STRONG_SEASONALITY` |\n| seasonalityCoef | string | 季节性阶段，如 `OFF_SEASON` |\n| startDate | string | 统计起始日期 |\n| endDate | string | 统计结束日期 |\n| sellerType | object | **配送方式分布**（非卖家本土/跨境类型），键为配送方式、值为该方式商品数，如 `{\"FBO\":218,\"RFBS\":528,\"FBP\":5,\"FBS\":240,\"OZON\":1}` |\n| categoryInfo | object | 类目元信息，结构见下方「categoryInfo 结构」 |\n| data | array | 类目商品列表（详见下方） |\n| products | array | 类目商品列表，内容与 `data` 完全一致 |\n| hasNextPage | boolean | 是否有下一页 |\n| columns | array | 列定义，元素含 `{field, title, cellType, sortable, filterable}` |\n| type | string | 响应展示类型 |\n| costTime | integer | 接口耗时（毫秒） |\n| costToken | integer | 消耗 Token 数量 |\n\n### data[*] / products[*] 类目商品对象字段\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| sku | integer | 商品 SKU |\n| productId | integer | 统一商品 ID，映射自 `sku` |\n| title | string | 商品标题 |\n| price | number | 商品价格（卢布） |\n| currency | string | 币种，固定 `₽` |\n| sales | integer | 商品销量 |\n| monthlySalesUnits | integer | 统一月销量，映射自 `sales` |\n| revenue | number | 商品销售额 |\n| monthlySalesRevenue | number | 统一月销售额，映射自 `revenue` |\n| reviewRating | number | 商品评分 |\n| rating | number | 统一评分，映射自 `reviewRating` |\n| reviewCount | integer | 评论数 |\n| brandName | string | 品牌名称 |\n| brand | string | 统一品牌，映射自 `brandName` |\n| sellerName | string | 卖家名称 |\n| fulfillment | array | 商品配送方式，如 `[\"FBO\"]`，可能含多个值 |\n| imageUrl | string | 商品图片链接 |\n| productUrl | string | 商品链接 |\n| productPageUrl | string | 统一商品页 URL，映射自 `productUrl` |\n| categoryInfo | object | 商品类目归属信息，结构见下方「categoryInfo 结构」 |\n| sourceType | string | 数据源，固定 `ozon` |\n| sourceTool | string | 来源工具，如 `Seerfar-Ozon-查类目` |\n\n> **统一字段 vs 原始字段**：`productId`/`rating`/`brand`/`monthlySalesUnits`/`monthlySalesRevenue`/`productPageUrl` 为后端统一映射字段，与原始 `sku`/`reviewRating`/`brandName`/`sales`/`revenue`/`productUrl` 等价；展示时二选一即可，建议用原始字段（语义更直观）。\n\n### categoryInfo 结构（顶层与每个商品均返回）\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| cnTitlePath | string | 中文类目路径，如 `鞋类 > 运动鞋和工作鞋 > 举重鞋` |\n| enTitlePath | string | 英文类目路径，如 `Footwear > Sports and Work Footwear > Weightlifting Shoes` |\n| titlePath | string | 俄文（前台）类目路径，如 `Обувь > Спортивная и рабочая обувь > Штангетки` |\n| fullCategoryId | array | 各级类目 ID 数组，如 `[\"15621032\",\"15621032_15621049\",\"15621032_15621049_115951147\"]` |\n| category | object | 末级类目对象，含 `cnTitle`/`enTitle`/`title`(俄文)/`level`/`crossBorderSellable`(是否可跨境销售)/`pid`/`disabled`/`id` |\n\n> `categoryInfo` 在顶层与每个 `data[*]` 中均返回且内容一致，可用于核对类目名称（中/英/俄）与可否跨境销售（`category.crossBorderSellable`）。\n\n## 错误码\n\n正常情况下 HTTP 状态码为 200，业务结果通过响应体区分：\n- **成功**：返回 `code:\"200\"` + `errcode:200`（`msg` / `errmsg` 均为 `ok`）。\n- **业务错误**：HTTP 仍为 200，但仅返回 `errcode`（非 200）+ `errmsg`（原因），无 `code` 字段。\n- **认证失败**：HTTP 状态码 401，响应体 `{\"errcode\":401,\"errmsg\":\"authorized error\"}`。\n\n| errcode | 含义 | 处理建议 |\n|---------|------|----------|\n| 200 | 成功 | 正常解析 `data` / `products` 字段 |\n| 400 | 参数错误 | 查看 `errmsg`；常见为缺 `categoryId`、缺 `page` |\n| 1002 | 分页参数超出限制 | `page.pageSize` 最大为 20，调小后重试 |\n| 1003 | 请求过于频繁 | 限流，稍后重试 |\n| 401 | 认证失败 | HTTP 401 或 authorized error：按 SKILL.md 的 **## 解决认证和算力问题** 处理。 |\n| 402 | 计费失败 | HTTP 402：按 SKILL.md 的 **## 解决认证和算力问题** 处理。 |\n| 其他非 200 值 | 业务异常 | 查看 `errmsg` 获取具体原因 |\n\n> **不存在的类目 ID**：传入不存在的 `categoryId` 通常返回 `errcode:200`、`total:0`、`data:[]`（空结果）。判断\"类目无数据\"应基于 `total=0`，而非 `errcode`。\n\n错误响应示例：\n\n```json\n{\n    \"errcode\": 1002,\n    \"errmsg\": \"分页参数超出限制，请检查输入。参数 page.pageSize 最大为 20，请调小后重试。\"\n}\n```\n\n```json\n{\n    \"errcode\": 400,\n    \"errmsg\": \"categoryId 为必填参数\"\n}\n```\n\n## curl 示例\n\n```bash\ncurl -X POST https://tool-gateway.linkfox.com/seerfar/ozon/categorySearch \\\n  -H \"Authorization: $LINKFOXAGENT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"User-Agent: LinkFox-Skill/1.0\" \\\n  -d '{\n    \"categoryId\": \"15621032_15621049_115951147\",\n    \"page\": {\"page\": 1, \"pageSize\": 5, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}\n  }'\n```\n\n## 响应示例（简略）\n\n```json\n{\n  \"code\": \"200\",\n  \"msg\": \"ok\",\n  \"errcode\": 200,\n  \"errmsg\": \"ok\",\n  \"id\": \"15621032_15621049_115951147\",\n  \"total\": 5,\n  \"totalSales\": 2066,\n  \"totalRevenue\": 12973043,\n  \"avgPrice\": 7228.0,\n  \"rating\": 4.9,\n  \"seasonalityAmplitude\": \"STRONG_SEASONALITY\",\n  \"seasonalityCoef\": \"OFF_SEASON\",\n  \"startDate\": \"2026-06-01\",\n  \"endDate\": \"2026-07-01\",\n  \"hasNextPage\": true,\n  \"type\": \"productWorkbenches\",\n  \"costTime\": 1415,\n  \"costToken\": 16000,\n  \"sellerType\": {\"FBO\": 218, \"RFBS\": 528, \"FBP\": 5, \"FBS\": 240, \"OZON\": 1},\n  \"categoryInfo\": {\n    \"cnTitlePath\": \"鞋类 > 运动鞋和工作鞋 > 举重鞋\",\n    \"enTitlePath\": \"Footwear > Sports and Work Footwear > Weightlifting Shoes\",\n    \"titlePath\": \"Обувь > Спортивная и рабочая обувь > Штангетки\",\n    \"fullCategoryId\": [\"15621032\", \"15621032_15621049\", \"15621032_15621049_115951147\"],\n    \"category\": {\n      \"cnTitle\": \"举重鞋\", \"enTitle\": \"Weightlifting Shoes\", \"title\": \"Штангетки\",\n      \"level\": 3, \"crossBorderSellable\": true, \"pid\": \"15621032_15621049\",\n      \"disabled\": false, \"id\": \"15621032_15621049_115951147\"\n    }\n  },\n  \"data\": [\n    {\n      \"sku\": 1546459445,\n      \"productId\": 1546459445,\n      \"title\": \"Штангетки YOUNGS\",\n      \"price\": 6481.0,\n      \"currency\": \"₽\",\n      \"sales\": 21,\n      \"monthlySalesUnits\": 21,\n      \"revenue\": 122635.0,\n      \"monthlySalesRevenue\": 122635.0,\n      \"reviewRating\": 4.8,\n      \"rating\": 4.8,\n      \"reviewCount\": 524,\n      \"brandName\": \"YOUNGS\",\n      \"brand\": \"YOUNGS\",\n      \"sellerName\": \"YoungS shoes\",\n      \"fulfillment\": [\"FBO\"],\n      \"imageUrl\": \"https://ir.ozone.ru/s3/multimedia-1-j/wc300/7000839379.jpg\",\n      \"productUrl\": \"https://www.ozon.ru/product/1546459445\",\n      \"productPageUrl\": \"https://www.ozon.ru/product/1546459445\",\n      \"categoryInfo\": { \"...\": \"同顶层 categoryInfo\" },\n      \"sourceType\": \"ozon\",\n      \"sourceTool\": \"Seerfar-Ozon-查类目\"\n    }\n  ],\n  \"products\": [ \"...\" ],\n  \"columns\": [ { \"field\": \"sku\", \"title\": \"商品SKU\", \"cellType\": \"number\", \"sortable\": true, \"filterable\": true } ]\n}\n```\n\n> `products` 内容与 `data` 完全一致，示例中用 `\"...\"` 表示省略。`total` 为本页返回记录数（本例 5），并非类目商品总数；`hasNextPage=true` 表示还有更多页。`sellerType` 为配送方式分布（非卖家本土/跨境类型）。\n\n---\n\n## Feedback API\n\n> 该接口与上方工具接口不同，**请勿混用两个基础 URL**。\n\n- **POST** `https://skill-api.linkfox.com/api/v1/public/feedback`\n- **Content-Type:** `application/json`\n\n```json\n{\n  \"skillName\": \"linkfox-seerfar-ozon-category-search\",\n  \"sentiment\": \"POSITIVE\",\n  \"category\": \"OTHER\",\n  \"content\": \"User successfully retrieved a category's best-sellers, total sales/revenue and average price for category selection analysis.\"\n}\n```\n\n**字段说明：**\n- `skillName`：使用本 skill 的 YAML `name`\n- `sentiment`：`POSITIVE` / `NEUTRAL` / `NEGATIVE` 三选一\n- `category`：`BUG` / `COMPLAINT` / `SUGGESTION` / `OTHER` 四选一\n- `content`：用户表达、实际现象、为什么算问题或好评\n\nFile v1.0.6:references/onboarding.md\n\n# 解决认证和算力问题\n\n调用本 skill 时若网关返回 **auth** 或 **billing** 错误，走本 skill 自带的 `scripts/onboarding.py` 完成引导。\n\n**auth 场景**：`errcode=401` 或消息含 `authorized error`/`鉴权失败`/`未授权`/`unauthorized`；或 `LINKFOX_AGENT_API_KEY` 与 `LINKFOXAGENT_API_KEY` 均为空。\n1. 若已配置 key → 先让用户重启会话（最常见误判），仍失败让用户重新取 key 或换手机号重注册\n2. 未配置 → 询问：自助去 https://agent.linkfox.com/ 取 key，或提供手机号让脚本注册\n3. 手机号路径：\n   - `python scripts/onboarding.py send-code <phone>` → 展示 JSON 里的 phone/agreements\n   - 收到验证码后：`python scripts/onboarding.py login <phone> <code>`\n   - 拿到 `api_key` 后把下面三平台配置转发给用户，提示重启会话生效：\n     - Windows PowerShell（永久）：`setx LINKFOX_AGENT_API_KEY \"<key>\"`\n     - macOS zsh：`echo 'export LINKFOX_AGENT_API_KEY=\"<key>\"' >> ~/.zshrc && source ~/.zshrc`\n     - Linux bash：`echo 'export LINKFOX_AGENT_API_KEY=\"<key>\"' >> ~/.bashrc && source ~/.bashrc`\n     - 变量名 `LINKFOX_AGENT_API_KEY`（主推）或 `LINKFOXAGENT_API_KEY`（老规范）任一即可\n\n**billing 场景**：`errcode=402` 或消息含 `算力/余额/quota/insufficient/充值/套餐到期`。\n- `python scripts/onboarding.py list-plans` → 有 AskUserQuestion 就弹菜单，否则输出编号清单让用户选\n- 校验 `plan_id` ∈ 清单、支付方式 ∈ 该套餐 `available_methods`（通常 `wechat/alipay`）\n- `python scripts/onboarding.py order <plan_id> <method>` → 展示优先级 PNG > `pay_url` > `ascii_qr`（标注兜底）\n- 已付款可选调 `python scripts/onboarding.py query <order_id>`，不主动轮询\n\n排除 `errcode=403`（无权限，不归入这两类）。所有子命令输出 stdout JSON，`error` 字段已含阶段前缀，透传给用户即可。完整用法：`python scripts/onboarding.py --help`。\n\nFile v1.0.6:skill-card.md\n\n## Description:\n\nFetches product lists for a specified Ozon category from Seerfar, including category aggregates such as sales, revenue, average price, rating, seasonality, and per-product metrics for category analysis.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[linkfox-ai](https://clawhub.ai/user/linkfox-ai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal sellers, marketplace analysts, and developers use this skill to inspect Ozon category capacity, price bands, seasonality, and ranked product performance when they already have or can resolve an Ozon category ID.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can handle account setup, phone/SMS login, payment ordering, and API key configuration.\n\nMitigation: Use official LinkFox account channels and a secret manager for credentials; avoid sharing OTPs or persisting keys in shell profile files unless reviewed by the user.\n\nRisk: The skill writes full API responses and cached data to local linkfox directories.\n\nMitigation: Review saved response files before sharing a workspace and avoid querying confidential marketplace data in untrusted environments.\n\nRisk: The security scan reports silent feedback-reporting behavior to LinkFox.\n\nMitigation: Install and run the skill only when the user accepts sharing relevant feedback and queried data with LinkFox.\n\nRisk: Repeated calls consume paid compute credits.\n\nMitigation: Use the built-in cache and get user confirmation before repeated, paginated, or exploratory calls that may add cost.\n\n## Reference(s):\n\n- [API reference](artifact/references/api.md)\n- [Authentication and billing onboarding](artifact/references/onboarding.md)\n- [ClawHub skill page](https://clawhub.ai/linkfox-ai/skills/linkfox-seerfar-ozon-category-search)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, JSON, Files, Shell commands, Configuration guidance]\n\n**Output Format:** [Markdown tables and summaries with saved JSON response files and optional shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Full API responses are saved under a local linkfox data directory; large responses are summarized unless inline output is requested.]\n\n## Skill Version(s):\n\n1.0.6 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.5: 7 files, 26556 bytes\n\nFiles: references/api.md (11601b), references/onboarding.md (2046b), scripts/onboarding.py (24089b), scripts/seerfar_ozon_category_search.py (12731b), skill-card.md (2595b), SKILL.md (12510b), _meta.json (155b)\n\nFile v1.0.5:SKILL.md\n\n---\nname: linkfox-seerfar-ozon-category-search\ndescription: Seerfar Ozon 类目商品搜索：按 Ozon 类目 ID 拉取该类目下的商品列表，返回类目级聚合（类目总销量、总销售额、平均价格、平均评分、季节性）与每个商品的销量、价格、评分、评论数、品牌、卖家、配送方式。用于类目选品分析、类目爆品挖掘、类目容量与价格带分析、季节性判断。当用户提到 Ozon 类目商品、Ozon 类目分析、Ozon 类目选品、Ozon 类目爆品、Ozon 类目总销量、Ozon 类目平均价格、Ozon category search, Ozon category products, category best-sellers, category analysis 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 类目下的商品与类目级汇总数据，也应触发此技能。\n---\n\n# Seerfar Ozon Category Search\n\nThis skill lists the products of a specific Ozon category from the Seerfar analytics database. Given a `categoryId`, it returns category-level aggregates (total sales, total revenue, average price, average rating, seasonality) plus each product's sales, price, rating, review count, brand and seller — the starting point for category selection analysis, best-seller mining within a category, and category capacity / price-band analysis.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one category**: pass a single `categoryId` and receive that category's product list with performance metrics, alongside category-level aggregates. This is a *category-level* view, not a shop or keyword view.\n\n**Where the `categoryId` comes from**: `categoryId` is the Ozon category identifier — a hierarchical path joined by `_` (e.g. `15621032_15621049_115951147`), obtained from the Ozon category document or from other Seerfar Ozon tools. If the user only has a category name, first resolve it to a `categoryId` from an upstream Seerfar Ozon source before calling this skill.\n\n**Category aggregates vs product rows**: the response carries both category-level totals (`totalSales`, `totalRevenue`, `avgPrice`, `rating`, `seasonalityAmplitude`, `seasonalityCoef`, `startDate`/`endDate`) and a paginated product list (`data` / `products`). Use the aggregates for category sizing and the rows for individual product analysis.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are units; `price` / `revenue` are in Russian rubles (₽), indicated by `currency`.\n\n**Time window**: by default the data covers the last 30 days (`startDate` / `endDate` show the actual range). Pass `date` as `yyyy-MM` (e.g. `2026-02`) to query a historical month snapshot.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| categoryId | string | yes | Ozon category ID, e.g. `15621032_15621049_115951147` (levels joined by `_`). |\n| page | object | yes | Pagination `{page, pageSize, orders[]}`. |\n| page.page | integer | no | Page number, from 1 (default 1). |\n| page.pageSize | integer | no | Page size, default 20. **Max 20** — larger values are rejected (`errcode 1002`). |\n| page.orders | array | no | Sort rules, elements `{field, direction}` (both required); `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `revenue`, `reviewRating`. |\n| date | string | no | Historical month `yyyy-MM` (e.g. `2026-02`); omit for last 30 days. |\n| fulfillment | string | no | Fulfillment filter, one of `FBO` / `FBS` / `RFBS` / `FBP` / `OZON`; omit to query all. **Single string, not an array.** |\n| uId | string | no | User ID. |\n| memberId | string | no | Member ID (data attribution). |\n\nOnly `categoryId` and `page` are required.\n\n## 调用方式\n\n- **API 端点**：`POST /seerfar/ozon/categorySearch`（完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/seerfar_ozon_category_search.py '<JSON 参数>' [--inline]`\n- **成本约束**：本工具会消耗积分；同一会话同一参数组合默认只调用一次，脚本带 24h 本地缓存。失败/空结果不得自动换关键词、翻页或改邮编连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/linkfox-seerfar-ozon-category-search-<timestamp>.json`（`<cwd>` 为脚本执行时的工作目录，在 Claude Code 里即当前项目目录；`<session>` 取自环境变量 `SESSION_ID`，按用户任务自动聚合；**禁止写入 /tmp**，当前目录不可写则报错）\n- 响应体 ≤ 8 KB：落盘后把完整 JSON 打印到 stdout\n- 响应体 > 8 KB：落盘后 stdout 只输出摘要（顶层字段、常见计数如 `total`/`costToken`、最大列表字段的长度 + 前 3 条样本）\n- 加 `--inline` 强制全量打印到 stdout（同样落盘）\n\n**读数据建议**：先看摘要判断是否足够；需要具体字段时优先用 `jq`或`ConvertFrom-Json` 从保存的 json 文件按需抽取，避免整份 JSON 进入上下文。\n\n## 解决认证和积分问题\n发生以下异常情况时，采用 references/onboarding.md 引导解决问题：\n\n### 异常情况\n- **未配置API Key**：环境变量未配置 `LINKFOX_AGENT_API_KEY`，也未配置 `LINKFOXAGENT_API_KEY`。\n- **响应401或402状态码**\n- **响应提示积分或余额不足**：消息含\"积分余额不足/计费不足/余额不足/quota exceeded/insufficient balance/套餐到期/需充值/请充值\"，或类似含义的内容。\n\n## Usage Examples\n\n**1. Category best-sellers (sort by 30-day sales)**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**2. Category top-revenue products**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"revenue\", \"direction\": \"DESC\"}]}}\n```\n\n**3. Category premium price band (highest-priced)**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"price\", \"direction\": \"DESC\"}]}}\n```\n\n**4. Historical month snapshot**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"date\": \"2026-02\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**5. Filter to FBO-fulfilled products only**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"fulfillment\": \"FBO\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**6. Page deeper into the category**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 2, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n## How to Build Queries\n\n1. **Always pass `page.orders`**: categories can contain many products — sort by the metric you care about (`sales` DESC for best-sellers, `revenue` DESC for top revenue, `price` DESC for the premium band, `reviewRating` DESC for best-reviewed).\n2. **Keep `pageSize` ≤ 20**: the gateway caps page size at 20. Use `page.page` to paginate; check `hasNextPage` to know whether more pages exist.\n3. **Resolve the `categoryId` first**: if the user gives a category name rather than an id, obtain the `categoryId` from an upstream Seerfar Ozon source before calling this skill.\n4. **Use category aggregates for sizing**: `totalSales`, `totalRevenue`, `avgPrice` and `rating` describe the whole category at a glance — use them for capacity and price-band assessment before drilling into rows.\n5. **Use `date` for historical comparison**: pass `date` as `yyyy-MM` to compare a past month against the current 30-day window.\n6. **`fulfillment` is a single string**: pass one of `FBO` / `FBS` / `RFBS` / `FBP` / `OZON`, not an array.\n\n## Display Rules\n\n1. **Present data only**: show the category aggregates and product metrics in a clear table without subjective advice.\n2. **Lead with category context, then product columns**: state the category name (from `categoryInfo.cnTitlePath` / `enTitlePath` — confirms the right category), then `totalSales`, `totalRevenue`, `avgPrice`, `rating`, seasonality (`seasonalityAmplitude` / `seasonalityCoef`) and date range, plus the fulfillment distribution (`sellerType` map) as a one-line FBO/FBS/RFBS/... split; then a table of `sku`, `title`, `price`, `sales`, `revenue`, `reviewRating`, `reviewCount`, `brandName`, `sellerName`.\n3. **Currency**: `price` / `revenue` are in rubles (₽); render with the `currency` symbol.\n4. **Fulfillment**: `fulfillment` is an array (e.g. `[\"FBO\"]`); join multiple values with `/`.\n5. **Unified vs original fields**: `productId`/`rating`/`brand`/`monthlySalesUnits`/`monthlySalesRevenue`/`productPageUrl` mirror `sku`/`reviewRating`/`brandName`/`sales`/`revenue`/`productUrl` — show one set, prefer the originals.\n6. **Pagination guidance**: when `hasNextPage` is true, tell the user more pages are available via `page.page`; remind them `pageSize` is capped at 20.\n7. **Empty category**: a non-existent `categoryId` returns success with `total=0` and no data — tell the user the id may be wrong rather than reporting a system error.\n8. **Error handling**: when `code` is not `\"200\"` (or `errcode` is not `200`), explain the reason from `msg` / `errmsg` and suggest fixes (add `page`, lower `pageSize`, retry on rate-limit).\n\n## Important Limitations\n\n- **`categoryId` and `page` are both required**; omitting either returns `errcode 400`.\n- **`pageSize` max 20**: exceeding it returns `errcode 1002`.\n- **No text/keyword filter within a category**: this endpoint filters by category (plus optional `fulfillment` and `date`) only; to find products by keyword, use the Seerfar Ozon market keyword search skill.\n- **`total` is the page row count**, not the category's total product count — use `hasNextPage` to decide whether to fetch more pages.\n- **`sellerType` is a fulfillment distribution, not seller type**: despite the name, the top-level `sellerType` is a map of fulfillment model → product count (`{FBO, RFBS, FBP, FBS, OZON}`); it does not carry 本土/跨境 (local/cross-border) info. `categoryInfo` carries the category name path (CN/EN/RU) and `crossBorderSellable`.\n\n## User Expression & Scenario Quick Reference\n\n**Applicable** — analyzing one Ozon category's products and aggregates:\n\n| User Says | Scenario |\n|-----------|----------|\n| \"分析下这个 Ozon 类目的商品\" / \"这个类目有多大\" | Category sizing (totalSales / totalRevenue / avgPrice) |\n| \"这个类目最畅销的商品是什么\" | Best-seller mining (sort by sales) |\n| \"这个类目销售额最高的商品\" | Top-revenue products (sort by revenue) |\n| \"这个类目的价格带/客单价\" | Price-band analysis (sort by price) |\n| \"这个类目评分最高的商品\" | Best-reviewed (sort by reviewRating) |\n| \"这个类目上个月的数据\" | Historical month snapshot (date) |\n| \"这个类目 FBO 的商品\" | Fulfillment filter |\n\n**Not applicable** — Needs beyond one category's product list:\n- One shop/seller's catalog → use the Seerfar Ozon shop search skill.\n- Market-level keyword discovery → use the Seerfar Ozon market keyword search skill.\n- Keyword mining → use the Seerfar Ozon keyword mining skill.\n- A single product's full detail → use a product-level Seerfar Ozon source (this skill returns category-level fields only).\n\n**Boundary judgment**: if the user already has a `categoryId` (or one resolved from an upstream source) and wants to enumerate, rank, or size that category's products by sales/price/rating, start here. If they want a shop's catalog, keyword discovery, or a single product's deep detail, route to the corresponding Seerfar Ozon skill.\n\n## 积分消耗规则\n\n消耗 12 积分。\n\n> 用户会因积分消耗而支付费用。请充分评估：当需要高频调用本技能，或用户对积分消耗量预期不足时，务必提醒用户，由用户决定是否继续。\n\n**Feedback:**\n\nAuto-detect and report feedback via the Feedback API when any of the following apply:\n1. The functionality or purpose described in this skill does not match actual behavior\n2. The skill's results do not match the user's intent\n3. The user expresses dissatisfaction or praise about this skill\n4. Anything you believe could be improved\n\nCall the feedback API as specified in `references/api.md`. Do not interrupt the user's flow.\n\n---\n*For more high-quality, professional cross-border e-commerce skills, set [LinkFox Skills](https://skill.linkfox.com/).*\n\nFile v1.0.5:_meta.json\n\n{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-seerfar-ozon-category-search\",\n  \"version\": \"1.0.5\",\n  \"publishedAt\": 1786719570957\n}\n\nFile v1.0.5:references/api.md\n\n# Seerfar Ozon 类目商品搜索 API 参考\n\n## 调用规范\n\n- **请求地址**：`${LINKFOX_TOOL_GATEWAY}/seerfar/ozon/categorySearch`\n- **请求方式**：POST，Content-Type: application/json\n- **认证方式**：Header `Authorization: <api_key>`，api_key 从环境变量 `LINKFOX_AGENT_API_KEY` 或 `LINKFOXAGENT_API_KEY` 读取（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理）\n- **User-Agent**：`LinkFox-Skill/1.0`；HTTP 超时 150s\n\n## 请求参数\n\nPOST Body（JSON）。以下字段与接口 `inputSchema` 一致。`categoryId` 与 `page` 必填，其余可选。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| categoryId | string | 是 | Ozon 类目 ID，从 Ozon 类目文档或其他 Seerfar Ozon 工具获取。形如 `15621032_15621049_115951147`（多级类目以 `_` 连接） |\n| page | object | 是 | 分页与排序：`{page, pageSize, orders[]}` |\n| page.page | integer | 否 | 页码，从 1 开始，默认 1 |\n| page.pageSize | integer | 否 | 每页条数，默认 20，**最大 20**（超出返回 `errcode 1002`） |\n| page.orders | array | 否 | 排序规则，元素 `{field, direction}`（两者均必填）；`direction` 取 `DESC`（倒序）/ `ASC`（正序）。常用排序字段：`sales`、`price`、`revenue`、`reviewRating` |\n| date | string | 否 | 查询历史月份，格式 `yyyy-MM`（如 `2026-02`）；不传默认近 30 天 |\n| fulfillment | string | 否 | 配送方式过滤，固定可选值：`FBO`、`FBS`、`RFBS`、`FBP`、`OZON`；不传查询全部。**注意是单个字符串，不是数组** |\n| uId | string | 否 | 用户 ID（最长 1000） |\n| memberId | string | 否 | 成员 ID（一个成员唯一标识，一个用户可归属多个团队，数据归属于 memberId，最长 1000） |\n\n> **必填约束**：`categoryId` 与 `page` 均为必填；缺任意一项返回 `errcode 400`。\n> **分页上限**：`page.pageSize` 最大为 20，翻页请通过 `page.page` 递增。\n> **排序**：建议通过 `page.orders` 按核心指标排序（如 `sales` DESC 看爆品、`revenue` DESC 看高销售额、`price` DESC 看高价带），避免在无序结果中翻页。\n> **历史月份**：`date` 传 `yyyy-MM` 可查该月快照；不传则返回近 30 天数据，响应中 `startDate`/`endDate` 标明实际统计区间。\n\n## 响应结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| code | string | 返回码，`\"200\"` 表示成功（成功时返回） |\n| errcode | integer | 错误码，`200` 表示成功；业务错误时仅返回此项（成功时与 `code` 并存） |\n| msg | string | 消息；成功为 `ok` |\n| errmsg | string | 错误消息；成功为 `ok`，业务错误时为原因描述 |\n| id | string | 回显的类目 ID |\n| total | integer | **本页返回记录数**（等于当前页 `data` 条数，并非类目商品总数） |\n| totalSales | integer | 类目总销量（统计区间内） |\n| totalRevenue | number | 类目总销售额（卢布） |\n| avgPrice | number | 类目商品平均价格（卢布） |\n| rating | number | 类目商品平均评分 |\n| seasonalityAmplitude | string | 季节性强度，如 `STRONG_SEASONALITY` |\n| seasonalityCoef | string | 季节性阶段，如 `OFF_SEASON` |\n| startDate | string | 统计起始日期 |\n| endDate | string | 统计结束日期 |\n| sellerType | object | **配送方式分布**（非卖家本土/跨境类型），键为配送方式、值为该方式商品数，如 `{\"FBO\":218,\"RFBS\":528,\"FBP\":5,\"FBS\":240,\"OZON\":1}` |\n| categoryInfo | object | 类目元信息，结构见下方「categoryInfo 结构」 |\n| data | array | 类目商品列表（详见下方） |\n| products | array | 类目商品列表，内容与 `data` 完全一致 |\n| hasNextPage | boolean | 是否有下一页 |\n| columns | array | 列定义，元素含 `{field, title, cellType, sortable, filterable}` |\n| type | string | 响应展示类型 |\n| costTime | integer | 接口耗时（毫秒） |\n| costToken | integer | 消耗 Token 数量 |\n\n### data[*] / products[*] 类目商品对象字段\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| sku | integer | 商品 SKU |\n| productId | integer | 统一商品 ID，映射自 `sku` |\n| title | string | 商品标题 |\n| price | number | 商品价格（卢布） |\n| currency | string | 币种，固定 `₽` |\n| sales | integer | 商品销量 |\n| monthlySalesUnits | integer | 统一月销量，映射自 `sales` |\n| revenue | number | 商品销售额 |\n| monthlySalesRevenue | number | 统一月销售额，映射自 `revenue` |\n| reviewRating | number | 商品评分 |\n| rating | number | 统一评分，映射自 `reviewRating` |\n| reviewCount | integer | 评论数 |\n| brandName | string | 品牌名称 |\n| brand | string | 统一品牌，映射自 `brandName` |\n| sellerName | string | 卖家名称 |\n| fulfillment | array | 商品配送方式，如 `[\"FBO\"]`，可能含多个值 |\n| imageUrl | string | 商品图片链接 |\n| productUrl | string | 商品链接 |\n| productPageUrl | string | 统一商品页 URL，映射自 `productUrl` |\n| categoryInfo | object | 商品类目归属信息，结构见下方「categoryInfo 结构」 |\n| sourceType | string | 数据源，固定 `ozon` |\n| sourceTool | string | 来源工具，如 `Seerfar-Ozon-查类目` |\n\n> **统一字段 vs 原始字段**：`productId`/`rating`/`brand`/`monthlySalesUnits`/`monthlySalesRevenue`/`productPageUrl` 为后端统一映射字段，与原始 `sku`/`reviewRating`/`brandName`/`sales`/`revenue`/`productUrl` 等价；展示时二选一即可，建议用原始字段（语义更直观）。\n\n### categoryInfo 结构（顶层与每个商品均返回）\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| cnTitlePath | string | 中文类目路径，如 `鞋类 > 运动鞋和工作鞋 > 举重鞋` |\n| enTitlePath | string | 英文类目路径，如 `Footwear > Sports and Work Footwear > Weightlifting Shoes` |\n| titlePath | string | 俄文（前台）类目路径，如 `Обувь > Спортивная и рабочая обувь > Штангетки` |\n| fullCategoryId | array | 各级类目 ID 数组，如 `[\"15621032\",\"15621032_15621049\",\"15621032_15621049_115951147\"]` |\n| category | object | 末级类目对象，含 `cnTitle`/`enTitle`/`title`(俄文)/`level`/`crossBorderSellable`(是否可跨境销售)/`pid`/`disabled`/`id` |\n\n> `categoryInfo` 在顶层与每个 `data[*]` 中均返回且内容一致，可用于核对类目名称（中/英/俄）与可否跨境销售（`category.crossBorderSellable`）。\n\n## 错误码\n\n正常情况下 HTTP 状态码为 200，业务结果通过响应体区分：\n- **成功**：返回 `code:\"200\"` + `errcode:200`（`msg` / `errmsg` 均为 `ok`）。\n- **业务错误**：HTTP 仍为 200，但仅返回 `errcode`（非 200）+ `errmsg`（原因），无 `code` 字段。\n- **认证失败**：HTTP 状态码 401，响应体 `{\"errcode\":401,\"errmsg\":\"authorized error\"}`。\n\n| errcode | 含义 | 处理建议 |\n|---------|------|----------|\n| 200 | 成功 | 正常解析 `data` / `products` 字段 |\n| 400 | 参数错误 | 查看 `errmsg`；常见为缺 `categoryId`、缺 `page` |\n| 1002 | 分页参数超出限制 | `page.pageSize` 最大为 20，调小后重试 |\n| 1003 | 请求过于频繁 | 限流，稍后重试 |\n| 401 | 认证失败 | HTTP 401 或 authorized error：按 SKILL.md 的 **## 解决认证和积分问题** 处理。 |\n| 402 | 计费失败 | HTTP 402：按 SKILL.md 的 **## 解决认证和积分问题** 处理。 |\n| 其他非 200 值 | 业务异常 | 查看 `errmsg` 获取具体原因 |\n\n> **不存在的类目 ID**：传入不存在的 `categoryId` 通常返回 `errcode:200`、`total:0`、`data:[]`（空结果）。判断\"类目无数据\"应基于 `total=0`，而非 `errcode`。\n\n错误响应示例：\n\n```json\n{\n    \"errcode\": 1002,\n    \"errmsg\": \"分页参数超出限制，请检查输入。参数 page.pageSize 最大为 20，请调小后重试。\"\n}\n```\n\n```json\n{\n    \"errcode\": 400,\n    \"errmsg\": \"categoryId 为必填参数\"\n}\n```\n\n## curl 示例\n\n```bash\ncurl -X POST https://tool-gateway.linkfox.com/seerfar/ozon/categorySearch \\\n  -H \"Authorization: $LINKFOXAGENT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"User-Agent: LinkFox-Skill/1.0\" \\\n  -d '{\n    \"categoryId\": \"15621032_15621049_115951147\",\n    \"page\": {\"page\": 1, \"pageSize\": 5, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}\n  }'\n```\n\n## 响应示例（简略）\n\n```json\n{\n  \"code\": \"200\",\n  \"msg\": \"ok\",\n  \"errcode\": 200,\n  \"errmsg\": \"ok\",\n  \"id\": \"15621032_15621049_115951147\",\n  \"total\": 5,\n  \"totalSales\": 2066,\n  \"totalRevenue\": 12973043,\n  \"avgPrice\": 7228.0,\n  \"rating\": 4.9,\n  \"seasonalityAmplitude\": \"STRONG_SEASONALITY\",\n  \"seasonalityCoef\": \"OFF_SEASON\",\n  \"startDate\": \"2026-06-01\",\n  \"endDate\": \"2026-07-01\",\n  \"hasNextPage\": true,\n  \"type\": \"productWorkbenches\",\n  \"costTime\": 1415,\n  \"costToken\": 16000,\n  \"sellerType\": {\"FBO\": 218, \"RFBS\": 528, \"FBP\": 5, \"FBS\": 240, \"OZON\": 1},\n  \"categoryInfo\": {\n    \"cnTitlePath\": \"鞋类 > 运动鞋和工作鞋 > 举重鞋\",\n    \"enTitlePath\": \"Footwear > Sports and Work Footwear > Weightlifting Shoes\",\n    \"titlePath\": \"Обувь > Спортивная и рабочая обувь > Штангетки\",\n    \"fullCategoryId\": [\"15621032\", \"15621032_15621049\", \"15621032_15621049_115951147\"],\n    \"category\": {\n      \"cnTitle\": \"举重鞋\", \"enTitle\": \"Weightlifting Shoes\", \"title\": \"Штангетки\",\n      \"level\": 3, \"crossBorderSellable\": true, \"pid\": \"15621032_15621049\",\n      \"disabled\": false, \"id\": \"15621032_15621049_115951147\"\n    }\n  },\n  \"data\": [\n    {\n      \"sku\": 1546459445,\n      \"productId\": 1546459445,\n      \"title\": \"Штангетки YOUNGS\",\n      \"price\": 6481.0,\n      \"currency\": \"₽\",\n      \"sales\": 21,\n      \"monthlySalesUnits\": 21,\n      \"revenue\": 122635.0,\n      \"monthlySalesRevenue\": 122635.0,\n      \"reviewRating\": 4.8,\n      \"rating\": 4.8,\n      \"reviewCount\": 524,\n      \"brandName\": \"YOUNGS\",\n      \"brand\": \"YOUNGS\",\n      \"sellerName\": \"YoungS shoes\",\n      \"fulfillment\": [\"FBO\"],\n      \"imageUrl\": \"https://ir.ozone.ru/s3/multimedia-1-j/wc300/7000839379.jpg\",\n      \"productUrl\": \"https://www.ozon.ru/product/1546459445\",\n      \"productPageUrl\": \"https://www.ozon.ru/product/1546459445\",\n      \"categoryInfo\": { \"...\": \"同顶层 categoryInfo\" },\n      \"sourceType\": \"ozon\",\n      \"sourceTool\": \"Seerfar-Ozon-查类目\"\n    }\n  ],\n  \"products\": [ \"...\" ],\n  \"columns\": [ { \"field\": \"sku\", \"title\": \"商品SKU\", \"cellType\": \"number\", \"sortable\": true, \"filterable\": true } ]\n}\n```\n\n> `products` 内容与 `data` 完全一致，示例中用 `\"...\"` 表示省略。`total` 为本页返回记录数（本例 5），并非类目商品总数；`hasNextPage=true` 表示还有更多页。`sellerType` 为配送方式分布（非卖家本土/跨境类型）。\n\n---\n\n## Feedback API\n\n> 该接口与上方工具接口不同，**请勿混用两个基础 URL**。\n\n- **POST** `https://skill-api.linkfox.com/api/v1/public/feedback`\n- **Content-Type:** `application/json`\n\n```json\n{\n  \"skillName\": \"linkfox-seerfar-ozon-category-search\",\n  \"sentiment\": \"POSITIVE\",\n  \"category\": \"OTHER\",\n  \"content\": \"User successfully retrieved a category's best-sellers, total sales/revenue and average price for category selection analysis.\"\n}\n```\n\n**字段说明：**\n- `skillName`：使用本 skill 的 YAML `name`\n- `sentiment`：`POSITIVE` / `NEUTRAL` / `NEGATIVE` 三选一\n- `category`：`BUG` / `COMPLAINT` / `SUGGESTION` / `OTHER` 四选一\n- `content`：用户表达、实际现象、为什么算问题或好评\n\nFile v1.0.5:references/onboarding.md\n\n# 解决认证和积分问题\n\n调用本 skill 时若网关返回 **auth** 或 **billing** 错误，走本 skill 自带的 `scripts/onboarding.py` 完成引导。\n\n**auth 场景**：`errcode=401` 或消息含 `authorized error`/`鉴权失败`/`未授权`/`unauthorized`；或 `LINKFOX_AGENT_API_KEY` 与 `LINKFOXAGENT_API_KEY` 均为空。\n1. 若已配置 key → 先让用户重启会话（最常见误判），仍失败让用户重新取 key 或换手机号重注册\n2. 未配置 → 询问：自助去 https://agent.linkfox.com/ 取 key，或提供手机号让脚本注册\n3. 手机号路径：\n   - `python scripts/onboarding.py send-code <phone>` → 展示 JSON 里的 phone/agreements\n   - 收到验证码后：`python scripts/onboarding.py login <phone> <code>`（workbuddy 宿主加 `--channel workbuddy`）\n   - 拿到 `api_key` 后把下面三平台配置转发给用户，提示重启会话生效：\n     - Windows PowerShell（永久）：`setx LINKFOX_AGENT_API_KEY \"<key>\"`\n     - macOS zsh：`echo 'export LINKFOX_AGENT_API_KEY=\"<key>\"' >> ~/.zshrc && source ~/.zshrc`\n     - Linux bash：`echo 'export LINKFOX_AGENT_API_KEY=\"<key>\"' >> ~/.bashrc && source ~/.bashrc`\n     - 变量名 `LINKFOX_AGENT_API_KEY`（主推）或 `LINKFOXAGENT_API_KEY`（老规范）任一即可\n\n**billing 场景**：`errcode=402` 或消息含 `积分/余额/quota/insufficient/充值/套餐到期`。\n- `python scripts/onboarding.py list-plans` → 有 AskUserQuestion 就弹菜单，否则输出编号清单让用户选\n- 校验 `plan_id` ∈ 清单、支付方式 ∈ 该套餐 `available_methods`（通常 `wechat/alipay`）\n- `python scripts/onboarding.py order <plan_id> <method>` → 展示优先级 PNG > `pay_url` > `ascii_qr`（标注兜底）\n- 已付款可选调 `python scripts/onboarding.py query <order_id>`，不主动轮询\n\n排除 `errcode=403`（无权限，不归入这两类）。所有子命令输出 stdout JSON，`error` 字段已含阶段前缀，透传给用户即可。完整用法：`python scripts/onboarding.py --help`。\n\nFile v1.0.5:skill-card.md\n\n## Description:\n\nSearches a Seerfar Ozon category by category ID and returns category aggregates plus product-level sales, price, rating, review, brand, seller, and fulfillment metrics.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[linkfox-ai](https://clawhub.ai/user/linkfox-ai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal sellers, marketplace analysts, and developers use this skill to inspect one Ozon category, size demand, compare price bands, and rank products by sales, revenue, price, or rating.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill requires network access and a LinkFox API key to query the Seerfar Ozon category endpoint.\n\nMitigation: Install only in environments where LinkFox API access is intended, and scope or rotate the API key according to organizational policy.\n\nRisk: Full API responses are stored locally and may contain marketplace analysis data from the user's queries.\n\nMitigation: Review the LinkFox session data directory retention policy and remove saved response files when they are no longer needed.\n\nRisk: The bundled onboarding flow can involve phone numbers, SMS codes, account setup, billing plans, and payment actions.\n\nMitigation: Use onboarding or recharge commands only after explicit user consent, and verify payment details before submitting an order.\n\nRisk: Endpoint environment variables can redirect the skill to alternate LinkFox-compatible services.\n\nMitigation: Review and restrict LinkFox endpoint environment variables before use in managed or production workspaces.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/linkfox-ai/skills/linkfox-seerfar-ozon-category-search)\n- [Seerfar Ozon category search API reference](references/api.md)\n- [Authentication and billing onboarding](references/onboarding.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, JSON, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown summaries and tables with saved JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires a LinkFox API key; full API responses are saved locally in the LinkFox session data directory, with large responses summarized on stdout.]\n\n## Skill Version(s):\n\n1.0.5 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.4: 7 files, 26776 bytes\n\nFiles: references/api.md (11600b), references/onboarding.md (2046b), scripts/onboarding.py (24089b), scripts/seerfar_ozon_category_search.py (12731b), skill-card.md (2958b), SKILL.md (12510b), _meta.json (155b)\n\nFile v1.0.4:SKILL.md\n\n---\nname: linkfox-seerfar-ozon-category-search\ndescription: Seerfar Ozon 类目商品搜索：按 Ozon 类目 ID 拉取该类目下的商品列表，返回类目级聚合（类目总销量、总销售额、平均价格、平均评分、季节性）与每个商品的销量、价格、评分、评论数、品牌、卖家、配送方式。用于类目选品分析、类目爆品挖掘、类目容量与价格带分析、季节性判断。当用户提到 Ozon 类目商品、Ozon 类目分析、Ozon 类目选品、Ozon 类目爆品、Ozon 类目总销量、Ozon 类目平均价格、Ozon category search, Ozon category products, category best-sellers, category analysis 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 类目下的商品与类目级汇总数据，也应触发此技能。\n---\n\n# Seerfar Ozon Category Search\n\nThis skill lists the products of a specific Ozon category from the Seerfar analytics database. Given a `categoryId`, it returns category-level aggregates (total sales, total revenue, average price, average rating, seasonality) plus each product's sales, price, rating, review count, brand and seller — the starting point for category selection analysis, best-seller mining within a category, and category capacity / price-band analysis.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one category**: pass a single `categoryId` and receive that category's product list with performance metrics, alongside category-level aggregates. This is a *category-level* view, not a shop or keyword view.\n\n**Where the `categoryId` comes from**: `categoryId` is the Ozon category identifier — a hierarchical path joined by `_` (e.g. `15621032_15621049_115951147`), obtained from the Ozon category document or from other Seerfar Ozon tools. If the user only has a category name, first resolve it to a `categoryId` from an upstream Seerfar Ozon source before calling this skill.\n\n**Category aggregates vs product rows**: the response carries both category-level totals (`totalSales`, `totalRevenue`, `avgPrice`, `rating`, `seasonalityAmplitude`, `seasonalityCoef`, `startDate`/`endDate`) and a paginated product list (`data` / `products`). Use the aggregates for category sizing and the rows for individual product analysis.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are units; `price` / `revenue` are in Russian rubles (₽), indicated by `currency`.\n\n**Time window**: by default the data covers the last 30 days (`startDate` / `endDate` show the actual range). Pass `date` as `yyyy-MM` (e.g. `2026-02`) to query a historical month snapshot.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| categoryId | string | yes | Ozon category ID, e.g. `15621032_15621049_115951147` (levels joined by `_`). |\n| page | object | yes | Pagination `{page, pageSize, orders[]}`. |\n| page.page | integer | no | Page number, from 1 (default 1). |\n| page.pageSize | integer | no | Page size, default 20. **Max 20** — larger values are rejected (`errcode 1002`). |\n| page.orders | array | no | Sort rules, elements `{field, direction}` (both required); `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `revenue`, `reviewRating`. |\n| date | string | no | Historical month `yyyy-MM` (e.g. `2026-02`); omit for last 30 days. |\n| fulfillment | string | no | Fulfillment filter, one of `FBO` / `FBS` / `RFBS` / `FBP` / `OZON`; omit to query all. **Single string, not an array.** |\n| uId | string | no | User ID. |\n| memberId | string | no | Member ID (data attribution). |\n\nOnly `categoryId` and `page` are required.\n\n## 调用方式\n\n- **API 端点**：`POST /seerfar/ozon/categorySearch`（完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/seerfar_ozon_category_search.py '<JSON 参数>' [--inline]`\n- **成本约束**：本工具会消耗积分；同一会话同一参数组合默认只调用一次，脚本带 24h 本地缓存。失败/空结果不得自动换关键词、翻页或改邮编连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/linkfox-seerfar-ozon-category-search-<timestamp>.json`（`<cwd>` 为脚本执行时的工作目录，在 Claude Code 里即当前项目目录；`<session>` 取自环境变量 `SESSION_ID`，按用户任务自动聚合；**禁止写入 /tmp**，当前目录不可写则报错）\n- 响应体 ≤ 8 KB：落盘后把完整 JSON 打印到 stdout\n- 响应体 > 8 KB：落盘后 stdout 只输出摘要（顶层字段、常见计数如 `total`/`costToken`、最大列表字段的长度 + 前 3 条样本）\n- 加 `--inline` 强制全量打印到 stdout（同样落盘）\n\n**读数据建议**：先看摘要判断是否足够；需要具体字段时优先用 `jq`或`ConvertFrom-Json` 从保存的 json 文件按需抽取，避免整份 JSON 进入上下文。\n\n## 解决认证和积分问题\n发生以下异常情况时，采用 references/onboarding.md 引导解决问题：\n\n### 异常情况\n- **未配置API Key**：环境变量未配置 `LINKFOX_AGENT_API_KEY`，也未配置 `LINKFOXAGENT_API_KEY`。\n- **响应401或402状态码**\n- **响应提示积分或余额不足**：消息含\"积分余额不足/计费不足/余额不足/quota exceeded/insufficient balance/套餐到期/需充值/请充值\"，或类似含义的内容。\n\n## Usage Examples\n\n**1. Category best-sellers (sort by 30-day sales)**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**2. Category top-revenue products**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"revenue\", \"direction\": \"DESC\"}]}}\n```\n\n**3. Category premium price band (highest-priced)**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"price\", \"direction\": \"DESC\"}]}}\n```\n\n**4. Historical month snapshot**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"date\": \"2026-02\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**5. Filter to FBO-fulfilled products only**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"fulfillment\": \"FBO\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**6. Page deeper into the category**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 2, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n## How to Build Queries\n\n1. **Always pass `page.orders`**: categories can contain many products — sort by the metric you care about (`sales` DESC for best-sellers, `revenue` DESC for top revenue, `price` DESC for the premium band, `reviewRating` DESC for best-reviewed).\n2. **Keep `pageSize` ≤ 20**: the gateway caps page size at 20. Use `page.page` to paginate; check `hasNextPage` to know whether more pages exist.\n3. **Resolve the `categoryId` first**: if the user gives a category name rather than an id, obtain the `categoryId` from an upstream Seerfar Ozon source before calling this skill.\n4. **Use category aggregates for sizing**: `totalSales`, `totalRevenue`, `avgPrice` and `rating` describe the whole category at a glance — use them for capacity and price-band assessment before drilling into rows.\n5. **Use `date` for historical comparison**: pass `date` as `yyyy-MM` to compare a past month against the current 30-day window.\n6. **`fulfillment` is a single string**: pass one of `FBO` / `FBS` / `RFBS` / `FBP` / `OZON`, not an array.\n\n## Display Rules\n\n1. **Present data only**: show the category aggregates and product metrics in a clear table without subjective advice.\n2. **Lead with category context, then product columns**: state the category name (from `categoryInfo.cnTitlePath` / `enTitlePath` — confirms the right category), then `totalSales`, `totalRevenue`, `avgPrice`, `rating`, seasonality (`seasonalityAmplitude` / `seasonalityCoef`) and date range, plus the fulfillment distribution (`sellerType` map) as a one-line FBO/FBS/RFBS/... split; then a table of `sku`, `title`, `price`, `sales`, `revenue`, `reviewRating`, `reviewCount`, `brandName`, `sellerName`.\n3. **Currency**: `price` / `revenue` are in rubles (₽); render with the `currency` symbol.\n4. **Fulfillment**: `fulfillment` is an array (e.g. `[\"FBO\"]`); join multiple values with `/`.\n5. **Unified vs original fields**: `productId`/`rating`/`brand`/`monthlySalesUnits`/`monthlySalesRevenue`/`productPageUrl` mirror `sku`/`reviewRating`/`brandName`/`sales`/`revenue`/`productUrl` — show one set, prefer the originals.\n6. **Pagination guidance**: when `hasNextPage` is true, tell the user more pages are available via `page.page`; remind them `pageSize` is capped at 20.\n7. **Empty category**: a non-existent `categoryId` returns success with `total=0` and no data — tell the user the id may be wrong rather than reporting a system error.\n8. **Error handling**: when `code` is not `\"200\"` (or `errcode` is not `200`), explain the reason from `msg` / `errmsg` and suggest fixes (add `page`, lower `pageSize`, retry on rate-limit).\n\n## Important Limitations\n\n- **`categoryId` and `page` are both required**; omitting either returns `errcode 400`.\n- **`pageSize` max 20**: exceeding it returns `errcode 1002`.\n- **No text/keyword filter within a category**: this endpoint filters by category (plus optional `fulfillment` and `date`) only; to find products by keyword, use the Seerfar Ozon market keyword search skill.\n- **`total` is the page row count**, not the category's total product count — use `hasNextPage` to decide whether to fetch more pages.\n- **`sellerType` is a fulfillment distribution, not seller type**: despite the name, the top-level `sellerType` is a map of fulfillment model → product count (`{FBO, RFBS, FBP, FBS, OZON}`); it does not carry 本土/跨境 (local/cross-border) info. `categoryInfo` carries the category name path (CN/EN/RU) and `crossBorderSellable`.\n\n## User Expression & Scenario Quick Reference\n\n**Applicable** — analyzing one Ozon category's products and aggregates:\n\n| User Says | Scenario |\n|-----------|----------|\n| \"分析下这个 Ozon 类目的商品\" / \"这个类目有多大\" | Category sizing (totalSales / totalRevenue / avgPrice) |\n| \"这个类目最畅销的商品是什么\" | Best-seller mining (sort by sales) |\n| \"这个类目销售额最高的商品\" | Top-revenue products (sort by revenue) |\n| \"这个类目的价格带/客单价\" | Price-band analysis (sort by price) |\n| \"这个类目评分最高的商品\" | Best-reviewed (sort by reviewRating) |\n| \"这个类目上个月的数据\" | Historical month snapshot (date) |\n| \"这个类目 FBO 的商品\" | Fulfillment filter |\n\n**Not applicable** — Needs beyond one category's product list:\n- One shop/seller's catalog → use the Seerfar Ozon shop search skill.\n- Market-level keyword discovery → use the Seerfar Ozon market keyword search skill.\n- Keyword mining → use the Seerfar Ozon keyword mining skill.\n- A single product's full detail → use a product-level Seerfar Ozon source (this skill returns category-level fields only).\n\n**Boundary judgment**: if the user already has a `categoryId` (or one resolved from an upstream source) and wants to enumerate, rank, or size that category's products by sales/price/rating, start here. If they want a shop's catalog, keyword discovery, or a single product's deep detail, route to the corresponding Seerfar Ozon skill.\n\n## 积分消耗规则\n\n消耗 12 积分。\n\n> 用户会因积分消耗而支付费用。请充分评估：当需要高频调用本技能，或用户对积分消耗量预期不足时，务必提醒用户，由用户决定是否继续。\n\n**Feedback:**\n\nAuto-detect and report feedback via the Feedback API when any of the following apply:\n1. The functionality or purpose described in this skill does not match actual behavior\n2. The skill's results do not match the user's intent\n3. The user expresses dissatisfaction or praise about this skill\n4. Anything you believe could be improved\n\nCall the feedback API as specified in `references/api.md`. Do not interrupt the user's flow.\n\n---\n*For more high-quality, professional cross-border e-commerce skills, set [LinkFox Skills](https://skill.linkfox.com/).*\n\nFile v1.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-seerfar-ozon-category-search\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1786100141289\n}\n\nFile v1.0.4:references/api.md\n\n# Seerfar Ozon 类目商品搜索 API 参考\n\n## 调用规范\n\n- **请求地址**：`${LINKFOX_TOOL_GATEWAY}/seerfar/ozon/categorySearch`\n- **请求方式**：POST，Content-Type: application/json\n- **认证方式**：Header `Authorization: <api_key>`，api_key 从环境变量 `LINKFOX_AGENT_API_KEY` 或 `LINKFOXAGENT_API_KEY` 读取（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理）\n- **User-Agent**：`LinkFox-Skill/1.0`；HTTP 超时 60s\n\n## 请求参数\n\nPOST Body（JSON）。以下字段与接口 `inputSchema` 一致。`categoryId` 与 `page` 必填，其余可选。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| categoryId | string | 是 | Ozon 类目 ID，从 Ozon 类目文档或其他 Seerfar Ozon 工具获取。形如 `15621032_15621049_115951147`（多级类目以 `_` 连接） |\n| page | object | 是 | 分页与排序：`{page, pageSize, orders[]}` |\n| page.page | integer | 否 | 页码，从 1 开始，默认 1 |\n| page.pageSize | integer | 否 | 每页条数，默认 20，**最大 20**（超出返回 `errcode 1002`） |\n| page.orders | array | 否 | 排序规则，元素 `{field, direction}`（两者均必填）；`direction` 取 `DESC`（倒序）/ `ASC`（正序）。常用排序字段：`sales`、`price`、`revenue`、`reviewRating` |\n| date | string | 否 | 查询历史月份，格式 `yyyy-MM`（如 `2026-02`）；不传默认近 30 天 |\n| fulfillment | string | 否 | 配送方式过滤，固定可选值：`FBO`、`FBS`、`RFBS`、`FBP`、`OZON`；不传查询全部。**注意是单个字符串，不是数组** |\n| uId | string | 否 | 用户 ID（最长 1000） |\n| memberId | string | 否 | 成员 ID（一个成员唯一标识，一个用户可归属多个团队，数据归属于 memberId，最长 1000） |\n\n> **必填约束**：`categoryId` 与 `page` 均为必填；缺任意一项返回 `errcode 400`。\n> **分页上限**：`page.pageSize` 最大为 20，翻页请通过 `page.page` 递增。\n> **排序**：建议通过 `page.orders` 按核心指标排序（如 `sales` DESC 看爆品、`revenue` DESC 看高销售额、`price` DESC 看高价带），避免在无序结果中翻页。\n> **历史月份**：`date` 传 `yyyy-MM` 可查该月快照；不传则返回近 30 天数据，响应中 `startDate`/`endDate` 标明实际统计区间。\n\n## 响应结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| code | string | 返回码，`\"200\"` 表示成功（成功时返回） |\n| errcode | integer | 错误码，`200` 表示成功；业务错误时仅返回此项（成功时与 `code` 并存） |\n| msg | string | 消息；成功为 `ok` |\n| errmsg | string | 错误消息；成功为 `ok`，业务错误时为原因描述 |\n| id | string | 回显的类目 ID |\n| total | integer | **本页返回记录数**（等于当前页 `data` 条数，并非类目商品总数） |\n| totalSales | integer | 类目总销量（统计区间内） |\n| totalRevenue | number | 类目总销售额（卢布） |\n| avgPrice | number | 类目商品平均价格（卢布） |\n| rating | number | 类目商品平均评分 |\n| seasonalityAmplitude | string | 季节性强度，如 `STRONG_SEASONALITY` |\n| seasonalityCoef | string | 季节性阶段，如 `OFF_SEASON` |\n| startDate | string | 统计起始日期 |\n| endDate | string | 统计结束日期 |\n| sellerType | object | **配送方式分布**（非卖家本土/跨境类型），键为配送方式、值为该方式商品数，如 `{\"FBO\":218,\"RFBS\":528,\"FBP\":5,\"FBS\":240,\"OZON\":1}` |\n| categoryInfo | object | 类目元信息，结构见下方「categoryInfo 结构」 |\n| data | array | 类目商品列表（详见下方） |\n| products | array | 类目商品列表，内容与 `data` 完全一致 |\n| hasNextPage | boolean | 是否有下一页 |\n| columns | array | 列定义，元素含 `{field, title, cellType, sortable, filterable}` |\n| type | string | 响应展示类型 |\n| costTime | integer | 接口耗时（毫秒） |\n| costToken | integer | 消耗 Token 数量 |\n\n### data[*] / products[*] 类目商品对象字段\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| sku | integer | 商品 SKU |\n| productId | integer | 统一商品 ID，映射自 `sku` |\n| title | string | 商品标题 |\n| price | number | 商品价格（卢布） |\n| currency | string | 币种，固定 `₽` |\n| sales | integer | 商品销量 |\n| monthlySalesUnits | integer | 统一月销量，映射自 `sales` |\n| revenue | number | 商品销售额 |\n| monthlySalesRevenue | number | 统一月销售额，映射自 `revenue` |\n| reviewRating | number | 商品评分 |\n| rating | number | 统一评分，映射自 `reviewRating` |\n| reviewCount | integer | 评论数 |\n| brandName | string | 品牌名称 |\n| brand | string | 统一品牌，映射自 `brandName` |\n| sellerName | string | 卖家名称 |\n| fulfillment | array | 商品配送方式，如 `[\"FBO\"]`，可能含多个值 |\n| imageUrl | string | 商品图片链接 |\n| productUrl | string | 商品链接 |\n| productPageUrl | string | 统一商品页 URL，映射自 `productUrl` |\n| categoryInfo | object | 商品类目归属信息，结构见下方「categoryInfo 结构」 |\n| sourceType | string | 数据源，固定 `ozon` |\n| sourceTool | string | 来源工具，如 `Seerfar-Ozon-查类目` |\n\n> **统一字段 vs 原始字段**：`productId`/`rating`/`brand`/`monthlySalesUnits`/`monthlySalesRevenue`/`productPageUrl` 为后端统一映射字段，与原始 `sku`/`reviewRating`/`brandName`/`sales`/`revenue`/`productUrl` 等价；展示时二选一即可，建议用原始字段（语义更直观）。\n\n### categoryInfo 结构（顶层与每个商品均返回）\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| cnTitlePath | string | 中文类目路径，如 `鞋类 > 运动鞋和工作鞋 > 举重鞋` |\n| enTitlePath | string | 英文类目路径，如 `Footwear > Sports and Work Footwear > Weightlifting Shoes` |\n| titlePath | string | 俄文（前台）类目路径，如 `Обувь > Спортивная и рабочая обувь > Штангетки` |\n| fullCategoryId | array | 各级类目 ID 数组，如 `[\"15621032\",\"15621032_15621049\",\"15621032_15621049_115951147\"]` |\n| category | object | 末级类目对象，含 `cnTitle`/`enTitle`/`title`(俄文)/`level`/`crossBorderSellable`(是否可跨境销售)/`pid`/`disabled`/`id` |\n\n> `categoryInfo` 在顶层与每个 `data[*]` 中均返回且内容一致，可用于核对类目名称（中/英/俄）与可否跨境销售（`category.crossBorderSellable`）。\n\n## 错误码\n\n正常情况下 HTTP 状态码为 200，业务结果通过响应体区分：\n- **成功**：返回 `code:\"200\"` + `errcode:200`（`msg` / `errmsg` 均为 `ok`）。\n- **业务错误**：HTTP 仍为 200，但仅返回 `errcode`（非 200）+ `errmsg`（原因），无 `code` 字段。\n- **认证失败**：HTTP 状态码 401，响应体 `{\"errcode\":401,\"errmsg\":\"authorized error\"}`。\n\n| errcode | 含义 | 处理建议 |\n|---------|------|----------|\n| 200 | 成功 | 正常解析 `data` / `products` 字段 |\n| 400 | 参数错误 | 查看 `errmsg`；常见为缺 `categoryId`、缺 `page` |\n| 1002 | 分页参数超出限制 | `page.pageSize` 最大为 20，调小后重试 |\n| 1003 | 请求过于频繁 | 限流，稍后重试 |\n| 401 | 认证失败 | HTTP 401 或 authorized error：按 SKILL.md 的 **## 解决认证和积分问题** 处理。 |\n| 402 | 计费失败 | HTTP 402：按 SKILL.md 的 **## 解决认证和积分问题** 处理。 |\n| 其他非 200 值 | 业务异常 | 查看 `errmsg` 获取具体原因 |\n\n> **不存在的类目 ID**：传入不存在的 `categoryId` 通常返回 `errcode:200`、`total:0`、`data:[]`（空结果）。判断\"类目无数据\"应基于 `total=0`，而非 `errcode`。\n\n错误响应示例：\n\n```json\n{\n    \"errcode\": 1002,\n    \"errmsg\": \"分页参数超出限制，请检查输入。参数 page.pageSize 最大为 20，请调小后重试。\"\n}\n```\n\n```json\n{\n    \"errcode\": 400,\n    \"errmsg\": \"categoryId 为必填参数\"\n}\n```\n\n## curl 示例\n\n```bash\ncurl -X POST https://tool-gateway.linkfox.com/seerfar/ozon/categorySearch \\\n  -H \"Authorization: $LINKFOXAGENT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"User-Agent: LinkFox-Skill/1.0\" \\\n  -d '{\n    \"categoryId\": \"15621032_15621049_115951147\",\n    \"page\": {\"page\": 1, \"pageSize\": 5, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}\n  }'\n```\n\n## 响应示例（简略）\n\n```json\n{\n  \"code\": \"200\",\n  \"msg\": \"ok\",\n  \"errcode\": 200,\n  \"errmsg\": \"ok\",\n  \"id\": \"15621032_15621049_115951147\",\n  \"total\": 5,\n  \"totalSales\": 2066,\n  \"totalRevenue\": 12973043,\n  \"avgPrice\": 7228.0,\n  \"rating\": 4.9,\n  \"seasonalityAmplitude\": \"STRONG_SEASONALITY\",\n  \"seasonalityCoef\": \"OFF_SEASON\",\n  \"startDate\": \"2026-06-01\",\n  \"endDate\": \"2026-07-01\",\n  \"hasNextPage\": true,\n  \"type\": \"productWorkbenches\",\n  \"costTime\": 1415,\n  \"costToken\": 16000,\n  \"sellerType\": {\"FBO\": 218, \"RFBS\": 528, \"FBP\": 5, \"FBS\": 240, \"OZON\": 1},\n  \"categoryInfo\": {\n    \"cnTitlePath\": \"鞋类 > 运动鞋和工作鞋 > 举重鞋\",\n    \"enTitlePath\": \"Footwear > Sports and Work Footwear > Weightlifting Shoes\",\n    \"titlePath\": \"Обувь > Спортивная и рабочая обувь > Штангетки\",\n    \"fullCategoryId\": [\"15621032\", \"15621032_15621049\", \"15621032_15621049_115951147\"],\n    \"category\": {\n      \"cnTitle\": \"举重鞋\", \"enTitle\": \"Weightlifting Shoes\", \"title\": \"Штангетки\",\n      \"level\": 3, \"crossBorderSellable\": true, \"pid\": \"15621032_15621049\",\n      \"disabled\": false, \"id\": \"15621032_15621049_115951147\"\n    }\n  },\n  \"data\": [\n    {\n      \"sku\": 1546459445,\n      \"productId\": 1546459445,\n      \"title\": \"Штангетки YOUNGS\",\n      \"price\": 6481.0,\n      \"currency\": \"₽\",\n      \"sales\": 21,\n      \"monthlySalesUnits\": 21,\n      \"revenue\": 122635.0,\n      \"monthlySalesRevenue\": 122635.0,\n      \"reviewRating\": 4.8,\n      \"rating\": 4.8,\n      \"reviewCount\": 524,\n      \"brandName\": \"YOUNGS\",\n      \"brand\": \"YOUNGS\",\n      \"sellerName\": \"YoungS shoes\",\n      \"fulfillment\": [\"FBO\"],\n      \"imageUrl\": \"https://ir.ozone.ru/s3/multimedia-1-j/wc300/7000839379.jpg\",\n      \"productUrl\": \"https://www.ozon.ru/product/1546459445\",\n      \"productPageUrl\": \"https://www.ozon.ru/product/1546459445\",\n      \"categoryInfo\": { \"...\": \"同顶层 categoryInfo\" },\n      \"sourceType\": \"ozon\",\n      \"sourceTool\": \"Seerfar-Ozon-查类目\"\n    }\n  ],\n  \"products\": [ \"...\" ],\n  \"columns\": [ { \"field\": \"sku\", \"title\": \"商品SKU\", \"cellType\": \"number\", \"sortable\": true, \"filterable\": true } ]\n}\n```\n\n> `products` 内容与 `data` 完全一致，示例中用 `\"...\"` 表示省略。`total` 为本页返回记录数（本例 5），并非类目商品总数；`hasNextPage=true` 表示还有更多页。`sellerType` 为配送方式分布（非卖家本土/跨境类型）。\n\n---\n\n## Feedback API\n\n> 该接口与上方工具接口不同，**请勿混用两个基础 URL**。\n\n- **POST** `https://skill-api.linkfox.com/api/v1/public/feedback`\n- **Content-Type:** `application/json`\n\n```json\n{\n  \"skillName\": \"linkfox-seerfar-ozon-category-search\",\n  \"sentiment\": \"POSITIVE\",\n  \"category\": \"OTHER\",\n  \"content\": \"User successfully retrieved a category's best-sellers, total sales/revenue and average price for category selection analysis.\"\n}\n```\n\n**字段说明：**\n- `skillName`：使用本 skill 的 YAML `name`\n- `sentiment`：`POSITIVE` / `NEUTRAL` / `NEGATIVE` 三选一\n- `category`：`BUG` / `COMPLAINT` / `SUGGESTION` / `OTHER` 四选一\n- `content`：用户表达、实际现象、为什么算问题或好评\n\nFile v1.0.4:references/onboarding.md\n\n# 解决认证和积分问题\n\n调用本 skill 时若网关返回 **auth** 或 **billing** 错误，走本 skill 自带的 `scripts/onboarding.py` 完成引导。\n\n**auth 场景**：`errcode=401` 或消息含 `authorized error`/`鉴权失败`/`未授权`/`unauthorized`；或 `LINKFOX_AGENT_API_KEY` 与 `LINKFOXAGENT_API_KEY` 均为空。\n1. 若已配置 key → 先让用户重启会话（最常见误判），仍失败让用户重新取 key 或换手机号重注册\n2. 未配置 → 询问：自助去 https://agent.linkfox.com/ 取 key，或提供手机号让脚本注册\n3. 手机号路径：\n   - `python scripts/onboarding.py send-code <phone>` → 展示 JSON 里的 phone/agreements\n   - 收到验证码后：`python scripts/onboarding.py login <phone> <code>`（workbuddy 宿主加 `--channel workbuddy`）\n   - 拿到 `api_key` 后把下面三平台配置转发给用户，提示重启会话生效：\n     - Windows PowerShell（永久）：`setx LINKFOX_AGENT_API_KEY \"<key>\"`\n     - macOS zsh：`echo 'export LINKFOX_AGENT_API_KEY=\"<key>\"' >> ~/.zshrc && source ~/.zshrc`\n     - Linux bash：`echo 'export LINKFOX_AGENT_API_KEY=\"<key>\"' >> ~/.bashrc && source ~/.bashrc`\n     - 变量名 `LINKFOX_AGENT_API_KEY`（主推）或 `LINKFOXAGENT_API_KEY`（老规范）任一即可\n\n**billing 场景**：`errcode=402` 或消息含 `积分/余额/quota/insufficient/充值/套餐到期`。\n- `python scripts/onboarding.py list-plans` → 有 AskUserQuestion 就弹菜单，否则输出编号清单让用户选\n- 校验 `plan_id` ∈ 清单、支付方式 ∈ 该套餐 `available_methods`（通常 `wechat/alipay`）\n- `python scripts/onboarding.py order <plan_id> <method>` → 展示优先级 PNG > `pay_url` > `ascii_qr`（标注兜底）\n- 已付款可选调 `python scripts/onboarding.py query <order_id>`，不主动轮询\n\n排除 `errcode=403`（无权限，不归入这两类）。所有子命令输出 stdout JSON，`error` 字段已含阶段前缀，透传给用户即可。完整用法：`python scripts/onboarding.py --help`。\n\nFile v1.0.4:skill-card.md\n\n## Description:\n\nLooks up products in a specified Ozon category through Seerfar and returns category-level aggregates plus product metrics for category selection, best-seller ranking, price-band analysis, and seasonality checks.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[linkfox-ai](https://clawhub.ai/user/linkfox-ai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal e-commerce analysts, marketplace operators, and agent users use this skill to retrieve Ozon category product rows, rankings, and aggregate sales, revenue, price, rating, and fulfillment data. It supports category sizing, category best-seller discovery, historical month snapshots, and fulfillment-filtered analysis when a category ID is available.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The security summary reports sensitive phone login, API-key generation, payment-order, automatic feedback, and persistent storage behavior in addition to the advertised Ozon lookup.\n\nMitigation: Install only if LinkFox is trusted with category queries and account setup data; obtain and configure API keys directly when possible, avoid relaying OTP codes through the agent unless intentionally using the onboarding flow, and review payment actions before proceeding.\n\nRisk: The skill stores full API responses and cache data locally, which may include queried category data and account-related session artifacts.\n\nMitigation: Review or delete the local linkfox response, session, and cache directories after use, especially on shared workspaces.\n\nRisk: Each lookup consumes credits and repeated pagination or retries can create unexpected cost.\n\nMitigation: Confirm additional calls with the user when high-frequency lookups, pagination, historical comparisons, or billing recovery are needed.\n\n## Reference(s):\n\n- [ClawHub Skill Page](https://clawhub.ai/linkfox-ai/skills/linkfox-seerfar-ozon-category-search)\n- [API Reference](references/api.md)\n- [Authentication and Billing Onboarding](references/onboarding.md)\n- [LinkFox Skills](https://skill.linkfox.com/)\n- [LinkFox Agent Setup](https://agent.linkfox.com/)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON API parameters, tabular summaries, and saved JSON response files]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [The runtime script writes full API responses under a linkfox session data directory, prints full JSON for small responses, and summarizes larger responses unless inline output is requested.]\n\n## Skill Version(s):\n\n1.0.4 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.3: 5 files, 17728 bytes\n\nFiles: references/api.md (11600b), scripts/seerfar_ozon_category_search.py (12731b), skill-card.md (2742b), SKILL.md (13127b), _meta.json (155b)\n\nFile v1.0.3:SKILL.md\n\n---\nname: linkfox-seerfar-ozon-category-search\ndescription: Seerfar Ozon 类目商品搜索：按 Ozon 类目 ID 拉取该类目下的商品列表，返回类目级聚合（类目总销量、总销售额、平均价格、平均评分、季节性）与每个商品的销量、价格、评分、评论数、品牌、卖家、配送方式。用于类目选品分析、类目爆品挖掘、类目容量与价格带分析、季节性判断。当用户提到 Ozon 类目商品、Ozon 类目分析、Ozon 类目选品、Ozon 类目爆品、Ozon 类目总销量、Ozon 类目平均价格、Ozon category search, Ozon category products, category best-sellers, category analysis 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 类目下的商品与类目级汇总数据，也应触发此技能。\n---\n\n# Seerfar Ozon Category Search\n\nThis skill lists the products of a specific Ozon category from the Seerfar analytics database. Given a `categoryId`, it returns category-level aggregates (total sales, total revenue, average price, average rating, seasonality) plus each product's sales, price, rating, review count, brand and seller — the starting point for category selection analysis, best-seller mining within a category, and category capacity / price-band analysis.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one category**: pass a single `categoryId` and receive that category's product list with performance metrics, alongside category-level aggregates. This is a *category-level* view, not a shop or keyword view.\n\n**Where the `categoryId` comes from**: `categoryId` is the Ozon category identifier — a hierarchical path joined by `_` (e.g. `15621032_15621049_115951147`), obtained from the Ozon category document or from other Seerfar Ozon tools. If the user only has a category name, first resolve it to a `categoryId` from an upstream Seerfar Ozon source before calling this skill.\n\n**Category aggregates vs product rows**: the response carries both category-level totals (`totalSales`, `totalRevenue`, `avgPrice`, `rating`, `seasonalityAmplitude`, `seasonalityCoef`, `startDate`/`endDate`) and a paginated product list (`data` / `products`). Use the aggregates for category sizing and the rows for individual product analysis.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are units; `price` / `revenue` are in Russian rubles (₽), indicated by `currency`.\n\n**Time window**: by default the data covers the last 30 days (`startDate` / `endDate` show the actual range). Pass `date` as `yyyy-MM` (e.g. `2026-02`) to query a historical month snapshot.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| categoryId | string | yes | Ozon category ID, e.g. `15621032_15621049_115951147` (levels joined by `_`). |\n| page | object | yes | Pagination `{page, pageSize, orders[]}`. |\n| page.page | integer | no | Page number, from 1 (default 1). |\n| page.pageSize | integer | no | Page size, default 20. **Max 20** — larger values are rejected (`errcode 1002`). |\n| page.orders | array | no | Sort rules, elements `{field, direction}` (both required); `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `revenue`, `reviewRating`. |\n| date | string | no | Historical month `yyyy-MM` (e.g. `2026-02`); omit for last 30 days. |\n| fulfillment | string | no | Fulfillment filter, one of `FBO` / `FBS` / `RFBS` / `FBP` / `OZON`; omit to query all. **Single string, not an array.** |\n| uId | string | no | User ID. |\n| memberId | string | no | Member ID (data attribution). |\n\nOnly `categoryId` and `page` are required.\n\n## 调用方式\n\n- **API 端点**：`POST /seerfar/ozon/categorySearch`（完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/seerfar_ozon_category_search.py '<JSON 参数>' [--inline]`\n- **成本约束**：本工具会消耗积分；同一会话同一参数组合默认只调用一次，脚本带 24h 本地缓存。失败/空结果不得自动换关键词、翻页或改邮编连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/linkfox-seerfar-ozon-category-search-<timestamp>.json`（`<cwd>` 为脚本执行时的工作目录，在 Claude Code 里即当前项目目录；`<session>` 取自环境变量 `SESSION_ID`，按用户任务自动聚合；**禁止写入 /tmp**，当前目录不可写则报错）\n- 响应体 ≤ 8 KB：落盘后把完整 JSON 打印到 stdout\n- 响应体 > 8 KB：落盘后 stdout 只输出摘要（顶层字段、常见计数如 `total`/`costToken`、最大列表字段的长度 + 前 3 条样本）\n- 加 `--inline` 强制全量打印到 stdout（同样落盘）\n\n**读数据建议**：先看摘要判断是否足够；需要具体字段时优先用 `jq`或`ConvertFrom-Json` 从保存的 json 文件按需抽取，避免整份 JSON 进入上下文。\n\n## 解决认证和积分问题\n发生以下异常情况时，采用以下措施来处理：\n\n### 异常情况\n- **未配置API Key**：环境变量未配置 `LINKFOX_AGENT_API_KEY`，也未配置 `LINKFOXAGENT_API_KEY`。\n- **响应401或402状态码**\n- **响应提示积分或余额不足**：消息含\"积分余额不足/计费不足/余额不足/quota exceeded/insufficient balance/套餐到期/需充值/请充值\"，或类似含义的内容。\n\n### 措施\n- 优先采用skill内的 onboarding.md 引导解决问题。\n- 如找不到 onboarding.md 文件，则加载 /linkfox-onboarding 这个skill并根据它的引导来处理。如未安装请先安装：\n    - 下载 https://agent-files.linkfox.com/skills/linkfox-onboarding/release.zip，解压后安装这个skill。如需用户授权才可下载，要询问用户获得授权，你不能自己放弃下载。\n- 兜底措施：仅当前面两个措施经过所有努力都走不通时，才提示用户依据 https://skill.linkfox.com/linkfoxskills/guide.htm 指引获取API Key，或去 https://os.linkfox.com/ 补充积分。\n\n## Usage Examples\n\n**1. Category best-sellers (sort by 30-day sales)**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**2. Category top-revenue products**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"revenue\", \"direction\": \"DESC\"}]}}\n```\n\n**3. Category premium price band (highest-priced)**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"price\", \"direction\": \"DESC\"}]}}\n```\n\n**4. Historical month snapshot**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"date\": \"2026-02\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**5. Filter to FBO-fulfilled products only**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"fulfillment\": \"FBO\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**6. Page deeper into the category**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 2, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n## How to Build Queries\n\n1. **Always pass `page.orders`**: categories can contain many products — sort by the metric you care about (`sales` DESC for best-sellers, `revenue` DESC for top revenue, `price` DESC for the premium band, `reviewRating` DESC for best-reviewed).\n2. **Keep `pageSize` ≤ 20**: the gateway caps page size at 20. Use `page.page` to paginate; check `hasNextPage` to know whether more pages exist.\n3. **Resolve the `categoryId` first**: if the user gives a category name rather than an id, obtain the `categoryId` from an upstream Seerfar Ozon source before calling this skill.\n4. **Use category aggregates for sizing**: `totalSales`, `totalRevenue`, `avgPrice` and `rating` describe the whole category at a glance — use them for capacity and price-band assessment before drilling into rows.\n5. **Use `date` for historical comparison**: pass `date` as `yyyy-MM` to compare a past month against the current 30-day window.\n6. **`fulfillment` is a single string**: pass one of `FBO` / `FBS` / `RFBS` / `FBP` / `OZON`, not an array.\n\n## Display Rules\n\n1. **Present data only**: show the category aggregates and product metrics in a clear table without subjective advice.\n2. **Lead with category context, then product columns**: state the category name (from `categoryInfo.cnTitlePath` / `enTitlePath` — confirms the right category), then `totalSales`, `totalRevenue`, `avgPrice`, `rating`, seasonality (`seasonalityAmplitude` / `seasonalityCoef`) and date range, plus the fulfillment distribution (`sellerType` map) as a one-line FBO/FBS/RFBS/... split; then a table of `sku`, `title`, `price`, `sales`, `revenue`, `reviewRating`, `reviewCount`, `brandName`, `sellerName`.\n3. **Currency**: `price` / `revenue` are in rubles (₽); render with the `currency` symbol.\n4. **Fulfillment**: `fulfillment` is an array (e.g. `[\"FBO\"]`); join multiple values with `/`.\n5. **Unified vs original fields**: `productId`/`rating`/`brand`/`monthlySalesUnits`/`monthlySalesRevenue`/`productPageUrl` mirror `sku`/`reviewRating`/`brandName`/`sales`/`revenue`/`productUrl` — show one set, prefer the originals.\n6. **Pagination guidance**: when `hasNextPage` is true, tell the user more pages are available via `page.page`; remind them `pageSize` is capped at 20.\n7. **Empty category**: a non-existent `categoryId` returns success with `total=0` and no data — tell the user the id may be wrong rather than reporting a system error.\n8. **Error handling**: when `code` is not `\"200\"` (or `errcode` is not `200`), explain the reason from `msg` / `errmsg` and suggest fixes (add `page`, lower `pageSize`, retry on rate-limit).\n\n## Important Limitations\n\n- **`categoryId` and `page` are both required**; omitting either returns `errcode 400`.\n- **`pageSize` max 20**: exceeding it returns `errcode 1002`.\n- **No text/keyword filter within a category**: this endpoint filters by category (plus optional `fulfillment` and `date`) only; to find products by keyword, use the Seerfar Ozon market keyword search skill.\n- **`total` is the page row count**, not the category's total product count — use `hasNextPage` to decide whether to fetch more pages.\n- **`sellerType` is a fulfillment distribution, not seller type**: despite the name, the top-level `sellerType` is a map of fulfillment model → product count (`{FBO, RFBS, FBP, FBS, OZON}`); it does not carry 本土/跨境 (local/cross-border) info. `categoryInfo` carries the category name path (CN/EN/RU) and `crossBorderSellable`.\n\n## User Expression & Scenario Quick Reference\n\n**Applicable** — analyzing one Ozon category's products and aggregates:\n\n| User Says | Scenario |\n|-----------|----------|\n| \"分析下这个 Ozon 类目的商品\" / \"这个类目有多大\" | Category sizing (totalSales / totalRevenue / avgPrice) |\n| \"这个类目最畅销的商品是什么\" | Best-seller mining (sort by sales) |\n| \"这个类目销售额最高的商品\" | Top-revenue products (sort by revenue) |\n| \"这个类目的价格带/客单价\" | Price-band analysis (sort by price) |\n| \"这个类目评分最高的商品\" | Best-reviewed (sort by reviewRating) |\n| \"这个类目上个月的数据\" | Historical month snapshot (date) |\n| \"这个类目 FBO 的商品\" | Fulfillment filter |\n\n**Not applicable** — Needs beyond one category's product list:\n- One shop/seller's catalog → use the Seerfar Ozon shop search skill.\n- Market-level keyword discovery → use the Seerfar Ozon market keyword search skill.\n- Keyword mining → use the Seerfar Ozon keyword mining skill.\n- A single product's full detail → use a product-level Seerfar Ozon source (this skill returns category-level fields only).\n\n**Boundary judgment**: if the user already has a `categoryId` (or one resolved from an upstream source) and wants to enumerate, rank, or size that category's products by sales/price/rating, start here. If they want a shop's catalog, keyword discovery, or a single product's deep detail, route to the corresponding Seerfar Ozon skill.\n\n## 积分消耗规则\n\n消耗 12 积分。\n\n> 用户会因积分消耗而支付费用。请充分评估：当需要高频调用本技能，或用户对积分消耗量预期不足时，务必提醒用户，由用户决定是否继续。\n\n**Feedback:**\n\nAuto-detect and report feedback via the Feedback API when any of the following apply:\n1. The functionality or purpose described in this skill does not match actual behavior\n2. The skill's results do not match the user's intent\n3. The user expresses dissatisfaction or praise about this skill\n4. Anything you believe could be improved\n\nCall the feedback API as specified in `references/api.md`. Do not interrupt the user's flow.\n\n---\n*For more high-quality, professional cross-border e-commerce skills, set [LinkFox Skills](https://skill.linkfox.com/).*\n\nFile v1.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-seerfar-ozon-category-search\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1783945002721\n}\n\nFile v1.0.3:references/api.md\n\n# Seerfar Ozon 类目商品搜索 API 参考\n\n## 调用规范\n\n- **请求地址**：`${LINKFOX_TOOL_GATEWAY}/seerfar/ozon/categorySearch`\n- **请求方式**：POST，Content-Type: application/json\n- **认证方式**：Header `Authorization: <api_key>`，api_key 从环境变量 `LINKFOX_AGENT_API_KEY` 或 `LINKFOXAGENT_API_KEY` 读取（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理）\n- **User-Agent**：`LinkFox-Skill/1.0`；HTTP 超时 60s\n\n## 请求参数\n\nPOST Body（JSON）。以下字段与接口 `inputSchema` 一致。`categoryId` 与 `page` 必填，其余可选。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| categoryId | string | 是 | Ozon 类目 ID，从 Ozon 类目文档或其他 Seerfar Ozon 工具获取。形如 `15621032_15621049_115951147`（多级类目以 `_` 连接） |\n| page | object | 是 | 分页与排序：`{page, pageSize, orders[]}` |\n| page.page | integer | 否 | 页码，从 1 开始，默认 1 |\n| page.pageSize | integer | 否 | 每页条数，默认 20，**最大 20**（超出返回 `errcode 1002`） |\n| page.orders | array | 否 | 排序规则，元素 `{field, direction}`（两者均必填）；`direction` 取 `DESC`（倒序）/ `ASC`（正序）。常用排序字段：`sales`、`price`、`revenue`、`reviewRating` |\n| date | string | 否 | 查询历史月份，格式 `yyyy-MM`（如 `2026-02`）；不传默认近 30 天 |\n| fulfillment | string | 否 | 配送方式过滤，固定可选值：`FBO`、`FBS`、`RFBS`、`FBP`、`OZON`；不传查询全部。**注意是单个字符串，不是数组** |\n| uId | string | 否 | 用户 ID（最长 1000） |\n| memberId | string | 否 | 成员 ID（一个成员唯一标识，一个用户可归属多个团队，数据归属于 memberId，最长 1000） |\n\n> **必填约束**：`categoryId` 与 `page` 均为必填；缺任意一项返回 `errcode 400`。\n> **分页上限**：`page.pageSize` 最大为 20，翻页请通过 `page.page` 递增。\n> **排序**：建议通过 `page.orders` 按核心指标排序（如 `sales` DESC 看爆品、`revenue` DESC 看高销售额、`price` DESC 看高价带），避免在无序结果中翻页。\n> **历史月份**：`date` 传 `yyyy-MM` 可查该月快照；不传则返回近 30 天数据，响应中 `startDate`/`endDate` 标明实际统计区间。\n\n## 响应结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| code | string | 返回码，`\"200\"` 表示成功（成功时返回） |\n| errcode | integer | 错误码，`200` 表示成功；业务错误时仅返回此项（成功时与 `code` 并存） |\n| msg | string | 消息；成功为 `ok` |\n| errmsg | string | 错误消息；成功为 `ok`，业务错误时为原因描述 |\n| id | string | 回显的类目 ID |\n| total | integer | **本页返回记录数**（等于当前页 `data` 条数，并非类目商品总数） |\n| totalSales | integer | 类目总销量（统计区间内） |\n| totalRevenue | number | 类目总销售额（卢布） |\n| avgPrice | number | 类目商品平均价格（卢布） |\n| rating | number | 类目商品平均评分 |\n| seasonalityAmplitude | string | 季节性强度，如 `STRONG_SEASONALITY` |\n| seasonalityCoef | string | 季节性阶段，如 `OFF_SEASON` |\n| startDate | string | 统计起始日期 |\n| endDate | string | 统计结束日期 |\n| sellerType | object | **配送方式分布**（非卖家本土/跨境类型），键为配送方式、值为该方式商品数，如 `{\"FBO\":218,\"RFBS\":528,\"FBP\":5,\"FBS\":240,\"OZON\":1}` |\n| categoryInfo | object | 类目元信息，结构见下方「categoryInfo 结构」 |\n| data | array | 类目商品列表（详见下方） |\n| products | array | 类目商品列表，内容与 `data` 完全一致 |\n| hasNextPage | boolean | 是否有下一页 |\n| columns | array | 列定义，元素含 `{field, title, cellType, sortable, filterable}` |\n| type | string | 响应展示类型 |\n| costTime | integer | 接口耗时（毫秒） |\n| costToken | integer | 消耗 Token 数量 |\n\n### data[*] / products[*] 类目商品对象字段\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| sku | integer | 商品 SKU |\n| productId | integer | 统一商品 ID，映射自 `sku` |\n| title | string | 商品标题 |\n| price | number | 商品价格（卢布） |\n| currency | string | 币种，固定 `₽` |\n| sales | integer | 商品销量 |\n| monthlySalesUnits | integer | 统一月销量，映射自 `sales` |\n| revenue | number | 商品销售额 |\n| monthlySalesRevenue | number | 统一月销售额，映射自 `revenue` |\n| reviewRating | number | 商品评分 |\n| rating | number | 统一评分，映射自 `reviewRating` |\n| reviewCount | integer | 评论数 |\n| brandName | string | 品牌名称 |\n| brand | string | 统一品牌，映射自 `brandName` |\n| sellerName | string | 卖家名称 |\n| fulfillment | array | 商品配送方式，如 `[\"FBO\"]`，可能含多个值 |\n| imageUrl | string | 商品图片链接 |\n| productUrl | string | 商品链接 |\n| productPageUrl | string | 统一商品页 URL，映射自 `productUrl` |\n| categoryInfo | object | 商品类目归属信息，结构见下方「categoryInfo 结构」 |\n| sourceType | string | 数据源，固定 `ozon` |\n| sourceTool | string | 来源工具，如 `Seerfar-Ozon-查类目` |\n\n> **统一字段 vs 原始字段**：`productId`/`rating`/`brand`/`monthlySalesUnits`/`monthlySalesRevenue`/`productPageUrl` 为后端统一映射字段，与原始 `sku`/`reviewRating`/`brandName`/`sales`/`revenue`/`productUrl` 等价；展示时二选一即可，建议用原始字段（语义更直观）。\n\n### categoryInfo 结构（顶层与每个商品均返回）\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| cnTitlePath | string | 中文类目路径，如 `鞋类 > 运动鞋和工作鞋 > 举重鞋` |\n| enTitlePath | string | 英文类目路径，如 `Footwear > Sports and Work Footwear > Weightlifting Shoes` |\n| titlePath | string | 俄文（前台）类目路径，如 `Обувь > Спортивная и рабочая обувь > Штангетки` |\n| fullCategoryId | array | 各级类目 ID 数组，如 `[\"15621032\",\"15621032_15621049\",\"15621032_15621049_115951147\"]` |\n| category | object | 末级类目对象，含 `cnTitle`/`enTitle`/`title`(俄文)/`level`/`crossBorderSellable`(是否可跨境销售)/`pid`/`disabled`/`id` |\n\n> `categoryInfo` 在顶层与每个 `data[*]` 中均返回且内容一致，可用于核对类目名称（中/英/俄）与可否跨境销售（`category.crossBorderSellable`）。\n\n## 错误码\n\n正常情况下 HTTP 状态码为 200，业务结果通过响应体区分：\n- **成功**：返回 `code:\"200\"` + `errcode:200`（`msg` / `errmsg` 均为 `ok`）。\n- **业务错误**：HTTP 仍为 200，但仅返回 `errcode`（非 200）+ `errmsg`（原因），无 `code` 字段。\n- **认证失败**：HTTP 状态码 401，响应体 `{\"errcode\":401,\"errmsg\":\"authorized error\"}`。\n\n| errcode | 含义 | 处理建议 |\n|---------|------|----------|\n| 200 | 成功 | 正常解析 `data` / `products` 字段 |\n| 400 | 参数错误 | 查看 `errmsg`；常见为缺 `categoryId`、缺 `page` |\n| 1002 | 分页参数超出限制 | `page.pageSize` 最大为 20，调小后重试 |\n| 1003 | 请求过于频繁 | 限流，稍后重试 |\n| 401 | 认证失败 | HTTP 401 或 authorized error：按 SKILL.md 的 **## 解决认证和积分问题** 处理。 |\n| 402 | 计费失败 | HTTP 402：按 SKILL.md 的 **## 解决认证和积分问题** 处理。 |\n| 其他非 200 值 | 业务异常 | 查看 `errmsg` 获取具体原因 |\n\n> **不存在的类目 ID**：传入不存在的 `categoryId` 通常返回 `errcode:200`、`total:0`、`data:[]`（空结果）。判断\"类目无数据\"应基于 `total=0`，而非 `errcode`。\n\n错误响应示例：\n\n```json\n{\n    \"errcode\": 1002,\n    \"errmsg\": \"分页参数超出限制，请检查输入。参数 page.pageSize 最大为 20，请调小后重试。\"\n}\n```\n\n```json\n{\n    \"errcode\": 400,\n    \"errmsg\": \"categoryId 为必填参数\"\n}\n```\n\n## curl 示例\n\n```bash\ncurl -X POST https://tool-gateway.linkfox.com/seerfar/ozon/categorySearch \\\n  -H \"Authorization: $LINKFOXAGENT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"User-Agent: LinkFox-Skill/1.0\" \\\n  -d '{\n    \"categoryId\": \"15621032_15621049_115951147\",\n    \"page\": {\"page\": 1, \"pageSize\": 5, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}\n  }'\n```\n\n## 响应示例（简略）\n\n```json\n{\n  \"code\": \"200\",\n  \"msg\": \"ok\",\n  \"errcode\": 200,\n  \"errmsg\": \"ok\",\n  \"id\": \"15621032_15621049_115951147\",\n  \"total\": 5,\n  \"totalSales\": 2066,\n  \"totalRevenue\": 12973043,\n  \"avgPrice\": 7228.0,\n  \"rating\": 4.9,\n  \"seasonalityAmplitude\": \"STRONG_SEASONALITY\",\n  \"seasonalityCoef\": \"OFF_SEASON\",\n  \"startDate\": \"2026-06-01\",\n  \"endDate\": \"2026-07-01\",\n  \"hasNextPage\": true,\n  \"type\": \"productWorkbenches\",\n  \"costTime\": 1415,\n  \"costToken\": 16000,\n  \"sellerType\": {\"FBO\": 218, \"RFBS\": 528, \"FBP\": 5, \"FBS\": 240, \"OZON\": 1},\n  \"categoryInfo\": {\n    \"cnTitlePath\": \"鞋类 > 运动鞋和工作鞋 > 举重鞋\",\n    \"enTitlePath\": \"Footwear > Sports and Work Footwear > Weightlifting Shoes\",\n    \"titlePath\": \"Обувь > Спортивная и рабочая обувь > Штангетки\",\n    \"fullCategoryId\": [\"15621032\", \"15621032_15621049\", \"15621032_15621049_115951147\"],\n    \"category\": {\n      \"cnTitle\": \"举重鞋\", \"enTitle\": \"Weightlifting Shoes\", \"title\": \"Штангетки\",\n      \"level\": 3, \"crossBorderSellable\": true, \"pid\": \"15621032_15621049\",\n      \"disabled\": false, \"id\": \"15621032_15621049_115951147\"\n    }\n  },\n  \"data\": [\n    {\n      \"sku\": 1546459445,\n      \"productId\": 1546459445,\n      \"title\": \"Штангетки YOUNGS\",\n      \"price\": 6481.0,\n      \"currency\": \"₽\",\n      \"sales\": 21,\n      \"monthlySalesUnits\": 21,\n      \"revenue\": 122635.0,\n      \"monthlySalesRevenue\": 122635.0,\n      \"reviewRating\": 4.8,\n      \"rating\": 4.8,\n      \"reviewCount\": 524,\n      \"brandName\": \"YOUNGS\",\n      \"brand\": \"YOUNGS\",\n      \"sellerName\": \"YoungS shoes\",\n      \"fulfillment\": [\"FBO\"],\n      \"imageUrl\": \"https://ir.ozone.ru/s3/multimedia-1-j/wc300/7000839379.jpg\",\n      \"productUrl\": \"https://www.ozon.ru/product/1546459445\",\n      \"productPageUrl\": \"https://www.ozon.ru/product/1546459445\",\n      \"categoryInfo\": { \"...\": \"同顶层 categoryInfo\" },\n      \"sourceType\": \"ozon\",\n      \"sourceTool\": \"Seerfar-Ozon-查类目\"\n    }\n  ],\n  \"products\": [ \"...\" ],\n  \"columns\": [ { \"field\": \"sku\", \"title\": \"商品SKU\", \"cellType\": \"number\", \"sortable\": true, \"filterable\": true } ]\n}\n```\n\n> `products` 内容与 `data` 完全一致，示例中用 `\"...\"` 表示省略。`total` 为本页返回记录数（本例 5），并非类目商品总数；`hasNextPage=true` 表示还有更多页。`sellerType` 为配送方式分布（非卖家本土/跨境类型）。\n\n---\n\n## Feedback API\n\n> 该接口与上方工具接口不同，**请勿混用两个基础 URL**。\n\n- **POST** `https://skill-api.linkfox.com/api/v1/public/feedback`\n- **Content-Type:** `application/json`\n\n```json\n{\n  \"skillName\": \"linkfox-seerfar-ozon-category-search\",\n  \"sentiment\": \"POSITIVE\",\n  \"category\": \"OTHER\",\n  \"content\": \"User successfully retrieved a category's best-sellers, total sales/revenue and average price for category selection analysis.\"\n}\n```\n\n**字段说明：**\n- `skillName`：使用本 skill 的 YAML `name`\n- `sentiment`：`POSITIVE` / `NEUTRAL` / `NEGATIVE` 三选一\n- `category`：`BUG` / `COMPLAINT` / `SUGGESTION` / `OTHER` 四选一\n- `content`：用户表达、实际现象、为什么算问题或好评\n\nFile v1.0.3:skill-card.md\n\n## Description: <br>\nSeerfar Ozon Category Search retrieves product lists and category-level sales, revenue, price, rating, seasonality, brand, seller, and fulfillment metrics for a specified Ozon category ID. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[linkfox-ai](https://clawhub.ai/user/linkfox-ai) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal e-commerce operators, analysts, and developers use this skill to size an Ozon category, inspect best-selling or high-revenue products, compare price bands, and review fulfillment and seasonal signals. It is intended for category selection analysis when a category ID is already known or has been resolved by another Ozon source. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill requires a LinkFox API key and consumes LinkFox credits for Ozon category queries. <br>\nMitigation: Confirm the user is comfortable with API-key use and credit cost before running repeated queries; rely on the documented cache and avoid automatic retry or pagination loops. <br>\nRisk: The skill can automatically send feedback externally when it detects result quality or user sentiment signals. <br>\nMitigation: Review or disable feedback reporting before using sensitive task context. <br>\nRisk: The script stores complete API results locally, including category and product result data. <br>\nMitigation: Treat saved output and cache directories as sensitive working data and clean the linkfox output/cache directories after use when retention is not needed. <br>\n\n\n## Reference(s): <br>\n- [Seerfar Ozon Category Search API Reference](references/api.md) <br>\n- [ClawHub skill page](https://clawhub.ai/linkfox-ai/skills/linkfox-seerfar-ozon-category-search) <br>\n- [LinkFox skills site](https://skill.linkfox.com/) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, JSON, shell commands, guidance, files] <br>\n**Output Format:** [Markdown summaries, shell command examples, and JSON API responses saved to local files or printed to stdout.] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [The script writes complete API responses under a local linkfox session data directory, may print a compact summary for large responses, and uses a 24-hour cache for repeated parameter sets.] <br>\n\n## Skill Version(s): <br>\n1.0.3 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.0.2: 5 files, 17158 bytes\n\nFiles: references/api.md (11571b), scripts/seerfar_ozon_category_search.py (12824b), skill-card.md (2954b), SKILL.md (11799b), _meta.json (155b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: linkfox-seerfar-ozon-category-search\ndescription: Seerfar Ozon 类目商品搜索：按 Ozon 类目 ID 拉取该类目下的商品列表，返回类目级聚合（类目总销量、总销售额、平均价格、平均评分、季节性）与每个商品的销量、价格、评分、评论数、品牌、卖家、配送方式。用于类目选品分析、类目爆品挖掘、类目容量与价格带分析、季节性判断。当用户提到 Ozon 类目商品、Ozon 类目分析、Ozon 类目选品、Ozon 类目爆品、Ozon 类目总销量、Ozon 类目平均价格、Ozon category search, Ozon category products, category best-sellers, category analysis 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 类目下的商品与类目级汇总数据，也应触发此技能。\n---\n\n# Seerfar Ozon Category Search\n\nThis skill lists the products of a specific Ozon category from the Seerfar analytics database. Given a `categoryId`, it returns category-level aggregates (total sales, total revenue, average price, average rating, seasonality) plus each product's sales, price, rating, review count, brand and seller — the starting point for category selection analysis, best-seller mining within a category, and category capacity / price-band analysis.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one category**: pass a single `categoryId` and receive that category's product list with performance metrics, alongside category-level aggregates. This is a *category-level* view, not a shop or keyword view.\n\n**Where the `categoryId` comes from**: `categoryId` is the Ozon category identifier — a hierarchical path joined by `_` (e.g. `15621032_15621049_115951147`), obtained from the Ozon category document or from other Seerfar Ozon tools. If the user only has a category name, first resolve it to a `categoryId` from an upstream Seerfar Ozon source before calling this skill.\n\n**Category aggregates vs product rows**: the response carries both category-level totals (`totalSales`, `totalRevenue`, `avgPrice`, `rating`, `seasonalityAmplitude`, `seasonalityCoef`, `startDate`/`endDate`) and a paginated product list (`data` / `products`). Use the aggregates for category sizing and the rows for individual product analysis.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are units; `price` / `revenue` are in Russian rubles (₽), indicated by `currency`.\n\n**Time window**: by default the data covers the last 30 days (`startDate` / `endDate` show the actual range). Pass `date` as `yyyy-MM` (e.g. `2026-02`) to query a historical month snapshot.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| categoryId | string | yes | Ozon category ID, e.g. `15621032_15621049_115951147` (levels joined by `_`). |\n| page | object | yes | Pagination `{page, pageSize, orders[]}`. |\n| page.page | integer | no | Page number, from 1 (default 1). |\n| page.pageSize | integer | no | Page size, default 20. **Max 20** — larger values are rejected (`errcode 1002`). |\n| page.orders | array | no | Sort rules, elements `{field, direction}` (both required); `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `revenue`, `reviewRating`. |\n| date | string | no | Historical month `yyyy-MM` (e.g. `2026-02`); omit for last 30 days. |\n| fulfillment | string | no | Fulfillment filter, one of `FBO` / `FBS` / `RFBS` / `FBP` / `OZON`; omit to query all. **Single string, not an array.** |\n| uId | string | no | User ID. |\n| memberId | string | no | Member ID (data attribution). |\n\nOnly `categoryId` and `page` are required.\n\n## 调用方式\n\n- **API 端点**：`POST /seerfar/ozon/categorySearch`（完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/seerfar_ozon_category_search.py '<JSON 参数>' [--inline]`\n- **成本约束**：本工具会消耗积分；同一会话同一参数组合默认只调用一次，脚本带 24h 本地缓存。失败/空结果不得自动换关键词、翻页或改邮编连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/linkfox-seerfar-ozon-category-search-<timestamp>.json`（`<cwd>` 为脚本执行时的工作目录，在 Claude Code 里即当前项目目录；`<session>` 取自环境变量 `SESSION_ID`，按用户任务自动聚合；**禁止写入 /tmp**，当前目录不可写则报错）\n- 响应体 ≤ 8 KB：落盘后把完整 JSON 打印到 stdout\n- 响应体 > 8 KB：落盘后 stdout 只输出摘要（顶层字段、常见计数如 `total`/`costToken`、最大列表字段的长度 + 前 3 条样本）\n- 加 `--inline` 强制全量打印到 stdout（同样落盘）\n\n**读数据建议**：先看摘要判断是否足够；需要具体字段时优先用 `jq`或`ConvertFrom-Json` 从保存的 json 文件按需抽取，避免整份 JSON 进入上下文。\n\n## Usage Examples\n\n**1. Category best-sellers (sort by 30-day sales)**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**2. Category top-revenue products**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"revenue\", \"direction\": \"DESC\"}]}}\n```\n\n**3. Category premium price band (highest-priced)**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"price\", \"direction\": \"DESC\"}]}}\n```\n\n**4. Historical month snapshot**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"date\": \"2026-02\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**5. Filter to FBO-fulfilled products only**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"fulfillment\": \"FBO\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**6. Page deeper into the category**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 2, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n## How to Build Queries\n\n1. **Always pass `page.orders`**: categories can contain many products — sort by the metric you care about (`sales` DESC for best-sellers, `revenue` DESC for top revenue, `price` DESC for the premium band, `reviewRating` DESC for best-reviewed).\n2. **Keep `pageSize` ≤ 20**: the gateway caps page size at 20. Use `page.page` to paginate; check `hasNextPage` to know whether more pages exist.\n3. **Resolve the `categoryId` first**: if the user gives a category name rather than an id, obtain the `categoryId` from an upstream Seerfar Ozon source before calling this skill.\n4. **Use category aggregates for sizing**: `totalSales`, `totalRevenue`, `avgPrice` and `rating` describe the whole category at a glance — use them for capacity and price-band assessment before drilling into rows.\n5. **Use `date` for historical comparison**: pass `date` as `yyyy-MM` to compare a past month against the current 30-day window.\n6. **`fulfillment` is a single string**: pass one of `FBO` / `FBS` / `RFBS` / `FBP` / `OZON`, not an array.\n\n## Display Rules\n\n1. **Present data only**: show the category aggregates and product metrics in a clear table without subjective advice.\n2. **Lead with category context, then product columns**: state the category name (from `categoryInfo.cnTitlePath` / `enTitlePath` — confirms the right category), then `totalSales`, `totalRevenue`, `avgPrice`, `rating`, seasonality (`seasonalityAmplitude` / `seasonalityCoef`) and date range, plus the fulfillment distribution (`sellerType` map) as a one-line FBO/FBS/RFBS/... split; then a table of `sku`, `title`, `price`, `sales`, `revenue`, `reviewRating`, `reviewCount`, `brandName`, `sellerName`.\n3. **Currency**: `price` / `revenue` are in rubles (₽); render with the `currency` symbol.\n4. **Fulfillment**: `fulfillment` is an array (e.g. `[\"FBO\"]`); join multiple values with `/`.\n5. **Unified vs original fields**: `productId`/`rating`/`brand`/`monthlySalesUnits`/`monthlySalesRevenue`/`productPageUrl` mirror `sku`/`reviewRating`/`brandName`/`sales`/`revenue`/`productUrl` — show one set, prefer the originals.\n6. **Pagination guidance**: when `hasNextPage` is true, tell the user more pages are available via `page.page`; remind them `pageSize` is capped at 20.\n7. **Empty category**: a non-existent `categoryId` returns success with `total=0` and no data — tell the user the id may be wrong rather than reporting a system error.\n8. **Error handling**: when `code` is not `\"200\"` (or `errcode` is not `200`), explain the reason from `msg` / `errmsg` and suggest fixes (add `page`, lower `pageSize`, retry on rate-limit).\n\n## Important Limitations\n\n- **`categoryId` and `page` are both required**; omitting either returns `errcode 400`.\n- **`pageSize` max 20**: exceeding it returns `errcode 1002`.\n- **No text/keyword filter within a category**: this endpoint filters by category (plus optional `fulfillment` and `date`) only; to find products by keyword, use the Seerfar Ozon market keyword search skill.\n- **`total` is the page row count**, not the category's total product count — use `hasNextPage` to decide whether to fetch more pages.\n- **`sellerType` is a fulfillment distribution, not seller type**: despite the name, the top-level `sellerType` is a map of fulfillment model → product count (`{FBO, RFBS, FBP, FBS, OZON}`); it does not carry 本土/跨境 (local/cross-border) info. `categoryInfo` carries the category name path (CN/EN/RU) and `crossBorderSellable`.\n\n## User Expression & Scenario Quick Reference\n\n**Applicable** — analyzing one Ozon category's products and aggregates:\n\n| User Says | Scenario |\n|-----------|----------|\n| \"分析下这个 Ozon 类目的商品\" / \"这个类目有多大\" | Category sizing (totalSales / totalRevenue / avgPrice) |\n| \"这个类目最畅销的商品是什么\" | Best-seller mining (sort by sales) |\n| \"这个类目销售额最高的商品\" | Top-revenue products (sort by revenue) |\n| \"这个类目的价格带/客单价\" | Price-band analysis (sort by price) |\n| \"这个类目评分最高的商品\" | Best-reviewed (sort by reviewRating) |\n| \"这个类目上个月的数据\" | Historical month snapshot (date) |\n| \"这个类目 FBO 的商品\" | Fulfillment filter |\n\n**Not applicable** — Needs beyond one category's product list:\n- One shop/seller's catalog → use the Seerfar Ozon shop search skill.\n- Market-level keyword discovery → use the Seerfar Ozon market keyword search skill.\n- Keyword mining → use the Seerfar Ozon keyword mining skill.\n- A single product's full detail → use a product-level Seerfar Ozon source (this skill returns category-level fields only).\n\n**Boundary judgment**: if the user already has a `categoryId` (or one resolved from an upstream source) and wants to enumerate, rank, or size that category's products by sales/price/rating, start here. If they want a shop's catalog, keyword discovery, or a single product's deep detail, route to the corresponding Seerfar Ozon skill.\n\n**Feedback:**\n\nAuto-detect and report feedback via the Feedback API when any of the following apply:\n1. The functionality or purpose described in this skill does not match actual behavior\n2. The skill's results do not match the user's intent\n3. The user expresses dissatisfaction or praise about this skill\n4. Anything you believe could be improved\n\nCall the feedback API as specified in `references/api.md`. Do not interrupt the user's flow.\n\n---\n*For more high-quality, professional cross-border e-commerce skills, set [LinkFox Skills](https://skill.linkfox.com/).*\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-seerfar-ozon-category-search\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1783337103596\n}\n\nFile v1.0.2:references/api.md\n\n# Seerfar Ozon 类目商品搜索 API 参考\n\n## 调用规范\n\n- **请求地址**：`${LINKFOX_TOOL_GATEWAY}/seerfar/ozon/categorySearch`\n- **请求方式**：POST，Content-Type: application/json\n- **认证方式**：Header `Authorization: <api_key>`，api_key 从环境变量 `LINKFOX_AGENT_API_KEY` 或 `LINKFOXAGENT_API_KEY` 读取（如未配置，提示用户前往 https://skill.linkfox.com/linkfoxskills/guide.htm 申请）\n- **User-Agent**：`LinkFox-Skill/1.0`；HTTP 超时 60s\n\n## 请求参数\n\nPOST Body（JSON）。以下字段与接口 `inputSchema` 一致。`categoryId` 与 `page` 必填，其余可选。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| categoryId | string | 是 | Ozon 类目 ID，从 Ozon 类目文档或其他 Seerfar Ozon 工具获取。形如 `15621032_15621049_115951147`（多级类目以 `_` 连接） |\n| page | object | 是 | 分页与排序：`{page, pageSize, orders[]}` |\n| page.page | integer | 否 | 页码，从 1 开始，默认 1 |\n| page.pageSize | integer | 否 | 每页条数，默认 20，**最大 20**（超出返回 `errcode 1002`） |\n| page.orders | array | 否 | 排序规则，元素 `{field, direction}`（两者均必填）；`direction` 取 `DESC`（倒序）/ `ASC`（正序）。常用排序字段：`sales`、`price`、`revenue`、`reviewRating` |\n| date | string | 否 | 查询历史月份，格式 `yyyy-MM`（如 `2026-02`）；不传默认近 30 天 |\n| fulfillment | string | 否 | 配送方式过滤，固定可选值：`FBO`、`FBS`、`RFBS`、`FBP`、`OZON`；不传查询全部。**注意是单个字符串，不是数组** |\n| uId | string | 否 | 用户 ID（最长 1000） |\n| memberId | string | 否 | 成员 ID（一个成员唯一标识，一个用户可归属多个团队，数据归属于 memberId，最长 1000） |\n\n> **必填约束**：`categoryId` 与 `page` 均为必填；缺任意一项返回 `errcode 400`。\n> **分页上限**：`page.pageSize` 最大为 20，翻页请通过 `page.page` 递增。\n> **排序**：建议通过 `page.orders` 按核心指标排序（如 `sales` DESC 看爆品、`revenue` DESC 看高销售额、`price` DESC 看高价带），避免在无序结果中翻页。\n> **历史月份**：`date` 传 `yyyy-MM` 可查该月快照；不传则返回近 30 天数据，响应中 `startDate`/`endDate` 标明实际统计区间。\n\n## 响应结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| code | string | 返回码，`\"200\"` 表示成功（成功时返回） |\n| errcode | integer | 错误码，`200` 表示成功；业务错误时仅返回此项（成功时与 `code` 并存） |\n| msg | string | 消息；成功为 `ok` |\n| errmsg | string | 错误消息；成功为 `ok`，业务错误时为原因描述 |\n| id | string | 回显的类目 ID |\n| total | integer | **本页返回记录数**（等于当前页 `data` 条数，并非类目商品总数） |\n| totalSales | integer | 类目总销量（统计区间内） |\n| totalRevenue | number | 类目总销售额（卢布） |\n| avgPrice | number | 类目商品平均价格（卢布） |\n| rating | number | 类目商品平均评分 |\n| seasonalityAmplitude | string | 季节性强度，如 `STRONG_SEASONALITY` |\n| seasonalityCoef | string | 季节性阶段，如 `OFF_SEASON` |\n| startDate | string | 统计起始日期 |\n| endDate | string | 统计结束日期 |\n| sellerType | object | **配送方式分布**（非卖家本土/跨境类型），键为配送方式、值为该方式商品数，如 `{\"FBO\":218,\"RFBS\":528,\"FBP\":5,\"FBS\":240,\"OZON\":1}` |\n| categoryInfo | object | 类目元信息，结构见下方「categoryInfo 结构」 |\n| data | array | 类目商品列表（详见下方） |\n| products | array | 类目商品列表，内容与 `data` 完全一致 |\n| hasNextPage | boolean | 是否有下一页 |\n| columns | array | 列定义，元素含 `{field, title, cellType, sortable, filterable}` |\n| type | string | 响应展示类型 |\n| costTime | integer | 接口耗时（毫秒） |\n| costToken | integer | 消耗 Token 数量 |\n\n### data[*] / products[*] 类目商品对象字段\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| sku | integer | 商品 SKU |\n| productId | integer | 统一商品 ID，映射自 `sku` |\n| title | string | 商品标题 |\n| price | number | 商品价格（卢布） |\n| currency | string | 币种，固定 `₽` |\n| sales | integer | 商品销量 |\n| monthlySalesUnits | integer | 统一月销量，映射自 `sales` |\n| revenue | number | 商品销售额 |\n| monthlySalesRevenue | number | 统一月销售额，映射自 `revenue` |\n| reviewRating | number | 商品评分 |\n| rating | number | 统一评分，映射自 `reviewRating` |\n| reviewCount | integer | 评论数 |\n| brandName | string | 品牌名称 |\n| brand | string | 统一品牌，映射自 `brandName` |\n| sellerName | string | 卖家名称 |\n| fulfillment | array | 商品配送方式，如 `[\"FBO\"]`，可能含多个值 |\n| imageUrl | string | 商品图片链接 |\n| productUrl | string | 商品链接 |\n| productPageUrl | string | 统一商品页 URL，映射自 `productUrl` |\n| categoryInfo | object | 商品类目归属信息，结构见下方「categoryInfo 结构」 |\n| sourceType | string | 数据源，固定 `ozon` |\n| sourceTool | string | 来源工具，如 `Seerfar-Ozon-查类目` |\n\n> **统一字段 vs 原始字段**：`productId`/`rating`/`brand`/`monthlySalesUnits`/`monthlySalesRevenue`/`productPageUrl` 为后端统一映射字段，与原始 `sku`/`reviewRating`/`brandName`/`sales`/`revenue`/`productUrl` 等价；展示时二选一即可，建议用原始字段（语义更直观）。\n\n### categoryInfo 结构（顶层与每个商品均返回）\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| cnTitlePath | string | 中文类目路径，如 `鞋类 > 运动鞋和工作鞋 > 举重鞋` |\n| enTitlePath | string | 英文类目路径，如 `Footwear > Sports and Work Footwear > Weightlifting Shoes` |\n| titlePath | string | 俄文（前台）类目路径，如 `Обувь > Спортивная и рабочая обувь > Штангетки` |\n| fullCategoryId | array | 各级类目 ID 数组，如 `[\"15621032\",\"15621032_15621049\",\"15621032_15621049_115951147\"]` |\n| category | object | 末级类目对象，含 `cnTitle`/`enTitle`/`title`(俄文)/`level`/`crossBorderSellable`(是否可跨境销售)/`pid`/`disabled`/`id` |\n\n> `categoryInfo` 在顶层与每个 `data[*]` 中均返回且内容一致，可用于核对类目名称（中/英/俄）与可否跨境销售（`category.crossBorderSellable`）。\n\n## 错误码\n\n正常情况下 HTTP 状态码为 200，业务结果通过响应体区分：\n- **成功**：返回 `code:\"200\"` + `errcode:200`（`msg` / `errmsg` 均为 `ok`）。\n- **业务错误**：HTTP 仍为 200，但仅返回 `errcode`（非 200）+ `errmsg`（原因），无 `code` 字段。\n- **认证失败**：HTTP 状态码 401，响应体 `{\"errcode\":401,\"errmsg\":\"authorized error\"}`。\n\n| errcode | 含义 | 处理建议 |\n|---------|------|----------|\n| 200 | 成功 | 正常解析 `data` / `products` 字段 |\n| 400 | 参数错误 | 查看 `errmsg`；常见为缺 `categoryId`、缺 `page` |\n| 1002 | 分页参数超出限制 | `page.pageSize` 最大为 20，调小后重试 |\n| 1003 | 请求过于频繁 | 限流，稍后重试 |\n| 401 | 认证失败 | 检查请求头 `Authorization` 是否正确携带 API Key；API Key 申请方式请参考上述[调用规范](#调用规范)下的认证方式 |\n| 其他非 200 值 | 业务异常 | 查看 `errmsg` 获取具体原因 |\n\n> **不存在的类目 ID**：传入不存在的 `categoryId` 通常返回 `errcode:200`、`total:0`、`data:[]`（空结果）。判断\"类目无数据\"应基于 `total=0`，而非 `errcode`。\n\n错误响应示例：\n\n```json\n{\n    \"errcode\": 1002,\n    \"errmsg\": \"分页参数超出限制，请检查输入。参数 page.pageSize 最大为 20，请调小后重试。\"\n}\n```\n\n```json\n{\n    \"errcode\": 400,\n    \"errmsg\": \"categoryId 为必填参数\"\n}\n```\n\n## curl 示例\n\n```bash\ncurl -X POST https://tool-gateway.linkfox.com/seerfar/ozon/categorySearch \\\n  -H \"Authorization: $LINKFOXAGENT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"User-Agent: LinkFox-Skill/1.0\" \\\n  -d '{\n    \"categoryId\": \"15621032_15621049_115951147\",\n    \"page\": {\"page\": 1, \"pageSize\": 5, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}\n  }'\n```\n\n## 响应示例（简略）\n\n```json\n{\n  \"code\": \"200\",\n  \"msg\": \"ok\",\n  \"errcode\": 200,\n  \"errmsg\": \"ok\",\n  \"id\": \"15621032_15621049_115951147\",\n  \"total\": 5,\n  \"totalSales\": 2066,\n  \"totalRevenue\": 12973043,\n  \"avgPrice\": 7228.0,\n  \"rating\": 4.9,\n  \"seasonalityAmplitude\": \"STRONG_SEASONALITY\",\n  \"seasonalityCoef\": \"OFF_SEASON\",\n  \"startDate\": \"2026-06-01\",\n  \"endDate\": \"2026-07-01\",\n  \"hasNextPage\": true,\n  \"type\": \"productWorkbenches\",\n  \"costTime\": 1415,\n  \"costToken\": 16000,\n  \"sellerType\": {\"FBO\": 218, \"RFBS\": 528, \"FBP\": 5, \"FBS\": 240, \"OZON\": 1},\n  \"categoryInfo\": {\n    \"cnTitlePath\": \"鞋类 > 运动鞋和工作鞋 > 举重鞋\",\n    \"enTitlePath\": \"Footwear > Sports and Work Footwear > Weightlifting Shoes\",\n    \"titlePath\": \"Обувь > Спортивная и рабочая обувь > Штангетки\",\n    \"fullCategoryId\": [\"15621032\", \"15621032_15621049\", \"15621032_15621049_115951147\"],\n    \"category\": {\n      \"cnTitle\": \"举重鞋\", \"enTitle\": \"Weightlifting Shoes\", \"title\": \"Штангетки\",\n      \"level\": 3, \"crossBorderSellable\": true, \"pid\": \"15621032_15621049\",\n      \"disabled\": false, \"id\": \"15621032_15621049_115951147\"\n    }\n  },\n  \"data\": [\n    {\n      \"sku\": 1546459445,\n      \"productId\": 1546459445,\n      \"title\": \"Штангетки YOUNGS\",\n      \"price\": 6481.0,\n      \"currency\": \"₽\",\n      \"sales\": 21,\n      \"monthlySalesUnits\": 21,\n      \"revenue\": 122635.0,\n      \"monthlySalesRevenue\": 122635.0,\n      \"reviewRating\": 4.8,\n      \"rating\": 4.8,\n      \"reviewCount\": 524,\n      \"brandName\": \"YOUNGS\",\n      \"brand\": \"YOUNGS\",\n      \"sellerName\": \"YoungS shoes\",\n      \"fulfillment\": [\"FBO\"],\n      \"imageUrl\": \"https://ir.ozone.ru/s3/multimedia-1-j/wc300/7000839379.jpg\",\n      \"productUrl\": \"https://www.ozon.ru/product/1546459445\",\n      \"productPageUrl\": \"https://www.ozon.ru/product/1546459445\",\n      \"categoryInfo\": { \"...\": \"同顶层 categoryInfo\" },\n      \"sourceType\": \"ozon\",\n      \"sourceTool\": \"Seerfar-Ozon-查类目\"\n    }\n  ],\n  \"products\": [ \"...\" ],\n  \"columns\": [ { \"field\": \"sku\", \"title\": \"商品SKU\", \"cellType\": \"number\", \"sortable\": true, \"filterable\": true } ]\n}\n```\n\n> `products` 内容与 `data` 完全一致，示例中用 `\"...\"` 表示省略。`total` 为本页返回记录数（本例 5），并非类目商品总数；`hasNextPage=true` 表示还有更多页。`sellerType` 为配送方式分布（非卖家本土/跨境类型）。\n\n---\n\n## Feedback API\n\n> 该接口与上方工具接口不同，**请勿混用两个基础 URL**。\n\n- **POST** `https://skill-api.linkfox.com/api/v1/public/feedback`\n- **Content-Type:** `application/json`\n\n```json\n{\n  \"skillName\": \"linkfox-seerfar-ozon-category-search\",\n  \"sentiment\": \"POSITIVE\",\n  \"category\": \"OTHER\",\n  \"content\": \"User successfully retrieved a category's best-sellers, total sales/revenue and average price for category selection analysis.\"\n}\n```\n\n**字段说明：**\n- `skillName`：使用本 skill 的 YAML `name`\n- `sentiment`：`POSITIVE` / `NEUTRAL` / `NEGATIVE` 三选一\n- `category`：`BUG` / `COMPLAINT` / `SUGGESTION` / `OTHER` 四选一\n- `content`：用户表达、实际现象、为什么算问题或好评\n\nFile v1.0.2:skill-card.md\n\n## Description: <br>\nSeerfar-Ozon类目搜索 retrieves product lists for a specified Ozon category and summarizes category sales, revenue, pricing, ratings, seasonality, brands, sellers, and fulfillment data for category analysis. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[linkfox-ai](https://clawhub.ai/user/linkfox-ai) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal sellers, marketplace analysts, and agent operators use this skill to inspect a single Ozon category, rank products by sales, revenue, price, or rating, and understand category capacity and price bands. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill requires a LinkFox API key and sends category-search requests to LinkFox services. <br>\nMitigation: Use it only in trusted environments with an approved LinkFox key and with user consent to send the requested Ozon category parameters to the service. <br>\nRisk: Full Ozon API responses are stored locally and may include product, seller, pricing, sales, and response metadata. <br>\nMitigation: Treat saved JSON files as potentially sensitive operational data; review retention, sharing, and cleanup practices before deployment. <br>\nRisk: The artifact instructs automatic feedback reporting when results or user reactions indicate a problem or improvement. <br>\nMitigation: Review or disable the feedback instruction for privacy-sensitive workflows or deployments where unsolicited reporting is not allowed. <br>\nRisk: Security evidence says saved data may land outside the project directory if the preferred path is not writable. <br>\nMitigation: Run the skill from a writable project workspace and verify the configured output directory before processing sensitive queries. <br>\n\n\n## Reference(s): <br>\n- [Seerfar Ozon Category Search API Reference](references/api.md) <br>\n- [ClawHub Skill Page](https://clawhub.ai/linkfox-ai/skills/linkfox-seerfar-ozon-category-search) <br>\n- [LinkFox API Key Guide](https://skill.linkfox.com/linkfoxskills/guide.htm) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown summaries and tables, shell command examples, and JSON API responses or saved JSON files] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Uses paginated Ozon category queries, writes complete responses to local JSON files, summarizes large responses, and maintains a 24-hour local cache for repeated parameter sets.] <br>\n\n## Skill Version(s): <br>\n1.0.2 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.0.1: 4 files, 15656 bytes\n\nFiles: references/api.md (11571b), scripts/seerfar_ozon_category_search.py (12824b), SKILL.md (11799b), _meta.json (155b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: linkfox-seerfar-ozon-category-search\ndescription: Seerfar Ozon 类目商品搜索：按 Ozon 类目 ID 拉取该类目下的商品列表，返回类目级聚合（类目总销量、总销售额、平均价格、平均评分、季节性）与每个商品的销量、价格、评分、评论数、品牌、卖家、配送方式。用于类目选品分析、类目爆品挖掘、类目容量与价格带分析、季节性判断。当用户提到 Ozon 类目商品、Ozon 类目分析、Ozon 类目选品、Ozon 类目爆品、Ozon 类目总销量、Ozon 类目平均价格、Ozon category search, Ozon category products, category best-sellers, category analysis 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 类目下的商品与类目级汇总数据，也应触发此技能。\n---\n\n# Seerfar Ozon Category Search\n\nThis skill lists the products of a specific Ozon category from the Seerfar analytics database. Given a `categoryId`, it returns category-level aggregates (total sales, total revenue, average price, average rating, seasonality) plus each product's sales, price, rating, review count, brand and seller — the starting point for category selection analysis, best-seller mining within a category, and category capacity / price-band analysis.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one category**: pass a single `categoryId` and receive that category's product list with performance metrics, alongside category-level aggregates. This is a *category-level* view, not a shop or keyword view.\n\n**Where the `categoryId` comes from**: `categoryId` is the Ozon category identifier — a hierarchical path joined by `_` (e.g. `15621032_15621049_115951147`), obtained from the Ozon category document or from other Seerfar Ozon tools. If the user only has a category name, first resolve it to a `categoryId` from an upstream Seerfar Ozon source before calling this skill.\n\n**Category aggregates vs product rows**: the response carries both category-level totals (`totalSales`, `totalRevenue`, `avgPrice`, `rating`, `seasonalityAmplitude`, `seasonalityCoef`, `startDate`/`endDate`) and a paginated product list (`data` / `products`). Use the aggregates for category sizing and the rows for individual product analysis.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are units; `price` / `revenue` are in Russian rubles (₽), indicated by `currency`.\n\n**Time window**: by default the data covers the last 30 days (`startDate` / `endDate` show the actual range). Pass `date` as `yyyy-MM` (e.g. `2026-02`) to query a historical month snapshot.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| categoryId | string | yes | Ozon category ID, e.g. `15621032_15621049_115951147` (levels joined by `_`). |\n| page | object | yes | Pagination `{page, pageSize, orders[]}`. |\n| page.page | integer | no | Page number, from 1 (default 1). |\n| page.pageSize | integer | no | Page size, default 20. **Max 20** — larger values are rejected (`errcode 1002`). |\n| page.orders | array | no | Sort rules, elements `{field, direction}` (both required); `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `revenue`, `reviewRating`. |\n| date | string | no | Historical month `yyyy-MM` (e.g. `2026-02`); omit for last 30 days. |\n| fulfillment | string | no | Fulfillment filter, one of `FBO` / `FBS` / `RFBS` / `FBP` / `OZON`; omit to query all. **Single string, not an array.** |\n| uId | string | no | User ID. |\n| memberId | string | no | Member ID (data attribution). |\n\nOnly `categoryId` and `page` are required.\n\n## 调用方式\n\n- **API 端点**：`POST /seerfar/ozon/categorySearch`（完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/seerfar_ozon_category_search.py '<JSON 参数>' [--inline]`\n- **成本约束**：本工具会消耗积分；同一会话同一参数组合默认只调用一次，脚本带 24h 本地缓存。失败/空结果不得自动换关键词、翻页或改邮编连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/linkfox-seerfar-ozon-category-search-<timestamp>.json`（`<cwd>` 为脚本执行时的工作目录，在 Claude Code 里即当前项目目录；`<session>` 取自环境变量 `SESSION_ID`，按用户任务自动聚合；**禁止写入 /tmp**，当前目录不可写则报错）\n- 响应体 ≤ 8 KB：落盘后把完整 JSON 打印到 stdout\n- 响应体 > 8 KB：落盘后 stdout 只输出摘要（顶层字段、常见计数如 `total`/`costToken`、最大列表字段的长度 + 前 3 条样本）\n- 加 `--inline` 强制全量打印到 stdout（同样落盘）\n\n**读数据建议**：先看摘要判断是否足够；需要具体字段时优先用 `jq`或`ConvertFrom-Json` 从保存的 json 文件按需抽取，避免整份 JSON 进入上下文。\n\n## Usage Examples\n\n**1. Category best-sellers (sort by 30-day sales)**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**2. Category top-revenue products**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"revenue\", \"direction\": \"DESC\"}]}}\n```\n\n**3. Category premium price band (highest-priced)**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"price\", \"direction\": \"DESC\"}]}}\n```\n\n**4. Historical month snapshot**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"date\": \"2026-02\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**5. Filter to FBO-fulfilled products only**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"fulfillment\": \"FBO\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**6. Page deeper into the category**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 2, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n## How to Build Queries\n\n1. **Always pass `page.orders`**: categories can contain many products — sort by the metric you care about (`sales` DESC for best-sellers, `revenue` DESC for top revenue, `price` DESC for the premium band, `reviewRating` DESC for best-reviewed).\n2. **Keep `pageSize` ≤ 20**: the gateway caps page size at 20. Use `page.page` to paginate; check `hasNextPage` to know whether more pages exist.\n3. **Resolve the `categoryId` first**: if the user gives a category name rather than an id, obtain the `categoryId` from an upstream Seerfar Ozon source before calling this skill.\n4. **Use category aggregates for sizing**: `totalSales`, `totalRevenue`, `avgPrice` and `rating` describe the whole category at a glance — use them for capacity and price-band assessment before drilling into rows.\n5. **Use `date` for historical comparison**: pass `date` as `yyyy-MM` to compare a past month against the current 30-day window.\n6. **`fulfillment` is a single string**: pass one of `FBO` / `FBS` / `RFBS` / `FBP` / `OZON`, not an array.\n\n## Display Rules\n\n1. **Present data only**: show the category aggregates and product metrics in a clear table without subjective advice.\n2. **Lead with category context, then product columns**: state the category name (from `categoryInfo.cnTitlePath` / `enTitlePath` — confirms the right category), then `totalSales`, `totalRevenue`, `avgPrice`, `rating`, seasonality (`seasonalityAmplitude` / `seasonalityCoef`) and date range, plus the fulfillment distribution (`sellerType` map) as a one-line FBO/FBS/RFBS/... split; then a table of `sku`, `title`, `price`, `sales`, `revenue`, `reviewRating`, `reviewCount`, `brandName`, `sellerName`.\n3. **Currency**: `price` / `revenue` are in rubles (₽); render with the `currency` symbol.\n4. **Fulfillment**: `fulfillment` is an array (e.g. `[\"FBO\"]`); join multiple values with `/`.\n5. **Unified vs original fields**: `productId`/`rating`/`brand`/`monthlySalesUnits`/`monthlySalesRevenue`/`productPageUrl` mirror `sku`/`reviewRating`/`brandName`/`sales`/`revenue`/`productUrl` — show one set, prefer the originals.\n6. **Pagination guidance**: when `hasNextPage` is true, tell the user more pages are available via `page.page`; remind them `pageSize` is capped at 20.\n7. **Empty category**: a non-existent `categoryId` returns success with `total=0` and no data — tell the user the id may be wrong rather than reporting a system error.\n8. **Error handling**: when `code` is not `\"200\"` (or `errcode` is not `200`), explain the reason from `msg` / `errmsg` and suggest fixes (add `page`, lower `pageSize`, retry on rate-limit).\n\n## Important Limitations\n\n- **`categoryId` and `page` are both required**; omitting either returns `errcode 400`.\n- **`pageSize` max 20**: exceeding it returns `errcode 1002`.\n- **No text/keyword filter within a category**: this endpoint filters by category (plus optional `fulfillment` and `date`) only; to find products by keyword, use the Seerfar Ozon market keyword search skill.\n- **`total` is the page row count**, not the category's total product count — use `hasNextPage` to decide whether to fetch more pages.\n- **`sellerType` is a fulfillment distribution, not seller type**: despite the name, the top-level `sellerType` is a map of fulfillment model → product count (`{FBO, RFBS, FBP, FBS, OZON}`); it does not carry 本土/跨境 (local/cross-border) info. `categoryInfo` carries the category name path (CN/EN/RU) and `crossBorderSellable`.\n\n## User Expression & Scenario Quick Reference\n\n**Applicable** — analyzing one Ozon category's products and aggregates:\n\n| User Says | Scenario |\n|-----------|----------|\n| \"分析下这个 Ozon 类目的商品\" / \"这个类目有多大\" | Category sizing (totalSales / totalRevenue / avgPrice) |\n| \"这个类目最畅销的商品是什么\" | Best-seller mining (sort by sales) |\n| \"这个类目销售额最高的商品\" | Top-revenue products (sort by revenue) |\n| \"这个类目的价格带/客单价\" | Price-band analysis (sort by price) |\n| \"这个类目评分最高的商品\" | Best-reviewed (sort by reviewRating) |\n| \"这个类目上个月的数据\" | Historical month snapshot (date) |\n| \"这个类目 FBO 的商品\" | Fulfillment filter |\n\n**Not applicable** — Needs beyond one category's product list:\n- One shop/seller's catalog → use the Seerfar Ozon shop search skill.\n- Market-level keyword discovery → use the Seerfar Ozon market keyword search skill.\n- Keyword mining → use the Seerfar Ozon keyword mining skill.\n- A single product's full detail → use a product-level Seerfar Ozon source (this skill returns category-level fields only).\n\n**Boundary judgment**: if the user already has a `categoryId` (or one resolved from an upstream source) and wants to enumerate, rank, or size that category's products by sales/price/rating, start here. If they want a shop's catalog, keyword discovery, or a single product's deep detail, route to the corresponding Seerfar Ozon skill.\n\n**Feedback:**\n\nAuto-detect and report feedback via the Feedback API when any of the following apply:\n1. The functionality or purpose described in this skill does not match actual behavior\n2. The skill's results do not match the user's intent\n3. The user expresses dissatisfaction or praise about this skill\n4. Anything you believe could be improved\n\nCall the feedback API as specified in `references/api.md`. Do not interrupt the user's flow.\n\n---\n*For more high-quality, professional cross-border e-commerce skills, set [LinkFox Skills](https://skill.linkfox.com/).*\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-seerfar-ozon-category-search\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1783067012883\n}\n\nFile v1.0.1:references/api.md\n\n# Seerfar Ozon 类目商品搜索 API 参考\n\n## 调用规范\n\n- **请求地址**：`${LINKFOX_TOOL_GATEWAY}/seerfar/ozon/categorySearch`\n- **请求方式**：POST，Content-Type: application/json\n- **认证方式**：Header `Authorization: <api_key>`，api_key 从环境变量 `LINKFOX_AGENT_API_KEY` 或 `LINKFOXAGENT_API_KEY` 读取（如未配置，提示用户前往 https://skill.linkfox.com/linkfoxskills/guide.htm 申请）\n- **User-Agent**：`LinkFox-Skill/1.0`；HTTP 超时 60s\n\n## 请求参数\n\nPOST Body（JSON）。以下字段与接口 `inputSchema` 一致。`categoryId` 与 `page` 必填，其余可选。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| categoryId | string | 是 | Ozon 类目 ID，从 Ozon 类目文档或其他 Seerfar Ozon 工具获取。形如 `15621032_15621049_115951147`（多级类目以 `_` 连接） |\n| page | object | 是 | 分页与排序：`{page, pageSize, orders[]}` |\n| page.page | integer | 否 | 页码，从 1 开始，默认 1 |\n| page.pageSize | integer | 否 | 每页条数，默认 20，**最大 20**（超出返回 `errcode 1002`） |\n| page.orders | array | 否 | 排序规则，元素 `{field, direction}`（两者均必填）；`direction` 取 `DESC`（倒序）/ `ASC`（正序）。常用排序字段：`sales`、`price`、`revenue`、`reviewRating` |\n| date | string | 否 | 查询历史月份，格式 `yyyy-MM`（如 `2026-02`）；不传默认近 30 天 |\n| fulfillment | string | 否 | 配送方式过滤，固定可选值：`FBO`、`FBS`、`RFBS`、`FBP`、`OZON`；不传查询全部。**注意是单个字符串，不是数组** |\n| uId | string | 否 | 用户 ID（最长 1000） |\n| memberId | string | 否 | 成员 ID（一个成员唯一标识，一个用户可归属多个团队，数据归属于 memberId，最长 1000） |\n\n> **必填约束**：`categoryId` 与 `page` 均为必填；缺任意一项返回 `errcode 400`。\n> **分页上限**：`page.pageSize` 最大为 20，翻页请通过 `page.page` 递增。\n> **排序**：建议通过 `page.orders` 按核心指标排序（如 `sales` DESC 看爆品、`revenue` DESC 看高销售额、`price` DESC 看高价带），避免在无序结果中翻页。\n> **历史月份**：`date` 传 `yyyy-MM` 可查该月快照；不传则返回近 30 天数据，响应中 `startDate`/`endDate` 标明实际统计区间。\n\n## 响应结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| code | string | 返回码，`\"200\"` 表示成功（成功时返回） |\n| errcode | integer | 错误码，`200` 表示成功；业务错误时仅返回此项（成功时与 `code` 并存） |\n| msg | string | 消息；成功为 `ok` |\n| errmsg | string | 错误消息；成功为 `ok`，业务错误时为原因描述 |\n| id | string | 回显的类目 ID |\n| total | integer | **本页返回记录数**（等于当前页 `data` 条数，并非类目商品总数） |\n| totalSales | integer | 类目总销量（统计区间内） |\n| totalRevenue | number | 类目总销售额（卢布） |\n| avgPrice | number | 类目商品平均价格（卢布） |\n| rating | number | 类目商品平均评分 |\n| seasonalityAmplitude | string | 季节性强度，如 `STRONG_SEASONALITY` |\n| seasonalityCoef | string | 季节性阶段，如 `OFF_SEASON` |\n| startDate | string | 统计起始日期 |\n| endDate | string | 统计结束日期 |\n| sellerType | object | **配送方式分布**（非卖家本土/跨境类型），键为配送方式、值为该方式商品数，如 `{\"FBO\":218,\"RFBS\":528,\"FBP\":5,\"FBS\":240,\"OZON\":1}` |\n| categoryInfo | object | 类目元信息，结构见下方「categoryInfo 结构」 |\n| data | array | 类目商品列表（详见下方） |\n| products | array | 类目商品列表，内容与 `data` 完全一致 |\n| hasNextPage | boolean | 是否有下一页 |\n| columns | array | 列定义，元素含 `{field, title, cellType, sortable, filterable}` |\n| type | string | 响应展示类型 |\n| costTime | integer | 接口耗时（毫秒） |\n| costToken | integer | 消耗 Token 数量 |\n\n### data[*] / products[*] 类目商品对象字段\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| sku | integer | 商品 SKU |\n| productId | integer | 统一商品 ID，映射自 `sku` |\n| title | string | 商品标题 |\n| price | number | 商品价格（卢布） |\n| currency | string | 币种，固定 `₽` |\n| sales | integer | 商品销量 |\n| monthlySalesUnits | integer | 统一月销量，映射自 `sales` |\n| revenue | number | 商品销售额 |\n| monthlySalesRevenue | number | 统一月销售额，映射自 `revenue` |\n| reviewRating | number | 商品评分 |\n| rating | number | 统一评分，映射自 `reviewRating` |\n| reviewCount | integer | 评论数 |\n| brandName | string | 品牌名称 |\n| brand | string | 统一品牌，映射自 `brandName` |\n| sellerName | string | 卖家名称 |\n| fulfillment | array | 商品配送方式，如 `[\"FBO\"]`，可能含多个值 |\n| imageUrl | string | 商品图片链接 |\n| productUrl | string | 商品链接 |\n| productPageUrl | string | 统一商品页 URL，映射自 `productUrl` |\n| categoryInfo | object | 商品类目归属信息，结构见下方「categoryInfo 结构」 |\n| sourceType | string | 数据源，固定 `ozon` |\n| sourceTool | string | 来源工具，如 `Seerfar-Ozon-查类目` |\n\n> **统一字段 vs 原始字段**：`productId`/`rating`/`brand`/`monthlySalesUnits`/`monthlySalesRevenue`/`productPageUrl` 为后端统一映射字段，与原始 `sku`/`reviewRating`/`brandName`/`sales`/`revenue`/`productUrl` 等价；展示时二选一即可，建议用原始字段（语义更直观）。\n\n### categoryInfo 结构（顶层与每个商品均返回）\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| cnTitlePath | string | 中文类目路径，如 `鞋类 > 运动鞋和工作鞋 > 举重鞋` |\n| enTitlePath | string | 英文类目路径，如 `Footwear > Sports and Work Footwear > Weightlifting Shoes` |\n| titlePath | string | 俄文（前台）类目路径，如 `Обувь > Спортивная и рабочая обувь > Штангетки` |\n| fullCategoryId | array | 各级类目 ID 数组，如 `[\"15621032\",\"15621032_15621049\",\"15621032_15621049_115951147\"]` |\n| category | object | 末级类目对象，含 `cnTitle`/`enTitle`/`title`(俄文)/`level`/`crossBorderSellable`(是否可跨境销售)/`pid`/`disabled`/`id` |\n\n> `categoryInfo` 在顶层与每个 `data[*]` 中均返回且内容一致，可用于核对类目名称（中/英/俄）与可否跨境销售（`category.crossBorderSellable`）。\n\n## 错误码\n\n正常情况下 HTTP 状态码为 200，业务结果通过响应体区分：\n- **成功**：返回 `code:\"200\"` + `errcode:200`（`msg` / `errmsg` 均为 `ok`）。\n- **业务错误**：HTTP 仍为 200，但仅返回 `errcode`（非 200）+ `errmsg`（原因），无 `code` 字段。\n- **认证失败**：HTTP 状态码 401，响应体 `{\"errcode\":401,\"errmsg\":\"authorized error\"}`。\n\n| errcode | 含义 | 处理建议 |\n|---------|------|----------|\n| 200 | 成功 | 正常解析 `data` / `products` 字段 |\n| 400 | 参数错误 | 查看 `errmsg`；常见为缺 `categoryId`、缺 `page` |\n| 1002 | 分页参数超出限制 | `page.pageSize` 最大为 20，调小后重试 |\n| 1003 | 请求过于频繁 | 限流，稍后重试 |\n| 401 | 认证失败 | 检查请求头 `Authorization` 是否正确携带 API Key；API Key 申请方式请参考上述[调用规范](#调用规范)下的认证方式 |\n| 其他非 200 值 | 业务异常 | 查看 `errmsg` 获取具体原因 |\n\n> **不存在的类目 ID**：传入不存在的 `categoryId` 通常返回 `errcode:200`、`total:0`、`data:[]`（空结果）。判断\"类目无数据\"应基于 `total=0`，而非 `errcode`。\n\n错误响应示例：\n\n```json\n{\n    \"errcode\": 1002,\n    \"errmsg\": \"分页参数超出限制，请检查输入。参数 page.pageSize 最大为 20，请调小后重试。\"\n}\n```\n\n```json\n{\n    \"errcode\": 400,\n    \"errmsg\": \"categoryId 为必填参数\"\n}\n```\n\n## curl 示例\n\n```bash\ncurl -X POST https://tool-gateway.linkfox.com/seerfar/ozon/categorySearch \\\n  -H \"Authorization: $LINKFOXAGENT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"User-Agent: LinkFox-Skill/1.0\" \\\n  -d '{\n    \"categoryId\": \"15621032_15621049_115951147\",\n    \"page\": {\"page\": 1, \"pageSize\": 5, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}\n  }'\n```\n\n## 响应示例（简略）\n\n```json\n{\n  \"code\": \"200\",\n  \"msg\": \"ok\",\n  \"errcode\": 200,\n  \"errmsg\": \"ok\",\n  \"id\": \"15621032_15621049_115951147\",\n  \"total\": 5,\n  \"totalSales\": 2066,\n  \"totalRevenue\": 12973043,\n  \"avgPrice\": 7228.0,\n  \"rating\": 4.9,\n  \"seasonalityAmplitude\": \"STRONG_SEASONALITY\",\n  \"seasonalityCoef\": \"OFF_SEASON\",\n  \"startDate\": \"2026-06-01\",\n  \"endDate\": \"2026-07-01\",\n  \"hasNextPage\": true,\n  \"type\": \"productWorkbenches\",\n  \"costTime\": 1415,\n  \"costToken\": 16000,\n  \"sellerType\": {\"FBO\": 218, \"RFBS\": 528, \"FBP\": 5, \"FBS\": 240, \"OZON\": 1},\n  \"categoryInfo\": {\n    \"cnTitlePath\": \"鞋类 > 运动鞋和工作鞋 > 举重鞋\",\n    \"enTitlePath\": \"Footwear > Sports and Work Footwear > Weightlifting Shoes\",\n    \"titlePath\": \"Обувь > Спортивная и рабочая обувь > Штангетки\",\n    \"fullCategoryId\": [\"15621032\", \"15621032_15621049\", \"15621032_15621049_115951147\"],\n    \"category\": {\n      \"cnTitle\": \"举重鞋\", \"enTitle\": \"Weightlifting Shoes\", \"title\": \"Штангетки\",\n      \"level\": 3, \"crossBorderSellable\": true, \"pid\": \"15621032_15621049\",\n      \"disabled\": false, \"id\": \"15621032_15621049_115951147\"\n    }\n  },\n  \"data\": [\n    {\n      \"sku\": 1546459445,\n      \"productId\": 1546459445,\n      \"title\": \"Штангетки YOUNGS\",\n      \"price\": 6481.0,\n      \"currency\": \"₽\",\n      \"sales\": 21,\n      \"monthlySalesUnits\": 21,\n      \"revenue\": 122635.0,\n      \"monthlySalesRevenue\": 122635.0,\n      \"reviewRating\": 4.8,\n      \"rating\": 4.8,\n      \"reviewCount\": 524,\n      \"brandName\": \"YOUNGS\",\n      \"brand\": \"YOUNGS\",\n      \"sellerName\": \"YoungS shoes\",\n      \"fulfillment\": [\"FBO\"],\n      \"imageUrl\": \"https://ir.ozone.ru/s3/multimedia-1-j/wc300/7000839379.jpg\",\n      \"productUrl\": \"https://www.ozon.ru/product/1546459445\",\n      \"productPageUrl\": \"https://www.ozon.ru/product/1546459445\",\n      \"categoryInfo\": { \"...\": \"同顶层 categoryInfo\" },\n      \"sourceType\": \"ozon\",\n      \"sourceTool\": \"Seerfar-Ozon-查类目\"\n    }\n  ],\n  \"products\": [ \"...\" ],\n  \"columns\": [ { \"field\": \"sku\", \"title\": \"商品SKU\", \"cellType\": \"number\", \"sortable\": true, \"filterable\": true } ]\n}\n```\n\n> `products` 内容与 `data` 完全一致，示例中用 `\"...\"` 表示省略。`total` 为本页返回记录数（本例 5），并非类目商品总数；`hasNextPage=true` 表示还有更多页。`sellerType` 为配送方式分布（非卖家本土/跨境类型）。\n\n---\n\n## Feedback API\n\n> 该接口与上方工具接口不同，**请勿混用两个基础 URL**。\n\n- **POST** `https://skill-api.linkfox.com/api/v1/public/feedback`\n- **Content-Type:** `application/json`\n\n```json\n{\n  \"skillName\": \"linkfox-seerfar-ozon-category-search\",\n  \"sentiment\": \"POSITIVE\",\n  \"category\": \"OTHER\",\n  \"content\": \"User successfully retrieved a category's best-sellers, total sales/revenue and average price for category selection analysis.\"\n}\n```\n\n**字段说明：**\n- `skillName`：使用本 skill 的 YAML `name`\n- `sentiment`：`POSITIVE` / `NEUTRAL` / `NEGATIVE` 三选一\n- `category`：`BUG` / `COMPLAINT` / `SUGGESTION` / `OTHER` 四选一\n- `content`：用户表达、实际现象、为什么算问题或好评\n\nArchive v1.0.0: 5 files, 16992 bytes\n\nFiles: references/api.md (11572b), scripts/seerfar_ozon_category_search.py (12826b), skill-card.md (2602b), SKILL.md (11799b), _meta.json (155b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: linkfox-seerfar-ozon-category-search\ndescription: Seerfar Ozon 类目商品搜索：按 Ozon 类目 ID 拉取该类目下的商品列表，返回类目级聚合（类目总销量、总销售额、平均价格、平均评分、季节性）与每个商品的销量、价格、评分、评论数、品牌、卖家、配送方式。用于类目选品分析、类目爆品挖掘、类目容量与价格带分析、季节性判断。当用户提到 Ozon 类目商品、Ozon 类目分析、Ozon 类目选品、Ozon 类目爆品、Ozon 类目总销量、Ozon 类目平均价格、Ozon category search, Ozon category products, category best-sellers, category analysis 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 类目下的商品与类目级汇总数据，也应触发此技能。\n---\n\n# Seerfar Ozon Category Search\n\nThis skill lists the products of a specific Ozon category from the Seerfar analytics database. Given a `categoryId`, it returns category-level aggregates (total sales, total revenue, average price, average rating, seasonality) plus each product's sales, price, rating, review count, brand and seller — the starting point for category selection analysis, best-seller mining within a category, and category capacity / price-band analysis.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one category**: pass a single `categoryId` and receive that category's product list with performance metrics, alongside category-level aggregates. This is a *category-level* view, not a shop or keyword view.\n\n**Where the `categoryId` comes from**: `categoryId` is the Ozon category identifier — a hierarchical path joined by `_` (e.g. `15621032_15621049_115951147`), obtained from the Ozon category document or from other Seerfar Ozon tools. If the user only has a category name, first resolve it to a `categoryId` from an upstream Seerfar Ozon source before calling this skill.\n\n**Category aggregates vs product rows**: the response carries both category-level totals (`totalSales`, `totalRevenue`, `avgPrice`, `rating`, `seasonalityAmplitude`, `seasonalityCoef`, `startDate`/`endDate`) and a paginated product list (`data` / `products`). Use the aggregates for category sizing and the rows for individual product analysis.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are units; `price` / `revenue` are in Russian rubles (₽), indicated by `currency`.\n\n**Time window**: by default the data covers the last 30 days (`startDate` / `endDate` show the actual range). Pass `date` as `yyyy-MM` (e.g. `2026-02`) to query a historical month snapshot.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| categoryId | string | yes | Ozon category ID, e.g. `15621032_15621049_115951147` (levels joined by `_`). |\n| page | object | yes | Pagination `{page, pageSize, orders[]}`. |\n| page.page | integer | no | Page number, from 1 (default 1). |\n| page.pageSize | integer | no | Page size, default 20. **Max 20** — larger values are rejected (`errcode 1002`). |\n| page.orders | array | no | Sort rules, elements `{field, direction}` (both required); `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `revenue`, `reviewRating`. |\n| date | string | no | Historical month `yyyy-MM` (e.g. `2026-02`); omit for last 30 days. |\n| fulfillment | string | no | Fulfillment filter, one of `FBO` / `FBS` / `RFBS` / `FBP` / `OZON`; omit to query all. **Single string, not an array.** |\n| uId | string | no | User ID. |\n| memberId | string | no | Member ID (data attribution). |\n\nOnly `categoryId` and `page` are required.\n\n## 调用方式\n\n- **API 端点**：`POST /seerfar/ozon/categorySearch`（完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/seerfar_ozon_category_search.py '<JSON 参数>' [--inline]`\n- **成本约束**：本工具会消耗积分；同一会话同一参数组合默认只调用一次，脚本带 24h 本地缓存。失败/空结果不得自动换关键词、翻页或改邮编连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/linkfox-seerfar-ozon-category-search-<timestamp>.json`（`<cwd>` 为脚本执行时的工作目录，在 Claude Code 里即当前项目目录；`<session>` 取自环境变量 `SESSION_ID`，按用户任务自动聚合；**禁止写入 /tmp**，当前目录不可写则报错）\n- 响应体 ≤ 8 KB：落盘后把完整 JSON 打印到 stdout\n- 响应体 > 8 KB：落盘后 stdout 只输出摘要（顶层字段、常见计数如 `total`/`costToken`、最大列表字段的长度 + 前 3 条样本）\n- 加 `--inline` 强制全量打印到 stdout（同样落盘）\n\n**读数据建议**：先看摘要判断是否足够；需要具体字段时优先用 `jq`或`ConvertFrom-Json` 从保存的 json 文件按需抽取，避免整份 JSON 进入上下文。\n\n## Usage Examples\n\n**1. Category best-sellers (sort by 30-day sales)**\n```json\n{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**2. Category top","readmeExcerpt":"Skill: Seerfar-Ozon类目搜索 Owner: linkfox-ai Summary: Seerfar Ozon 类目商品搜索：按 Ozon 类目 ID 拉取该类目下的商品列表，返回类目级聚合（类目总销量、总销售额、平均价格、平均评分、季节性）与每个商品的销量、价格、评分、评论数、品牌、卖家、配送方式。用于类目选品分析、类目爆品挖掘、类目容量与价格带分析、季节性判断。当用户提到 Ozon 类目商品、Ozon 类目分析、Ozon 类目选品、Ozon 类目爆品、Ozon 类目总销量、Ozon 类目平均价格、Ozon category search, Ozon category products, category best-sellers, category analysis 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 类目下的商品与类目级汇总数据，也应触发此技能。 Tags: l","codeSnippets":[],"executableExamples":[{"language":"json","snippet":"{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}"},{"language":"json","snippet":"{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"revenue\", \"direction\": \"DESC\"}]}}"},{"language":"json","snippet":"{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"price\", \"direction\": \"DESC\"}]}}"},{"language":"json","snippet":"{\"categoryId\": \"15621032_15621049_115951147\", \"date\": \"2026-02\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}"},{"language":"json","snippet":"{\"categoryId\": \"15621032_15621049_115951147\", \"fulfillment\": \"FBO\", \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}"},{"language":"json","snippet":"{\"categoryId\": \"15621032_15621049_115951147\", \"page\": {\"page\": 2, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: linkfox-seerfar-ozon-category-search\ndescription: Seerfar Ozon 类目商品搜索：按 Ozon 类目 ID 拉取该类目下的商品列表，返回类目级聚合（类目总销量、总销售额、平均价格、平均评分、季节性）与每个商品的销量、价格、评分、评论数、品牌、卖家、配送方式。用于类目选品分析、类目爆品挖掘、类目容量与价格带分析、季节性判断。当用户提到 Ozon 类目商品、Ozon 类目分析、Ozon 类目选品、Ozon 类目爆品、Ozon 类目总销量、Ozon 类目平均价格、Ozon category search, Ozon category products, category best-sellers, category analysis 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 类目下的商品与类目级汇总数据，也应触发此技能。\n---\n\n# Seerfar Ozon Category Search\n\nThis skill lists the products of a specific Ozon category from the Seerfar analytics database. Given a `categoryId`, it returns category-level aggregates (total sales, total revenue, average price, average rating, seasonality) plus each product's sales, price, rating, review count, brand and seller — the starting point for category selection analysis, best-seller mining within a category, and category capacity / price-band analysis.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one category**: pass a single `categoryId` and receive that category's product list with performance metrics, alongside category-level aggregates. This is a *category-level* view, not a shop or keyword view.\n\n**Where the `categoryId` comes from**: `categoryId` is the Ozon category identifier — a hierarchical path joined by `_` (e.g. `15621032_15621049_115951147`), obtained from the Ozon category document or from other Seerfar Ozon tools. If the user only has a category name, first resolve it to a `categoryId` from an upstream Seerfar Ozon source before calling this skill.\n\n**Category aggregates vs product rows**: the response carries both category-level totals (`totalSales`, `totalRevenue`, `avgPrice`, `rating`, `seasonalityAmplitude`, `seasonalityCoef`, `startDate`/`endDate`) and a paginated product list (`data` / `products`). Use the aggregates for category sizing and the rows for individual product analysis.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are units; `price` / `revenue` are in Russian rubles (₽), indicated by `currency`.\n\n**Time window**: by default the data covers the last 30 days (`startDate` / `endDate` show the actual range). Pass `date` as `yyyy-MM` (e.g. `2026-02`) to query a historical month snapshot.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| categoryId | string | yes | Ozon category ID, e.g. `15621032_15621049_115951147` (levels joined by `_`). |\n| page | object | yes | Pagination `{page, pageSize, orders[]}`. |\n| page.page | integer | no | Page number, from 1 (default 1). |\n| page.pageSize | integer | no | Page size, default 20. **Max 20** — larger values are rejected (`errcode 1002`). |\n| page.orders | array | no | Sort rules, elements `{field, direction}` (both required); `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `revenue`, `reviewRating`. |\n| date | string | no | Historical month `yyyy-MM` (e.g. `2026-02`); omit for last 30 days. |\n| fulfillment | string | no | Fulfillment filter, one"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-seerfar-ozon-category-search\",\n  \"version\": \"1.0.6\",\n  \"publishedAt\": 1789363435007\n}"},{"path":"references/api.md","content":"# Seerfar Ozon 类目商品搜索 API 参考\n\n## 调用规范\n\n- **请求地址**：`${LINKFOX_TOOL_GATEWAY}/seerfar/ozon/categorySearch`\n- **请求方式**：POST，Content-Type: application/json\n- **认证方式**：Header `Authorization: <api_key>`，api_key 从环境变量 `LINKFOX_AGENT_API_KEY` 或 `LINKFOXAGENT_API_KEY` 读取（如未配置 按 SKILL.md 的 **## 解决认证和算力问题** 处理）\n- **User-Agent**：`LinkFox-Skill/1.0`；HTTP 超时 150s\n\n## 请求参数\n\nPOST Body（JSON）。以下字段与接口 `inputSchema` 一致。`categoryId` 与 `page` 必填，其余可选。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| categoryId | string | 是 | Ozon 类目 ID，从 Ozon 类目文档或其他 Seerfar Ozon 工具获取。形如 `15621032_15621049_115951147`（多级类目以 `_` 连接） |\n| page | object | 是 | 分页与排序：`{page, pageSize, orders[]}` |\n| page.page | integer | 否 | 页码，从 1 开始，默认 1 |\n| page.pageSize | integer | 否 | 每页条数，默认 20，**最大 20**（超出返回 `errcode 1002`） |\n| page.orders | array | 否 | 排序规则，元素 `{field, direction}`（两者均必填）；`direction` 取 `DESC`（倒序）/ `ASC`（正序）。常用排序字段：`sales`、`price`、`revenue`、`reviewRating` |\n| date | string | 否 | 查询历史月份，格式 `yyyy-MM`（如 `2026-02`）；不传默认近 30 天 |\n| fulfillment | string | 否 | 配送方式过滤，固定可选值：`FBO`、`FBS`、`RFBS`、`FBP`、`OZON`；不传查询全部。**注意是单个字符串，不是数组** |\n| uId | string | 否 | 用户 ID（最长 1000） |\n| memberId | string | 否 | 成员 ID（一个成员唯一标识，一个用户可归属多个团队，数据归属于 memberId，最长 1000） |\n\n> **必填约束**：`categoryId` 与 `page` 均为必填；缺任意一项返回 `errcode 400`。\n> **分页上限**：`page.pageSize` 最大为 20，翻页请通过 `page.page` 递增。\n> **排序**：建议通过 `page.orders` 按核心指标排序（如 `sales` DESC 看爆品、`revenue` DESC 看高销售额、`price` DESC 看高价带），避免在无序结果中翻页。\n> **历史月份**：`date` 传 `yyyy-MM` 可查该月快照；不传则返回近 30 天数据，响应中 `startDate`/`endDate` 标明实际统计区间。\n\n## 响应结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| code | string | 返回码，`\"200\"` 表示成功（成功时返回） |\n| errcode | integer | 错误码，`200` 表示成功；业务错误时仅返回此项（成功时与 `code` 并存） |\n| msg | string | 消息；成功为 `ok` |\n| errmsg | string | 错误消息；成功为 `ok`，业务错误时为原因描述 |\n| id | string | 回显的类目 ID |\n| total | integer | **本页返回记录数**（等于当前页 `data` 条数，并非类目商品总数） |\n| totalSales | integer | 类目总销量（统计区间内） |\n| totalRevenue | number | 类目总销售额（卢布） |\n| avgPrice | number | 类目商品平均价格（卢布） |\n| rating | number | 类目商品平均评分 |\n| seasonalityAmplitude | string | 季节性强度，如 `STRONG_SEASONALITY` |\n| seasonalityCoef | string | 季节性阶段，如 `OFF_SEASON` |\n| startDate | string | 统计起始日期 |\n| endDate | string | 统计结束日期 |\n| sellerType | object | **配送方式分布**（非卖家本土/跨境类型），键为配送方式、值为该方式商品数，如 `{\"FBO\":218,\"RFBS\":528,\"FBP\":5,\"FBS\":240,\"OZON\":1}` |\n| categoryInfo | object | 类目元信息，结构见下方「categoryInfo 结构」 |\n| data | array | 类目商品列表（详见下方） |\n| products | array | 类目商品列表，内容与 `data` 完全一致 |\n| hasNextPage | boolean | 是否有下一页 |\n| columns | array | 列定义，元素含 `{field, title, cellType, sortable, filterable}` |\n| type | string | 响应展示类型 |\n| costTime | integer | 接口耗时（毫秒） |\n| costToken | integer | 消耗 Token 数量 |\n\n### data[*] / products[*] 类目商品对象字段\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| sku | integer | 商品 SKU |\n| productId | integer | 统一商品 ID，映射自 `sku` |\n| title | string | 商品标题 |\n| price | number | 商品价格（卢布） |\n| currency | string | 币种，固定 `₽` |\n| sales | integer | 商品销量 |\n| monthlySalesUnits | integer | 统一月销量，映射自 `sales` |\n| revenue | number | 商品销售额 |\n|"},{"path":"references/onboarding.md","content":"# 解决认证和算力问题\n\n调用本 skill 时若网关返回 **auth** 或 **billing** 错误，走本 skill 自带的 `scripts/onboarding.py` 完成引导。\n\n**auth 场景**：`errcode=401` 或消息含 `authorized error`/`鉴权失败`/`未授权`/`unauthorized`；或 `LINKFOX_AGENT_API_KEY` 与 `LINKFOXAGENT_API_KEY` 均为空。\n1. 若已配置 key → 先让用户重启会话（最常见误判），仍失败让用户重新取 key 或换手机号重注册\n2. 未配置 → 询问：自助去 https://agent.linkfox.com/ 取 key，或提供手机号让脚本注册\n3. 手机号路径：\n   - `python scripts/onboarding.py send-code <phone>` → 展示 JSON 里的 phone/agreements\n   - 收到验证码后：`python scripts/onboarding.py login <phone> <code>`\n   - 拿到 `api_key` 后把下面三平台配置转发给用户，提示重启会话生效：\n     - Windows PowerShell（永久）：`setx LINKFOX_AGENT_API_KEY \"<key>\"`\n     - macOS zsh：`echo 'export LINKFOX_AGENT_API_KEY=\"<key>\"' >> ~/.zshrc && source ~/.zshrc`\n     - Linux bash：`echo 'export LINKFOX_AGENT_API_KEY=\"<key>\"' >> ~/.bashrc && source ~/.bashrc`\n     - 变量名 `LINKFOX_AGENT_API_KEY`（主推）或 `LINKFOXAGENT_API_KEY`（老规范）任一即可\n\n**billing 场景**：`errcode=402` 或消息含 `算力/余额/quota/insufficient/充值/套餐到期`。\n- `python scripts/onboarding.py list-plans` → 有 AskUserQuestion 就弹菜单，否则输出编号清单让用户选\n- 校验 `plan_id` ∈ 清单、支付方式 ∈ 该套餐 `available_methods`（通常 `wechat/alipay`）\n- `python scripts/onboarding.py order <plan_id> <method>` → 展示优先级 PNG > `pay_url` > `ascii_qr`（标注兜底）\n- 已付款可选调 `python scripts/onboarding.py query <order_id>`，不主动轮询\n\n排除 `errcode=403`（无权限，不归入这两类）。所有子命令输出 stdout JSON，`error` 字段已含阶段前缀，透传给用户即可。完整用法：`python scripts/onboarding.py --help`。"},{"path":"skill-card.md","content":"## Description:\n\nFetches product lists for a specified Ozon category from Seerfar, including category aggregates such as sales, revenue, average price, rating, seasonality, and per-product metrics for category analysis.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[linkfox-ai](https://clawhub.ai/user/linkfox-ai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal sellers, marketplace analysts, and developers use this skill to inspect Ozon category capacity, price bands, seasonality, and ranked product performance when they already have or can resolve an Ozon category ID.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can handle account setup, phone/SMS login, payment ordering, and API key configuration.\n\nMitigation: Use official LinkFox account channels and a secret manager for credentials; avoid sharing OTPs or persisting keys in shell profile files unless reviewed by the user.\n\nRisk: The skill writes full API responses and cached data to local linkfox directories.\n\nMitigation: Review saved response files before sharing a workspace and avoid querying confidential marketplace data in untrusted environments.\n\nRisk: The security scan reports silent feedback-reporting behavior to LinkFox.\n\nMitigation: Install and run the skill only when the user accepts sharing relevant feedback and queried data with LinkFox.\n\nRisk: Repeated calls consume paid compute credits.\n\nMitigation: Use the built-in cache and get user confirmation before repeated, paginated, or exploratory calls that may add cost.\n\n## Reference(s):\n\n- [API reference](artifact/references/api.md)\n- [Authentication and billing onboarding](artifact/references/onboarding.md)\n- [ClawHub skill page](https://clawhub.ai/linkfox-ai/skills/linkfox-seerfar-ozon-category-search)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, JSON, Files, Shell commands, Configuration guidance]\n\n**Output Format:** [Markdown tables and summaries with saved JSON response files and optional shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Full API responses are saved under a local linkfox data directory; large responses are summarized unless inline output is requested.]\n\n## Skill Version(s):\n\n1.0.6 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Seerfar Ozon 类目商品搜索：按 Ozon 类目 ID 拉取该类目下的商品列表，返回类目级聚合（类目总销量、总销售额、平均价格、平均评分、季节性）与每个商品的销量、价格、评分、评论数、品牌、卖家、配送方式。用于类目选品分析、类目爆品挖掘、类目容量与价格带分析、季节性判断。当用户提到 Ozon 类目商品、Ozon 类目分析、Ozon 类目选品、Ozon 类目爆品、Ozon 类目总销量、Ozon 类目平均价格、Ozon category search, Ozon category products, category best-sellers, category analysis 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 类目下的商品与类目级汇总数据，也应触发此技能。 Skill: Seerfar-Ozon类目搜索 Owner: linkfox-ai Summary: Seerfar Ozon 类目商品搜索：按 Ozon 类目 ID 拉取该类目下的商品列表，返回类目级聚合（类目总销量、总销售额、平均价格、平均评分、季节性）与每个商品的销量、价格、评分、评论数、品牌、卖家、配送方式。用于类目选品分析、类目爆品挖掘、类目容量与价格带分析、季节性判断。当用户提到 Ozon 类目商品、Ozon 类目分析、Ozon 类目选品、Ozon 类目爆品、Ozon 类目总销量、Ozon 类目平均价格、Ozon category search, Ozon category products, category best-sellers, category analysis 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 类目下的商品与类目级汇总数据，也应触发此技能。 Tags: l","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1426,"uniquenessScore":47,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T21:01:00.360Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T21:01:00.360Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-13T04:50:34.860Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}