SERP 端点面向「即问即答」的搜索场景:提交查询后服务端阻塞等待并直接把结果返回,与 scraper 的「提交 → 轮询 → 取数」异步模型不同。小任务用它最省事;大任务超时会自动降级为可轮询的 run(见下)。
与 scraper 的三点不同
| 维度 | scraper(/v1/scraper/*) |
SERP(/v1/serp/*) |
|---|---|---|
| 入参 | { deliveryMode, recordLimit, targets:[ {...} ], deliveries }(目标数组) |
扁平:查询字段直接平铺在 body 顶层 + recordLimit + dataFormat(单次查询) |
| 返回 | 异步:201 + run id,自行轮询取数 |
同步直返:200 + 结果(records 数组),无需轮询 |
| 通知 | 支持 deliveries webhook 推送 |
不支持(同步直返,无异步通知) |
快速说明
- Base URL:
https://api.antsdata.com/v1 - 方法与路径:
POST /v1/serp/{platform}/{resource}。当前platform仅google;resource见下方端点一览。 - 鉴权:请求头
Authorization: Bearer ants_xxx(静态 API Key,与 scraper 同一套) - Content-Type:
application/json - 提交体:查询字段平铺在顶层,另加两个可选的 run 级字段:
recordLimit:本次查询记录上限(省略/0按可用积分反算)。dataFormat:结果格式,json(默认,直返记录数组)/csv/html/markdown(后三者返导出文本)。
返回码与响应体
统一信封 { code, message, data },data 形状随终局分三种:
| 场景 | HTTP | data |
|---|---|---|
成功 + json |
200 |
{ "runId", "status":"succeeded", "records":[ … ] } |
成功 + csv/html/markdown |
200 |
{ "runId", "status":"succeeded", "format":"csv", "content":"…" } |
| 采集失败 | 200 |
{ "runId", "status":"failed", "run":{ …逐任务 errorMessage… } } |
| 超时未完成 | 202 |
{ "runId", "status":"queued"\|"running", "run":{ … } } |
- 超时降级:大查询在服务端同步窗口内没跑完 → 返
202+runId,run 继续后台跑,改用轮询:GET /v1/serp/runs/{id},成功后GET /v1/serp/runs/{id}/records取数或GET /v1/serp/runs/{id}/download?format=json|csv|excel下载。 - 产物过大:同步直返产物 > 16 MiB 会报错,请改用
GET /v1/serp/runs/{id}/download取全量。 - 计费:与 scraper 一致,按成功产出的记录条数结算;失败释放不计费(详见认证与错误处理)。
端点一览
| 端点 | 路径 | 说明 |
|---|---|---|
| 网页搜索 | POST /v1/serp/google/search |
网页 / 图片搜索结果 |
| 购物 | POST /v1/serp/google/shopping |
Google Shopping 商品 |
| 新闻 | POST /v1/serp/google/news |
Google News 文章 |
| 地图 | POST /v1/serp/google/maps |
Google Maps 商家/地点 |
| 广告创意 | POST /v1/serp/google/ads-creatives |
广告透明度中心创意列表 |
| 创意详情 | POST /v1/serp/google/ads-creative-details |
单条创意的曝光/花费/披露详情 |
Search — 网页搜索
POST /v1/serp/google/search
查询字段(平铺在 body 顶层):
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
query |
string | ✅ | 搜索关键词 |
searchType |
string | ✅ | web 网页 / image 图片(默认 web) |
geo_location |
string | ✅ | 地理位置,如 California,United States |
host_language |
string | ✅ | 界面语言 hl,如 en(默认 en) |
domain |
string | — | Google 域名后缀 google.<domain>(默认 com) |
page |
number | — | SERP 页码(默认 1) |
输出字段(records 每条一条结果):
| 字段 | 类型 | 说明 |
|---|---|---|
organic |
array | 自然搜索结果(searchType=web,每条一记录) |
organic.pos |
number | 板块内排名 |
organic.pos_overall |
number | 整页综合排名 |
organic.title |
string | 标题 |
organic.favicon_text |
string | 站点名 / favicon 文本 |
organic.url_shown |
string | 面包屑 / 显示 URL |
organic.url |
string | 落地 URL |
organic.desc |
string | 摘要片段 |
imageResults |
array | 图片搜索结果(searchType=image,每条一记录) |
imageResults.position |
number | 排序序号 |
imageResults.thumbnailUrl |
string | 缩略图 URL |
imageResults.originalUrl |
string | 原图 URL |
imageResults.source |
string | 来源域名 |
imageResults.title |
string | 图片标题 |
total_results_count |
string | 结果总数文本(如 About 1,230,000 results;部分查询为 null) |
ai_overview |
string | AI 概览摘要纯文本(无则 null) |
提交示例:
curl -X POST "https://api.antsdata.com/v1/serp/google/search" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "bitcoin",
"searchType": "web",
"geo_location": "California,United States",
"host_language": "en",
"recordLimit": 50
}'
同步响应(HTTP 200):
{
"code": 0,
"message": "ok",
"data": {
"runId": "1287345",
"status": "succeeded",
"records": [
{
"organic": {
"pos": 1,
"pos_overall": 1,
"title": "Bitcoin - Open source P2P money",
"url": "https://bitcoin.org/",
"desc": "Bitcoin is an innovative payment network ..."
}
}
]
}
}
Shopping — 购物
POST /v1/serp/google/shopping
查询字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
query |
string | ✅ | 商品搜索词 |
gl |
string | ✅ | 国家地区(默认 us) |
hl |
string | ✅ | 界面语言(默认 en) |
minPrice |
number | ✅ | 价格下限(本地币种) |
maxPrice |
number | ✅ | 价格上限 |
condition |
string | — | new / used / refurbished |
sortBy |
string | — | relevance / price_asc / price_desc / rating |
resultsLimit |
number | — | 返回上限(默认 60;一般由 recordLimit 控制) |
输出字段(records.products[] 每条一件商品):
| 字段 | 类型 | 说明 |
|---|---|---|
totalResults |
number | 命中估算总数 |
products.position |
number | 排名序号 |
products.productId |
string | Google Shopping 商品 ID |
products.title |
string | 商品标题 |
products.link |
string | Shopping 商品详情页 |
products.price.amount |
string | 当前价 |
products.price.currency |
string | 币种 |
products.price.originalAmount |
string | 划线原价 |
products.seller |
string | 卖家名称 |
products.rating |
string | 商品评分 |
products.reviewsCount |
number | 评论数 |
products.thumbnail |
string | 主图缩略图 URL |
products.isSponsored |
boolean | 是否为赞助 / 广告位 |
products.shipping |
string | 配送说明 |
products.badges |
array | 平台标签徽章 |
products.offers[].seller |
string | 其它卖家名 |
products.offers[].price |
string | 该卖家价格 |
products.offers[].currency |
string | 币种 |
products.offers[].condition |
string | 商品状态 |
products.offers[].link |
string | 卖家落地页 |
提交示例:
curl -X POST "https://api.antsdata.com/v1/serp/google/shopping" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "wireless earbuds",
"gl": "us",
"hl": "en",
"minPrice": 50,
"maxPrice": 300
}'
News — 新闻
POST /v1/serp/google/news
查询字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
query |
string | ✅ | 搜索关键词 |
timeRange |
string | ✅ | 1h / 1d / 7d / 1m / 1y(默认 7d,仅 keyword) |
cluster |
boolean | ✅ | 同事件聚类去重(默认 true,仅 keyword) |
hl |
string | ✅ | 语言(默认 en) |
gl |
string | ✅ | 国家地区(默认 us) |
feedType |
string | — | keyword / top / topic / publication(默认 keyword) |
topicId |
string | — | feedType=topic 时必填 |
publicationId |
string | — | feedType=publication 时必填 |
输出字段(records.articles[] 每条一篇文章):
| 字段 | 类型 | 说明 |
|---|---|---|
feedType |
string | 回显采集类型 |
articles.title |
string | 文章标题 |
articles.link |
string | News 跳转链接 |
articles.source |
string | 发布媒体名称 |
articles.published |
string | 发布时间 |
articles.snippet |
string | 内容摘要 |
articles.thumbnail |
string | 配图缩略图 URL |
articles.clusterSize |
number | 该事件关联的报道数量(聚类开启时返回) |
提交示例:
curl -X POST "https://api.antsdata.com/v1/serp/google/news" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "AI regulation EU",
"timeRange": "7d",
"cluster": true,
"hl": "en",
"gl": "us"
}'
Maps — 地图
POST /v1/serp/google/maps
查询字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
query |
string | ✅ | 地址 / 地名 / 商家搜索词 |
location |
string | ✅ | 商家搜索自然语言区域,如 Manhattan, NY |
gl |
string | ✅ | 国家地区代码(默认 us) |
hl |
string | ✅ | 界面语言(默认 en) |
openNow |
boolean | ✅ | 仅营业中(默认 false) |
resultsLimit |
number | — | 商家搜索返回上限(默认 20;一般由 recordLimit 控制) |
minRating |
number | — | 最低评分过滤 |
pageToken |
string | — | 翻页 token(取自上一页 nextPageToken) |
lat / lng |
number | — | 反查坐标(成对,用于经纬度反查) |
ll |
string | — | 商家搜索中心点,如 @40.7128,-74.0060,15z |
mode |
string | — | geocode / reverse / places(默认 places,一般留空自动判断) |
输出字段(records.places[] 每条一个地点):
| 字段 | 类型 | 说明 |
|---|---|---|
places.placeId |
string | Google Place ID |
places.dataId |
string | Maps data_id |
places.title |
string | 商家名称 |
places.address |
string | 地址 |
places.rating |
string | 用户评分 |
places.reviewsCount |
number | 评论总数 |
places.priceLevel |
string | 价位等级 |
places.categories |
array | 经营类目 |
places.lat |
string | 纬度 |
places.lng |
string | 经度 |
places.phone |
string | 联系电话 |
places.website |
string | 官网 |
places.thumbnail |
string | 封面缩略图 URL |
nextPageToken |
string | 下一页 token |
提交示例:
curl -X POST "https://api.antsdata.com/v1/serp/google/maps" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "coffee shop",
"location": "Manhattan, NY",
"gl": "us",
"hl": "en",
"openNow": false
}'
Ads-creatives — 广告创意
POST /v1/serp/google/ads-creatives
Google 广告透明度中心(Ads Transparency)的创意列表。拿到的
creative_id/sponsor_id可作「创意详情」入参。
查询字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
query |
string | ✅ | 网站域名 / 关键词,如 nike.com(与 advertiser_id 二选一) |
regions |
array | ✅ | 地区代码数组,如 ["US","GB"](默认 ["us"],region 格式) |
start_date |
string | ✅ | 投放起 YYYY-MM-DD |
end_date |
string | ✅ | 投放止 YYYY-MM-DD |
platform |
number | ✅ | 平台过滤 1–6(1=Search / 2=Display / 3=YouTube / 4=Maps / 5=Play / 6=Shopping) |
advertiser_id |
string | — | 广告主 ID(与 query 二选一,来自联想结果) |
limit |
number | — | 返回创意上限(1–1000,默认 100;受 recordLimit 计费上限压低) |
topic |
string | — | 取 political 切到政治广告 schema |
输出字段(records 每条一条创意):
| 字段 | 类型 | 说明 |
|---|---|---|
creative_id |
string | 创意 ID(可作创意详情入参) |
sponsor_id |
string | 广告主 ID |
format |
string | 创意格式(如 video) |
regions |
array | 投放地区 |
first_shown |
string | 首次曝光 |
last_shown |
string | 末次曝光 |
提交示例:
curl -X POST "https://api.antsdata.com/v1/serp/google/ads-creatives" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "nike.com",
"regions": ["US"],
"start_date": "2026-01-01",
"end_date": "2026-06-30",
"platform": 1
}'
Ads-creative-details — 创意详情
POST /v1/serp/google/ads-creative-details
单条创意的曝光 / 花费 / 政治广告披露详情。
sponsor_id与creative_id请先从「广告创意」接口获取,勿硬编码。
查询字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
sponsor_id |
string | ✅ | 广告主 ID |
creative_id |
string | — | 创意 ID(先从广告创意接口获取) |
topic |
string | — | 取 political 切到政治 schema |
输出字段(records 每条一条创意详情):
| 字段 | 类型 | 说明 |
|---|---|---|
creative_id |
string | 创意 ID |
sponsor_id |
string | 广告主 ID |
first_shown |
string | 首次曝光时间(ISO 8601) |
last_shown |
string | 末次曝光时间(ISO 8601) |
topic |
string | 广告主题(political 时非空,否则空串) |
funder |
string | 出资方 / 资助者(政治广告披露,普通广告为空串) |
regions |
array | 投放地区明细,每项 {code, first_shown, last_shown, min_times, max_times}(曝光次数区间为字符串) |
impressions_lower |
number | 曝光量下界(政治 / EU 广告披露,普通广告为 null) |
impressions_upper |
number | 曝光量上界(同上) |
spend_lower |
number | 花费下界(政治 / EU 广告披露,普通广告为 null) |
spend_upper |
number | 花费上界(同上) |
eu_reach |
number | 欧盟触达人数(EU 政治广告披露,否则 null) |
提交示例:
curl -X POST "https://api.antsdata.com/v1/serp/google/ads-creative-details" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sponsor_id": "AR00040546930815664129",
"creative_id": "CR12886158981977866241"
}'
FAQ
Q: SERP 和 /v1/scraper/google/* 有什么区别?
底层是同一套 Google 采集能力,但 SERP(/v1/serp/google/*)是同步直返 + 扁平入参的封装:一次调用直接拿结果,入参不用包 targets 数组、也不用轮询。追求异步批量、webhook 推送时用 /v1/scraper/google/*。
Q: 超时了(返回 202)怎么办?
202 说明查询较大、没在同步窗口内跑完,但 run 已在后台继续。拿返回里的 runId,转为轮询 GET /v1/serp/runs/{id},到 succeeded 后 GET /v1/serp/runs/{id}/records 取数或 /download 下载。
Q: dataFormat 支持哪些格式?
json(默认,records 直返记录数组)、csv / html / markdown(返 content 导出文本 + format)。
Q: 结果很大取不全?
同步直返上限 16 MiB,超了会报错。改用 GET /v1/serp/runs/{id}/download?format=json|csv|excel 一次拿全量。
Q: 计费方式?
与 scraper 一致,按成功产出的记录条数结算,失败释放不计费。详见认证与错误处理。
