{"id":"080368ec-8ec2-4c86-b5f5-844e186695e4","entityType":"agent","slug":"clawhub-linkfox-ai-linkfox-temu-promotion-eu","name":"Temu欧洲站-促销","canonicalUrl":"https://www.xpersona.co/agent/clawhub-linkfox-ai-linkfox-temu-promotion-eu","canonicalPath":"/agent/clawhub-linkfox-ai-linkfox-temu-promotion-eu","generatedAt":"2026-10-10T17:37:20.668Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T15:28:54.791Z","emptyReason":null},"description":"Temu 欧洲站电商促销 API，经 LinkFox 网关转发 Partner EU Promotion / 促销活动 相关 bg/temu 接口（活动创建、报名、查询、优惠券/秒杀等，接口将按 Partner 文档逐条接入）。当用户提到 Temu EU 促销、促销活动、优惠券、秒杀、活动报名、promotion campaign、product-inventory 促销 时触发。商品管理用 linkfox-temu-manage-product-eu；价格用 linkfox-temu-price-eu；订单用 linkfox-temu-order-eu。","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.4K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s171g8b6m2khwdy9ye8bxj0wx183vd4z:linkfox-temu-promotion-eu","sourceUrl":"https://clawhub.ai/linkfox-ai/linkfox-temu-promotion-eu","homepage":"https://clawhub.ai/linkfox-ai/skills/linkfox-temu-promotion-eu","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/linkfox-ai/linkfox-temu-promotion-eu","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/linkfox-ai/skills/linkfox-temu-promotion-eu","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":63,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Temu欧洲站-促销 technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T15:28:54.791Z","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-10T15:28:54.791Z","emptyReason":null},"stars":null,"forks":null,"downloads":1360,"packageName":null,"latestVersion":"1.0.6","tractionLabel":"1.4K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T15:28:54.791Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T15:28:54.791Z","lastCrawledAt":"2026-10-10T15:28:54.791Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T15:28:54.791Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.6","createdAt":"2026-08-14T15:18:24.811Z","changelog":"Update from 1.0.5 to 1.0.6","fileCount":36,"zipByteSize":53956},{"version":"1.0.5","createdAt":"2026-08-07T11:21:52.873Z","changelog":"Update from 1.0.4 to 1.0.5","fileCount":36,"zipByteSize":53758},{"version":"1.0.4","createdAt":"2026-07-13T12:40:27.992Z","changelog":"Update from 1.0.3 to 1.0.4","fileCount":34,"zipByteSize":45066},{"version":"1.0.3","createdAt":"2026-07-06T11:46:41.874Z","changelog":"Update from 1.0.2 to 1.0.3","fileCount":34,"zipByteSize":44349},{"version":"1.0.2","createdAt":"2026-07-03T09:46:39.288Z","changelog":"Update from 1.0.0 to 1.0.2","fileCount":33,"zipByteSize":42740},{"version":"1.0.0","createdAt":"2026-05-28T05:34:17.989Z","changelog":"Initial release","fileCount":34,"zipByteSize":41372}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s171g8b6m2khwdy9ye8bxj0wx183vd4z:linkfox-temu-promotion-eu","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s171g8b6m2khwdy9ye8bxj0wx183vd4z:linkfox-temu-promotion-eu` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/linkfox-ai/linkfox-temu-promotion-eu before using production credentials."],"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-temu-promotion-eu/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-promotion-eu/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-promotion-eu/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-promotion-eu/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-promotion-eu/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-promotion-eu/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-10T17:37:20.665Z"}},"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-temu-promotion-eu/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-promotion-eu/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-promotion-eu/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-promotion-eu/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":"medium","updatedAt":"2026-10-10T15:28:54.791Z","emptyReason":null},"readme":"Skill: Temu欧洲站-促销\n\nOwner: linkfox-ai\n\nSummary: Temu 欧洲站电商促销 API，经 LinkFox 网关转发 Partner EU Promotion / 促销活动 相关 bg/temu 接口（活动创建、报名、查询、优惠券/秒杀等，接口将按 Partner 文档逐条接入）。当用户提到 Temu EU 促销、促销活动、优惠券、秒杀、活动报名、promotion campaign、product-inventory 促销 时触发。商品管理用 linkfox-temu-manage-product-eu；价格用 linkfox-temu-price-eu；订单用 linkfox-temu-order-eu。\n\nTags: latest:1.0.6\n\nVersion history:\n\nv1.0.6 | 2026-08-14T15:18:24.811Z | user\n\nUpdate from 1.0.5 to 1.0.6\n\nv1.0.5 | 2026-08-07T11:21:52.873Z | user\n\nUpdate from 1.0.4 to 1.0.5\n\nv1.0.4 | 2026-07-13T12:40:27.992Z | user\n\nUpdate from 1.0.3 to 1.0.4\n\nv1.0.3 | 2026-07-06T11:46:41.874Z | user\n\nUpdate from 1.0.2 to 1.0.3\n\nv1.0.2 | 2026-07-03T09:46:39.288Z | user\n\nUpdate from 1.0.0 to 1.0.2\n\nv1.0.0 | 2026-05-28T05:34:17.989Z | user\n\nInitial release\n\nArchive index:\n\nArchive v1.0.6: 36 files, 53956 bytes\n\nFiles: references/access-token.md (4604b), references/api.md (5209b), references/apis/bg-promotion-activity-candidate-goods-query.md (5144b), references/apis/bg-promotion-activity-goods-enroll.md (5203b), references/apis/bg-promotion-activity-goods-operation-query.md (3452b), references/apis/bg-promotion-activity-goods-query.md (4406b), references/apis/bg-promotion-activity-goods-update.md (5805b), references/apis/bg-promotion-activity-query.md (5627b), references/apis/README.md (1307b), references/authorization-flow.md (1186b), references/onboarding.md (2046b), references/partner-eu-catalog.md (3363b), scripts/_eu_promotion_script.py (516b), scripts/_temu_auth_guide.py (6198b), scripts/_temu_common.py (12428b), scripts/_temu_eu_common.py (3175b), scripts/_temu_token_store.py (4273b), scripts/check_linkfox_token.py (1798b), scripts/eu_promotion_activity_candidate_goods_query.py (307b), scripts/eu_promotion_activity_goods_enroll.py (274b), scripts/eu_promotion_activity_goods_operation_query.py (313b), scripts/eu_promotion_activity_goods_query.py (280b), scripts/eu_promotion_activity_goods_update.py (274b), scripts/eu_promotion_activity_query.py (253b), scripts/get_temu_access_token.py (1843b), scripts/list_temu_access_tokens.py (652b), scripts/onboarding.py (24089b), scripts/save_temu_access_token.py (1377b), scripts/temu_eu_file_download.py (680b), scripts/temu_eu_proxy.py (901b), scripts/temu_file_download.py (1681b), scripts/temu_proxy.py (2124b), scripts/temu_token_guide.py (1594b), skill-card.md (3047b), SKILL.md (6146b), _meta.json (144b)\n\nFile v1.0.6:SKILL.md\n\n---\nname: linkfox-temu-promotion-eu\ndescription: Temu 欧洲站电商促销 API，经 LinkFox 网关转发 Partner EU Promotion / 促销活动 相关 bg/temu 接口（活动创建、报名、查询、优惠券/秒杀等，接口将按 Partner 文档逐条接入）。当用户提到 Temu EU 促销、促销活动、优惠券、秒杀、活动报名、promotion campaign、product-inventory 促销 时触发。商品管理用 linkfox-temu-manage-product-eu；价格用 linkfox-temu-price-eu；订单用 linkfox-temu-order-eu。\n---\n\n# Temu 欧洲站 — 电商促销（Promotion）\n\n本 skill（`linkfox-temu-promotion-eu`）覆盖 Partner Platform for EU **Promotion / 电商促销**（促销活动、优惠券、活动报名等；Partner 后台菜单可能显示为 Marketing/Promotion）相关 `bg.*` / `temu.*` 接口（`menu_code` 与各 `sub_menu_code` 以 Partner 后台为准，见 [partner-eu-catalog.md](./references/partner-eu-catalog.md)）。\n\n已接入 **6** 条 Partner **Promotion** 接口，清单见 [partner-eu-catalog.md](./references/partner-eu-catalog.md)。\n\n**网关（本 skill 内置）**：\n\n| 能力 | 方法 | 路径 |\n|------|------|------|\n| 促销 OpenAPI（`eu_promotion_*`、`temu_eu_proxy`） | POST | `https://tool-gateway.linkfox.com/temu/proxy` |\n| 加签文件下载 | POST | `https://tool-gateway.linkfox.com/temu/fileDownload` |\n\n## 相关 skill\n\n| 场景 | skill |\n|------|--------|\n| **促销/营销活动**（本 skill） | **`linkfox-temu-promotion-eu`** |\n| 广告 Ads | `linkfox-temu-ads-eu` |\n| 商品列表/详情/编辑/库存/上下架 | `linkfox-temu-manage-product-eu` |\n| 发品 | `linkfox-temu-add-product-eu` |\n| 价格/供货价、定价单 | `linkfox-temu-price-eu` |\n| 订单列表/详情 | `linkfox-temu-order-eu` |\n| 退货与退款 | `linkfox-temu-returns-refunds-eu` |\n| 网关与 Temu token | 本 skill `scripts/` |\n\n## 调用方式\n\n- **API 端点**：`POST /temu/proxy`（不同操作通过请求体区分；完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/<脚本名>.py '<JSON 参数>' [--inline]`（可用脚本见上文脚本一览）\n- **成本约束**：本工具会消耗积分；失败/空结果不得自动换关键词、翻页或连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/<skill-name>-<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## 默认参数\n\n| 字段 | 默认 | 说明 |\n|------|------|------|\n| site | `eu` | Partner EU |\n| managementType | `semi-managed` | 半托管（具体接口以 Partner 文档为准） |\n| tokenPurpose | `product-inventory` | 与商品/促销场景一致（见 [access-token.md](./references/access-token.md)） |\n\n## 鉴权\n\n1. **LinkFox**：`LINKFOXAGENT_API_KEY` → Header `Authorization` + `Token`\n2. **Temu**：`accessToken` 或 `storeKey`（`storeKey` 时建议带 `tokenPurpose=product-inventory`）\n\n## Scripts\n\n| 脚本 | 说明 |\n|------|------|\n| `temu_eu_proxy.py` | 任意 type |\n| `temu_eu_file_download.py` | 加签下载 |\n| `eu_promotion_activity_query.py` | `bg.promotion.activity.query` |\n| `eu_promotion_activity_candidate_goods_query.py` | `bg.promotion.activity.candidate.goods.query` |\n| `eu_promotion_activity_goods_query.py` | `bg.promotion.activity.goods.query` |\n| `eu_promotion_activity_goods_enroll.py` | `bg.promotion.activity.goods.enroll` |\n| `eu_promotion_activity_goods_operation_query.py` | `bg.promotion.activity.goods.operation.query` |\n| `eu_promotion_activity_goods_update.py` | `bg.promotion.activity.goods.update` |\n\n## 接入新接口（约定）\n\n你每提供一条 Partner 文档（`type` + `sub_menu_code` + URL + Request/Response 参数表），将：\n\n1. 新增 `references/apis/<type-slug>.md`（完整入参/出参层级）\n2. 新增 `scripts/eu_promotion_<slug>.py`（调用 `_eu_promotion_script.run_cli`）\n3. 更新 [partner-eu-catalog.md](./references/partner-eu-catalog.md)、[apis/README.md](./references/apis/README.md) 与本表\n\n## 示例（通用代理）\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\n\npython scripts/temu_eu_proxy.py '{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"type\": \"<TEMU_API_TYPE>\",\n  \"params\": {\n    \"request\": {}\n  }\n}'\n```\n\n**Feedback：** `skillName`：`linkfox-temu-promotion-eu`\n\n## 网关与授权脚本\n\n| 脚本 | 说明 |\n|------|------|\n| `check_linkfox_token.py` | 校验 LinkFox 用户 Token |\n| `temu_token_guide.py` | Temu accessToken 后台授权步骤 |\n| `save_temu_access_token.py` | 保存 accessToken 到本地 |\n| `list_temu_access_tokens.py` | 列出已保存 token |\n| `get_temu_access_token.py` | 读取已保存 token |\n| `temu_proxy.py` | 通用网关转发（多 site） |\n| `temu_file_download.py` | 加签文件下载（多 site） |\n\n授权说明：[references/access-token.md](./references/access-token.md)\n\n## 积分消耗规则\n\n不消耗积分。\n\nFile v1.0.6:references/apis/README.md\n\n# Promotion — 接口文档索引\n\n网关见 [../api.md](../api.md)；目录见 [../partner-eu-catalog.md](../partner-eu-catalog.md)。\n\n## 活动查询\n\n| type | 说明 | 文档 |\n|------|------|------|\n| `bg.promotion.activity.query` | 促销活动查询 | [bg-promotion-activity-query.md](./apis/bg-promotion-activity-query.md) |\n| `bg.promotion.activity.candidate.goods.query` | 活动候选商品查询 | [bg-promotion-activity-candidate-goods-query.md](./apis/bg-promotion-activity-candidate-goods-query.md) |\n| `bg.promotion.activity.goods.query` | 活动已报名商品查询 | [bg-promotion-activity-goods-query.md](./apis/bg-promotion-activity-goods-query.md) |\n\n## 报名 / 操作结果\n\n| type | 说明 | 文档 |\n|------|------|------|\n| `bg.promotion.activity.goods.enroll` | 活动商品报名 | [bg-promotion-activity-goods-enroll.md](./apis/bg-promotion-activity-goods-enroll.md) |\n| `bg.promotion.activity.goods.operation.query` | 活动商品操作结果查询 | [bg-promotion-activity-goods-operation-query.md](./apis/bg-promotion-activity-goods-operation-query.md) |\n\n## 商品更新\n\n| type | 说明 | 文档 |\n|------|------|------|\n| `bg.promotion.activity.goods.update` | 活动商品更新 | [bg-promotion-activity-goods-update.md](./apis/bg-promotion-activity-goods-update.md) |\n\nFile v1.0.6:_meta.json\n\n{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-temu-promotion-eu\",\n  \"version\": \"1.0.6\",\n  \"publishedAt\": 1786720704811\n}\n\nFile v1.0.6:references/access-token.md\n\n# Temu accessToken 授权与获取\n\nTemu **没有** LinkFox 侧自动 OAuth；`accessToken` 须在 Temu 卖家后台「服务市场 → 授权管理」**手动复制**。与 `LINKFOXAGENT_API_KEY`（LinkFox 用户鉴权）是两套令牌。（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理）\n\n## 两种鉴权（勿混淆）\n\n| 令牌 | 用途 | 获取方式 |\n|------|------|----------|\n| **LinkFox 用户 Token** | 调用 `/temu/proxy`、`/temu/fileDownload` **必填** | `LINKFOXAGENT_API_KEY` 或请求 JSON 的 `token`；Header `Authorization` + `Token`（同 amazon-store-auth）（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理） |\n| **Temu accessToken** | Temu 业务 API（经紫鸟转发） | Temu 卖家后台授权后复制 |\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<your-key>\"\npython scripts/check_linkfox_token.py\n```\n\n## tokenPurpose 与场景\n\n| tokenPurpose | 店铺类型 | 推荐 site | 授权应用 |\n|--------------|----------|-----------|----------|\n| `product-inventory` | 半托管 | `cn` / `partner` | 酷鸟卖家助手 |\n| `order-shipping` | 半托管 | `us` / `global` / `eu` | Cyber-ERP酷鸟助手 |\n| `full-managed` | 全托管 | `cn` / `partner` | 酷鸟卖家助手 |\n| `local-native` | 本土（美/欧主体） | `us` 等 | Cyber-ERP |\n\n## 1. 半托管 — 商品/库存 Token\n\n1. 登录 [seller.kuajingmaihuo.com](https://seller.kuajingmaihuo.com) 或 [agentseller.temu.com](https://agentseller.temu.com)\n2. **系统管理** → **服务市场** → **授权管理**\n3. **获取授权** → 选择 **「酷鸟卖家助手」**\n4. 全选常规和特殊授权 → 确认 → **复制 access_token**\n5. 调用 API：`site=cn` 或 `partner`，`managementType=semi-managed`\n\n## 2. 半托管 — 订单/发货 Token\n\n1. 登录 Temu 卖家后台\n2. 右上角 **Seller Central** → 切换到目标区域（美区 / 欧区 / 全球）\n3. **服务市场** → **授权管理**\n4. **获取授权** → 选择 **「Cyber-ERP酷鸟助手」**\n5. 全选授权 → 确认 → 复制 token\n6. 调用 API：`site=eu` / `global` / `eu`，`managementType=semi-managed`\n\n## 3. 全托管店铺\n\n1. 登录 Temu 平台\n2. **系统管理** → **服务市场** → **授权管理**\n3. **获取授权** → **「酷鸟卖家助手」** → 全选 → 复制 token\n4. 调用 API：`managementType=full-managed`，`site` 通常 `cn` 或 `partner`\n\n## 4. 本土店铺（美区、欧区主体）\n\n1. 登录 Temu\n2. **Apps And Services** → **Manage Your Apps**\n3. **Authorize a new app** → 搜索 **「Cyber-ERP」**\n4. 一般权限与敏感权限全选 → 确认 → 复制 token\n\n## 站点与 OpenAPI 网关\n\n| site | 说明 | Temu 网关 |\n|------|------|-----------|\n| cn | 中国站 | openapi.kuajingmaihuo.com |\n| partner | Partner 网关 | openapi-b-partner.temu.com |\n| us | 欧洲站 | openapi-b-eu.temu.com |\n| global | 全球区 | openapi-b-global.temu.com |\n| eu | 欧洲站 | openapi-b-eu.temu.com |\n\n## 本地保存 Token（推荐）\n\n默认存储：`~/.linkfox/temu-access-tokens.json`（可用 `TEMU_TOKEN_STORE_PATH` 覆盖）。\n\n```bash\n# 查看授权步骤\npython scripts/temu_token_guide.py '{\"shopType\":\"semi-managed\",\"tokenPurpose\":\"product-inventory\",\"site\":\"cn\"}'\n\n# 保存 token\npython scripts/save_temu_access_token.py '{\n  \"storeKey\": \"my-shop\",\n  \"label\": \"中国半托管\",\n  \"site\": \"cn\",\n  \"managementType\": \"semi-managed\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"accessToken\": \"PASTE_TOKEN\"\n}'\n\n# 列出已保存（脱敏）\npython scripts/list_temu_access_tokens.py\n\n# 用 storeKey 调 API（无需每次粘贴 token）\npython scripts/temu_proxy.py '{\n  \"storeKey\": \"my-shop\",\n  \"site\": \"cn\",\n  \"managementType\": \"semi-managed\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"type\": \"bg.goods.category.mapping\",\n  \"params\": {\"goodsName\": \"测试\", \"goodsNameEn\": \"Test\"}\n}'\n```\n\n## 注意事项\n\n1. **子账号**：可能无法进入服务市场，需主账号授权。\n2. **多站点**：欧洲站、英国站等需分别登录对应后台获取 Token。\n3. **有效期**：Token 会过期，过期后重新在后台复制并 `save_temu_access_token.py`。\n4. **IP 白名单**：需联系紫鸟开放平台配置调用 IP。\n5. **参数小写**：`site`、`managementType` 必须小写。\n\n## 脚本一览\n\n| 脚本 | 说明 |\n|------|------|\n| `temu_token_guide.py` | 按店铺类型/用途输出授权步骤 |\n| `save_temu_access_token.py` | 保存 accessToken 到本地 |\n| `list_temu_access_tokens.py` | 列出已保存 token（默认脱敏）|\n| `get_temu_access_token.py` | 读取指定 store 的 token |\n\nFile v1.0.6:references/api.md\n\n# linkfox-temu-promotion-eu — API 参考\r\n\r\nTemu **欧洲站电商促销**（Partner EU **Promotion** / 促销活动等），经本 skill `temu_eu_proxy`（`POST /temu/proxy`） 转发。Temu 的 `type` 写在 Body，**不是** URL 路径。\r\n\r\n> 网关与鉴权：本 skill `scripts/`（`LINKFOXAGENT_API_KEY`、`accessToken` / `storeKey`）。授权见 `references/access-token.md`。（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理）\r\n\r\n---\r\n\r\n## 调用规范\r\n\r\n| 项 | 说明 |\r\n|----|------|\r\n| 网关根地址 | `${LINKFOX_TOOL_GATEWAY}`（可用 `TEMU_API_BASE_URL` / `STORE_API_BASE_URL` 覆盖） |\r\n| 促销 OpenAPI | `POST /temu/proxy` |\r\n| 加签文件下载 | `POST /temu/fileDownload`（`temu_eu_file_download.py`） |\r\n| LinkFox 鉴权 | Header **`Authorization`** 与 **`Token`**（同值）；或 `LINKFOX_AGENT_API_KEY` / `LINKFOXAGENT_API_KEY`；或 JSON `token`（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理） |\r\n| Temu 鉴权 | Body `accessToken`，或 `storeKey` + `site` + `managementType` + `tokenPurpose` |\r\n| 默认 | `site=eu`，`managementType=semi-managed`，`tokenPurpose=product-inventory` |\r\n| 上游 OpenAPI（US） | `https://openapi-b-eu.temu.com/openapi/router`（网关按 `site` 解析） |\r\n\r\n### 网关请求 Body（`/temu/proxy`）\r\n\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| site | string | 是 | `eu`（本 skill 默认） |\r\n| managementType | string | 是 | `semi-managed` |\r\n| accessToken | string | 与 storeKey 二选一 | Temu 店铺令牌 |\r\n| storeKey | string | 与 accessToken 二选一 | `~/.linkfox/temu-access-tokens.json` 中的键 |\r\n| tokenPurpose | string | 否 | 建议 **`product-inventory`** |\r\n| type | string | 是 | Temu 接口名，如 Partner Promotion 菜单下的 `bg.*` / `temu.*` |\r\n| params | object | 否 | 业务参数；多数接口业务块在 **`params.request`** |\r\n\r\n### 网关响应\r\n\r\n| 字段 | 类型 | 说明 |\r\n|------|------|------|\r\n| body | string | Temu 原始 JSON 字符串；脚本解析为 `temuBody` |\r\n| code | integer | 网关错误码：`1002` 参数/Token，`1003` 转发失败 |\r\n\r\n解析顺序：**网关 `code`** → `JSON.parse(body)` → `success` / `errorCode` / `errorMsg` / `result`。\r\n\r\n### 脚本调用\r\n\r\n```bash\r\nexport LINKFOXAGENT_API_KEY=\"<key>\"\r\npython scripts/temu_eu_proxy.py '{\"accessToken\":\"TOKEN\",\"tokenPurpose\":\"product-inventory\",\"type\":\"<API_TYPE>\",\"params\":{\"request\":{}}}'\r\n```\r\n\r\n业务字段可放在顶层或嵌套 `params`；含 `request` 时通常整体作为 `params` 转发。\r\n\r\n---\r\n\r\n## 接口一览\r\n\r\n完整 `sub_menu_code` 与 Partner 文档 URL 见 [partner-eu-catalog.md](./partner-eu-catalog.md)。\r\n\r\n**每个接口单独一份文档**：[apis/README.md](./apis/README.md)（随接入递增）。\r\n\r\n| type | 说明 | 文档 |\r\n|------|------|------|\r\n| `bg.promotion.activity.query` | 促销活动查询 | [apis/bg-promotion-activity-query.md](./apis/bg-promotion-activity-query.md) |\r\n| `bg.promotion.activity.candidate.goods.query` | 活动候选商品查询 | [apis/bg-promotion-activity-candidate-goods-query.md](./apis/bg-promotion-activity-candidate-goods-query.md) |\r\n| `bg.promotion.activity.goods.query` | 活动已报名商品查询 | [apis/bg-promotion-activity-goods-query.md](./apis/bg-promotion-activity-goods-query.md) |\r\n| `bg.promotion.activity.goods.enroll` | 活动商品报名 | [apis/bg-promotion-activity-goods-enroll.md](./apis/bg-promotion-activity-goods-enroll.md) |\r\n| `bg.promotion.activity.goods.operation.query` | 活动商品操作结果查询 | [apis/bg-promotion-activity-goods-operation-query.md](./apis/bg-promotion-activity-goods-operation-query.md) |\r\n| `bg.promotion.activity.goods.update` | 活动商品更新 | [apis/bg-promotion-activity-goods-update.md](./apis/bg-promotion-activity-goods-update.md) |\r\n\r\n---\r\n\r\n## 典型促销流程\r\n\r\n```text\r\n1. bg.promotion.activity.query                      → 查可参加/已参加的活动\r\n2. bg.promotion.activity.candidate.goods.query      → 查候选商品与推荐活动价\r\n3. bg.promotion.activity.goods.enroll               → 报名（得 draftId）\r\n4. bg.promotion.activity.goods.operation.query      → 轮询报名/更新结果\r\n5. bg.promotion.activity.goods.query                → 查已报名商品与活动价\r\n6. bg.promotion.activity.goods.update               → 改价/改量/下架/加 SKU\r\n```\r\n\r\n---\r\n\r\n## 与其他 Temu EU skill 的区分\r\n\r\n| 能力 | skill |\r\n|------|--------|\r\n| **促销**（本 skill） | **`linkfox-temu-promotion-eu`** |\r\n| 商品管理（列表/编辑/库存/上下架） | `linkfox-temu-manage-product-eu` |\r\n| 价格/供货价 | `linkfox-temu-price-eu` |\r\n| 发品 | `linkfox-temu-add-product-eu` |\r\n| 订单 | `linkfox-temu-order-eu` |\r\n\r\n---\r\n\r\n## 网关错误码\r\n\r\n| code | 说明 | 处理 |\r\n|------|------|------|\r\n| 1002 | 参数或 LinkFox Token 无效 | 修正参数与 `LINKFOXAGENT_API_KEY` |\r\n| 1003 | 转发失败 | 检查 Temu token、`tokenPurpose`、白名单、网络 |\r\n\r\n---\r\n\r\n## Feedback API\r\n\r\n- **POST** `https://skill-api.linkfox.com/api/v1/public/feedback`\r\n- `skillName`: **`linkfox-temu-promotion-eu`**\n\nFile v1.0.6:references/apis/bg-promotion-activity-candidate-goods-query.md\n\n# 活动候选商品查询 — `bg.promotion.activity.candidate.goods.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_candidate_goods_query.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.candidate.goods.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query candidate goods for a promotion activity.\n\n> **`activityId`**、**`pageNumber`**、**`pageSize`** 均为必填。\n> 返回 **`isAllowedEnroll`** 与推荐活动价/数量，用于报名前选品。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── activityId (LONG, 必填)\n    ├── pageNumber (INTEGER, 必填)\n    └── pageSize (INTEGER, 必填)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| activityId | LONG | **是** | unique identifier for the activity |\n| pageNumber | INTEGER | **是** | page number for pagination, default is 1. |\n| pageSize | INTEGER | **是** | Page size for pagination, default is 10, max is 100. |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"activityId\": 123456,\n    \"pageNumber\": 1,\n    \"pageSize\": 20\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── total (LONG)\n    ├── activityInfo (OBJECT)\n    │   └── activityId, activityName, activityType, activityStatus, …\n    └── goodsList[]\n        ├── goodsId (LONG)\n        ├── isAllowedEnroll (BOOLEAN)\n        ├── recommendActivityQuantity (INTEGER)\n        └── skuList[]\n            ├── skuId (LONG)\n            └── recommendActivitySupplierPrice (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| total | LONG | Total records（总记录数） |\n| activityInfo | OBJECT | Activity information（当前活动信息） |\n| goodsList | OBJECT[] | Candidate goods list（候选商品列表） |\n\n#### `activityInfo`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| activityId | LONG | unique identifier for the activity |\n| activityName | STRING | Activity name |\n| activityType | INTEGER | Activity type |\n| activityStatus | INTEGER | Activity status（`1` Not started；`2` Ongoing；`3` Ended） |\n| activityStartTime | LONG | Start time in seconds |\n| activityEndTime | LONG | End time in seconds |\n| isJoinedActivity | BOOLEAN | Whether joined |\n\n#### `goodsList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| goodsId | LONG | goods id |\n| isAllowedEnroll | BOOLEAN | Whether the goods is allowed to enroll（是否允许报名） |\n| recommendActivityQuantity | INTEGER | Recommended activity quantity（推荐活动数量） |\n| skuList | OBJECT[] | SKU list with recommended prices |\n\n#### `goodsList[].skuList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| skuId | LONG | sku id |\n| recommendActivitySupplierPrice | LONG | Recommended activity supplier price（推荐活动供货价） |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010003 | The activity has been cancelled, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010004 | The activity has ended, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_candidate_goods_query.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"activityId\": 123456, \"pageNumber\": 1, \"pageSize\": 20}}'\n```\n\n**典型流程：** 在 [activity.query](./bg-promotion-activity-query.md) 取得 **`activityId`** 后，查询可报名商品与推荐价。\n\nFile v1.0.6:references/apis/bg-promotion-activity-goods-enroll.md\n\n# 活动商品报名 — `bg.promotion.activity.goods.enroll`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_goods_enroll.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.goods.enroll`，业务载荷放在 Body 的 `params` |\n\n**Description:** Enroll goods into a promotion activity.\n\n> **`activityId`**、**`enrollGoods`** 必填。\n> **`enrollGoods`** 子字段在 Partner Request 表中为折叠行，按 **Request Example** 展开。\n> 返回 **`draftId`**，可用 [goods.operation.query](./bg-promotion-activity-goods-operation-query.md) 轮询 **`operationStatus`**。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── activityId (LONG, 必填)\n    └── enrollGoods (OBJECT, 必填)\n        ├── goodsId (LONG, 必填)\n        ├── activityQuantity (LONG, 必填)\n        ├── traceCode (STRING, 否)\n        └── enrollSkuList[] (OBJECT[], 必填)\n            ├── skuId (LONG)\n            └── activitySupplierPrice (LONG)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| activityId | LONG | **是** | unique identifier for the activity |\n| enrollGoods | OBJECT | **是** | goods information required for activity registration |\n\n#### `enrollGoods`（OBJECT，必填）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| goodsId | LONG | 是 | goods id |\n| activityQuantity | LONG/INTEGER | 是 | Activity quantity for enrollment（报名活动数量） |\n| traceCode | STRING | 否 | Idempotent key（幂等键，单次操作长度不超过 32 字符，Partner Request Example） |\n| enrollSkuList | OBJECT[] | 是 | SKU list to enroll |\n\n#### `enrollGoods.enrollSkuList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| skuId | LONG | sku id |\n| activitySupplierPrice | LONG | Activity supplier price for this SKU（该 SKU 活动供货价） |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"activityId\": 123456,\n    \"enrollGoods\": {\n      \"goodsId\": 100001,\n      \"activityQuantity\": 50,\n      \"traceCode\": \"enroll-001\",\n      \"enrollSkuList\": [\n        {\n          \"skuId\": 200001,\n          \"activitySupplierPrice\": 1999\n        }\n      ]\n    }\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── draftId (LONG)\n    ├── operationStatus (INTEGER)\n    ├── failReason (STRING)\n    └── goodsId (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| draftId | LONG | goods registration activity draft id（报名草稿 ID；前置流程成功时生成，用于 [goods.operation.query](./bg-promotion-activity-goods-operation-query.md)） |\n| operationStatus | INTEGER | Operation status（操作状态码；异步处理时请轮询 operation.query） |\n| failReason | STRING | Failure reason when operation failed（失败原因） |\n| goodsId | LONG | goods id |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010003 | The activity has been cancelled, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010004 | The activity has ended, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_goods_enroll.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"activityId\": 123456, \"enrollGoods\": {\"goodsId\": 100001, \"activityQuantity\": 50, \"traceCode\": \"enroll-001\", \"enrollSkuList\": [{\"skuId\": 200001, \"activitySupplierPrice\": 1999}]}}}'\n```\n\n**典型流程：** 报名 → 保存 **`draftId`** → **goods.operation.query** 确认结果。\n\nFile v1.0.6:references/apis/bg-promotion-activity-goods-operation-query.md\n\n# 活动商品操作结果查询 — `bg.promotion.activity.goods.operation.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_goods_operation_query.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.goods.operation.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query promotion goods operation result by draft ID.\n\n> **`draftIdList`** 为必填（来自 enroll/update 返回的 **`draftId`**）。\n> Partner **Response Example** 中 **`result`** 为 **OBJECT[]**（非带 `total` 的对象包装）。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    └── draftIdList (LONG[], 必填)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| draftIdList | LONG[] | **是** | goods registration activity draft id, which will be generated when the pre-procedure is successfully completed. |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"draftIdList\": [\n      10001,\n      10002\n    ]\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result[]\n    ├── draftId (LONG)\n    ├── operationStatus (INTEGER)\n    ├── failReason (STRING)\n    └── goodsId (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`（OBJECT[]）\n\nPartner Response Example 中 **`result`** 直接为数组。每个元素：\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| draftId | LONG | Draft id |\n| operationStatus | INTEGER | Operation status（操作状态码） |\n| failReason | STRING | Failure reason |\n| goodsId | LONG | goods id |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_goods_operation_query.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"draftIdList\": [10001, 10002]}}'\n```\n\n**典型流程：** 轮询 [goods.enroll](./bg-promotion-activity-goods-enroll.md) / [goods.update](./bg-promotion-activity-goods-update.md) 提交的 **`draftId`**。\n\nFile v1.0.6:references/apis/bg-promotion-activity-goods-query.md\n\n# 活动已报名商品查询 — `bg.promotion.activity.goods.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_goods_query.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.goods.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query enrolled goods in a promotion activity.\n\n> **`activityId`**、**`pageNumber`**、**`pageSize`** 均为必填。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── activityId (LONG, 必填)\n    ├── pageNumber (INTEGER, 必填)\n    └── pageSize (INTEGER, 必填)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| activityId | LONG | **是** | unique identifier for the activity |\n| pageNumber | INTEGER | **是** | page number for pagination, default is 1. |\n| pageSize | INTEGER | **是** | Page size for pagination, default is 10, max is 100. |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"activityId\": 123456,\n    \"pageNumber\": 1,\n    \"pageSize\": 20\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── total (LONG)\n    ├── activityInfo (OBJECT)\n    └── goodsList[]\n        ├── goodsId (LONG)\n        ├── activityQuantity (INTEGER)\n        ├── remainingActivityQuantity (INTEGER)\n        └── skuList[]\n            ├── skuId (LONG)\n            └── activitySupplierPrice (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| total | LONG | Total records |\n| activityInfo | OBJECT | Activity information（字段同 [candidate.goods.query](./bg-promotion-activity-candidate-goods-query.md) 之 `activityInfo`） |\n| goodsList | OBJECT[] | Enrolled goods list（已报名商品列表） |\n\n#### `goodsList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| goodsId | LONG | goods id |\n| activityQuantity | INTEGER | Activity quantity（活动数量/名额） |\n| remainingActivityQuantity | INTEGER | Remaining activity quantity（剩余活动数量） |\n| skuList | OBJECT[] | Enrolled SKU list |\n\n#### `goodsList[].skuList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| skuId | LONG | sku id |\n| activitySupplierPrice | LONG | Activity supplier price（活动供货价） |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010003 | The activity has been cancelled, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010004 | The activity has ended, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_goods_query.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"activityId\": 123456, \"pageNumber\": 1, \"pageSize\": 20}}'\n```\n\n**典型流程：** 查看已报名商品、活动价与剩余名额。\n\nFile v1.0.6:references/apis/bg-promotion-activity-goods-update.md\n\n# 活动商品更新 — `bg.promotion.activity.goods.update`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_goods_update.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.goods.update`，业务载荷放在 Body 的 `params` |\n\n**Description:** Update enrolled promotion activity goods.\n\n> **`activityId`**、**`goodsId`**、**`operateType`** 必填。\n> **`operateType`** 决定必填子参数（见下表）；**`updateSkuList`/`addSkuList`** 按 Request Example 展开。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── traceCode (STRING, 否)\n    ├── activityId (LONG, 必填)\n    ├── activityQuantity (LONG, 否)\n    ├── goodsId (LONG, 必填)\n    ├── operateType (INTEGER, 必填)\n    ├── updateSkuList[] (OBJECT[], 否)\n    │   ├── skuId (LONG)\n    │   └── activitySupplierPrice (LONG)\n    └── addSkuList[] (OBJECT[], 否)\n        ├── skuId (LONG)\n        └── activitySupplierPrice (LONG)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| traceCode | STRING | 否 | Optional. The traceCode is an Idempotent Key for single operations. Its length cannot exceed 32 characters. |\n| activityId | LONG | **是** | unique identifier for the activity |\n| activityQuantity | LONG | 否 | activity quantity, the quantity you set for participating activities. This is independent of product quantity. The updated activity quantity must be more than the original one. |\n| goodsId | LONG | **是** | goods id |\n| operateType | INTEGER | **是** | the type of operation. It determines which parameters are required. For example, if the operation type is 20, then the \"activityQuantity\" parameter must not be null, while all other parameters should be null. If the operation type is 30, then all other parameters must be null. 10 - update activity supplier price 20 - update activity quantity 30 - deactivate activity goods 40 - add activity sku |\n| updateSkuList | OBJECT[] | 否 | sku information required for updating activity sku information |\n| addSkuList | OBJECT[] | 否 | sku information required for adding activity sku information |\n\n#### `operateType`（必填）\n\n| 值 | 说明 | 必填参数 |\n|----|------|----------|\n| `10` | update activity supplier price | `updateSkuList`（其他参数应为 null） |\n| `20` | update activity quantity | `activityQuantity`（须大于原活动数量；其他参数应为 null） |\n| `30` | deactivate activity goods | 其他参数应为 null |\n| `40` | add activity sku | `addSkuList` |\n\n#### `updateSkuList[]` / `addSkuList[]`（Request Example 展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| skuId | LONG | sku id |\n| activitySupplierPrice | LONG | Activity supplier price |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"activityId\": 123456,\n    \"goodsId\": 100001,\n    \"operateType\": 10,\n    \"traceCode\": \"update-001\",\n    \"updateSkuList\": [\n      {\n        \"skuId\": 200001,\n        \"activitySupplierPrice\": 1899\n      }\n    ]\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── draftId (LONG)\n    ├── operationStatus (INTEGER)\n    ├── failReason (STRING)\n    └── goodsId (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| draftId | LONG | Draft id for async operation |\n| operationStatus | INTEGER | Operation status |\n| failReason | STRING | Failure reason |\n| goodsId | LONG | goods id |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010003 | The activity has been cancelled, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010004 | The activity has ended, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_goods_update.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"activityId\": 123456, \"goodsId\": 100001, \"operateType\": 10, \"traceCode\": \"update-001\", \"updateSkuList\": [{\"skuId\": 200001, \"activitySupplierPrice\": 1899}]}}'\n```\n\n**典型流程：** 按 **`operateType`** 更新价/量/下架/加 SKU → 用 **goods.operation.query** 查 **`draftId`** 结果。\n\nFile v1.0.6:references/apis/bg-promotion-activity-query.md\n\n# 促销活动查询 — `bg.promotion.activity.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_query.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query promotion activities.\n\n> 入参 **`activityType`** 为必填；分页使用 **`pageNumber`** / **`pageSize`**（与部分订单接口的 `pageNo` 不同）。\n> 可用 **`activityStartTime`/`activityEndTime`**、**`activityStatus`**、**`activityIdList`**、**`onlyQueryJoinedActivity`** 筛选。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── pageNumber (INTEGER, 必填)\n    ├── activityEndTime (LONG, 否)\n    ├── activityIdList (LONG[], 否)\n    ├── activityStatus (INTEGER, 否)\n    ├── pageSize (INTEGER, 必填)\n    ├── activityStartTime (LONG, 否)\n    ├── activityType (INTEGER, 必填)\n    └── onlyQueryJoinedActivity (BOOLEAN, 否)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| pageNumber | INTEGER | **是** | page number for pagination, default is 1. |\n| activityEndTime | LONG | 否 | end time for querying activity, in seconds. |\n| activityIdList | LONG[] | 否 | unique identifier for the activity |\n| activityStatus | INTEGER | 否 | the status of activity 1 - Not started 2 - Ongoing 3 - Ended |\n| pageSize | INTEGER | **是** | Page size for pagination, default is 10, max is 100. |\n| activityStartTime | LONG | 否 | start time for querying activity, in seconds. |\n| activityType | INTEGER | **是** | the type of activity 2 - lightning deals 13 - advanced big sale 27 - Clearance deals 100 - official big sale |\n| onlyQueryJoinedActivity | BOOLEAN | 否 | whether to query only joined activities. TRUE / FALSE |\n\n#### `activityType`（必填）\n\n| 值 | 说明 |\n|----|------|\n| `2` | lightning deals |\n| `13` | advanced big sale |\n| `27` | Clearance deals |\n| `100` | official big sale |\n\n#### `activityStatus`（入参筛选）\n\n| 值 | 说明 |\n|----|------|\n| `1` | Not started |\n| `2` | Ongoing |\n| `3` | Ended |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"pageNumber\": 1,\n    \"pageSize\": 20,\n    \"activityType\": 2,\n    \"activityStatus\": 2,\n    \"onlyQueryJoinedActivity\": false\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── total (LONG)\n    └── activityList[]\n        ├── activityId (LONG)\n        ├── activityName (STRING)\n        ├── activityType (INTEGER)\n        ├── activityStatus (INTEGER)\n        ├── activityStartTime (LONG)\n        ├── activityEndTime (LONG)\n        └── isJoinedActivity (BOOLEAN)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| total | LONG | Total number of matching activities（匹配活动总数） |\n| activityList | OBJECT[] | Activity list（活动列表） |\n\n#### `activityList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| activityId | LONG | unique identifier for the activity（活动 ID） |\n| activityName | STRING | Activity name（活动名称） |\n| activityType | INTEGER | the type of activity（活动类型），见入参 `activityType` 枚举 |\n| activityStatus | INTEGER | the status of activity（活动状态）：`1` Not started；`2` Ongoing；`3` Ended |\n| activityStartTime | LONG | Activity start time in seconds（活动开始时间，秒级时间戳） |\n| activityEndTime | LONG | Activity end time in seconds（活动结束时间，秒级时间戳） |\n| isJoinedActivity | BOOLEAN | Whether the seller has joined the activity（卖家是否已报名该活动） |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_query.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"pageNumber\": 1, \"pageSize\": 20, \"activityType\": 2, \"activityStatus\": 2, \"onlyQueryJoinedActivity\": false}}'\n```\n\n**典型流程：** 促销流程入口：按 **`activityType`** 与时间窗查询 **`activityList`** → 用 **`activityId`** 查候选/已报名商品。\n\nFile v1.0.6:references/authorization-flow.md\n\n# Temu 授权流程\n\n```text\n用户确认店铺类型与用途\n        ↓\ntemu_token_guide.py（输出后台操作步骤）\n        ↓\n用户在 Temu 卖家后台复制 access_token\n        ↓\nsave_temu_access_token.py（可选，写入本地 store）\n        ↓\ntemu_proxy.py / temu_file_download.py\n  - 直接传 accessToken，或\n  - 传 storeKey + site + managementType + tokenPurpose\n```\n\n## 决策表\n\n| 用户需求 | shopType | tokenPurpose | site |\n|----------|----------|--------------|------|\n| 半托管查商品/库存 | semi-managed | product-inventory | cn / partner |\n| 半托管查订单/发货 | semi-managed | order-shipping | us / global / eu |\n| 全托管任意接口 | full-managed | full-managed | cn / partner |\n| 美欧本土店 | local-native | local-native | us 等 |\n\n## 与 API 调用的对应关系\n\n紫鸟转发路径：`/temu-proxy/{site}/{managementType}`\n\n- 全托管 CN：`cn` + `full-managed`\n- 半托管商品：`cn`/`partner` + `semi-managed` + 商品 token\n- 半托管订单：`us`/`global`/`eu` + `semi-managed` + 订单 token\n\n授权应用名称必须与后台一致：**酷鸟卖家助手** 或 **Cyber-ERP酷鸟助手** / **Cyber-ERP**。\n\nArchive v1.0.5: 36 files, 53758 bytes\n\nFiles: references/access-token.md (4604b), references/api.md (5209b), references/apis/bg-promotion-activity-candidate-goods-query.md (5144b), references/apis/bg-promotion-activity-goods-enroll.md (5203b), references/apis/bg-promotion-activity-goods-operation-query.md (3452b), references/apis/bg-promotion-activity-goods-query.md (4406b), references/apis/bg-promotion-activity-goods-update.md (5805b), references/apis/bg-promotion-activity-query.md (5627b), references/apis/README.md (1307b), references/authorization-flow.md (1186b), references/onboarding.md (2046b), references/partner-eu-catalog.md (3363b), scripts/_eu_promotion_script.py (516b), scripts/_temu_auth_guide.py (6198b), scripts/_temu_common.py (12427b), scripts/_temu_eu_common.py (3174b), scripts/_temu_token_store.py (4273b), scripts/check_linkfox_token.py (1797b), scripts/eu_promotion_activity_candidate_goods_query.py (307b), scripts/eu_promotion_activity_goods_enroll.py (274b), scripts/eu_promotion_activity_goods_operation_query.py (313b), scripts/eu_promotion_activity_goods_query.py (280b), scripts/eu_promotion_activity_goods_update.py (274b), scripts/eu_promotion_activity_query.py (253b), scripts/get_temu_access_token.py (1843b), scripts/list_temu_access_tokens.py (652b), scripts/onboarding.py (24089b), scripts/save_temu_access_token.py (1377b), scripts/temu_eu_file_download.py (680b), scripts/temu_eu_proxy.py (901b), scripts/temu_file_download.py (1681b), scripts/temu_proxy.py (2124b), scripts/temu_token_guide.py (1594b), skill-card.md (2881b), SKILL.md (6146b), _meta.json (144b)\n\nFile v1.0.5:SKILL.md\n\n---\nname: linkfox-temu-promotion-eu\ndescription: Temu 欧洲站电商促销 API，经 LinkFox 网关转发 Partner EU Promotion / 促销活动 相关 bg/temu 接口（活动创建、报名、查询、优惠券/秒杀等，接口将按 Partner 文档逐条接入）。当用户提到 Temu EU 促销、促销活动、优惠券、秒杀、活动报名、promotion campaign、product-inventory 促销 时触发。商品管理用 linkfox-temu-manage-product-eu；价格用 linkfox-temu-price-eu；订单用 linkfox-temu-order-eu。\n---\n\n# Temu 欧洲站 — 电商促销（Promotion）\n\n本 skill（`linkfox-temu-promotion-eu`）覆盖 Partner Platform for EU **Promotion / 电商促销**（促销活动、优惠券、活动报名等；Partner 后台菜单可能显示为 Marketing/Promotion）相关 `bg.*` / `temu.*` 接口（`menu_code` 与各 `sub_menu_code` 以 Partner 后台为准，见 [partner-eu-catalog.md](./references/partner-eu-catalog.md)）。\n\n已接入 **6** 条 Partner **Promotion** 接口，清单见 [partner-eu-catalog.md](./references/partner-eu-catalog.md)。\n\n**网关（本 skill 内置）**：\n\n| 能力 | 方法 | 路径 |\n|------|------|------|\n| 促销 OpenAPI（`eu_promotion_*`、`temu_eu_proxy`） | POST | `https://tool-gateway.linkfox.com/temu/proxy` |\n| 加签文件下载 | POST | `https://tool-gateway.linkfox.com/temu/fileDownload` |\n\n## 相关 skill\n\n| 场景 | skill |\n|------|--------|\n| **促销/营销活动**（本 skill） | **`linkfox-temu-promotion-eu`** |\n| 广告 Ads | `linkfox-temu-ads-eu` |\n| 商品列表/详情/编辑/库存/上下架 | `linkfox-temu-manage-product-eu` |\n| 发品 | `linkfox-temu-add-product-eu` |\n| 价格/供货价、定价单 | `linkfox-temu-price-eu` |\n| 订单列表/详情 | `linkfox-temu-order-eu` |\n| 退货与退款 | `linkfox-temu-returns-refunds-eu` |\n| 网关与 Temu token | 本 skill `scripts/` |\n\n## 调用方式\n\n- **API 端点**：`POST /temu/proxy`（不同操作通过请求体区分；完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/<脚本名>.py '<JSON 参数>' [--inline]`（可用脚本见上文脚本一览）\n- **成本约束**：本工具会消耗积分；失败/空结果不得自动换关键词、翻页或连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/<skill-name>-<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## 默认参数\n\n| 字段 | 默认 | 说明 |\n|------|------|------|\n| site | `eu` | Partner EU |\n| managementType | `semi-managed` | 半托管（具体接口以 Partner 文档为准） |\n| tokenPurpose | `product-inventory` | 与商品/促销场景一致（见 [access-token.md](./references/access-token.md)） |\n\n## 鉴权\n\n1. **LinkFox**：`LINKFOXAGENT_API_KEY` → Header `Authorization` + `Token`\n2. **Temu**：`accessToken` 或 `storeKey`（`storeKey` 时建议带 `tokenPurpose=product-inventory`）\n\n## Scripts\n\n| 脚本 | 说明 |\n|------|------|\n| `temu_eu_proxy.py` | 任意 type |\n| `temu_eu_file_download.py` | 加签下载 |\n| `eu_promotion_activity_query.py` | `bg.promotion.activity.query` |\n| `eu_promotion_activity_candidate_goods_query.py` | `bg.promotion.activity.candidate.goods.query` |\n| `eu_promotion_activity_goods_query.py` | `bg.promotion.activity.goods.query` |\n| `eu_promotion_activity_goods_enroll.py` | `bg.promotion.activity.goods.enroll` |\n| `eu_promotion_activity_goods_operation_query.py` | `bg.promotion.activity.goods.operation.query` |\n| `eu_promotion_activity_goods_update.py` | `bg.promotion.activity.goods.update` |\n\n## 接入新接口（约定）\n\n你每提供一条 Partner 文档（`type` + `sub_menu_code` + URL + Request/Response 参数表），将：\n\n1. 新增 `references/apis/<type-slug>.md`（完整入参/出参层级）\n2. 新增 `scripts/eu_promotion_<slug>.py`（调用 `_eu_promotion_script.run_cli`）\n3. 更新 [partner-eu-catalog.md](./references/partner-eu-catalog.md)、[apis/README.md](./references/apis/README.md) 与本表\n\n## 示例（通用代理）\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\n\npython scripts/temu_eu_proxy.py '{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"type\": \"<TEMU_API_TYPE>\",\n  \"params\": {\n    \"request\": {}\n  }\n}'\n```\n\n**Feedback：** `skillName`：`linkfox-temu-promotion-eu`\n\n## 网关与授权脚本\n\n| 脚本 | 说明 |\n|------|------|\n| `check_linkfox_token.py` | 校验 LinkFox 用户 Token |\n| `temu_token_guide.py` | Temu accessToken 后台授权步骤 |\n| `save_temu_access_token.py` | 保存 accessToken 到本地 |\n| `list_temu_access_tokens.py` | 列出已保存 token |\n| `get_temu_access_token.py` | 读取已保存 token |\n| `temu_proxy.py` | 通用网关转发（多 site） |\n| `temu_file_download.py` | 加签文件下载（多 site） |\n\n授权说明：[references/access-token.md](./references/access-token.md)\n\n## 积分消耗规则\n\n不消耗积分。\n\nFile v1.0.5:references/apis/README.md\n\n# Promotion — 接口文档索引\n\n网关见 [../api.md](../api.md)；目录见 [../partner-eu-catalog.md](../partner-eu-catalog.md)。\n\n## 活动查询\n\n| type | 说明 | 文档 |\n|------|------|------|\n| `bg.promotion.activity.query` | 促销活动查询 | [bg-promotion-activity-query.md](./apis/bg-promotion-activity-query.md) |\n| `bg.promotion.activity.candidate.goods.query` | 活动候选商品查询 | [bg-promotion-activity-candidate-goods-query.md](./apis/bg-promotion-activity-candidate-goods-query.md) |\n| `bg.promotion.activity.goods.query` | 活动已报名商品查询 | [bg-promotion-activity-goods-query.md](./apis/bg-promotion-activity-goods-query.md) |\n\n## 报名 / 操作结果\n\n| type | 说明 | 文档 |\n|------|------|------|\n| `bg.promotion.activity.goods.enroll` | 活动商品报名 | [bg-promotion-activity-goods-enroll.md](./apis/bg-promotion-activity-goods-enroll.md) |\n| `bg.promotion.activity.goods.operation.query` | 活动商品操作结果查询 | [bg-promotion-activity-goods-operation-query.md](./apis/bg-promotion-activity-goods-operation-query.md) |\n\n## 商品更新\n\n| type | 说明 | 文档 |\n|------|------|------|\n| `bg.promotion.activity.goods.update` | 活动商品更新 | [bg-promotion-activity-goods-update.md](./apis/bg-promotion-activity-goods-update.md) |\n\nFile v1.0.5:_meta.json\n\n{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-temu-promotion-eu\",\n  \"version\": \"1.0.5\",\n  \"publishedAt\": 1786101712873\n}\n\nFile v1.0.5:references/access-token.md\n\n# Temu accessToken 授权与获取\n\nTemu **没有** LinkFox 侧自动 OAuth；`accessToken` 须在 Temu 卖家后台「服务市场 → 授权管理」**手动复制**。与 `LINKFOXAGENT_API_KEY`（LinkFox 用户鉴权）是两套令牌。（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理）\n\n## 两种鉴权（勿混淆）\n\n| 令牌 | 用途 | 获取方式 |\n|------|------|----------|\n| **LinkFox 用户 Token** | 调用 `/temu/proxy`、`/temu/fileDownload` **必填** | `LINKFOXAGENT_API_KEY` 或请求 JSON 的 `token`；Header `Authorization` + `Token`（同 amazon-store-auth）（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理） |\n| **Temu accessToken** | Temu 业务 API（经紫鸟转发） | Temu 卖家后台授权后复制 |\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<your-key>\"\npython scripts/check_linkfox_token.py\n```\n\n## tokenPurpose 与场景\n\n| tokenPurpose | 店铺类型 | 推荐 site | 授权应用 |\n|--------------|----------|-----------|----------|\n| `product-inventory` | 半托管 | `cn` / `partner` | 酷鸟卖家助手 |\n| `order-shipping` | 半托管 | `us` / `global` / `eu` | Cyber-ERP酷鸟助手 |\n| `full-managed` | 全托管 | `cn` / `partner` | 酷鸟卖家助手 |\n| `local-native` | 本土（美/欧主体） | `us` 等 | Cyber-ERP |\n\n## 1. 半托管 — 商品/库存 Token\n\n1. 登录 [seller.kuajingmaihuo.com](https://seller.kuajingmaihuo.com) 或 [agentseller.temu.com](https://agentseller.temu.com)\n2. **系统管理** → **服务市场** → **授权管理**\n3. **获取授权** → 选择 **「酷鸟卖家助手」**\n4. 全选常规和特殊授权 → 确认 → **复制 access_token**\n5. 调用 API：`site=cn` 或 `partner`，`managementType=semi-managed`\n\n## 2. 半托管 — 订单/发货 Token\n\n1. 登录 Temu 卖家后台\n2. 右上角 **Seller Central** → 切换到目标区域（美区 / 欧区 / 全球）\n3. **服务市场** → **授权管理**\n4. **获取授权** → 选择 **「Cyber-ERP酷鸟助手」**\n5. 全选授权 → 确认 → 复制 token\n6. 调用 API：`site=eu` / `global` / `eu`，`managementType=semi-managed`\n\n## 3. 全托管店铺\n\n1. 登录 Temu 平台\n2. **系统管理** → **服务市场** → **授权管理**\n3. **获取授权** → **「酷鸟卖家助手」** → 全选 → 复制 token\n4. 调用 API：`managementType=full-managed`，`site` 通常 `cn` 或 `partner`\n\n## 4. 本土店铺（美区、欧区主体）\n\n1. 登录 Temu\n2. **Apps And Services** → **Manage Your Apps**\n3. **Authorize a new app** → 搜索 **「Cyber-ERP」**\n4. 一般权限与敏感权限全选 → 确认 → 复制 token\n\n## 站点与 OpenAPI 网关\n\n| site | 说明 | Temu 网关 |\n|------|------|-----------|\n| cn | 中国站 | openapi.kuajingmaihuo.com |\n| partner | Partner 网关 | openapi-b-partner.temu.com |\n| us | 欧洲站 | openapi-b-eu.temu.com |\n| global | 全球区 | openapi-b-global.temu.com |\n| eu | 欧洲站 | openapi-b-eu.temu.com |\n\n## 本地保存 Token（推荐）\n\n默认存储：`~/.linkfox/temu-access-tokens.json`（可用 `TEMU_TOKEN_STORE_PATH` 覆盖）。\n\n```bash\n# 查看授权步骤\npython scripts/temu_token_guide.py '{\"shopType\":\"semi-managed\",\"tokenPurpose\":\"product-inventory\",\"site\":\"cn\"}'\n\n# 保存 token\npython scripts/save_temu_access_token.py '{\n  \"storeKey\": \"my-shop\",\n  \"label\": \"中国半托管\",\n  \"site\": \"cn\",\n  \"managementType\": \"semi-managed\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"accessToken\": \"PASTE_TOKEN\"\n}'\n\n# 列出已保存（脱敏）\npython scripts/list_temu_access_tokens.py\n\n# 用 storeKey 调 API（无需每次粘贴 token）\npython scripts/temu_proxy.py '{\n  \"storeKey\": \"my-shop\",\n  \"site\": \"cn\",\n  \"managementType\": \"semi-managed\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"type\": \"bg.goods.category.mapping\",\n  \"params\": {\"goodsName\": \"测试\", \"goodsNameEn\": \"Test\"}\n}'\n```\n\n## 注意事项\n\n1. **子账号**：可能无法进入服务市场，需主账号授权。\n2. **多站点**：欧洲站、英国站等需分别登录对应后台获取 Token。\n3. **有效期**：Token 会过期，过期后重新在后台复制并 `save_temu_access_token.py`。\n4. **IP 白名单**：需联系紫鸟开放平台配置调用 IP。\n5. **参数小写**：`site`、`managementType` 必须小写。\n\n## 脚本一览\n\n| 脚本 | 说明 |\n|------|------|\n| `temu_token_guide.py` | 按店铺类型/用途输出授权步骤 |\n| `save_temu_access_token.py` | 保存 accessToken 到本地 |\n| `list_temu_access_tokens.py` | 列出已保存 token（默认脱敏）|\n| `get_temu_access_token.py` | 读取指定 store 的 token |\n\nFile v1.0.5:references/api.md\n\n# linkfox-temu-promotion-eu — API 参考\r\n\r\nTemu **欧洲站电商促销**（Partner EU **Promotion** / 促销活动等），经本 skill `temu_eu_proxy`（`POST /temu/proxy`） 转发。Temu 的 `type` 写在 Body，**不是** URL 路径。\r\n\r\n> 网关与鉴权：本 skill `scripts/`（`LINKFOXAGENT_API_KEY`、`accessToken` / `storeKey`）。授权见 `references/access-token.md`。（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理）\r\n\r\n---\r\n\r\n## 调用规范\r\n\r\n| 项 | 说明 |\r\n|----|------|\r\n| 网关根地址 | `${LINKFOX_TOOL_GATEWAY}`（可用 `TEMU_API_BASE_URL` / `STORE_API_BASE_URL` 覆盖） |\r\n| 促销 OpenAPI | `POST /temu/proxy` |\r\n| 加签文件下载 | `POST /temu/fileDownload`（`temu_eu_file_download.py`） |\r\n| LinkFox 鉴权 | Header **`Authorization`** 与 **`Token`**（同值）；或 `LINKFOX_AGENT_API_KEY` / `LINKFOXAGENT_API_KEY`；或 JSON `token`（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理） |\r\n| Temu 鉴权 | Body `accessToken`，或 `storeKey` + `site` + `managementType` + `tokenPurpose` |\r\n| 默认 | `site=eu`，`managementType=semi-managed`，`tokenPurpose=product-inventory` |\r\n| 上游 OpenAPI（US） | `https://openapi-b-eu.temu.com/openapi/router`（网关按 `site` 解析） |\r\n\r\n### 网关请求 Body（`/temu/proxy`）\r\n\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| site | string | 是 | `eu`（本 skill 默认） |\r\n| managementType | string | 是 | `semi-managed` |\r\n| accessToken | string | 与 storeKey 二选一 | Temu 店铺令牌 |\r\n| storeKey | string | 与 accessToken 二选一 | `~/.linkfox/temu-access-tokens.json` 中的键 |\r\n| tokenPurpose | string | 否 | 建议 **`product-inventory`** |\r\n| type | string | 是 | Temu 接口名，如 Partner Promotion 菜单下的 `bg.*` / `temu.*` |\r\n| params | object | 否 | 业务参数；多数接口业务块在 **`params.request`** |\r\n\r\n### 网关响应\r\n\r\n| 字段 | 类型 | 说明 |\r\n|------|------|------|\r\n| body | string | Temu 原始 JSON 字符串；脚本解析为 `temuBody` |\r\n| code | integer | 网关错误码：`1002` 参数/Token，`1003` 转发失败 |\r\n\r\n解析顺序：**网关 `code`** → `JSON.parse(body)` → `success` / `errorCode` / `errorMsg` / `result`。\r\n\r\n### 脚本调用\r\n\r\n```bash\r\nexport LINKFOXAGENT_API_KEY=\"<key>\"\r\npython scripts/temu_eu_proxy.py '{\"accessToken\":\"TOKEN\",\"tokenPurpose\":\"product-inventory\",\"type\":\"<API_TYPE>\",\"params\":{\"request\":{}}}'\r\n```\r\n\r\n业务字段可放在顶层或嵌套 `params`；含 `request` 时通常整体作为 `params` 转发。\r\n\r\n---\r\n\r\n## 接口一览\r\n\r\n完整 `sub_menu_code` 与 Partner 文档 URL 见 [partner-eu-catalog.md](./partner-eu-catalog.md)。\r\n\r\n**每个接口单独一份文档**：[apis/README.md](./apis/README.md)（随接入递增）。\r\n\r\n| type | 说明 | 文档 |\r\n|------|------|------|\r\n| `bg.promotion.activity.query` | 促销活动查询 | [apis/bg-promotion-activity-query.md](./apis/bg-promotion-activity-query.md) |\r\n| `bg.promotion.activity.candidate.goods.query` | 活动候选商品查询 | [apis/bg-promotion-activity-candidate-goods-query.md](./apis/bg-promotion-activity-candidate-goods-query.md) |\r\n| `bg.promotion.activity.goods.query` | 活动已报名商品查询 | [apis/bg-promotion-activity-goods-query.md](./apis/bg-promotion-activity-goods-query.md) |\r\n| `bg.promotion.activity.goods.enroll` | 活动商品报名 | [apis/bg-promotion-activity-goods-enroll.md](./apis/bg-promotion-activity-goods-enroll.md) |\r\n| `bg.promotion.activity.goods.operation.query` | 活动商品操作结果查询 | [apis/bg-promotion-activity-goods-operation-query.md](./apis/bg-promotion-activity-goods-operation-query.md) |\r\n| `bg.promotion.activity.goods.update` | 活动商品更新 | [apis/bg-promotion-activity-goods-update.md](./apis/bg-promotion-activity-goods-update.md) |\r\n\r\n---\r\n\r\n## 典型促销流程\r\n\r\n```text\r\n1. bg.promotion.activity.query                      → 查可参加/已参加的活动\r\n2. bg.promotion.activity.candidate.goods.query      → 查候选商品与推荐活动价\r\n3. bg.promotion.activity.goods.enroll               → 报名（得 draftId）\r\n4. bg.promotion.activity.goods.operation.query      → 轮询报名/更新结果\r\n5. bg.promotion.activity.goods.query                → 查已报名商品与活动价\r\n6. bg.promotion.activity.goods.update               → 改价/改量/下架/加 SKU\r\n```\r\n\r\n---\r\n\r\n## 与其他 Temu EU skill 的区分\r\n\r\n| 能力 | skill |\r\n|------|--------|\r\n| **促销**（本 skill） | **`linkfox-temu-promotion-eu`** |\r\n| 商品管理（列表/编辑/库存/上下架） | `linkfox-temu-manage-product-eu` |\r\n| 价格/供货价 | `linkfox-temu-price-eu` |\r\n| 发品 | `linkfox-temu-add-product-eu` |\r\n| 订单 | `linkfox-temu-order-eu` |\r\n\r\n---\r\n\r\n## 网关错误码\r\n\r\n| code | 说明 | 处理 |\r\n|------|------|------|\r\n| 1002 | 参数或 LinkFox Token 无效 | 修正参数与 `LINKFOXAGENT_API_KEY` |\r\n| 1003 | 转发失败 | 检查 Temu token、`tokenPurpose`、白名单、网络 |\r\n\r\n---\r\n\r\n## Feedback API\r\n\r\n- **POST** `https://skill-api.linkfox.com/api/v1/public/feedback`\r\n- `skillName`: **`linkfox-temu-promotion-eu`**\n\nFile v1.0.5:references/apis/bg-promotion-activity-candidate-goods-query.md\n\n# 活动候选商品查询 — `bg.promotion.activity.candidate.goods.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_candidate_goods_query.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.candidate.goods.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query candidate goods for a promotion activity.\n\n> **`activityId`**、**`pageNumber`**、**`pageSize`** 均为必填。\n> 返回 **`isAllowedEnroll`** 与推荐活动价/数量，用于报名前选品。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── activityId (LONG, 必填)\n    ├── pageNumber (INTEGER, 必填)\n    └── pageSize (INTEGER, 必填)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| activityId | LONG | **是** | unique identifier for the activity |\n| pageNumber | INTEGER | **是** | page number for pagination, default is 1. |\n| pageSize | INTEGER | **是** | Page size for pagination, default is 10, max is 100. |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"activityId\": 123456,\n    \"pageNumber\": 1,\n    \"pageSize\": 20\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── total (LONG)\n    ├── activityInfo (OBJECT)\n    │   └── activityId, activityName, activityType, activityStatus, …\n    └── goodsList[]\n        ├── goodsId (LONG)\n        ├── isAllowedEnroll (BOOLEAN)\n        ├── recommendActivityQuantity (INTEGER)\n        └── skuList[]\n            ├── skuId (LONG)\n            └── recommendActivitySupplierPrice (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| total | LONG | Total records（总记录数） |\n| activityInfo | OBJECT | Activity information（当前活动信息） |\n| goodsList | OBJECT[] | Candidate goods list（候选商品列表） |\n\n#### `activityInfo`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| activityId | LONG | unique identifier for the activity |\n| activityName | STRING | Activity name |\n| activityType | INTEGER | Activity type |\n| activityStatus | INTEGER | Activity status（`1` Not started；`2` Ongoing；`3` Ended） |\n| activityStartTime | LONG | Start time in seconds |\n| activityEndTime | LONG | End time in seconds |\n| isJoinedActivity | BOOLEAN | Whether joined |\n\n#### `goodsList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| goodsId | LONG | goods id |\n| isAllowedEnroll | BOOLEAN | Whether the goods is allowed to enroll（是否允许报名） |\n| recommendActivityQuantity | INTEGER | Recommended activity quantity（推荐活动数量） |\n| skuList | OBJECT[] | SKU list with recommended prices |\n\n#### `goodsList[].skuList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| skuId | LONG | sku id |\n| recommendActivitySupplierPrice | LONG | Recommended activity supplier price（推荐活动供货价） |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010003 | The activity has been cancelled, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010004 | The activity has ended, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_candidate_goods_query.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"activityId\": 123456, \"pageNumber\": 1, \"pageSize\": 20}}'\n```\n\n**典型流程：** 在 [activity.query](./bg-promotion-activity-query.md) 取得 **`activityId`** 后，查询可报名商品与推荐价。\n\nFile v1.0.5:references/apis/bg-promotion-activity-goods-enroll.md\n\n# 活动商品报名 — `bg.promotion.activity.goods.enroll`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_goods_enroll.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.goods.enroll`，业务载荷放在 Body 的 `params` |\n\n**Description:** Enroll goods into a promotion activity.\n\n> **`activityId`**、**`enrollGoods`** 必填。\n> **`enrollGoods`** 子字段在 Partner Request 表中为折叠行，按 **Request Example** 展开。\n> 返回 **`draftId`**，可用 [goods.operation.query](./bg-promotion-activity-goods-operation-query.md) 轮询 **`operationStatus`**。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── activityId (LONG, 必填)\n    └── enrollGoods (OBJECT, 必填)\n        ├── goodsId (LONG, 必填)\n        ├── activityQuantity (LONG, 必填)\n        ├── traceCode (STRING, 否)\n        └── enrollSkuList[] (OBJECT[], 必填)\n            ├── skuId (LONG)\n            └── activitySupplierPrice (LONG)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| activityId | LONG | **是** | unique identifier for the activity |\n| enrollGoods | OBJECT | **是** | goods information required for activity registration |\n\n#### `enrollGoods`（OBJECT，必填）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| goodsId | LONG | 是 | goods id |\n| activityQuantity | LONG/INTEGER | 是 | Activity quantity for enrollment（报名活动数量） |\n| traceCode | STRING | 否 | Idempotent key（幂等键，单次操作长度不超过 32 字符，Partner Request Example） |\n| enrollSkuList | OBJECT[] | 是 | SKU list to enroll |\n\n#### `enrollGoods.enrollSkuList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| skuId | LONG | sku id |\n| activitySupplierPrice | LONG | Activity supplier price for this SKU（该 SKU 活动供货价） |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"activityId\": 123456,\n    \"enrollGoods\": {\n      \"goodsId\": 100001,\n      \"activityQuantity\": 50,\n      \"traceCode\": \"enroll-001\",\n      \"enrollSkuList\": [\n        {\n          \"skuId\": 200001,\n          \"activitySupplierPrice\": 1999\n        }\n      ]\n    }\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── draftId (LONG)\n    ├── operationStatus (INTEGER)\n    ├── failReason (STRING)\n    └── goodsId (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| draftId | LONG | goods registration activity draft id（报名草稿 ID；前置流程成功时生成，用于 [goods.operation.query](./bg-promotion-activity-goods-operation-query.md)） |\n| operationStatus | INTEGER | Operation status（操作状态码；异步处理时请轮询 operation.query） |\n| failReason | STRING | Failure reason when operation failed（失败原因） |\n| goodsId | LONG | goods id |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010003 | The activity has been cancelled, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010004 | The activity has ended, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_goods_enroll.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"activityId\": 123456, \"enrollGoods\": {\"goodsId\": 100001, \"activityQuantity\": 50, \"traceCode\": \"enroll-001\", \"enrollSkuList\": [{\"skuId\": 200001, \"activitySupplierPrice\": 1999}]}}}'\n```\n\n**典型流程：** 报名 → 保存 **`draftId`** → **goods.operation.query** 确认结果。\n\nFile v1.0.5:references/apis/bg-promotion-activity-goods-operation-query.md\n\n# 活动商品操作结果查询 — `bg.promotion.activity.goods.operation.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_goods_operation_query.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.goods.operation.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query promotion goods operation result by draft ID.\n\n> **`draftIdList`** 为必填（来自 enroll/update 返回的 **`draftId`**）。\n> Partner **Response Example** 中 **`result`** 为 **OBJECT[]**（非带 `total` 的对象包装）。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    └── draftIdList (LONG[], 必填)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| draftIdList | LONG[] | **是** | goods registration activity draft id, which will be generated when the pre-procedure is successfully completed. |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"draftIdList\": [\n      10001,\n      10002\n    ]\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result[]\n    ├── draftId (LONG)\n    ├── operationStatus (INTEGER)\n    ├── failReason (STRING)\n    └── goodsId (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`（OBJECT[]）\n\nPartner Response Example 中 **`result`** 直接为数组。每个元素：\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| draftId | LONG | Draft id |\n| operationStatus | INTEGER | Operation status（操作状态码） |\n| failReason | STRING | Failure reason |\n| goodsId | LONG | goods id |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_goods_operation_query.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"draftIdList\": [10001, 10002]}}'\n```\n\n**典型流程：** 轮询 [goods.enroll](./bg-promotion-activity-goods-enroll.md) / [goods.update](./bg-promotion-activity-goods-update.md) 提交的 **`draftId`**。\n\nFile v1.0.5:references/apis/bg-promotion-activity-goods-query.md\n\n# 活动已报名商品查询 — `bg.promotion.activity.goods.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_goods_query.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.goods.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query enrolled goods in a promotion activity.\n\n> **`activityId`**、**`pageNumber`**、**`pageSize`** 均为必填。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── activityId (LONG, 必填)\n    ├── pageNumber (INTEGER, 必填)\n    └── pageSize (INTEGER, 必填)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| activityId | LONG | **是** | unique identifier for the activity |\n| pageNumber | INTEGER | **是** | page number for pagination, default is 1. |\n| pageSize | INTEGER | **是** | Page size for pagination, default is 10, max is 100. |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"activityId\": 123456,\n    \"pageNumber\": 1,\n    \"pageSize\": 20\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── total (LONG)\n    ├── activityInfo (OBJECT)\n    └── goodsList[]\n        ├── goodsId (LONG)\n        ├── activityQuantity (INTEGER)\n        ├── remainingActivityQuantity (INTEGER)\n        └── skuList[]\n            ├── skuId (LONG)\n            └── activitySupplierPrice (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| total | LONG | Total records |\n| activityInfo | OBJECT | Activity information（字段同 [candidate.goods.query](./bg-promotion-activity-candidate-goods-query.md) 之 `activityInfo`） |\n| goodsList | OBJECT[] | Enrolled goods list（已报名商品列表） |\n\n#### `goodsList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| goodsId | LONG | goods id |\n| activityQuantity | INTEGER | Activity quantity（活动数量/名额） |\n| remainingActivityQuantity | INTEGER | Remaining activity quantity（剩余活动数量） |\n| skuList | OBJECT[] | Enrolled SKU list |\n\n#### `goodsList[].skuList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| skuId | LONG | sku id |\n| activitySupplierPrice | LONG | Activity supplier price（活动供货价） |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010003 | The activity has been cancelled, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010004 | The activity has ended, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_goods_query.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"activityId\": 123456, \"pageNumber\": 1, \"pageSize\": 20}}'\n```\n\n**典型流程：** 查看已报名商品、活动价与剩余名额。\n\nFile v1.0.5:references/apis/bg-promotion-activity-goods-update.md\n\n# 活动商品更新 — `bg.promotion.activity.goods.update`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_goods_update.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.goods.update`，业务载荷放在 Body 的 `params` |\n\n**Description:** Update enrolled promotion activity goods.\n\n> **`activityId`**、**`goodsId`**、**`operateType`** 必填。\n> **`operateType`** 决定必填子参数（见下表）；**`updateSkuList`/`addSkuList`** 按 Request Example 展开。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── traceCode (STRING, 否)\n    ├── activityId (LONG, 必填)\n    ├── activityQuantity (LONG, 否)\n    ├── goodsId (LONG, 必填)\n    ├── operateType (INTEGER, 必填)\n    ├── updateSkuList[] (OBJECT[], 否)\n    │   ├── skuId (LONG)\n    │   └── activitySupplierPrice (LONG)\n    └── addSkuList[] (OBJECT[], 否)\n        ├── skuId (LONG)\n        └── activitySupplierPrice (LONG)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| traceCode | STRING | 否 | Optional. The traceCode is an Idempotent Key for single operations. Its length cannot exceed 32 characters. |\n| activityId | LONG | **是** | unique identifier for the activity |\n| activityQuantity | LONG | 否 | activity quantity, the quantity you set for participating activities. This is independent of product quantity. The updated activity quantity must be more than the original one. |\n| goodsId | LONG | **是** | goods id |\n| operateType | INTEGER | **是** | the type of operation. It determines which parameters are required. For example, if the operation type is 20, then the \"activityQuantity\" parameter must not be null, while all other parameters should be null. If the operation type is 30, then all other parameters must be null. 10 - update activity supplier price 20 - update activity quantity 30 - deactivate activity goods 40 - add activity sku |\n| updateSkuList | OBJECT[] | 否 | sku information required for updating activity sku information |\n| addSkuList | OBJECT[] | 否 | sku information required for adding activity sku information |\n\n#### `operateType`（必填）\n\n| 值 | 说明 | 必填参数 |\n|----|------|----------|\n| `10` | update activity supplier price | `updateSkuList`（其他参数应为 null） |\n| `20` | update activity quantity | `activityQuantity`（须大于原活动数量；其他参数应为 null） |\n| `30` | deactivate activity goods | 其他参数应为 null |\n| `40` | add activity sku | `addSkuList` |\n\n#### `updateSkuList[]` / `addSkuList[]`（Request Example 展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| skuId | LONG | sku id |\n| activitySupplierPrice | LONG | Activity supplier price |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"activityId\": 123456,\n    \"goodsId\": 100001,\n    \"operateType\": 10,\n    \"traceCode\": \"update-001\",\n    \"updateSkuList\": [\n      {\n        \"skuId\": 200001,\n        \"activitySupplierPrice\": 1899\n      }\n    ]\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── draftId (LONG)\n    ├── operationStatus (INTEGER)\n    ├── failReason (STRING)\n    └── goodsId (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| draftId | LONG | Draft id for async operation |\n| operationStatus | INTEGER | Operation status |\n| failReason | STRING | Failure reason |\n| goodsId | LONG | goods id |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010003 | The activity has been cancelled, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010004 | The activity has ended, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_goods_update.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"activityId\": 123456, \"goodsId\": 100001, \"operateType\": 10, \"traceCode\": \"update-001\", \"updateSkuList\": [{\"skuId\": 200001, \"activitySupplierPrice\": 1899}]}}'\n```\n\n**典型流程：** 按 **`operateType`** 更新价/量/下架/加 SKU → 用 **goods.operation.query** 查 **`draftId`** 结果。\n\nFile v1.0.5:references/apis/bg-promotion-activity-query.md\n\n# 促销活动查询 — `bg.promotion.activity.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_query.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query promotion activities.\n\n> 入参 **`activityType`** 为必填；分页使用 **`pageNumber`** / **`pageSize`**（与部分订单接口的 `pageNo` 不同）。\n> 可用 **`activityStartTime`/`activityEndTime`**、**`activityStatus`**、**`activityIdList`**、**`onlyQueryJoinedActivity`** 筛选。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── pageNumber (INTEGER, 必填)\n    ├── activityEndTime (LONG, 否)\n    ├── activityIdList (LONG[], 否)\n    ├── activityStatus (INTEGER, 否)\n    ├── pageSize (INTEGER, 必填)\n    ├── activityStartTime (LONG, 否)\n    ├── activityType (INTEGER, 必填)\n    └── onlyQueryJoinedActivity (BOOLEAN, 否)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| pageNumber | INTEGER | **是** | page number for pagination, default is 1. |\n| activityEndTime | LONG | 否 | end time for querying activity, in seconds. |\n| activityIdList | LONG[] | 否 | unique identifier for the activity |\n| activityStatus | INTEGER | 否 | the status of activity 1 - Not started 2 - Ongoing 3 - Ended |\n| pageSize | INTEGER | **是** | Page size for pagination, default is 10, max is 100. |\n| activityStartTime | LONG | 否 | start time for querying activity, in seconds. |\n| activityType | INTEGER | **是** | the type of activity 2 - lightning deals 13 - advanced big sale 27 - Clearance deals 100 - official big sale |\n| onlyQueryJoinedActivity | BOOLEAN | 否 | whether to query only joined activities. TRUE / FALSE |\n\n#### `activityType`（必填）\n\n| 值 | 说明 |\n|----|------|\n| `2` | lightning deals |\n| `13` | advanced big sale |\n| `27` | Clearance deals |\n| `100` | official big sale |\n\n#### `activityStatus`（入参筛选）\n\n| 值 | 说明 |\n|----|------|\n| `1` | Not started |\n| `2` | Ongoing |\n| `3` | Ended |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"pageNumber\": 1,\n    \"pageSize\": 20,\n    \"activityType\": 2,\n    \"activityStatus\": 2,\n    \"onlyQueryJoinedActivity\": false\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── total (LONG)\n    └── activityList[]\n        ├── activityId (LONG)\n        ├── activityName (STRING)\n        ├── activityType (INTEGER)\n        ├── activityStatus (INTEGER)\n        ├── activityStartTime (LONG)\n        ├── activityEndTime (LONG)\n        └── isJoinedActivity (BOOLEAN)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| total | LONG | Total number of matching activities（匹配活动总数） |\n| activityList | OBJECT[] | Activity list（活动列表） |\n\n#### `activityList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| activityId | LONG | unique identifier for the activity（活动 ID） |\n| activityName | STRING | Activity name（活动名称） |\n| activityType | INTEGER | the type of activity（活动类型），见入参 `activityType` 枚举 |\n| activityStatus | INTEGER | the status of activity（活动状态）：`1` Not started；`2` Ongoing；`3` Ended |\n| activityStartTime | LONG | Activity start time in seconds（活动开始时间，秒级时间戳） |\n| activityEndTime | LONG | Activity end time in seconds（活动结束时间，秒级时间戳） |\n| isJoinedActivity | BOOLEAN | Whether the seller has joined the activity（卖家是否已报名该活动） |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_query.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"pageNumber\": 1, \"pageSize\": 20, \"activityType\": 2, \"activityStatus\": 2, \"onlyQueryJoinedActivity\": false}}'\n```\n\n**典型流程：** 促销流程入口：按 **`activityType`** 与时间窗查询 **`activityList`** → 用 **`activityId`** 查候选/已报名商品。\n\nFile v1.0.5:references/authorization-flow.md\n\n# Temu 授权流程\n\n```text\n用户确认店铺类型与用途\n        ↓\ntemu_token_guide.py（输出后台操作步骤）\n        ↓\n用户在 Temu 卖家后台复制 access_token\n        ↓\nsave_temu_access_token.py（可选，写入本地 store）\n        ↓\ntemu_proxy.py / temu_file_download.py\n  - 直接传 accessToken，或\n  - 传 storeKey + site + managementType + tokenPurpose\n```\n\n## 决策表\n\n| 用户需求 | shopType | tokenPurpose | site |\n|----------|----------|--------------|------|\n| 半托管查商品/库存 | semi-managed | product-inventory | cn / partner |\n| 半托管查订单/发货 | semi-managed | order-shipping | us / global / eu |\n| 全托管任意接口 | full-managed | full-managed | cn / partner |\n| 美欧本土店 | local-native | local-native | us 等 |\n\n## 与 API 调用的对应关系\n\n紫鸟转发路径：`/temu-proxy/{site}/{managementType}`\n\n- 全托管 CN：`cn` + `full-managed`\n- 半托管商品：`cn`/`partner` + `semi-managed` + 商品 token\n- 半托管订单：`us`/`global`/`eu` + `semi-managed` + 订单 token\n\n授权应用名称必须与后台一致：**酷鸟卖家助手** 或 **Cyber-ERP酷鸟助手** / **Cyber-ERP**。\n\nArchive v1.0.4: 34 files, 45066 bytes\n\nFiles: references/access-token.md (4604b), references/api.md (5209b), references/apis/bg-promotion-activity-candidate-goods-query.md (5144b), references/apis/bg-promotion-activity-goods-enroll.md (5203b), references/apis/bg-promotion-activity-goods-operation-query.md (3452b), references/apis/bg-promotion-activity-goods-query.md (4406b), references/apis/bg-promotion-activity-goods-update.md (5805b), references/apis/bg-promotion-activity-query.md (5627b), references/apis/README.md (1307b), references/authorization-flow.md (1186b), references/partner-eu-catalog.md (3363b), scripts/_eu_promotion_script.py (516b), scripts/_temu_auth_guide.py (6198b), scripts/_temu_common.py (12427b), scripts/_temu_eu_common.py (3174b), scripts/_temu_token_store.py (4273b), scripts/check_linkfox_token.py (1797b), scripts/eu_promotion_activity_candidate_goods_query.py (307b), scripts/eu_promotion_activity_goods_enroll.py (274b), scripts/eu_promotion_activity_goods_operation_query.py (313b), scripts/eu_promotion_activity_goods_query.py (280b), scripts/eu_promotion_activity_goods_update.py (274b), scripts/eu_promotion_activity_query.py (253b), scripts/get_temu_access_token.py (1843b), scripts/list_temu_access_tokens.py (652b), scripts/save_temu_access_token.py (1377b), scripts/temu_eu_file_download.py (680b), scripts/temu_eu_proxy.py (901b), scripts/temu_file_download.py (1681b), scripts/temu_proxy.py (2124b), scripts/temu_token_guide.py (1594b), skill-card.md (3025b), SKILL.md (6763b), _meta.json (144b)\n\nFile v1.0.4:SKILL.md\n\n---\nname: linkfox-temu-promotion-eu\ndescription: Temu 欧洲站电商促销 API，经 LinkFox 网关转发 Partner EU Promotion / 促销活动 相关 bg/temu 接口（活动创建、报名、查询、优惠券/秒杀等，接口将按 Partner 文档逐条接入）。当用户提到 Temu EU 促销、促销活动、优惠券、秒杀、活动报名、promotion campaign、product-inventory 促销 时触发。商品管理用 linkfox-temu-manage-product-eu；价格用 linkfox-temu-price-eu；订单用 linkfox-temu-order-eu。\n---\n\n# Temu 欧洲站 — 电商促销（Promotion）\n\n本 skill（`linkfox-temu-promotion-eu`）覆盖 Partner Platform for EU **Promotion / 电商促销**（促销活动、优惠券、活动报名等；Partner 后台菜单可能显示为 Marketing/Promotion）相关 `bg.*` / `temu.*` 接口（`menu_code` 与各 `sub_menu_code` 以 Partner 后台为准，见 [partner-eu-catalog.md](./references/partner-eu-catalog.md)）。\n\n已接入 **6** 条 Partner **Promotion** 接口，清单见 [partner-eu-catalog.md](./references/partner-eu-catalog.md)。\n\n**网关（本 skill 内置）**：\n\n| 能力 | 方法 | 路径 |\n|------|------|------|\n| 促销 OpenAPI（`eu_promotion_*`、`temu_eu_proxy`） | POST | `https://tool-gateway.linkfox.com/temu/proxy` |\n| 加签文件下载 | POST | `https://tool-gateway.linkfox.com/temu/fileDownload` |\n\n## 相关 skill\n\n| 场景 | skill |\n|------|--------|\n| **促销/营销活动**（本 skill） | **`linkfox-temu-promotion-eu`** |\n| 广告 Ads | `linkfox-temu-ads-eu` |\n| 商品列表/详情/编辑/库存/上下架 | `linkfox-temu-manage-product-eu` |\n| 发品 | `linkfox-temu-add-product-eu` |\n| 价格/供货价、定价单 | `linkfox-temu-price-eu` |\n| 订单列表/详情 | `linkfox-temu-order-eu` |\n| 退货与退款 | `linkfox-temu-returns-refunds-eu` |\n| 网关与 Temu token | 本 skill `scripts/` |\n\n## 调用方式\n\n- **API 端点**：`POST /temu/proxy`（不同操作通过请求体区分；完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/<脚本名>.py '<JSON 参数>' [--inline]`（可用脚本见上文脚本一览）\n- **成本约束**：本工具会消耗积分；失败/空结果不得自动换关键词、翻页或连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/<skill-name>-<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## 默认参数\n\n| 字段 | 默认 | 说明 |\n|------|------|------|\n| site | `eu` | Partner EU |\n| managementType | `semi-managed` | 半托管（具体接口以 Partner 文档为准） |\n| tokenPurpose | `product-inventory` | 与商品/促销场景一致（见 [access-token.md](./references/access-token.md)） |\n\n## 鉴权\n\n1. **LinkFox**：`LINKFOXAGENT_API_KEY` → Header `Authorization` + `Token`\n2. **Temu**：`accessToken` 或 `storeKey`（`storeKey` 时建议带 `tokenPurpose=product-inventory`）\n\n## Scripts\n\n| 脚本 | 说明 |\n|------|------|\n| `temu_eu_proxy.py` | 任意 type |\n| `temu_eu_file_download.py` | 加签下载 |\n| `eu_promotion_activity_query.py` | `bg.promotion.activity.query` |\n| `eu_promotion_activity_candidate_goods_query.py` | `bg.promotion.activity.candidate.goods.query` |\n| `eu_promotion_activity_goods_query.py` | `bg.promotion.activity.goods.query` |\n| `eu_promotion_activity_goods_enroll.py` | `bg.promotion.activity.goods.enroll` |\n| `eu_promotion_activity_goods_operation_query.py` | `bg.promotion.activity.goods.operation.query` |\n| `eu_promotion_activity_goods_update.py` | `bg.promotion.activity.goods.update` |\n\n## 接入新接口（约定）\n\n你每提供一条 Partner 文档（`type` + `sub_menu_code` + URL + Request/Response 参数表），将：\n\n1. 新增 `references/apis/<type-slug>.md`（完整入参/出参层级）\n2. 新增 `scripts/eu_promotion_<slug>.py`（调用 `_eu_promotion_script.run_cli`）\n3. 更新 [partner-eu-catalog.md](./references/partner-eu-catalog.md)、[apis/README.md](./references/apis/README.md) 与本表\n\n## 示例（通用代理）\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\n\npython scripts/temu_eu_proxy.py '{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"type\": \"<TEMU_API_TYPE>\",\n  \"params\": {\n    \"request\": {}\n  }\n}'\n```\n\n**Feedback：** `skillName`：`linkfox-temu-promotion-eu`\n\n## 网关与授权脚本\n\n| 脚本 | 说明 |\n|------|------|\n| `check_linkfox_token.py` | 校验 LinkFox 用户 Token |\n| `temu_token_guide.py` | Temu accessToken 后台授权步骤 |\n| `save_temu_access_token.py` | 保存 accessToken 到本地 |\n| `list_temu_access_tokens.py` | 列出已保存 token |\n| `get_temu_access_token.py` | 读取已保存 token |\n| `temu_proxy.py` | 通用网关转发（多 site） |\n| `temu_file_download.py` | 加签文件下载（多 site） |\n\n授权说明：[references/access-token.md](./references/access-token.md)\n\n## 积分消耗规则\n\n不消耗积分。\n\nFile v1.0.4:references/apis/README.md\n\n# Promotion — 接口文档索引\n\n网关见 [../api.md](../api.md)；目录见 [../partner-eu-catalog.md](../partner-eu-catalog.md)。\n\n## 活动查询\n\n| type | 说明 | 文档 |\n|------|------|------|\n| `bg.promotion.activity.query` | 促销活动查询 | [bg-promotion-activity-query.md](./apis/bg-promotion-activity-query.md) |\n| `bg.promotion.activity.candidate.goods.query` | 活动候选商品查询 | [bg-promotion-activity-candidate-goods-query.md](./apis/bg-promotion-activity-candidate-goods-query.md) |\n| `bg.promotion.activity.goods.query` | 活动已报名商品查询 | [bg-promotion-activity-goods-query.md](./apis/bg-promotion-activity-goods-query.md) |\n\n## 报名 / 操作结果\n\n| type | 说明 | 文档 |\n|------|------|------|\n| `bg.promotion.activity.goods.enroll` | 活动商品报名 | [bg-promotion-activity-goods-enroll.md](./apis/bg-promotion-activity-goods-enroll.md) |\n| `bg.promotion.activity.goods.operation.query` | 活动商品操作结果查询 | [bg-promotion-activity-goods-operation-query.md](./apis/bg-promotion-activity-goods-operation-query.md) |\n\n## 商品更新\n\n| type | 说明 | 文档 |\n|------|------|------|\n| `bg.promotion.activity.goods.update` | 活动商品更新 | [bg-promotion-activity-goods-update.md](./apis/bg-promotion-activity-goods-update.md) |\n\nFile v1.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-temu-promotion-eu\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1783946427992\n}\n\nFile v1.0.4:references/access-token.md\n\n# Temu accessToken 授权与获取\n\nTemu **没有** LinkFox 侧自动 OAuth；`accessToken` 须在 Temu 卖家后台「服务市场 → 授权管理」**手动复制**。与 `LINKFOXAGENT_API_KEY`（LinkFox 用户鉴权）是两套令牌。（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理）\n\n## 两种鉴权（勿混淆）\n\n| 令牌 | 用途 | 获取方式 |\n|------|------|----------|\n| **LinkFox 用户 Token** | 调用 `/temu/proxy`、`/temu/fileDownload` **必填** | `LINKFOXAGENT_API_KEY` 或请求 JSON 的 `token`；Header `Authorization` + `Token`（同 amazon-store-auth）（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理） |\n| **Temu accessToken** | Temu 业务 API（经紫鸟转发） | Temu 卖家后台授权后复制 |\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<your-key>\"\npython scripts/check_linkfox_token.py\n```\n\n## tokenPurpose 与场景\n\n| tokenPurpose | 店铺类型 | 推荐 site | 授权应用 |\n|--------------|----------|-----------|----------|\n| `product-inventory` | 半托管 | `cn` / `partner` | 酷鸟卖家助手 |\n| `order-shipping` | 半托管 | `us` / `global` / `eu` | Cyber-ERP酷鸟助手 |\n| `full-managed` | 全托管 | `cn` / `partner` | 酷鸟卖家助手 |\n| `local-native` | 本土（美/欧主体） | `us` 等 | Cyber-ERP |\n\n## 1. 半托管 — 商品/库存 Token\n\n1. 登录 [seller.kuajingmaihuo.com](https://seller.kuajingmaihuo.com) 或 [agentseller.temu.com](https://agentseller.temu.com)\n2. **系统管理** → **服务市场** → **授权管理**\n3. **获取授权** → 选择 **「酷鸟卖家助手」**\n4. 全选常规和特殊授权 → 确认 → **复制 access_token**\n5. 调用 API：`site=cn` 或 `partner`，`managementType=semi-managed`\n\n## 2. 半托管 — 订单/发货 Token\n\n1. 登录 Temu 卖家后台\n2. 右上角 **Seller Central** → 切换到目标区域（美区 / 欧区 / 全球）\n3. **服务市场** → **授权管理**\n4. **获取授权** → 选择 **「Cyber-ERP酷鸟助手」**\n5. 全选授权 → 确认 → 复制 token\n6. 调用 API：`site=eu` / `global` / `eu`，`managementType=semi-managed`\n\n## 3. 全托管店铺\n\n1. 登录 Temu 平台\n2. **系统管理** → **服务市场** → **授权管理**\n3. **获取授权** → **「酷鸟卖家助手」** → 全选 → 复制 token\n4. 调用 API：`managementType=full-managed`，`site` 通常 `cn` 或 `partner`\n\n## 4. 本土店铺（美区、欧区主体）\n\n1. 登录 Temu\n2. **Apps And Services** → **Manage Your Apps**\n3. **Authorize a new app** → 搜索 **「Cyber-ERP」**\n4. 一般权限与敏感权限全选 → 确认 → 复制 token\n\n## 站点与 OpenAPI 网关\n\n| site | 说明 | Temu 网关 |\n|------|------|-----------|\n| cn | 中国站 | openapi.kuajingmaihuo.com |\n| partner | Partner 网关 | openapi-b-partner.temu.com |\n| us | 欧洲站 | openapi-b-eu.temu.com |\n| global | 全球区 | openapi-b-global.temu.com |\n| eu | 欧洲站 | openapi-b-eu.temu.com |\n\n## 本地保存 Token（推荐）\n\n默认存储：`~/.linkfox/temu-access-tokens.json`（可用 `TEMU_TOKEN_STORE_PATH` 覆盖）。\n\n```bash\n# 查看授权步骤\npython scripts/temu_token_guide.py '{\"shopType\":\"semi-managed\",\"tokenPurpose\":\"product-inventory\",\"site\":\"cn\"}'\n\n# 保存 token\npython scripts/save_temu_access_token.py '{\n  \"storeKey\": \"my-shop\",\n  \"label\": \"中国半托管\",\n  \"site\": \"cn\",\n  \"managementType\": \"semi-managed\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"accessToken\": \"PASTE_TOKEN\"\n}'\n\n# 列出已保存（脱敏）\npython scripts/list_temu_access_tokens.py\n\n# 用 storeKey 调 API（无需每次粘贴 token）\npython scripts/temu_proxy.py '{\n  \"storeKey\": \"my-shop\",\n  \"site\": \"cn\",\n  \"managementType\": \"semi-managed\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"type\": \"bg.goods.category.mapping\",\n  \"params\": {\"goodsName\": \"测试\", \"goodsNameEn\": \"Test\"}\n}'\n```\n\n## 注意事项\n\n1. **子账号**：可能无法进入服务市场，需主账号授权。\n2. **多站点**：欧洲站、英国站等需分别登录对应后台获取 Token。\n3. **有效期**：Token 会过期，过期后重新在后台复制并 `save_temu_access_token.py`。\n4. **IP 白名单**：需联系紫鸟开放平台配置调用 IP。\n5. **参数小写**：`site`、`managementType` 必须小写。\n\n## 脚本一览\n\n| 脚本 | 说明 |\n|------|------|\n| `temu_token_guide.py` | 按店铺类型/用途输出授权步骤 |\n| `save_temu_access_token.py` | 保存 accessToken 到本地 |\n| `list_temu_access_tokens.py` | 列出已保存 token（默认脱敏）|\n| `get_temu_access_token.py` | 读取指定 store 的 token |\n\nFile v1.0.4:references/api.md\n\n# linkfox-temu-promotion-eu — API 参考\r\n\r\nTemu **欧洲站电商促销**（Partner EU **Promotion** / 促销活动等），经本 skill `temu_eu_proxy`（`POST /temu/proxy`） 转发。Temu 的 `type` 写在 Body，**不是** URL 路径。\r\n\r\n> 网关与鉴权：本 skill `scripts/`（`LINKFOXAGENT_API_KEY`、`accessToken` / `storeKey`）。授权见 `references/access-token.md`。（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理）\r\n\r\n---\r\n\r\n## 调用规范\r\n\r\n| 项 | 说明 |\r\n|----|------|\r\n| 网关根地址 | `${LINKFOX_TOOL_GATEWAY}`（可用 `TEMU_API_BASE_URL` / `STORE_API_BASE_URL` 覆盖） |\r\n| 促销 OpenAPI | `POST /temu/proxy` |\r\n| 加签文件下载 | `POST /temu/fileDownload`（`temu_eu_file_download.py`） |\r\n| LinkFox 鉴权 | Header **`Authorization`** 与 **`Token`**（同值）；或 `LINKFOX_AGENT_API_KEY` / `LINKFOXAGENT_API_KEY`；或 JSON `token`（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理） |\r\n| Temu 鉴权 | Body `accessToken`，或 `storeKey` + `site` + `managementType` + `tokenPurpose` |\r\n| 默认 | `site=eu`，`managementType=semi-managed`，`tokenPurpose=product-inventory` |\r\n| 上游 OpenAPI（US） | `https://openapi-b-eu.temu.com/openapi/router`（网关按 `site` 解析） |\r\n\r\n### 网关请求 Body（`/temu/proxy`）\r\n\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| site | string | 是 | `eu`（本 skill 默认） |\r\n| managementType | string | 是 | `semi-managed` |\r\n| accessToken | string | 与 storeKey 二选一 | Temu 店铺令牌 |\r\n| storeKey | string | 与 accessToken 二选一 | `~/.linkfox/temu-access-tokens.json` 中的键 |\r\n| tokenPurpose | string | 否 | 建议 **`product-inventory`** |\r\n| type | string | 是 | Temu 接口名，如 Partner Promotion 菜单下的 `bg.*` / `temu.*` |\r\n| params | object | 否 | 业务参数；多数接口业务块在 **`params.request`** |\r\n\r\n### 网关响应\r\n\r\n| 字段 | 类型 | 说明 |\r\n|------|------|------|\r\n| body | string | Temu 原始 JSON 字符串；脚本解析为 `temuBody` |\r\n| code | integer | 网关错误码：`1002` 参数/Token，`1003` 转发失败 |\r\n\r\n解析顺序：**网关 `code`** → `JSON.parse(body)` → `success` / `errorCode` / `errorMsg` / `result`。\r\n\r\n### 脚本调用\r\n\r\n```bash\r\nexport LINKFOXAGENT_API_KEY=\"<key>\"\r\npython scripts/temu_eu_proxy.py '{\"accessToken\":\"TOKEN\",\"tokenPurpose\":\"product-inventory\",\"type\":\"<API_TYPE>\",\"params\":{\"request\":{}}}'\r\n```\r\n\r\n业务字段可放在顶层或嵌套 `params`；含 `request` 时通常整体作为 `params` 转发。\r\n\r\n---\r\n\r\n## 接口一览\r\n\r\n完整 `sub_menu_code` 与 Partner 文档 URL 见 [partner-eu-catalog.md](./partner-eu-catalog.md)。\r\n\r\n**每个接口单独一份文档**：[apis/README.md](./apis/README.md)（随接入递增）。\r\n\r\n| type | 说明 | 文档 |\r\n|------|------|------|\r\n| `bg.promotion.activity.query` | 促销活动查询 | [apis/bg-promotion-activity-query.md](./apis/bg-promotion-activity-query.md) |\r\n| `bg.promotion.activity.candidate.goods.query` | 活动候选商品查询 | [apis/bg-promotion-activity-candidate-goods-query.md](./apis/bg-promotion-activity-candidate-goods-query.md) |\r\n| `bg.promotion.activity.goods.query` | 活动已报名商品查询 | [apis/bg-promotion-activity-goods-query.md](./apis/bg-promotion-activity-goods-query.md) |\r\n| `bg.promotion.activity.goods.enroll` | 活动商品报名 | [apis/bg-promotion-activity-goods-enroll.md](./apis/bg-promotion-activity-goods-enroll.md) |\r\n| `bg.promotion.activity.goods.operation.query` | 活动商品操作结果查询 | [apis/bg-promotion-activity-goods-operation-query.md](./apis/bg-promotion-activity-goods-operation-query.md) |\r\n| `bg.promotion.activity.goods.update` | 活动商品更新 | [apis/bg-promotion-activity-goods-update.md](./apis/bg-promotion-activity-goods-update.md) |\r\n\r\n---\r\n\r\n## 典型促销流程\r\n\r\n```text\r\n1. bg.promotion.activity.query                      → 查可参加/已参加的活动\r\n2. bg.promotion.activity.candidate.goods.query      → 查候选商品与推荐活动价\r\n3. bg.promotion.activity.goods.enroll               → 报名（得 draftId）\r\n4. bg.promotion.activity.goods.operation.query      → 轮询报名/更新结果\r\n5. bg.promotion.activity.goods.query                → 查已报名商品与活动价\r\n6. bg.promotion.activity.goods.update               → 改价/改量/下架/加 SKU\r\n```\r\n\r\n---\r\n\r\n## 与其他 Temu EU skill 的区分\r\n\r\n| 能力 | skill |\r\n|------|--------|\r\n| **促销**（本 skill） | **`linkfox-temu-promotion-eu`** |\r\n| 商品管理（列表/编辑/库存/上下架） | `linkfox-temu-manage-product-eu` |\r\n| 价格/供货价 | `linkfox-temu-price-eu` |\r\n| 发品 | `linkfox-temu-add-product-eu` |\r\n| 订单 | `linkfox-temu-order-eu` |\r\n\r\n---\r\n\r\n## 网关错误码\r\n\r\n| code | 说明 | 处理 |\r\n|------|------|------|\r\n| 1002 | 参数或 LinkFox Token 无效 | 修正参数与 `LINKFOXAGENT_API_KEY` |\r\n| 1003 | 转发失败 | 检查 Temu token、`tokenPurpose`、白名单、网络 |\r\n\r\n---\r\n\r\n## Feedback API\r\n\r\n- **POST** `https://skill-api.linkfox.com/api/v1/public/feedback`\r\n- `skillName`: **`linkfox-temu-promotion-eu`**\n\nFile v1.0.4:references/apis/bg-promotion-activity-candidate-goods-query.md\n\n# 活动候选商品查询 — `bg.promotion.activity.candidate.goods.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_candidate_goods_query.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.candidate.goods.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query candidate goods for a promotion activity.\n\n> **`activityId`**、**`pageNumber`**、**`pageSize`** 均为必填。\n> 返回 **`isAllowedEnroll`** 与推荐活动价/数量，用于报名前选品。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── activityId (LONG, 必填)\n    ├── pageNumber (INTEGER, 必填)\n    └── pageSize (INTEGER, 必填)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| activityId | LONG | **是** | unique identifier for the activity |\n| pageNumber | INTEGER | **是** | page number for pagination, default is 1. |\n| pageSize | INTEGER | **是** | Page size for pagination, default is 10, max is 100. |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"activityId\": 123456,\n    \"pageNumber\": 1,\n    \"pageSize\": 20\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── total (LONG)\n    ├── activityInfo (OBJECT)\n    │   └── activityId, activityName, activityType, activityStatus, …\n    └── goodsList[]\n        ├── goodsId (LONG)\n        ├── isAllowedEnroll (BOOLEAN)\n        ├── recommendActivityQuantity (INTEGER)\n        └── skuList[]\n            ├── skuId (LONG)\n            └── recommendActivitySupplierPrice (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| total | LONG | Total records（总记录数） |\n| activityInfo | OBJECT | Activity information（当前活动信息） |\n| goodsList | OBJECT[] | Candidate goods list（候选商品列表） |\n\n#### `activityInfo`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| activityId | LONG | unique identifier for the activity |\n| activityName | STRING | Activity name |\n| activityType | INTEGER | Activity type |\n| activityStatus | INTEGER | Activity status（`1` Not started；`2` Ongoing；`3` Ended） |\n| activityStartTime | LONG | Start time in seconds |\n| activityEndTime | LONG | End time in seconds |\n| isJoinedActivity | BOOLEAN | Whether joined |\n\n#### `goodsList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| goodsId | LONG | goods id |\n| isAllowedEnroll | BOOLEAN | Whether the goods is allowed to enroll（是否允许报名） |\n| recommendActivityQuantity | INTEGER | Recommended activity quantity（推荐活动数量） |\n| skuList | OBJECT[] | SKU list with recommended prices |\n\n#### `goodsList[].skuList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| skuId | LONG | sku id |\n| recommendActivitySupplierPrice | LONG | Recommended activity supplier price（推荐活动供货价） |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010003 | The activity has been cancelled, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010004 | The activity has ended, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_candidate_goods_query.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"activityId\": 123456, \"pageNumber\": 1, \"pageSize\": 20}}'\n```\n\n**典型流程：** 在 [activity.query](./bg-promotion-activity-query.md) 取得 **`activityId`** 后，查询可报名商品与推荐价。\n\nFile v1.0.4:references/apis/bg-promotion-activity-goods-enroll.md\n\n# 活动商品报名 — `bg.promotion.activity.goods.enroll`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_goods_enroll.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.goods.enroll`，业务载荷放在 Body 的 `params` |\n\n**Description:** Enroll goods into a promotion activity.\n\n> **`activityId`**、**`enrollGoods`** 必填。\n> **`enrollGoods`** 子字段在 Partner Request 表中为折叠行，按 **Request Example** 展开。\n> 返回 **`draftId`**，可用 [goods.operation.query](./bg-promotion-activity-goods-operation-query.md) 轮询 **`operationStatus`**。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── activityId (LONG, 必填)\n    └── enrollGoods (OBJECT, 必填)\n        ├── goodsId (LONG, 必填)\n        ├── activityQuantity (LONG, 必填)\n        ├── traceCode (STRING, 否)\n        └── enrollSkuList[] (OBJECT[], 必填)\n            ├── skuId (LONG)\n            └── activitySupplierPrice (LONG)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| activityId | LONG | **是** | unique identifier for the activity |\n| enrollGoods | OBJECT | **是** | goods information required for activity registration |\n\n#### `enrollGoods`（OBJECT，必填）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| goodsId | LONG | 是 | goods id |\n| activityQuantity | LONG/INTEGER | 是 | Activity quantity for enrollment（报名活动数量） |\n| traceCode | STRING | 否 | Idempotent key（幂等键，单次操作长度不超过 32 字符，Partner Request Example） |\n| enrollSkuList | OBJECT[] | 是 | SKU list to enroll |\n\n#### `enrollGoods.enrollSkuList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| skuId | LONG | sku id |\n| activitySupplierPrice | LONG | Activity supplier price for this SKU（该 SKU 活动供货价） |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"activityId\": 123456,\n    \"enrollGoods\": {\n      \"goodsId\": 100001,\n      \"activityQuantity\": 50,\n      \"traceCode\": \"enroll-001\",\n      \"enrollSkuList\": [\n        {\n          \"skuId\": 200001,\n          \"activitySupplierPrice\": 1999\n        }\n      ]\n    }\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── draftId (LONG)\n    ├── operationStatus (INTEGER)\n    ├── failReason (STRING)\n    └── goodsId (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| draftId | LONG | goods registration activity draft id（报名草稿 ID；前置流程成功时生成，用于 [goods.operation.query](./bg-promotion-activity-goods-operation-query.md)） |\n| operationStatus | INTEGER | Operation status（操作状态码；异步处理时请轮询 operation.query） |\n| failReason | STRING | Failure reason when operation failed（失败原因） |\n| goodsId | LONG | goods id |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010003 | The activity has been cancelled, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010004 | The activity has ended, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_goods_enroll.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"activityId\": 123456, \"enrollGoods\": {\"goodsId\": 100001, \"activityQuantity\": 50, \"traceCode\": \"enroll-001\", \"enrollSkuList\": [{\"skuId\": 200001, \"activitySupplierPrice\": 1999}]}}}'\n```\n\n**典型流程：** 报名 → 保存 **`draftId`** → **goods.operation.query** 确认结果。\n\nFile v1.0.4:references/apis/bg-promotion-activity-goods-operation-query.md\n\n# 活动商品操作结果查询 — `bg.promotion.activity.goods.operation.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_goods_operation_query.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.goods.operation.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query promotion goods operation result by draft ID.\n\n> **`draftIdList`** 为必填（来自 enroll/update 返回的 **`draftId`**）。\n> Partner **Response Example** 中 **`result`** 为 **OBJECT[]**（非带 `total` 的对象包装）。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    └── draftIdList (LONG[], 必填)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| draftIdList | LONG[] | **是** | goods registration activity draft id, which will be generated when the pre-procedure is successfully completed. |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"draftIdList\": [\n      10001,\n      10002\n    ]\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result[]\n    ├── draftId (LONG)\n    ├── operationStatus (INTEGER)\n    ├── failReason (STRING)\n    └── goodsId (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`（OBJECT[]）\n\nPartner Response Example 中 **`result`** 直接为数组。每个元素：\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| draftId | LONG | Draft id |\n| operationStatus | INTEGER | Operation status（操作状态码） |\n| failReason | STRING | Failure reason |\n| goodsId | LONG | goods id |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_goods_operation_query.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"draftIdList\": [10001, 10002]}}'\n```\n\n**典型流程：** 轮询 [goods.enroll](./bg-promotion-activity-goods-enroll.md) / [goods.update](./bg-promotion-activity-goods-update.md) 提交的 **`draftId`**。\n\nFile v1.0.4:references/apis/bg-promotion-activity-goods-query.md\n\n# 活动已报名商品查询 — `bg.promotion.activity.goods.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_goods_query.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.goods.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query enrolled goods in a promotion activity.\n\n> **`activityId`**、**`pageNumber`**、**`pageSize`** 均为必填。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── activityId (LONG, 必填)\n    ├── pageNumber (INTEGER, 必填)\n    └── pageSize (INTEGER, 必填)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| activityId | LONG | **是** | unique identifier for the activity |\n| pageNumber | INTEGER | **是** | page number for pagination, default is 1. |\n| pageSize | INTEGER | **是** | Page size for pagination, default is 10, max is 100. |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"activityId\": 123456,\n    \"pageNumber\": 1,\n    \"pageSize\": 20\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── total (LONG)\n    ├── activityInfo (OBJECT)\n    └── goodsList[]\n        ├── goodsId (LONG)\n        ├── activityQuantity (INTEGER)\n        ├── remainingActivityQuantity (INTEGER)\n        └── skuList[]\n            ├── skuId (LONG)\n            └── activitySupplierPrice (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| total | LONG | Total records |\n| activityInfo | OBJECT | Activity information（字段同 [candidate.goods.query](./bg-promotion-activity-candidate-goods-query.md) 之 `activityInfo`） |\n| goodsList | OBJECT[] | Enrolled goods list（已报名商品列表） |\n\n#### `goodsList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| goodsId | LONG | goods id |\n| activityQuantity | INTEGER | Activity quantity（活动数量/名额） |\n| remainingActivityQuantity | INTEGER | Remaining activity quantity（剩余活动数量） |\n| skuList | OBJECT[] | Enrolled SKU list |\n\n#### `goodsList[].skuList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| skuId | LONG | sku id |\n| activitySupplierPrice | LONG | Activity supplier price（活动供货价） |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010003 | The activity has been cancelled, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010004 | The activity has ended, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_goods_query.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"activityId\": 123456, \"pageNumber\": 1, \"pageSize\": 20}}'\n```\n\n**典型流程：** 查看已报名商品、活动价与剩余名额。\n\nFile v1.0.4:references/apis/bg-promotion-activity-goods-update.md\n\n# 活动商品更新 — `bg.promotion.activity.goods.update`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_goods_update.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.goods.update`，业务载荷放在 Body 的 `params` |\n\n**Description:** Update enrolled promotion activity goods.\n\n> **`activityId`**、**`goodsId`**、**`operateType`** 必填。\n> **`operateType`** 决定必填子参数（见下表）；**`updateSkuList`/`addSkuList`** 按 Request Example 展开。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── traceCode (STRING, 否)\n    ├── activityId (LONG, 必填)\n    ├── activityQuantity (LONG, 否)\n    ├── goodsId (LONG, 必填)\n    ├── operateType (INTEGER, 必填)\n    ├── updateSkuList[] (OBJECT[], 否)\n    │   ├── skuId (LONG)\n    │   └── activitySupplierPrice (LONG)\n    └── addSkuList[] (OBJECT[], 否)\n        ├── skuId (LONG)\n        └── activitySupplierPrice (LONG)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| traceCode | STRING | 否 | Optional. The traceCode is an Idempotent Key for single operations. Its length cannot exceed 32 characters. |\n| activityId | LONG | **是** | unique identifier for the activity |\n| activityQuantity | LONG | 否 | activity quantity, the quantity you set for participating activities. This is independent of product quantity. The updated activity quantity must be more than the original one. |\n| goodsId | LONG | **是** | goods id |\n| operateType | INTEGER | **是** | the type of operation. It determines which parameters are required. For example, if the operation type is 20, then the \"activityQuantity\" parameter must not be null, while all other parameters should be null. If the operation type is 30, then all other parameters must be null. 10 - update activity supplier price 20 - update activity quantity 30 - deactivate activity goods 40 - add activity sku |\n| updateSkuList | OBJECT[] | 否 | sku information required for updating activity sku information |\n| addSkuList | OBJECT[] | 否 | sku information required for adding activity sku information |\n\n#### `operateType`（必填）\n\n| 值 | 说明 | 必填参数 |\n|----|------|----------|\n| `10` | update activity supplier price | `updateSkuList`（其他参数应为 null） |\n| `20` | update activity quantity | `activityQuantity`（须大于原活动数量；其他参数应为 null） |\n| `30` | deactivate activity goods | 其他参数应为 null |\n| `40` | add activity sku | `addSkuList` |\n\n#### `updateSkuList[]` / `addSkuList[]`（Request Example 展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| skuId | LONG | sku id |\n| activitySupplierPrice | LONG | Activity supplier price |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"activityId\": 123456,\n    \"goodsId\": 100001,\n    \"operateType\": 10,\n    \"traceCode\": \"update-001\",\n    \"updateSkuList\": [\n      {\n        \"skuId\": 200001,\n        \"activitySupplierPrice\": 1899\n      }\n    ]\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── draftId (LONG)\n    ├── operationStatus (INTEGER)\n    ├── failReason (STRING)\n    └── goodsId (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| draftId | LONG | Draft id for async operation |\n| operationStatus | INTEGER | Operation status |\n| failReason | STRING | Failure reason |\n| goodsId | LONG | goods id |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010003 | The activity has been cancelled, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010004 | The activity has ended, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_goods_update.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"activityId\": 123456, \"goodsId\": 100001, \"operateType\": 10, \"traceCode\": \"update-001\", \"updateSkuList\": [{\"skuId\": 200001, \"activitySupplierPrice\": 1899}]}}'\n```\n\n**典型流程：** 按 **`operateType`** 更新价/量/下架/加 SKU → 用 **goods.operation.query** 查 **`draftId`** 结果。\n\nFile v1.0.4:references/apis/bg-promotion-activity-query.md\n\n# 促销活动查询 — `bg.promotion.activity.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_query.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query promotion activities.\n\n> 入参 **`activityType`** 为必填；分页使用 **`pageNumber`** / **`pageSize`**（与部分订单接口的 `pageNo` 不同）。\n> 可用 **`activityStartTime`/`activityEndTime`**、**`activityStatus`**、**`activityIdList`**、**`onlyQueryJoinedActivity`** 筛选。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── pageNumber (INTEGER, 必填)\n    ├── activityEndTime (LONG, 否)\n    ├── activityIdList (LONG[], 否)\n    ├── activityStatus (INTEGER, 否)\n    ├── pageSize (INTEGER, 必填)\n    ├── activityStartTime (LONG, 否)\n    ├── activityType (INTEGER, 必填)\n    └── onlyQueryJoinedActivity (BOOLEAN, 否)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| pageNumber | INTEGER | **是** | page number for pagination, default is 1. |\n| activityEndTime | LONG | 否 | end time for querying activity, in seconds. |\n| activityIdList | LONG[] | 否 | unique identifier for the activity |\n| activityStatus | INTEGER | 否 | the status of activity 1 - Not started 2 - Ongoing 3 - Ended |\n| pageSize | INTEGER | **是** | Page size for pagination, default is 10, max is 100. |\n| activityStartTime | LONG | 否 | start time for querying activity, in seconds. |\n| activityType | INTEGER | **是** | the type of activity 2 - lightning deals 13 - advanced big sale 27 - Clearance deals 100 - official big sale |\n| onlyQueryJoinedActivity | BOOLEAN | 否 | whether to query only joined activities. TRUE / FALSE |\n\n#### `activityType`（必填）\n\n| 值 | 说明 |\n|----|------|\n| `2` | lightning deals |\n| `13` | advanced big sale |\n| `27` | Clearance deals |\n| `100` | official big sale |\n\n#### `activityStatus`（入参筛选）\n\n| 值 | 说明 |\n|----|------|\n| `1` | Not started |\n| `2` | Ongoing |\n| `3` | Ended |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"pageNumber\": 1,\n    \"pageSize\": 20,\n    \"activityType\": 2,\n    \"activityStatus\": 2,\n    \"onlyQueryJoinedActivity\": false\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── total (LONG)\n    └── activityList[]\n        ├── activityId (LONG)\n        ├── activityName (STRING)\n        ├── activityType (INTEGER)\n        ├── activityStatus (INTEGER)\n        ├── activityStartTime (LONG)\n        ├── activityEndTime (LONG)\n        └── isJoinedActivity (BOOLEAN)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| total | LONG | Total number of matching activities（匹配活动总数） |\n| activityList | OBJECT[] | Activity list（活动列表） |\n\n#### `activityList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| activityId | LONG | unique identifier for the activity（活动 ID） |\n| activityName | STRING | Activity name（活动名称） |\n| activityType | INTEGER | the type of activity（活动类型），见入参 `activityType` 枚举 |\n| activityStatus | INTEGER | the status of activity（活动状态）：`1` Not started；`2` Ongoing；`3` Ended |\n| activityStartTime | LONG | Activity start time in seconds（活动开始时间，秒级时间戳） |\n| activityEndTime | LONG | Activity end time in seconds（活动结束时间，秒级时间戳） |\n| isJoinedActivity | BOOLEAN | Whether the seller has joined the activity（卖家是否已报名该活动） |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_query.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"pageNumber\": 1, \"pageSize\": 20, \"activityType\": 2, \"activityStatus\": 2, \"onlyQueryJoinedActivity\": false}}'\n```\n\n**典型流程：** 促销流程入口：按 **`activityType`** 与时间窗查询 **`activityList`** → 用 **`activityId`** 查候选/已报名商品。\n\nFile v1.0.4:references/authorization-flow.md\n\n# Temu 授权流程\n\n```text\n用户确认店铺类型与用途\n        ↓\ntemu_token_guide.py（输出后台操作步骤）\n        ↓\n用户在 Temu 卖家后台复制 access_token\n        ↓\nsave_temu_access_token.py（可选，写入本地 store）\n        ↓\ntemu_proxy.py / temu_file_download.py\n  - 直接传 accessToken，或\n  - 传 storeKey + site + managementType + tokenPurpose\n```\n\n## 决策表\n\n| 用户需求 | shopType | tokenPurpose | site |\n|----------|----------|--------------|------|\n| 半托管查商品/库存 | semi-managed | product-inventory | cn / partner |\n| 半托管查订单/发货 | semi-managed | order-shipping | us / global / eu |\n| 全托管任意接口 | full-managed | full-managed | cn / partner |\n| 美欧本土店 | local-native | local-native | us 等 |\n\n## 与 API 调用的对应关系\n\n紫鸟转发路径：`/temu-proxy/{site}/{managementType}`\n\n- 全托管 CN：`cn` + `full-managed`\n- 半托管商品：`cn`/`partner` + `semi-managed` + 商品 token\n- 半托管订单：`us`/`global`/`eu` + `semi-managed` + 订单 token\n\n授权应用名称必须与后台一致：**酷鸟卖家助手** 或 **Cyber-ERP酷鸟助手** / **Cyber-ERP**。\n\nArchive v1.0.3: 34 files, 44349 bytes\n\nFiles: references/access-token.md (4450b), references/api.md (5055b), references/apis/bg-promotion-activity-candidate-goods-query.md (5144b), references/apis/bg-promotion-activity-goods-enroll.md (5203b), references/apis/bg-promotion-activity-goods-operation-query.md (3452b), references/apis/bg-promotion-activity-goods-query.md (4406b), references/apis/bg-promotion-activity-goods-update.md (5805b), references/apis/bg-promotion-activity-query.md (5627b), references/apis/README.md (1307b), references/authorization-flow.md (1186b), references/partner-eu-catalog.md (3363b), scripts/_eu_promotion_script.py (516b), scripts/_temu_auth_guide.py (6198b), scripts/_temu_common.py (12427b), scripts/_temu_eu_common.py (3174b), scripts/_temu_token_store.py (4273b), scripts/check_linkfox_token.py (1797b), scripts/eu_promotion_activity_candidate_goods_query.py (307b), scripts/eu_promotion_activity_goods_enroll.py (274b), scripts/eu_promotion_activity_goods_operation_query.py (313b), scripts/eu_promotion_activity_goods_query.py (280b), scripts/eu_promotion_activity_goods_update.py (274b), scripts/eu_promotion_activity_query.py (253b), scripts/get_temu_access_token.py (1843b), scripts/list_temu_access_tokens.py (652b), scripts/save_temu_access_token.py (1377b), scripts/temu_eu_file_download.py (680b), scripts/temu_eu_proxy.py (901b), scripts/temu_file_download.py (1681b), scripts/temu_proxy.py (2124b), scripts/temu_token_guide.py (1594b), skill-card.md (3768b), SKILL.md (5740b), _meta.json (144b)\n\nFile v1.0.3:SKILL.md\n\n---\r\nname: linkfox-temu-promotion-eu\r\ndescription: Temu 欧洲站电商促销 API，经 LinkFox 网关转发 Partner EU Promotion / 促销活动 相关 bg/temu 接口（活动创建、报名、查询、优惠券/秒杀等，接口将按 Partner 文档逐条接入）。当用户提到 Temu EU 促销、促销活动、优惠券、秒杀、活动报名、promotion campaign、product-inventory 促销 时触发。商品管理用 linkfox-temu-manage-product-eu；价格用 linkfox-temu-price-eu；订单用 linkfox-temu-order-eu。\r\n---\r\n\r\n# Temu 欧洲站 — 电商促销（Promotion）\r\n\r\n本 skill（`linkfox-temu-promotion-eu`）覆盖 Partner Platform for EU **Promotion / 电商促销**（促销活动、优惠券、活动报名等；Partner 后台菜单可能显示为 Marketing/Promotion）相关 `bg.*` / `temu.*` 接口（`menu_code` 与各 `sub_menu_code` 以 Partner 后台为准，见 [partner-eu-catalog.md](./references/partner-eu-catalog.md)）。\r\n\r\n已接入 **6** 条 Partner **Promotion** 接口，清单见 [partner-eu-catalog.md](./references/partner-eu-catalog.md)。\r\n\r\n**网关（本 skill 内置）**：\r\n\r\n| 能力 | 方法 | 路径 |\r\n|------|------|------|\r\n| 促销 OpenAPI（`eu_promotion_*`、`temu_eu_proxy`） | POST | `https://tool-gateway.linkfox.com/temu/proxy` |\r\n| 加签文件下载 | POST | `https://tool-gateway.linkfox.com/temu/fileDownload` |\r\n\r\n## 相关 skill\r\n\r\n| 场景 | skill |\r\n|------|--------|\r\n| **促销/营销活动**（本 skill） | **`linkfox-temu-promotion-eu`** |\r\n| 广告 Ads | `linkfox-temu-ads-eu` |\r\n| 商品列表/详情/编辑/库存/上下架 | `linkfox-temu-manage-product-eu` |\r\n| 发品 | `linkfox-temu-add-product-eu` |\r\n| 价格/供货价、定价单 | `linkfox-temu-price-eu` |\r\n| 订单列表/详情 | `linkfox-temu-order-eu` |\r\n| 退货与退款 | `linkfox-temu-returns-refunds-eu` |\r\n| 网关与 Temu token | 本 skill `scripts/` |\r\n\r\n## 调用方式\r\n\r\n- **API 端点**：`POST /temu/proxy`（不同操作通过请求体区分；完整参数/响应/错误码见 `references/api.md`）\r\n- **Python 脚本**：`python scripts/<脚本名>.py '<JSON 参数>' [--inline]`（可用脚本见上文脚本一览）\r\n- **成本约束**：本工具会消耗积分；失败/空结果不得自动换关键词、翻页或连续试探；需要继续检索时先向用户说明会产生额外消耗。\r\n\r\n**输出策略（脚本默认行为）**：\r\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/<skill-name>-<timestamp>.json`（`<cwd>` 为脚本执行时的工作目录，在 Claude Code 里即当前项目目录；`<session>` 取自环境变量 `SESSION_ID`，按用户任务自动聚合；**禁止写入 /tmp**，当前目录不可写则报错）\r\n- 响应体 ≤ 8 KB：落盘后把完整 JSON 打印到 stdout\r\n- 响应体 > 8 KB：落盘后 stdout 只输出摘要（顶层字段、常见计数如 `total`/`costToken`、最大列表字段的长度 + 前 3 条样本）\r\n- 加 `--inline` 强制全量打印到 stdout（同样落盘）\r\n\r\n**读数据建议**：先看摘要判断是否足够；需要具体字段时优先用 `jq`或`ConvertFrom-Json` 从保存的 json 文件按需抽取，避免整份 JSON 进入上下文。\r\n\r\n## 默认参数\r\n\r\n| 字段 | 默认 | 说明 |\r\n|------|------|------|\r\n| site | `eu` | Partner EU |\r\n| managementType | `semi-managed` | 半托管（具体接口以 Partner 文档为准） |\r\n| tokenPurpose | `product-inventory` | 与商品/促销场景一致（见 [access-token.md](./references/access-token.md)） |\r\n\r\n## 鉴权\r\n\r\n1. **LinkFox**：`LINKFOXAGENT_API_KEY` → Header `Authorization` + `Token`\r\n2. **Temu**：`accessToken` 或 `storeKey`（`storeKey` 时建议带 `tokenPurpose=product-inventory`）\r\n\r\n## Scripts\r\n\r\n| 脚本 | 说明 |\r\n|------|------|\r\n| `temu_eu_proxy.py` | 任意 type |\r\n| `temu_eu_file_download.py` | 加签下载 |\r\n| `eu_promotion_activity_query.py` | `bg.promotion.activity.query` |\r\n| `eu_promotion_activity_candidate_goods_query.py` | `bg.promotion.activity.candidate.goods.query` |\r\n| `eu_promotion_activity_goods_query.py` | `bg.promotion.activity.goods.query` |\r\n| `eu_promotion_activity_goods_enroll.py` | `bg.promotion.activity.goods.enroll` |\r\n| `eu_promotion_activity_goods_operation_query.py` | `bg.promotion.activity.goods.operation.query` |\r\n| `eu_promotion_activity_goods_update.py` | `bg.promotion.activity.goods.update` |\r\n\r\n## 接入新接口（约定）\r\n\r\n你每提供一条 Partner 文档（`type` + `sub_menu_code` + URL + Request/Response 参数表），将：\r\n\r\n1. 新增 `references/apis/<type-slug>.md`（完整入参/出参层级）\r\n2. 新增 `scripts/eu_promotion_<slug>.py`（调用 `_eu_promotion_script.run_cli`）\r\n3. 更新 [partner-eu-catalog.md](./references/partner-eu-catalog.md)、[apis/README.md](./references/apis/README.md) 与本表\r\n\r\n## 示例（通用代理）\r\n\r\n```bash\r\nexport LINKFOXAGENT_API_KEY=\"<key>\"\r\n\r\npython scripts/temu_eu_proxy.py '{\r\n  \"accessToken\": \"TOKEN\",\r\n  \"tokenPurpose\": \"product-inventory\",\r\n  \"type\": \"<TEMU_API_TYPE>\",\r\n  \"params\": {\r\n    \"request\": {}\r\n  }\r\n}'\r\n```\r\n\r\n**Feedback：** `skillName`：`linkfox-temu-promotion-eu`\r\n\r\n## 网关与授权脚本\r\n\r\n| 脚本 | 说明 |\r\n|------|------|\r\n| `check_linkfox_token.py` | 校验 LinkFox 用户 Token |\r\n| `temu_token_guide.py` | Temu accessToken 后台授权步骤 |\r\n| `save_temu_access_token.py` | 保存 accessToken 到本地 |\r\n| `list_temu_access_tokens.py` | 列出已保存 token |\r\n| `get_temu_access_token.py` | 读取已保存 token |\r\n| `temu_proxy.py` | 通用网关转发（多 site） |\r\n| `temu_file_download.py` | 加签文件下载（多 site） |\r\n\r\n授权说明：[references/access-token.md](./references/access-token.md)\n\nFile v1.0.3:references/apis/README.md\n\n# Promotion — 接口文档索引\n\n网关见 [../api.md](../api.md)；目录见 [../partner-eu-catalog.md](../partner-eu-catalog.md)。\n\n## 活动查询\n\n| type | 说明 | 文档 |\n|------|------|------|\n| `bg.promotion.activity.query` | 促销活动查询 | [bg-promotion-activity-query.md](./apis/bg-promotion-activity-query.md) |\n| `bg.promotion.activity.candidate.goods.query` | 活动候选商品查询 | [bg-promotion-activity-candidate-goods-query.md](./apis/bg-promotion-activity-candidate-goods-query.md) |\n| `bg.promotion.activity.goods.query` | 活动已报名商品查询 | [bg-promotion-activity-goods-query.md](./apis/bg-promotion-activity-goods-query.md) |\n\n## 报名 / 操作结果\n\n| type | 说明 | 文档 |\n|------|------|------|\n| `bg.promotion.activity.goods.enroll` | 活动商品报名 | [bg-promotion-activity-goods-enroll.md](./apis/bg-promotion-activity-goods-enroll.md) |\n| `bg.promotion.activity.goods.operation.query` | 活动商品操作结果查询 | [bg-promotion-activity-goods-operation-query.md](./apis/bg-promotion-activity-goods-operation-query.md) |\n\n## 商品更新\n\n| type | 说明 | 文档 |\n|------|------|------|\n| `bg.promotion.activity.goods.update` | 活动商品更新 | [bg-promotion-activity-goods-update.md](./apis/bg-promotion-activity-goods-update.md) |\n\nFile v1.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-temu-promotion-eu\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1783338401874\n}\n\nFile v1.0.3:references/access-token.md\n\n# Temu accessToken 授权与获取\n\nTemu **没有** LinkFox 侧自动 OAuth；`accessToken` 须在 Temu 卖家后台「服务市场 → 授权管理」**手动复制**。与 `LINKFOXAGENT_API_KEY`（LinkFox 用户鉴权）是两套令牌。\n\n## 两种鉴权（勿混淆）\n\n| 令牌 | 用途 | 获取方式 |\n|------|------|----------|\n| **LinkFox 用户 Token** | 调用 `/temu/proxy`、`/temu/fileDownload` **必填** | `LINKFOXAGENT_API_KEY` 或请求 JSON 的 `token`；Header `Authorization` + `Token`（同 amazon-store-auth） |\n| **Temu accessToken** | Temu 业务 API（经紫鸟转发） | Temu 卖家后台授权后复制 |\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<your-key>\"\npython scripts/check_linkfox_token.py\n```\n\n## tokenPurpose 与场景\n\n| tokenPurpose | 店铺类型 | 推荐 site | 授权应用 |\n|--------------|----------|-----------|----------|\n| `product-inventory` | 半托管 | `cn` / `partner` | 酷鸟卖家助手 |\n| `order-shipping` | 半托管 | `us` / `global` / `eu` | Cyber-ERP酷鸟助手 |\n| `full-managed` | 全托管 | `cn` / `partner` | 酷鸟卖家助手 |\n| `local-native` | 本土（美/欧主体） | `us` 等 | Cyber-ERP |\n\n## 1. 半托管 — 商品/库存 Token\n\n1. 登录 [seller.kuajingmaihuo.com](https://seller.kuajingmaihuo.com) 或 [agentseller.temu.com](https://agentseller.temu.com)\n2. **系统管理** → **服务市场** → **授权管理**\n3. **获取授权** → 选择 **「酷鸟卖家助手」**\n4. 全选常规和特殊授权 → 确认 → **复制 access_token**\n5. 调用 API：`site=cn` 或 `partner`，`managementType=semi-managed`\n\n## 2. 半托管 — 订单/发货 Token\n\n1. 登录 Temu 卖家后台\n2. 右上角 **Seller Central** → 切换到目标区域（美区 / 欧区 / 全球）\n3. **服务市场** → **授权管理**\n4. **获取授权** → 选择 **「Cyber-ERP酷鸟助手」**\n5. 全选授权 → 确认 → 复制 token\n6. 调用 API：`site=eu` / `global` / `eu`，`managementType=semi-managed`\n\n## 3. 全托管店铺\n\n1. 登录 Temu 平台\n2. **系统管理** → **服务市场** → **授权管理**\n3. **获取授权** → **「酷鸟卖家助手」** → 全选 → 复制 token\n4. 调用 API：`managementType=full-managed`，`site` 通常 `cn` 或 `partner`\n\n## 4. 本土店铺（美区、欧区主体）\n\n1. 登录 Temu\n2. **Apps And Services** → **Manage Your Apps**\n3. **Authorize a new app** → 搜索 **「Cyber-ERP」**\n4. 一般权限与敏感权限全选 → 确认 → 复制 token\n\n## 站点与 OpenAPI 网关\n\n| site | 说明 | Temu 网关 |\n|------|------|-----------|\n| cn | 中国站 | openapi.kuajingmaihuo.com |\n| partner | Partner 网关 | openapi-b-partner.temu.com |\n| us | 欧洲站 | openapi-b-eu.temu.com |\n| global | 全球区 | openapi-b-global.temu.com |\n| eu | 欧洲站 | openapi-b-eu.temu.com |\n\n## 本地保存 Token（推荐）\n\n默认存储：`~/.linkfox/temu-access-tokens.json`（可用 `TEMU_TOKEN_STORE_PATH` 覆盖）。\n\n```bash\n# 查看授权步骤\npython scripts/temu_token_guide.py '{\"shopType\":\"semi-managed\",\"tokenPurpose\":\"product-inventory\",\"site\":\"cn\"}'\n\n# 保存 token\npython scripts/save_temu_access_token.py '{\n  \"storeKey\": \"my-shop\",\n  \"label\": \"中国半托管\",\n  \"site\": \"cn\",\n  \"managementType\": \"semi-managed\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"accessToken\": \"PASTE_TOKEN\"\n}'\n\n# 列出已保存（脱敏）\npython scripts/list_temu_access_tokens.py\n\n# 用 storeKey 调 API（无需每次粘贴 token）\npython scripts/temu_proxy.py '{\n  \"storeKey\": \"my-shop\",\n  \"site\": \"cn\",\n  \"managementType\": \"semi-managed\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"type\": \"bg.goods.category.mapping\",\n  \"params\": {\"goodsName\": \"测试\", \"goodsNameEn\": \"Test\"}\n}'\n```\n\n## 注意事项\n\n1. **子账号**：可能无法进入服务市场，需主账号授权。\n2. **多站点**：欧洲站、英国站等需分别登录对应后台获取 Token。\n3. **有效期**：Token 会过期，过期后重新在后台复制并 `save_temu_access_token.py`。\n4. **IP 白名单**：需联系紫鸟开放平台配置调用 IP。\n5. **参数小写**：`site`、`managementType` 必须小写。\n\n## 脚本一览\n\n| 脚本 | 说明 |\n|------|------|\n| `temu_token_guide.py` | 按店铺类型/用途输出授权步骤 |\n| `save_temu_access_token.py` | 保存 accessToken 到本地 |\n| `list_temu_access_tokens.py` | 列出已保存 token（默认脱敏）|\n| `get_temu_access_token.py` | 读取指定 store 的 token |\n\nFile v1.0.3:references/api.md\n\n# linkfox-temu-promotion-eu — API 参考\r\n\r\nTemu **欧洲站电商促销**（Partner EU **Promotion** / 促销活动等），经本 skill `temu_eu_proxy`（`POST /temu/proxy`） 转发。Temu 的 `type` 写在 Body，**不是** URL 路径。\r\n\r\n> 网关与鉴权：本 skill `scripts/`（`LINKFOXAGENT_API_KEY`、`accessToken` / `storeKey`）。授权见 `references/access-token.md`。\r\n\r\n---\r\n\r\n## 调用规范\r\n\r\n| 项 | 说明 |\r\n|----|------|\r\n| 网关根地址 | `${LINKFOX_TOOL_GATEWAY}`（可用 `TEMU_API_BASE_URL` / `STORE_API_BASE_URL` 覆盖） |\r\n| 促销 OpenAPI | `POST /temu/proxy` |\r\n| 加签文件下载 | `POST /temu/fileDownload`（`temu_eu_file_download.py`） |\r\n| LinkFox 鉴权 | Header **`Authorization`** 与 **`Token`**（同值）；或 `LINKFOX_AGENT_API_KEY` / `LINKFOXAGENT_API_KEY`；或 JSON `token` |\r\n| Temu 鉴权 | Body `accessToken`，或 `storeKey` + `site` + `managementType` + `tokenPurpose` |\r\n| 默认 | `site=eu`，`managementType=semi-managed`，`tokenPurpose=product-inventory` |\r\n| 上游 OpenAPI（US） | `https://openapi-b-eu.temu.com/openapi/router`（网关按 `site` 解析） |\r\n\r\n### 网关请求 Body（`/temu/proxy`）\r\n\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| site | string | 是 | `eu`（本 skill 默认） |\r\n| managementType | string | 是 | `semi-managed` |\r\n| accessToken | string | 与 storeKey 二选一 | Temu 店铺令牌 |\r\n| storeKey | string | 与 accessToken 二选一 | `~/.linkfox/temu-access-tokens.json` 中的键 |\r\n| tokenPurpose | string | 否 | 建议 **`product-inventory`** |\r\n| type | string | 是 | Temu 接口名，如 Partner Promotion 菜单下的 `bg.*` / `temu.*` |\r\n| params | object | 否 | 业务参数；多数接口业务块在 **`params.request`** |\r\n\r\n### 网关响应\r\n\r\n| 字段 | 类型 | 说明 |\r\n|------|------|------|\r\n| body | string | Temu 原始 JSON 字符串；脚本解析为 `temuBody` |\r\n| code | integer | 网关错误码：`1002` 参数/Token，`1003` 转发失败 |\r\n\r\n解析顺序：**网关 `code`** → `JSON.parse(body)` → `success` / `errorCode` / `errorMsg` / `result`。\r\n\r\n### 脚本调用\r\n\r\n```bash\r\nexport LINKFOXAGENT_API_KEY=\"<key>\"\r\npython scripts/temu_eu_proxy.py '{\"accessToken\":\"TOKEN\",\"tokenPurpose\":\"product-inventory\",\"type\":\"<API_TYPE>\",\"params\":{\"request\":{}}}'\r\n```\r\n\r\n业务字段可放在顶层或嵌套 `params`；含 `request` 时通常整体作为 `params` 转发。\r\n\r\n---\r\n\r\n## 接口一览\r\n\r\n完整 `sub_menu_code` 与 Partner 文档 URL 见 [partner-eu-catalog.md](./partner-eu-catalog.md)。\r\n\r\n**每个接口单独一份文档**：[apis/README.md](./apis/README.md)（随接入递增）。\r\n\r\n| type | 说明 | 文档 |\r\n|------|------|------|\r\n| `bg.promotion.activity.query` | 促销活动查询 | [apis/bg-promotion-activity-query.md](./apis/bg-promotion-activity-query.md) |\r\n| `bg.promotion.activity.candidate.goods.query` | 活动候选商品查询 | [apis/bg-promotion-activity-candidate-goods-query.md](./apis/bg-promotion-activity-candidate-goods-query.md) |\r\n| `bg.promotion.activity.goods.query` | 活动已报名商品查询 | [apis/bg-promotion-activity-goods-query.md](./apis/bg-promotion-activity-goods-query.md) |\r\n| `bg.promotion.activity.goods.enroll` | 活动商品报名 | [apis/bg-promotion-activity-goods-enroll.md](./apis/bg-promotion-activity-goods-enroll.md) |\r\n| `bg.promotion.activity.goods.operation.query` | 活动商品操作结果查询 | [apis/bg-promotion-activity-goods-operation-query.md](./apis/bg-promotion-activity-goods-operation-query.md) |\r\n| `bg.promotion.activity.goods.update` | 活动商品更新 | [apis/bg-promotion-activity-goods-update.md](./apis/bg-promotion-activity-goods-update.md) |\r\n\r\n---\r\n\r\n## 典型促销流程\r\n\r\n```text\r\n1. bg.promotion.activity.query                      → 查可参加/已参加的活动\r\n2. bg.promotion.activity.candidate.goods.query      → 查候选商品与推荐活动价\r\n3. bg.promotion.activity.goods.enroll               → 报名（得 draftId）\r\n4. bg.promotion.activity.goods.operation.query      → 轮询报名/更新结果\r\n5. bg.promotion.activity.goods.query                → 查已报名商品与活动价\r\n6. bg.promotion.activity.goods.update               → 改价/改量/下架/加 SKU\r\n```\r\n\r\n---\r\n\r\n## 与其他 Temu EU skill 的区分\r\n\r\n| 能力 | skill |\r\n|------|--------|\r\n| **促销**（本 skill） | **`linkfox-temu-promotion-eu`** |\r\n| 商品管理（列表/编辑/库存/上下架） | `linkfox-temu-manage-product-eu` |\r\n| 价格/供货价 | `linkfox-temu-price-eu` |\r\n| 发品 | `linkfox-temu-add-product-eu` |\r\n| 订单 | `linkfox-temu-order-eu` |\r\n\r\n---\r\n\r\n## 网关错误码\r\n\r\n| code | 说明 | 处理 |\r\n|------|------|------|\r\n| 1002 | 参数或 LinkFox Token 无效 | 修正参数与 `LINKFOXAGENT_API_KEY` |\r\n| 1003 | 转发失败 | 检查 Temu token、`tokenPurpose`、白名单、网络 |\r\n\r\n---\r\n\r\n## Feedback API\r\n\r\n- **POST** `https://skill-api.linkfox.com/api/v1/public/feedback`\r\n- `skillName`: **`linkfox-temu-promotion-eu`**\n\nFile v1.0.3:references/apis/bg-promotion-activity-candidate-goods-query.md\n\n# 活动候选商品查询 — `bg.promotion.activity.candidate.goods.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_candidate_goods_query.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.candidate.goods.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query candidate goods for a promotion activity.\n\n> **`activityId`**、**`pageNumber`**、**`pageSize`** 均为必填。\n> 返回 **`isAllowedEnroll`** 与推荐活动价/数量，用于报名前选品。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── activityId (LONG, 必填)\n    ├── pageNumber (INTEGER, 必填)\n    └── pageSize (INTEGER, 必填)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| activityId | LONG | **是** | unique identifier for the activity |\n| pageNumber | INTEGER | **是** | page number for pagination, default is 1. |\n| pageSize | INTEGER | **是** | Page size for pagination, default is 10, max is 100. |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"activityId\": 123456,\n    \"pageNumber\": 1,\n    \"pageSize\": 20\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── total (LONG)\n    ├── activityInfo (OBJECT)\n    │   └── activityId, activityName, activityType, activityStatus, …\n    └── goodsList[]\n        ├── goodsId (LONG)\n        ├── isAllowedEnroll (BOOLEAN)\n        ├── recommendActivityQuantity (INTEGER)\n        └── skuList[]\n            ├── skuId (LONG)\n            └── recommendActivitySupplierPrice (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| total | LONG | Total records（总记录数） |\n| activityInfo | OBJECT | Activity information（当前活动信息） |\n| goodsList | OBJECT[] | Candidate goods list（候选商品列表） |\n\n#### `activityInfo`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| activityId | LONG | unique identifier for the activity |\n| activityName | STRING | Activity name |\n| activityType | INTEGER | Activity type |\n| activityStatus | INTEGER | Activity status（`1` Not started；`2` Ongoing；`3` Ended） |\n| activityStartTime | LONG | Start time in seconds |\n| activityEndTime | LONG | End time in seconds |\n| isJoinedActivity | BOOLEAN | Whether joined |\n\n#### `goodsList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| goodsId | LONG | goods id |\n| isAllowedEnroll | BOOLEAN | Whether the goods is allowed to enroll（是否允许报名） |\n| recommendActivityQuantity | INTEGER | Recommended activity quantity（推荐活动数量） |\n| skuList | OBJECT[] | SKU list with recommended prices |\n\n#### `goodsList[].skuList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| skuId | LONG | sku id |\n| recommendActivitySupplierPrice | LONG | Recommended activity supplier price（推荐活动供货价） |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010003 | The activity has been cancelled, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010004 | The activity has ended, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_candidate_goods_query.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"activityId\": 123456, \"pageNumber\": 1, \"pageSize\": 20}}'\n```\n\n**典型流程：** 在 [activity.query](./bg-promotion-activity-query.md) 取得 **`activityId`** 后，查询可报名商品与推荐价。\n\nFile v1.0.3:references/apis/bg-promotion-activity-goods-enroll.md\n\n# 活动商品报名 — `bg.promotion.activity.goods.enroll`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_goods_enroll.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.goods.enroll`，业务载荷放在 Body 的 `params` |\n\n**Description:** Enroll goods into a promotion activity.\n\n> **`activityId`**、**`enrollGoods`** 必填。\n> **`enrollGoods`** 子字段在 Partner Request 表中为折叠行，按 **Request Example** 展开。\n> 返回 **`draftId`**，可用 [goods.operation.query](./bg-promotion-activity-goods-operation-query.md) 轮询 **`operationStatus`**。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    ├── activityId (LONG, 必填)\n    └── enrollGoods (OBJECT, 必填)\n        ├── goodsId (LONG, 必填)\n        ├── activityQuantity (LONG, 必填)\n        ├── traceCode (STRING, 否)\n        └── enrollSkuList[] (OBJECT[], 必填)\n            ├── skuId (LONG)\n            └── activitySupplierPrice (LONG)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| activityId | LONG | **是** | unique identifier for the activity |\n| enrollGoods | OBJECT | **是** | goods information required for activity registration |\n\n#### `enrollGoods`（OBJECT，必填）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| goodsId | LONG | 是 | goods id |\n| activityQuantity | LONG/INTEGER | 是 | Activity quantity for enrollment（报名活动数量） |\n| traceCode | STRING | 否 | Idempotent key（幂等键，单次操作长度不超过 32 字符，Partner Request Example） |\n| enrollSkuList | OBJECT[] | 是 | SKU list to enroll |\n\n#### `enrollGoods.enrollSkuList[]`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| skuId | LONG | sku id |\n| activitySupplierPrice | LONG | Activity supplier price for this SKU（该 SKU 活动供货价） |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"activityId\": 123456,\n    \"enrollGoods\": {\n      \"goodsId\": 100001,\n      \"activityQuantity\": 50,\n      \"traceCode\": \"enroll-001\",\n      \"enrollSkuList\": [\n        {\n          \"skuId\": 200001,\n          \"activitySupplierPrice\": 1999\n        }\n      ]\n    }\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result\n    ├── draftId (LONG)\n    ├── operationStatus (INTEGER)\n    ├── failReason (STRING)\n    └── goodsId (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT 或 OBJECT[] | 业务结果（见下表；**goods.operation.query** 的 `result` 为数组） |\n\n### `result`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| draftId | LONG | goods registration activity draft id（报名草稿 ID；前置流程成功时生成，用于 [goods.operation.query](./bg-promotion-activity-goods-operation-query.md)） |\n| operationStatus | INTEGER | Operation status（操作状态码；异步处理时请轮询 operation.query） |\n| failReason | STRING | Failure reason when operation failed（失败原因） |\n| goodsId | LONG | goods id |\n\n---\n\n## Error Code（Partner 表）\n\n| errorCode | errorMsg | Error SOP / 处理建议 |\n|-----------|----------|----------------------|\n| 220010001 | parameter is illegal | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010002 | system error, please try again later | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010003 | The activity has been cancelled, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n| 220010004 | The activity has ended, please select another activity to participate | 见 Partner 文档；修正入参或活动状态后重试 |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/eu_promotion_activity_goods_enroll.py '{\"accessToken\": \"TOKEN\", \"tokenPurpose\": \"product-inventory\", \"request\": {\"activityId\": 123456, \"enrollGoods\": {\"goodsId\": 100001, \"activityQuantity\": 50, \"traceCode\": \"enroll-001\", \"enrollSkuList\": [{\"skuId\": 200001, \"activitySupplierPrice\": 1999}]}}}'\n```\n\n**典型流程：** 报名 → 保存 **`draftId`** → **goods.operation.query** 确认结果。\n\nFile v1.0.3:references/apis/bg-promotion-activity-goods-operation-query.md\n\n# 活动商品操作结果查询 — `bg.promotion.activity.goods.operation.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/eu_promotion_activity_goods_operation_query.py` |\n| **Partner 文档** | https://partner-eu.temu.com/documentation?menu_code=7289390cfd724be4a196f11ebe45a896（按 `type` 在 Partner EU 后台打开） ||\n| **网关** | `POST /temu/proxy`，`type`=`bg.promotion.activity.goods.operation.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query promotion goods operation result by draft ID.\n\n> **`draftIdList`** 为必填（来自 enroll/update 返回的 **`draftId`**）。\n> Partner **Response Example** 中 **`result`** 为 **OBJECT[]**（非带 `total` 的对象包装）。\n\n> **网关鉴权字段**由本 skill 网关脚本处理；业务参数见下方 **`request`**。建议使用 **`tokenPurpose=product-inventory`**，**`managementType=semi-managed`**。\n\n---\n\n## Request 结构（官方顶层）\n\n```text\nparams\n└── request (OBJECT, 选填)\n    └── draftIdList (LONG[], 必填)\n```\n\n### `request` 内字段\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| draftIdList | LONG[] | **是** | goods registration activity draft id, which will be generated when the pre-procedure is successfully completed. |\n\n> 官方 Request 表将顶层 **`request`** 标为选填（False）；标 **必填** 的字段须在 **`params.request`** 中提供。\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"draftIdList\": [\n      10001,\n      10002\n    ]\n  }\n}\n```\n\n---\n\n## Response（Temu `body` 解析后）\n\nPartner **Response** 表嵌套子行在导出 HTML 中多为折叠状态，下列层级按 **Response 表 + Response Example** 全部展开。\n\n```text\nresponse\n├── success / errorCode / errorMsg\n└── result[]\n    ├── draftId (LONG)\n    ├── operationStatus (INTEGER)\n    ├── failReason (STRING)\n    └── goodsId (LONG)\n```\n\n### 顶层字段（`response` 内，或根级）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success（当前请求是否成功） |\n| errorCode | INTEGER | err\n\nArchive v1.0.2: 33 files, 42740 bytes\n\nFiles: references/access-token.md (4450b), references/api.md (5055b), references/apis/bg-promotion-activity-candidate-goods-query.md (5144b), references/apis/bg-promotion-activity-goods-enroll.md (5203b), references/apis/bg-promotion-activity-goods-operation-query.md (3452b), references/apis/bg-promotion-activity-goods-query.md (4406b), references/apis/bg-promotion-activity-goods-update.md (5805b), references/apis/bg-promotion-activity-query.md (5627b), references/apis/README.md (1307b), references/authorization-flow.md (1186b), references/partner-eu-catalog.md (3363b), scripts/_eu_promotion_script.py (516b), scripts/_temu_auth_guide.py (6198b), scripts/_temu_common.py (12427b), scripts/_temu_eu_common.py (3174b), scripts/_temu_token_store.py (4273b), scripts/check_linkfox_token.py (1797b), scripts/eu_promotion_activity_candidate_goods_query.py (307b), scripts/eu_promotion_activity_goods_enroll.py (274b), scripts/eu_promotion_activity_goods_operation_query.py (313b), scripts/eu_promotion_activity_goods_query.py (280b), scripts/eu_promotion_activity_goods_update.py (274b), scripts/eu_promotion_activity_query.py (253b), scripts/get_temu_access_token.py (1843b), scripts/list_temu_access_tokens.py (652b), scripts/save_temu_access_token.py (1377b), scripts/temu_eu_file_download.py (680b), scripts/temu_eu_proxy.py (901b), scripts/temu_file_download.py (1681b), scripts/temu_proxy.py (2124b), scripts/temu_token_guide.py (1594b), SKILL.md (5740b), _meta.json (144b)\n\nArchive v1.0.0: 34 files, 41372 bytes\n\nFiles: references/access-token.md (4450b), references/api.md (4931b), references/apis/bg-promotion-activity-candidate-goods-query.md (5144b), references/apis/bg-promotion-activity-goods-enroll.md (5203b), references/apis/bg-promotion-activity-goods-operation-query.md (3452b), references/apis/bg-promotion-activity-goods-query.md (4406b), references/apis/bg-promotion-activity-goods-update.md (5805b), references/apis/bg-promotion-activity-query.md (5627b), references/apis/README.md (1307b), references/authorization-flow.md (1186b), references/partner-eu-catalog.md (3363b), scripts/_eu_promotion_script.py (516b), scripts/_temu_auth_guide.py (6198b), scripts/_temu_common.py (5593b), scripts/_temu_eu_common.py (3057b), scripts/_temu_token_store.py (4237b), scripts/check_linkfox_token.py (1797b), scripts/eu_promotion_activity_candidate_goods_query.py (307b), scripts/eu_promotion_activity_goods_enroll.py (274b), scripts/eu_promotion_activity_goods_operation_query.py (313b), scripts/eu_promotion_activity_goods_query.py (280b), scripts/eu_promotion_activity_goods_update.py (274b), scripts/eu_promotion_activity_query.py (253b), scripts/get_temu_access_token.py (1843b), scripts/list_temu_access_tokens.py (652b), scripts/save_temu_access_token.py (1377b), scripts/temu_eu_file_download.py (639b), scripts/temu_eu_proxy.py (850b), scripts/temu_file_download.py (1595b), scripts/temu_proxy.py (2027b), scripts/temu_token_guide.py (1594b), skill-card.md (3003b), SKILL.md (4726b), _meta.json (144b)","readmeExcerpt":"Skill: Temu欧洲站-促销 Owner: linkfox-ai Summary: Temu 欧洲站电商促销 API，经 LinkFox 网关转发 Partner EU Promotion / 促销活动 相关 bg/temu 接口（活动创建、报名、查询、优惠券/秒杀等，接口将按 Partner 文档逐条接入）。当用户提到 Temu EU 促销、促销活动、优惠券、秒杀、活动报名、promotion campaign、product-inventory 促销 时触发。商品管理用 linkfox-temu-manage-product-eu；价格用 linkfox-temu-price-eu；订单用 linkfox-temu-order-eu。 Tags: latest:1.0.6 Version history: v1.0.6 | 2026-08-14T15:18:24.811Z | user Update from 1.0.","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"export LINKFOXAGENT_API_KEY=\"<key>\"\n\npython scripts/temu_eu_proxy.py '{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"type\": \"<TEMU_API_TYPE>\",\n  \"params\": {\n    \"request\": {}\n  }\n}'"},{"language":"bash","snippet":"export LINKFOXAGENT_API_KEY=\"<your-key>\"\npython scripts/check_linkfox_token.py"},{"language":"bash","snippet":"# 查看授权步骤\npython scripts/temu_token_guide.py '{\"shopType\":\"semi-managed\",\"tokenPurpose\":\"product-inventory\",\"site\":\"cn\"}'\n\n# 保存 token\npython scripts/save_temu_access_token.py '{\n  \"storeKey\": \"my-shop\",\n  \"label\": \"中国半托管\",\n  \"site\": \"cn\",\n  \"managementType\": \"semi-managed\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"accessToken\": \"PASTE_TOKEN\"\n}'\n\n# 列出已保存（脱敏）\npython scripts/list_temu_access_tokens.py\n\n# 用 storeKey 调 API（无需每次粘贴 token）\npython scripts/temu_proxy.py '{\n  \"storeKey\": \"my-shop\",\n  \"site\": \"cn\",\n  \"managementType\": \"semi-managed\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"type\": \"bg.goods.category.mapping\",\n  \"params\": {\"goodsName\": \"测试\", \"goodsNameEn\": \"Test\"}\n}'"},{"language":"text","snippet":"params\n└── request (OBJECT, 选填)\n    ├── activityId (LONG, 必填)\n    ├── pageNumber (INTEGER, 必填)\n    └── pageSize (INTEGER, 必填)"},{"language":"json","snippet":"{\n  \"accessToken\": \"TOKEN\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"activityId\": 123456,\n    \"pageNumber\": 1,\n    \"pageSize\": 20\n  }\n}"},{"language":"text","snippet":"response\n├── success / errorCode / errorMsg\n└── result\n    ├── total (LONG)\n    ├── activityInfo (OBJECT)\n    │   └── activityId, activityName, activityType, activityStatus, …\n    └── goodsList[]\n        ├── goodsId (LONG)\n        ├── isAllowedEnroll (BOOLEAN)\n        ├── recommendActivityQuantity (INTEGER)\n        └── skuList[]\n            ├── skuId (LONG)\n            └── recommendActivitySupplierPrice (LONG)"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: linkfox-temu-promotion-eu\ndescription: Temu 欧洲站电商促销 API，经 LinkFox 网关转发 Partner EU Promotion / 促销活动 相关 bg/temu 接口（活动创建、报名、查询、优惠券/秒杀等，接口将按 Partner 文档逐条接入）。当用户提到 Temu EU 促销、促销活动、优惠券、秒杀、活动报名、promotion campaign、product-inventory 促销 时触发。商品管理用 linkfox-temu-manage-product-eu；价格用 linkfox-temu-price-eu；订单用 linkfox-temu-order-eu。\n---\n\n# Temu 欧洲站 — 电商促销（Promotion）\n\n本 skill（`linkfox-temu-promotion-eu`）覆盖 Partner Platform for EU **Promotion / 电商促销**（促销活动、优惠券、活动报名等；Partner 后台菜单可能显示为 Marketing/Promotion）相关 `bg.*` / `temu.*` 接口（`menu_code` 与各 `sub_menu_code` 以 Partner 后台为准，见 [partner-eu-catalog.md](./references/partner-eu-catalog.md)）。\n\n已接入 **6** 条 Partner **Promotion** 接口，清单见 [partner-eu-catalog.md](./references/partner-eu-catalog.md)。\n\n**网关（本 skill 内置）**：\n\n| 能力 | 方法 | 路径 |\n|------|------|------|\n| 促销 OpenAPI（`eu_promotion_*`、`temu_eu_proxy`） | POST | `https://tool-gateway.linkfox.com/temu/proxy` |\n| 加签文件下载 | POST | `https://tool-gateway.linkfox.com/temu/fileDownload` |\n\n## 相关 skill\n\n| 场景 | skill |\n|------|--------|\n| **促销/营销活动**（本 skill） | **`linkfox-temu-promotion-eu`** |\n| 广告 Ads | `linkfox-temu-ads-eu` |\n| 商品列表/详情/编辑/库存/上下架 | `linkfox-temu-manage-product-eu` |\n| 发品 | `linkfox-temu-add-product-eu` |\n| 价格/供货价、定价单 | `linkfox-temu-price-eu` |\n| 订单列表/详情 | `linkfox-temu-order-eu` |\n| 退货与退款 | `linkfox-temu-returns-refunds-eu` |\n| 网关与 Temu token | 本 skill `scripts/` |\n\n## 调用方式\n\n- **API 端点**：`POST /temu/proxy`（不同操作通过请求体区分；完整参数/响应/错误码见 `references/api.md`）\n- **Python 脚本**：`python scripts/<脚本名>.py '<JSON 参数>' [--inline]`（可用脚本见上文脚本一览）\n- **成本约束**：本工具会消耗积分；失败/空结果不得自动换关键词、翻页或连续试探；需要继续检索时先向用户说明会产生额外消耗。\n\n**输出策略（脚本默认行为）**：\n- **始终**将完整响应写入 `<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/<skill-name>-<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## 默认参数\n\n| 字段 | 默认 | 说明 |\n|------|------|------|\n| site | `eu` | Partner EU |\n| managementType | `semi-managed` | 半托管（具体接口以 Partner 文档为准） |\n| tokenPurpose | `product-inventory` | 与商品/促销场景一致（见 [access-token.md](./references/access-token.md)） |\n\n## 鉴权\n\n1. **LinkFox**：`LINKFOXAGENT_API_KEY` → Header `Authorization` + `Token`\n2. **Temu**：`accessToken` 或 `storeKey`（`storeKey` 时建议带 `tokenPurpose=product-inventory`）\n\n## Scripts\n\n| 脚本 | 说明 |\n|------|------|\n| `temu_eu_proxy.py` | 任意 type |\n| `temu_eu_file_download.py` | 加签下载 |\n| `eu_promotion_activity_query.py` | `bg.promotion.activity.query` |\n| `eu_promotion_activity_candidate_goods_query.py` | `bg.promo"},{"path":"references/apis/README.md","content":"# Promotion — 接口文档索引\n\n网关见 [../api.md](../api.md)；目录见 [../partner-eu-catalog.md](../partner-eu-catalog.md)。\n\n## 活动查询\n\n| type | 说明 | 文档 |\n|------|------|------|\n| `bg.promotion.activity.query` | 促销活动查询 | [bg-promotion-activity-query.md](./apis/bg-promotion-activity-query.md) |\n| `bg.promotion.activity.candidate.goods.query` | 活动候选商品查询 | [bg-promotion-activity-candidate-goods-query.md](./apis/bg-promotion-activity-candidate-goods-query.md) |\n| `bg.promotion.activity.goods.query` | 活动已报名商品查询 | [bg-promotion-activity-goods-query.md](./apis/bg-promotion-activity-goods-query.md) |\n\n## 报名 / 操作结果\n\n| type | 说明 | 文档 |\n|------|------|------|\n| `bg.promotion.activity.goods.enroll` | 活动商品报名 | [bg-promotion-activity-goods-enroll.md](./apis/bg-promotion-activity-goods-enroll.md) |\n| `bg.promotion.activity.goods.operation.query` | 活动商品操作结果查询 | [bg-promotion-activity-goods-operation-query.md](./apis/bg-promotion-activity-goods-operation-query.md) |\n\n## 商品更新\n\n| type | 说明 | 文档 |\n|------|------|------|\n| `bg.promotion.activity.goods.update` | 活动商品更新 | [bg-promotion-activity-goods-update.md](./apis/bg-promotion-activity-goods-update.md) |"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-temu-promotion-eu\",\n  \"version\": \"1.0.6\",\n  \"publishedAt\": 1786720704811\n}"},{"path":"references/access-token.md","content":"# Temu accessToken 授权与获取\n\nTemu **没有** LinkFox 侧自动 OAuth；`accessToken` 须在 Temu 卖家后台「服务市场 → 授权管理」**手动复制**。与 `LINKFOXAGENT_API_KEY`（LinkFox 用户鉴权）是两套令牌。（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理）\n\n## 两种鉴权（勿混淆）\n\n| 令牌 | 用途 | 获取方式 |\n|------|------|----------|\n| **LinkFox 用户 Token** | 调用 `/temu/proxy`、`/temu/fileDownload` **必填** | `LINKFOXAGENT_API_KEY` 或请求 JSON 的 `token`；Header `Authorization` + `Token`（同 amazon-store-auth）（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理） |\n| **Temu accessToken** | Temu 业务 API（经紫鸟转发） | Temu 卖家后台授权后复制 |\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<your-key>\"\npython scripts/check_linkfox_token.py\n```\n\n## tokenPurpose 与场景\n\n| tokenPurpose | 店铺类型 | 推荐 site | 授权应用 |\n|--------------|----------|-----------|----------|\n| `product-inventory` | 半托管 | `cn` / `partner` | 酷鸟卖家助手 |\n| `order-shipping` | 半托管 | `us` / `global` / `eu` | Cyber-ERP酷鸟助手 |\n| `full-managed` | 全托管 | `cn` / `partner` | 酷鸟卖家助手 |\n| `local-native` | 本土（美/欧主体） | `us` 等 | Cyber-ERP |\n\n## 1. 半托管 — 商品/库存 Token\n\n1. 登录 [seller.kuajingmaihuo.com](https://seller.kuajingmaihuo.com) 或 [agentseller.temu.com](https://agentseller.temu.com)\n2. **系统管理** → **服务市场** → **授权管理**\n3. **获取授权** → 选择 **「酷鸟卖家助手」**\n4. 全选常规和特殊授权 → 确认 → **复制 access_token**\n5. 调用 API：`site=cn` 或 `partner`，`managementType=semi-managed`\n\n## 2. 半托管 — 订单/发货 Token\n\n1. 登录 Temu 卖家后台\n2. 右上角 **Seller Central** → 切换到目标区域（美区 / 欧区 / 全球）\n3. **服务市场** → **授权管理**\n4. **获取授权** → 选择 **「Cyber-ERP酷鸟助手」**\n5. 全选授权 → 确认 → 复制 token\n6. 调用 API：`site=eu` / `global` / `eu`，`managementType=semi-managed`\n\n## 3. 全托管店铺\n\n1. 登录 Temu 平台\n2. **系统管理** → **服务市场** → **授权管理**\n3. **获取授权** → **「酷鸟卖家助手」** → 全选 → 复制 token\n4. 调用 API：`managementType=full-managed`，`site` 通常 `cn` 或 `partner`\n\n## 4. 本土店铺（美区、欧区主体）\n\n1. 登录 Temu\n2. **Apps And Services** → **Manage Your Apps**\n3. **Authorize a new app** → 搜索 **「Cyber-ERP」**\n4. 一般权限与敏感权限全选 → 确认 → 复制 token\n\n## 站点与 OpenAPI 网关\n\n| site | 说明 | Temu 网关 |\n|------|------|-----------|\n| cn | 中国站 | openapi.kuajingmaihuo.com |\n| partner | Partner 网关 | openapi-b-partner.temu.com |\n| us | 欧洲站 | openapi-b-eu.temu.com |\n| global | 全球区 | openapi-b-global.temu.com |\n| eu | 欧洲站 | openapi-b-eu.temu.com |\n\n## 本地保存 Token（推荐）\n\n默认存储：`~/.linkfox/temu-access-tokens.json`（可用 `TEMU_TOKEN_STORE_PATH` 覆盖）。\n\n```bash\n# 查看授权步骤\npython scripts/temu_token_guide.py '{\"shopType\":\"semi-managed\",\"tokenPurpose\":\"product-inventory\",\"site\":\"cn\"}'\n\n# 保存 token\npython scripts/save_temu_access_token.py '{\n  \"storeKey\": \"my-shop\",\n  \"label\": \"中国半托管\",\n  \"site\": \"cn\",\n  \"managementType\": \"semi-managed\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"accessToken\": \"PASTE_TOKEN\"\n}'\n\n# 列出已保存（脱敏）\npython scripts/list_temu_access_tokens.py\n\n# 用 storeKey 调 API（无需每次粘贴 token）\npython scripts/temu_proxy.py '{\n  \"storeKey\": \"my-shop\",\n  \"site\": \"cn\",\n  \"managementType\": \"semi-managed\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"type\": \"bg.goods.category.mapping\",\n  \"params\": {\"goodsName\": \"测试\", \"goodsNameEn\": \"Test\"}\n}'\n```\n\n## 注意事项\n\n1. **子账号**：可能无法进入服务市场，需主账号授权。\n2. **多站点**：欧洲站、英国站等需分别登录对应后台获取 Token。\n"},{"path":"references/api.md","content":"# linkfox-temu-promotion-eu — API 参考\r\n\r\nTemu **欧洲站电商促销**（Partner EU **Promotion** / 促销活动等），经本 skill `temu_eu_proxy`（`POST /temu/proxy`） 转发。Temu 的 `type` 写在 Body，**不是** URL 路径。\r\n\r\n> 网关与鉴权：本 skill `scripts/`（`LINKFOXAGENT_API_KEY`、`accessToken` / `storeKey`）。授权见 `references/access-token.md`。（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理）\r\n\r\n---\r\n\r\n## 调用规范\r\n\r\n| 项 | 说明 |\r\n|----|------|\r\n| 网关根地址 | `${LINKFOX_TOOL_GATEWAY}`（可用 `TEMU_API_BASE_URL` / `STORE_API_BASE_URL` 覆盖） |\r\n| 促销 OpenAPI | `POST /temu/proxy` |\r\n| 加签文件下载 | `POST /temu/fileDownload`（`temu_eu_file_download.py`） |\r\n| LinkFox 鉴权 | Header **`Authorization`** 与 **`Token`**（同值）；或 `LINKFOX_AGENT_API_KEY` / `LINKFOXAGENT_API_KEY`；或 JSON `token`（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理） |\r\n| Temu 鉴权 | Body `accessToken`，或 `storeKey` + `site` + `managementType` + `tokenPurpose` |\r\n| 默认 | `site=eu`，`managementType=semi-managed`，`tokenPurpose=product-inventory` |\r\n| 上游 OpenAPI（US） | `https://openapi-b-eu.temu.com/openapi/router`（网关按 `site` 解析） |\r\n\r\n### 网关请求 Body（`/temu/proxy`）\r\n\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| site | string | 是 | `eu`（本 skill 默认） |\r\n| managementType | string | 是 | `semi-managed` |\r\n| accessToken | string | 与 storeKey 二选一 | Temu 店铺令牌 |\r\n| storeKey | string | 与 accessToken 二选一 | `~/.linkfox/temu-access-tokens.json` 中的键 |\r\n| tokenPurpose | string | 否 | 建议 **`product-inventory`** |\r\n| type | string | 是 | Temu 接口名，如 Partner Promotion 菜单下的 `bg.*` / `temu.*` |\r\n| params | object | 否 | 业务参数；多数接口业务块在 **`params.request`** |\r\n\r\n### 网关响应\r\n\r\n| 字段 | 类型 | 说明 |\r\n|------|------|------|\r\n| body | string | Temu 原始 JSON 字符串；脚本解析为 `temuBody` |\r\n| code | integer | 网关错误码：`1002` 参数/Token，`1003` 转发失败 |\r\n\r\n解析顺序：**网关 `code`** → `JSON.parse(body)` → `success` / `errorCode` / `errorMsg` / `result`。\r\n\r\n### 脚本调用\r\n\r\n```bash\r\nexport LINKFOXAGENT_API_KEY=\"<key>\"\r\npython scripts/temu_eu_proxy.py '{\"accessToken\":\"TOKEN\",\"tokenPurpose\":\"product-inventory\",\"type\":\"<API_TYPE>\",\"params\":{\"request\":{}}}'\r\n```\r\n\r\n业务字段可放在顶层或嵌套 `params`；含 `request` 时通常整体作为 `params` 转发。\r\n\r\n---\r\n\r\n## 接口一览\r\n\r\n完整 `sub_menu_code` 与 Partner 文档 URL 见 [partner-eu-catalog.md](./partner-eu-catalog.md)。\r\n\r\n**每个接口单独一份文档**：[apis/README.md](./apis/README.md)（随接入递增）。\r\n\r\n| type | 说明 | 文档 |\r\n|------|------|------|\r\n| `bg.promotion.activity.query` | 促销活动查询 | [apis/bg-promotion-activity-query.md](./apis/bg-promotion-activity-query.md) |\r\n| `bg.promotion.activity.candidate.goods.query` | 活动候选商品查询 | [apis/bg-promotion-activity-candidate-goods-query.md](./apis/bg-promotion-activity-candidate-goods-query.md) |\r\n| `bg.promotion.activity.goods.query` | 活动已报名商品查询 | [apis/bg-promotion-activity-goods-query.md](./apis/bg-promotion-activity-goods-query.md) |\r\n| `bg.promotion.activity.goods.enroll` | 活动商品报名 | [apis/bg-promotion-activity-goods-enroll.md](./apis/bg-promotion-activity-goods-enroll.md) |\r\n| `bg.promotion.activity.goods.operation.query` | 活动商品操作结果查询 | [apis/bg-promotion-activity-goods-operation-query.md](./apis/bg-promotion-activity-goods-operati"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1119,"uniquenessScore":35,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T15:28:54.791Z","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-10T15:28:54.791Z","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-10T17:37:20.668Z","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"}]}}}