PriceZag API — 将价格数据接入您的系统
使用 PriceZag JSON API 获取竞品价格与库存、管理商品和自动调价规则、下载报表,并实现工作流程自动化。
快速上手:curl 示例
MYAPIKEY 替换为您账户的 API 密钥(参见 API 密钥).创建测试商品:
curl -vX POST 'https://pricezag.com/api/v3/MYAPIKEY' -d '{"actions":[{"a":"productCreate","code":"000-SOME-TEST-PRODUCT","name":"Some Test Product created via PriceZag API","price":12.34,"currency":"USD"}]}'
(如果再次执行该命令,由于商品已经存在,您会收到错误提示)现在读取刚刚创建的商品:
curl -X POST 'https://pricezag.com/api/v3/MYAPIKEY' -d '{"actions":[{"a":"productGet","code":"000-SOME-TEST-PRODUCT"}]}' | python -mjson.tool
(如果您的终端没有安装用于解析 JSON 响应的 | python -mjson.tool 工具,可以将其从命令中移除)概述
PriceZag API 能做什么
PriceZag JSON API 让您的脚本和业务系统直接使用我们监控的竞品价格和库存数据。您可以读取商品数据,管理商品和分类,依据 自动调价规则计算价格,配置 提醒,以及下载 自定义电子表格。只要电商平台或编程语言能够发送 HTTPS 请求并处理 JSON,就可以使用本 API。
您也可以让常用的 AI 助手为您编写脚本。向它提供本文档的网址(https://pricezag.com/integrations/api),说明您希望自动化的操作,并告知使用的编程语言或电商平台。请妥善保管 API 密钥,不要将其粘贴到 AI 对话中。
PriceZag 平台本身已负责价格监控,因此 API 并非必需。需要将监控数据接入自己的系统时,API 才会派上用场。 Shopify 和 WooCommerce 也提供直接集成。
API 密钥与权限
在您的 PriceZag 账户中,打开 Automation > API。点击 Reveal the current API key 查看当前密钥,或点击 Change the API key 生成新密钥。两项操作都需要输入账户密码。用户还必须具有相应的 API 密钥权限(查看或生成密钥)。如果没有权限,请联系账户管理员。
请妥善保管 API 密钥。 API 密钥可能允许对账户数据进行大量修改,包括删除。请勿将密钥放入公开代码仓库、浏览器端代码或 AI 对话。如果需要他人协助开发集成,请为其创建具有适当权限的 PriceZag 用户,并在必要时更换 API 密钥。
API 访问范围取决于您的会员方案。拥有完整 API 权限时,脚本可访问账户中的全部商品;否则,只能访问按商品参考编号的字母数字顺序排序后的前 10 个商品。例如,若您有 1,000 个商品,编号从 SKU0001 到 SKU1000,则 API 只能访问 SKU0001 至 SKU0010。Free Forever 方案最初的完整功能试用期包含完整 API 访问权限。您也可以在会员方案中单独启用完整 API 权限。
API 活动日志与最近请求
账户中的 Automation > API 页面会显示最近一次 API 请求的时间,并提供 API Activity Log 按钮。脚本运行异常时,可通过这些信息确认请求是否到达 PriceZag,并排查调用失败或意外修改。
通过 API 进行的修改也会显示在账户各处的 History of Edits 中,操作者名称为 API。例如,商品修改记录可能显示 Price edited by API ,而不是 Price edited by JOHN。PriceZag 支持一个账户下的多个用户,因此可以区分自动化操作和团队成员的手动操作。
请求 URL 与方法
所有 API 请求均使用同一个 HTTPS 地址。请向该地址发送 POST 请求,并将 MYAPIKEY 替换为您的密钥:
https://pricezag.com/api/v3/MYAPIKEY
您希望 API 执行的操作(称为“动作”,action)及其参数应放在 JSON 请求正文中,而不是 URL 中。
在 POST 请求正文中发送包含一个或多个动作的 JSON 对象。无论是读取商品、更新价格还是下载电子表格,请求 URL 都保持不变。
无法发送 POST 请求?
万不得已时,可以将 JSON 正文进行 Base64 编码,并通过 GET 请求放入 ?data= URL 参数中。但 URL 有长度限制,因此强烈建议使用 POST。
API 动作如何执行
API 与用户界面(UI)在后端调用同一套功能,因此几乎所有可在界面中完成的操作,也都能通过 API 执行。
通过 API 发送请求时,JSON 数据应包含 要执行的所有动作组成的数组,数量为 1 至 每次请求最多 1,000 个动作。例如,您可以在单次请求中重命名 3 个商品并创建 1 个分类,共 4 个动作;也可以通过 1,000 个“productGet”动作,一次读取 1,000 个商品的数据。
动作会按照数组中的顺序执行。例如,如果要先创建自动调价规则,再将商品分配给该规则,就必须按此顺序排列动作,确保修改商品时规则已经存在。
请向下滚动查看 全部可用动作.
JSON 请求对象
关于脚本及 AI 生成的代码: 以下参考示例包含 // 注释和 ... 占位符,用于解释各个字段。这些仅供说明,不能直接作为有效 JSON 原样发送。发送请求前,请移除注释并替换占位符。上面的两个 curl 示例则包含有效的 JSON 请求正文。
{
"stopOnFailure" : 1, // (可选)默认情况下,即使某项操作失败,后端也会继续执行下一项。设为 1 则在失败时停止执行。
// 所有操作组成的数组:
"actions" : [
// 操作 1:
{
"a" : "someActionName", // 每个操作对象都使用字段 "a" 指定操作名称。
"xx" : "some parameter this action needs" // 除 "a" 之外的参数取决于具体操作。
},
// 操作 2:
{
"a" : "anotherActionName",
"abc" : "some parameter this action needs",
"xyz" : {"x":"some object this action needs", "y":5, "z":6}
},
// 操作 3:
{
"a" : "aThirdAction",
"xyz" : ["some array this action needs", "..."]
}
]
}
服务器响应与 HTTP 状态码
如果请求格式正确,除少数特别注明的动作(例如下载电子表格)外,您应始终收到 JSON 对象作为响应。可通过返回的 Content-Type: application/json 响应头判断。
我们的 HTTP 响应状态码含义如下:
► 200 所有动作都成功(中性结果 ok=0 也视为成功)。
► 406 部分动作成功,部分失败。
► 422 所有动作均失败,但失败原因不属于以下情况。
► 400 收到的 JSON 对象无法解析。
► 403 身份验证失败(通常是 API 密钥错误)。
如果想简化脚本,可以直接依据这些 HTTP 状态码进行判断;如果需要更多信息,返回的 JSON 对象会提供更详细的结果:
{
"ok" : 15, // 成功执行的操作数量(操作结果 ok>0)
"errors" : 0, // 返回错误的操作数量(操作结果 ok<0)
"actionsCount" : 20, // 最初请求的操作总数("actions" 数组的长度)
// 注意:据此可知有 5 项操作返回 ok=0,即没有失败,但也没有产生任何变更。
// 最初请求的所有操作(顺序不变):
"actions" : [
...
// 每项操作的响应对象:
{
"a" : "someActionName",
"ok" : 4, // 执行结果:>0 表示成功,0 表示无变更,<0 表示错误。
// 例如,将商品价格设置为与原价格相同的数值,就可能返回 0。
// 如果商品不存在,则可能返回 -1。
// >0 的具体含义取决于操作,通常表示实际修改的字段或项目数量。
"error" : "...", // 如果 ok < 0,此处为错误信息。
// 我们的错误信息通常很详细。建议将其写入日志,
// 以便获得排查问题所需的信息。
... // 此操作返回的其他特定数据。
},
...
]
}
示例在哪里?
请求频率与定时任务
为了避免正常的 API 请求受到影响,请遵循以下建议:
► 切勿使用错误的 API 密钥。防火墙对错误密钥的容忍度较低(网站登录密码错误也是如此)。
► 将多个动作放进同一个 JSON 对象中,一次请求最多 1,000 个动作。例如,创建 1,000 个商品应发送一条请求,而不是 1,000 条请求。
► 如果确实需要发送大量请求,请在请求之间暂停 500 毫秒,并复用同一个 HTTPS 连接(每次请求都新建连接是常见错误)。只有在一次需要更新数十万个商品时,大量请求才比较合理;此时每条请求应包含 1,000 个动作。
我们没有固定的请求频率限制。防火墙会综合数十项参数做出判断。合理控制请求频率是最好的做法。
定时请求:
如果需要定期运行 API 请求,请加入随机延迟,避免总在整分的第 0 秒发起请求。许多客户都会在同一时间发送请求;错开时间有助于加快响应,并降低服务器繁忙时超时的可能性。
全部可用 API 动作
下面列出了各个动作的参数以及请求和响应示例。左侧导航可直接跳转至相应动作。
商品
| 动作 | 用途 |
|---|---|
| productCreate | 创建新商品 |
| productEdit | 编辑现有商品 |
| productCompetitors | 编辑商品的竞品网址 (无需覆盖全部网址) |
| productCategories | 编辑一个或多个商品的分类 (无需覆盖全部分类) |
| productRepricing | 将大量商品分配到自动调价规则 |
| productDelete | 删除一个或多个商品 |
| productGet | 读取单个商品 (及其竞品数据) |
| productGetAll | 读取所有商品 (及其竞品数据) |
分类
| 动作 | 用途 |
|---|---|
| categoryCreate | 创建新分类 |
| categoryEdit | 编辑现有分类 |
| categoryDelete | 删除一个或多个分类 |
| categoryCopy | 将商品从一个或多个分类复制/移动到其他分类 |
| categoryGet | 读取单个分类 |
| categoryGetAll | 读取所有分类 |
提醒
| 动作 | 用途 |
|---|---|
| alertRecipientCreate | 新增提醒收件人 |
| alertRecipientEdit | 编辑提醒收件人及/或其提醒规则 |
| alertRecipientDelete | 删除提醒收件人 |
| alertRuleEdit | 编辑收件人现有的提醒规则 |
| alertRuleCreate? | 不存在此动作。请改用 alertRecipientEdit,并提供“rulesAdd”数组。 |
| alertRuleDelete? | 不存在此动作。请改用 alertRecipientEdit,并提供“rulesRemove”数组。 |
| alertGetAll | 读取所有提醒收件人及其提醒规则 |
自动调价规则
| 动作 | 用途 |
|---|---|
| repricingCreate | 创建自动调价规则 |
| repricingEdit | 编辑现有的自动调价规则 |
| repricingDelete | 删除自动调价规则 |
| repricingGetAll | 读取所有自动调价规则 |
电子表格
| 动作 | 用途 |
|---|---|
| spreadsheetDownload | 下载电子表格 |
| spreadsheetPresetEdit | 重命名/删除电子表格预设 |
| spreadsheetAutoCreate | 创建电子表格自动导出任务 |
| spreadsheetAutoEdit | 编辑电子表格自动导出任务 |
竞品及其他功能
| 动作 | 用途 |
|---|---|
| competitorDeleteAll | 从所有商品或指定分类中删除某个竞争对手 |
| mathEdit | 设置/编辑竞争对手域名的价格计算公式 |
商品
productCreate — 创建新商品
{ "actions" : [
...
{
"a" : "productCreate",
"code" : "UNIQUE-REF-CODE", // 长度为 1–80 个字符([a-z\d][a-z\d_-]{0,78}[a-z\d]);不区分大小写(转换为大写)。
"name" : "The Product Name", // 长度为 1–200 个字符。
"price" : 1234.90, // 注意逗号和小数点:千位不使用分隔符,小数点必须使用英文句点。
"currency" : "USD",
"cost" : 1234.90, // (可选)
"costCurrency" : "USD", // 指定 cost 时必填。
"repricingRule" : "The Rule Name", // (可选)指定调价规则(空字符串表示禁用;规则不存在则报错)。
"myWebsite" : "https://...", // (可选)URL,或 shopify:productId:variantId,或 woocommerce:productId(:variationId)。
"competitors" : ["https://...", "https://..."], // (可选)
"categories" : ["The Category 1", "The Category 2"], // (可选)商品所属的分类(若分类不存在则自动创建)。
"comments" : "Some comments\nAnd another line", // (可选)最多 1000 个 UTF-8 字符。
"custom_someFieldName1" : "Value of custom field", // (可选)
"custom_someFieldName2" : "Value of other\nCustom\tField", // (可选)
// 自定义字段供您在内部使用,例如导出电子表格时可作为列显示,也可用于账户中的其他位置。
// 每个商品最多可有 20 个自定义字段。字段名最多包含 40 个字母、数字或下划线(区分大小写);不含 "custom_" 前缀,加上前缀最多 47 个字符。
// 字段值最多 500 字节(注意不一定等于 500 个字符)。可将自定义字段值设为数字,如 custom_varname:123,
// 但 API 返回时始终为字符串(custom_varname:"123"),必要时请自行转换类型。
// 将自定义字段的值设为 "" 即可彻底删除该字段。删除操作适用于 productEdit,而非 productCreate。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "productCreate",
"ok" : 1,
"code" : "REF-CODE", // 数据库最终保存的商品编码(例如特殊字符可能会被转换)。
},
...
]
}
productEdit — 编辑现有商品
{ "actions" : [
...
{
"a" : "productEdit",
"code" : "REF-CODE",
... // 使用与 productCreate 相同的参数,且均为可选。
"newCode" : "REF-CODE-RENAMED", // (可选)
"competitors" : ["https://...", "https://..."], // 如果提供,将覆盖所有现有的竞品 URL。
// 如果只想在现有竞品网址列表中添加或移除网址,请改用 productCompetitors 操作。
"categories" : ["The Category 1", "The Category 2"], // 如果提供,将覆盖现有分类。若只需局部修改,请使用 productCategories 或 categoryEdit。
"custom_someFieldName" : "New value or empty to delete that custom field",
// 每个商品最多 20 个自定义字段;如需添加新字段,可以先将旧字段设为 "" 予以删除。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "productEdit",
"ok" : 3, // 修改项数量(例如修改自身价格和 2 个竞品 URL,则结果为 3)。
"code" : "REF-CODE", // 数据库中新的最终商品编码(例如特殊字符可能会被转换)。
},
...
]
}
productCompetitors — 编辑商品的竞品网址
{ "actions" : [
...
{
"a" : "productCompetitors",
"code" : "REF-CODE",
"competitorsAdd" : ["https://...", "https://..."], // (可选)将这些竞品 URL 添加到现有列表。
"competitorsRemove" : ["https://...", "example.com/a0ff80...5f00", "example.net"], // (可选)移除这些竞品;每个元素可以是:
// > 完整 URL(包括可能添加的 # 修饰符);标签部分可以省略。
// > 竞品 "ref"(其他操作返回的引用,由根域名和 32 字符的 MD5 哈希组成)。
// > 根域名或完整主机名;这会移除该商品中来自该域名的全部竞品 URL。
// 注意:"competitorsAdd" 和 "competitorsRemove" 也可以直接使用字符串,而不必使用只含一个元素的数组。
// 先执行移除,再执行添加。因此可以先移除某个域名,再添加该域名下的一条 URL。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "productCompetitors",
"ok" : 3, // 修改的竞品 URL 数量。
"competitorsAdded" : 2, // 添加到商品的竞品 URL 数量。
"competitorsRemoved" : 1, // 从商品中移除的竞品 URL 数量。
// 错误情况:
// > 添加已经存在的 URL 不会报错(ok = 0)。
// > 移除不存在的完整 URL 或 "ref" 会报错(ok = -1)。
// > 按域名移除时,即使该域名不存在,也不会报错(ok = 0)。
},
...
]
}
productCategories — 编辑一个或多个商品的分类
此动作与用户界面中的以下操作相同:打开 All Products,选择若干商品,然后点击 Selected Products > Edit Categories。您可以查看界面中的详细说明。
也可以参阅 categoryEdit 动作,选择更适合您的方法。
{ "actions" : [
...
{
"a" : "productCategories",
"code" : "REF-CODE", // 不区分大小写(字符串),或者:
"code" : ["REF-CODE-1", "REF-CODE-2"], // 也可以使用包含多个商品的数组(最多 100,000 个)。
"categoriesRemove" : ["The Category 1", "The Category 2"], // (可选)首先从这些分类中移除商品。
"categoriesRemoveAll" : 1, // (可选)首先从所有分类中移除商品(与 productEdit 相同)。
"deleteEmptyCategories" : 1, // 设置后,任何因移除商品而变为空的分类
// 都将被删除。
"categoriesAdd" : ["The Category 1", "The Category 2"], // (可选)随后将商品添加到这些分类(不存在则创建)。
"categoriesAddClear" : 1, // (可选)添加商品之前,先清空这些目标分类。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "productCategories",
"ok" : 3, // 修改的商品数量。
},
...
]
}
productRepricing — 将大量商品分配到自动调价规则
这与 productEdit 动作的功能相同。但由于每次请求最多只能包含 1,000 个动作,如果要通过 productEdit 将 50,000 个商品分配给某条规则,就必须发送 50 次请求,执行速度也会慢得多。
如果只需修改少量商品,可以使用 productEdit 动作。
{ "actions" : [
...
{
"a" : "productRepricing",
"repricingRule" : "The Rule Name", // 不区分大小写;""(空字符串)表示不使用规则,即禁用自动调价。
"products" : ["REF-CODE-1", "REF-CODE-2"], // 不区分大小写(最多 100,000 个)。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "productRepricing",
"ok" : 10, // 修改的商品数量。
// 如果所有商品原本就使用这条规则,则返回 ok=0。
},
...
]
}
productDelete — 删除一个或多个商品
此动作与用户界面中的以下操作相同:打开 All Products,选择若干商品,然后点击 Selected Products > Delete.
{ "actions" : [
...
{
"a" : "productDelete",
"code" : "REF-CODE", // 不区分大小写(字符串),或者:
"code" : ["REF-CODE-1", "REF-CODE-2"], // 也可以使用数组,一次删除多个商品(最多 100,000 个)。
"deleteEmptyCategories" : 1, // 设置后,任何因删除商品而变为空的分类
// 也将被一并删除。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "productDelete",
"ok" : 2, // 成功删除的商品数量。
},
...
]
}
productGet — 读取单个商品
{ "actions" : [
...
{
"a" : "productGet",
"code" : "REF-CODE", // 不区分大小写。
"currency" : "EUR", // (可选)将所有金额换算为指定货币,而不是商品价格原本使用的货币。
"withStats" : 1, // (可选)返回统计信息对象。
"noCompetitors" : 1, // (可选)不返回竞品数组,以减少响应体积。
"noComments" : 1, // (可选)不返回备注(……)。
"withScreenshots" : 1, // (可选)返回每个竞品最新截图的 URL。
"sickMax" : 2, // (可选,默认值为 1)取值 0–3;仅返回错误级别不高于 N 的竞品 URL。
},
...
] }
返回该商品的全部信息,包括竞品的当前价格和库存。响应:
{
...
"actions" : [
...
{
"a" : "productGet",
"ok" : 1,
"code" : "REF-CODE",
"name" : "The Product Name",
"price" : 1234.90, // 您自己的价格,始终以原始货币表示。
"currency" : "USD", // "price" 的原始货币。
"convCurrency" : "EUR", // 换算后金额所使用的货币(传入的 "currency",或商品价格的原始货币)。
"priceConv" : 1234.90, // 按 "convCurrency" 换算后的自身价格;也可能与 "price" 相同。
"cost" : 1234.90,
"costCurrency" : "USD",
"costPriceConv" : 1234.90, // 将自身成本换算为 "price" 所使用的货币。
"costConv" : 1234.90, // 将自身成本换算为 "convCurrency"。
"margin" : 10.5, // 百分比(可以为负数)。
"repricingRule" : "The Rule Name", // 未启用自动调价时,这 3 个调价字段均不会出现。
"reprice" : 1234.90, // 根据 repricingRule 计算得出的当前调价金额。
"repriceCurrency" : "USD", // 与 "convCurrency" 相同,此处仅为便于理解。
"myWebsite" : "https://...",
"created" : 1234567890, // 商品创建时的 Unix 时间戳(Epoch)。
"createdBy" : "SOMEUSER", // 用户名或 "API"。
"edited" : 1234567890, // 最近一次修改的 Unix 时间戳(如曾修改)。
"editedBy" : "SOMEUSER", // 用户名或 "API"。
"comments" : "Some comments\nAnd another line",
"commentsLast" : 1234567890, // 最近一次修改备注的 Unix 时间戳(如曾修改)。
"commentsLastBy" : "SOMEUSER", // 用户名或 "API"。
"categories" : ["The Category 1", "The Category 2"],
"stats" : {
// 只有错误级别为 0 或 1 的竞品 URL 才计入统计,与 "sickMax" 无关。
// 所有金额均使用 "convCurrency",即您指定的 "currency" 或商品原始货币。
// 注意:如果没有可用金额(例如 compIn* 统计中没有任何竞品有货),该值为 0。
"rank" : 1.23, // 您的价格排名(1 表示没有竞品价格比您更低)。
"rankIn" : 1.23, // 您在有货竞品中的价格排名。
"compCount" : 3, // 具有有效价格的竞品数量。
"compInCount" : 3, // 有货竞品数量……
"compOutCount" : 3, // 缺货竞品数量……
"compAvg" : 123.56, // 所有竞品的平均价格。
"compAvgVsMe" : 123.56, // 您的价格与竞品平均价的差额(以 convCurrency 表示;负数表示您的价格更低)。
"compInAvg" : 123.56, // 有货竞品的平均价格。
"compInAvgVsMe" : 123.56, // 与 "compAvgVsMe" 相同,但只统计有货竞品。
"compLowest" : 123.56, // 最低竞品价格。
"compLowestVsMe" : 123.56, // 与 "compAvgVsMe" 相同,但比较对象是最低价而非平均价。
"compInLowest" : 123.56, // 有货竞品中的最低价格。
"compInLowestVsMe" : 123.56, // 与 "compInAvgVsMe" 相同,但……
"compHighest" : 123.56, // 最高竞品价格。
"compHighestVsMe" : 123.56, // 与 "compAvgVsMe" 相同,但……
"compInHighest" : 123.56, // 有货竞品中的最高价格。
"compInHighestVsMe" : 123.56, // 与 "compInAvgVsMe" 相同,但……
},
"competitors" : [
// 按价格从低到高排列的竞品数组,每个竞品都是一个对象:
...
{
"url" : "https://...", // 包含您可能添加的 # 修饰符。
"ref" : "example.com/123abc...def",
// URL 引用(根域名加上 32 字符的 MD5 哈希),系统内部用它来识别 URL。
"domain" : "example.com", // 该竞品的根域名。
"price" : 1234.90, // 网站上最近一次获取到的价格(已应用您设置的价格计算规则)。
"currency" : "USD", // 网站上识别到的货币。
"priceConv" : 1234.90, // 换算为 "convCurrency" 的价格。
"stock" : "5", // 库存(字符串):"A" 表示有货,"2" 表示库存 2 件,"0" 表示缺货,"" 表示未知。
"salesWk" : 123, // 预估每周销量(如有;说明请参阅商品页面中的问号提示)。
"screenshotURL" : "https://pricezag.com/.../screenshot.png",
// 如果启用了 "withScreenshots",返回最新截图 URL(长链接可公开访问,无需登录)。
"confidence" : 98,
// 价格识别准确度的置信度百分比(详情请点击商品页面上的 (?))。
// 低于 70%(阈值可设置)时,平台会在价格旁显示问号,标记为“可信度低”。
// 这与 URL 错误级别无关:即使当前访问失败,上次获取的价格也可能是准确的;
// 反之,即使页面可以访问,也不代表一定识别到了正确的价格。
"sick" : 0, // URL 错误级别,范围为 0–3。
// 0:最近一次抓取成功(页面可以访问,且找到了价格)。
// 1:最近一次抓取失败,但近期曾成功(这种情况很常见,通常无需担心)。
// 2:连续多天未能获取有效价格。
// 3:连续数周未能获取有效价格。
// 注意:只有错误级别不高于 1 的 URL 才有 "price" 和 "priceConv" 字段;级别 2 和 3 不返回价格。
},
...
],
"custom" : {
// 以下是您的自定义字段。如不清楚其用途,请在界面中打开
// 商品页面,点击 CUSTOM FIELDS 区域旁的 (?) 图标查看说明。
// 没有自定义字段时,整个 "custom" 对象将不存在。
"variable_1" : "value 1", // 返回值始终是字符串,即使实际表示数字。
"variable_2" : "value 2", // 空值不存在,因为设为空值会删除该变量。
...
}
},
...
]
}
productGetAll — 读取所有商品
{ "actions" : [
...
{
"a" : "productGetAll",
"currency" : "EUR", // (可选)将所有金额换算为指定货币,而不是各商品原本使用的货币。
"withStats" : 1, // (可选)返回统计信息对象。
"noCompetitors" : 1, // (可选)不返回竞品数组,以减少响应体积。
"noComments" : 1, // (可选)不返回备注(……)。
"withScreenshots" : 1, // (可选)返回每个竞品最新截图的 URL。
"sickMax" : 2, // (可选,默认值为 1)取值 0–3;仅返回错误级别不高于 N 的竞品 URL。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "productGetAll",
"ok" : 10, // 商品总数。
"products" : [ // 按商品编码字母顺序排列的商品数组,每个商品为一个对象:
...
{ ... }, // 商品对象,格式与上方 productGet 操作返回的对象相同
...
],
},
...
]
}
您也可以考虑使用 categoryGet 动作。分类
categoryCreate — 创建新分类
与其他允许分类存在或不存在的动作不同(例如 productCreate 既接受现有分类,也接受新分类),如果指定的分类已经存在,此动作将失败。
{ "actions" : [
...
{
"a" : "categoryCreate",
"name" : "The New Category Name",
"name" : ["New Category 1", "New Category 2"], // 也可以使用数组。
"products" : ["REF-CODE-1", "REF-CODE-2"], // (可选)创建分类时,将这些商品加入相应分类。
"comments" : "Some comments\nAnd another line", // (可选)最多 1000 个 UTF-8 字符。
},
...
] }
categoryEdit — 编辑现有分类
{ "actions" : [
...
{
"a" : "categoryEdit",
"name" : "The Category Name", // 不区分大小写。
"newName" : "The Category Renamed", // (可选)
"products" : ["REF-CODE-1", "REF-CODE-2"], // (可选)覆盖原有的商品列表。
"productsAdd" : ["REF-CODE-1", "REF-CODE-2"], // (可选)将这些商品添加到分类。
"productsRemove" : ["REF-CODE-3", "REF-CODE-4"], // (可选)将这些商品从分类中移除(不会删除商品本身)。
"comments" : "To overwrite the comments.", // (可选)最多 1000 个 UTF-8 字符。
},
...
] }
因此, "products", "productsAdd" 和 "productsRemove" 的作用相同,都是修改该分类包含的商品,只是方式不同。若要移除该分类中的全部商品,只需设置 "products" : []响应:
{
...
"actions" : [
...
{
"a" : "categoryEdit",
"ok" : 5, // 修改项数量。
// 修改分类名称、备注,以及添加或移除每个商品,均分别计为一次修改。
"name" : "The Category Name", // 如果已重命名则返回新名称,否则返回原名称。
"productsCount" : 30, // 该分类目前的商品数量(无论是否发生变化)。
"productsAdded" : 2, // 新加入该分类的商品数量。
"productsRemoved" : 2, // 从该分类中移除的商品数量。
},
...
]
}
categoryDelete — 删除一个或多个分类
{ "actions" : [
...
{
"a" : "categoryDelete",
"name" : "The Category Name", // 不区分大小写(字符串),或者:
"name" : ["Category 1", "Category 2"], // 也可以使用数组,一次删除多个分类(最多 1000 个)。
"deleteProducts" : 1,
// 默认情况下仅删除分类,其中的商品会脱离该分类,
// 但是…… with deleteProducts all products in the category are deleted without confirmation,
// and the competitor URLs are deleted along with them without any way of restoring them!
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "categoryDelete",
"ok" : 2, // 删除的分类数量。
"productsCount" : 123, // 这些分类涉及的商品数量。
"productsDeleted" : 123, // 因启用 "deleteProducts" 而删除的商品数量。
// 注意:同一商品即使属于多个指定分类,也只计算一次。
},
...
]
}
categoryCopy — 在分类之间复制/移动商品
此操作不会删除任何商品,只会调整商品所属的分类。
此动作与用户界面中的以下操作相同:打开 Categories,选择若干分类,然后点击 Selected Categories > Copy & More。您可以查看界面中的详细说明。
{ "actions" : [
...
{
"a" : "categoryCopy",
"categoriesFrom" : ["Category 1", "Category 2"], // 匹配以下来源分类中的商品。
"removeMode" : "cat", // (可选)将匹配的商品从指定的 "categoriesFrom" 分类中移除。
"removeMode" : "all", // (可选)将匹配的商品从其所属的所有分类中移除。
// 如果省略 removeMode,商品仍保留在 "categoriesFrom" 中,同时加入 "categoriesTo"(复制而非移动)。
"deleteMode" : "cat", // (可选)复制商品后删除指定的 "categoriesFrom" 分类。
"deleteMode" : "all", // (可选)删除这些商品所属的所有分类。
// 如果省略 deleteMode,即使通过 "removeMode" 移走商品,"categoriesFrom" 分类仍会保留。
"categoriesTo" : ["Another Category 1", "Another Category 2"],
// 将所有匹配的商品加入这些目标分类(不存在则自动创建)。
"categoriesToClear" : 1, // (可选)添加商品之前,先清空这些目标分类。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "categoryCopy",
"ok" : 3, // 被修改的分类数量(包括来源分类和目标分类)。
// "ok" 等于 categoriesModified + categoriesCreated + categoriesDeleted。
"categoriesModified" : 2, // 被修改的现有分类数量(包括来源分类和目标分类)。
"categoriesCreated" : 1, // 新创建的分类数量。
"categoriesDeleted" : 0, // 因 "deleteMode" 而删除的分类数量。
"productsCount" : 123, // 匹配指定 "categoriesFrom" 分类的商品数量。
// 注意:同一商品即使属于多个指定来源分类,也只计算一次。
},
...
]
}
categoryGet — 读取单个分类
{ "actions" : [
...
{
"a" : "categoryGet",
"name" : "The Category Name", // 不区分大小写。
"currency" : "EUR", // (使用 withStats 或 withProducts 时必填)统计所使用的货币。
"withStats" : 1, // 同时返回统计信息(速度较慢)。
"withProducts" : 1, // 同时返回该分类中的商品(可能产生大量数据)。
"noCompetitors" : 1, // 使用 withProducts 时,不返回竞品数组,以减少响应体积。
"noComments" : 1, // 使用 withProducts 时,不返回商品备注(仍返回分类备注)。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "categoryGet",
"ok" : 1,
"name" : "The Category Name",
"created" : 1234567890, // Unix 时间戳(Epoch)。
"createdBy" : "SOMEUSER", // 用户名或 "API"。
"comments" : "Comments of this category",
"commentsLast" : 1234567890, // 最近一次修改备注的 Unix 时间戳(如曾修改)。
"commentsLastBy" : "SOMEUSER", // 用户名或 "API"。
"productsCount" : 10, // 该分类中的商品数量。
"stats" : {
// 这些统计数据也会显示在分类页面和分类列表的各列中。
// 如需了解各项含义,可在分类列表中添加相应列并点击 (?)。
// 所有金额均使用请求中指定的 "currency"。
// 注意:如果没有可用金额(例如 compIn* 统计中没有竞品有货),该值为 0。
"priceAvg" : 123.45, // 您自己商品的平均价格。
"costAvg" : 123.45, // 只有设置了成本的商品才计入该平均值。
"marginAvg" : 10.5, // 百分比(可以为负;仅统计设置了成本的商品)。
"rankAvg" : 1.23, // 您的平均价格排名(1 表示没有竞品价格比您更低)。
"rankInAvg" : 1.23, // 您在有货竞品中的平均价格排名。
"productsCountComp" : 9, // 拥有竞品的商品数量。
"productsCountCompIn" : 7, // 拥有有货竞品的商品数量。
"compAvg" : 123.56, // 所有商品的竞品平均价格再取平均。
"compAvgVsMe" : 123.56, // 您的价格与竞品价格的平均差额(以指定货币表示;负数表示您的价格更低)。
"compInAvg" : 123.56, // 与 "compAvg" 相同,但只统计有货竞品。
"compInAvgVsMe" : 123.56, // 与 "compAvgVsMe" 相同,但只统计有货竞品。
"compLowest" : 123.56, // 与 "compAvg" 相同,但对每个商品的最低竞品价取平均。
"compLowestVsMe" : 123.56, // 与 "compAvgVsMe" 相同,但……
"compInLowest" : 123.56, // 与 "compInAvg" 相同,但……
"compInLowestVsMe" : 123.56, // 与 "compInAvgVsMe" 相同,但……
"compHighest" : 123.56, // 与 "compAvg" 相同,但对每个商品的最高竞品价取平均。
"compHighestVsMe" : 123.56, // 与 "compAvgVsMe" 相同,但……
"compInHighest" : 123.56, // 与 "compInAvg" 相同,但……
"compInHighestVsMe" : 123.56, // 与 "compInAvgVsMe" 相同,但……
},
"products" : [ // 按商品编码字母顺序排列的商品数组,每个商品为一个对象:
...
{ ... }, // 商品对象,格式与 productGet 操作返回的对象相同
...
],
},
...
]
}
categoryGetAll — 读取所有分类
{ "actions" : [
...
{
"a" : "categoryGetAll",
"withStats" : 1, // 同时返回统计信息(速度较慢)。
"noComments" : 1, // 不返回备注,以减少响应体积。
"noProducts" : 1, // 不返回商品数组(……)。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "categoryGetAll",
"ok" : 10, // 分类总数("categories" 数组的长度)。
"categories" : [ // 按名称字母顺序排列的分类数组,每个分类为一个对象:
...
{
"name" : "The Category Name",
"created" : 1234567890, // Unix 时间戳(Epoch)。
"createdBy" : "SOMEUSER", // 用户名或 "API"。
"comments" : "Comments of this category",
"commentsLast" : 1234567890, // 最近一次修改备注的 Unix 时间戳(如曾修改)。
"commentsLastBy" : "SOMEUSER", // 用户名或 "API"。
"productsCount" : 2, // 该分类中的商品数量。
"products" : ["REF-CODE-1", "REF-CODE-2"], // 该分类中商品的编码(按字母顺序排列),除非设置了 noProducts=1。
"stats" : {
// 如果指定了 "withStats",统计对象的格式与上方 categoryGet 操作相同
...
},
}
...
],
},
...
]
}
提醒
alertRecipientCreate — 新增提醒收件人
请点击账户中绿色的问号图标,查看各字段的详细说明。
{ "actions" : [
...
{
"a" : "alertRecipientCreate",
"email" : "john@example.net", // 也可以使用手机号码接收短信提醒——详见界面中的帮助说明。
"name" : "john", // 简单的显示名称(通常是名字,不区分大小写)。
"maxFrequency" : 1800, // (可选,默认值为 7200)详见界面中的帮助说明。
"simplify" : 0, // (可选,默认值为 1)启用简化处理(详见界面帮助)。
"sleepEnabled" : 1, // (可选)启用免打扰时段。
"sleepFrom" : "18:30", // (仅当 sleepEnabled 启用时)使用 24 小时制。
"sleepTo" : "07:00", // (仅当 sleepEnabled 启用时)使用 24 小时制。
"timezone" : "America/Los_Angeles", // (仅当 sleepEnabled 启用时)格式为 Linux /usr/share/zoneinfo 下的时区路径。
// 空格会转换为下划线。
// 请在界面的 [New Recipient] 表单中查找您的时区,确保名称完全一致。
"status" : "hold", // (可选)设为 "hold" 或 "disable";其他值(如 "")表示启用。
"rules" : [...], // (可选)初始提醒规则(规则对象数组),格式与下方 alertRecipientEdit 操作中的 "rulesAdd" 相同
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "alertRecipientCreate",
"ok" : 1,
},
...
]
}
alertRecipientEdit — 编辑提醒收件人及/或其提醒规则
请点击账户中绿色的问号图标,查看各字段的详细说明。
其中, "email" 变量用于确定要更新哪个收件人,其他所有字段用于修改该收件人的设置。
{ "actions" : [
...
{
"a" : "alertRecipientEdit",
"email" : "john@example.net", // 当前邮箱地址或电话号码(格式必须与 alertGetAll 操作返回的完全一致)
"newEmail" : "john2@example.net", // (可选)新的邮箱地址或手机号——详见界面帮助。
"name" : "john2", // (可选)新的名称。
"maxFrequency" : 1800, // (可选)详见界面帮助。
"simplify" : 1, // (可选)启用简化处理(详见界面帮助)。
"sleepEnabled" : 1, // (可选)启用免打扰时段。
"sleepFrom" : "18:30", // (仅当 sleepEnabled 启用时)使用 24 小时制。
"sleepTo" : "07:00", // (仅当 sleepEnabled 启用时)使用 24 小时制。
"timezone" : "America/Los_Angeles", // (仅当 sleepEnabled 启用时)参见上方 alertRecipientCreate 操作
"status" : "hold", // (可选)设为 "hold" 或 "disable";其他值(如 "")将变为 "active"。
"rules" : [{ruleObject}, {ruleObject}], // (可选)覆盖所有现有规则(空数组表示移除全部规则)。
// 如果想保留现有规则,就不要提供 "rules" 数组
"rulesAdd" : [ // (可选)将以下规则添加到现有规则中。
...
{ // 以下是规则对象的格式:
"name" : "me_cross_avg", // 在 Alerts 页面进入 [Rules] > [+ New Rule],选择某条规则即可查看其 API 名称。
"disabled" : 1, // (可选)创建时就禁用规则通常没有必要,但下方的 alertRuleEdit 操作可以使用此参数
"var_n" : 123.00, // 界面中的变量 "X" 对应 API 字段 "var_x",
"var_c" : "USD", // ……因此应根据规则填写相应的参数,
"var_h" : 24, // ……有些规则不需要任何参数。
"direction" : "both", // 如果规则有方向,也可设为 "drop" 或 "rise"。
"categories" : ["The Category 1", "The Category 2"], // (可选)留空或省略表示所有商品。
"ignoreOos" : 1, // (可选)忽略缺货竞品(详见界面说明)。
"urlInclude" : "", // (可选,不区分大小写)
"urlExclude" : "amazon", // (可选,不区分大小写)
// "ruleNumber" 是每条规则的唯一标识,用于日后编辑或删除。
// 读取规则时会返回该字段,但不能自行设置。
}
...
],
"rulesRemove" : [1,4,7], // (可选)需要移除的规则的 "ruleNumber"。
// 此处的 "ruleNumber" 可通过下方的 alertGetAll 操作获取。
// 注意:要移除全部规则,只需设置 "rules" = []。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "alertRecipientEdit",
"ok" : 3, // 修改项数量(包括参数修改、规则添加和规则删除)。
},
...
]
}
alertRecipientDelete — 删除提醒收件人
{ "actions" : [
...
{
"a" : "alertRecipientDelete",
"email" : "john@example.net", // 当前邮箱地址或电话号码(格式必须与 alertGetAll 操作返回的完全一致)
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "alertRecipientDelete",
"ok" : 1,
},
...
]
}
alertRuleEdit — 编辑收件人现有的提醒规则
如需删除规则,请使用 alertRecipientEdit 动作中的“rulesRemove”数组;如需添加新规则,请使用同一动作中的“rulesAdd”数组。
{ "actions" : [
...
{
"a" : "alertRuleEdit",
"email" : "john@example.net", // 接收者的邮箱地址或电话号码(格式必须与 alertGetAll 操作返回的完全一致)
"ruleNumber" : 1, // 要编辑的规则编号,由下方 alertGetAll 操作返回。
"rule" : {
// 要覆盖的规则变量。规则对象的格式请参见上方 alertRecipientEdit 操作中的 "rulesAdd"。
"disabled" : 1, // 例如,可用于启用或禁用某条规则。
"var_n" : 5, // 或根据规则类型,修改其他参数,例如 N。
...
},
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "alertRuleEdit",
"ok" : 1, // 修改的参数数量。
},
...
]
}
alertGetAll — 读取所有提醒收件人及其提醒规则
{ "actions" : [
...
{
"a" : "alertGetAll",
// 此操作不需要任何参数。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "alertGetAll",
"ok" : 3, // 收件人数量(即 "recipients" 数组的长度)。
"recipients" : [ // 所有接收者组成的数组,每个元素都是与上方 alertRecipientCreate 操作中相同格式的对象
...
{
"email" : "john@example.net",
"name" : "john",
"maxFrequency" : 1800,
"simplify" : 0,
"sleepEnabled" : 1,
"sleepFrom" : "18:30",
"sleepTo" : "07:00",
"timezone" : "America/Los_Angeles",
"status" : "active",
"rules" : [ // 规则数组,每个规则对象的格式如上方 alertRecipientEdit 操作所述
...
{
"ruleNumber" : 4, // 规则的引用编号,之后可用于通过上方 alertRuleEdit 操作编辑此规则
"name" : "me_cross_avg",
"disabled" : 0,
"var_n" : "123.00", // 注意:所有参数均以字符串形式返回,即使它们表示数字。
"var_c" : "USD",
"var_h" : "24",
"direction" : "both",
"categories" : [], // 留空表示所有商品。
"ignoreOos" : 0,
"urlInclude" : "",
"urlExclude" : "amazon",
}
...
],
}
...
],
},
...
]
}
自动调价规则
repricingCreate — 创建自动调价规则
请点击账户中绿色的问号图标,查看各字段的详细说明。
那么,如何把商品分配给规则?您需要修改商品本身,使用 productEdit 或 productRepricing 动作。严格来说,规则并不“拥有”商品,而是每个商品通过引用某条规则来使用它。
{ "actions" : [
...
{
"a" : "repricingCreate",
"name" : "The Rule Name", // 最多 50 个字符。
"init" : { // 初始定价基准对象(界面第一行 "Set my price to")。
"target" : "cheapest_n", // (参见下方列表)
"var_n" : 3, // 仅当所选 target 需要 N 参数时填写。
"plusAmount" : -2, // 正数表示高于,负数表示低于。
"plusCurrency" : "%", // 货币(如 "USD")或 "%"。
// 对应界面中的“将我的价格设为 3 个最低价竞品平均价以下 2%”。
// 注意:与下面的 "never" 对象不同,初始定价对象没有 "direction",由 "plusAmount" 的正负号决定高于或低于。
},
"never" : [ // (可选)"but never" 限制条件对象,按顺序执行(最多 10 个)。
{
"target" : "cheapest_n_in", // (参见下方列表)
"var_n" : 1, // 仅当所选 target 需要 N 参数时填写。
"direction" : "below", // 或 "above"。
"plusAmount" : -10, // 正数表示加,负数表示减(即使为 0 也必须填写)。
"plusCurrency" : "USD", // 货币或 "%"(即使 plusAmount=0 也必须填写)。
// 对应界面中的“但绝不低于有货竞品的最低价减去 10.00 USD”。
},
{
"target" : "cost",
"direction" : "below",
"plusAmount" : 5,
"plusCurrency" : "%",
// 对应界面中的“但绝不低于我的成本加 5%”。
}
],
"ignoreDomains" : "amazon ebay.com MyLabel1", // (可选)计算时忽略的竞品域名和/或标签(不区分大小写;详见界面)。
"charm" : "none|zeros|charm", // (可选,默认值为 "none")尾数定价模式;""、"none" 或省略效果相同。
"confidence" : 82, // (可选,默认值为 70)最低价格置信度百分比,范围 0–99(详见界面)。
"disabled" : 1, // (可选)
},
...
] }
// ========== 所有可用的 "target" 字符串:==========
// "average":所有竞品的平均价格。
// "average_in":所有有货竞品的平均价格。
// "cheapest_n":价格最低的 N 个竞品的平均价(N=1 时就是最低价)。
// "cheapest_n_in":价格最低的 N 个有货竞品的平均价(或……)。
// "highest_n":价格最高的 N 个竞品的平均价(或……)。
// "highest_n_in":价格最高的 N 个有货竞品的平均价(或……)。
// "cost":我的成本。
// "me_avg_n":过去 N 小时我自己的平均售价(用于限制调价速度)。
// "domain:example.com":example.com 的价格(如该域名有多条 URL,取最低价)。
// "domainIn:example.com":仅在有货时采用 example.com 的价格(……)。
响应:{
...
"actions" : [
...
{
"a" : "repricingCreate",
"ok" : 3, // 成功解析并保存的对象数量(例如 init + never[0] + never[1] = 3)。
"name" : "The Rule Name", // 数据库最终保存的规则名称(例如特殊字符可能被转换)。
},
...
]
}
repricingEdit — 编辑现有的自动调价规则
请先参阅上文的 repricingCreate ,了解这些变量的作用。
此操作修改的是规则本身,而不是分配给该规则的商品。要为商品指定规则,请使用 productEdit 或 productRepricing 动作。
{ "actions" : [
...
{
"a" : "repricingEdit",
"name" : "The Rule Name", // 不区分大小写。
"newName" : "The Rule Renamed", // (可选)最多 50 个字符。
"init" : { // (可选)如果提供,则覆盖初始定价对象中的一个或多个参数(参见 repricingCreate)。
"plusAmount" : 1, // 例如,可以只覆盖 "plusAmount",其余参数保持不变。
// 注意:如果新的 "target" 需要 N 参数,别忘了提供 "var_n"。
},
"never" : [...], // (可选)可以覆盖整个 "never" 数组,但通常更适合使用 never_* 字段。
// 设置 "never":[] 将清除全部现有限制条件;若要保留,请省略该参数。
"never_0" : { // (可选)覆盖第一个 "but never" 条件对象(数组索引 0)。
"var_n" : 2, // 例如,可以只覆盖 "var_n",其余参数保持不变。
},
"never_2" : {
"target" : "", // 这将禁用第三个 "but never" 条件(数组索引 2)。
// 如果 "target" 设为 "",就不必处理该对象的其他参数。
// 设置 "never_2":{} 效果相同。
},
"never_6" : {...}, // 也可以新增一条 "but never" 条件,此时必须像 repricingCreate 一样提供所有必要参数。
// "never" 数组最多 10 个元素,因此最大索引为 "never_9"。
"ignoreDomains" : "", // (可选)与 repricingCreate 相同。
"charm" : "zeros", // (可选)……
"confidence" : 82, // (可选)……
"disabled" : 1, // (可选)设为 0 可启用当前已禁用的规则。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "repricingEdit",
"ok" : 3, // 修改项数量(例如一个 never_N 条件的参数、一个 "init" 参数和 "charm" 各计一次)。
"name" : "The Rule Name", // 数据库中新的最终规则名称(例如特殊字符可能被转换)。
},
...
]
}
repricingDelete — 删除自动调价规则
{ "actions" : [
...
{
"a" : "repricingDelete",
"name" : "The Rule Name", // 不区分大小写。
"onlyIfUnused" : 1, // (可选)为安全起见,可设置此项,使正在被商品使用的规则无法删除,并返回错误。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "repricingDelete",
"ok" : 1,
"productsCount" : 10, // 原先使用此规则、现在已取消规则的商品数量。
},
...
]
}
repricingGetAll — 读取所有自动调价规则
{ "actions" : [
...
{
"a" : "repricingGetAll",
// 此操作不需要其他参数。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "repricingGetAll",
"ok" : 10, // 规则总数("rules" 数组的长度)。
"rules" : [ // 按名称字母顺序排列的调价规则数组,每条规则为一个对象:
...
{
"name" : "Some Repricing Rule",
"created" : 1234567890, // 规则首次创建时的 Unix 时间戳。
"createdBy" : "SOMEUSER", // 用户名或 "API"。
"edited" : 1234567890, // 最近一次修改时间(如从未修改,则无此字段)。
"editedBy" : "SOMEUSER", // 用户名或 "API"(也可能不存在)。
"disabled" : 1234567890, // 如果规则目前已禁用,则为最近一次禁用的 Unix 时间戳;否则不存在。
"disabledBy" : "SOMEUSER", // 用户名或 "API"(也可能不存在)。
"productsCount" : 10, // 当前使用该规则的商品数量。
"ignoreDomains" : "amazon ebay.com MyLabel1", // 被忽略的竞品域名和/或标签(详见界面)。
"charm" : "charm", // 尾数定价模式(none|zeros|charm)。
"confidence" : 82, // 最低价格置信度百分比,范围 0–99(详见界面)。
"init" : { // 初始定价基准对象(界面第一行 "Set my price to")。
"target" : "cheapest_n", // (参见 repricingCreate 中的列表)
"var_n" : 3, // 如果 target 需要 N 参数则返回,否则不存在。
"plusAmount" : -2, // 正数表示高于,负数表示低于。
"plusCurrency" : "%", // 货币(如 "USD")或 "%"。
// 对应界面中的“将我的价格设为 3 个最低价竞品平均价以下 2%”。
// 注意:与下面的 "never" 对象不同,初始定价对象没有 "direction",由 "plusAmount" 的正负号决定高于或低于。
},
"never" : [ // 按顺序执行的 "but never" 限制条件对象。
{
"target" : "cheapest_n_in",
"var_n" : 1,
"direction" : "below", // 或 "above"。
"plusAmount" : -10, // 正数表示加,负数表示减。
"plusCurrency" : "USD", // 货币或 "%"。
// 对应界面中的“但绝不低于有货竞品的最低价减去 10.00 USD”。
},
{}, // 表示您没有设置第二行 "But never" 条件。
{
"target" : "cost",
"direction" : "below",
"plusAmount" : 5,
"plusCurrency" : "%",
// 对应界面中的“但绝不低于我的成本加 5%”。
}
],
}
...
],
},
...
]
}
电子表格
spreadsheetDownload — 下载电子表格
此动作与账户中的 Export 页面提供的导出功能相同。
请确保将 timeout 超时时间设置得足够长。生成大型电子表格可能需要服务器较长时间才能完成。
更简单的方法: 您可以在 Export 页面点击 Show API equivalent 按钮,让系统根据表单中的设置自动生成完整的 JSON 请求(以及对应的 curl 命令)。
{ "actions" : [
{
"a" : "spreadsheetDownload",
"preset" : "Some Preset Name", // (可选)也可以直接使用您自己保存的预设或平台提供的预设,而不必填写以下所有参数。
// 对于您自己的预设,应填写完整预设名称,不包含前面的用户名或后面的货币。
// 对于平台默认预设,可在导出页面的 DIRECT DOWNLOAD 下拉菜单中,将鼠标悬停在预设上查看其名称。
// 例如,"pricezag_backup" 是专用备份预设(参见 DIRECT DOWNLOAD 下拉菜单中的 "Special BACKUP format to re-import")。
// 您还可以填写下方的其他参数,以覆盖预设的默认设置(例如使用不同的货币、格式或分类)。
"savePreset" : "My New Preset Name", // (可选)将下方提供的全部设置保存为新预设,以便随后在界面和 API 中使用。
// 特殊情况:使用 savePreset 时不会下载电子表格,响应会像普通操作一样返回 JSON 对象。
"savePresetOverwrite" : 1, // (可选)覆盖 "savePreset" 指定的现有预设(否则如果重名会报错)。
// 注意:覆盖会彻底替换旧预设的全部设置,因此不能只提供想修改的某一个字段。
// 如需重命名或删除预设,请使用下方的 spreadsheetPresetEdit 操作。
"downloadURL" : 1, // (可选)特殊情况:不直接返回电子表格文件,而是返回普通 JSON 响应,其中包含 "fileURL" 字段。
// 这是文件的公开下载地址(无需登录或 API 密钥)。15 分钟内,任何人都可以通过该 URL 下载。
// "ok" 的值为行数,还会返回以字节为单位的 "fileSize"。
"format" : "xlsx|xls|csv|csv-tab", // (API 默认使用 csv 格式)
"currency" : "USD", // (未提供 preset 时必填)所有金额将统一使用的货币。
"categories" : ["Category 1", "Category 2"], // 仅导出这些分类中的商品(不指定则包含所有商品)。
"historyPeriod" : "prev_6mo", // (可选,默认值为 "now")
// 首先请查看导出页面中关于历史时间范围的 (?) 帮助说明,其中有详细解释。
// "historyPeriod" 决定向过去读取多长时间的数据;再根据 "historyRow" 将同一商品的数据拆成多行输出。
// "now":不读取历史,只使用当前数据(因此无需 "historyRow")。
// "all":读取自注册以来的全部历史数据(或至少涉及商品的全部历史),可能很慢。
// "1234500000-1237800000":读取自定义时间范围("起始-结束" 的 Unix 时间戳)。
// "123h":最近 123 小时,不对齐整点;结束于当前时刻,开始时间可能处于某个小时之中。
// "cur_123(d|wk|mo|yr)":最近 123 个日/周/月/年,包括当前尚未结束的周期。例如 10 日下载 cur_2mo,可能覆盖约 40 天。
// "prev_123(d|wk|mo|yr)":此前已结束的 123 个日/周/月/年。例如 2 月 10 日下载 prev_2mo,会包含 12 月和 1 月的 62 天。
// cur_* 和 prev_* 的起始时间(以及 prev_* 的结束时间)均对齐到相应日期的午夜;cur_* 则结束于当前时刻。
// 因此中午下载 cur_2d 覆盖最近 36 小时,而 prev_2d 覆盖截至 12 小时前的完整 48 小时。
"historyRow" : "2w", // (仅当 "historyPeriod" 不为 "now" 时必填)
// "historyRow" 指定每行汇总的时间长度(对该时段取平均),因此同一商品可能生成多行("all" 除外)。
// 可将 "historyRow" 理解为:把 "historyPeriod" 按时间切分成电子表格中的多行。
// "all":将整个 historyPeriod 汇总成每个商品一行。
// "123(d|wk|mo|qt|yr)":按日历日/周/月/季度/年,以午夜为边界划分为 123 个周期;123 为 1 时可省略,如 "wk" 等同于 "1wk"。
// 例如周六下载且使用 historyRow:"7d",每行统计的是周六 00:00 到周五 23:59 的平均金额。
// 如果使用 historyRow:"1wk",每行统计周一 00:00 到周日 23:59;最新一行则是当前尚未结束的一周(周一至周六)。
// ▶ 最多 500,000 行:界面和 API 都会拒绝生成超过 50 万行的历史数据。
// 例如 historyPeriod 覆盖 365 天且包含 1400 个商品时,historyRow:"day" 很容易超过限制。
// 如果确实需要这么多数据,请按分类分别下载,每次只包含几百个商品。
"timezone" : "America/Los_Angeles", // (可选,默认 "UTC")时区名称采用 Linux /usr/share/zoneinfo 下的路径格式。
// 空格会转换为下划线。
// 只有当 history* 参数使用基于日历的周期时,时区才有意义(用于确定当地午夜)。
// 界面会根据当前用户设置自动选取时区;API 没有这项用户设置,因此需要在请求中指定。
// ========== 导出列:==========
// 使用 column* 参数决定电子表格包含哪些列(各项说明请参阅导出页面的界面表单)。
// 除 Code 外,所有列默认值均为 0(即不导出)。
"columnCode" : 1, // Code 列无法取消,每个商品的 REF-CODE 始终会出现在一列中。
"columnName" : 1, // 商品名称。
"columnCategories" : 1, // 商品当前所属分类(在一个单元格中显示为 "Category 1; Category 2")。
"columnComments" : 1, // 商品备注。
"columnCreated" : 1, // 商品在系统中的创建日期(YYYY/MM/DD)。
"columnCustom" : 1, // 商品自定义字段(所有商品中每个不同字段各占一列)。
"columnPrice" : 1, // 按您指定货币换算的商品价格(不是商品的原始货币)。
"columnCost" : 1, // 商品成本(同上……)。
"columnMargin" : 1, // 根据价格和成本计算的商品利润率百分比。
"columnRank" : 1, // 我的价格排名
"columnInRank" : 1, // 我的有货价格排名
"columnMyWebsite" : 1, // 我的网站网址
"columnReprice" : 1, // 自动调价金额(同上……)。
"columnRepricingRule" : 1, // 自动调价规则名称。
"columnRecommended" : 1, // 建议价格(参见导出页面的帮助说明)。
"columnCompUrls" : 1, // 竞品 URL(每条 URL 单独占一列)。
"columnCompUrlsJoin" : 1, // 竞品 URL(空格分隔,全部放在一个单元格内)。
"columnCompMinMaxAvg" : 1, // 新增 3 列:竞品最低价/最高价/平均价。
"columnInCompMinMaxAvg" : 1, // 新增 3 列:有货竞品最低价/最高价/平均价。
"columnCompPrice" : 1, // 每个竞品新增 1 列价格(按指定货币换算)。
"columnCompStock" : 1, // 每个竞品新增 1 列库存状态(123|IN|OUT)。
"columnCompSales" : 1, // 每个竞品新增 1 列每周销量。
"columnCompRank" : 1, // 每个竞品新增 1 列其在所有商家(包括您)中的价格排名。
"columnCompInRank" : 1, // 每个竞品新增 1 列其在有货商家(包括您)中的价格排名。
// ========== 未公开的高级参数:==========
// 还有少量未正式公开说明的选项,例如 "pricezag_backup" 预设就会使用其中一些。
"originalCurrencies" : 1, // 不把金额换算成指定货币的纯数字,而是以文本形式保留原始货币(如 "123.90 USD")。
"keepUrlLabels" : 1, // 通常会去掉竞品 URL 的标签;启用后会保留标签(适合备份)。
"csvSeparator" : ";", // CSV 格式可使用逗号或制表符之外的字段分隔符。
"csvNoQuote" : 1, // 禁止 CSV 使用引号("),但这可能使导出文件不符合 CSV 规范。
}
] }
// 因此,下载 CSV 备份文件的一种简单方法是:
// curl --connect-timeout 15 --max-time 600 --retry 2 -X POST 'https://pricezag.com/api/v3/MYAPIKEY' -d '{"actions":[{"a":"spreadsheetDownload","preset":"pricezag_backup"}]}' -o pricezag-backup-20241225.csv
spreadsheetPresetEdit — 重命名或删除电子表格预设
此动作仅用于重命名或删除预设。要新建预设或修改现有预设,请使用上文的 spreadsheetDownload 动作。
{ "actions" : [
{
"a" : "spreadsheetPresetEdit",
"preset" : "Some Preset Name", // 当前预设名称。
"newName" : "The Renamed Preset", // 将此预设重命名。
"delete" : 1, // 从账户中删除此 "preset"。
// 注意:正在被自动导出任务使用的预设不能删除(否则会报错)。
// 需要先删除这些定时自动导出任务(参见导出页面)。
}
] }
响应:{
...
"actions" : [
...
{
"a" : "spreadsheetPresetEdit",
"ok" : 1,
},
...
]
}
spreadsheetAutoCreate — 创建电子表格自动导出任务
{ "actions" : [
{
"a" : "spreadsheetAutoCreate",
"preset" : "The Preset Name",
"email" : "john@example.net",
"currency" : "USD", // (可选)默认值为 "preset",表示沿用预设中的货币。
"attach" : "link", // (可选,默认值为 "attach")"attach" 表示发送附件,"link" 表示发送托管文件的下载链接。
"everyMonday" : 1, // 每周一发送电子表格。
"everyTuesday" : 1, // ……其他每个星期几也有对应字段,直到 "everySunday"。
"everyMonthDay1" : 15, // 每月 15 日发送。
"everyMonthDay2" : 21, // ……此外每月 21 日也发送。
"everyMonthDay3" : "last", // ……每月最后一天也发送。
// everyMonthDay* 可使用索引 0–9,最多设置每月 10 个发送日期。
"time" : "3:59pm", // "15.59" 也可用,将转换为 "3:59pm";"0:9"、"0.09"、"00:09" 和 "0:09am" 等价。
"timezone" : "America/Los_Angeles", // (可选,默认 "UTC")时区名称采用 Linux /usr/share/zoneinfo 下的路径格式。
// 城市名称中的空格会转换为下划线。
}
] }
响应:{
...
"actions" : [
...
{
"a" : "spreadsheetAutoCreate",
"ok" : 1,
"id" : "5gwi6fqa", // 此自动导出的引用 ID,可用于日后修改该导出(参见下方 spreadsheetAutoEdit 操作)
},
...
]
}
spreadsheetAutoEdit — 编辑电子表格自动导出任务
{ "actions" : [
{
"a" : "spreadsheetAutoEdit",
"id" : "5gwi6fqa", // 要编辑的自动导出任务的引用 ID。
// 此 ID 在 spreadsheetAutoCreate 响应中返回,也可在界面中点击自动导出任务的 Edit 按钮后,从弹窗标题查看。
"disabled" : 1, // (可选)设为 0 可启用当前已禁用的自动导出任务。
"delete" : 1, // (可选)彻底删除此自动导出任务。
// ===== 以下字段(均为可选)与上方 spreadsheetAutoCreate 操作中的字段相同 =====
"preset" : "The Preset Name",
"email" : "john@example.net",
"currency" : "USD",
"attach" : "link",
"everyMonday" : 1, // 注意:只要传入任何一个 every* 参数,所有现有的 every* 参数都会被清除。
"everyMonthDay1" : 15, // 例如原来设置了 "everyFriday"=1,编辑时改为 "everyMonthDay3",原来的 "everyFriday" 就会被删除。
// ……其他参数同理(全部 every* 参数参见 spreadsheetAutoCreate)。
"time" : "3:59pm",
"timezone" : "America/Los_Angeles",
}
] }
响应:{
...
"actions" : [
...
{
"a" : "spreadsheetAutoEdit",
"ok" : 3, // 修改项数量。
},
...
]
}
竞品及其他功能
competitorDeleteAll — 从所有商品或指定分类中删除某个竞争对手
警告:竞品网址会立即从账户中永久删除,无法恢复。
此动作与用户界面中的以下操作相同:打开某个竞争对手的页面并点击 Delete from all Products,或者打开某个分类页面,点击竞争对手列表中的 (X) 图标。
{ "actions" : [
...
{
"a" : "competitorDeleteAll",
"domain" : "competitordomain.com",
"categories" : ["The Category 1", "The Category 2"], // (可选)如果不提供,必须设置 "allProducts" = 1。
"allProducts" : 1, // (可选)从所有商品中删除(此时不能提供 "categories")。
// "categories" 与 "allProducts" 必须二选一,不能同时提供,也不能都不提供。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "competitorDeleteAll",
"ok" : 10, // 删除的 URL 数量。
},
...
]
}
mathEdit — 设置/编辑竞争对手域名的价格计算公式
请点击账户中绿色的问号图标,查看各字段的详细说明。
{ "actions" : [
...
{
"a" : "mathEdit",
"domain" : "competitordomain.com",
"clear" : 1, // (可选)禁用该域名的全部价格计算规则(会删除此前所有设置)。
// 如果设置 clear:1,不能再提供以下任何参数,否则会报错。
"math" : [ // 要应用的价格计算模块数组。
{ // 这是一个价格计算模块对象,所有字段均为可选。
"categories" : ["Category 1", "Category 2"], // 仅适用于这些分类中的商品。
"theirPriceMin" : 1234.90, // 仅当竞品价格大于或等于 N 时。
"theirPriceMinCurrency" : "USD", // 货币(可使用 "original" 表示网站原始货币)。
"theirPriceMax" : 1234.90, // ……小于或等于。
"theirPriceMaxCurrency" : "USD", // 货币(……)。
"themMeMin" : -20.00, // 仅当 [竞品价格 - 我的价格] 大于或等于 N 时(参见界面)。
"themMeMinCurrency" : "USD", // 自身价格使用的货币或 "%"(此处不能使用 "original")。
"themMeMax" : -1.5, // ……小于或等于。
"themMeMaxCurrency" : "%", // 货币(……)。
"addPre" : -10.00, // 乘法计算前要增加的金额(负数表示减少)。
"addPreCurrency" : "USD", // 货币(可使用 "original" 表示网站原始货币)。
"multiply" : 1.1, // 乘以此系数。
"divide" : 1.1, // 或除以此系数(不能同时使用乘和除)。
"addPost" : 5.00, // 乘法计算后要增加的金额(负数表示减少)。
"addPostCurrency" : "USD", // 货币(……)。
// 看起来复杂?请参阅响应示例后面的简易示例。
},
... // 总共最多 10 个模块(按照顺序应用)。
],
// 注意:目前无法只修改单个参数或计算模块。提供 math 数组会覆盖此前的全部设置。
// 注意:既没有有效乘除运算(未设置或系数为 1),也没有非零 addPre 或 addPost 的计算模块将被忽略。
// 如果所有模块都被忽略,效果就与 clear:1 删除全部计算规则相同。
// 换言之,只有确实执行计算的规则才会被保存。
// 技巧:若想暂时停用某个域名的价格计算规则,而不删除全部设置,
// 可以将 categories 设为 ["Some Empty Existing Category"]。
},
...
] }
响应:{
...
"actions" : [
...
{
"a" : "mathEdit",
"ok" : 3, // 已修改的价格计算模块数量(删除或清空也算一次变更)。
},
...
]
}
简单示例 — 从 amazon.co.uk 上的价格中统一扣除 10% 的税费:{ "actions" : [
{
"a" : "mathEdit",
"domain" : "amazon.co.uk",
"math" : [
{
"divide" : 1.1
}
]
}
] }
更多示例
▶ 示例 1 — 更新商品的成本
请求:
{
"actions" : [
{
"a" : "productEdit",
"code" : "SKU-1234",
"cost" : 140.50,
"costCurrency" : "EUR"
}
]
}
响应:{
"ok" : 1, // 如果 SKU-1234 的成本原本就是这个数值,将返回 0。
"errors" : 0, // 如果 SKU-1234 不存在,将返回 1。
"actionsCount" : 1,
"actions" : [
{
"a" : "productEdit",
"ok" : 1 // 如果 SKU-1234 的成本原本就是这个数值,将返回 0;如果不存在则返回 -1。
}
]
}
▶ 示例 2 — 读取不存在的商品
请求:
{
"actions" : [
{
"a" : "productGet",
"code" : "NON-EXISTING-SKU",
"currency" : "USD"
}
}
响应:{
"ok" : 0, // 因为没有任何操作返回 ok>0。
"errors" : 1, // 因为有 1 项操作返回 ok<0。
"actionsCount" : 1,
"actions" : [
{
"a" : "productGet",
"ok" : -1, // 可通过此处判断操作失败。
"error" : "Sorry, the product #NON-EXISTING-SKU does not exist. Maybe someone else just removed or renamed it?"
}
]
}
▶ 示例 3 — 创建分类和自动调价规则,然后创建两个关联到它们的商品
请求:
{
"actions" : [
{
"a" : "categoryCreate",
"name" : "My New Category"
},
{
"a" : "repricingCreate",
"name" : "My New Repricing Rule",
"init" : {
"target" : "cheapest_n",
"var_n" : 2,
"plusAmount" : 0,
"plusCurrency" : "%"
// 对应界面中的“将我的价格设为两个最低价竞品价格的中间值”。
},
"never" : [
{
"target" : "cost",
"direction" : "below",
"plusAmount" : 5,
"plusCurrency" : "%"
// 对应界面中的“但绝不低于我的成本加 5%”。
}
],
"charm" : "charm"
},
{
"a" : "productCreate",
"code" : "SKU-1001",
"name" : "My New Product 1",
"price" : 199.90,
"currency" : "USD",
"cost" : 112.00,
"costCurrency" : "USD",
"repricingRule" : "My New Repricing Rule", // 与刚刚创建的规则同名。
"categories" : ["My New Category"], // 与刚刚创建的分类同名。
// ……不过 productCreate 本身就会创建不存在的分类,因此此前的 categoryCreate 操作并非必需。
"competitors" : ["https://...", "https://..."]
},
{
"a" : "productCreate",
"code" : "SKU-1002",
"name" : "My New Product 2",
"price" : 59.95,
"currency" : "USD",
"cost" : 31.50,
"costCurrency" : "USD",
"repricingRule" : "My New Repricing Rule",
"categories" : ["My New Category"],
"competitors" : ["https://...", "https://..."]
}
]
}
响应:{
"ok" : 4, // 因为全部 4 项操作都返回 ok>0。
"errors" : 0, // 因为没有任何操作返回 ok<0。
"actionsCount" : 4,
"actions" : [
{
"a" : "categoryCreate",
"ok" : 1
},
{
"a" : "repricingCreate",
"ok" : 1
},
{
"a" : "productCreate",
"ok" : 1
},
{
"a" : "productCreate",
"ok" : 1
}
]
}
▶ 示例 4 — 将两个分类合并到另一个分类,并删除原来的两个分类
请求:
{
"actions" : [
{
"a" : "categoryCopy",
"categoriesFrom" : ["Original Category 1", "Original Category 2"],
"deleteMode" : "cat",
// 注意:"removeMode":"cat" 并非必需,因为 deleteMode 本来就会删除这两个分类。
"categoriesTo" : ["A New Category"]
}
}
响应:{
"ok" : 1, // 因为有 1 项操作返回 ok>0。
"errors" : 0, // 因为没有任何操作返回 ok<0。
"actionsCount" : 1,
"actions" : [
{
"a" : "categoryCopy",
"ok" : 3, // 因为共有 3 个分类发生变化:两个原分类被删除,一个目标分类被创建。
"categoriesCreated" : 1,
"categoriesDeleted" : 2,
"categoriesModified" : 0,
"productsCount" : 123
}
]
}
▶ 示例 5 — 修改提醒规则的 N 变量及其比较方向
请求:
{
"actions" : [
{
"a" : "alertRuleEdit",
"email" : "john@example.net",
"ruleNumber" : 3,
"rule" : {
"var_n" : 1.5,
"direction" : "drop"
}
}
}
响应:{
"ok" : 1, // 因为有 1 项操作返回 ok>0。
"errors" : 0, // 因为没有任何操作返回 ok<0。
"actionsCount" : 1,
"actions" : [
{
"a" : "alertRuleEdit",
"ok" : 2 // 因为成功修改了 2 个参数。
}
]
}
