{"id":"6ff9d9e3-0a8b-42fc-94e1-52c467569c34","entityType":"agent","slug":"clawhub-linkfox-ai-linkfox-temu-compliance-global","name":"Temu全球站-合规","canonicalUrl":"https://www.xpersona.co/agent/clawhub-linkfox-ai-linkfox-temu-compliance-global","canonicalPath":"/agent/clawhub-linkfox-ai-linkfox-temu-compliance-global","generatedAt":"2026-10-10T21:53:41.086Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:54:19.489Z","emptyReason":null},"description":"Temu 全球站电商合规（Compliance）API，经 LinkFox 网关转发 Partner Global 合规相关 OpenAPI（bg.compliance.*、bg.arbok.open.*、bg.flash.open.* 等，共 9 个接口）。当用户提到 Temu Global 合规、商品资质、GPSR、治理属性、实拍图、资质上传、bg.compliance.edit、arbok cert、site=global 合规 时触发。","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.3K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s171g8b6m2khwdy9ye8bxj0wx183vd4z:linkfox-temu-compliance-global","sourceUrl":"https://clawhub.ai/linkfox-ai/linkfox-temu-compliance-global","homepage":"https://clawhub.ai/linkfox-ai/skills/linkfox-temu-compliance-global","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/linkfox-ai/linkfox-temu-compliance-global","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/linkfox-ai/skills/linkfox-temu-compliance-global","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"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-10T16:54:19.489Z","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-10T16:54:19.489Z","emptyReason":null},"stars":null,"forks":null,"downloads":1330,"packageName":null,"latestVersion":"1.0.6","tractionLabel":"1.3K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:54:19.489Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T16:54:19.489Z","lastCrawledAt":"2026-10-10T16:54:19.489Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T16:54:19.489Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.6","createdAt":"2026-08-14T15:13:16.184Z","changelog":"Update from 1.0.5 to 1.0.6","fileCount":42,"zipByteSize":56147},{"version":"1.0.5","createdAt":"2026-08-07T11:14:19.313Z","changelog":"Update from 1.0.4 to 1.0.5","fileCount":42,"zipByteSize":56674},{"version":"1.0.4","createdAt":"2026-07-13T12:31:38.764Z","changelog":"Update from 1.0.3 to 1.0.4","fileCount":40,"zipByteSize":47241},{"version":"1.0.3","createdAt":"2026-07-06T11:39:50.926Z","changelog":"Update from 1.0.2 to 1.0.3","fileCount":40,"zipByteSize":46634},{"version":"1.0.2","createdAt":"2026-07-03T09:39:37.728Z","changelog":"Update from 1.0.0 to 1.0.2","fileCount":39,"zipByteSize":45168},{"version":"1.0.0","createdAt":"2026-05-27T06:26:38.083Z","changelog":"Initial release","fileCount":40,"zipByteSize":43943}]},"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-compliance-global","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s171g8b6m2khwdy9ye8bxj0wx183vd4z:linkfox-temu-compliance-global` 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-compliance-global 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-compliance-global/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-compliance-global/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-compliance-global/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-compliance-global/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-compliance-global/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-compliance-global/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-10T21:53:41.083Z"}},"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-compliance-global/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-compliance-global/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-compliance-global/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-linkfox-ai-linkfox-temu-compliance-global/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-10T16:54:19.489Z","emptyReason":null},"readme":"Skill: Temu全球站-合规\n\nOwner: linkfox-ai\n\nSummary: Temu 全球站电商合规（Compliance）API，经 LinkFox 网关转发 Partner Global 合规相关 OpenAPI（bg.compliance.*、bg.arbok.open.*、bg.flash.open.* 等，共 9 个接口）。当用户提到 Temu Global 合规、商品资质、GPSR、治理属性、实拍图、资质上传、bg.compliance.edit、arbok cert、site=global 合规 时触发。\n\nTags: latest:1.0.6\n\nVersion history:\n\nv1.0.6 | 2026-08-14T15:13:16.184Z | user\n\nUpdate from 1.0.5 to 1.0.6\n\nv1.0.5 | 2026-08-07T11:14:19.313Z | user\n\nUpdate from 1.0.4 to 1.0.5\n\nv1.0.4 | 2026-07-13T12:31:38.764Z | user\n\nUpdate from 1.0.3 to 1.0.4\n\nv1.0.3 | 2026-07-06T11:39:50.926Z | user\n\nUpdate from 1.0.2 to 1.0.3\n\nv1.0.2 | 2026-07-03T09:39:37.728Z | user\n\nUpdate from 1.0.0 to 1.0.2\n\nv1.0.0 | 2026-05-27T06:26:38.083Z | user\n\nInitial release\n\nArchive index:\n\nArchive v1.0.6: 42 files, 56147 bytes\n\nFiles: references/access-token.md (4539b), references/api.md (3334b), references/apis/bg-arbok-open-cert-query-need-upload-items.md (3788b), references/apis/bg-arbok-open-cert-upload-product-cert.md (15409b), references/apis/bg-arbok-open-product-cert-query.md (3567b), references/apis/bg-arbok-open-upload-upload-file.md (2518b), references/apis/bg-compliance-edit.md (9751b), references/apis/bg-compliance-metadata-get.md (9792b), references/apis/bg-flash-open-upload-real-image.md (2798b), references/apis/bg-flash-open-upload-recognize.md (3949b), references/apis/bg-goods-compliancelabel-get.md (3747b), references/apis/README.md (1700b), references/authorization-flow.md (1186b), references/onboarding.md (2046b), references/partner-global-catalog.md (4602b), scripts/_global_compliance_script.py (455b), scripts/_temu_auth_guide.py (6198b), scripts/_temu_common.py (12435b), scripts/_temu_global_common.py (3123b), scripts/_temu_token_store.py (4273b), scripts/check_linkfox_token.py (1798b), scripts/get_temu_access_token.py (1843b), scripts/global_compliance_arbok_cert_query_need_upload_items.py (315b), scripts/global_compliance_arbok_cert_upload_product_cert.py (299b), scripts/global_compliance_arbok_product_cert_query.py (285b), scripts/global_compliance_arbok_upload_upload_file.py (283b), scripts/global_compliance_edit.py (231b), scripts/global_compliance_flash_upload_real_image.py (290b), scripts/global_compliance_flash_upload_recognize.py (284b), scripts/global_compliance_goods_compliancelabel_get.py (278b), scripts/global_compliance_metadata_get.py (270b), scripts/list_temu_access_tokens.py (652b), scripts/onboarding.py (24089b), scripts/save_temu_access_token.py (1377b), scripts/temu_file_download.py (1621b), scripts/temu_global_file_download.py (688b), scripts/temu_global_proxy.py (869b), scripts/temu_proxy.py (2053b), scripts/temu_token_guide.py (1594b), skill-card.md (2843b), SKILL.md (5096b), _meta.json (149b)\n\nFile v1.0.6:SKILL.md\n\n---\nname: linkfox-temu-compliance-global\ndescription: Temu 全球站电商合规（Compliance）API，经 LinkFox 网关转发 Partner Global 合规相关 OpenAPI（bg.compliance.*、bg.arbok.open.*、bg.flash.open.* 等，共 9 个接口）。当用户提到 Temu Global 合规、商品资质、GPSR、治理属性、实拍图、资质上传、bg.compliance.edit、arbok cert、site=global 合规 时触发。\n---\n\n# Temu 全球站 — 电商合规（Compliance）\n\n本 skill（`linkfox-temu-compliance-global`）覆盖 Partner Platform for **Global** 的 **电商合规 / Product Compliance** 相关 OpenAPI。\n\n已接入 **9** 个接口，清单见 [partner-global-catalog.md](./references/partner-global-catalog.md)。\n\n**网关（本 skill 内置）**：\n\n| 能力 | 方法 | 路径 |\n|------|------|------|\n| 合规 OpenAPI（`global_compliance_*`、`temu_global_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-compliance-global`** |\n| 商品列表/详情/编辑/库存 | `linkfox-temu-manage-product-global` |\n| 价格 | `linkfox-temu-price-global` |\n| 促销 | `linkfox-temu-promotion-global` |\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## API 文档\n\n| 文档 | 内容 |\n|------|------|\n| [api.md](./references/api.md) | 网关、鉴权、错误码 |\n| [partner-global-catalog.md](./references/partner-global-catalog.md) | 接口目录 |\n| [apis/README.md](./references/apis/README.md) | 分接口文档 |\n\n## 默认参数\n\n| 字段 | 默认 | 说明 |\n|------|------|------|\n| site | `global` | Partner Global |\n| managementType | `semi-managed` | 半托管 |\n| tokenPurpose | `product-inventory` | 商品/合规场景 |\n\n## Scripts（按 type）\n\n| 脚本 | type | 状态 |\n|------|------|------|\n| `global_compliance_edit.py` | `bg.compliance.edit` | 已接入 |\n| `global_compliance_metadata_get.py` | `bg.compliance.metadata.get` | 已接入 |\n| `global_compliance_goods_compliancelabel_get.py` | `bg.goods.compliancelabel.get` | 已接入 |\n| `global_compliance_arbok_cert_query_need_upload_items.py` | `bg.arbok.open.cert.queryNeedUploadItems` | 已接入 |\n| `global_compliance_arbok_cert_upload_product_cert.py` | `bg.arbok.open.cert.uploadProductCert` | 已接入 |\n| `global_compliance_flash_upload_recognize.py` | `bg.flash.open.upload.recognize` | 已接入 |\n| `global_compliance_flash_upload_real_image.py` | `bg.flash.open.upload.real.image` | 已接入 |\n| `global_compliance_arbok_upload_upload_file.py` | `bg.arbok.open.upload.uploadFile` | 已接入 |\n| `global_compliance_arbok_product_cert_query.py` | `bg.arbok.open.product.cert.query` | 已接入 |\n| `temu_global_proxy.py` | 任意 `type` | 通用 |\n| `temu_global_file_download.py` | 加签文件下载 | 通用 |\n\n## 示例\n\n```bash\npython scripts/global_compliance_edit.py '<JSON>'  # bg.compliance.edit\n```\n\n```bash\npython scripts/global_compliance_metadata_get.py '<JSON>'  # bg.compliance.metadata.get\n```\n\n**Feedback：** `skillName`：`linkfox-temu-compliance-global`\n\n## 网关与授权脚本\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# Compliance API 文档索引（Global）\n\n按 Temu `type` 分文件；入参来自 Partner **Request** 表，出参来自 **Response** 表 + **Response Example** 展开。\n\n## 已接入（9）\n\n| type | 文档 | 脚本 |\n|------|------|------|\n| `bg.compliance.edit` | [bg-compliance-edit.md](./bg-compliance-edit.md) | `global_compliance_edit.py` |\n| `bg.compliance.metadata.get` | [bg-compliance-metadata-get.md](./bg-compliance-metadata-get.md) | `global_compliance_metadata_get.py` |\n| `bg.goods.compliancelabel.get` | [bg-goods-compliancelabel-get.md](./bg-goods-compliancelabel-get.md) | `global_compliance_goods_compliancelabel_get.py` |\n| `bg.arbok.open.cert.queryNeedUploadItems` | [bg-arbok-open-cert-query-need-upload-items.md](./bg-arbok-open-cert-query-need-upload-items.md) | `global_compliance_arbok_cert_query_need_upload_items.py` |\n| `bg.arbok.open.cert.uploadProductCert` | [bg-arbok-open-cert-upload-product-cert.md](./bg-arbok-open-cert-upload-product-cert.md) | `global_compliance_arbok_cert_upload_product_cert.py` |\n| `bg.flash.open.upload.recognize` | [bg-flash-open-upload-recognize.md](./bg-flash-open-upload-recognize.md) | `global_compliance_flash_upload_recognize.py` |\n| `bg.flash.open.upload.real.image` | [bg-flash-open-upload-real-image.md](./bg-flash-open-upload-real-image.md) | `global_compliance_flash_upload_real_image.py` |\n| `bg.arbok.open.upload.uploadFile` | [bg-arbok-open-upload-upload-file.md](./bg-arbok-open-upload-upload-file.md) | `global_compliance_arbok_upload_upload_file.py` |\n| `bg.arbok.open.product.cert.query` | [bg-arbok-open-product-cert-query.md](./bg-arbok-open-product-cert-query.md) | `global_compliance_arbok_product_cert_query.py` |\n\nFile v1.0.6:_meta.json\n\n{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-temu-compliance-global\",\n  \"version\": \"1.0.6\",\n  \"publishedAt\": 1786720396184\n}\n\nFile v1.0.6: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）（如未配置 按 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=global` / `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-global.temu.com |\n| global | 全球区 | openapi-b-global.temu.com |\n| eu | 全球站 | openapi-b-global.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-compliance-global — API 参考\n\nTemu **全球站电商合规**（Partner Global **Product Compliance / 商品合规**），经本 skill `temu_global_proxy`（`POST /temu/proxy`）转发。Temu 的 `type` 写在 Body，**不是** URL 路径。\n\n> 网关与鉴权：本 skill `scripts/`（`LINKFOXAGENT_API_KEY`、`accessToken` / `storeKey`）。授权见 `references/access-token.md`。\n\n---\n\n## 调用规范\n\n| 项 | 说明 |\n|----|------|\n| 网关根地址 | `${LINKFOX_TOOL_GATEWAY}`（可用 `TEMU_API_BASE_URL` / `STORE_API_BASE_URL` 覆盖） |\n| 合规 OpenAPI | `POST /temu/proxy` |\n| 加签文件下载 | `POST /temu/fileDownload`（`temu_global_file_download.py`） |\n| LinkFox 鉴权 | Header **`Authorization`** 与 **`Token`**（同值）；或 `LINKFOX_AGENT_API_KEY` / `LINKFOXAGENT_API_KEY`；或 JSON `token`（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理） |\n| Temu 鉴权 | Body `accessToken`，或 `storeKey` + `site` + `managementType` + `tokenPurpose` |\n| 默认 | `site=global`，`managementType=semi-managed`，`tokenPurpose=product-inventory` |\n| 上游 OpenAPI（Global） | `https://openapi-b-global.temu.com/openapi/router`（网关按 `site` 解析） |\n\n### 网关请求 Body（`/temu/proxy`）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| site | string | 是 | `global`（本 skill 默认） |\n| managementType | string | 是 | `semi-managed` |\n| accessToken | string | 与 storeKey 二选一 | Temu 店铺令牌 |\n| storeKey | string | 与 accessToken 二选一 | `~/.linkfox/temu-access-tokens.json` 中的键 |\n| tokenPurpose | string | 否 | 建议 `product-inventory` |\n| type | string | 是 | Temu 接口名（以 Partner Compliance 文档为准） |\n| params | object | 否 | 业务参数，见各接口文档 |\n\n### 网关响应\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| body | string | Temu 原始 JSON 字符串；脚本解析为 `temuBody` |\n| code | integer | 网关错误码：`1002` 参数/Token，`1003` 转发失败 |\n\n解析顺序：**网关 `code`** → `JSON.parse(body)` → `success` / `errorCode` / `errorMsg` / `result`。\n\n### 脚本调用\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/temu_global_proxy.py '{\"accessToken\":\"TOKEN\",\"site\":\"global\",\"type\":\"<TEMU_API_TYPE>\",\"params\":{}}'\n```\n\n业务字段放在 `params`（或各 `global_compliance_*.py` 脚本约定的 `request` 结构，接入后以接口文档为准）。\n\n---\n\n## 接口一览\n\n完整 `sub_menu_code` 与 Partner 文档 URL 见 [partner-global-catalog.md](./partner-global-catalog.md)。\n\n**每个接口单独一份文档**：[apis/README.md](./apis/README.md)。\n\n---\n\n## 典型合规流程\n\n（待按 Partner Global Compliance 菜单接入后补充。）\n\n商品详情、类目属性等辅助查询可用 **`linkfox-temu-manage-product-global`** 对应接口。\n\n---\n\n## 网关错误码\n\n| code | 说明 | 处理 |\n|------|------|------|\n| 1002 | 参数或 LinkFox Token 无效 | 修正参数与 `LINKFOXAGENT_API_KEY` |\n| 1003 | 转发失败 | 检查 Temu token、白名单、网络 |\n| 402 | HTTP 402 | 按 SKILL.md 的 **## 解决认证和积分问题** 处理。 |\n\n---\n\n## Feedback API\n\n- **POST** `https://skill-api.linkfox.com/api/v1/public/feedback`\n- `skillName`: **`linkfox-temu-compliance-global`**\n\nFile v1.0.6:references/apis/bg-arbok-open-cert-query-need-upload-items.md\n\n# 待上传资质项查询 — `bg.arbok.open.cert.queryNeedUploadItems`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_arbok_cert_query_need_upload_items.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=84d3118d3a604947abf35144606cdea2 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.arbok.open.cert.queryNeedUploadItems`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query certification items that need to be uploaded for a product.\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── certType (INTEGER **必填**)\n    └── productId (LONG **必填**)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| certType | INTEGER | **是** | certType |\n| productId | LONG | **是** | productId |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"certType\": 1,\n    \"productId\": 1\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n    ├── certNeedUploadItems[] (OBJECT[])\n    ├── certNeedUploadItems[].aliasName (STRING)\n    ├── certNeedUploadItems[].contentType (INTEGER)\n    ├── certNeedUploadItems[].expireDays (INTEGER)\n    ├── certNeedUploadItems[].expireNoticeDays (INTEGER)\n    ├── certNeedUploadItems[].expireTime (INTEGER)\n    ├── certNeedUploadItems[].expireType (INTEGER)\n    ├── certNeedUploadItems[].hasExpireTime (BOOLEAN)\n    ├── certNeedUploadItems[].needShowCustomer (BOOLEAN)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| certNeedUploadItems[] | OBJECT[] | Partner Response Example |\n| certNeedUploadItems[].aliasName | STRING | Partner Response Example |\n| certNeedUploadItems[].contentType | INTEGER | Partner Response Example |\n| certNeedUploadItems[].expireDays | INTEGER | Partner Response Example |\n| certNeedUploadItems[].expireNoticeDays | INTEGER | Partner Response Example |\n| certNeedUploadItems[].expireTime | INTEGER | Partner Response Example |\n| certNeedUploadItems[].expireType | INTEGER | Partner Response Example |\n| certNeedUploadItems[].hasExpireTime | BOOLEAN | Partner Response Example |\n| certNeedUploadItems[].needShowCustomer | BOOLEAN | Partner Response Example |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_arbok_cert_query_need_upload_items.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"certType\": 1,     \"productId\": 1   } }'\n```\n\nFile v1.0.6:references/apis/bg-arbok-open-cert-upload-product-cert.md\n\n# 上传商品资质 — `bg.arbok.open.cert.uploadProductCert`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_arbok_cert_upload_product_cert.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=56de04bcafae45509b21edeab57c9fdb |\n| **网关** | `POST /temu/proxy`，`type`=`bg.arbok.open.cert.uploadProductCert`，业务载荷放在 Body 的 `params` |\n\n**Description:** Upload product certification / qualification documents.\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── productCatCertReqList (OBJECT[])\n    └── productCatCertReqList[].authCode (STRING)\n    └── productCatCertReqList[].authCodes (OBJECT[])\n    └── productCatCertReqList[].authCodes[].authCode (STRING)\n    └── productCatCertReqList[].authCodes[].effectiveTime (INTEGER)\n    └── productCatCertReqList[].authCodes[].expireTime (INTEGER)\n    └── productCatCertReqList[].authCodes[].fileName (STRING)\n    └── productCatCertReqList[].authCodes[].fileUrl (STRING)\n    └── productCatCertReqList[].authCodes[].showCustomer (BOOLEAN)\n    └── productCatCertReqList[].certType (INTEGER)\n    └── productCatCertReqList[].inspectReportFiles (OBJECT[])\n    └── productCatCertReqList[].inspectReportFiles[].authCode (STRING)\n    └── productCatCertReqList[].inspectReportFiles[].effectiveTime (INTEGER)\n    └── productCatCertReqList[].inspectReportFiles[].expireTime (INTEGER)\n    └── productCatCertReqList[].inspectReportFiles[].fileName (STRING)\n    └── productCatCertReqList[].inspectReportFiles[].fileUrl (STRING)\n    └── productCatCertReqList[].inspectReportFiles[].showCustomer (BOOLEAN)\n    └── productCatCertReqList[].productCertFiles (OBJECT[])\n    └── productCatCertReqList[].productCertFiles[].authCode (STRING)\n    └── productCatCertReqList[].productCertFiles[].effectiveTime (INTEGER)\n    └── productCatCertReqList[].productCertFiles[].expireTime (INTEGER)\n    └── productCatCertReqList[].productCertFiles[].fileName (STRING)\n    └── productCatCertReqList[].productCertFiles[].fileUrl (STRING)\n    └── productCatCertReqList[].productCertFiles[].showCustomer (BOOLEAN)\n    └── productCatCertReqList[].supplementaryMaterials (OBJECT[])\n    └── productCatCertReqList[].supplementaryMaterials[].authCode (STRING)\n    └── productCatCertReqList[].supplementaryMaterials[].effectiveTime (INTEGER)\n    └── productCatCertReqList[].supplementaryMaterials[].expireTime (INTEGER)\n    └── productCatCertReqList[].supplementaryMaterials[].fileName (STRING)\n    └── productCatCertReqList[].supplementaryMaterials[].fileUrl (STRING)\n    └── productCatCertReqList[].supplementaryMaterials[].showCustomer (BOOLEAN)\n    └── productId (LONG **必填**)\n    └── realPictures (OBJECT[])\n    └── realPictures[].imageUrl (STRING)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| productCatCertReqList | OBJECT[] | 否 | productCatCertReqList |\n| productCatCertReqList[].authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].certType | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productId | LONG | **是** | productId |\n| realPictures | OBJECT[] | 否 | realPictures |\n| realPictures[].imageUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `productCatCertReqList[].authCodes[]`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `productCatCertReqList[].inspectReportFiles[]`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `productCatCertReqList[].productCertFiles[]`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `productCatCertReqList[].supplementaryMaterials[]`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"productId\": 1,\n    \"productCatCertReqList\": [\n      {\n        \"authCodes\": [\n          {\n            \"fileName\": \"test\",\n            \"fileUrl\": \"test\",\n            \"showCustomer\": true,\n            \"expireTime\": 1,\n            \"authCode\": \"test\",\n            \"effectiveTime\": 1\n          }\n        ],\n        \"productCertFiles\": [\n          {\n            \"fileName\": \"test\",\n            \"fileUrl\": \"test\",\n            \"showCustomer\": true,\n            \"expireTime\": 1,\n            \"authCode\": \"test\",\n            \"effectiveTime\": 1\n          }\n        ],\n        \"supplementaryMaterials\": [\n          {\n            \"fileName\": \"test\",\n            \"fileUrl\": \"test\",\n            \"showCustomer\": true,\n            \"expireTime\": 1,\n            \"authCode\": \"test\",\n            \"effectiveTime\": 1\n          }\n        ],\n        \"certType\": 1,\n        \"inspectReportFiles\": [\n          {\n            \"fileName\": \"test\",\n            \"fileUrl\": \"test\",\n            \"showCustomer\": true,\n            \"expireTime\": 1,\n            \"authCode\": \"test\",\n            \"effectiveTime\": 1\n          }\n        ],\n        \"authCode\": \"test\"\n      }\n    ],\n    \"realPictures\": [\n      {\n        \"imageUrl\": \"test\"\n      }\n    ]\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_arbok_cert_upload_product_cert.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"productId\": 1,     \"productCatCertReqList\": [       {         \"authCodes\": [           {             \"fileName\": \"test\",             \"fileUrl\": \"test\",             \"showCustomer\": true,             \"expireTime\": 1,             \"authCode\": \"test\",             \"effectiveTime\": 1           }         ],         \"productCertFiles\": [           {             \"fileName\": \"test\",             \"fileUrl\": \"test\",             \"showCustomer\": true,             \"expireTime\": 1,             \"authCode\": \"test\",             \"effectiveTime\": 1           }         ],         \"supplementaryMaterials\": [           {             \"fileName\": \"test\",             \"fileUrl\": \"test\",             \"showCustomer\": true,             \"expireTime\": 1,             \"authCode\": \"test\",             \"effectiveTime\": 1           }         ],         \"certType\": 1,         \"inspectReportFiles\": [           {             \"fileName\": \"test\",             \"fileUrl\": \"test\",             \"showCustomer\": true,             \"expireTime\": 1,             \"authCode\": \"test\",             \"effectiveTime\": 1           }         ],         \"authCode\": \"test\"       }     ],     \"realPictures\": [       {         \"imageUrl\": \"test\"       }     ]   } }'\n```\n\nFile v1.0.6:references/apis/bg-arbok-open-product-cert-query.md\n\n# 商品资质查询 — `bg.arbok.open.product.cert.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_arbok_product_cert_query.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=5ec78e3b36c34fcba743a75523349fb5 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.arbok.open.product.cert.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query product certification / qualification information.\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── certTypeList (INTEGER[])\n    └── language (STRING)\n    └── productId (LONG **必填**)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| certTypeList | INTEGER[] | 否 | certTypeList |\n| language | STRING | 否 | language |\n| productId | LONG | **是** | productId |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"productId\": 1,\n    \"certTypeList\": [\n      1,\n      1\n    ],\n    \"language\": \"test\"\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n    ├── productCertList[] (OBJECT[])\n    ├── productCertList[].auditStatus (INTEGER)\n    ├── productCertList[].certName (STRING)\n    ├── productCertList[].certType (INTEGER)\n    ├── productCertList[].rejectReason (STRING)\n    ├── productCertList[].updateReason (STRING)\n    ├── productCertList[].updateStatus (INTEGER)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| productCertList[] | OBJECT[] | Partner Response Example |\n| productCertList[].auditStatus | INTEGER | Partner Response Example |\n| productCertList[].certName | STRING | Partner Response Example |\n| productCertList[].certType | INTEGER | Partner Response Example |\n| productCertList[].rejectReason | STRING | Partner Response Example |\n| productCertList[].updateReason | STRING | Partner Response Example |\n| productCertList[].updateStatus | INTEGER | Partner Response Example |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_arbok_product_cert_query.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"productId\": 1,     \"certTypeList\": [       1,       1     ],     \"language\": \"test\"   } }'\n```\n\nFile v1.0.6:references/apis/bg-arbok-open-upload-upload-file.md\n\n# 合规文件上传 — `bg.arbok.open.upload.uploadFile`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_arbok_upload_upload_file.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=01b8792d2e4a40f7b3b14f4a1f2711b6 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.arbok.open.upload.uploadFile`，业务载荷放在 Body 的 `params` |\n\n**Description:** Upload compliance-related files (base64) via Arbok open API.\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── base64File (STRING **必填**)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| base64File | STRING | **是** | base64File |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"base64File\": \"test\"\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n    ├── url (STRING)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n| url | STRING | Partner Response Example |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_arbok_upload_upload_file.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"base64File\": \"test\"   } }'\n```\n\nFile v1.0.6:references/apis/bg-compliance-edit.md\n\n# 合规编辑 — `bg.compliance.edit`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_edit.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=a8829c8ede574d9a97cd3cea7c019bc4 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.compliance.edit`，业务载荷放在 Body 的 `params` |\n\n**Description:** Edit product compliance information (governance attributes, GPSR, certificates, etc.).\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── editReqList (OBJECT[] **必填**)\n    └── editReqList[].complianceType (INTEGER)\n    └── editReqList[].inputText (OBJECT)\n    └── editReqList[].inputText.$key (STRING)\n    └── editReqList[].inputText.$value (OBJECT)\n    └── editReqList[].inputText.$value.lang (OBJECT)\n    └── editReqList[].inputText.$value.lang.$key (STRING)\n    └── editReqList[].inputText.$value.lang.$value (STRING)\n    └── editReqList[].inputText.$value.multiLineInputs (OBJECT[])\n    └── editReqList[].inputText.$value.multiLineInputs[].lang (OBJECT)\n    └── editReqList[].inputText.$value.multiLineInputs[].lang.$key (STRING)\n    └── editReqList[].inputText.$value.multiLineInputs[].lang.$value (STRING)\n    └── editReqList[].inputText.$value.multiLineInputs[].name (STRING)\n    └── editReqList[].inputText.$value.name (STRING)\n    └── editReqList[].properties (OBJECT)\n    └── editReqList[].properties.$key (STRING)\n    └── editReqList[].properties.$value (INTEGER[])\n    └── editReqList[].repList (OBJECT[])\n    └── editReqList[].repList[].repId (INTEGER)\n    └── productId (LONG **必填**)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| editReqList | OBJECT[] | **是** | edit single compliance req list |\n| editReqList[].complianceType | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.lang | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.lang.$key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.lang.$value | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.multiLineInputs | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.multiLineInputs[].lang | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.multiLineInputs[].lang.$key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.multiLineInputs[].lang.$value | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.multiLineInputs[].name | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.name | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].properties | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].properties.$key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].properties.$value | INTEGER[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].repList | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].repList[].repId | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productId | LONG | **是** | product id |\n\n#### `editReqList[].inputText`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| $key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| $value | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `editReqList[].inputText.$value`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| lang | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| multiLineInputs | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| name | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `editReqList[].inputText.$value.lang`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| $key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| $value | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `editReqList[].inputText.$value.multiLineInputs[]`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| lang | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| name | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `editReqList[].inputText.$value.multiLineInputs[].lang`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| $key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| $value | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `editReqList[].properties`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| $key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| $value | INTEGER[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"productId\": 1,\n    \"editReqList\": [\n      {\n        \"inputText\": {\n          \"$key\": \"test\",\n          \"$value\": {\n            \"name\": \"test\",\n            \"lang\": {\n              \"$key\": \"test\",\n              \"$value\": \"test\"\n            },\n            \"multiLineInputs\": [\n              {\n                \"name\": \"test\",\n                \"lang\": {\n                  \"$key\": \"test\",\n                  \"$value\": \"test\"\n                }\n              }\n            ]\n          }\n        },\n        \"repList\": [\n          {\n            \"repId\": 1\n          }\n        ],\n        \"properties\": {\n          \"$key\": \"test\",\n          \"$value\": [\n            1,\n            1\n          ]\n        },\n        \"complianceType\": 1\n      }\n    ]\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | errorCode |\n| errorMsg | STRING | errorMsg |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| errorCode | INTEGER | errorCode |\n| errorMsg | STRING | errorMsg |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_edit.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"productId\": 1,     \"editReqList\": [       {         \"inputText\": {           \"$key\": \"test\",           \"$value\": {             \"name\": \"test\",             \"lang\": {               \"$key\": \"test\",               \"$value\": \"test\"             },             \"multiLineInputs\": [               {                 \"name\": \"test\",                 \"lang\": {                   \"$key\": \"test\",                   \"$value\": \"test\"                 }               }             ]           }         },         \"repList\": [           {             \"repId\": 1           }         ],         \"properties\": {           \"$key\": \"test\",           \"$value\": [             1,             1           ]         },         \"complianceType\": 1       }     ]   } }'\n```\n\nFile v1.0.6:references/apis/bg-compliance-metadata-get.md\n\n# 合规模板元数据查询 — `bg.compliance.metadata.get`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_metadata_get.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=fd12bdf5cb364366bdef85aad9cd8e48 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.compliance.metadata.get`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query compliance metadata / template definitions for a product.\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── productId (LONG **必填**)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| productId | LONG | **是** | product id |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"productId\": 1\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n    ├── complianceInfoList[] (OBJECT[])\n    ├── complianceInfoList[].complianceType (INTEGER)\n    ├── complianceInfoList[].desc (STRING)\n    ├── complianceInfoList[].name (STRING)\n    ├── complianceInfoList[].propertyList[] (OBJECT[])\n    ├── complianceInfoList[].propertyList[].controlType (INTEGER)\n    ├── complianceInfoList[].propertyList[].desc (STRING)\n    ├── complianceInfoList[].propertyList[].excludeVidMap (OBJECT)\n    ├── complianceInfoList[].propertyList[].excludeVidMap.$key (STRING)\n    ├── complianceInfoList[].propertyList[].excludeVidMap.$value[] (INTEGER[])\n    ├── complianceInfoList[].propertyList[].inputNum (INTEGER)\n    ├── complianceInfoList[].propertyList[].inputType (INTEGER)\n    ├── complianceInfoList[].propertyList[].langDescMap (OBJECT)\n    ├── complianceInfoList[].propertyList[].langDescMap.$key (STRING)\n    ├── complianceInfoList[].propertyList[].langDescMap.$value (STRING)\n    ├── complianceInfoList[].propertyList[].max (INTEGER)\n    ├── complianceInfoList[].propertyList[].min (INTEGER)\n    ├── complianceInfoList[].propertyList[].needTransLang[] (STRING[])\n    ├── complianceInfoList[].propertyList[].parentPid (INTEGER)\n    ├── complianceInfoList[].propertyList[].parentVidList[] (INTEGER[])\n    ├── complianceInfoList[].propertyList[].propertyId (INTEGER)\n    ├── complianceInfoList[].propertyList[].propertyName (STRING)\n    ├── complianceInfoList[].propertyList[].propertyValueList[] (OBJECT[])\n    ├── complianceInfoList[].propertyList[].propertyValueList[].langValueNameMap (OBJECT)\n    ├── complianceInfoList[].propertyList[].propertyValueList[].langValueNameMap.$key (STRING)\n    ├── complianceInfoList[].propertyList[].propertyValueList[].langValueNameMap.$value (STRING)\n    ├── complianceInfoList[].propertyList[].propertyValueList[].parentVidList[] (INTEGER[])\n    ├── complianceInfoList[].propertyList[].propertyValueList[].valueName (STRING)\n    ├── complianceInfoList[].propertyList[].propertyValueList[].vid (INTEGER)\n    ├── complianceInfoList[].propertyList[].selectNum (INTEGER)\n    ├── complianceInfoList[].propertyList[].unit (STRING)\n    ├── complianceInfoList[].propertyList[].valuePrecision (INTEGER)\n    ├── complianceInfoList[].repDetailList[] (OBJECT[])\n    ├── complianceInfoList[].repDetailList[].endTimestamp (INTEGER)\n    ├── complianceInfoList[].repDetailList[].personType (INTEGER)\n    ├── complianceInfoList[].repDetailList[].repAddressInfo (OBJECT)\n    ├── complianceInfoList[].repDetailList[].repAddressInfo.addressLineOne (STRING)\n    ├── complianceInfoList[].repDetailList[].repAddressInfo.city (STRING)\n    ├── complianceInfoList[].repDetailList[].repAddressInfo.regionName (STRING)\n    ├── complianceInfoList[].repDetailList[].repAddressInfo.stateName (STRING)\n    ├── complianceInfoList[].repDetailList[].repId (INTEGER)\n    ├── complianceInfoList[].repDetailList[].repName (STRING)\n    ├── complianceInfoList[].repDetailList[].repStatus (INTEGER)\n    ├── complianceInfoList[].repDetailList[].startTimestamp (INTEGER)\n    ├── complianceInfoList[].status (INTEGER)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | errorCode |\n| errorMsg | STRING | errorMsg |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| complianceInfoList[] | OBJECT[] | Partner Response Example |\n| complianceInfoList[].complianceType | INTEGER | Partner Response Example |\n| complianceInfoList[].desc | STRING | Partner Response Example |\n| complianceInfoList[].name | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[] | OBJECT[] | Partner Response Example |\n| complianceInfoList[].propertyList[].controlType | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].desc | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].excludeVidMap | OBJECT | Partner Response Example |\n| complianceInfoList[].propertyList[].excludeVidMap.$key | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].excludeVidMap.$value[] | INTEGER[] | Partner Response Example |\n| complianceInfoList[].propertyList[].inputNum | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].inputType | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].langDescMap | OBJECT | Partner Response Example |\n| complianceInfoList[].propertyList[].langDescMap.$key | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].langDescMap.$value | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].max | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].min | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].needTransLang[] | STRING[] | Partner Response Example |\n| complianceInfoList[].propertyList[].parentPid | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].parentVidList[] | INTEGER[] | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyId | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyName | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyValueList[] | OBJECT[] | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyValueList[].langValueNameMap | OBJECT | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyValueList[].langValueNameMap.$key | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyValueList[].langValueNameMap.$value | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyValueList[].parentVidList[] | INTEGER[] | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyValueList[].valueName | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyValueList[].vid | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].selectNum | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].unit | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].valuePrecision | INTEGER | Partner Response Example |\n| complianceInfoList[].repDetailList[] | OBJECT[] | Partner Response Example |\n| complianceInfoList[].repDetailList[].endTimestamp | INTEGER | Partner Response Example |\n| complianceInfoList[].repDetailList[].personType | INTEGER | Partner Response Example |\n| complianceInfoList[].repDetailList[].repAddressInfo | OBJECT | Partner Response Example |\n| complianceInfoList[].repDetailList[].repAddressInfo.addressLineOne | STRING | Partner Response Example |\n| complianceInfoList[].repDetailList[].repAddressInfo.city | STRING | Partner Response Example |\n| complianceInfoList[].repDetailList[].repAddressInfo.regionName | STRING | Partner Response Example |\n| complianceInfoList[].repDetailList[].repAddressInfo.stateName | STRING | Partner Response Example |\n| complianceInfoList[].repDetailList[].repId | INTEGER | Partner Response Example |\n| complianceInfoList[].repDetailList[].repName | STRING | Partner Response Example |\n| complianceInfoList[].repDetailList[].repStatus | INTEGER | Partner Response Example |\n| complianceInfoList[].repDetailList[].startTimestamp | INTEGER | Partner Response Example |\n| complianceInfoList[].status | INTEGER | Partner Response Example |\n| errorCode | INTEGER | errorCode |\n| errorMsg | STRING | errorMsg |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_metadata_get.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"productId\": 1   } }'\n```\n\nFile v1.0.6:references/apis/bg-flash-open-upload-real-image.md\n\n# 实拍图上传（Flash） — `bg.flash.open.upload.real.image`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_flash_upload_real_image.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=ef77dada37ac49569f6e7c787dd696d9 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.flash.open.upload.real.image`，业务载荷放在 Body 的 `params` |\n\n**Description:** Upload real product images for compliance verification (Flash open API).\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── clientId (STRING)\n    └── image (STRING)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| clientId | STRING | 否 | Kaiping clientId |\n| image | STRING | 否 | Supported formats include: jpg/jpeg, png and other image formats. Note that the input image must be transcoded into base64 encoding. |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"image\": \"test\",\n    \"clientId\": \"test\"\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n    ├── url (STRING)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| result | OBJECT | Return to detailed information |\n| success | BOOLEAN | success |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | Return to detailed information |\n| success | BOOLEAN | success |\n| url | STRING | Partner Response Example |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_flash_upload_real_image.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"image\": \"test\",     \"clientId\": \"test\"   } }'\n```\n\nArchive v1.0.5: 42 files, 56674 bytes\n\nFiles: references/access-token.md (4539b), references/api.md (3334b), references/apis/bg-arbok-open-cert-query-need-upload-items.md (3788b), references/apis/bg-arbok-open-cert-upload-product-cert.md (15409b), references/apis/bg-arbok-open-product-cert-query.md (3567b), references/apis/bg-arbok-open-upload-upload-file.md (2518b), references/apis/bg-compliance-edit.md (9751b), references/apis/bg-compliance-metadata-get.md (9792b), references/apis/bg-flash-open-upload-real-image.md (2798b), references/apis/bg-flash-open-upload-recognize.md (3949b), references/apis/bg-goods-compliancelabel-get.md (3747b), references/apis/README.md (1700b), references/authorization-flow.md (1186b), references/onboarding.md (2046b), references/partner-global-catalog.md (4602b), scripts/_global_compliance_script.py (455b), scripts/_temu_auth_guide.py (6198b), scripts/_temu_common.py (12434b), scripts/_temu_global_common.py (3122b), scripts/_temu_token_store.py (4273b), scripts/check_linkfox_token.py (1797b), scripts/get_temu_access_token.py (1843b), scripts/global_compliance_arbok_cert_query_need_upload_items.py (315b), scripts/global_compliance_arbok_cert_upload_product_cert.py (299b), scripts/global_compliance_arbok_product_cert_query.py (285b), scripts/global_compliance_arbok_upload_upload_file.py (283b), scripts/global_compliance_edit.py (231b), scripts/global_compliance_flash_upload_real_image.py (290b), scripts/global_compliance_flash_upload_recognize.py (284b), scripts/global_compliance_goods_compliancelabel_get.py (278b), scripts/global_compliance_metadata_get.py (270b), scripts/list_temu_access_tokens.py (652b), scripts/onboarding.py (24089b), scripts/save_temu_access_token.py (1377b), scripts/temu_file_download.py (1621b), scripts/temu_global_file_download.py (688b), scripts/temu_global_proxy.py (869b), scripts/temu_proxy.py (2053b), scripts/temu_token_guide.py (1594b), skill-card.md (3796b), SKILL.md (5096b), _meta.json (149b)\n\nFile v1.0.5:SKILL.md\n\n---\nname: linkfox-temu-compliance-global\ndescription: Temu 全球站电商合规（Compliance）API，经 LinkFox 网关转发 Partner Global 合规相关 OpenAPI（bg.compliance.*、bg.arbok.open.*、bg.flash.open.* 等，共 9 个接口）。当用户提到 Temu Global 合规、商品资质、GPSR、治理属性、实拍图、资质上传、bg.compliance.edit、arbok cert、site=global 合规 时触发。\n---\n\n# Temu 全球站 — 电商合规（Compliance）\n\n本 skill（`linkfox-temu-compliance-global`）覆盖 Partner Platform for **Global** 的 **电商合规 / Product Compliance** 相关 OpenAPI。\n\n已接入 **9** 个接口，清单见 [partner-global-catalog.md](./references/partner-global-catalog.md)。\n\n**网关（本 skill 内置）**：\n\n| 能力 | 方法 | 路径 |\n|------|------|------|\n| 合规 OpenAPI（`global_compliance_*`、`temu_global_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-compliance-global`** |\n| 商品列表/详情/编辑/库存 | `linkfox-temu-manage-product-global` |\n| 价格 | `linkfox-temu-price-global` |\n| 促销 | `linkfox-temu-promotion-global` |\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## API 文档\n\n| 文档 | 内容 |\n|------|------|\n| [api.md](./references/api.md) | 网关、鉴权、错误码 |\n| [partner-global-catalog.md](./references/partner-global-catalog.md) | 接口目录 |\n| [apis/README.md](./references/apis/README.md) | 分接口文档 |\n\n## 默认参数\n\n| 字段 | 默认 | 说明 |\n|------|------|------|\n| site | `global` | Partner Global |\n| managementType | `semi-managed` | 半托管 |\n| tokenPurpose | `product-inventory` | 商品/合规场景 |\n\n## Scripts（按 type）\n\n| 脚本 | type | 状态 |\n|------|------|------|\n| `global_compliance_edit.py` | `bg.compliance.edit` | 已接入 |\n| `global_compliance_metadata_get.py` | `bg.compliance.metadata.get` | 已接入 |\n| `global_compliance_goods_compliancelabel_get.py` | `bg.goods.compliancelabel.get` | 已接入 |\n| `global_compliance_arbok_cert_query_need_upload_items.py` | `bg.arbok.open.cert.queryNeedUploadItems` | 已接入 |\n| `global_compliance_arbok_cert_upload_product_cert.py` | `bg.arbok.open.cert.uploadProductCert` | 已接入 |\n| `global_compliance_flash_upload_recognize.py` | `bg.flash.open.upload.recognize` | 已接入 |\n| `global_compliance_flash_upload_real_image.py` | `bg.flash.open.upload.real.image` | 已接入 |\n| `global_compliance_arbok_upload_upload_file.py` | `bg.arbok.open.upload.uploadFile` | 已接入 |\n| `global_compliance_arbok_product_cert_query.py` | `bg.arbok.open.product.cert.query` | 已接入 |\n| `temu_global_proxy.py` | 任意 `type` | 通用 |\n| `temu_global_file_download.py` | 加签文件下载 | 通用 |\n\n## 示例\n\n```bash\npython scripts/global_compliance_edit.py '<JSON>'  # bg.compliance.edit\n```\n\n```bash\npython scripts/global_compliance_metadata_get.py '<JSON>'  # bg.compliance.metadata.get\n```\n\n**Feedback：** `skillName`：`linkfox-temu-compliance-global`\n\n## 网关与授权脚本\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# Compliance API 文档索引（Global）\n\n按 Temu `type` 分文件；入参来自 Partner **Request** 表，出参来自 **Response** 表 + **Response Example** 展开。\n\n## 已接入（9）\n\n| type | 文档 | 脚本 |\n|------|------|------|\n| `bg.compliance.edit` | [bg-compliance-edit.md](./bg-compliance-edit.md) | `global_compliance_edit.py` |\n| `bg.compliance.metadata.get` | [bg-compliance-metadata-get.md](./bg-compliance-metadata-get.md) | `global_compliance_metadata_get.py` |\n| `bg.goods.compliancelabel.get` | [bg-goods-compliancelabel-get.md](./bg-goods-compliancelabel-get.md) | `global_compliance_goods_compliancelabel_get.py` |\n| `bg.arbok.open.cert.queryNeedUploadItems` | [bg-arbok-open-cert-query-need-upload-items.md](./bg-arbok-open-cert-query-need-upload-items.md) | `global_compliance_arbok_cert_query_need_upload_items.py` |\n| `bg.arbok.open.cert.uploadProductCert` | [bg-arbok-open-cert-upload-product-cert.md](./bg-arbok-open-cert-upload-product-cert.md) | `global_compliance_arbok_cert_upload_product_cert.py` |\n| `bg.flash.open.upload.recognize` | [bg-flash-open-upload-recognize.md](./bg-flash-open-upload-recognize.md) | `global_compliance_flash_upload_recognize.py` |\n| `bg.flash.open.upload.real.image` | [bg-flash-open-upload-real-image.md](./bg-flash-open-upload-real-image.md) | `global_compliance_flash_upload_real_image.py` |\n| `bg.arbok.open.upload.uploadFile` | [bg-arbok-open-upload-upload-file.md](./bg-arbok-open-upload-upload-file.md) | `global_compliance_arbok_upload_upload_file.py` |\n| `bg.arbok.open.product.cert.query` | [bg-arbok-open-product-cert-query.md](./bg-arbok-open-product-cert-query.md) | `global_compliance_arbok_product_cert_query.py` |\n\nFile v1.0.5:_meta.json\n\n{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-temu-compliance-global\",\n  \"version\": \"1.0.5\",\n  \"publishedAt\": 1786101259313\n}\n\nFile v1.0.5: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）（如未配置 按 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=global` / `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-global.temu.com |\n| global | 全球区 | openapi-b-global.temu.com |\n| eu | 全球站 | openapi-b-global.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-compliance-global — API 参考\n\nTemu **全球站电商合规**（Partner Global **Product Compliance / 商品合规**），经本 skill `temu_global_proxy`（`POST /temu/proxy`）转发。Temu 的 `type` 写在 Body，**不是** URL 路径。\n\n> 网关与鉴权：本 skill `scripts/`（`LINKFOXAGENT_API_KEY`、`accessToken` / `storeKey`）。授权见 `references/access-token.md`。\n\n---\n\n## 调用规范\n\n| 项 | 说明 |\n|----|------|\n| 网关根地址 | `${LINKFOX_TOOL_GATEWAY}`（可用 `TEMU_API_BASE_URL` / `STORE_API_BASE_URL` 覆盖） |\n| 合规 OpenAPI | `POST /temu/proxy` |\n| 加签文件下载 | `POST /temu/fileDownload`（`temu_global_file_download.py`） |\n| LinkFox 鉴权 | Header **`Authorization`** 与 **`Token`**（同值）；或 `LINKFOX_AGENT_API_KEY` / `LINKFOXAGENT_API_KEY`；或 JSON `token`（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理） |\n| Temu 鉴权 | Body `accessToken`，或 `storeKey` + `site` + `managementType` + `tokenPurpose` |\n| 默认 | `site=global`，`managementType=semi-managed`，`tokenPurpose=product-inventory` |\n| 上游 OpenAPI（Global） | `https://openapi-b-global.temu.com/openapi/router`（网关按 `site` 解析） |\n\n### 网关请求 Body（`/temu/proxy`）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| site | string | 是 | `global`（本 skill 默认） |\n| managementType | string | 是 | `semi-managed` |\n| accessToken | string | 与 storeKey 二选一 | Temu 店铺令牌 |\n| storeKey | string | 与 accessToken 二选一 | `~/.linkfox/temu-access-tokens.json` 中的键 |\n| tokenPurpose | string | 否 | 建议 `product-inventory` |\n| type | string | 是 | Temu 接口名（以 Partner Compliance 文档为准） |\n| params | object | 否 | 业务参数，见各接口文档 |\n\n### 网关响应\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| body | string | Temu 原始 JSON 字符串；脚本解析为 `temuBody` |\n| code | integer | 网关错误码：`1002` 参数/Token，`1003` 转发失败 |\n\n解析顺序：**网关 `code`** → `JSON.parse(body)` → `success` / `errorCode` / `errorMsg` / `result`。\n\n### 脚本调用\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/temu_global_proxy.py '{\"accessToken\":\"TOKEN\",\"site\":\"global\",\"type\":\"<TEMU_API_TYPE>\",\"params\":{}}'\n```\n\n业务字段放在 `params`（或各 `global_compliance_*.py` 脚本约定的 `request` 结构，接入后以接口文档为准）。\n\n---\n\n## 接口一览\n\n完整 `sub_menu_code` 与 Partner 文档 URL 见 [partner-global-catalog.md](./partner-global-catalog.md)。\n\n**每个接口单独一份文档**：[apis/README.md](./apis/README.md)。\n\n---\n\n## 典型合规流程\n\n（待按 Partner Global Compliance 菜单接入后补充。）\n\n商品详情、类目属性等辅助查询可用 **`linkfox-temu-manage-product-global`** 对应接口。\n\n---\n\n## 网关错误码\n\n| code | 说明 | 处理 |\n|------|------|------|\n| 1002 | 参数或 LinkFox Token 无效 | 修正参数与 `LINKFOXAGENT_API_KEY` |\n| 1003 | 转发失败 | 检查 Temu token、白名单、网络 |\n| 402 | HTTP 402 | 按 SKILL.md 的 **## 解决认证和积分问题** 处理。 |\n\n---\n\n## Feedback API\n\n- **POST** `https://skill-api.linkfox.com/api/v1/public/feedback`\n- `skillName`: **`linkfox-temu-compliance-global`**\n\nFile v1.0.5:references/apis/bg-arbok-open-cert-query-need-upload-items.md\n\n# 待上传资质项查询 — `bg.arbok.open.cert.queryNeedUploadItems`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_arbok_cert_query_need_upload_items.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=84d3118d3a604947abf35144606cdea2 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.arbok.open.cert.queryNeedUploadItems`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query certification items that need to be uploaded for a product.\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── certType (INTEGER **必填**)\n    └── productId (LONG **必填**)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| certType | INTEGER | **是** | certType |\n| productId | LONG | **是** | productId |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"certType\": 1,\n    \"productId\": 1\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n    ├── certNeedUploadItems[] (OBJECT[])\n    ├── certNeedUploadItems[].aliasName (STRING)\n    ├── certNeedUploadItems[].contentType (INTEGER)\n    ├── certNeedUploadItems[].expireDays (INTEGER)\n    ├── certNeedUploadItems[].expireNoticeDays (INTEGER)\n    ├── certNeedUploadItems[].expireTime (INTEGER)\n    ├── certNeedUploadItems[].expireType (INTEGER)\n    ├── certNeedUploadItems[].hasExpireTime (BOOLEAN)\n    ├── certNeedUploadItems[].needShowCustomer (BOOLEAN)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| certNeedUploadItems[] | OBJECT[] | Partner Response Example |\n| certNeedUploadItems[].aliasName | STRING | Partner Response Example |\n| certNeedUploadItems[].contentType | INTEGER | Partner Response Example |\n| certNeedUploadItems[].expireDays | INTEGER | Partner Response Example |\n| certNeedUploadItems[].expireNoticeDays | INTEGER | Partner Response Example |\n| certNeedUploadItems[].expireTime | INTEGER | Partner Response Example |\n| certNeedUploadItems[].expireType | INTEGER | Partner Response Example |\n| certNeedUploadItems[].hasExpireTime | BOOLEAN | Partner Response Example |\n| certNeedUploadItems[].needShowCustomer | BOOLEAN | Partner Response Example |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_arbok_cert_query_need_upload_items.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"certType\": 1,     \"productId\": 1   } }'\n```\n\nFile v1.0.5:references/apis/bg-arbok-open-cert-upload-product-cert.md\n\n# 上传商品资质 — `bg.arbok.open.cert.uploadProductCert`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_arbok_cert_upload_product_cert.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=56de04bcafae45509b21edeab57c9fdb |\n| **网关** | `POST /temu/proxy`，`type`=`bg.arbok.open.cert.uploadProductCert`，业务载荷放在 Body 的 `params` |\n\n**Description:** Upload product certification / qualification documents.\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── productCatCertReqList (OBJECT[])\n    └── productCatCertReqList[].authCode (STRING)\n    └── productCatCertReqList[].authCodes (OBJECT[])\n    └── productCatCertReqList[].authCodes[].authCode (STRING)\n    └── productCatCertReqList[].authCodes[].effectiveTime (INTEGER)\n    └── productCatCertReqList[].authCodes[].expireTime (INTEGER)\n    └── productCatCertReqList[].authCodes[].fileName (STRING)\n    └── productCatCertReqList[].authCodes[].fileUrl (STRING)\n    └── productCatCertReqList[].authCodes[].showCustomer (BOOLEAN)\n    └── productCatCertReqList[].certType (INTEGER)\n    └── productCatCertReqList[].inspectReportFiles (OBJECT[])\n    └── productCatCertReqList[].inspectReportFiles[].authCode (STRING)\n    └── productCatCertReqList[].inspectReportFiles[].effectiveTime (INTEGER)\n    └── productCatCertReqList[].inspectReportFiles[].expireTime (INTEGER)\n    └── productCatCertReqList[].inspectReportFiles[].fileName (STRING)\n    └── productCatCertReqList[].inspectReportFiles[].fileUrl (STRING)\n    └── productCatCertReqList[].inspectReportFiles[].showCustomer (BOOLEAN)\n    └── productCatCertReqList[].productCertFiles (OBJECT[])\n    └── productCatCertReqList[].productCertFiles[].authCode (STRING)\n    └── productCatCertReqList[].productCertFiles[].effectiveTime (INTEGER)\n    └── productCatCertReqList[].productCertFiles[].expireTime (INTEGER)\n    └── productCatCertReqList[].productCertFiles[].fileName (STRING)\n    └── productCatCertReqList[].productCertFiles[].fileUrl (STRING)\n    └── productCatCertReqList[].productCertFiles[].showCustomer (BOOLEAN)\n    └── productCatCertReqList[].supplementaryMaterials (OBJECT[])\n    └── productCatCertReqList[].supplementaryMaterials[].authCode (STRING)\n    └── productCatCertReqList[].supplementaryMaterials[].effectiveTime (INTEGER)\n    └── productCatCertReqList[].supplementaryMaterials[].expireTime (INTEGER)\n    └── productCatCertReqList[].supplementaryMaterials[].fileName (STRING)\n    └── productCatCertReqList[].supplementaryMaterials[].fileUrl (STRING)\n    └── productCatCertReqList[].supplementaryMaterials[].showCustomer (BOOLEAN)\n    └── productId (LONG **必填**)\n    └── realPictures (OBJECT[])\n    └── realPictures[].imageUrl (STRING)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| productCatCertReqList | OBJECT[] | 否 | productCatCertReqList |\n| productCatCertReqList[].authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].certType | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productId | LONG | **是** | productId |\n| realPictures | OBJECT[] | 否 | realPictures |\n| realPictures[].imageUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `productCatCertReqList[].authCodes[]`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `productCatCertReqList[].inspectReportFiles[]`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `productCatCertReqList[].productCertFiles[]`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `productCatCertReqList[].supplementaryMaterials[]`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"productId\": 1,\n    \"productCatCertReqList\": [\n      {\n        \"authCodes\": [\n          {\n            \"fileName\": \"test\",\n            \"fileUrl\": \"test\",\n            \"showCustomer\": true,\n            \"expireTime\": 1,\n            \"authCode\": \"test\",\n            \"effectiveTime\": 1\n          }\n        ],\n        \"productCertFiles\": [\n          {\n            \"fileName\": \"test\",\n            \"fileUrl\": \"test\",\n            \"showCustomer\": true,\n            \"expireTime\": 1,\n            \"authCode\": \"test\",\n            \"effectiveTime\": 1\n          }\n        ],\n        \"supplementaryMaterials\": [\n          {\n            \"fileName\": \"test\",\n            \"fileUrl\": \"test\",\n            \"showCustomer\": true,\n            \"expireTime\": 1,\n            \"authCode\": \"test\",\n            \"effectiveTime\": 1\n          }\n        ],\n        \"certType\": 1,\n        \"inspectReportFiles\": [\n          {\n            \"fileName\": \"test\",\n            \"fileUrl\": \"test\",\n            \"showCustomer\": true,\n            \"expireTime\": 1,\n            \"authCode\": \"test\",\n            \"effectiveTime\": 1\n          }\n        ],\n        \"authCode\": \"test\"\n      }\n    ],\n    \"realPictures\": [\n      {\n        \"imageUrl\": \"test\"\n      }\n    ]\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_arbok_cert_upload_product_cert.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"productId\": 1,     \"productCatCertReqList\": [       {         \"authCodes\": [           {             \"fileName\": \"test\",             \"fileUrl\": \"test\",             \"showCustomer\": true,             \"expireTime\": 1,             \"authCode\": \"test\",             \"effectiveTime\": 1           }         ],         \"productCertFiles\": [           {             \"fileName\": \"test\",             \"fileUrl\": \"test\",             \"showCustomer\": true,             \"expireTime\": 1,             \"authCode\": \"test\",             \"effectiveTime\": 1           }         ],         \"supplementaryMaterials\": [           {             \"fileName\": \"test\",             \"fileUrl\": \"test\",             \"showCustomer\": true,             \"expireTime\": 1,             \"authCode\": \"test\",             \"effectiveTime\": 1           }         ],         \"certType\": 1,         \"inspectReportFiles\": [           {             \"fileName\": \"test\",             \"fileUrl\": \"test\",             \"showCustomer\": true,             \"expireTime\": 1,             \"authCode\": \"test\",             \"effectiveTime\": 1           }         ],         \"authCode\": \"test\"       }     ],     \"realPictures\": [       {         \"imageUrl\": \"test\"       }     ]   } }'\n```\n\nFile v1.0.5:references/apis/bg-arbok-open-product-cert-query.md\n\n# 商品资质查询 — `bg.arbok.open.product.cert.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_arbok_product_cert_query.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=5ec78e3b36c34fcba743a75523349fb5 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.arbok.open.product.cert.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query product certification / qualification information.\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── certTypeList (INTEGER[])\n    └── language (STRING)\n    └── productId (LONG **必填**)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| certTypeList | INTEGER[] | 否 | certTypeList |\n| language | STRING | 否 | language |\n| productId | LONG | **是** | productId |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"productId\": 1,\n    \"certTypeList\": [\n      1,\n      1\n    ],\n    \"language\": \"test\"\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n    ├── productCertList[] (OBJECT[])\n    ├── productCertList[].auditStatus (INTEGER)\n    ├── productCertList[].certName (STRING)\n    ├── productCertList[].certType (INTEGER)\n    ├── productCertList[].rejectReason (STRING)\n    ├── productCertList[].updateReason (STRING)\n    ├── productCertList[].updateStatus (INTEGER)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| productCertList[] | OBJECT[] | Partner Response Example |\n| productCertList[].auditStatus | INTEGER | Partner Response Example |\n| productCertList[].certName | STRING | Partner Response Example |\n| productCertList[].certType | INTEGER | Partner Response Example |\n| productCertList[].rejectReason | STRING | Partner Response Example |\n| productCertList[].updateReason | STRING | Partner Response Example |\n| productCertList[].updateStatus | INTEGER | Partner Response Example |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_arbok_product_cert_query.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"productId\": 1,     \"certTypeList\": [       1,       1     ],     \"language\": \"test\"   } }'\n```\n\nFile v1.0.5:references/apis/bg-arbok-open-upload-upload-file.md\n\n# 合规文件上传 — `bg.arbok.open.upload.uploadFile`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_arbok_upload_upload_file.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=01b8792d2e4a40f7b3b14f4a1f2711b6 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.arbok.open.upload.uploadFile`，业务载荷放在 Body 的 `params` |\n\n**Description:** Upload compliance-related files (base64) via Arbok open API.\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── base64File (STRING **必填**)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| base64File | STRING | **是** | base64File |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"base64File\": \"test\"\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n    ├── url (STRING)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n| url | STRING | Partner Response Example |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_arbok_upload_upload_file.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"base64File\": \"test\"   } }'\n```\n\nFile v1.0.5:references/apis/bg-compliance-edit.md\n\n# 合规编辑 — `bg.compliance.edit`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_edit.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=a8829c8ede574d9a97cd3cea7c019bc4 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.compliance.edit`，业务载荷放在 Body 的 `params` |\n\n**Description:** Edit product compliance information (governance attributes, GPSR, certificates, etc.).\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── editReqList (OBJECT[] **必填**)\n    └── editReqList[].complianceType (INTEGER)\n    └── editReqList[].inputText (OBJECT)\n    └── editReqList[].inputText.$key (STRING)\n    └── editReqList[].inputText.$value (OBJECT)\n    └── editReqList[].inputText.$value.lang (OBJECT)\n    └── editReqList[].inputText.$value.lang.$key (STRING)\n    └── editReqList[].inputText.$value.lang.$value (STRING)\n    └── editReqList[].inputText.$value.multiLineInputs (OBJECT[])\n    └── editReqList[].inputText.$value.multiLineInputs[].lang (OBJECT)\n    └── editReqList[].inputText.$value.multiLineInputs[].lang.$key (STRING)\n    └── editReqList[].inputText.$value.multiLineInputs[].lang.$value (STRING)\n    └── editReqList[].inputText.$value.multiLineInputs[].name (STRING)\n    └── editReqList[].inputText.$value.name (STRING)\n    └── editReqList[].properties (OBJECT)\n    └── editReqList[].properties.$key (STRING)\n    └── editReqList[].properties.$value (INTEGER[])\n    └── editReqList[].repList (OBJECT[])\n    └── editReqList[].repList[].repId (INTEGER)\n    └── productId (LONG **必填**)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| editReqList | OBJECT[] | **是** | edit single compliance req list |\n| editReqList[].complianceType | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.lang | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.lang.$key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.lang.$value | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.multiLineInputs | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.multiLineInputs[].lang | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.multiLineInputs[].lang.$key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.multiLineInputs[].lang.$value | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.multiLineInputs[].name | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].inputText.$value.name | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].properties | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].properties.$key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].properties.$value | INTEGER[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].repList | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| editReqList[].repList[].repId | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productId | LONG | **是** | product id |\n\n#### `editReqList[].inputText`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| $key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| $value | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `editReqList[].inputText.$value`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| lang | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| multiLineInputs | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| name | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `editReqList[].inputText.$value.lang`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| $key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| $value | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `editReqList[].inputText.$value.multiLineInputs[]`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| lang | OBJECT | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| name | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `editReqList[].inputText.$value.multiLineInputs[].lang`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| $key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| $value | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `editReqList[].properties`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| $key | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| $value | INTEGER[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"productId\": 1,\n    \"editReqList\": [\n      {\n        \"inputText\": {\n          \"$key\": \"test\",\n          \"$value\": {\n            \"name\": \"test\",\n            \"lang\": {\n              \"$key\": \"test\",\n              \"$value\": \"test\"\n            },\n            \"multiLineInputs\": [\n              {\n                \"name\": \"test\",\n                \"lang\": {\n                  \"$key\": \"test\",\n                  \"$value\": \"test\"\n                }\n              }\n            ]\n          }\n        },\n        \"repList\": [\n          {\n            \"repId\": 1\n          }\n        ],\n        \"properties\": {\n          \"$key\": \"test\",\n          \"$value\": [\n            1,\n            1\n          ]\n        },\n        \"complianceType\": 1\n      }\n    ]\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | errorCode |\n| errorMsg | STRING | errorMsg |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| errorCode | INTEGER | errorCode |\n| errorMsg | STRING | errorMsg |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_edit.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"productId\": 1,     \"editReqList\": [       {         \"inputText\": {           \"$key\": \"test\",           \"$value\": {             \"name\": \"test\",             \"lang\": {               \"$key\": \"test\",               \"$value\": \"test\"             },             \"multiLineInputs\": [               {                 \"name\": \"test\",                 \"lang\": {                   \"$key\": \"test\",                   \"$value\": \"test\"                 }               }             ]           }         },         \"repList\": [           {             \"repId\": 1           }         ],         \"properties\": {           \"$key\": \"test\",           \"$value\": [             1,             1           ]         },         \"complianceType\": 1       }     ]   } }'\n```\n\nFile v1.0.5:references/apis/bg-compliance-metadata-get.md\n\n# 合规模板元数据查询 — `bg.compliance.metadata.get`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_metadata_get.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=fd12bdf5cb364366bdef85aad9cd8e48 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.compliance.metadata.get`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query compliance metadata / template definitions for a product.\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── productId (LONG **必填**)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| productId | LONG | **是** | product id |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"productId\": 1\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n    ├── complianceInfoList[] (OBJECT[])\n    ├── complianceInfoList[].complianceType (INTEGER)\n    ├── complianceInfoList[].desc (STRING)\n    ├── complianceInfoList[].name (STRING)\n    ├── complianceInfoList[].propertyList[] (OBJECT[])\n    ├── complianceInfoList[].propertyList[].controlType (INTEGER)\n    ├── complianceInfoList[].propertyList[].desc (STRING)\n    ├── complianceInfoList[].propertyList[].excludeVidMap (OBJECT)\n    ├── complianceInfoList[].propertyList[].excludeVidMap.$key (STRING)\n    ├── complianceInfoList[].propertyList[].excludeVidMap.$value[] (INTEGER[])\n    ├── complianceInfoList[].propertyList[].inputNum (INTEGER)\n    ├── complianceInfoList[].propertyList[].inputType (INTEGER)\n    ├── complianceInfoList[].propertyList[].langDescMap (OBJECT)\n    ├── complianceInfoList[].propertyList[].langDescMap.$key (STRING)\n    ├── complianceInfoList[].propertyList[].langDescMap.$value (STRING)\n    ├── complianceInfoList[].propertyList[].max (INTEGER)\n    ├── complianceInfoList[].propertyList[].min (INTEGER)\n    ├── complianceInfoList[].propertyList[].needTransLang[] (STRING[])\n    ├── complianceInfoList[].propertyList[].parentPid (INTEGER)\n    ├── complianceInfoList[].propertyList[].parentVidList[] (INTEGER[])\n    ├── complianceInfoList[].propertyList[].propertyId (INTEGER)\n    ├── complianceInfoList[].propertyList[].propertyName (STRING)\n    ├── complianceInfoList[].propertyList[].propertyValueList[] (OBJECT[])\n    ├── complianceInfoList[].propertyList[].propertyValueList[].langValueNameMap (OBJECT)\n    ├── complianceInfoList[].propertyList[].propertyValueList[].langValueNameMap.$key (STRING)\n    ├── complianceInfoList[].propertyList[].propertyValueList[].langValueNameMap.$value (STRING)\n    ├── complianceInfoList[].propertyList[].propertyValueList[].parentVidList[] (INTEGER[])\n    ├── complianceInfoList[].propertyList[].propertyValueList[].valueName (STRING)\n    ├── complianceInfoList[].propertyList[].propertyValueList[].vid (INTEGER)\n    ├── complianceInfoList[].propertyList[].selectNum (INTEGER)\n    ├── complianceInfoList[].propertyList[].unit (STRING)\n    ├── complianceInfoList[].propertyList[].valuePrecision (INTEGER)\n    ├── complianceInfoList[].repDetailList[] (OBJECT[])\n    ├── complianceInfoList[].repDetailList[].endTimestamp (INTEGER)\n    ├── complianceInfoList[].repDetailList[].personType (INTEGER)\n    ├── complianceInfoList[].repDetailList[].repAddressInfo (OBJECT)\n    ├── complianceInfoList[].repDetailList[].repAddressInfo.addressLineOne (STRING)\n    ├── complianceInfoList[].repDetailList[].repAddressInfo.city (STRING)\n    ├── complianceInfoList[].repDetailList[].repAddressInfo.regionName (STRING)\n    ├── complianceInfoList[].repDetailList[].repAddressInfo.stateName (STRING)\n    ├── complianceInfoList[].repDetailList[].repId (INTEGER)\n    ├── complianceInfoList[].repDetailList[].repName (STRING)\n    ├── complianceInfoList[].repDetailList[].repStatus (INTEGER)\n    ├── complianceInfoList[].repDetailList[].startTimestamp (INTEGER)\n    ├── complianceInfoList[].status (INTEGER)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | errorCode |\n| errorMsg | STRING | errorMsg |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| complianceInfoList[] | OBJECT[] | Partner Response Example |\n| complianceInfoList[].complianceType | INTEGER | Partner Response Example |\n| complianceInfoList[].desc | STRING | Partner Response Example |\n| complianceInfoList[].name | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[] | OBJECT[] | Partner Response Example |\n| complianceInfoList[].propertyList[].controlType | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].desc | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].excludeVidMap | OBJECT | Partner Response Example |\n| complianceInfoList[].propertyList[].excludeVidMap.$key | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].excludeVidMap.$value[] | INTEGER[] | Partner Response Example |\n| complianceInfoList[].propertyList[].inputNum | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].inputType | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].langDescMap | OBJECT | Partner Response Example |\n| complianceInfoList[].propertyList[].langDescMap.$key | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].langDescMap.$value | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].max | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].min | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].needTransLang[] | STRING[] | Partner Response Example |\n| complianceInfoList[].propertyList[].parentPid | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].parentVidList[] | INTEGER[] | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyId | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyName | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyValueList[] | OBJECT[] | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyValueList[].langValueNameMap | OBJECT | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyValueList[].langValueNameMap.$key | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyValueList[].langValueNameMap.$value | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyValueList[].parentVidList[] | INTEGER[] | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyValueList[].valueName | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].propertyValueList[].vid | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].selectNum | INTEGER | Partner Response Example |\n| complianceInfoList[].propertyList[].unit | STRING | Partner Response Example |\n| complianceInfoList[].propertyList[].valuePrecision | INTEGER | Partner Response Example |\n| complianceInfoList[].repDetailList[] | OBJECT[] | Partner Response Example |\n| complianceInfoList[].repDetailList[].endTimestamp | INTEGER | Partner Response Example |\n| complianceInfoList[].repDetailList[].personType | INTEGER | Partner Response Example |\n| complianceInfoList[].repDetailList[].repAddressInfo | OBJECT | Partner Response Example |\n| complianceInfoList[].repDetailList[].repAddressInfo.addressLineOne | STRING | Partner Response Example |\n| complianceInfoList[].repDetailList[].repAddressInfo.city | STRING | Partner Response Example |\n| complianceInfoList[].repDetailList[].repAddressInfo.regionName | STRING | Partner Response Example |\n| complianceInfoList[].repDetailList[].repAddressInfo.stateName | STRING | Partner Response Example |\n| complianceInfoList[].repDetailList[].repId | INTEGER | Partner Response Example |\n| complianceInfoList[].repDetailList[].repName | STRING | Partner Response Example |\n| complianceInfoList[].repDetailList[].repStatus | INTEGER | Partner Response Example |\n| complianceInfoList[].repDetailList[].startTimestamp | INTEGER | Partner Response Example |\n| complianceInfoList[].status | INTEGER | Partner Response Example |\n| errorCode | INTEGER | errorCode |\n| errorMsg | STRING | errorMsg |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_metadata_get.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"productId\": 1   } }'\n```\n\nFile v1.0.5:references/apis/bg-flash-open-upload-real-image.md\n\n# 实拍图上传（Flash） — `bg.flash.open.upload.real.image`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_flash_upload_real_image.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=ef77dada37ac49569f6e7c787dd696d9 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.flash.open.upload.real.image`，业务载荷放在 Body 的 `params` |\n\n**Description:** Upload real product images for compliance verification (Flash open API).\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── clientId (STRING)\n    └── image (STRING)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| clientId | STRING | 否 | Kaiping clientId |\n| image | STRING | 否 | Supported formats include: jpg/jpeg, png and other image formats. Note that the input image must be transcoded into base64 encoding. |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"image\": \"test\",\n    \"clientId\": \"test\"\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n    ├── url (STRING)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| result | OBJECT | Return to detailed information |\n| success | BOOLEAN | success |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | Return to detailed information |\n| success | BOOLEAN | success |\n| url | STRING | Partner Response Example |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_flash_upload_real_image.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"image\": \"test\",     \"clientId\": \"test\"   } }'\n```\n\nArchive v1.0.4: 40 files, 47241 bytes\n\nFiles: references/access-token.md (4539b), references/api.md (3334b), references/apis/bg-arbok-open-cert-query-need-upload-items.md (3788b), references/apis/bg-arbok-open-cert-upload-product-cert.md (15409b), references/apis/bg-arbok-open-product-cert-query.md (3567b), references/apis/bg-arbok-open-upload-upload-file.md (2518b), references/apis/bg-compliance-edit.md (9751b), references/apis/bg-compliance-metadata-get.md (9792b), references/apis/bg-flash-open-upload-real-image.md (2798b), references/apis/bg-flash-open-upload-recognize.md (3949b), references/apis/bg-goods-compliancelabel-get.md (3747b), references/apis/README.md (1700b), references/authorization-flow.md (1186b), references/partner-global-catalog.md (4602b), scripts/_global_compliance_script.py (455b), scripts/_temu_auth_guide.py (6198b), scripts/_temu_common.py (12434b), scripts/_temu_global_common.py (3122b), scripts/_temu_token_store.py (4273b), scripts/check_linkfox_token.py (1797b), scripts/get_temu_access_token.py (1843b), scripts/global_compliance_arbok_cert_query_need_upload_items.py (315b), scripts/global_compliance_arbok_cert_upload_product_cert.py (299b), scripts/global_compliance_arbok_product_cert_query.py (285b), scripts/global_compliance_arbok_upload_upload_file.py (283b), scripts/global_compliance_edit.py (231b), scripts/global_compliance_flash_upload_real_image.py (290b), scripts/global_compliance_flash_upload_recognize.py (284b), scripts/global_compliance_goods_compliancelabel_get.py (278b), scripts/global_compliance_metadata_get.py (270b), scripts/list_temu_access_tokens.py (652b), scripts/save_temu_access_token.py (1377b), scripts/temu_file_download.py (1621b), scripts/temu_global_file_download.py (688b), scripts/temu_global_proxy.py (869b), scripts/temu_proxy.py (2053b), scripts/temu_token_guide.py (1594b), skill-card.md (2706b), SKILL.md (5713b), _meta.json (149b)\n\nFile v1.0.4:SKILL.md\n\n---\nname: linkfox-temu-compliance-global\ndescription: Temu 全球站电商合规（Compliance）API，经 LinkFox 网关转发 Partner Global 合规相关 OpenAPI（bg.compliance.*、bg.arbok.open.*、bg.flash.open.* 等，共 9 个接口）。当用户提到 Temu Global 合规、商品资质、GPSR、治理属性、实拍图、资质上传、bg.compliance.edit、arbok cert、site=global 合规 时触发。\n---\n\n# Temu 全球站 — 电商合规（Compliance）\n\n本 skill（`linkfox-temu-compliance-global`）覆盖 Partner Platform for **Global** 的 **电商合规 / Product Compliance** 相关 OpenAPI。\n\n已接入 **9** 个接口，清单见 [partner-global-catalog.md](./references/partner-global-catalog.md)。\n\n**网关（本 skill 内置）**：\n\n| 能力 | 方法 | 路径 |\n|------|------|------|\n| 合规 OpenAPI（`global_compliance_*`、`temu_global_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-compliance-global`** |\n| 商品列表/详情/编辑/库存 | `linkfox-temu-manage-product-global` |\n| 价格 | `linkfox-temu-price-global` |\n| 促销 | `linkfox-temu-promotion-global` |\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## API 文档\n\n| 文档 | 内容 |\n|------|------|\n| [api.md](./references/api.md) | 网关、鉴权、错误码 |\n| [partner-global-catalog.md](./references/partner-global-catalog.md) | 接口目录 |\n| [apis/README.md](./references/apis/README.md) | 分接口文档 |\n\n## 默认参数\n\n| 字段 | 默认 | 说明 |\n|------|------|------|\n| site | `global` | Partner Global |\n| managementType | `semi-managed` | 半托管 |\n| tokenPurpose | `product-inventory` | 商品/合规场景 |\n\n## Scripts（按 type）\n\n| 脚本 | type | 状态 |\n|------|------|------|\n| `global_compliance_edit.py` | `bg.compliance.edit` | 已接入 |\n| `global_compliance_metadata_get.py` | `bg.compliance.metadata.get` | 已接入 |\n| `global_compliance_goods_compliancelabel_get.py` | `bg.goods.compliancelabel.get` | 已接入 |\n| `global_compliance_arbok_cert_query_need_upload_items.py` | `bg.arbok.open.cert.queryNeedUploadItems` | 已接入 |\n| `global_compliance_arbok_cert_upload_product_cert.py` | `bg.arbok.open.cert.uploadProductCert` | 已接入 |\n| `global_compliance_flash_upload_recognize.py` | `bg.flash.open.upload.recognize` | 已接入 |\n| `global_compliance_flash_upload_real_image.py` | `bg.flash.open.upload.real.image` | 已接入 |\n| `global_compliance_arbok_upload_upload_file.py` | `bg.arbok.open.upload.uploadFile` | 已接入 |\n| `global_compliance_arbok_product_cert_query.py` | `bg.arbok.open.product.cert.query` | 已接入 |\n| `temu_global_proxy.py` | 任意 `type` | 通用 |\n| `temu_global_file_download.py` | 加签文件下载 | 通用 |\n\n## 示例\n\n```bash\npython scripts/global_compliance_edit.py '<JSON>'  # bg.compliance.edit\n```\n\n```bash\npython scripts/global_compliance_metadata_get.py '<JSON>'  # bg.compliance.metadata.get\n```\n\n**Feedback：** `skillName`：`linkfox-temu-compliance-global`\n\n## 网关与授权脚本\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# Compliance API 文档索引（Global）\n\n按 Temu `type` 分文件；入参来自 Partner **Request** 表，出参来自 **Response** 表 + **Response Example** 展开。\n\n## 已接入（9）\n\n| type | 文档 | 脚本 |\n|------|------|------|\n| `bg.compliance.edit` | [bg-compliance-edit.md](./bg-compliance-edit.md) | `global_compliance_edit.py` |\n| `bg.compliance.metadata.get` | [bg-compliance-metadata-get.md](./bg-compliance-metadata-get.md) | `global_compliance_metadata_get.py` |\n| `bg.goods.compliancelabel.get` | [bg-goods-compliancelabel-get.md](./bg-goods-compliancelabel-get.md) | `global_compliance_goods_compliancelabel_get.py` |\n| `bg.arbok.open.cert.queryNeedUploadItems` | [bg-arbok-open-cert-query-need-upload-items.md](./bg-arbok-open-cert-query-need-upload-items.md) | `global_compliance_arbok_cert_query_need_upload_items.py` |\n| `bg.arbok.open.cert.uploadProductCert` | [bg-arbok-open-cert-upload-product-cert.md](./bg-arbok-open-cert-upload-product-cert.md) | `global_compliance_arbok_cert_upload_product_cert.py` |\n| `bg.flash.open.upload.recognize` | [bg-flash-open-upload-recognize.md](./bg-flash-open-upload-recognize.md) | `global_compliance_flash_upload_recognize.py` |\n| `bg.flash.open.upload.real.image` | [bg-flash-open-upload-real-image.md](./bg-flash-open-upload-real-image.md) | `global_compliance_flash_upload_real_image.py` |\n| `bg.arbok.open.upload.uploadFile` | [bg-arbok-open-upload-upload-file.md](./bg-arbok-open-upload-upload-file.md) | `global_compliance_arbok_upload_upload_file.py` |\n| `bg.arbok.open.product.cert.query` | [bg-arbok-open-product-cert-query.md](./bg-arbok-open-product-cert-query.md) | `global_compliance_arbok_product_cert_query.py` |\n\nFile v1.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-temu-compliance-global\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1783945898764\n}\n\nFile v1.0.4: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）（如未配置 按 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=global` / `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-global.temu.com |\n| global | 全球区 | openapi-b-global.temu.com |\n| eu | 全球站 | openapi-b-global.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-compliance-global — API 参考\n\nTemu **全球站电商合规**（Partner Global **Product Compliance / 商品合规**），经本 skill `temu_global_proxy`（`POST /temu/proxy`）转发。Temu 的 `type` 写在 Body，**不是** URL 路径。\n\n> 网关与鉴权：本 skill `scripts/`（`LINKFOXAGENT_API_KEY`、`accessToken` / `storeKey`）。授权见 `references/access-token.md`。\n\n---\n\n## 调用规范\n\n| 项 | 说明 |\n|----|------|\n| 网关根地址 | `${LINKFOX_TOOL_GATEWAY}`（可用 `TEMU_API_BASE_URL` / `STORE_API_BASE_URL` 覆盖） |\n| 合规 OpenAPI | `POST /temu/proxy` |\n| 加签文件下载 | `POST /temu/fileDownload`（`temu_global_file_download.py`） |\n| LinkFox 鉴权 | Header **`Authorization`** 与 **`Token`**（同值）；或 `LINKFOX_AGENT_API_KEY` / `LINKFOXAGENT_API_KEY`；或 JSON `token`（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理） |\n| Temu 鉴权 | Body `accessToken`，或 `storeKey` + `site` + `managementType` + `tokenPurpose` |\n| 默认 | `site=global`，`managementType=semi-managed`，`tokenPurpose=product-inventory` |\n| 上游 OpenAPI（Global） | `https://openapi-b-global.temu.com/openapi/router`（网关按 `site` 解析） |\n\n### 网关请求 Body（`/temu/proxy`）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| site | string | 是 | `global`（本 skill 默认） |\n| managementType | string | 是 | `semi-managed` |\n| accessToken | string | 与 storeKey 二选一 | Temu 店铺令牌 |\n| storeKey | string | 与 accessToken 二选一 | `~/.linkfox/temu-access-tokens.json` 中的键 |\n| tokenPurpose | string | 否 | 建议 `product-inventory` |\n| type | string | 是 | Temu 接口名（以 Partner Compliance 文档为准） |\n| params | object | 否 | 业务参数，见各接口文档 |\n\n### 网关响应\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| body | string | Temu 原始 JSON 字符串；脚本解析为 `temuBody` |\n| code | integer | 网关错误码：`1002` 参数/Token，`1003` 转发失败 |\n\n解析顺序：**网关 `code`** → `JSON.parse(body)` → `success` / `errorCode` / `errorMsg` / `result`。\n\n### 脚本调用\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/temu_global_proxy.py '{\"accessToken\":\"TOKEN\",\"site\":\"global\",\"type\":\"<TEMU_API_TYPE>\",\"params\":{}}'\n```\n\n业务字段放在 `params`（或各 `global_compliance_*.py` 脚本约定的 `request` 结构，接入后以接口文档为准）。\n\n---\n\n## 接口一览\n\n完整 `sub_menu_code` 与 Partner 文档 URL 见 [partner-global-catalog.md](./partner-global-catalog.md)。\n\n**每个接口单独一份文档**：[apis/README.md](./apis/README.md)。\n\n---\n\n## 典型合规流程\n\n（待按 Partner Global Compliance 菜单接入后补充。）\n\n商品详情、类目属性等辅助查询可用 **`linkfox-temu-manage-product-global`** 对应接口。\n\n---\n\n## 网关错误码\n\n| code | 说明 | 处理 |\n|------|------|------|\n| 1002 | 参数或 LinkFox Token 无效 | 修正参数与 `LINKFOXAGENT_API_KEY` |\n| 1003 | 转发失败 | 检查 Temu token、白名单、网络 |\n| 402 | HTTP 402 | 按 SKILL.md 的 **## 解决认证和积分问题** 处理。 |\n\n---\n\n## Feedback API\n\n- **POST** `https://skill-api.linkfox.com/api/v1/public/feedback`\n- `skillName`: **`linkfox-temu-compliance-global`**\n\nFile v1.0.4:references/apis/bg-arbok-open-cert-query-need-upload-items.md\n\n# 待上传资质项查询 — `bg.arbok.open.cert.queryNeedUploadItems`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_arbok_cert_query_need_upload_items.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=84d3118d3a604947abf35144606cdea2 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.arbok.open.cert.queryNeedUploadItems`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query certification items that need to be uploaded for a product.\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── certType (INTEGER **必填**)\n    └── productId (LONG **必填**)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| certType | INTEGER | **是** | certType |\n| productId | LONG | **是** | productId |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"certType\": 1,\n    \"productId\": 1\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n    ├── certNeedUploadItems[] (OBJECT[])\n    ├── certNeedUploadItems[].aliasName (STRING)\n    ├── certNeedUploadItems[].contentType (INTEGER)\n    ├── certNeedUploadItems[].expireDays (INTEGER)\n    ├── certNeedUploadItems[].expireNoticeDays (INTEGER)\n    ├── certNeedUploadItems[].expireTime (INTEGER)\n    ├── certNeedUploadItems[].expireType (INTEGER)\n    ├── certNeedUploadItems[].hasExpireTime (BOOLEAN)\n    ├── certNeedUploadItems[].needShowCustomer (BOOLEAN)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| certNeedUploadItems[] | OBJECT[] | Partner Response Example |\n| certNeedUploadItems[].aliasName | STRING | Partner Response Example |\n| certNeedUploadItems[].contentType | INTEGER | Partner Response Example |\n| certNeedUploadItems[].expireDays | INTEGER | Partner Response Example |\n| certNeedUploadItems[].expireNoticeDays | INTEGER | Partner Response Example |\n| certNeedUploadItems[].expireTime | INTEGER | Partner Response Example |\n| certNeedUploadItems[].expireType | INTEGER | Partner Response Example |\n| certNeedUploadItems[].hasExpireTime | BOOLEAN | Partner Response Example |\n| certNeedUploadItems[].needShowCustomer | BOOLEAN | Partner Response Example |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_arbok_cert_query_need_upload_items.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"certType\": 1,     \"productId\": 1   } }'\n```\n\nFile v1.0.4:references/apis/bg-arbok-open-cert-upload-product-cert.md\n\n# 上传商品资质 — `bg.arbok.open.cert.uploadProductCert`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_arbok_cert_upload_product_cert.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=56de04bcafae45509b21edeab57c9fdb |\n| **网关** | `POST /temu/proxy`，`type`=`bg.arbok.open.cert.uploadProductCert`，业务载荷放在 Body 的 `params` |\n\n**Description:** Upload product certification / qualification documents.\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── productCatCertReqList (OBJECT[])\n    └── productCatCertReqList[].authCode (STRING)\n    └── productCatCertReqList[].authCodes (OBJECT[])\n    └── productCatCertReqList[].authCodes[].authCode (STRING)\n    └── productCatCertReqList[].authCodes[].effectiveTime (INTEGER)\n    └── productCatCertReqList[].authCodes[].expireTime (INTEGER)\n    └── productCatCertReqList[].authCodes[].fileName (STRING)\n    └── productCatCertReqList[].authCodes[].fileUrl (STRING)\n    └── productCatCertReqList[].authCodes[].showCustomer (BOOLEAN)\n    └── productCatCertReqList[].certType (INTEGER)\n    └── productCatCertReqList[].inspectReportFiles (OBJECT[])\n    └── productCatCertReqList[].inspectReportFiles[].authCode (STRING)\n    └── productCatCertReqList[].inspectReportFiles[].effectiveTime (INTEGER)\n    └── productCatCertReqList[].inspectReportFiles[].expireTime (INTEGER)\n    └── productCatCertReqList[].inspectReportFiles[].fileName (STRING)\n    └── productCatCertReqList[].inspectReportFiles[].fileUrl (STRING)\n    └── productCatCertReqList[].inspectReportFiles[].showCustomer (BOOLEAN)\n    └── productCatCertReqList[].productCertFiles (OBJECT[])\n    └── productCatCertReqList[].productCertFiles[].authCode (STRING)\n    └── productCatCertReqList[].productCertFiles[].effectiveTime (INTEGER)\n    └── productCatCertReqList[].productCertFiles[].expireTime (INTEGER)\n    └── productCatCertReqList[].productCertFiles[].fileName (STRING)\n    └── productCatCertReqList[].productCertFiles[].fileUrl (STRING)\n    └── productCatCertReqList[].productCertFiles[].showCustomer (BOOLEAN)\n    └── productCatCertReqList[].supplementaryMaterials (OBJECT[])\n    └── productCatCertReqList[].supplementaryMaterials[].authCode (STRING)\n    └── productCatCertReqList[].supplementaryMaterials[].effectiveTime (INTEGER)\n    └── productCatCertReqList[].supplementaryMaterials[].expireTime (INTEGER)\n    └── productCatCertReqList[].supplementaryMaterials[].fileName (STRING)\n    └── productCatCertReqList[].supplementaryMaterials[].fileUrl (STRING)\n    └── productCatCertReqList[].supplementaryMaterials[].showCustomer (BOOLEAN)\n    └── productId (LONG **必填**)\n    └── realPictures (OBJECT[])\n    └── realPictures[].imageUrl (STRING)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| productCatCertReqList | OBJECT[] | 否 | productCatCertReqList |\n| productCatCertReqList[].authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].authCodes[].showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].certType | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].inspectReportFiles[].showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].productCertFiles[].showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials | OBJECT[] | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productCatCertReqList[].supplementaryMaterials[].showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| productId | LONG | **是** | productId |\n| realPictures | OBJECT[] | 否 | realPictures |\n| realPictures[].imageUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `productCatCertReqList[].authCodes[]`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `productCatCertReqList[].inspectReportFiles[]`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `productCatCertReqList[].productCertFiles[]`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n#### `productCatCertReqList[].supplementaryMaterials[]`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| authCode | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| effectiveTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| expireTime | INTEGER | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileName | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| fileUrl | STRING | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n| showCustomer | BOOLEAN | — | Partner Request Example（CURL `-d` 展开；Request 表未列出子级时补充） |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"productId\": 1,\n    \"productCatCertReqList\": [\n      {\n        \"authCodes\": [\n          {\n            \"fileName\": \"test\",\n            \"fileUrl\": \"test\",\n            \"showCustomer\": true,\n            \"expireTime\": 1,\n            \"authCode\": \"test\",\n            \"effectiveTime\": 1\n          }\n        ],\n        \"productCertFiles\": [\n          {\n            \"fileName\": \"test\",\n            \"fileUrl\": \"test\",\n            \"showCustomer\": true,\n            \"expireTime\": 1,\n            \"authCode\": \"test\",\n            \"effectiveTime\": 1\n          }\n        ],\n        \"supplementaryMaterials\": [\n          {\n            \"fileName\": \"test\",\n            \"fileUrl\": \"test\",\n            \"showCustomer\": true,\n            \"expireTime\": 1,\n            \"authCode\": \"test\",\n            \"effectiveTime\": 1\n          }\n        ],\n        \"certType\": 1,\n        \"inspectReportFiles\": [\n          {\n            \"fileName\": \"test\",\n            \"fileUrl\": \"test\",\n            \"showCustomer\": true,\n            \"expireTime\": 1,\n            \"authCode\": \"test\",\n            \"effectiveTime\": 1\n          }\n        ],\n        \"authCode\": \"test\"\n      }\n    ],\n    \"realPictures\": [\n      {\n        \"imageUrl\": \"test\"\n      }\n    ]\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_arbok_cert_upload_product_cert.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"productId\": 1,     \"productCatCertReqList\": [       {         \"authCodes\": [           {             \"fileName\": \"test\",             \"fileUrl\": \"test\",             \"showCustomer\": true,             \"expireTime\": 1,             \"authCode\": \"test\",             \"effectiveTime\": 1           }         ],         \"productCertFiles\": [           {             \"fileName\": \"test\",             \"fileUrl\": \"test\",             \"showCustomer\": true,             \"expireTime\": 1,             \"authCode\": \"test\",             \"effectiveTime\": 1           }         ],         \"supplementaryMaterials\": [           {             \"fileName\": \"test\",             \"fileUrl\": \"test\",             \"showCustomer\": true,             \"expireTime\": 1,             \"authCode\": \"test\",             \"effectiveTime\": 1           }         ],         \"certType\": 1,         \"inspectReportFiles\": [           {             \"fileName\": \"test\",             \"fileUrl\": \"test\",             \"showCustomer\": true,             \"expireTime\": 1,             \"authCode\": \"test\",             \"effectiveTime\": 1           }         ],         \"authCode\": \"test\"       }     ],     \"realPictures\": [       {         \"imageUrl\": \"test\"       }     ]   } }'\n```\n\nFile v1.0.4:references/apis/bg-arbok-open-product-cert-query.md\n\n# 商品资质查询 — `bg.arbok.open.product.cert.query`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_arbok_product_cert_query.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=5ec78e3b36c34fcba743a75523349fb5 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.arbok.open.product.cert.query`，业务载荷放在 Body 的 `params` |\n\n**Description:** Query product certification / qualification information.\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── certTypeList (INTEGER[])\n    └── language (STRING)\n    └── productId (LONG **必填**)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| certTypeList | INTEGER[] | 否 | certTypeList |\n| language | STRING | 否 | language |\n| productId | LONG | **是** | productId |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"productId\": 1,\n    \"certTypeList\": [\n      1,\n      1\n    ],\n    \"language\": \"test\"\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n    ├── productCertList[] (OBJECT[])\n    ├── productCertList[].auditStatus (INTEGER)\n    ├── productCertList[].certName (STRING)\n    ├── productCertList[].certType (INTEGER)\n    ├── productCertList[].rejectReason (STRING)\n    ├── productCertList[].updateReason (STRING)\n    ├── productCertList[].updateStatus (INTEGER)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| productCertList[] | OBJECT[] | Partner Response Example |\n| productCertList[].auditStatus | INTEGER | Partner Response Example |\n| productCertList[].certName | STRING | Partner Response Example |\n| productCertList[].certType | INTEGER | Partner Response Example |\n| productCertList[].rejectReason | STRING | Partner Response Example |\n| productCertList[].updateReason | STRING | Partner Response Example |\n| productCertList[].updateStatus | INTEGER | Partner Response Example |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_arbok_product_cert_query.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"productId\": 1,     \"certTypeList\": [       1,       1     ],     \"language\": \"test\"   } }'\n```\n\nFile v1.0.4:references/apis/bg-arbok-open-upload-upload-file.md\n\n# 合规文件上传 — `bg.arbok.open.upload.uploadFile`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_arbok_upload_upload_file.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=01b8792d2e4a40f7b3b14f4a1f2711b6 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.arbok.open.upload.uploadFile`，业务载荷放在 Body 的 `params` |\n\n**Description:** Upload compliance-related files (base64) via Arbok open API.\n\n> 默认 **`site=global`**、**`tokenPurpose=product-inventory`**。入参来自 Partner **Request** 表；出参来自 **Response** 表 + **Response Example** 展开。\n\n---\n\n## Request 结构（Partner Request 表）\n\n```text\nparams\n└── request (OBJECT)\n    └── base64File (STRING **必填**)\n```\n\n### `request` 内字段（Partner Request 表 + 未展开子级自 Request Example 补充）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| base64File | STRING | **是** | base64File |\n\n### 网关 `params` 写法\n\n```json\n{\n  \"accessToken\": \"TOKEN\",\n  \"site\": \"global\",\n  \"tokenPurpose\": \"product-inventory\",\n  \"request\": {\n    \"base64File\": \"test\"\n  }\n}\n```\n\n> Partner **Request Example** 为 CURL，业务字段可能在顶层；经 LinkFox 网关请放在 **`params.request`**（或脚本接受的顶层 `request`）。\n\n---\n\n## Response（Partner Response 表 + 全量展开）\n\n```text\nresponse\n├── success (BOOLEAN)\n├── errorCode (INTEGER)\n├── errorMsg (STRING)\n└── result (OBJECT)\n    ├── url (STRING)\n```\n\n> Partner **Response** 表仅含顶层字段；`result` 下全部子字段按 **Response 表层级** 与 **Response Example** 合并展开。\n\n### Partner Response 表（HTML 导出可见行）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| success | BOOLEAN | success |\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n\n### `result` 及下级（全部展开）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| errorCode | INTEGER | error code |\n| errorMsg | STRING | error message |\n| result | OBJECT | result |\n| success | BOOLEAN | success |\n| url | STRING | Partner Response Example |\n\n---\n\n## 脚本\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/global_compliance_arbok_upload_upload_file.py '{   \"accessToken\": \"TOKEN\",   \"site\": \"global\",   \"tokenPurpose\": \"product-inventory\",   \"request\": {     \"base64File\": \"test\"   } }'\n```\n\nFile v1.0.4:references/apis/bg-compliance-edit.md\n\n# 合规编辑 — `bg.compliance.edit`\n\n| 项 | 值 |\n|----|-----|\n| **脚本** | `scripts/global_compliance_edit.py` |\n| **Partner 文档** | https://partner-global.temu.com/documentation?menu_code=fb16b05f7a904765aac4af3a24b87d4a&sub_menu_code=a8829c8ede574d9a97cd3cea7c019bc4 |\n| **网关** | `POST /temu/proxy`，`type`=`bg.compliance.edit`，业务载荷放在 Body 的 `params` |\n\n**Description:** Edit product compliance information (governance attributes, GPSR, certificates, et\n\nArchive v1.0.3: 40 files, 46634 bytes\n\nFiles: references/access-token.md (4462b), references/api.md (3174b), references/apis/bg-arbok-open-cert-query-need-upload-items.md (3788b), references/apis/bg-arbok-open-cert-upload-product-cert.md (15409b), references/apis/bg-arbok-open-product-cert-query.md (3567b), references/apis/bg-arbok-open-upload-upload-file.md (2518b), references/apis/bg-compliance-edit.md (9751b), references/apis/bg-compliance-metadata-get.md (9792b), references/apis/bg-flash-open-upload-real-image.md (2798b), references/apis/bg-flash-open-upload-recognize.md (3949b), references/apis/bg-goods-compliancelabel-get.md (3747b), references/apis/README.md (1700b), references/authorization-flow.md (1186b), references/partner-global-catalog.md (4602b), scripts/_global_compliance_script.py (455b), scripts/_temu_auth_guide.py (6198b), scripts/_temu_common.py (12434b), scripts/_temu_global_common.py (3122b), scripts/_temu_token_store.py (4273b), scripts/check_linkfox_token.py (1797b), scripts/get_temu_access_token.py (1843b), scripts/global_compliance_arbok_cert_query_need_upload_items.py (315b), scripts/global_compliance_arbok_cert_upload_product_cert.py (299b), scripts/global_compliance_arbok_product_cert_query.py (285b), scripts/global_compliance_arbok_upload_upload_file.py (283b), scripts/global_compliance_edit.py (231b), scripts/global_compliance_flash_upload_real_image.py (290b), scripts/global_compliance_flash_upload_recognize.py (284b), scripts/global_compliance_goods_compliancelabel_get.py (278b), scripts/global_compliance_metadata_get.py (270b), scripts/list_temu_access_tokens.py (652b), scripts/save_temu_access_token.py (1377b), scripts/temu_file_download.py (1621b), scripts/temu_global_file_download.py (688b), scripts/temu_global_proxy.py (869b), scripts/temu_proxy.py (2053b), scripts/temu_token_guide.py (1594b), skill-card.md (3033b), SKILL.md (4580b), _meta.json (149b)\n\nArchive v1.0.2: 39 files, 45168 bytes\n\nFiles: references/access-token.md (4462b), references/api.md (3174b), references/apis/bg-arbok-open-cert-query-need-upload-items.md (3788b), references/apis/bg-arbok-open-cert-upload-product-cert.md (15409b), references/apis/bg-arbok-open-product-cert-query.md (3567b), references/apis/bg-arbok-open-upload-upload-file.md (2518b), references/apis/bg-compliance-edit.md (9751b), references/apis/bg-compliance-metadata-get.md (9792b), references/apis/bg-flash-open-upload-real-image.md (2798b), references/apis/bg-flash-open-upload-recognize.md (3949b), references/apis/bg-goods-compliancelabel-get.md (3747b), references/apis/README.md (1700b), references/authorization-flow.md (1186b), references/partner-global-catalog.md (4602b), scripts/_global_compliance_script.py (455b), scripts/_temu_auth_guide.py (6198b), scripts/_temu_common.py (12434b), scripts/_temu_global_common.py (3122b), scripts/_temu_token_store.py (4273b), scripts/check_linkfox_token.py (1797b), scripts/get_temu_access_token.py (1843b), scripts/global_compliance_arbok_cert_query_need_upload_items.py (315b), scripts/global_compliance_arbok_cert_upload_product_cert.py (299b), scripts/global_compliance_arbok_product_cert_query.py (285b), scripts/global_compliance_arbok_upload_upload_file.py (283b), scripts/global_compliance_edit.py (231b), scripts/global_compliance_flash_upload_real_image.py (290b), scripts/global_compliance_flash_upload_recognize.py (284b), scripts/global_compliance_goods_compliancelabel_get.py (278b), scripts/global_compliance_metadata_get.py (270b), scripts/list_temu_access_tokens.py (652b), scripts/save_temu_access_token.py (1377b), scripts/temu_file_download.py (1621b), scripts/temu_global_file_download.py (688b), scripts/temu_global_proxy.py (869b), scripts/temu_proxy.py (2053b), scripts/temu_token_guide.py (1594b), SKILL.md (4580b), _meta.json (149b)\n\nArchive v1.0.0: 40 files, 43943 bytes\n\nFiles: references/access-token.md (4462b), references/api.md (3157b), references/apis/bg-arbok-open-cert-query-need-upload-items.md (3788b), references/apis/bg-arbok-open-cert-upload-product-cert.md (15409b), references/apis/bg-arbok-open-product-cert-query.md (3567b), references/apis/bg-arbok-open-upload-upload-file.md (2518b), references/apis/bg-compliance-edit.md (9751b), references/apis/bg-compliance-metadata-get.md (9792b), references/apis/bg-flash-open-upload-real-image.md (2798b), references/apis/bg-flash-open-upload-recognize.md (3949b), references/apis/bg-goods-compliancelabel-get.md (3747b), references/apis/README.md (1700b), references/authorization-flow.md (1186b), references/partner-global-catalog.md (4602b), scripts/_global_compliance_script.py (455b), scripts/_temu_auth_guide.py (6198b), scripts/_temu_common.py (5593b), scripts/_temu_global_common.py (3096b), scripts/_temu_token_store.py (4237b), scripts/check_linkfox_token.py (1797b), scripts/get_temu_access_token.py (1843b), scripts/global_compliance_arbok_cert_query_need_upload_items.py (315b), scripts/global_compliance_arbok_cert_upload_product_cert.py (299b), scripts/global_compliance_arbok_product_cert_query.py (285b), scripts/global_compliance_arbok_upload_upload_file.py (283b), scripts/global_compliance_edit.py (231b), scripts/global_compliance_flash_upload_real_image.py (290b), scripts/global_compliance_flash_upload_recognize.py (284b), scripts/global_compliance_goods_compliancelabel_get.py (278b), scripts/global_compliance_metadata_get.py (270b), scripts/list_temu_access_tokens.py (652b), scripts/save_temu_access_token.py (1377b), scripts/temu_file_download.py (1595b), scripts/temu_global_file_download.py (670b), scripts/temu_global_proxy.py (851b), scripts/temu_proxy.py (2027b), scripts/temu_token_guide.py (1594b), skill-card.md (3622b), SKILL.md (3320b), _meta.json (149b)","readmeExcerpt":"Skill: Temu全球站-合规 Owner: linkfox-ai Summary: Temu 全球站电商合规（Compliance）API，经 LinkFox 网关转发 Partner Global 合规相关 OpenAPI（bg.compliance.*、bg.arbok.open.*、bg.flash.open.* 等，共 9 个接口）。当用户提到 Temu Global 合规、商品资质、GPSR、治理属性、实拍图、资质上传、bg.compliance.edit、arbok cert、site=global 合规 时触发。 Tags: latest:1.0.6 Version history: v1.0.6 | 2026-08-14T15:13:16.184Z | user Update from 1.0.5 to 1.0.6 v1.0.5 | 2026-08-07T11:14:19.313Z | user Updat","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"python scripts/global_compliance_edit.py '<JSON>'  # bg.compliance.edit"},{"language":"bash","snippet":"python scripts/global_compliance_metadata_get.py '<JSON>'  # bg.compliance.metadata.get"},{"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":"bash","snippet":"export LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/temu_global_proxy.py '{\"accessToken\":\"TOKEN\",\"site\":\"global\",\"type\":\"<TEMU_API_TYPE>\",\"params\":{}}'"},{"language":"text","snippet":"params\n└── request (OBJECT)\n    └── certType (INTEGER **必填**)\n    └── productId (LONG **必填**)"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: linkfox-temu-compliance-global\ndescription: Temu 全球站电商合规（Compliance）API，经 LinkFox 网关转发 Partner Global 合规相关 OpenAPI（bg.compliance.*、bg.arbok.open.*、bg.flash.open.* 等，共 9 个接口）。当用户提到 Temu Global 合规、商品资质、GPSR、治理属性、实拍图、资质上传、bg.compliance.edit、arbok cert、site=global 合规 时触发。\n---\n\n# Temu 全球站 — 电商合规（Compliance）\n\n本 skill（`linkfox-temu-compliance-global`）覆盖 Partner Platform for **Global** 的 **电商合规 / Product Compliance** 相关 OpenAPI。\n\n已接入 **9** 个接口，清单见 [partner-global-catalog.md](./references/partner-global-catalog.md)。\n\n**网关（本 skill 内置）**：\n\n| 能力 | 方法 | 路径 |\n|------|------|------|\n| 合规 OpenAPI（`global_compliance_*`、`temu_global_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-compliance-global`** |\n| 商品列表/详情/编辑/库存 | `linkfox-temu-manage-product-global` |\n| 价格 | `linkfox-temu-price-global` |\n| 促销 | `linkfox-temu-promotion-global` |\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## API 文档\n\n| 文档 | 内容 |\n|------|------|\n| [api.md](./references/api.md) | 网关、鉴权、错误码 |\n| [partner-global-catalog.md](./references/partner-global-catalog.md) | 接口目录 |\n| [apis/README.md](./references/apis/README.md) | 分接口文档 |\n\n## 默认参数\n\n| 字段 | 默认 | 说明 |\n|------|------|------|\n| site | `global` | Partner Global |\n| managementType | `semi-managed` | 半托管 |\n| tokenPurpose | `product-inventory` | 商品/合规场景 |\n\n## Scripts（按 type）\n\n| 脚本 | type | 状态 |\n|------|------|------|\n| `global_compliance_edit.py` | `bg.compliance.edit` | 已接入 |\n| `global_compliance_metadata_get.py` | `bg.compliance.metadata.get` | 已接入 |\n| `global_compliance_goods_compliancelabel_get.py` | `bg.goods.compliancelabel.get` | 已接入 |\n| `global_compliance_arbok_cert_query_need_upload_items.py` | `bg.arbok.open.cert.queryNeedUploadItems` | 已接入 |\n| `global_compliance_arbok_cert_upload_product_cert.py` | `bg.arbok.open.cert.uploadProductCert` | 已接入 |\n| `global_compliance_flash_upload_recognize.py` | `bg.flash.open.upload.r"},{"path":"references/apis/README.md","content":"# Compliance API 文档索引（Global）\n\n按 Temu `type` 分文件；入参来自 Partner **Request** 表，出参来自 **Response** 表 + **Response Example** 展开。\n\n## 已接入（9）\n\n| type | 文档 | 脚本 |\n|------|------|------|\n| `bg.compliance.edit` | [bg-compliance-edit.md](./bg-compliance-edit.md) | `global_compliance_edit.py` |\n| `bg.compliance.metadata.get` | [bg-compliance-metadata-get.md](./bg-compliance-metadata-get.md) | `global_compliance_metadata_get.py` |\n| `bg.goods.compliancelabel.get` | [bg-goods-compliancelabel-get.md](./bg-goods-compliancelabel-get.md) | `global_compliance_goods_compliancelabel_get.py` |\n| `bg.arbok.open.cert.queryNeedUploadItems` | [bg-arbok-open-cert-query-need-upload-items.md](./bg-arbok-open-cert-query-need-upload-items.md) | `global_compliance_arbok_cert_query_need_upload_items.py` |\n| `bg.arbok.open.cert.uploadProductCert` | [bg-arbok-open-cert-upload-product-cert.md](./bg-arbok-open-cert-upload-product-cert.md) | `global_compliance_arbok_cert_upload_product_cert.py` |\n| `bg.flash.open.upload.recognize` | [bg-flash-open-upload-recognize.md](./bg-flash-open-upload-recognize.md) | `global_compliance_flash_upload_recognize.py` |\n| `bg.flash.open.upload.real.image` | [bg-flash-open-upload-real-image.md](./bg-flash-open-upload-real-image.md) | `global_compliance_flash_upload_real_image.py` |\n| `bg.arbok.open.upload.uploadFile` | [bg-arbok-open-upload-upload-file.md](./bg-arbok-open-upload-upload-file.md) | `global_compliance_arbok_upload_upload_file.py` |\n| `bg.arbok.open.product.cert.query` | [bg-arbok-open-product-cert-query.md](./bg-arbok-open-product-cert-query.md) | `global_compliance_arbok_product_cert_query.py` |"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7dmc1t4j28hem1twwyav85p182pb1j\",\n  \"slug\": \"linkfox-temu-compliance-global\",\n  \"version\": \"1.0.6\",\n  \"publishedAt\": 1786720396184\n}"},{"path":"references/access-token.md","content":"# 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）（如未配置 按 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=global` / `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-global.temu.com |\n| global | 全球区 | openapi-b-global.temu.com |\n| eu | 全球站 | openapi-b-global.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 会过期，过期后重新在"},{"path":"references/api.md","content":"# linkfox-temu-compliance-global — API 参考\n\nTemu **全球站电商合规**（Partner Global **Product Compliance / 商品合规**），经本 skill `temu_global_proxy`（`POST /temu/proxy`）转发。Temu 的 `type` 写在 Body，**不是** URL 路径。\n\n> 网关与鉴权：本 skill `scripts/`（`LINKFOXAGENT_API_KEY`、`accessToken` / `storeKey`）。授权见 `references/access-token.md`。\n\n---\n\n## 调用规范\n\n| 项 | 说明 |\n|----|------|\n| 网关根地址 | `${LINKFOX_TOOL_GATEWAY}`（可用 `TEMU_API_BASE_URL` / `STORE_API_BASE_URL` 覆盖） |\n| 合规 OpenAPI | `POST /temu/proxy` |\n| 加签文件下载 | `POST /temu/fileDownload`（`temu_global_file_download.py`） |\n| LinkFox 鉴权 | Header **`Authorization`** 与 **`Token`**（同值）；或 `LINKFOX_AGENT_API_KEY` / `LINKFOXAGENT_API_KEY`；或 JSON `token`（如未配置 按 SKILL.md 的 **## 解决认证和积分问题** 处理） |\n| Temu 鉴权 | Body `accessToken`，或 `storeKey` + `site` + `managementType` + `tokenPurpose` |\n| 默认 | `site=global`，`managementType=semi-managed`，`tokenPurpose=product-inventory` |\n| 上游 OpenAPI（Global） | `https://openapi-b-global.temu.com/openapi/router`（网关按 `site` 解析） |\n\n### 网关请求 Body（`/temu/proxy`）\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| site | string | 是 | `global`（本 skill 默认） |\n| managementType | string | 是 | `semi-managed` |\n| accessToken | string | 与 storeKey 二选一 | Temu 店铺令牌 |\n| storeKey | string | 与 accessToken 二选一 | `~/.linkfox/temu-access-tokens.json` 中的键 |\n| tokenPurpose | string | 否 | 建议 `product-inventory` |\n| type | string | 是 | Temu 接口名（以 Partner Compliance 文档为准） |\n| params | object | 否 | 业务参数，见各接口文档 |\n\n### 网关响应\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| body | string | Temu 原始 JSON 字符串；脚本解析为 `temuBody` |\n| code | integer | 网关错误码：`1002` 参数/Token，`1003` 转发失败 |\n\n解析顺序：**网关 `code`** → `JSON.parse(body)` → `success` / `errorCode` / `errorMsg` / `result`。\n\n### 脚本调用\n\n```bash\nexport LINKFOXAGENT_API_KEY=\"<key>\"\npython scripts/temu_global_proxy.py '{\"accessToken\":\"TOKEN\",\"site\":\"global\",\"type\":\"<TEMU_API_TYPE>\",\"params\":{}}'\n```\n\n业务字段放在 `params`（或各 `global_compliance_*.py` 脚本约定的 `request` 结构，接入后以接口文档为准）。\n\n---\n\n## 接口一览\n\n完整 `sub_menu_code` 与 Partner 文档 URL 见 [partner-global-catalog.md](./partner-global-catalog.md)。\n\n**每个接口单独一份文档**：[apis/README.md](./apis/README.md)。\n\n---\n\n## 典型合规流程\n\n（待按 Partner Global Compliance 菜单接入后补充。）\n\n商品详情、类目属性等辅助查询可用 **`linkfox-temu-manage-product-global`** 对应接口。\n\n---\n\n## 网关错误码\n\n| code | 说明 | 处理 |\n|------|------|------|\n| 1002 | 参数或 LinkFox Token 无效 | 修正参数与 `LINKFOXAGENT_API_KEY` |\n| 1003 | 转发失败 | 检查 Temu token、白名单、网络 |\n| 402 | HTTP 402 | 按 SKILL.md 的 **## 解决认证和积分问题** 处理。 |\n\n---\n\n## Feedback API\n\n- **POST** `https://skill-api.linkfox.com/api/v1/public/feedback`\n- `skillName`: **`linkfox-temu-compliance-global`**"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1179,"uniquenessScore":35,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T16:54:19.489Z","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-10T16:54:19.489Z","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-10T21:53:41.086Z","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"}]}}}