商城里的 商品条码查询PRO 和免费版 barcode-lookup 不是同一条接口。这条要的是国内已登记的条码档案:厂商注册名、规格、上市日期、官方图、包装宽高深。完整字段和农夫山泉示例在该页「接口文档」,以及 原始文档。

地址只有一条:
GET https://v1.apizero.cn/api/barcode-gs1
参数名是 `code`,不是免费版那个 barcode。密钥在 API Key 建。头写成 Authorization: Bearer 你的密钥。不要把 Key 写进页面或安装包。
先在网页上看一眼,再用商城「在线调试」、GS1 条形码解析 或 接口调试 打一次,再接到自己的后端。在线调试是真调用,会计入当日额度。

和免费版差在哪
两条都能查农夫山泉 6921168509256,用途不一样:
- 本接口(PRO):对准物品编码中心 / GS1 中国那套登记信息。覆盖国内注册条码(常见是
69开头的 EAN-13)。回包装尺寸、official原始条目。没有参考价、产地、企业地址。 - [barcode-lookup](https://apizero.cn/marketplace/barcode-lookup):日常反查名称、品牌、规格,可能带参考价和一张图。参数是
barcode。试用、轻量展示走它。
进口码、未在国内登记的码,PRO 经常是 found=false。这不代表商品假,只代表当前库里没有这份登记。要名称凑合能用时,换免费版再试一次。
页上写「会员版才有 height / width / depth / gross_weight / studio 和 official」。登录免费额度也能调这条地址;档位只决定每天几次、QPS 多少,字段以实际回包为准。
先发出去
code 必填。去掉空格和横线之后,长度只能是 8 / 12 / 13 / 14 位数字。包装上印了 01 + 14 位 GTIN(一共 16 位)也可以整段贴进去,接口会去掉 01 再查。
export APIZERO_API_KEY="你的密钥"
curl -sS -H "Authorization: Bearer $APIZERO_API_KEY" \
"https://v1.apizero.cn/api/barcode-gs1?code=6921168509256"也认 X-API-Key。成功时最外层 code 为 0,正文在 data。网关的 code 和条码参数 code 不是同一个东西:一个是业务成功与否,一个是条形码。
校验失败才会直接报错,例如:
- 没传
code - 去掉非数字后长度不对(不是 8/12/13/14,也不是 16 位且以
01开头) - 超过 14 位有效数字
这些是请求没发出去。查过了但库里没有,是下面的 found=false,HTTP 仍成功。
查到了:先读这几项
以文档里的农夫山泉为例,data.found 为 true 时卡片够用的字段:
name:完整产品名,例如「农夫山泉饮用天然水」brand:品牌manufacturer:发布企业,官方注册主体specification/net_content:规格、净含量sale_date:上市日期YYYY-MM-DDcategory/category_code:分类和 GPC 编码images:官网商品图 URL 数组,可能为空barcode:整理成 13 位 EAN-13gtin14:左侧补 0 的 14 位 GTIN,例如06921168509256registered/registration_message:是否已正式注册,以及说明原文
包装尺寸(会员档文档标明的那一组):
height/width/depth:毫米gross_weight:毛重studio:官网尺寸原文,一整句,例如「高度:227毫米 宽度:64毫米 …」
有尺寸时优先展示 studio,拆开的宽高深给仓储或对账。没有尺寸时这几个键仍在,值为 null。official_hit 为 true 表示拿到了官网档案,只是这件商品登记时没填尺寸。
official 是列表项原样。要对账、存档、给内部看原始键,读这里:gtin、firm_name、brandcn、gpc、gpcname、saledate、gtinstatus、RegulatedProductName 等。页面展示不要把整个对象甩给用户。
feature 对应登记里的描述。很多商品是空的,不要当成接口坏了。
use_days 是从登记日算到现在的天数,会随日期变。不要写死文档里的 6469。
没查到:看 found,不要看外层 code
未登记时外层仍是 code: 0、msg: 成功。data.found 为 false,registered 为 false,名称等业务字段为 null,images 是空数组,registration_message 常见为「商品未登记」。
业务逻辑必须先判断 found。把「没找到」当成 404 或当失败重试,会空耗额度。
短时间对同一条码连打,网关可能走缓存(命中官网完整档大约按天;未收录更短)。进销存对账可以接受稍慢一拍;不要用这条接口做扫码枪毫秒级动画。
接到自己的网站
浏览器只打你的后端。服务器再带 Key 去 v1.apizero.cn。
const url = new URL("https://v1.apizero.cn/api/barcode-gs1");
url.searchParams.set("code", barcode);
const res = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.APIZERO_API_KEY}` },
});
const json = await res.json();
if (json.code !== 0) throw new Error(json.msg || "barcode-gs1 failed");
const row = json.data;
if (!row.found) {
return { found: false, barcode: row.barcode };
}
return {
found: true,
name: row.name,
brand: row.brand,
manufacturer: row.manufacturer,
spec: row.specification,
images: row.images,
size: row.studio,
officialHit: row.official_hit,
};扫码枪读出来若带空格、括号,先剥成数字再传。13 位不够时接口会按 GTIN 规则补到 14 位再查,你不用自己补零,但展示给用户时用回包里的 barcode / gtin14。
App、小程序同样把请求放在服务端。回包较长时,用 JSON 工具 的 JSONPath 抽 data.name、data.studio、data.official.firm_name。
药品追溯、海关申报、司法鉴定不要拿本接口当正式依据。商城页底部有完整免责声明;调用即视为接受。内部核验、进销存对照、把登记信息展示给自己的用户,按声明里的合法用途来。
额度
这条按次计,不是大模型那种按 token。具体每日次数和 QPS 看商城页「访问限制」,以当时页上的为准。写这篇时:
- 不带头:每日 2 次,QPS 1
- 登录免费(带 Key):每日 5 次,QPS 2
- 黄金会员:每日 5,000 次,QPS 10
- 企业会员:每日 1,000,000 次,QPS 120
站内公告里「登录档 QPS 3」是全站常态;本接口页上仍标 QPS 2,以该接口页为准。免费次数用完再看套餐,不要换一把空 Key 碰运气。
常见卡住
缺少必填参数 code:参数名写成了barcode条形码长度不合法:夹了字母、少位、或随便扫了一个非商品码401/missing_token:要走登录额度却没带Bearerfound=false:进口码或未在国内登记。先确认是 69 开头,或改用免费版碰名称- 有名字没有宽高深:
official_hit为 true、尺寸为 null,登记本身没填 - 次数用完:看该接口今日已用
- 浏览器
Failed to fetch:页面直连了网关。改成打你自己的后端,或用接口调试代发
字段对过、额度还在,再接到网站。换条码只改 code,地址不用换。