get_keyword_serp returns who ranks for one keyword: snapshot freshness, volume, CPC, then an items array. Each item is rank, title, url, website, domain, description, and email (best cached address, or null).
Keyword input may arrive URL-encoded. The server decodes it.
Who ranks for "best ai presentation maker"? Give me the top ten.
Arguments
| Name | Type | Required |
|---|---|---|
keyword | string, 1–200 characters | Yes |
languageCode | string | No |
locationCode | positive integer | No |
limit | 1–100, default 100 | No |
domain | string. Ranking host or title/snippet mention | No |
refresh | boolean. Requests a SERP Update through the refresh-serp limiter | No |
The default is cache-only. There is no page 2. The snapshot is the stored top 100.
Request
{
"keyword": "best ai presentation maker",
"limit": 10
}Narrow a later call:
{
"keyword": "best ai presentation maker",
"domain": "canva.com"
}domain matches the ranking host or a mention in the title or snippet. A brand that appears in every listicle (Canva) will not shrink the payload much.
Response
{
"summary": "SERP snapshot: STALE=false | fetchedAt=2026-08-19T10:13:52.948Z | snapshotDate=Aug 19, 2026 UTC | refreshed=false | keyword=\"best ai presentation maker\" | items=10",
"status": "found",
"stale": false,
"fetchedAt": "2026-08-19T10:13:52.948Z",
"snapshotDate": "Aug 19, 2026",
"keyword": "best ai presentation maker",
"volume": 1000,
"cpc": 15.76,
"competition": "MEDIUM",
"refreshed": false,
"refreshStatus": "not_requested",
"refreshMessage": null,
"items": [
{
"rank": 1,
"title": "17 Best AI Presentation Makers in 2026 (Tested With The ...",
"url": "https://getalai.com/blog/best-ai-presentation-makers",
"website": "Alai",
"domain": "getalai.com",
"description": "May 27, 2026 — Nano Banana Pro & GPT. Gamma: Best Free AI Presentation Maker.",
"email": "founders@getalai.com"
},
{
"rank": 2,
"title": "AI Presentation Maker: Create presentations with AI",
"url": "https://www.canva.com/create/ai-presentations/",
"website": "Canva",
"domain": "www.canva.com",
"description": "Create slides in seconds with Magic Design™ for Presentations.",
"email": null
}
]
}Publisher rows use the best cached DomainContact for the ranking host. YouTube, Instagram, and TikTok rows use a matched creator email only. We never attach youtube.com staff mail to a watch URL.
Freshness
| Cache | Flags | What you get |
|---|---|---|
| Newer than 30 days | stale: false, refreshed: false | Stored snapshot |
| Older than 30 days | stale: true, refreshed: false | Stored snapshot with a stale warning |
| Missing | status: "no_snapshot" | No stored SERP |
refresh: true allowed | refreshed: true, refreshStatus: "refreshed" if the live call worked | One DataForSEO fetch for this keyword |
refresh: true rate-limited | refreshed: false, refreshStatus: "rate_limited" | Stored snapshot when available |
| Already refreshed today | refreshed: false, refreshStatus: "skipped_today" | Stored snapshot from today |
| Live call failed, old snapshot exists | stale: true | Whatever we still have |
| Live call failed, nothing stored | status: "no_snapshot" | No usable SERP |
Treat no_snapshot as "no usable SERP," not a blank Google page.
Cap fan-out at about five keywords per turn. Each call counts against 120/hour. refresh: true also uses the
refresh-serp limiter. It does not spend project credits.
Contacts
When email is null, try get_contacts on the URL or host, or search_creators when you only have a name.
What to explore next
- get_contacts for full contact records
- search_creators for a topic or handle
- Keyword fan-out
- YouTube outreach