You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

通过亚马逊广告V3 API拉取数据行数远少于控制台报表的问题求助

通过亚马逊广告V3 API拉取数据行数远少于控制台报表的问题求助

我之前也碰到过几乎一模一样的问题,折腾了好一阵才理清几个关键的排查点,你可以逐一试试:


1. 先确认Profile ID是否正确(附控制台查看步骤)

这是最容易踩的坑之一,很多时候是用错了Profile ID导致数据范围不对:

  • 登录亚马逊广告控制台,右上角点击你的账号名称,选择「设置」→「访问权限与设置」
  • 左侧菜单切换到「个人资料管理」,这里会列出所有你有权限的Profile;每个Profile的ID会显示在卡片右上角(欧盟站的话,也可以点击Profile名称旁的小图标,在弹出的详情里查看ID)
  • 重点确认:你API里用的PROFILE_ID,是不是和你手动下载报表时选中的那个店铺/Profile完全对应?有时候主账号和子账号的Profile是相互独立的,选混了就会拉到不全的数据。

2. 检查API请求的分组维度(核心可能原因

看你的请求代码,groupBy参数用了["advertiser"]——这会把当天所有的SP广告商品数据按广告主聚合为一行,而控制台默认的「SP广告商品报表」是按日期+ASIN的细粒度展示的,自然行数会差非常多!

解决方法:
groupBy改成和控制台匹配的细粒度维度,比如["advertisedAsin"],或者直接删除这个参数(部分报表类型会自动使用默认的细粒度分组):

"configuration": {
    "adProduct": "SPONSORED_PRODUCTS",
    "groupBy": ["advertisedAsin"], // 改成这个,或者直接删掉这一行
    "columns": [
        "date",
        "impressions",
        "advertisedAsin",
        "clicks",
        "cost",
        "purchases7d",
        "sales7d",
        "purchases14d",
        "sales14d"
    ],
    "reportTypeId": "spAdvertisedProduct",
    "timeUnit": "DAILY",
    "format": "GZIP_JSON"
}

3. 你可能漏了报表下载的完整流程!

注意:你的当前代码只是提交了报表创建请求,打印的是报表的「创建响应」(比如reportId、状态等),而不是实际的报表数据。亚马逊广告API的报表流程是分三步的:

  1. 发送POST请求创建报表,获取reportId
  2. 轮询GET请求查询报表状态,直到状态变为SUCCESS
  3. 从成功响应中获取下载链接,下载并解压后才能拿到完整数据

我补了一段完整的代码示例,你可以参考:

import requests
import time
import gzip
import json

# 替换成你的真实参数
access_token = "YOUR_ACCESS_TOKEN"
CLIENT_ID = "YOUR_CLIENT_ID"
PROFILE_ID = "YOUR_PROFILE_ID"

# 1. 提交报表创建请求
url_create = "https://advertising-api-eu.amazon.com/reporting/reports"
headers = {
    "Authorization": f"Bearer {access_token}",
    "Amazon-Advertising-API-ClientId": CLIENT_ID,
    "Amazon-Advertising-API-Scope": PROFILE_ID,
    "Content-Type": "application/json"
}
body = {
    "name": "SP Advertised Products",
    "startDate": "2024-02-14",  # 改成有真实数据的日期,别用未来日期测试
    "endDate": "2024-02-14",
    "configuration": {
        "adProduct": "SPONSORED_PRODUCTS",
        "groupBy": ["advertisedAsin"],
        "columns": [
            "date",
            "impressions",
            "advertisedAsin",
            "clicks",
            "cost",
            "purchases7d",
            "sales7d",
            "purchases14d",
            "sales14d"
        ],
        "reportTypeId": "spAdvertisedProduct",
        "timeUnit": "DAILY",
        "format": "GZIP_JSON"
    }
}
r = requests.post(url_create, headers=headers, json=body)
report_response = r.json()
report_id = report_response.get("reportId")
if not report_id:
    print("报表创建失败:", report_response)
    exit()

# 2. 轮询等待报表生成
url_status = f"https://advertising-api-eu.amazon.com/reporting/reports/{report_id}"
status = "IN_PROGRESS"
while status in ["IN_PROGRESS", "CREATING"]:
    time.sleep(10)  # 每隔10秒查询一次状态
    r_status = requests.get(url_status, headers=headers)
    status_data = r_status.json()
    status = status_data.get("status")
    print(f"当前报表状态: {status}")

if status != "SUCCESS":
    print(f"报表生成失败,状态: {status}", status_data)
    exit()

# 3. 下载并解压报表数据
download_url = status_data.get("url")
r_download = requests.get(download_url)
# 保存并解压
with gzip.open("sp_advertised_product_report.gz", "wb") as f:
    f.write(r_download.content)
# 读取解压后的数据
with gzip.open("sp_advertised_product_report.gz", "rb") as f:
    report_data = json.load(f)

print(f"报表总行数: {len(report_data)}")
print("前5行数据示例:", report_data[:5])

4. 其他补充排查点

如果上面的步骤都试了还是有问题,可以再检查:

  • 日期范围:确保API的startDate/endDate和控制台下载的报表完全一致(注意时区!亚马逊API用的是UTC时间,控制台可能用的是本地时区,比如你选的是欧洲时间,API要转成对应的UTC日期)
  • 报表类型匹配
    • SB-Campaign报表:reportTypeIdsbCampaignadProductSPONSORED_BRANDS
    • SD-Advertised Product报表:reportTypeIdsdAdvertisedProductadProductSPONSORED_DISPLAY
  • 权限问题:确认你的API账号(对应CLIENT_ID的账号)和手动下载报表的账号有相同的权限,比如子账号可能没有某些数据的访问权限,导致拉取的数据不全。

按这个流程排查下来,应该就能解决行数不一致的问题了,如果还有疑问,可以把控制台报表的分组维度、日期范围截图(打码敏感信息),和API请求参数对比,很容易找到差异点~

火山引擎 最新活动