结论先拍:淘宝TOP的API不是“全免费”,而是三层结构——免费API(有日额度上限)+ 基础收费API(超免额按量,塔内¥0.02/百次、塔外¥0.20/百次)+ 增值API(塔内¥0.06/百次、塔外禁止调用且需签增值协议)。中小自研ERP在日调用数万次以内通常落在免费额度里=0元;一旦超免额或碰CRM/数据罗盘,账单和权限墙会同时出现。
一、官方收费分层(2026现行《开放平台技术服务费规则》)
层级 | 代表接口 | 是否收费 | 收费标准(超免费额度后) | 关键约束 |
|---|---|---|---|---|
免费API | taobao.item.get、items.onsale.get、logistics.trace.get、taobao.tbk.*(淘宝客) | ✅ 免调用费 | 有日调用额度(个人数百~数千/天,企业数万~百万/天,视应用等级) | 超日额度触发限流或转入基础计费口径 |
基础收费API | trades.sold.get、trades.sold.increment.get、trade.fullinfo.get、items.inventory.get、logistics.online.send | 💰 超免额按量 | 塔内¥0.02/百次/AppKey;塔外¥0.20/百次/AppKey | 按月实际调用量结算,无包月 |
增值API | crm.members.get(RFM/会员洞察)、数据罗盘、竞品行业大盘、营销权益类 | 💰 按量+签约 | 塔内¥0.06/百次/AppKey;塔外❌禁止(未经平台允许不许调) | 必须聚石塔内+签《增值接口协议》+购对应增值包 |
菜鸟物流接口 | 物流流转查询 | 💰 按量 | 塔内¥0.02/百次,塔外¥0.20/百次 | 同基础API档 |
物流异常-菜鸟 | 异常查询 | 💰 按量 | 塔内¥0.10/百次,塔外¥0.50/百次 | |
DSS订单同步服务 | 推送至塔内RDS | 💰 按订单量 | ¥0.12/百单(历史曾0.06,现执行0.12) | 欠费按天逐级限流/停推 |
官方原文锚点:基础API塔内0.02/外0.2,增值API塔内0.06/外0.6且“增值API未经过平台允许禁止聚石塔外调用”。
二、免费额度到底“免多少”
官方不对外承诺固定数字,但实际运行中:
- 个人开发者:日免费调用约 数百~数千次,调订单类极易触线。
- 企业自研(已实名+店铺授权):日免费额度常见 5万~100万次/AppKey,取决于应用等级、是否入塔、店铺体量。
- 免费API(商品/淘宝客/物流轨迹):在免额内零费;淘宝客本身免调用费,成交后阿里妈妈抽佣。
- 控制台路径:开放平台→统计分析→API调用量,能看到“当日已免额/已计费”水位。
误区:“淘宝API免费”= 只对了前半句。免费的是‘额度内基础读’,订单增量高频跑、会员RFM、罗盘洞察,全在计费或禁调区。
三、什么时候开始花钱(算账)
单店ERP做订单增量同步,假设日调
trades.sold.increment.get 1万次(5分钟一轮+明细补全):- 月调用 30万次
- 企业免额按 8万/天 = 240万/月 → 30万 < 240万,0元
- 若日调 10万次(大促或10店轮询)→ 月300万 > 240万免额 → 超60万次 × 0.02/百次(塔内) = ¥120/月
- 同上若傻到塔外跑 → 60万次 × 0.20/百次 = ¥1200/月(10倍)
增值场景:自研CRM拉会员RFM,日调
crm.members.get 5000次(塔内必须)- 月15万次 × 0.06/百次 = ¥90/月 + 必须签增值包/冻资/入塔
- 塔外调 → 直接
no permission / 非聚石塔调用,不是扣费是拦截
四、Python:免费/计费分层探测 + 用量预警
# top_fee_lens.py
"""
淘宝TOP API 收费分层自检
- 按接口名归类 免费 / 基础收费 / 增值
- 注入当日已用调用量 + 估计日免额 → 判断是否触计费线
- 捕获 limited-by / no permission 特征
"""
import hashlib, time, requests
from typing import Dict
# 接口分层表(按需补全)
FREE_APIS = {"taobao.item.get","taobao.items.onsale.get","taobao.logistics.trace.get",
"taobao.tbk.dg.material.optional","taobao.tbk.item.info.get"}
BASE_APIS = {"taobao.trades.sold.get","taobao.trades.sold.increment.get",
"taobao.trade.fullinfo.get","taobao.items.inventory.get",
"taobao.logistics.online.send"}
VALUE_APIS = {"taobao.crm.members.get","taobao.crm.member.info.get",
"taobao.data.roofd.*","taobao.ju.data.*"} # 罗盘/竞品类按前缀匹配
def classify(method: str) -> str:
if method in FREE_APIS: return "free"
if method in BASE_APIS: return "base"
if method in VALUE_APIS or method.startswith(("taobao.crm.", "taobao.data.")):
return "value"
return "base" # 未知默认按基础谨慎处理
class TopFeeLens:
IN_BASE = 0.02/100
OUT_BASE = 0.20/100
IN_VALUE = 0.06/100
def __init__(self, app_key, app_secret, in_tower: bool,
est_free_daily: int = 80_000):
self.ak = app_key; self.ask = app_secret
self.in_tower = in_tower
self.free_daily = est_free_daily
self.today_base_calls = 0
def _sign(self, p):
f = sorted((k,v) for k,v in p.items() if k!="sign" and v is not None and str(v)!="")
qs = "".join(f"{k}{v}" for k,v in f)
return hashlib.md5(f"{self.ask}{qs}{self.ask}".encode()).hexdigest().upper()
def pre_check(self, method: str):
tier = classify(method)
if tier == "free":
return f"✅ {method} 属免费API,免额内0元(注意日总调用上限)"
if tier == "value":
if not self.in_tower:
raise PermissionError(f"❌ {method} 增值API禁止塔外调用,必须聚石塔内+签增值协议")
return f"💰 {method} 增值API 塔内¥0.06/百次,需签约增值包"
# base
if self.today_base_calls >= self.free_daily:
unit = self.IN_BASE if self.in_tower else self.OUT_BASE
return f"⚠️ 超免额,按量{unit*100:.3f}元/百次(塔{'内' if self.in_tower else '外'})"
remain = self.free_daily - self.today_base_calls
return f"✅ 基础API在免额内(剩{remain}次),0元"
def call(self, method, biz, token=None, max_retry=3):
tip = self.pre_check(method)
print(tip)
if tip.startswith("❌"):
raise PermissionError(tip)
params = {"method":method,"app_key":self.ak,
"timestamp":str(int(time.time()*1000)),"format":"json",
"v":"2.0","sign_method":"md5"}
if token: params["access_token"]=token
params.update(biz); params["sign"]=self._sign(params)
for att in range(max_retry):
r = requests.post("https://gw.api.taobao.com/router/rest", data=params, timeout=15)
d = r.json()
if "error_response" in d:
err = d["error_response"]
sub = err.get("sub_code","")
msg = err.get("msg","")
if "limited-by-app-access-count" in sub or "FLOW_CONTROL" in sub:
self.today_base_calls = self.free_daily + 1 # 标记已超免额
time.sleep(2**att); continue
if "no permission" in msg and classify(method)=="value":
raise PermissionError("❌ 增值API无权限:未签增值协议/未入塔")
raise Exception(f"{sub}: {msg}")
self.today_base_calls += 1
return d
raise RuntimeError("retry exhausted")
if __name__ == "__main__":
lens = TopFeeLens("AK", "AS", in_tower=True, est_free_daily=80_000)
# 场景1:商品查询(免费)
print(lens.pre_check("taobao.item.get"))
# 场景2:订单增量(基础,免额内)
print(lens.pre_check("taobao.trades.sold.increment.get"))
# 场景3:CRM会员(增值,塔内)
print(lens.pre_check("taobao.crm.members.get"))
# 场景4:CRM会员(增值,塔外模拟)
lens2 = TopFeeLens("AK","AS", in_tower=False)
try:
print(lens2.pre_check("taobao.crm.members.get"))
except PermissionError as e:
print(e)跑出来逻辑:
item.get→ ✅ 免费APItrades.sold.increment.get→ ✅ 基础在免额内 / ⚠️ 超免额按量crm.members.get塔内 → 💰 增值0.06/百次crm.members.get塔外 → ❌ 禁止调用
五、避坑三条
- “淘宝客免费”但有限:
tbk.*免调用费,但日调用上限按账号等级(初级~10万/高级~100万),且成交抽佣不是平台收你API费,是阿里妈妈收商家佣金,两码事。 - 免额不是“企业一律100万/天”:应用刚创建、无入塔、无店铺授权,免额可能只有几千;入塔+企业实名+自研标签才会放大到数十万级。
- 增值API的墙是“权限墙”不是“价格墙”:塔外调CRM不是贵10倍,是返回
no permission,必须先做三件事——入聚石塔、交MRD、签增值协议购包,否则¥0.06/百次这价都摸不到。
一句话收口:淘宝API的免费只覆盖“额度内的基础读”,订单高频同步超免额才按0.02/百次(塔内)计费,会员/罗盘类连计费入口都要先签协议入塔;做ERP时把“日调用量 vs 估计免额”做成启动自检,比事后看账单有用十倍。
要不要我把上面
TopFeeLens 改成读控制台导出的CSV调用日志 → 自动判定各AppKey是否触免额线 + 预估月度账单(塔内/塔外对照),直接嵌进中台调度器每天早上报一次?