READ-ONLY · R2 SNAPSHOTS · v1
YOUYOUMI 开放数据 API 接入说明
本文档面向外部开发者与 AI 代理。通过 API Key 只读查询已同步的经营快照(多店看板、利润、广告、达人、Upseller SKU 等)。 不提供写入、同步或删除能力。
收到凭证后:通用数据先调 /catalog;广告开发可直接从 /api/open/v1/ads 查看分点接口。
快速开始
- 准备 API Key
向管理员索取以
ydk_开头的密钥。完整密钥只在创建时显示一次。 - 验证连通性
curl -sS \ -H "Authorization: Bearer ydk_你的密钥" \ "https://youyoumi.asia/api/open/v1/"
成功时返回
ok: true与当前 Key 标签。 - 拉取 catalog,再读快照
curl -sS \ -H "Authorization: Bearer ydk_你的密钥" \ "https://youyoumi.asia/api/open/v1/catalog"
从返回的
datasets[].fetchUrl或下方「数据集速查」选择目标,再请求对应快照 URL。
基础信息
| Base URL | https://youyoumi.asia |
|---|---|
| API 前缀 | /api/open/v1 |
| 协议 | HTTPS · JSON · UTF-8 |
| 方法 | 仅 GET(读取);OPTIONS 用于 CORS 预检 |
| Content-Type | 响应为 application/json(快照端点)或原始 JSON 文件 |
| 文档页 | https://youyoumi.asia/open-data-api/ |
鉴权
除本说明页外,所有 /api/open/v1/* 读取接口都需要 HTTP Header:
Authorization: Bearer ydk_你的密钥
- Key 前缀固定为
ydk_ - 请勿把 Key 写进 URL 查询参数或前端公开代码
- Key 泄露时请立即联系管理员 revoke 并重新发放
推荐流程
获取全部 datasetId、是否可用、字节数、版本字段、fetchUrl,以及 Upseller 店铺列表。
按 id 读取快照。部分数据集需要 ?profile= 或 ?shopId=。
无需 TikTok Marketing API Token;继续按账户、日期、Campaign、商品、漏斗或视频素材读取已同步数据。
快照是完整 JSON 文件,不是分页列表 API。大文件请本地缓存,并用 ETag / generatedAt 判断是否需要重新拉取。
端点
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/open/v1/ | 服务信息、当前 Key 标签、端点索引 |
| GET | /api/open/v1/catalog | 全部数据集清单 + Upseller 店铺列表 + 额外 R2 对象 |
| GET | /api/open/v1/ads | TikTok Marketing API 广告分点接口索引(服务器快照型,不暴露 Marketing Token) |
| GET | /api/open/v1/snapshots/{datasetId} | 按 catalog 中的 id 拉取快照 JSON |
| GET | /api/open/v1/snapshots/{datasetId}?profile=shop6 | 需要 profile 的数据集(达人预览、评价、样品运营等) |
| GET | /api/open/v1/snapshots/upsellerSampleProfitShopSkus?shopId=533322 | Upseller 单店 SKU 明细;shopId 见 catalog |
| GET | /api/open/v1/r2?key=dashboard/tiktok-shops-summary.json | 按 R2 key 直读(仅限白名单前缀) |
| GET | /api/open/v1/static?path=/data/... | 按静态路径读取(兼容旧路径,优先用 snapshots) |
广告分点 API
首页广告数据由服务器持有的 TikTok Marketing API Token 定时同步到 R2。开发者调用下面的接口时只需要ydk_... API Key;Marketing Token 不会返回到浏览器、响应体或日志。
| 方法 | 路径 | 适用筛选 | 核心返回字段 |
|---|---|---|---|
| GET | /api/open/v1/ads | — | 端点索引、鉴权方式、数据时效 |
| GET | /api/open/v1/ads/accounts | 账户 | advertiser_name、report_type、date_window、metrics、data_status |
| GET | /api/open/v1/ads/summary | 账户 | spend、revenue、orders、roi 与各粒度可用性 |
| GET | /api/open/v1/ads/daily | 账户 + 日期 | date、spend、revenue、orders、roi |
| GET | /api/open/v1/ads/campaigns | 账户 + campaignId | campaign_id、报表 metrics / spend、配置与 sessions |
| GET | /api/open/v1/ads/adgroups | 账户 + campaignId | campaign_id、adgroup_id、adgroup_name、metrics |
| GET | /api/open/v1/ads/ads | 账户 + campaignId | campaign_id、ad_id、ad_name、metrics |
| GET | /api/open/v1/ads/products | 账户 + campaignId/productId | item_group_id、product_name、spend、revenue、orders、roi |
| GET | /api/open/v1/ads/products/daily | 账户 + campaignId/productId + 日期 | date、item_group_id、spend、revenue、orders、roi |
| GET | /api/open/v1/ads/attention | 账户 | impressions、clicks、add_to_cart、initiate_checkout、purchases、视频观看 |
| GET | /api/open/v1/ads/funnel | 账户 | impressions、clicks、add_to_cart、conversions、available |
| GET | /api/open/v1/ads/stores | 账户 | store_id、store_name、授权上下文与 status |
| GET | /api/open/v1/ads/videos | 账户 + productId | video_id、item/product 标识、title、status |
| GET | /api/open/v1/ads/sync-status | 账户 | schemaVersion、updatedAt、accountCount、syncStats、fx |
筛选与分页
- “账户”筛选:
profile、storeId、advertiserId,适用于所有数据端点 campaignId只适用于 Campaign、Ad Group、Ad、商品和商品日趋势productId(GMV Maxitem_group_id)只适用于商品、商品日趋势和视频startDate、endDate只适用于日趋势和商品日趋势,格式为YYYY-MM-DD- 分页:
page默认 1;pageSize默认 200,最大 1000 - 端点不支持的筛选会返回
400,不会被静默忽略
curl -sS \ -H "Authorization: Bearer ydk_你的密钥" \ "https://youyoumi.asia/api/open/v1/ads/campaigns?storeId=7494242775829480988&pageSize=100" curl -sS \ -H "Authorization: Bearer ydk_你的密钥" \ "https://youyoumi.asia/api/open/v1/ads/daily?profile=shop1-gmv-max&startDate=2026-08-01&endDate=2026-08-25"
这些端点读取最近一次成功同步的快照,不会因为每次请求而消耗 TikTok 上游配额。响应的updatedAt、dataSource 和各行状态用于判断新鲜度;缺失字段保持 null 或空数组,不伪造数据。 鉴权响应使用 private, no-store,如需缓存请在调用端按 updatedAt 管理私有副本。
数据集速查
共 28 个内置 datasetId。完整可用性与字节数以 catalog 实时返回为准。
| datasetId | 名称 | 参数 | 存储 | 版本字段 | 示例路径 |
|---|---|---|---|---|---|
tiktokShops | 多店经营看板 | — | r2 | updated_at | /api/open/v1/snapshots/tiktokShops |
tiktokShopsSummary | 多店摘要 | — | r2 | updated_at | /api/open/v1/snapshots/tiktokShopsSummary |
tiktokShopsManifest | 看板分片清单 | — | r2 | updated_at | /api/open/v1/snapshots/tiktokShopsManifest |
productPerformance | 商品表现 | — | r2 | generatedAt | /api/open/v1/snapshots/productPerformance |
profitDashboard | 利润看板 | — | r2 | updatedAt | /api/open/v1/snapshots/profitDashboard |
creatorDashboard | 达人 BD 看板 | — | r2 | syncedAt | /api/open/v1/snapshots/creatorDashboard |
creatorTikTok | 达人 TikTok 同步 | — | r2 | syncedAt | /api/open/v1/snapshots/creatorTikTok |
creatorOpenIdDirectory | Open ID 目录 | — | r2 | generatedAt | /api/open/v1/snapshots/creatorOpenIdDirectory |
creatorApiPreviewIndex | 达人 API 预览索引 | — | r2 | generatedAt | /api/open/v1/snapshots/creatorApiPreviewIndex |
creatorApiPreview | 达人 API 预览 | profile(如 default、shop6) | r2 | generatedAt | /api/open/v1/snapshots/creatorApiPreview?profile=default |
creatorContentIndex | 达人内容索引 | profile(如 default、shop6) | r2 | generatedAt | /api/open/v1/snapshots/creatorContentIndex?profile=default |
shopProductReviews | 商品评价情感 | profile(如 default、shop6) | r2 | generatedAt | /api/open/v1/snapshots/shopProductReviews?profile=default |
tiktokAds | TikTok 广告快照 | — | r2 | updatedAt | /api/open/v1/snapshots/tiktokAds |
tiktokAdsMonitor | 广告监控切片 | — | r2 | updatedAt | /api/open/v1/snapshots/tiktokAdsMonitor |
costData | SKU 成本目录 | — | r2 | updatedAt | /api/open/v1/snapshots/costData |
shopProductMaster | 商品主档 | — | r2 | generatedAt | /api/open/v1/snapshots/shopProductMaster |
ordersAllFull | 全店订单(完整) | — | r2 | updated_at | /api/open/v1/snapshots/ordersAllFull |
ordersAllSlim | 全店订单(精简) | — | r2 | updated_at | /api/open/v1/snapshots/ordersAllSlim |
creatorSampleOperations | 达人样品运营 | profile(如 default、shop6) | r2 | generatedAt | /api/open/v1/snapshots/creatorSampleOperations?profile=default |
shop6MarginPromotionPlan | 六店促销计划 | — | r2 | generatedAt | /api/open/v1/snapshots/shop6MarginPromotionPlan |
upsellerDaemonStatus | Upseller 守护进程 | — | r2 | updatedAt | /api/open/v1/snapshots/upsellerDaemonStatus |
inventoryCatalog | 库存商品目录 | — | static | generatedAt | /api/open/v1/snapshots/inventoryCatalog |
upsellerSampleProfit | Upseller 样品利润摘要 | — | r2 | generatedAt | /api/open/v1/snapshots/upsellerSampleProfit |
upsellerSampleProfitGlobalSkus | Upseller 全部 SKU 明细 | — | r2 | generatedAt | /api/open/v1/snapshots/upsellerSampleProfitGlobalSkus |
upsellerSampleProfitStockIndex | Upseller SKU 库存索引 | — | r2 | generatedAt | /api/open/v1/snapshots/upsellerSampleProfitStockIndex |
upsellerSampleProfitShopSkus | Upseller 单店 SKU 明细 | shopId(Upseller 数字店铺 ID) | r2 | generatedAt | /api/open/v1/snapshots/upsellerSampleProfitShopSkus?shopId=533322 |
upsellerSampleProfitSource | Upseller 样品利润完整源 | — | r2 | generatedAt | /api/open/v1/snapshots/upsellerSampleProfitSource |
productAnalysis | 爆品证据分析 | — | static | generatedAt | /api/open/v1/snapshots/productAnalysis |
常用 Upseller datasetId
upsellerSampleProfit— 摘要与 dataViews 索引upsellerSampleProfitGlobalSkus— 全量 SKU 明细upsellerSampleProfitStockIndex— 库存索引upsellerSampleProfitShopSkus?shopId=...— 单店 SKUupsellerSampleProfitSource— 完整源 JSON(体积较大)
错误码
错误响应体统一为 JSON:{ "ok": false, "message": "..." }
| HTTP | 含义 | 常见原因 | 处理建议 |
|---|---|---|---|
| 401 | 未授权 | 缺少 Header、Key 无效 | 检查 Authorization: Bearer ydk_... |
| 403 | 禁止访问 | Key 已 revoke | 联系管理员重新发放 |
| 400 | 参数错误 | profile/shopId/R2 key/path 不合法 | 对照 catalog 与本文档修正参数 |
| 404 | 未找到 | 未知 datasetId、快照尚未生成 | 先查 catalog 的 available 字段 |
| 405 | 方法不允许 | 使用了 POST/PUT/DELETE | 仅使用 GET |
| 503 | 服务暂不可用 | 后端临时故障 | 指数退避重试(见下方调用建议) |
代码示例
将 ydk_你的密钥 替换为管理员提供的 Key。
cURL
# 1) 验证 Key curl -sS -H "Authorization: Bearer ydk_你的密钥" \ "https://youyoumi.asia/api/open/v1/" # 2) 获取 catalog curl -sS -H "Authorization: Bearer ydk_你的密钥" \ "https://youyoumi.asia/api/open/v1/catalog" # 3) 读取多店摘要 curl -sS -H "Authorization: Bearer ydk_你的密钥" \ "https://youyoumi.asia/api/open/v1/snapshots/tiktokShopsSummary" # 4) 读取 Upseller 全量 SKU curl -sS -H "Authorization: Bearer ydk_你的密钥" \ "https://youyoumi.asia/api/open/v1/snapshots/upsellerSampleProfitGlobalSkus"
Python
import requests
BASE = "https://youyoumi.asia"
API_KEY = "ydk_你的密钥"
HEADERS = {"Authorization": f"Bearer {API_KEY}", "Accept": "application/json"}
# catalog
catalog = requests.get(f"{BASE}/api/open/v1/catalog", headers=HEADERS, timeout=60)
catalog.raise_for_status()
print(len(catalog.json()["datasets"]), "datasets")
# snapshot
resp = requests.get(
f"{BASE}/api/open/v1/snapshots/tiktokShopsSummary",
headers=HEADERS,
timeout=120,
)
resp.raise_for_status()
data = resp.json()
print(data.get("updated_at") or data.get("generatedAt"))JavaScript (fetch)
const BASE = "https://youyoumi.asia";
const API_KEY = "ydk_你的密钥";
const headers = { Authorization: `Bearer ${API_KEY}`, Accept: "application/json" };
const catalog = await fetch(`${BASE}/api/open/v1/catalog`, { headers });
if (!catalog.ok) throw new Error(await catalog.text());
const { datasets } = await catalog.json();
console.log(datasets.length, "datasets");
const snapshot = await fetch(
`${BASE}/api/open/v1/snapshots/profitDashboard`,
{ headers },
);
if (!snapshot.ok) throw new Error(await snapshot.text());
const profit = await snapshot.json();
console.log(profit.updatedAt || profit.meta?.generated_at);调用建议
- 频率:建议每 dataset 至少间隔 1–5 分钟;catalog 可 1 分钟拉一次。
- 超时:小快照 30–60s;Upseller 全量 SKU / source 建议 120–300s。
- 缓存:响应带
ETag;可发If-None-Match,命中时返回 304。 - 重试:仅对 503 / 网络错误做有限次指数退避(如 3 次:2s、4s、8s)。401/403/404 不要重试。
- 增量:比较 JSON 内
generatedAt/updated_at/updatedAt,未变化则跳过下载。 - 大文件:
upsellerSampleProfitSource体积大,优先用 summary / global-skus / shop 分片。
数据更新
| 数据类型 | 更新方式 | 典型频率 |
|---|---|---|
| TikTok 店铺 / 利润 / 广告 / 达人 | 后台 Cron 写入 R2,API 实时读取 | 约每小时(各店错开) |
| Upseller SKU 明细 | 本机守护进程重建后推送 R2 固定 key | 守护进程跑完即更新(通常日更) |
| 静态构建产物 | 随站点 deploy 更新 | 手动 deploy 时 |
重新 deploy 网站不会使 API Key 失效;Key 存在 D1,快照存在 R2。
在线探测
输入 API Key 后加载 catalog(只读,密钥不会保存到服务器)。
管理员 · 发放 API Key
仅管理员可见。为每位外部使用者创建一个 Key。