{"id":"f54c3051-1dfd-4b34-a8fe-e0017f748156","entityType":"agent","slug":"clawhub-linkfox-ai-linkfox-seerfar-ozon-shop-search","name":"Seerfar-Ozon店铺搜索","canonicalUrl":"https://www.xpersona.co/agent/clawhub-linkfox-ai-linkfox-seerfar-ozon-shop-search","canonicalPath":"/agent/clawhub-linkfox-ai-linkfox-seerfar-ozon-shop-search","generatedAt":"2026-10-11T21:01:17.597Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T17:14:34.353Z","emptyReason":null},"description":"Seerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。用于竞品店铺商品分析、店铺爆品挖掘、卖家商品结构拆解。当用户提到 Ozon 店铺商品、Ozon 卖家商品列表、竞品店铺分析、Ozon 店铺爆品、Ozon 卖家分析、Seerfar Ozon 店铺搜索、Ozon shop search, Ozon seller products, competitor shop analysis, Ozon store products 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 店铺/卖家的商品与销量数据，也应触发此技能。 Skill: Seerfar-Ozon店铺搜索 Owner: linkfox-ai Summary: Seerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。用于竞品店铺商品分析、店铺爆品挖掘、卖家商品结构拆解。当用户提到 Ozon 店铺商品、Ozon 卖家商品列表、竞品店铺分析、Ozon 店铺爆品、Ozon 卖家分析、Seerfar Ozon 店铺搜索、Ozon shop search, Ozon seller products, competitor shop analysis, Ozon store products 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 店铺/卖家的商品与销量数据，也应触发此技能。 Tags:","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s171g8b6m2khwdy9ye8bxj0wx183vd4z:linkfox-seerfar-ozon-shop-search","sourceUrl":"https://clawhub.ai/linkfox-ai/linkfox-seerfar-ozon-shop-search","homepage":"https://clawhub.ai/linkfox-ai/skills/linkfox-seerfar-ozon-shop-search","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/linkfox-ai/linkfox-seerfar-ozon-shop-search","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/linkfox-ai/skills/linkfox-seerfar-ozon-shop-search","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Seerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。用于竞品店铺商品分析、店铺爆品挖掘、卖家商品结构拆解。当用户提到 Ozon 店铺商品、Ozo"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:14:34.353Z","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-11T17:14:34.353Z","emptyReason":null},"stars":null,"forks":null,"downloads":1020,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.0.6","tractionLabel":"1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:14:34.278Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T17:14:34.353Z","lastCrawledAt":"2026-10-11T17:14:34.278Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T17:14:34.278Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.6","createdAt":"2026-09-14T05:24:32.724Z","changelog":"Update from 1.0.5 to 1.0.6","fileCount":7,"zipByteSize":25361},{"version":"1.0.5","createdAt":"2026-08-14T15:00:11.323Z","changelog":"Update from 1.0.4 to 1.0.5","fileCount":7,"zipByteSize":25368},{"version":"1.0.4","createdAt":"2026-08-07T10:56:25.843Z","changelog":"Update from 1.0.3 to 1.0.4","fileCount":7,"zipByteSize":25476},{"version":"1.0.3","createdAt":"2026-08-05T03:20:20.617Z","changelog":"Update from 1.0.2 to 1.0.3","fileCount":5,"zipByteSize":16158},{"version":"1.0.2","createdAt":"2026-07-13T12:17:40.493Z","changelog":"Update from 1.0.1 to 1.0.2","fileCount":5,"zipByteSize":16019},{"version":"1.0.1","createdAt":"2026-07-06T11:26:03.792Z","changelog":"Update from 1.0.0 to 1.0.1","fileCount":5,"zipByteSize":15331},{"version":"1.0.0","createdAt":"2026-07-03T08:25:21.773Z","changelog":"Initial release","fileCount":5,"zipByteSize":15371}]},"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-shop-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-shop-search/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-shop-search/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-shop-search/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-shop-search/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-shop-search/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-shop-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-11T21:01:17.592Z"}},"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-shop-search/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-shop-search/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-shop-search/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-seerfar-ozon-shop-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-11T17:14:34.353Z","emptyReason":null},"readme":"Skill: Seerfar-Ozon店铺搜索\n\nOwner: linkfox-ai\n\nSummary: Seerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。用于竞品店铺商品分析、店铺爆品挖掘、卖家商品结构拆解。当用户提到 Ozon 店铺商品、Ozon 卖家商品列表、竞品店铺分析、Ozon 店铺爆品、Ozon 卖家分析、Seerfar Ozon 店铺搜索、Ozon shop search, Ozon seller products, competitor shop analysis, Ozon store products 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 店铺/卖家的商品与销量数据，也应触发此技能。\n\nTags: latest:1.0.6\n\nVersion history:\n\nv1.0.6 | 2026-09-14T05:24:32.724Z | user\n\nUpdate from 1.0.5 to 1.0.6\n\nv1.0.5 | 2026-08-14T15:00:11.323Z | user\n\nUpdate from 1.0.4 to 1.0.5\n\nv1.0.4 | 2026-08-07T10:56:25.843Z | user\n\nUpdate from 1.0.3 to 1.0.4\n\nv1.0.3 | 2026-08-05T03:20:20.617Z | user\n\nUpdate from 1.0.2 to 1.0.3\n\nv1.0.2 | 2026-07-13T12:17:40.493Z | user\n\nUpdate from 1.0.1 to 1.0.2\n\nv1.0.1 | 2026-07-06T11:26:03.792Z | user\n\nUpdate from 1.0.0 to 1.0.1\n\nv1.0.0 | 2026-07-03T08:25:21.773Z | user\n\nInitial release\n\nArchive index:\n\nArchive v1.0.6: 7 files, 25361 bytes\n\nFiles: references/api.md (8395b), references/onboarding.md (1999b), scripts/onboarding.py (24027b), scripts/seerfar_ozon_shop_search.py (12759b), skill-card.md (2984b), SKILL.md (10752b), _meta.json (151b)\n\nFile v1.0.6:SKILL.md\n\n---\nname: linkfox-seerfar-ozon-shop-search\ndescription: Seerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。用于竞品店铺商品分析、店铺爆品挖掘、卖家商品结构拆解。当用户提到 Ozon 店铺商品、Ozon 卖家商品列表、竞品店铺分析、Ozon 店铺爆品、Ozon 卖家分析、Seerfar Ozon 店铺搜索、Ozon shop search, Ozon seller products, competitor shop analysis, Ozon store products 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 店铺/卖家的商品与销量数据，也应触发此技能。\n---\n\n# Seerfar Ozon Shop Search\n\nThis skill lists the products of a specific Ozon shop (seller) from the Seerfar analytics database. Given a shop `id`, it returns each product's 30-day sales, price, rating, weight, fulfillment model (FBO/FBS), seller type (local / cross-border) and return/cancellation rate, plus the shop's total 30-day sales — the starting point for competitor-shop product analysis, best-seller mining, and seller catalog teardown.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one shop**: pass a single shop `id` and receive that shop's product catalog with performance metrics. This is a *shop-level* view, not a keyword or category view.\n\n**Where the shop `id` comes from**: `id` is the Seerfar seller/shop identifier — the same `sellerId` returned by other Seerfar Ozon tools (e.g. product report / product detail search). Negative ids (e.g. `-2` Ozon Express, `-4` Ozon Fresh) are Ozon's own platform sellers; positive ids are third-party sellers. If the user only has a shop name or product, first obtain the `sellerId` from a product-level Seerfar Ozon source, then call this skill.\n\n**Seller type**: each product carries `sellerType` — `0` local (本土), `1` cross-border (跨境). A shop is typically all one type; use it to judge whether a competitor is a domestic or cross-border seller.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are 30-day units; `price` is in Russian rubles (₽), indicated by `currency`.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| id | integer | yes | Shop (seller) ID — the `sellerId` from other Seerfar Ozon tools. Negative = Ozon platform seller. |\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}`; `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `reviewRating`, `upTime`. |\n| uId | string | no | User ID. |\n| memberId | string | no | Member ID (data attribution). |\n\nOnly `id` and `page` are required.\n\n## 调用方式\n\n- **API 端点**：`POST /seerfar/ozon/shopSearch`（完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/seerfar_ozon_shop_search.py '<JSON 参数>' [--inline]`\n- **成本约束**：本工具会消耗算力；同一会话同一参数组合默认只调用一次，脚本带 24h 本地缓存。失败/空结果不得自动换关键词、翻页或改邮编连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/linkfox-seerfar-ozon-shop-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. A shop's best-sellers (sort by 30-day sales)**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**2. A shop's newest listings (sort by upload time)**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"upTime\", \"direction\": \"DESC\"}]}}\n```\n\n**3. A shop's highest-priced products**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"price\", \"direction\": \"DESC\"}]}}\n```\n\n**4. Page deeper into a shop's catalog**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 2, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n## How to Build Queries\n\n1. **Always pass `page.orders`**: the catalog can be large — sort by the metric you care about (`sales` DESC for best-sellers, `upTime` DESC for new arrivals, `price` DESC for premium SKUs).\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 shop `id` first**: if the user gives a shop/product name rather than an id, obtain the `sellerId` from a product-level Seerfar Ozon source before calling this skill.\n4. **Use shop-level aggregates for context**: `totalSales` / `totalRevenue` / `dailySales` are shop-wide totals (independent of the page), `productCount` is the full catalog size, `rating` is the shop rating, and top-level `fulfillment` shows the FBO/FBS split — all quick health indicators for the whole shop.\n\n## Display Rules\n\n1. **Present data only**: show the shop's product metrics in a clear table without subjective advice.\n2. **Lead with shop context, then product columns**: state shop-level aggregates first — `totalSales` (30-day total), `totalRevenue` (total revenue, ₽), `productCount` (catalog size), `dailySales`, `rating`, and `fulfillment` distribution (e.g. FBO 72 / FBS 4) — then a table of `sku`, `price`, `sales`, `reviewRating`, `weight`, `sellerType`, `fulfillment`, `returnCancellationRate`.\n3. **Seller type label**: render `sellerType` as 本土/跨境 (0/1) so the user reads it at a glance.\n4. **Fulfillment**: `fulfillment` is an array (e.g. `[\"FBO\"]`); join multiple values with `/`.\n5. **Missing `returnCancellationRate`**: for Ozon platform sellers (negative `id`) this field is often absent — show `-` rather than failing.\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 shop**: a non-existent `id` 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- **`id` and `page` are both required**; omitting either returns `errcode 400`.\n- **`pageSize` max 20**: exceeding it returns `errcode 1002`.\n- **`total` is the page row count**, not the shop's full catalog size — use `hasNextPage` to decide whether to fetch more pages.\n- **No text/keyword filter**: this endpoint filters by shop only; to find a shop by name, use another Seerfar Ozon source first.\n- **Field variance by seller type**: `returnCancellationRate` is populated for third-party sellers but frequently absent for Ozon platform sellers (negative `id`). Schema-defined `productPageUrl`, `monthlySalesRevenue`, `brand` are not returned (upstream has no source, omitted rather than null).\n\n## User Expression & Scenario Quick Reference\n\n**Applicable** — analyzing one Ozon shop/seller's catalog:\n\n| User Says | Scenario |\n|-----------|----------|\n| \"分析下这个 Ozon 店铺的商品\" / \"这个卖家在卖什么\" | Shop product catalog |\n| \"这家店最畅销的商品是什么\" | Best-seller mining (sort by sales) |\n| \"这家店最近上了哪些新品\" | New arrivals (sort by upTime) |\n| \"这个竞品店铺的价格带/客单价\" | Price-band analysis (sort by price) |\n| \"这家店是本土还是跨境卖家\" | Seller type check (sellerType) |\n| \"这个店铺总销量多少\" | Shop health (totalSales) |\n\n**Not applicable** — Needs beyond one shop's catalog:\n- Discovering Ozon keywords by market metrics → use the Seerfar Ozon market keyword search skill.\n- A single product's full detail → use a product-level Seerfar Ozon source (this skill returns catalog-level fields only).\n- Browsing the category tree → use a category-level Seerfar Ozon source.\n- Finding which shop sells a given product → use a product-level Seerfar Ozon source to get the `sellerId` first.\n\n**Boundary judgment**: if the user already has a shop/seller ID (or a `sellerId` obtained from a product lookup) and wants to enumerate or rank that shop's products by sales/price/rating, start here. If they want market-level 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-shop-search\",\n  \"version\": \"1.0.6\",\n  \"publishedAt\": 1789363472724\n}\n\nFile v1.0.6:references/api.md\n\n# Seerfar Ozon 店铺商品搜索 API 参考\n\n## 调用规范\n\n- **请求地址**：`${LINKFOX_TOOL_GATEWAY}/seerfar/ozon/shopSearch`\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/2.0`；HTTP 超时 150s\n\n## 请求参数\n\nPOST Body（JSON）。以下字段与接口 `inputSchema` 一致。`id` 与 `page` 必填，其余可选。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| id | integer | 是 | 店铺（卖家）ID，即其他 Seerfar Ozon 工具返回的 `sellerId`；负值为 Ozon 平台自营卖家（如 `-2` Ozon Express、`-4` Ozon Fresh），正值为第三方卖家 |\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`、`reviewRating`、`upTime` |\n| uId | string | 否 | 用户 ID（最长 1000） |\n| memberId | string | 否 | 成员 ID（一个成员唯一标识，一个用户可归属多个团队，数据归属于 memberId，最长 1000） |\n\n> **必填约束**：`id` 与 `page` 均为必填；缺任意一项返回 `errcode 400`。\n> **分页上限**：`page.pageSize` 最大为 20，翻页请通过 `page.page` 递增。\n> **排序**：建议通过 `page.orders` 按核心指标排序（如 `sales` DESC 看爆品、`upTime` DESC 看新品），避免在无序结果中翻页。\n\n## 响应结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| code | string | 返回码，`\"200\"` 表示成功（成功时返回） |\n| errcode | integer | 错误码，`200` 表示成功；业务错误时仅返回此项（成功时与 `code` 并存） |\n| msg | string | 消息；成功为 `ok` |\n| errmsg | string | 错误消息；成功为 `ok`，业务错误时为原因描述 |\n| total | integer | **本页返回记录数**（等于当前页数据条数，并非店铺商品总数） |\n| totalSales | integer | 店铺近 30 天总销量 |\n| totalRevenue | integer | 店铺总销售额（卢布） |\n| dailySales | integer | 店铺日均销量 |\n| rating | number | 店铺评分（0-5） |\n| productCount | integer | 店铺商品总数（全店铺，非本页条数） |\n| fulfillment | object | 店铺配送方式分布，键为配送方式（`FBO`/`FBS`），值为该方式商品数，如 `{\"FBO\": 72, \"FBS\": 4}`（与商品级 `fulfillment` 数组不同） |\n| data | array | 店铺商品列表（详见下方） |\n| products | array | 店铺商品列表，内容与 `data` 完全一致 |\n| hasNextPage | boolean | 是否有下一页 |\n| columns | array | 列定义，元素含 `{field, title, cellType, sortable, filterable}` |\n| type | string | 响应展示类型，如 `productWorkbenches` |\n| costTime | integer | 接口耗时（毫秒） |\n| costToken | integer | 消耗 Token 数量 |\n\n### data[*] / products[*] 店铺商品对象字段\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| productId | integer | 统一商品 ID，映射自 `sku` |\n| sku | integer | 商品 SKU |\n| rating | number | 统一评分，映射自 `reviewRating` |\n| reviewRating | number | 商品评分 |\n| weight | number | 商品重量，单位 g |\n| sales | integer | 商品近 30 天销量 |\n| monthlySalesUnits | integer | 统一月销量，映射自 `sales` |\n| upTime | integer | 商品上架时间，毫秒时间戳 |\n| price | number | 商品价格（卢布） |\n| currency | string | 币种，固定 `₽` |\n| imageUrl | string | 统一主图 URL |\n| fulfillment | array | 商品配送方式，如 `[\"FBO\"]`，可能含多个值 |\n| sellerType | integer | 卖家类型：`0` 本土，`1` 跨境 |\n| returnCancellationRate | number | 商品退货取消率（%） |\n| sourceType | string | 数据源，固定 `ozon` |\n| sourceTool | string | 来源工具，如 `Seerfar-Ozon-查店铺` |\n\n> **字段差异**：`returnCancellationRate` 对第三方卖家普遍返回，但对 Ozon 平台自营卖家（`id` 为负值）常常缺失，使用前需判空。\n> **schema 中定义但实际不返回**：`productPageUrl`（统一商品页 URL）、`monthlySalesRevenue`（统一月销售额）、`brand`（统一品牌）在 outputSchema 中标注\"上游无对应字段，保持 null\"，实际响应中**不返回**这些字段（既非 null 也非空），不要依赖它们。\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`；常见为缺 `id`（`id 为必填参数`）、缺 `page`（`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**：传入不存在的 `id` 不会报错，而是返回 `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\": \"id 为必填参数\"\n}\n```\n\n## curl 示例\n\n```bash\ncurl -X POST https://tool-gateway.linkfox.com/seerfar/ozon/shopSearch \\\n  -H \"Authorization: $LINKFOXAGENT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"User-Agent: LinkFox-Skill/2.0\" \\\n  -d '{\n    \"id\": 1362816,\n    \"page\": {\"page\": 1, \"pageSize\": 20, \"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  \"total\": 20,\n  \"totalSales\": 8528,\n  \"totalRevenue\": 15113703,\n  \"dailySales\": 284,\n  \"rating\": 4.9,\n  \"productCount\": 76,\n  \"fulfillment\": {\"FBO\": 72, \"FBS\": 4},\n  \"hasNextPage\": true,\n  \"type\": \"productWorkbenches\",\n  \"costTime\": 2985,\n  \"costToken\": 16000,\n  \"data\": [\n    {\n      \"productId\": 1591817986,\n      \"sku\": 1591817986,\n      \"rating\": 4.9,\n      \"reviewRating\": 4.9,\n      \"weight\": 2950.0,\n      \"sales\": 869,\n      \"monthlySalesUnits\": 869,\n      \"upTime\": 1717084800000,\n      \"price\": 1556.0,\n      \"currency\": \"₽\",\n      \"imageUrl\": \"https://ir.ozone.ru/s3/multimedia-1-y/wc300/11054085154.jpg\",\n      \"fulfillment\": [\"FBO\"],\n      \"sellerType\": 0,\n      \"returnCancellationRate\": 17.5,\n      \"sourceType\": \"ozon\",\n      \"sourceTool\": \"Seerfar-Ozon-查店铺\"\n    }\n  ],\n  \"products\": [ ... ]\n}\n```\n\n> `products` 内容与 `data` 完全一致，示例中用 `[ ... ]` 表示省略，实际返回与 `data` 相同的完整商品数组。\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-shop-search\",\n  \"sentiment\": \"POSITIVE\",\n  \"category\": \"OTHER\",\n  \"content\": \"User successfully retrieved a competitor shop's best-sellers and 30-day total sales.\"\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\nLooks up the product catalog for a specific Ozon shop or seller from Seerfar data, including 30-day sales, price, rating, weight, fulfillment model, seller type, return/cancellation rate, and shop-level sales context.\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 users and developers use this skill to analyze one Ozon shop's product catalog, best sellers, seller type, fulfillment split, pricing, and 30-day sales metrics for competitor-shop analysis.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill handles LinkFox API keys and can guide phone/SMS login.\n\nMitigation: Use it only in a trusted workspace, avoid sharing credentials in prompts or logs, and rotate any API key that appears in shell history, files, or conversation output.\n\nRisk: The onboarding flow can create payment orders and the shop lookup consumes paid compute credits.\n\nMitigation: Confirm the user's intent before billing actions or repeated lookups, rely on the 24-hour cache for identical parameters, and explain additional cost before pagination or retries.\n\nRisk: Full API responses are stored locally and may include business-sensitive shop or product analysis data.\n\nMitigation: Run in an appropriate project workspace, review saved files under the generated linkfox data directory, and delete retained JSON responses when they are no longer needed.\n\nRisk: Endpoint override environment variables can redirect API, login, or billing requests.\n\nMitigation: Avoid setting LinkFox endpoint override variables unless the destination is trusted and expected for the current environment.\n\nRisk: The skill may send feedback to LinkFox without a separate confirmation when it detects quality or outcome signals.\n\nMitigation: Review this behavior before installation and avoid including sensitive user or business details in feedback content.\n\n## Reference(s):\n\n- [Seerfar Ozon Shop Search API Reference](artifact/references/api.md)\n- [Authentication and Billing Onboarding](artifact/references/onboarding.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON API results, shell commands, configuration snippets, and saved JSON response files]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Full API responses are written to local JSON files; small responses may also be printed inline, while larger responses are summarized unless inline output is requested.]\n\n## Skill Version(s):\n\n1.0.6 (source: ClawHub 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.5: 7 files, 25368 bytes\n\nFiles: references/api.md (8395b), references/onboarding.md (2046b), scripts/onboarding.py (24089b), scripts/seerfar_ozon_shop_search.py (12703b), skill-card.md (2853b), SKILL.md (10752b), _meta.json (151b)\n\nFile v1.0.5:SKILL.md\n\n---\nname: linkfox-seerfar-ozon-shop-search\ndescription: Seerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。用于竞品店铺商品分析、店铺爆品挖掘、卖家商品结构拆解。当用户提到 Ozon 店铺商品、Ozon 卖家商品列表、竞品店铺分析、Ozon 店铺爆品、Ozon 卖家分析、Seerfar Ozon 店铺搜索、Ozon shop search, Ozon seller products, competitor shop analysis, Ozon store products 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 店铺/卖家的商品与销量数据，也应触发此技能。\n---\n\n# Seerfar Ozon Shop Search\n\nThis skill lists the products of a specific Ozon shop (seller) from the Seerfar analytics database. Given a shop `id`, it returns each product's 30-day sales, price, rating, weight, fulfillment model (FBO/FBS), seller type (local / cross-border) and return/cancellation rate, plus the shop's total 30-day sales — the starting point for competitor-shop product analysis, best-seller mining, and seller catalog teardown.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one shop**: pass a single shop `id` and receive that shop's product catalog with performance metrics. This is a *shop-level* view, not a keyword or category view.\n\n**Where the shop `id` comes from**: `id` is the Seerfar seller/shop identifier — the same `sellerId` returned by other Seerfar Ozon tools (e.g. product report / product detail search). Negative ids (e.g. `-2` Ozon Express, `-4` Ozon Fresh) are Ozon's own platform sellers; positive ids are third-party sellers. If the user only has a shop name or product, first obtain the `sellerId` from a product-level Seerfar Ozon source, then call this skill.\n\n**Seller type**: each product carries `sellerType` — `0` local (本土), `1` cross-border (跨境). A shop is typically all one type; use it to judge whether a competitor is a domestic or cross-border seller.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are 30-day units; `price` is in Russian rubles (₽), indicated by `currency`.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| id | integer | yes | Shop (seller) ID — the `sellerId` from other Seerfar Ozon tools. Negative = Ozon platform seller. |\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}`; `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `reviewRating`, `upTime`. |\n| uId | string | no | User ID. |\n| memberId | string | no | Member ID (data attribution). |\n\nOnly `id` and `page` are required.\n\n## 调用方式\n\n- **API 端点**：`POST /seerfar/ozon/shopSearch`（完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/seerfar_ozon_shop_search.py '<JSON 参数>' [--inline]`\n- **成本约束**：本工具会消耗积分；同一会话同一参数组合默认只调用一次，脚本带 24h 本地缓存。失败/空结果不得自动换关键词、翻页或改邮编连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/linkfox-seerfar-ozon-shop-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. A shop's best-sellers (sort by 30-day sales)**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**2. A shop's newest listings (sort by upload time)**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"upTime\", \"direction\": \"DESC\"}]}}\n```\n\n**3. A shop's highest-priced products**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"price\", \"direction\": \"DESC\"}]}}\n```\n\n**4. Page deeper into a shop's catalog**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 2, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n## How to Build Queries\n\n1. **Always pass `page.orders`**: the catalog can be large — sort by the metric you care about (`sales` DESC for best-sellers, `upTime` DESC for new arrivals, `price` DESC for premium SKUs).\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 shop `id` first**: if the user gives a shop/product name rather than an id, obtain the `sellerId` from a product-level Seerfar Ozon source before calling this skill.\n4. **Use shop-level aggregates for context**: `totalSales` / `totalRevenue` / `dailySales` are shop-wide totals (independent of the page), `productCount` is the full catalog size, `rating` is the shop rating, and top-level `fulfillment` shows the FBO/FBS split — all quick health indicators for the whole shop.\n\n## Display Rules\n\n1. **Present data only**: show the shop's product metrics in a clear table without subjective advice.\n2. **Lead with shop context, then product columns**: state shop-level aggregates first — `totalSales` (30-day total), `totalRevenue` (total revenue, ₽), `productCount` (catalog size), `dailySales`, `rating`, and `fulfillment` distribution (e.g. FBO 72 / FBS 4) — then a table of `sku`, `price`, `sales`, `reviewRating`, `weight`, `sellerType`, `fulfillment`, `returnCancellationRate`.\n3. **Seller type label**: render `sellerType` as 本土/跨境 (0/1) so the user reads it at a glance.\n4. **Fulfillment**: `fulfillment` is an array (e.g. `[\"FBO\"]`); join multiple values with `/`.\n5. **Missing `returnCancellationRate`**: for Ozon platform sellers (negative `id`) this field is often absent — show `-` rather than failing.\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 shop**: a non-existent `id` 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- **`id` and `page` are both required**; omitting either returns `errcode 400`.\n- **`pageSize` max 20**: exceeding it returns `errcode 1002`.\n- **`total` is the page row count**, not the shop's full catalog size — use `hasNextPage` to decide whether to fetch more pages.\n- **No text/keyword filter**: this endpoint filters by shop only; to find a shop by name, use another Seerfar Ozon source first.\n- **Field variance by seller type**: `returnCancellationRate` is populated for third-party sellers but frequently absent for Ozon platform sellers (negative `id`). Schema-defined `productPageUrl`, `monthlySalesRevenue`, `brand` are not returned (upstream has no source, omitted rather than null).\n\n## User Expression & Scenario Quick Reference\n\n**Applicable** — analyzing one Ozon shop/seller's catalog:\n\n| User Says | Scenario |\n|-----------|----------|\n| \"分析下这个 Ozon 店铺的商品\" / \"这个卖家在卖什么\" | Shop product catalog |\n| \"这家店最畅销的商品是什么\" | Best-seller mining (sort by sales) |\n| \"这家店最近上了哪些新品\" | New arrivals (sort by upTime) |\n| \"这个竞品店铺的价格带/客单价\" | Price-band analysis (sort by price) |\n| \"这家店是本土还是跨境卖家\" | Seller type check (sellerType) |\n| \"这个店铺总销量多少\" | Shop health (totalSales) |\n\n**Not applicable** — Needs beyond one shop's catalog:\n- Discovering Ozon keywords by market metrics → use the Seerfar Ozon market keyword search skill.\n- A single product's full detail → use a product-level Seerfar Ozon source (this skill returns catalog-level fields only).\n- Browsing the category tree → use a category-level Seerfar Ozon source.\n- Finding which shop sells a given product → use a product-level Seerfar Ozon source to get the `sellerId` first.\n\n**Boundary judgment**: if the user already has a shop/seller ID (or a `sellerId` obtained from a product lookup) and wants to enumerate or rank that shop's products by sales/price/rating, start here. If they want market-level 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-shop-search\",\n  \"version\": \"1.0.5\",\n  \"publishedAt\": 1786719611323\n}\n\nFile v1.0.5:references/api.md\n\n# Seerfar Ozon 店铺商品搜索 API 参考\n\n## 调用规范\n\n- **请求地址**：`${LINKFOX_TOOL_GATEWAY}/seerfar/ozon/shopSearch`\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/2.0`；HTTP 超时 150s\n\n## 请求参数\n\nPOST Body（JSON）。以下字段与接口 `inputSchema` 一致。`id` 与 `page` 必填，其余可选。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| id | integer | 是 | 店铺（卖家）ID，即其他 Seerfar Ozon 工具返回的 `sellerId`；负值为 Ozon 平台自营卖家（如 `-2` Ozon Express、`-4` Ozon Fresh），正值为第三方卖家 |\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`、`reviewRating`、`upTime` |\n| uId | string | 否 | 用户 ID（最长 1000） |\n| memberId | string | 否 | 成员 ID（一个成员唯一标识，一个用户可归属多个团队，数据归属于 memberId，最长 1000） |\n\n> **必填约束**：`id` 与 `page` 均为必填；缺任意一项返回 `errcode 400`。\n> **分页上限**：`page.pageSize` 最大为 20，翻页请通过 `page.page` 递增。\n> **排序**：建议通过 `page.orders` 按核心指标排序（如 `sales` DESC 看爆品、`upTime` DESC 看新品），避免在无序结果中翻页。\n\n## 响应结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| code | string | 返回码，`\"200\"` 表示成功（成功时返回） |\n| errcode | integer | 错误码，`200` 表示成功；业务错误时仅返回此项（成功时与 `code` 并存） |\n| msg | string | 消息；成功为 `ok` |\n| errmsg | string | 错误消息；成功为 `ok`，业务错误时为原因描述 |\n| total | integer | **本页返回记录数**（等于当前页数据条数，并非店铺商品总数） |\n| totalSales | integer | 店铺近 30 天总销量 |\n| totalRevenue | integer | 店铺总销售额（卢布） |\n| dailySales | integer | 店铺日均销量 |\n| rating | number | 店铺评分（0-5） |\n| productCount | integer | 店铺商品总数（全店铺，非本页条数） |\n| fulfillment | object | 店铺配送方式分布，键为配送方式（`FBO`/`FBS`），值为该方式商品数，如 `{\"FBO\": 72, \"FBS\": 4}`（与商品级 `fulfillment` 数组不同） |\n| data | array | 店铺商品列表（详见下方） |\n| products | array | 店铺商品列表，内容与 `data` 完全一致 |\n| hasNextPage | boolean | 是否有下一页 |\n| columns | array | 列定义，元素含 `{field, title, cellType, sortable, filterable}` |\n| type | string | 响应展示类型，如 `productWorkbenches` |\n| costTime | integer | 接口耗时（毫秒） |\n| costToken | integer | 消耗 Token 数量 |\n\n### data[*] / products[*] 店铺商品对象字段\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| productId | integer | 统一商品 ID，映射自 `sku` |\n| sku | integer | 商品 SKU |\n| rating | number | 统一评分，映射自 `reviewRating` |\n| reviewRating | number | 商品评分 |\n| weight | number | 商品重量，单位 g |\n| sales | integer | 商品近 30 天销量 |\n| monthlySalesUnits | integer | 统一月销量，映射自 `sales` |\n| upTime | integer | 商品上架时间，毫秒时间戳 |\n| price | number | 商品价格（卢布） |\n| currency | string | 币种，固定 `₽` |\n| imageUrl | string | 统一主图 URL |\n| fulfillment | array | 商品配送方式，如 `[\"FBO\"]`，可能含多个值 |\n| sellerType | integer | 卖家类型：`0` 本土，`1` 跨境 |\n| returnCancellationRate | number | 商品退货取消率（%） |\n| sourceType | string | 数据源，固定 `ozon` |\n| sourceTool | string | 来源工具，如 `Seerfar-Ozon-查店铺` |\n\n> **字段差异**：`returnCancellationRate` 对第三方卖家普遍返回，但对 Ozon 平台自营卖家（`id` 为负值）常常缺失，使用前需判空。\n> **schema 中定义但实际不返回**：`productPageUrl`（统一商品页 URL）、`monthlySalesRevenue`（统一月销售额）、`brand`（统一品牌）在 outputSchema 中标注\"上游无对应字段，保持 null\"，实际响应中**不返回**这些字段（既非 null 也非空），不要依赖它们。\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`；常见为缺 `id`（`id 为必填参数`）、缺 `page`（`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**：传入不存在的 `id` 不会报错，而是返回 `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\": \"id 为必填参数\"\n}\n```\n\n## curl 示例\n\n```bash\ncurl -X POST https://tool-gateway.linkfox.com/seerfar/ozon/shopSearch \\\n  -H \"Authorization: $LINKFOXAGENT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"User-Agent: LinkFox-Skill/2.0\" \\\n  -d '{\n    \"id\": 1362816,\n    \"page\": {\"page\": 1, \"pageSize\": 20, \"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  \"total\": 20,\n  \"totalSales\": 8528,\n  \"totalRevenue\": 15113703,\n  \"dailySales\": 284,\n  \"rating\": 4.9,\n  \"productCount\": 76,\n  \"fulfillment\": {\"FBO\": 72, \"FBS\": 4},\n  \"hasNextPage\": true,\n  \"type\": \"productWorkbenches\",\n  \"costTime\": 2985,\n  \"costToken\": 16000,\n  \"data\": [\n    {\n      \"productId\": 1591817986,\n      \"sku\": 1591817986,\n      \"rating\": 4.9,\n      \"reviewRating\": 4.9,\n      \"weight\": 2950.0,\n      \"sales\": 869,\n      \"monthlySalesUnits\": 869,\n      \"upTime\": 1717084800000,\n      \"price\": 1556.0,\n      \"currency\": \"₽\",\n      \"imageUrl\": \"https://ir.ozone.ru/s3/multimedia-1-y/wc300/11054085154.jpg\",\n      \"fulfillment\": [\"FBO\"],\n      \"sellerType\": 0,\n      \"returnCancellationRate\": 17.5,\n      \"sourceType\": \"ozon\",\n      \"sourceTool\": \"Seerfar-Ozon-查店铺\"\n    }\n  ],\n  \"products\": [ ... ]\n}\n```\n\n> `products` 内容与 `data` 完全一致，示例中用 `[ ... ]` 表示省略，实际返回与 `data` 相同的完整商品数组。\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-shop-search\",\n  \"sentiment\": \"POSITIVE\",\n  \"category\": \"OTHER\",\n  \"content\": \"User successfully retrieved a competitor shop's best-sellers and 30-day total sales.\"\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\nRetrieves product lists and shop-level 30-day sales metrics for a specified Ozon seller or shop ID from Seerfar to support competitor shop analysis and bestseller discovery.\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 users and e-commerce analysts use this skill to inspect one Ozon shop's catalog by seller ID, including item prices, ratings, fulfillment model, seller type, return/cancellation rate, and 30-day sales. It is intended for competitor-shop product analysis, bestseller mining, and seller catalog review.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The security summary reports sensitive account, API-key, billing, feedback, and local-retention behavior.\n\nMitigation: Use the skill only in a trusted workspace, review onboarding and feedback behavior before use, and avoid sharing API keys, phone numbers, SMS codes, or payment actions without explicit user consent.\n\nRisk: Endpoint override environment variables can redirect outbound requests.\n\nMitigation: Set endpoint override variables only when the destination is controlled and expected; otherwise rely on the documented default LinkFox endpoints.\n\nRisk: Full search results are saved locally and may include commercially sensitive shop analysis data.\n\nMitigation: Treat saved JSON files as retained user data, store them in an appropriate workspace, and delete them when they are no longer needed.\n\nRisk: The skill consumes paid credits and may trigger billing flows during quota resolution.\n\nMitigation: Warn users before repeated calls or pagination and require explicit approval before starting recharge or paid-order steps.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/linkfox-ai/skills/linkfox-seerfar-ozon-shop-search)\n- [Seerfar Ozon shop search API reference](references/api.md)\n- [Authentication and billing onboarding](references/onboarding.md)\n- [LinkFox Skills](https://skill.linkfox.com/)\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 API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [The search script caches identical requests for 24 hours, saves full responses under a linkfox session directory, and summarizes large responses unless inline output is requested.]\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, 25476 bytes\n\nFiles: references/api.md (8395b), references/onboarding.md (2046b), scripts/onboarding.py (24089b), scripts/seerfar_ozon_shop_search.py (12703b), skill-card.md (2832b), SKILL.md (10752b), _meta.json (151b)\n\nFile v1.0.4:SKILL.md\n\n---\nname: linkfox-seerfar-ozon-shop-search\ndescription: Seerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。用于竞品店铺商品分析、店铺爆品挖掘、卖家商品结构拆解。当用户提到 Ozon 店铺商品、Ozon 卖家商品列表、竞品店铺分析、Ozon 店铺爆品、Ozon 卖家分析、Seerfar Ozon 店铺搜索、Ozon shop search, Ozon seller products, competitor shop analysis, Ozon store products 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 店铺/卖家的商品与销量数据，也应触发此技能。\n---\n\n# Seerfar Ozon Shop Search\n\nThis skill lists the products of a specific Ozon shop (seller) from the Seerfar analytics database. Given a shop `id`, it returns each product's 30-day sales, price, rating, weight, fulfillment model (FBO/FBS), seller type (local / cross-border) and return/cancellation rate, plus the shop's total 30-day sales — the starting point for competitor-shop product analysis, best-seller mining, and seller catalog teardown.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one shop**: pass a single shop `id` and receive that shop's product catalog with performance metrics. This is a *shop-level* view, not a keyword or category view.\n\n**Where the shop `id` comes from**: `id` is the Seerfar seller/shop identifier — the same `sellerId` returned by other Seerfar Ozon tools (e.g. product report / product detail search). Negative ids (e.g. `-2` Ozon Express, `-4` Ozon Fresh) are Ozon's own platform sellers; positive ids are third-party sellers. If the user only has a shop name or product, first obtain the `sellerId` from a product-level Seerfar Ozon source, then call this skill.\n\n**Seller type**: each product carries `sellerType` — `0` local (本土), `1` cross-border (跨境). A shop is typically all one type; use it to judge whether a competitor is a domestic or cross-border seller.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are 30-day units; `price` is in Russian rubles (₽), indicated by `currency`.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| id | integer | yes | Shop (seller) ID — the `sellerId` from other Seerfar Ozon tools. Negative = Ozon platform seller. |\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}`; `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `reviewRating`, `upTime`. |\n| uId | string | no | User ID. |\n| memberId | string | no | Member ID (data attribution). |\n\nOnly `id` and `page` are required.\n\n## 调用方式\n\n- **API 端点**：`POST /seerfar/ozon/shopSearch`（完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/seerfar_ozon_shop_search.py '<JSON 参数>' [--inline]`\n- **成本约束**：本工具会消耗积分；同一会话同一参数组合默认只调用一次，脚本带 24h 本地缓存。失败/空结果不得自动换关键词、翻页或改邮编连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/linkfox-seerfar-ozon-shop-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. A shop's best-sellers (sort by 30-day sales)**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**2. A shop's newest listings (sort by upload time)**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"upTime\", \"direction\": \"DESC\"}]}}\n```\n\n**3. A shop's highest-priced products**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"price\", \"direction\": \"DESC\"}]}}\n```\n\n**4. Page deeper into a shop's catalog**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 2, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n## How to Build Queries\n\n1. **Always pass `page.orders`**: the catalog can be large — sort by the metric you care about (`sales` DESC for best-sellers, `upTime` DESC for new arrivals, `price` DESC for premium SKUs).\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 shop `id` first**: if the user gives a shop/product name rather than an id, obtain the `sellerId` from a product-level Seerfar Ozon source before calling this skill.\n4. **Use shop-level aggregates for context**: `totalSales` / `totalRevenue` / `dailySales` are shop-wide totals (independent of the page), `productCount` is the full catalog size, `rating` is the shop rating, and top-level `fulfillment` shows the FBO/FBS split — all quick health indicators for the whole shop.\n\n## Display Rules\n\n1. **Present data only**: show the shop's product metrics in a clear table without subjective advice.\n2. **Lead with shop context, then product columns**: state shop-level aggregates first — `totalSales` (30-day total), `totalRevenue` (total revenue, ₽), `productCount` (catalog size), `dailySales`, `rating`, and `fulfillment` distribution (e.g. FBO 72 / FBS 4) — then a table of `sku`, `price`, `sales`, `reviewRating`, `weight`, `sellerType`, `fulfillment`, `returnCancellationRate`.\n3. **Seller type label**: render `sellerType` as 本土/跨境 (0/1) so the user reads it at a glance.\n4. **Fulfillment**: `fulfillment` is an array (e.g. `[\"FBO\"]`); join multiple values with `/`.\n5. **Missing `returnCancellationRate`**: for Ozon platform sellers (negative `id`) this field is often absent — show `-` rather than failing.\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 shop**: a non-existent `id` 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- **`id` and `page` are both required**; omitting either returns `errcode 400`.\n- **`pageSize` max 20**: exceeding it returns `errcode 1002`.\n- **`total` is the page row count**, not the shop's full catalog size — use `hasNextPage` to decide whether to fetch more pages.\n- **No text/keyword filter**: this endpoint filters by shop only; to find a shop by name, use another Seerfar Ozon source first.\n- **Field variance by seller type**: `returnCancellationRate` is populated for third-party sellers but frequently absent for Ozon platform sellers (negative `id`). Schema-defined `productPageUrl`, `monthlySalesRevenue`, `brand` are not returned (upstream has no source, omitted rather than null).\n\n## User Expression & Scenario Quick Reference\n\n**Applicable** — analyzing one Ozon shop/seller's catalog:\n\n| User Says | Scenario |\n|-----------|----------|\n| \"分析下这个 Ozon 店铺的商品\" / \"这个卖家在卖什么\" | Shop product catalog |\n| \"这家店最畅销的商品是什么\" | Best-seller mining (sort by sales) |\n| \"这家店最近上了哪些新品\" | New arrivals (sort by upTime) |\n| \"这个竞品店铺的价格带/客单价\" | Price-band analysis (sort by price) |\n| \"这家店是本土还是跨境卖家\" | Seller type check (sellerType) |\n| \"这个店铺总销量多少\" | Shop health (totalSales) |\n\n**Not applicable** — Needs beyond one shop's catalog:\n- Discovering Ozon keywords by market metrics → use the Seerfar Ozon market keyword search skill.\n- A single product's full detail → use a product-level Seerfar Ozon source (this skill returns catalog-level fields only).\n- Browsing the category tree → use a category-level Seerfar Ozon source.\n- Finding which shop sells a given product → use a product-level Seerfar Ozon source to get the `sellerId` first.\n\n**Boundary judgment**: if the user already has a shop/seller ID (or a `sellerId` obtained from a product lookup) and wants to enumerate or rank that shop's products by sales/price/rating, start here. If they want market-level 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-shop-search\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1786100185843\n}\n\nFile v1.0.4:references/api.md\n\n# Seerfar Ozon 店铺商品搜索 API 参考\n\n## 调用规范\n\n- **请求地址**：`${LINKFOX_TOOL_GATEWAY}/seerfar/ozon/shopSearch`\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/2.0`；HTTP 超时 120s\n\n## 请求参数\n\nPOST Body（JSON）。以下字段与接口 `inputSchema` 一致。`id` 与 `page` 必填，其余可选。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| id | integer | 是 | 店铺（卖家）ID，即其他 Seerfar Ozon 工具返回的 `sellerId`；负值为 Ozon 平台自营卖家（如 `-2` Ozon Express、`-4` Ozon Fresh），正值为第三方卖家 |\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`、`reviewRating`、`upTime` |\n| uId | string | 否 | 用户 ID（最长 1000） |\n| memberId | string | 否 | 成员 ID（一个成员唯一标识，一个用户可归属多个团队，数据归属于 memberId，最长 1000） |\n\n> **必填约束**：`id` 与 `page` 均为必填；缺任意一项返回 `errcode 400`。\n> **分页上限**：`page.pageSize` 最大为 20，翻页请通过 `page.page` 递增。\n> **排序**：建议通过 `page.orders` 按核心指标排序（如 `sales` DESC 看爆品、`upTime` DESC 看新品），避免在无序结果中翻页。\n\n## 响应结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| code | string | 返回码，`\"200\"` 表示成功（成功时返回） |\n| errcode | integer | 错误码，`200` 表示成功；业务错误时仅返回此项（成功时与 `code` 并存） |\n| msg | string | 消息；成功为 `ok` |\n| errmsg | string | 错误消息；成功为 `ok`，业务错误时为原因描述 |\n| total | integer | **本页返回记录数**（等于当前页数据条数，并非店铺商品总数） |\n| totalSales | integer | 店铺近 30 天总销量 |\n| totalRevenue | integer | 店铺总销售额（卢布） |\n| dailySales | integer | 店铺日均销量 |\n| rating | number | 店铺评分（0-5） |\n| productCount | integer | 店铺商品总数（全店铺，非本页条数） |\n| fulfillment | object | 店铺配送方式分布，键为配送方式（`FBO`/`FBS`），值为该方式商品数，如 `{\"FBO\": 72, \"FBS\": 4}`（与商品级 `fulfillment` 数组不同） |\n| data | array | 店铺商品列表（详见下方） |\n| products | array | 店铺商品列表，内容与 `data` 完全一致 |\n| hasNextPage | boolean | 是否有下一页 |\n| columns | array | 列定义，元素含 `{field, title, cellType, sortable, filterable}` |\n| type | string | 响应展示类型，如 `productWorkbenches` |\n| costTime | integer | 接口耗时（毫秒） |\n| costToken | integer | 消耗 Token 数量 |\n\n### data[*] / products[*] 店铺商品对象字段\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| productId | integer | 统一商品 ID，映射自 `sku` |\n| sku | integer | 商品 SKU |\n| rating | number | 统一评分，映射自 `reviewRating` |\n| reviewRating | number | 商品评分 |\n| weight | number | 商品重量，单位 g |\n| sales | integer | 商品近 30 天销量 |\n| monthlySalesUnits | integer | 统一月销量，映射自 `sales` |\n| upTime | integer | 商品上架时间，毫秒时间戳 |\n| price | number | 商品价格（卢布） |\n| currency | string | 币种，固定 `₽` |\n| imageUrl | string | 统一主图 URL |\n| fulfillment | array | 商品配送方式，如 `[\"FBO\"]`，可能含多个值 |\n| sellerType | integer | 卖家类型：`0` 本土，`1` 跨境 |\n| returnCancellationRate | number | 商品退货取消率（%） |\n| sourceType | string | 数据源，固定 `ozon` |\n| sourceTool | string | 来源工具，如 `Seerfar-Ozon-查店铺` |\n\n> **字段差异**：`returnCancellationRate` 对第三方卖家普遍返回，但对 Ozon 平台自营卖家（`id` 为负值）常常缺失，使用前需判空。\n> **schema 中定义但实际不返回**：`productPageUrl`（统一商品页 URL）、`monthlySalesRevenue`（统一月销售额）、`brand`（统一品牌）在 outputSchema 中标注\"上游无对应字段，保持 null\"，实际响应中**不返回**这些字段（既非 null 也非空），不要依赖它们。\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`；常见为缺 `id`（`id 为必填参数`）、缺 `page`（`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**：传入不存在的 `id` 不会报错，而是返回 `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\": \"id 为必填参数\"\n}\n```\n\n## curl 示例\n\n```bash\ncurl -X POST https://tool-gateway.linkfox.com/seerfar/ozon/shopSearch \\\n  -H \"Authorization: $LINKFOXAGENT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"User-Agent: LinkFox-Skill/2.0\" \\\n  -d '{\n    \"id\": 1362816,\n    \"page\": {\"page\": 1, \"pageSize\": 20, \"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  \"total\": 20,\n  \"totalSales\": 8528,\n  \"totalRevenue\": 15113703,\n  \"dailySales\": 284,\n  \"rating\": 4.9,\n  \"productCount\": 76,\n  \"fulfillment\": {\"FBO\": 72, \"FBS\": 4},\n  \"hasNextPage\": true,\n  \"type\": \"productWorkbenches\",\n  \"costTime\": 2985,\n  \"costToken\": 16000,\n  \"data\": [\n    {\n      \"productId\": 1591817986,\n      \"sku\": 1591817986,\n      \"rating\": 4.9,\n      \"reviewRating\": 4.9,\n      \"weight\": 2950.0,\n      \"sales\": 869,\n      \"monthlySalesUnits\": 869,\n      \"upTime\": 1717084800000,\n      \"price\": 1556.0,\n      \"currency\": \"₽\",\n      \"imageUrl\": \"https://ir.ozone.ru/s3/multimedia-1-y/wc300/11054085154.jpg\",\n      \"fulfillment\": [\"FBO\"],\n      \"sellerType\": 0,\n      \"returnCancellationRate\": 17.5,\n      \"sourceType\": \"ozon\",\n      \"sourceTool\": \"Seerfar-Ozon-查店铺\"\n    }\n  ],\n  \"products\": [ ... ]\n}\n```\n\n> `products` 内容与 `data` 完全一致，示例中用 `[ ... ]` 表示省略，实际返回与 `data` 相同的完整商品数组。\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-shop-search\",\n  \"sentiment\": \"POSITIVE\",\n  \"category\": \"OTHER\",\n  \"content\": \"User successfully retrieved a competitor shop's best-sellers and 30-day total sales.\"\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\nSeerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。\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 users and e-commerce analysts use this skill to retrieve and compare one Ozon shop's product catalog, 30-day sales metrics, pricing, ratings, fulfillment model, seller type, and shop-level sales totals. It supports competitor shop analysis, best-seller discovery, and seller catalog breakdowns when the user has a Seerfar/Ozon seller ID.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill handles LinkFox API credentials and can guide phone/SMS onboarding.\n\nMitigation: Prefer a pre-created, limited-scope API key and only provide phone or SMS details when intentionally setting up access.\n\nRisk: The skill includes paid-credit purchase and billing flows.\n\nMitigation: Confirm costs and user intent before running purchase or order commands.\n\nRisk: The skill stores full API responses and generated files locally under linkfox directories.\n\nMitigation: Review saved files after use and delete local response data that should not persist.\n\nRisk: Endpoint environment variables can redirect LinkFox requests.\n\nMitigation: Keep default LinkFox endpoints unless an alternate endpoint is explicitly trusted.\n\nRisk: The skill can submit feedback automatically based on user reactions or observed issues.\n\nMitigation: Avoid including sensitive information in feedback content and review feedback behavior before deployment.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/linkfox-ai/skills/linkfox-seerfar-ozon-shop-search)\n- [Seerfar Ozon shop 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, shell commands, and saved JSON API responses.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Writes full API responses under linkfox session data directories, summarizes large responses by default, and uses a 24-hour local cache for repeated calls.]\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, 16158 bytes\n\nFiles: references/api.md (7844b), scripts/seerfar_ozon_shop_search.py (12703b), skill-card.md (2848b), SKILL.md (11077b), _meta.json (151b)\n\nFile v1.0.3:SKILL.md\n\n---\nname: linkfox-seerfar-ozon-shop-search\ndescription: Seerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。用于竞品店铺商品分析、店铺爆品挖掘、卖家商品结构拆解。当用户提到 Ozon 店铺商品、Ozon 卖家商品列表、竞品店铺分析、Ozon 店铺爆品、Ozon 卖家分析、Seerfar Ozon 店铺搜索、Ozon shop search, Ozon seller products, competitor shop analysis, Ozon store products 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 店铺/卖家的商品与销量数据，也应触发此技能。\n---\n\n# Seerfar Ozon Shop Search\n\nThis skill lists the products of a specific Ozon shop (seller) from the Seerfar analytics database. Given a shop `id`, it returns each product's 30-day sales, price, rating, weight, fulfillment model (FBO/FBS), seller type (local / cross-border) and return/cancellation rate, plus the shop's total 30-day sales — the starting point for competitor-shop product analysis, best-seller mining, and seller catalog teardown.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one shop**: pass a single shop `id` and receive that shop's product catalog with performance metrics. This is a *shop-level* view, not a keyword or category view.\n\n**Where the shop `id` comes from**: `id` is the Seerfar seller/shop identifier — the same `sellerId` returned by other Seerfar Ozon tools (e.g. product report / product detail search). Negative ids (e.g. `-2` Ozon Express, `-4` Ozon Fresh) are Ozon's own platform sellers; positive ids are third-party sellers. If the user only has a shop name or product, first obtain the `sellerId` from a product-level Seerfar Ozon source, then call this skill.\n\n**Seller type**: each product carries `sellerType` — `0` local (本土), `1` cross-border (跨境). A shop is typically all one type; use it to judge whether a competitor is a domestic or cross-border seller.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are 30-day units; `price` is in Russian rubles (₽), indicated by `currency`.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| id | integer | yes | Shop (seller) ID — the `sellerId` from other Seerfar Ozon tools. Negative = Ozon platform seller. |\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}`; `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `reviewRating`, `upTime`. |\n| uId | string | no | User ID. |\n| memberId | string | no | Member ID (data attribution). |\n\nOnly `id` and `page` are required.\n\n## 调用方式\n\n- **API 端点**：`POST /seerfar/ozon/shopSearch`（完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/seerfar_ozon_shop_search.py '<JSON 参数>' [--inline]`\n- **成本约束**：本工具会消耗积分；同一会话同一参数组合默认只调用一次，脚本带 24h 本地缓存。失败/空结果不得自动换关键词、翻页或改邮编连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/linkfox-seerfar-ozon-shop-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. A shop's best-sellers (sort by 30-day sales)**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**2. A shop's newest listings (sort by upload time)**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"upTime\", \"direction\": \"DESC\"}]}}\n```\n\n**3. A shop's highest-priced products**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"price\", \"direction\": \"DESC\"}]}}\n```\n\n**4. Page deeper into a shop's catalog**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 2, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n## How to Build Queries\n\n1. **Always pass `page.orders`**: the catalog can be large — sort by the metric you care about (`sales` DESC for best-sellers, `upTime` DESC for new arrivals, `price` DESC for premium SKUs).\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 shop `id` first**: if the user gives a shop/product name rather than an id, obtain the `sellerId` from a product-level Seerfar Ozon source before calling this skill.\n4. **Use `totalSales` for shop-level context**: the response's `totalSales` is the shop's total 30-day sales — a quick health indicator for the whole shop, independent of the current page.\n\n## Display Rules\n\n1. **Present data only**: show the shop's product metrics in a clear table without subjective advice.\n2. **Lead with shop context, then product columns**: state `totalSales` (shop 30-day total) first, then a table of `sku`, `price`, `sales`, `reviewRating`, `weight`, `sellerType`, `fulfillment`, `returnCancellationRate`.\n3. **Seller type label**: render `sellerType` as 本土/跨境 (0/1) so the user reads it at a glance.\n4. **Fulfillment**: `fulfillment` is an array (e.g. `[\"FBO\"]`); join multiple values with `/`.\n5. **Missing `returnCancellationRate`**: for Ozon platform sellers (negative `id`) this field is often absent — show `-` rather than failing.\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 shop**: a non-existent `id` 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- **`id` and `page` are both required**; omitting either returns `errcode 400`.\n- **`pageSize` max 20**: exceeding it returns `errcode 1002`.\n- **`total` is the page row count**, not the shop's full catalog size — use `hasNextPage` to decide whether to fetch more pages.\n- **No text/keyword filter**: this endpoint filters by shop only; to find a shop by name, use another Seerfar Ozon source first.\n- **Field variance by seller type**: `returnCancellationRate` is populated for third-party sellers but frequently absent for Ozon platform sellers (negative `id`). Schema-defined `productPageUrl`, `monthlySalesRevenue`, `brand` are not returned (upstream has no source, omitted rather than null).\n\n## User Expression & Scenario Quick Reference\n\n**Applicable** — analyzing one Ozon shop/seller's catalog:\n\n| User Says | Scenario |\n|-----------|----------|\n| \"分析下这个 Ozon 店铺的商品\" / \"这个卖家在卖什么\" | Shop product catalog |\n| \"这家店最畅销的商品是什么\" | Best-seller mining (sort by sales) |\n| \"这家店最近上了哪些新品\" | New arrivals (sort by upTime) |\n| \"这个竞品店铺的价格带/客单价\" | Price-band analysis (sort by price) |\n| \"这家店是本土还是跨境卖家\" | Seller type check (sellerType) |\n| \"这个店铺总销量多少\" | Shop health (totalSales) |\n\n**Not applicable** — Needs beyond one shop's catalog:\n- Discovering Ozon keywords by market metrics → use the Seerfar Ozon market keyword search skill.\n- A single product's full detail → use a product-level Seerfar Ozon source (this skill returns catalog-level fields only).\n- Browsing the category tree → use a category-level Seerfar Ozon source.\n- Finding which shop sells a given product → use a product-level Seerfar Ozon source to get the `sellerId` first.\n\n**Boundary judgment**: if the user already has a shop/seller ID (or a `sellerId` obtained from a product lookup) and wants to enumerate or rank that shop's products by sales/price/rating, start here. If they want market-level 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-shop-search\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1785900020617\n}\n\nFile v1.0.3:references/api.md\n\n# Seerfar Ozon 店铺商品搜索 API 参考\n\n## 调用规范\n\n- **请求地址**：`${LINKFOX_TOOL_GATEWAY}/seerfar/ozon/shopSearch`\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` 一致。`id` 与 `page` 必填，其余可选。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| id | integer | 是 | 店铺（卖家）ID，即其他 Seerfar Ozon 工具返回的 `sellerId`；负值为 Ozon 平台自营卖家（如 `-2` Ozon Express、`-4` Ozon Fresh），正值为第三方卖家 |\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`、`reviewRating`、`upTime` |\n| uId | string | 否 | 用户 ID（最长 1000） |\n| memberId | string | 否 | 成员 ID（一个成员唯一标识，一个用户可归属多个团队，数据归属于 memberId，最长 1000） |\n\n> **必填约束**：`id` 与 `page` 均为必填；缺任意一项返回 `errcode 400`。\n> **分页上限**：`page.pageSize` 最大为 20，翻页请通过 `page.page` 递增。\n> **排序**：建议通过 `page.orders` 按核心指标排序（如 `sales` DESC 看爆品、`upTime` DESC 看新品），避免在无序结果中翻页。\n\n## 响应结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| code | string | 返回码，`\"200\"` 表示成功（成功时返回） |\n| errcode | integer | 错误码，`200` 表示成功；业务错误时仅返回此项（成功时与 `code` 并存） |\n| msg | string | 消息；成功为 `ok` |\n| errmsg | string | 错误消息；成功为 `ok`，业务错误时为原因描述 |\n| total | integer | **本页返回记录数**（等于当前页数据条数，并非店铺商品总数） |\n| totalSales | integer | 店铺近 30 天总销量 |\n| data | array | 店铺商品列表（详见下方） |\n| products | array | 店铺商品列表，内容与 `data` 完全一致 |\n| hasNextPage | boolean | 是否有下一页 |\n| columns | array | 列定义，元素含 `{field, title, cellType, sortable, filterable}` |\n| type | string | 响应展示类型，如 `productWorkbenches` |\n| costTime | integer | 接口耗时（毫秒） |\n| costToken | integer | 消耗 Token 数量 |\n\n### data[*] / products[*] 店铺商品对象字段\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| productId | integer | 统一商品 ID，映射自 `sku` |\n| sku | integer | 商品 SKU |\n| rating | number | 统一评分，映射自 `reviewRating` |\n| reviewRating | number | 商品评分 |\n| weight | number | 商品重量，单位 g |\n| sales | integer | 商品近 30 天销量 |\n| monthlySalesUnits | integer | 统一月销量，映射自 `sales` |\n| upTime | integer | 商品上架时间，毫秒时间戳 |\n| price | number | 商品价格（卢布） |\n| currency | string | 币种，固定 `₽` |\n| imageUrl | string | 统一主图 URL |\n| fulfillment | array | 商品配送方式，如 `[\"FBO\"]`，可能含多个值 |\n| sellerType | integer | 卖家类型：`0` 本土，`1` 跨境 |\n| returnCancellationRate | number | 商品退货取消率（%） |\n| sourceType | string | 数据源，固定 `ozon` |\n| sourceTool | string | 来源工具，如 `Seerfar-Ozon-查店铺` |\n\n> **字段差异**：`returnCancellationRate` 对第三方卖家普遍返回，但对 Ozon 平台自营卖家（`id` 为负值）常常缺失，使用前需判空。\n> **schema 中定义但实际不返回**：`productPageUrl`（统一商品页 URL）、`monthlySalesRevenue`（统一月销售额）、`brand`（统一品牌）在 outputSchema 中标注\"上游无对应字段，保持 null\"，实际响应中**不返回**这些字段（既非 null 也非空），不要依赖它们。\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`；常见为缺 `id`（`id 为必填参数`）、缺 `page`（`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**：传入不存在的 `id` 不会报错，而是返回 `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\": \"id 为必填参数\"\n}\n```\n\n## curl 示例\n\n```bash\ncurl -X POST https://tool-gateway.linkfox.com/seerfar/ozon/shopSearch \\\n  -H \"Authorization: $LINKFOXAGENT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"User-Agent: LinkFox-Skill/1.0\" \\\n  -d '{\n    \"id\": 1362816,\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  \"total\": 5,\n  \"totalSales\": 11782,\n  \"hasNextPage\": true,\n  \"type\": \"productWorkbenches\",\n  \"costTime\": 4706,\n  \"costToken\": 16000,\n  \"data\": [\n    {\n      \"productId\": 1310550649,\n      \"sku\": 1310550649,\n      \"rating\": 4.9,\n      \"reviewRating\": 4.9,\n      \"weight\": 5650.0,\n      \"sales\": 1098,\n      \"monthlySalesUnits\": 1098,\n      \"upTime\": 1700928000000,\n      \"price\": 2591.0,\n      \"currency\": \"₽\",\n      \"imageUrl\": \"https://ir.ozone.ru/s3/multimedia-1-h/wc300/11110286861.jpg\",\n      \"fulfillment\": [\"FBO\"],\n      \"sellerType\": 0,\n      \"returnCancellationRate\": 15.6,\n      \"sourceType\": \"ozon\",\n      \"sourceTool\": \"Seerfar-Ozon-查店铺\"\n    }\n  ],\n  \"products\": [ ... ]\n}\n```\n\n> `products` 内容与 `data` 完全一致，示例中用 `[ ... ]` 表示省略，实际返回与 `data` 相同的完整商品数组。\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-shop-search\",\n  \"sentiment\": \"POSITIVE\",\n  \"category\": \"OTHER\",\n  \"content\": \"User successfully retrieved a competitor shop's best-sellers and 30-day total sales.\"\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:\n\nSearches a specified Ozon seller's Seerfar product catalog and returns 30-day sales, price, rating, fulfillment, seller type, return/cancellation rate, and total shop sales.\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 marketplace analysts and ecommerce operators use this skill to inspect one Ozon seller's product catalog, rank products by sales, price, rating, or listing time, and present shop-level sales context. It is intended for product catalog analysis after the user has a Seerfar seller or shop ID.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill requires a LinkFox API key and can send requests through an environment-selected gateway.\n\nMitigation: Restrict API key scope where possible, review the LINKFOX_TOOL_GATEWAY setting before use, and avoid running the skill in environments where gateway overrides are not allowed.\n\nRisk: The skill can consume paid LinkFox credits for shop-search calls and additional pagination.\n\nMitigation: Confirm cost-sensitive follow-up calls with the user, keep page size within the documented limit, and rely on the 24-hour cache for repeated identical requests.\n\nRisk: Full Ozon shop-search responses are retained locally in LinkFox data and cache directories.\n\nMitigation: Treat saved responses as sensitive business data, limit where the skill is run, and periodically delete generated LinkFox session and cache files when retention is not needed.\n\nRisk: Authentication or billing failures may trigger onboarding behavior that references downloading an additional LinkFox onboarding skill.\n\nMitigation: Review or disable onboarding-download behavior in controlled environments and require user authorization before installing additional skill content.\n\n## Reference(s):\n\n- [Seerfar Ozon shop-search API reference](references/api.md)\n- [ClawHub skill page](https://clawhub.ai/linkfox-ai/skills/linkfox-seerfar-ozon-shop-search)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, files]\n\n**Output Format:** [Markdown tables and guidance, shell command examples, stdout JSON or summaries, and saved JSON response files.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires a LinkFox API key; default script behavior caches identical requests for 24 hours and stores full responses under LinkFox session data.]\n\n## Skill Version(s):\n\n1.0.3 (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.2: 5 files, 16019 bytes\n\nFiles: references/api.md (7844b), scripts/seerfar_ozon_shop_search.py (12703b), skill-card.md (2440b), SKILL.md (11077b), _meta.json (151b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: linkfox-seerfar-ozon-shop-search\ndescription: Seerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。用于竞品店铺商品分析、店铺爆品挖掘、卖家商品结构拆解。当用户提到 Ozon 店铺商品、Ozon 卖家商品列表、竞品店铺分析、Ozon 店铺爆品、Ozon 卖家分析、Seerfar Ozon 店铺搜索、Ozon shop search, Ozon seller products, competitor shop analysis, Ozon store products 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 店铺/卖家的商品与销量数据，也应触发此技能。\n---\n\n# Seerfar Ozon Shop Search\n\nThis skill lists the products of a specific Ozon shop (seller) from the Seerfar analytics database. Given a shop `id`, it returns each product's 30-day sales, price, rating, weight, fulfillment model (FBO/FBS), seller type (local / cross-border) and return/cancellation rate, plus the shop's total 30-day sales — the starting point for competitor-shop product analysis, best-seller mining, and seller catalog teardown.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one shop**: pass a single shop `id` and receive that shop's product catalog with performance metrics. This is a *shop-level* view, not a keyword or category view.\n\n**Where the shop `id` comes from**: `id` is the Seerfar seller/shop identifier — the same `sellerId` returned by other Seerfar Ozon tools (e.g. product report / product detail search). Negative ids (e.g. `-2` Ozon Express, `-4` Ozon Fresh) are Ozon's own platform sellers; positive ids are third-party sellers. If the user only has a shop name or product, first obtain the `sellerId` from a product-level Seerfar Ozon source, then call this skill.\n\n**Seller type**: each product carries `sellerType` — `0` local (本土), `1` cross-border (跨境). A shop is typically all one type; use it to judge whether a competitor is a domestic or cross-border seller.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are 30-day units; `price` is in Russian rubles (₽), indicated by `currency`.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| id | integer | yes | Shop (seller) ID — the `sellerId` from other Seerfar Ozon tools. Negative = Ozon platform seller. |\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}`; `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `reviewRating`, `upTime`. |\n| uId | string | no | User ID. |\n| memberId | string | no | Member ID (data attribution). |\n\nOnly `id` and `page` are required.\n\n## 调用方式\n\n- **API 端点**：`POST /seerfar/ozon/shopSearch`（完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/seerfar_ozon_shop_search.py '<JSON 参数>' [--inline]`\n- **成本约束**：本工具会消耗积分；同一会话同一参数组合默认只调用一次，脚本带 24h 本地缓存。失败/空结果不得自动换关键词、翻页或改邮编连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/linkfox-seerfar-ozon-shop-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. A shop's best-sellers (sort by 30-day sales)**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**2. A shop's newest listings (sort by upload time)**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"upTime\", \"direction\": \"DESC\"}]}}\n```\n\n**3. A shop's highest-priced products**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"price\", \"direction\": \"DESC\"}]}}\n```\n\n**4. Page deeper into a shop's catalog**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 2, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n## How to Build Queries\n\n1. **Always pass `page.orders`**: the catalog can be large — sort by the metric you care about (`sales` DESC for best-sellers, `upTime` DESC for new arrivals, `price` DESC for premium SKUs).\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 shop `id` first**: if the user gives a shop/product name rather than an id, obtain the `sellerId` from a product-level Seerfar Ozon source before calling this skill.\n4. **Use `totalSales` for shop-level context**: the response's `totalSales` is the shop's total 30-day sales — a quick health indicator for the whole shop, independent of the current page.\n\n## Display Rules\n\n1. **Present data only**: show the shop's product metrics in a clear table without subjective advice.\n2. **Lead with shop context, then product columns**: state `totalSales` (shop 30-day total) first, then a table of `sku`, `price`, `sales`, `reviewRating`, `weight`, `sellerType`, `fulfillment`, `returnCancellationRate`.\n3. **Seller type label**: render `sellerType` as 本土/跨境 (0/1) so the user reads it at a glance.\n4. **Fulfillment**: `fulfillment` is an array (e.g. `[\"FBO\"]`); join multiple values with `/`.\n5. **Missing `returnCancellationRate`**: for Ozon platform sellers (negative `id`) this field is often absent — show `-` rather than failing.\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 shop**: a non-existent `id` 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- **`id` and `page` are both required**; omitting either returns `errcode 400`.\n- **`pageSize` max 20**: exceeding it returns `errcode 1002`.\n- **`total` is the page row count**, not the shop's full catalog size — use `hasNextPage` to decide whether to fetch more pages.\n- **No text/keyword filter**: this endpoint filters by shop only; to find a shop by name, use another Seerfar Ozon source first.\n- **Field variance by seller type**: `returnCancellationRate` is populated for third-party sellers but frequently absent for Ozon platform sellers (negative `id`). Schema-defined `productPageUrl`, `monthlySalesRevenue`, `brand` are not returned (upstream has no source, omitted rather than null).\n\n## User Expression & Scenario Quick Reference\n\n**Applicable** — analyzing one Ozon shop/seller's catalog:\n\n| User Says | Scenario |\n|-----------|----------|\n| \"分析下这个 Ozon 店铺的商品\" / \"这个卖家在卖什么\" | Shop product catalog |\n| \"这家店最畅销的商品是什么\" | Best-seller mining (sort by sales) |\n| \"这家店最近上了哪些新品\" | New arrivals (sort by upTime) |\n| \"这个竞品店铺的价格带/客单价\" | Price-band analysis (sort by price) |\n| \"这家店是本土还是跨境卖家\" | Seller type check (sellerType) |\n| \"这个店铺总销量多少\" | Shop health (totalSales) |\n\n**Not applicable** — Needs beyond one shop's catalog:\n- Discovering Ozon keywords by market metrics → use the Seerfar Ozon market keyword search skill.\n- A single product's full detail → use a product-level Seerfar Ozon source (this skill returns catalog-level fields only).\n- Browsing the category tree → use a category-level Seerfar Ozon source.\n- Finding which shop sells a given product → use a product-level Seerfar Ozon source to get the `sellerId` first.\n\n**Boundary judgment**: if the user already has a shop/seller ID (or a `sellerId` obtained from a product lookup) and wants to enumerate or rank that shop's products by sales/price/rating, start here. If they want market-level 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.2:_meta.json\n\n{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-seerfar-ozon-shop-search\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1783945060493\n}\n\nFile v1.0.2:references/api.md\n\n# Seerfar Ozon 店铺商品搜索 API 参考\n\n## 调用规范\n\n- **请求地址**：`${LINKFOX_TOOL_GATEWAY}/seerfar/ozon/shopSearch`\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` 一致。`id` 与 `page` 必填，其余可选。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| id | integer | 是 | 店铺（卖家）ID，即其他 Seerfar Ozon 工具返回的 `sellerId`；负值为 Ozon 平台自营卖家（如 `-2` Ozon Express、`-4` Ozon Fresh），正值为第三方卖家 |\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`、`reviewRating`、`upTime` |\n| uId | string | 否 | 用户 ID（最长 1000） |\n| memberId | string | 否 | 成员 ID（一个成员唯一标识，一个用户可归属多个团队，数据归属于 memberId，最长 1000） |\n\n> **必填约束**：`id` 与 `page` 均为必填；缺任意一项返回 `errcode 400`。\n> **分页上限**：`page.pageSize` 最大为 20，翻页请通过 `page.page` 递增。\n> **排序**：建议通过 `page.orders` 按核心指标排序（如 `sales` DESC 看爆品、`upTime` DESC 看新品），避免在无序结果中翻页。\n\n## 响应结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| code | string | 返回码，`\"200\"` 表示成功（成功时返回） |\n| errcode | integer | 错误码，`200` 表示成功；业务错误时仅返回此项（成功时与 `code` 并存） |\n| msg | string | 消息；成功为 `ok` |\n| errmsg | string | 错误消息；成功为 `ok`，业务错误时为原因描述 |\n| total | integer | **本页返回记录数**（等于当前页数据条数，并非店铺商品总数） |\n| totalSales | integer | 店铺近 30 天总销量 |\n| data | array | 店铺商品列表（详见下方） |\n| products | array | 店铺商品列表，内容与 `data` 完全一致 |\n| hasNextPage | boolean | 是否有下一页 |\n| columns | array | 列定义，元素含 `{field, title, cellType, sortable, filterable}` |\n| type | string | 响应展示类型，如 `productWorkbenches` |\n| costTime | integer | 接口耗时（毫秒） |\n| costToken | integer | 消耗 Token 数量 |\n\n### data[*] / products[*] 店铺商品对象字段\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| productId | integer | 统一商品 ID，映射自 `sku` |\n| sku | integer | 商品 SKU |\n| rating | number | 统一评分，映射自 `reviewRating` |\n| reviewRating | number | 商品评分 |\n| weight | number | 商品重量，单位 g |\n| sales | integer | 商品近 30 天销量 |\n| monthlySalesUnits | integer | 统一月销量，映射自 `sales` |\n| upTime | integer | 商品上架时间，毫秒时间戳 |\n| price | number | 商品价格（卢布） |\n| currency | string | 币种，固定 `₽` |\n| imageUrl | string | 统一主图 URL |\n| fulfillment | array | 商品配送方式，如 `[\"FBO\"]`，可能含多个值 |\n| sellerType | integer | 卖家类型：`0` 本土，`1` 跨境 |\n| returnCancellationRate | number | 商品退货取消率（%） |\n| sourceType | string | 数据源，固定 `ozon` |\n| sourceTool | string | 来源工具，如 `Seerfar-Ozon-查店铺` |\n\n> **字段差异**：`returnCancellationRate` 对第三方卖家普遍返回，但对 Ozon 平台自营卖家（`id` 为负值）常常缺失，使用前需判空。\n> **schema 中定义但实际不返回**：`productPageUrl`（统一商品页 URL）、`monthlySalesRevenue`（统一月销售额）、`brand`（统一品牌）在 outputSchema 中标注\"上游无对应字段，保持 null\"，实际响应中**不返回**这些字段（既非 null 也非空），不要依赖它们。\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`；常见为缺 `id`（`id 为必填参数`）、缺 `page`（`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**：传入不存在的 `id` 不会报错，而是返回 `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\": \"id 为必填参数\"\n}\n```\n\n## curl 示例\n\n```bash\ncurl -X POST https://tool-gateway.linkfox.com/seerfar/ozon/shopSearch \\\n  -H \"Authorization: $LINKFOXAGENT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"User-Agent: LinkFox-Skill/1.0\" \\\n  -d '{\n    \"id\": 1362816,\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  \"total\": 5,\n  \"totalSales\": 11782,\n  \"hasNextPage\": true,\n  \"type\": \"productWorkbenches\",\n  \"costTime\": 4706,\n  \"costToken\": 16000,\n  \"data\": [\n    {\n      \"productId\": 1310550649,\n      \"sku\": 1310550649,\n      \"rating\": 4.9,\n      \"reviewRating\": 4.9,\n      \"weight\": 5650.0,\n      \"sales\": 1098,\n      \"monthlySalesUnits\": 1098,\n      \"upTime\": 1700928000000,\n      \"price\": 2591.0,\n      \"currency\": \"₽\",\n      \"imageUrl\": \"https://ir.ozone.ru/s3/multimedia-1-h/wc300/11110286861.jpg\",\n      \"fulfillment\": [\"FBO\"],\n      \"sellerType\": 0,\n      \"returnCancellationRate\": 15.6,\n      \"sourceType\": \"ozon\",\n      \"sourceTool\": \"Seerfar-Ozon-查店铺\"\n    }\n  ],\n  \"products\": [ ... ]\n}\n```\n\n> `products` 内容与 `data` 完全一致，示例中用 `[ ... ]` 表示省略，实际返回与 `data` 相同的完整商品数组。\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-shop-search\",\n  \"sentiment\": \"POSITIVE\",\n  \"category\": \"OTHER\",\n  \"content\": \"User successfully retrieved a competitor shop's best-sellers and 30-day total sales.\"\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>\nFetches product-level metrics for a specific Ozon shop or seller from Seerfar, including 30-day sales, price, rating, weight, fulfillment, seller type, return or cancellation rate, and shop-level 30-day sales. <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 users and e-commerce analysts use this skill to inspect a known Ozon seller's catalog, rank products by sales, price, rating, or listing time, and prepare competitor-shop product analysis from Seerfar data. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: A custom LINKFOX_TOOL_GATEWAY can receive the API key used by the skill. <br>\nMitigation: Avoid setting LINKFOX_TOOL_GATEWAY unless the destination is controlled and trusted. <br>\nRisk: Full Ozon analytics responses may be persisted in the workspace or session data directory. <br>\nMitigation: Use the skill only in workspaces where saving those responses is acceptable, and review saved files before sharing or committing workspace contents. <br>\nRisk: Authentication or quota recovery can involve an external onboarding-skill download. <br>\nMitigation: Confirm the onboarding download before allowing installation, and prefer existing onboarding guidance when available. <br>\n\n\n## Reference(s): <br>\n- [ClawHub Skill Page](https://clawhub.ai/linkfox-ai/skills/linkfox-seerfar-ozon-shop-search) <br>\n- [Seerfar Ozon 店铺商品搜索 API 参考](artifact/references/api.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, JSON, shell commands, code, guidance] <br>\n**Output Format:** [Markdown tables and summaries, JSON API responses, and Python or curl command examples] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Responses may be saved as JSON under a linkfox session data directory; the API uses paginated requests with a maximum pageSize of 20 and consumes LinkFox credits.] <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: 5 files, 15331 bytes\n\nFiles: references/api.md (7815b), scripts/seerfar_ozon_shop_search.py (12796b), skill-card.md (2440b), SKILL.md (9749b), _meta.json (151b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: linkfox-seerfar-ozon-shop-search\ndescription: Seerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。用于竞品店铺商品分析、店铺爆品挖掘、卖家商品结构拆解。当用户提到 Ozon 店铺商品、Ozon 卖家商品列表、竞品店铺分析、Ozon 店铺爆品、Ozon 卖家分析、Seerfar Ozon 店铺搜索、Ozon shop search, Ozon seller products, competitor shop analysis, Ozon store products 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 店铺/卖家的商品与销量数据，也应触发此技能。\n---\n\n# Seerfar Ozon Shop Search\n\nThis skill lists the products of a specific Ozon shop (seller) from the Seerfar analytics database. Given a shop `id`, it returns each product's 30-day sales, price, rating, weight, fulfillment model (FBO/FBS), seller type (local / cross-border) and return/cancellation rate, plus the shop's total 30-day sales — the starting point for competitor-shop product analysis, best-seller mining, and seller catalog teardown.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one shop**: pass a single shop `id` and receive that shop's product catalog with performance metrics. This is a *shop-level* view, not a keyword or category view.\n\n**Where the shop `id` comes from**: `id` is the Seerfar seller/shop identifier — the same `sellerId` returned by other Seerfar Ozon tools (e.g. product report / product detail search). Negative ids (e.g. `-2` Ozon Express, `-4` Ozon Fresh) are Ozon's own platform sellers; positive ids are third-party sellers. If the user only has a shop name or product, first obtain the `sellerId` from a product-level Seerfar Ozon source, then call this skill.\n\n**Seller type**: each product carries `sellerType` — `0` local (本土), `1` cross-border (跨境). A shop is typically all one type; use it to judge whether a competitor is a domestic or cross-border seller.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are 30-day units; `price` is in Russian rubles (₽), indicated by `currency`.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| id | integer | yes | Shop (seller) ID — the `sellerId` from other Seerfar Ozon tools. Negative = Ozon platform seller. |\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}`; `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `reviewRating`, `upTime`. |\n| uId | string | no | User ID. |\n| memberId | string | no | Member ID (data attribution). |\n\nOnly `id` and `page` are required.\n\n## 调用方式\n\n- **API 端点**：`POST /seerfar/ozon/shopSearch`（完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/seerfar_ozon_shop_search.py '<JSON 参数>' [--inline]`\n- **成本约束**：本工具会消耗积分；同一会话同一参数组合默认只调用一次，脚本带 24h 本地缓存。失败/空结果不得自动换关键词、翻页或改邮编连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/linkfox-seerfar-ozon-shop-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. A shop's best-sellers (sort by 30-day sales)**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**2. A shop's newest listings (sort by upload time)**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"upTime\", \"direction\": \"DESC\"}]}}\n```\n\n**3. A shop's highest-priced products**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"price\", \"direction\": \"DESC\"}]}}\n```\n\n**4. Page deeper into a shop's catalog**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 2, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n## How to Build Queries\n\n1. **Always pass `page.orders`**: the catalog can be large — sort by the metric you care about (`sales` DESC for best-sellers, `upTime` DESC for new arrivals, `price` DESC for premium SKUs).\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 shop `id` first**: if the user gives a shop/product name rather than an id, obtain the `sellerId` from a product-level Seerfar Ozon source before calling this skill.\n4. **Use `totalSales` for shop-level context**: the response's `totalSales` is the shop's total 30-day sales — a quick health indicator for the whole shop, independent of the current page.\n\n## Display Rules\n\n1. **Present data only**: show the shop's product metrics in a clear table without subjective advice.\n2. **Lead with shop context, then product columns**: state `totalSales` (shop 30-day total) first, then a table of `sku`, `price`, `sales`, `reviewRating`, `weight`, `sellerType`, `fulfillment`, `returnCancellationRate`.\n3. **Seller type label**: render `sellerType` as 本土/跨境 (0/1) so the user reads it at a glance.\n4. **Fulfillment**: `fulfillment` is an array (e.g. `[\"FBO\"]`); join multiple values with `/`.\n5. **Missing `returnCancellationRate`**: for Ozon platform sellers (negative `id`) this field is often absent — show `-` rather than failing.\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 shop**: a non-existent `id` 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- **`id` and `page` are both required**; omitting either returns `errcode 400`.\n- **`pageSize` max 20**: exceeding it returns `errcode 1002`.\n- **`total` is the page row count**, not the shop's full catalog size — use `hasNextPage` to decide whether to fetch more pages.\n- **No text/keyword filter**: this endpoint filters by shop only; to find a shop by name, use another Seerfar Ozon source first.\n- **Field variance by seller type**: `returnCancellationRate` is populated for third-party sellers but frequently absent for Ozon platform sellers (negative `id`). Schema-defined `productPageUrl`, `monthlySalesRevenue`, `brand` are not returned (upstream has no source, omitted rather than null).\n\n## User Expression & Scenario Quick Reference\n\n**Applicable** — analyzing one Ozon shop/seller's catalog:\n\n| User Says | Scenario |\n|-----------|----------|\n| \"分析下这个 Ozon 店铺的商品\" / \"这个卖家在卖什么\" | Shop product catalog |\n| \"这家店最畅销的商品是什么\" | Best-seller mining (sort by sales) |\n| \"这家店最近上了哪些新品\" | New arrivals (sort by upTime) |\n| \"这个竞品店铺的价格带/客单价\" | Price-band analysis (sort by price) |\n| \"这家店是本土还是跨境卖家\" | Seller type check (sellerType) |\n| \"这个店铺总销量多少\" | Shop health (totalSales) |\n\n**Not applicable** — Needs beyond one shop's catalog:\n- Discovering Ozon keywords by market metrics → use the Seerfar Ozon market keyword search skill.\n- A single product's full detail → use a product-level Seerfar Ozon source (this skill returns catalog-level fields only).\n- Browsing the category tree → use a category-level Seerfar Ozon source.\n- Finding which shop sells a given product → use a product-level Seerfar Ozon source to get the `sellerId` first.\n\n**Boundary judgment**: if the user already has a shop/seller ID (or a `sellerId` obtained from a product lookup) and wants to enumerate or rank that shop's products by sales/price/rating, start here. If they want market-level 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-shop-search\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1783337163792\n}\n\nFile v1.0.1:references/api.md\n\n# Seerfar Ozon 店铺商品搜索 API 参考\n\n## 调用规范\n\n- **请求地址**：`${LINKFOX_TOOL_GATEWAY}/seerfar/ozon/shopSearch`\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` 一致。`id` 与 `page` 必填，其余可选。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| id | integer | 是 | 店铺（卖家）ID，即其他 Seerfar Ozon 工具返回的 `sellerId`；负值为 Ozon 平台自营卖家（如 `-2` Ozon Express、`-4` Ozon Fresh），正值为第三方卖家 |\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`、`reviewRating`、`upTime` |\n| uId | string | 否 | 用户 ID（最长 1000） |\n| memberId | string | 否 | 成员 ID（一个成员唯一标识，一个用户可归属多个团队，数据归属于 memberId，最长 1000） |\n\n> **必填约束**：`id` 与 `page` 均为必填；缺任意一项返回 `errcode 400`。\n> **分页上限**：`page.pageSize` 最大为 20，翻页请通过 `page.page` 递增。\n> **排序**：建议通过 `page.orders` 按核心指标排序（如 `sales` DESC 看爆品、`upTime` DESC 看新品），避免在无序结果中翻页。\n\n## 响应结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| code | string | 返回码，`\"200\"` 表示成功（成功时返回） |\n| errcode | integer | 错误码，`200` 表示成功；业务错误时仅返回此项（成功时与 `code` 并存） |\n| msg | string | 消息；成功为 `ok` |\n| errmsg | string | 错误消息；成功为 `ok`，业务错误时为原因描述 |\n| total | integer | **本页返回记录数**（等于当前页数据条数，并非店铺商品总数） |\n| totalSales | integer | 店铺近 30 天总销量 |\n| data | array | 店铺商品列表（详见下方） |\n| products | array | 店铺商品列表，内容与 `data` 完全一致 |\n| hasNextPage | boolean | 是否有下一页 |\n| columns | array | 列定义，元素含 `{field, title, cellType, sortable, filterable}` |\n| type | string | 响应展示类型，如 `productWorkbenches` |\n| costTime | integer | 接口耗时（毫秒） |\n| costToken | integer | 消耗 Token 数量 |\n\n### data[*] / products[*] 店铺商品对象字段\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| productId | integer | 统一商品 ID，映射自 `sku` |\n| sku | integer | 商品 SKU |\n| rating | number | 统一评分，映射自 `reviewRating` |\n| reviewRating | number | 商品评分 |\n| weight | number | 商品重量，单位 g |\n| sales | integer | 商品近 30 天销量 |\n| monthlySalesUnits | integer | 统一月销量，映射自 `sales` |\n| upTime | integer | 商品上架时间，毫秒时间戳 |\n| price | number | 商品价格（卢布） |\n| currency | string | 币种，固定 `₽` |\n| imageUrl | string | 统一主图 URL |\n| fulfillment | array | 商品配送方式，如 `[\"FBO\"]`，可能含多个值 |\n| sellerType | integer | 卖家类型：`0` 本土，`1` 跨境 |\n| returnCancellationRate | number | 商品退货取消率（%） |\n| sourceType | string | 数据源，固定 `ozon` |\n| sourceTool | string | 来源工具，如 `Seerfar-Ozon-查店铺` |\n\n> **字段差异**：`returnCancellationRate` 对第三方卖家普遍返回，但对 Ozon 平台自营卖家（`id` 为负值）常常缺失，使用前需判空。\n> **schema 中定义但实际不返回**：`productPageUrl`（统一商品页 URL）、`monthlySalesRevenue`（统一月销售额）、`brand`（统一品牌）在 outputSchema 中标注\"上游无对应字段，保持 null\"，实际响应中**不返回**这些字段（既非 null 也非空），不要依赖它们。\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`；常见为缺 `id`（`id 为必填参数`）、缺 `page`（`page 为必填参数`） |\n| 1002 | 分页参数超出限制 | `page.pageSize` 最大为 20，调小后重试 |\n| 1003 | 请求过于频繁 | 限流，稍后重试 |\n| 401 | 认证失败 | 检查请求头 `Authorization` 是否正确携带 API Key；API Key 申请方式请参考上述[调用规范](#调用规范)下的认证方式 |\n| 其他非 200 值 | 业务异常 | 查看 `errmsg` 获取具体原因 |\n\n> **不存在的店铺 ID**：传入不存在的 `id` 不会报错，而是返回 `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\": \"id 为必填参数\"\n}\n```\n\n## curl 示例\n\n```bash\ncurl -X POST https://tool-gateway.linkfox.com/seerfar/ozon/shopSearch \\\n  -H \"Authorization: $LINKFOXAGENT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"User-Agent: LinkFox-Skill/1.0\" \\\n  -d '{\n    \"id\": 1362816,\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  \"total\": 5,\n  \"totalSales\": 11782,\n  \"hasNextPage\": true,\n  \"type\": \"productWorkbenches\",\n  \"costTime\": 4706,\n  \"costToken\": 16000,\n  \"data\": [\n    {\n      \"productId\": 1310550649,\n      \"sku\": 1310550649,\n      \"rating\": 4.9,\n      \"reviewRating\": 4.9,\n      \"weight\": 5650.0,\n      \"sales\": 1098,\n      \"monthlySalesUnits\": 1098,\n      \"upTime\": 1700928000000,\n      \"price\": 2591.0,\n      \"currency\": \"₽\",\n      \"imageUrl\": \"https://ir.ozone.ru/s3/multimedia-1-h/wc300/11110286861.jpg\",\n      \"fulfillment\": [\"FBO\"],\n      \"sellerType\": 0,\n      \"returnCancellationRate\": 15.6,\n      \"sourceType\": \"ozon\",\n      \"sourceTool\": \"Seerfar-Ozon-查店铺\"\n    }\n  ],\n  \"products\": [ ... ]\n}\n```\n\n> `products` 内容与 `data` 完全一致，示例中用 `[ ... ]` 表示省略，实际返回与 `data` 相同的完整商品数组。\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-shop-search\",\n  \"sentiment\": \"POSITIVE\",\n  \"category\": \"OTHER\",\n  \"content\": \"User successfully retrieved a competitor shop's best-sellers and 30-day total sales.\"\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.1:skill-card.md\n\n## Description: <br>\nSeerfar Ozon Shop Search retrieves a seller's Ozon product catalog from Seerfar by shop ID, including 30-day sales, price, rating, fulfillment model, seller type, return/cancellation rate, and shop-level 30-day sales. <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 analysts, marketplace operators, and developers use this skill to inspect one Ozon seller's product catalog, identify best-selling or newly listed products, and compare shop-level product metrics. It is intended for data presentation and routing, not subjective business advice. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill uses sensitive authorization or session values from the runtime environment. <br>\nMitigation: Install and run it only in trusted environments, scope the LinkFox API key appropriately, and rotate or revoke credentials when access is no longer needed. <br>\nRisk: The skill sends Ozon shop-analysis queries through an external LinkFox gateway. <br>\nMitigation: Use a fixed, trusted gateway URL and avoid submitting confidential or regulated data unless the gateway and data handling are approved for that use. <br>\nRisk: Returned business data can be persisted in local response and cache files. <br>\nMitigation: Confirm where result files are stored, apply normal workspace access controls, and periodically delete cached response and session files. <br>\n\n\n## Reference(s): <br>\n- [Seerfar Ozon shop search API reference](references/api.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Text, Markdown, JSON, Shell commands, Guidance] <br>\n**Output Format:** [Markdown tables and JSON API responses saved to local files or printed to stdout] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Responses are paginated by shop ID; page size is capped at 20 and cached responses may be reused for 24 hours.] <br>\n\n## Skill Version(s): <br>\n1.0.1 (source: server release metadata) <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.0: 5 files, 15371 bytes\n\nFiles: references/api.md (7815b), scripts/seerfar_ozon_shop_search.py (12796b), skill-card.md (2681b), SKILL.md (9749b), _meta.json (151b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: linkfox-seerfar-ozon-shop-search\ndescription: Seerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。用于竞品店铺商品分析、店铺爆品挖掘、卖家商品结构拆解。当用户提到 Ozon 店铺商品、Ozon 卖家商品列表、竞品店铺分析、Ozon 店铺爆品、Ozon 卖家分析、Seerfar Ozon 店铺搜索、Ozon shop search, Ozon seller products, competitor shop analysis, Ozon store products 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 店铺/卖家的商品与销量数据，也应触发此技能。\n---\n\n# Seerfar Ozon Shop Search\n\nThis skill lists the products of a specific Ozon shop (seller) from the Seerfar analytics database. Given a shop `id`, it returns each product's 30-day sales, price, rating, weight, fulfillment model (FBO/FBS), seller type (local / cross-border) and return/cancellation rate, plus the shop's total 30-day sales — the starting point for competitor-shop product analysis, best-seller mining, and seller catalog teardown.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one shop**: pass a single shop `id` and receive that shop's product catalog with performance metrics. This is a *shop-level* view, not a keyword or category view.\n\n**Where the shop `id` comes from**: `id` is the Seerfar seller/shop identifier — the same `sellerId` returned by other Seerfar Ozon tools (e.g. product report / product detail search). Negative ids (e.g. `-2` Ozon Express, `-4` Ozon Fresh) are Ozon's own platform sellers; positive ids are third-party sellers. If the user only has a shop name or product, first obtain the `sellerId` from a product-level Seerfar Ozon source, then call this skill.\n\n**Seller type**: each product carries `sellerType` — `0` local (本土), `1` cross-border (跨境). A shop is typically all one type; use it to judge whether a competitor is a domestic or cross-border seller.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are 30-day units; `price` is in Russian rubles (₽), indicated by `currency`.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| id | integer | yes | Shop (seller) ID — the `sellerId` from other Seerfar Ozon tools. Negative = Ozon platform seller. |\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}`; `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `reviewRating`, `upTime`. |\n| uId | string | no | User ID. |\n| memberId | string | no | Member ID (data attribution). |\n\nOnly `id` and `page` are required.\n\n## 调用方式\n\n- **API 端点**：`POST /seerfar/ozon/shopSearch`（完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/seerfar_ozon_shop_search.py '<JSON 参数>' [--inline]`\n- **成本约束**：本工具会消耗积分；同一会话同一参数组合默认只调用一次，脚本带 24h 本地缓存。失败/空结果不得自动换关键词、翻页或改邮编连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/linkfox-seerfar-ozon-shop-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. A shop's best-sellers (sort by 30-day sales)**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n**2. A shop's newest listings (sort by upload time)**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"upTime\", \"direction\": \"DESC\"}]}}\n```\n\n**3. A shop's highest-priced products**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"price\", \"direction\": \"DESC\"}]}}\n```\n\n**4. Page deeper into a shop's catalog**\n```json\n{\"id\": 1362816, \"page\": {\"page\": 2, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}\n```\n\n## How to Build Queries\n\n1. **Always pass `page.orders`**: the catalog can be large — sort by the metric you care about (`sales` DESC for best-sellers, `upTime` DESC for new arrivals, `price` DESC for premium SKUs).\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 shop `id` first**: if the user gives a shop/product name rather than an id, obtain the `sellerId` from a product-level Seerfar Ozon source before calling this skill.\n4. **Use `totalSales` for shop-level context**: the response's `totalSales` is the shop's total 30-day sales — a quick health indicator for the whole shop, independent of the current page.\n\n## Display Rules\n\n1. **Present data only**: show the shop's product metrics in a clear table without subjective advice.\n2. **Lead with shop context, then product columns**: state `totalSales` (shop 30-day total) first, then a table of `sku`, `price`, `sales`, `reviewRating`, `weight`, `sellerType`, `fulfillment`, `returnCancellationRate`.\n3. **Seller type label**: render `sellerType` as 本土/跨境 (0/1) so the user reads it at a glance.\n4. **Fulfillment**: `fulfillment` is an array (e.g. `[\"FBO\"]`); join multiple values with `/`.\n5. **Missing `returnCancellationRate`**: for Ozon platform sellers (negative `id`) this field is often absent — show `-` rather than failing.\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 shop**: a non-existent `id` 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- **`id` and `page` are both required**; omitting either returns `errcode 400`.\n- **`pageSize` max 20**: exceeding it returns `errcode 1002`.\n- **`total` is the page row count**, not the shop's full catalog size — use `hasNextPage` to decide whether to fetch more pages.\n- **No text/keyword filter**: this endpoint filters by shop only; to find a shop by name, use another Seerfar Ozon source first.\n- **Field variance by seller type**: `returnCancellationRate` is populated for third-party sellers but frequently absent for Ozon platform sellers (negative `id`). Schema-defined `productPageUrl`, `monthlySalesRevenue`, `brand` are not returned (upstream has no source, omitted rather than null).\n\n## User Expression & Scenario Quick Reference\n\n**Applicable** — analyzing one Ozon shop/seller's catalog:\n\n| User Says | Scenario |\n|-----------|----------|\n| \"分析下这个 Ozon 店铺的商品\" / \"这个卖家在卖什么\" | Shop product catalog |\n| \"这家店最畅销的商品是什么\" | Best-seller mining (sort by sales) |\n| \"这家店最近上了哪些新品\" | New arrivals (sort by upTime) |\n| \"这个竞品店铺的价格带/客单价\" | Price-band analysis (sort by price) |\n| \"这家店是本土还是跨境卖家\" | Seller type check (sellerType) |\n| \"这个店铺总销量多少\" | Shop health (totalSales) |\n\n**Not applicable** — Needs beyond one shop's catalog:\n- Discovering Ozon keywords by market metrics → use the Seerfar Ozon market keyword search skill.\n- A single product's full detail → use a product-level Seerfar Ozon source (this skill returns catalog-level fields only).\n- Browsing the category tree → use a category-level Seerfar Ozon source.\n- Finding which shop sells a given product → use a product-level Seerfar Ozon source to get the `sellerId` first.\n\n**Boundary judgment**: if the user already has a shop/seller ID (or a `sellerId` obtained from a product lookup) and wants to enumerate or rank that shop's products by sales/price/rating, start here. If they want market-level 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.0:_meta.json\n\n{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-seerfar-ozon-shop-search\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1783067121773\n}\n\nFile v1.0.0:references/api.md\n\n# Seerfar Ozon 店铺商品搜索 API 参考\n\n## 调用规范\n\n- **请求地址**：`${LINKFOX_TOOL_GATEWAY}/seerfar/ozon/shopSearch`\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` 一致。`id` 与 `page` 必填，其余可选。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| id | integer | 是 | 店铺（卖家）ID，即其他 Seerfar Ozon 工具返回的 `sellerId`；负值为 Ozon 平台自营卖家（如 `-2` Ozon Express、`-4` Ozon Fresh），正值为第三方卖家 |\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`、`reviewRating`、`upTime` |\n| uId | string | 否 | 用户 ID（最长 1000） |\n| memberId | string | 否 | 成员 ID（一个成员唯一标识，一个用户可归属多个团队，数据归属于 memberId，最长 1000） |\n\n> **必填约束**：`id` 与 `page` 均为必填；缺任意一项返回 `errcode 400`。\n> **分页上限**：`page.pageSize` 最大为 20，翻页请通过 `page.page` 递增。\n> **排序**：建议通过 `page.orders` 按核心指标排序（如 `sales` DESC 看爆品、`upTime` DESC 看新品），避免在无序结果中翻页。\n\n## 响应结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| code | string | 返回码，`\"200\"` 表示成功（成功时返回） |\n| errcode | integer | 错误码，`200` 表示成功；业务错误时仅返回此项（成功时与 `code` 并存） |\n| msg | string | 消息；成功为 `ok` |\n| errmsg | string | 错误消息；成功为 `ok`，业务错误时为原因描述 |\n| total | integer | **本页返回记录数**（等于当前页数据条数，并非店铺商品总数） |\n| totalSales | integer | 店铺近 30 天总销量 |\n| data | array | 店铺商品列表（详见下方） |\n| products | array | 店铺商品列表，内容与 `data` 完全一致 |\n| hasNextPage | boolean | 是否有下一页 |\n| columns | array | 列定义，元素含 `{field, title, cellType, sortable, filterable}` |\n| type | string | 响应展示类型，如 `productWorkbenches` |\n| costTime | integer | 接口耗时（毫秒） |\n| costToken | integer | 消耗 Token 数量 |\n\n### data[*] / products[*] 店铺商品对象字段\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| productId | integer | 统一商品 ID，映射自 `sku` |\n| sku | integer | 商品 SKU |\n| rating | number | 统一评分，映射自 `reviewRating` |\n| reviewRating | number | 商品评分 |\n| weight | number | 商品重量，单位 g |\n| sales | integer | 商品近 30 天销量 |\n| monthlySalesUnits | integer | 统一月销量，映射自 `sales` |\n| upTime | integer | 商品上架时间，毫秒时间戳 |\n| price | number | 商品价格（卢布） |\n| currency | string | 币种，固定 `₽` |\n| imageUrl | string | 统一主图 URL |\n| fulfillment | array | 商品配送方式，如 `[\"FBO\"]`，可能含多个值 |\n| sellerType | integer | 卖家类型：`0` 本土，`1` 跨境 |\n| returnCancellationRate | number | 商品退货取消率（%） |\n| sourceType | string | 数据源，固定 `ozon` |\n| sourceTool | string | 来源工具，如 `Seerfar-Ozon-查店铺` |\n\n> **字段差异**：`returnCancellationRate` 对第三方卖家普遍返回，但对 Ozon 平台自营卖家（`id` 为负值）常常缺失，使用前需判空。\n> **schema 中定义但实际不返回**：`productPageUrl`（统一商品页 URL）、`monthlySalesRevenue`（统一月销售额）、`brand`（统一品牌）在 outputSchema 中标注\"上游无对应字段，保持 null\"，实际响应中**不返回**这些字段（既非 null 也非空），不要依赖它们。\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`；常见为缺 `id`（`id 为必填参数`）、缺 `page`（`page 为必填参数`） |\n| 1002 | 分页参数超出限制 | `page.pageSize` 最大为 20，调小后重试 |\n| 1003 | 请求过于频繁 | 限流，稍后重试 |\n| 401 | 认证失败 | 检查请求头 `Authorization` 是否正确携带 API Key；API Key 申请方式请参考上述[调用规范](#调用规范)下的认证方式 |\n| 其他非 200 值 | 业务异常 | 查看 `errmsg` 获取具体原因 |\n\n> **不存在的店铺 ID**：传入不存在的 `id` 不会报错，而是返回 `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\": \"id 为必填参数\"\n}\n```\n\n## curl 示例\n\n```bash\ncurl -X POST https://tool-gateway.linkfox.com/seerfar/ozon/shopSearch \\\n  -H \"Authorization: $LINKFOXAGENT_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"User-Agent: LinkFox-Skill/1.0\" \\\n  -d '{\n    \"id\": 1362816,\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  \"total\": 5,\n  \"totalSales\": 11782,\n  \"hasNextPage\": true,\n  \"type\": \"productWorkbenches\",\n  \"costTime\": 4706,\n  \"costToken\": 16000,\n  \"data\": [\n    {\n      \"productId\": 1310550649,\n      \"sku\": 1310550649,\n      \"rating\": 4.9,\n      \"reviewRating\": 4.9,\n      \"weight\": 5650.0,\n      \"sales\": 1098,\n      \"monthlySalesUnits\": 1098,\n      \"upTime\": 1700928000000,\n      \"price\": 2591.0,\n      \"currency\": \"₽\",\n      \"imageUrl\": \"https://ir.ozone.ru/s3/multimedia-1-h/wc300/11110286861.jpg\",\n      \"fulfillment\": [\"FBO\"],\n      \"sellerType\": 0,\n      \"returnCancellationRate\": 15.6,\n      \"sourceType\": \"ozon\",\n      \"sourceTool\": \"Seerfar-Ozon-查店铺\"\n    }\n  ],\n  \"products\": [ ... ]\n}\n```\n\n> `products` 内容与 `data` 完全一致，示例中用 `[ ... ]` 表示省略，实际返回与 `data` 相同的完整商品数组。\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-shop-search\",\n  \"sentiment\": \"POSITIVE\",\n  \"category\": \"OTHER\",\n  \"content\": \"User successfully retrieved a competitor shop's best-sellers and 30-day total sales.\"\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.0:skill-card.md\n\n## Description: <br>\nSeerfar Ozon Shop Search helps an agent retrieve and present product metrics for a specific Ozon seller shop from the Seerfar analytics database. <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 analysts, sellers, and agent users use this skill to inspect one Ozon shop's product catalog, 30-day sales, prices, ratings, fulfillment mode, seller type, and return/cancellation data. It is intended for competitor shop analysis, best-seller mining, and seller catalog breakdowns when a Seerfar seller ID is already known. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill sends Ozon seller-analysis queries and an API key to LinkFox/Seerfar services. <br>\nMitigation: Install only if the publisher and service are trusted, keep API keys scoped and rotated, and use the default or a controlled gateway endpoint. <br>\nRisk: Full API responses and cached results may be written under local linkfox data and cache folders. <br>\nMitigation: Review and clear those folders when results may contain sensitive business analysis, and avoid running the skill in shared workspaces without appropriate file access controls. <br>\nRisk: The skill text instructs agents to send silent feedback reports to a separate LinkFox feedback endpoint. <br>\nMitigation: Review feedback behavior before deployment and disable or constrain feedback reporting where silent outbound reports are not acceptable. <br>\n\n\n## Reference(s): <br>\n- [Seerfar Ozon Shop Search API Reference](references/api.md) <br>\n- [ClawHub Release Page](https://clawhub.ai/linkfox-ai/skills/linkfox-seerfar-ozon-shop-search) <br>\n- [Publisher Profile](https://clawhub.ai/user/linkfox-ai) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance, JSON files] <br>\n**Output Format:** [Markdown guidance with JSON request examples, shell command examples, and API response data.] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Requires a LinkFox API key; responses may be cached for 24 hours and full API results are written to local JSON files.] <br>\n\n## Skill Version(s): <br>\n1.0.0 (source: ClawHub 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>","readmeExcerpt":"Skill: Seerfar-Ozon店铺搜索 Owner: linkfox-ai Summary: Seerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。用于竞品店铺商品分析、店铺爆品挖掘、卖家商品结构拆解。当用户提到 Ozon 店铺商品、Ozon 卖家商品列表、竞品店铺分析、Ozon 店铺爆品、Ozon 卖家分析、Seerfar Ozon 店铺搜索、Ozon shop search, Ozon seller products, competitor shop analysis, Ozon store products 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 店铺/卖家的商品与销量数据，也应触发此技能。 Tags:","codeSnippets":[],"executableExamples":[{"language":"json","snippet":"{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}"},{"language":"json","snippet":"{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"upTime\", \"direction\": \"DESC\"}]}}"},{"language":"json","snippet":"{\"id\": 1362816, \"page\": {\"page\": 1, \"pageSize\": 20, \"orders\": [{\"field\": \"price\", \"direction\": \"DESC\"}]}}"},{"language":"json","snippet":"{\"id\": 1362816, \"page\": {\"page\": 2, \"pageSize\": 20, \"orders\": [{\"field\": \"sales\", \"direction\": \"DESC\"}]}}"},{"language":"json","snippet":"{\n    \"errcode\": 1002,\n    \"errmsg\": \"分页参数超出限制，请检查输入。参数 page.pageSize 最大为 20，请调小后重试。\"\n}"},{"language":"json","snippet":"{\n    \"errcode\": 400,\n    \"errmsg\": \"id 为必填参数\"\n}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: linkfox-seerfar-ozon-shop-search\ndescription: Seerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。用于竞品店铺商品分析、店铺爆品挖掘、卖家商品结构拆解。当用户提到 Ozon 店铺商品、Ozon 卖家商品列表、竞品店铺分析、Ozon 店铺爆品、Ozon 卖家分析、Seerfar Ozon 店铺搜索、Ozon shop search, Ozon seller products, competitor shop analysis, Ozon store products 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 店铺/卖家的商品与销量数据，也应触发此技能。\n---\n\n# Seerfar Ozon Shop Search\n\nThis skill lists the products of a specific Ozon shop (seller) from the Seerfar analytics database. Given a shop `id`, it returns each product's 30-day sales, price, rating, weight, fulfillment model (FBO/FBS), seller type (local / cross-border) and return/cancellation rate, plus the shop's total 30-day sales — the starting point for competitor-shop product analysis, best-seller mining, and seller catalog teardown.\n\n## Core Concepts\n\n**Unit of data is the product, scoped to one shop**: pass a single shop `id` and receive that shop's product catalog with performance metrics. This is a *shop-level* view, not a keyword or category view.\n\n**Where the shop `id` comes from**: `id` is the Seerfar seller/shop identifier — the same `sellerId` returned by other Seerfar Ozon tools (e.g. product report / product detail search). Negative ids (e.g. `-2` Ozon Express, `-4` Ozon Fresh) are Ozon's own platform sellers; positive ids are third-party sellers. If the user only has a shop name or product, first obtain the `sellerId` from a product-level Seerfar Ozon source, then call this skill.\n\n**Seller type**: each product carries `sellerType` — `0` local (本土), `1` cross-border (跨境). A shop is typically all one type; use it to judge whether a competitor is a domestic or cross-border seller.\n\n**Sales & price currency**: `sales` / `monthlySalesUnits` are 30-day units; `price` is in Russian rubles (₽), indicated by `currency`.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| id | integer | yes | Shop (seller) ID — the `sellerId` from other Seerfar Ozon tools. Negative = Ozon platform seller. |\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}`; `direction` `DESC`/`ASC`. Common fields: `sales`, `price`, `reviewRating`, `upTime`. |\n| uId | string | no | User ID. |\n| memberId | string | no | Member ID (data attribution). |\n\nOnly `id` and `page` are required.\n\n## 调用方式\n\n- **API 端点**：`POST /seerfar/ozon/shopSearch`（完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/seerfar_ozon_shop_search.py '<JSON 参数>' [--inline]`\n- **成本约束**：本工具会消耗算力；同一会话同一参数组合默认只调用一次，脚本带 24h 本地缓存。失败/空结果不得自动换关键词、翻页或改邮编连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/lin"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-seerfar-ozon-shop-search\",\n  \"version\": \"1.0.6\",\n  \"publishedAt\": 1789363472724\n}"},{"path":"references/api.md","content":"# Seerfar Ozon 店铺商品搜索 API 参考\n\n## 调用规范\n\n- **请求地址**：`${LINKFOX_TOOL_GATEWAY}/seerfar/ozon/shopSearch`\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/2.0`；HTTP 超时 150s\n\n## 请求参数\n\nPOST Body（JSON）。以下字段与接口 `inputSchema` 一致。`id` 与 `page` 必填，其余可选。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| id | integer | 是 | 店铺（卖家）ID，即其他 Seerfar Ozon 工具返回的 `sellerId`；负值为 Ozon 平台自营卖家（如 `-2` Ozon Express、`-4` Ozon Fresh），正值为第三方卖家 |\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`、`reviewRating`、`upTime` |\n| uId | string | 否 | 用户 ID（最长 1000） |\n| memberId | string | 否 | 成员 ID（一个成员唯一标识，一个用户可归属多个团队，数据归属于 memberId，最长 1000） |\n\n> **必填约束**：`id` 与 `page` 均为必填；缺任意一项返回 `errcode 400`。\n> **分页上限**：`page.pageSize` 最大为 20，翻页请通过 `page.page` 递增。\n> **排序**：建议通过 `page.orders` 按核心指标排序（如 `sales` DESC 看爆品、`upTime` DESC 看新品），避免在无序结果中翻页。\n\n## 响应结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| code | string | 返回码，`\"200\"` 表示成功（成功时返回） |\n| errcode | integer | 错误码，`200` 表示成功；业务错误时仅返回此项（成功时与 `code` 并存） |\n| msg | string | 消息；成功为 `ok` |\n| errmsg | string | 错误消息；成功为 `ok`，业务错误时为原因描述 |\n| total | integer | **本页返回记录数**（等于当前页数据条数，并非店铺商品总数） |\n| totalSales | integer | 店铺近 30 天总销量 |\n| totalRevenue | integer | 店铺总销售额（卢布） |\n| dailySales | integer | 店铺日均销量 |\n| rating | number | 店铺评分（0-5） |\n| productCount | integer | 店铺商品总数（全店铺，非本页条数） |\n| fulfillment | object | 店铺配送方式分布，键为配送方式（`FBO`/`FBS`），值为该方式商品数，如 `{\"FBO\": 72, \"FBS\": 4}`（与商品级 `fulfillment` 数组不同） |\n| data | array | 店铺商品列表（详见下方） |\n| products | array | 店铺商品列表，内容与 `data` 完全一致 |\n| hasNextPage | boolean | 是否有下一页 |\n| columns | array | 列定义，元素含 `{field, title, cellType, sortable, filterable}` |\n| type | string | 响应展示类型，如 `productWorkbenches` |\n| costTime | integer | 接口耗时（毫秒） |\n| costToken | integer | 消耗 Token 数量 |\n\n### data[*] / products[*] 店铺商品对象字段\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| productId | integer | 统一商品 ID，映射自 `sku` |\n| sku | integer | 商品 SKU |\n| rating | number | 统一评分，映射自 `reviewRating` |\n| reviewRating | number | 商品评分 |\n| weight | number | 商品重量，单位 g |\n| sales | integer | 商品近 30 天销量 |\n| monthlySalesUnits | integer | 统一月销量，映射自 `sales` |\n| upTime | integer | 商品上架时间，毫秒时间戳 |\n| price | number | 商品价格（卢布） |\n| currency | string | 币种，固定 `₽` |\n| imageUrl | string | 统一主图 URL |\n| fulfillment | array | 商品配送方式，如 `[\"FBO\"]`，可能含多个值 |\n| sellerType | integer | 卖家类型：`0` 本土，`1` 跨境 |\n| returnCancellationRate | number | 商品退货取消率（%） |\n| sourceType | string | 数据源，固定 `ozon` |\n| sourceTool | string | 来源工具，如 `Seerfar-Ozon-查店铺` |\n\n> **字段差异**：`returnCancellationRate` 对第三方卖家普遍返回，但对 Ozon 平台自营卖家（`id` 为负值）常常缺失，使用前需判空。\n> **schema 中定义但实际不返回**：`productPageUrl`（统一商品页 UR"},{"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\nLooks up the product catalog for a specific Ozon shop or seller from Seerfar data, including 30-day sales, price, rating, weight, fulfillment model, seller type, return/cancellation rate, and shop-level sales context.\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 users and developers use this skill to analyze one Ozon shop's product catalog, best sellers, seller type, fulfillment split, pricing, and 30-day sales metrics for competitor-shop analysis.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill handles LinkFox API keys and can guide phone/SMS login.\n\nMitigation: Use it only in a trusted workspace, avoid sharing credentials in prompts or logs, and rotate any API key that appears in shell history, files, or conversation output.\n\nRisk: The onboarding flow can create payment orders and the shop lookup consumes paid compute credits.\n\nMitigation: Confirm the user's intent before billing actions or repeated lookups, rely on the 24-hour cache for identical parameters, and explain additional cost before pagination or retries.\n\nRisk: Full API responses are stored locally and may include business-sensitive shop or product analysis data.\n\nMitigation: Run in an appropriate project workspace, review saved files under the generated linkfox data directory, and delete retained JSON responses when they are no longer needed.\n\nRisk: Endpoint override environment variables can redirect API, login, or billing requests.\n\nMitigation: Avoid setting LinkFox endpoint override variables unless the destination is trusted and expected for the current environment.\n\nRisk: The skill may send feedback to LinkFox without a separate confirmation when it detects quality or outcome signals.\n\nMitigation: Review this behavior before installation and avoid including sensitive user or business details in feedback content.\n\n## Reference(s):\n\n- [Seerfar Ozon Shop Search API Reference](artifact/references/api.md)\n- [Authentication and Billing Onboarding](artifact/references/onboarding.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON API results, shell commands, configuration snippets, and saved JSON response files]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Full API responses are written to local JSON files; small responses may also be printed inline, while larger responses are summarized unless inline output is requested.]\n\n## Skill Version(s):\n\n1.0.6 (source: ClawHub 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."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Seerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。用于竞品店铺商品分析、店铺爆品挖掘、卖家商品结构拆解。当用户提到 Ozon 店铺商品、Ozon 卖家商品列表、竞品店铺分析、Ozon 店铺爆品、Ozon 卖家分析、Seerfar Ozon 店铺搜索、Ozon shop search, Ozon seller products, competitor shop analysis, Ozon store products 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 店铺/卖家的商品与销量数据，也应触发此技能。 Skill: Seerfar-Ozon店铺搜索 Owner: linkfox-ai Summary: Seerfar Ozon 店铺商品搜索：按 Ozon 店铺（卖家）ID 拉取该店铺的商品列表，返回每个商品的近30天销量、价格、评分、重量、配送方式（FBO/FBS）、卖家类型（本土/跨境）、退货取消率，以及店铺近30天总销量。用于竞品店铺商品分析、店铺爆品挖掘、卖家商品结构拆解。当用户提到 Ozon 店铺商品、Ozon 卖家商品列表、竞品店铺分析、Ozon 店铺爆品、Ozon 卖家分析、Seerfar Ozon 店铺搜索、Ozon shop search, Ozon seller products, competitor shop analysis, Ozon store products 时触发此技能。即使用户未明确提到\"Seerfar\"，只要其意图是查看某 Ozon 店铺/卖家的商品与销量数据，也应触发此技能。 Tags:","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1513,"uniquenessScore":45,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T17:14:34.353Z","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-11T17:14:34.353Z","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-11T21:01:17.597Z","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"}]}}}