问答

怎么一次看全竞品在 Meta、Google 和 TikTok 上投的广告?

简短回答

在每个公开广告库里,用竞品在那里登记的身份去查:Meta 上是它的 Facebook 主页,Google 上是官网域名,TikTok 广告库里是广告主名称,再把结果合成一张表。用 okdata 每周扫一个竞品 $0.028,10 个竞品每周扫、做一个月共 $1.12。

一个水杯品牌的增长负责人,盯着三个主要竞品。每周一她都想知道,它们上周新上了哪些广告:新的优惠、新的开头、新的落地页。答案分散在三个公开广告库里,三套界面,同一家公司在每个库里的名字还不一样。手动查要一上午;写成脚本,就是一张表发到邮箱,新广告已经标出来了。

一个竞品,三个身份

广告库 竞品在里面登记成什么 接口
Meta 广告库(Facebook、Instagram、Messenger) Facebook 主页,按 ID 或名称 Meta 广告主的广告
Google 广告透明中心(搜索、YouTube、展示、购物) 验证过的广告主,常常是公司主体;或者官网域名 Google 广告主搜索,再用 Google 广告主的广告
TikTok 广告库 广告主名称,只收在欧洲投放的广告 TikTok 广告库搜索

名字只需要对一次,把 ID 存下来:Meta 主页 ID、Google 广告主 ID 或域名、TikTok 广告主名称。之后每周只调列表接口。

费用

每周、每个竞品 调用次数 费用
Meta,3 页,每页 30 条 3 $0.012
Google,2 页,每页 40 条 2 $0.008
TikTok,2 页,每页 12 条 2 $0.008
一个竞品一周 7 {{cost:meta.advertisers.ads.list3+google.advertisers.ads.list2+tiktok.ads.search*2}}
10 个竞品,4 周 280 {{cost:meta.advertisers.ads.list120+google.advertisers.ads.list80+tiktok.ads.search*80}}

第一次在 Google 上按名称找广告主,每个竞品另加 $0.004。

代码:合成一张表,标出新广告

import json, os, requests

API = "https://api.okdata.online"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}

def items(path, **params):
    body = requests.get(API + path, headers=H, params=params, timeout=60).json()
    if body["code"] != "ok":
        raise RuntimeError(f"{body['code']}: {body['message']}")
    return body["data"]["items"]       # 只取第一页;要更多就按 page.next_cursor 翻页

rival = {"meta_page": "<Facebook 主页 ID>", "domain": "example.com", "tiktok": "Example Brand"}
ads = ([("meta", a) for a in items("/v1/meta/advertisers/ads/list", id=rival["meta_page"], country="US")]
     + [("google", a) for a in items("/v1/google/advertisers/ads/list", domain=rival["domain"], country="US")]
     + [("tiktok", a) for a in items("/v1/tiktok/ads/search", advertiser=rival["tiktok"])])

rows = [{"platform": p, "id": a["id"], "format": a["format"], "text": (a["text"] or "")[:120],
         "landing": a["landing_url"], "since": a["first_shown_at"], "url": a["url"]} for p, a in ads]
try:
    seen = set(json.load(open("seen_ids.json")))
except FileNotFoundError:
    seen = set()
new = [r for r in rows if r["id"] not in seen]
json.dump(sorted(seen | {r["id"] for r in rows}), open("seen_ids.json", "w"))
print(len(rows), "条广告,其中新出现", len(new), "条")

看不到的地方

  • TikTok 广告库只收在欧洲投放的广告。 只在美国投的竞品,这里可能一条都没有。创意中心热门广告能看一个品类里什么素材效果好,但不能按广告主查。
  • Google 很少给落地页, 文案也常常只在预览图里。
  • Meta 在欧盟以外会撤下已停投的商业广告。 每周跑一次,顺便也就攒下了自己的历史记录。
  • 商业广告的花费,哪个库都不公开。 可以看新广告的数量和每条跑了多久;连续投好几个月的,通常就是效果好的。
  • 子品牌和多个主页。 大广告主往往有好几个 Facebook 主页和 Google 账户,每一行都核对一下广告主。

其他做法

只看一个品牌,直接上各广告库的网页,免费。付费的广告情报平台覆盖更多渠道,保存多年历史,还会估算花费;如果要回答的是对手预算有多少,它们更合适。合作的代理商手里可能也已经有这些数据。每周脚本化地扫一遍,或者把一周的竞品广告交给 Agent 做总结,用 okdata 更合适。各个库的细节见 Meta 广告库 API 的价格和限制和导出 Google 广告透明中心的广告。完整流程见广告情报和竞品监测。

更新于