SEO tools
Google organic search: keywords, rankings, results pages, domains, backlinks and site health.
Google organic search, from DataForSEO: keywords, rankings, results pages, domains, backlinks and site health. seo_get_page fetches the page itself.
A few terms the results use. Volume is monthly searches. KD is keyword difficulty, 0 to 100. domain_rank is DataForSEO's authority score from its backlink index, 0 to 1000: the same kind of number as Ahrefs DR or Moz DA, on a different scale. A target is a domain or a URL (see targets).
Common paths: keyword research is one seo_search_keywords call, which already has the metrics. For a domain, start with seo_get_domain_overview, then the backlinks or its ranked keywords. For site health, seo_get_page checks one URL and seo_run_technical_crawl a whole site, as an async task.
| Tool | What it does | Cost |
|---|---|---|
seo_search_keywords | Get keyword ideas | From 5 credits |
seo_get_keyword_metrics | Check keyword metrics | From 5 credits |
seo_get_serp | Get search results for a query | From 1 credit |
seo_get_position | Get a site's position for a keyword | From 6 credits |
seo_get_domain_overview | Get a domain overview | From 5 credits |
seo_get_ranked_keywords | Get a domain's ranked keywords | From 5 credits |
seo_get_serp_competitors | Find search competitors | From 5 credits |
seo_get_keyword_gap | Find keyword gaps | From 5 credits |
seo_get_backlink_summary | Get a backlink summary | From 10 credits |
seo_get_backlinks | Get backlinks | From 10 credits |
seo_get_referring_domains | Get referring domains | From 10 credits |
seo_get_domain_ratings | Get domain ratings in bulk | From 1 credit |
seo_get_traffic_estimates | Get traffic estimates in bulk | From 50 credits |
seo_get_page | Get an on-page snapshot | Free |
seo_run_technical_crawl | Run a technical audit | From 3 credits |
#Get keyword ideas
seo_search_keywords
Candidate keywords around a seed, with volume, difficulty, intent, CPC and trend for each.
Use when: "find keywords for X", "what should I target around X", "keyword ideas for a page about X".
Not for: metrics on keywords the user already has, use seo_get_keyword_metrics (this tool already returns those metrics, so do not call it afterwards). Prompts people ask AI engines, use aeo_search_prompts. The top-10 page for one query, use seo_get_serp.
Returns: List. rows[]: keyword, volume, kd (0 to 100), intent, cpc (USD), competition, trend[12] (month, volume). volume, kd, cpc null = provider has no data; 0 = measured zero.
Cost: 5 + 5 per 100 rows. Default 100 rows = 10 credits. Cached 7 days.
| Parameter | Default and notes |
|---|---|
seed | Required |
mode | "suggestions" contains the seed | "related" SERP-similar | "ideas" same category, default suggestions |
location | "United States" |
language | "en" |
limit | 100, max 1000 |
Also takes cursor, provider, max_credits, dry_run: see common parameters.
{
"seed": "crm for startups",
"mode": "suggestions",
"limit": 50
}#Check keyword metrics
seo_get_keyword_metrics
Volume, difficulty, intent, CPC and 12-month trend for keywords you already have, with AI-engine prompt volume on request.
Use when: the user supplies keywords, or you need numbers for a list from elsewhere. ai_volume true when the question is how often AI engines see the keyword.
Not for: discovering keywords, use seo_search_keywords (it already includes these metrics, do not call this after it). AI-engine prompts, use aeo_search_prompts. Checking rankings, use seo_get_position.
Returns: List. rows[]: keyword, volume, kd, intent, cpc, competition, trend[12], ai_volume, ai_trend[12]. One row per input keyword in the order given. volume/kd null = provider has no data; 0 = measured zero. With source google_ads, kd and intent are always null and keywords over 80 characters come back all null. ai_volume and ai_trend are null unless ai_volume is true.
Cost: 5 + 5 per 100 keywords with source labs; 24 flat with source google_ads; ai_volume adds 4 + 4 per 100 keywords. Default 100 keywords = 10 credits. Cached 7 days.
| Parameter | Default and notes |
|---|---|
keywords[] | Required, max 1000 |
source | "labs" | "google_ads", default labs; google_ads is Google Keyword Planner's own volume, slower |
ai_volume | False |
location | "United States" |
language | "en" |
Also takes provider, max_credits, dry_run: see common parameters.
{
"keywords": [
"crm for startups",
"hubspot alternative"
],
"ai_volume": true
}#Get search results for a query
seo_get_serp
The top organic results and SERP features Google shows for one query.
Use when: "what ranks for X", "who is on page one for X", "is there a featured snippet or AI overview for X".
Not for: where one site ranks for a keyword, use seo_get_position (it scans the top 100 for you). General web retrieval to read pages, use web_search_pages. Keyword ideas, use seo_search_keywords.
Returns: Record. keyword, location, language, device, check_url, results_count, features[] (featured_snippet, people_also_ask, video, ai_overview and others), results[] (rank, organic_rank, type, url, domain, title, snippet), ai_overview (text, references[]) or null.
Cost: 1 credit per 10 results, +1 with ai_overview. Default top 10 = 1 credit. Cached 24 hours.
| Parameter | Default and notes |
|---|---|
keyword | Required |
location | "United States" |
language | "en" |
device | "desktop" | "mobile" |
depth | 10, max 100 |
ai_overview | False; true adds Google's AI overview and its cited sources |
Also takes provider, max_credits, dry_run: see common parameters.
{
"keyword": "hubspot alternative",
"depth": 10,
"ai_overview": true
}#Get a site's position for a keyword
seo_get_position
Where one target ranks for one keyword, scanning the top 100 server-side.
Use when: "where does example.com rank for X", "did we make page one for X", a rank check for a handful of keywords.
Not for: every keyword a domain ranks for, use seo_get_ranked_keywords. The full page-one list, use seo_get_serp. Tracking over time: call this on a schedule from the host; the server keeps no history.
Returns: Record. keyword, target, rank (absolute, null when not in the top 100), organic_rank, url, title, scanned_depth, above[] (rank, domain, url of the organic results ahead, at most 10).
Cost: 6 credits flat. Cached 24 hours.
| Parameter | Default and notes |
|---|---|
keyword | Required |
target | Required; example.com covers subdomains, www.example.com is that host, a URL is that page |
location | "United States" |
language | "en" |
device | "desktop" |
Also takes provider, max_credits, dry_run: see common parameters.
{
"keyword": "hubspot alternative",
"target": "example.com"
}#Get a domain overview
seo_get_domain_overview
Traffic estimate, ranked keyword count, position spread, top pages and domain rank for one domain. The canonical source of domain rank.
Use when: "how strong is competitor.com", "how much traffic does X get", sizing a site before a deeper look.
Not for: the keywords behind the traffic, use seo_get_ranked_keywords. Link counts, use seo_get_backlink_summary (its domain_rank equals this one). Many domains at once, use seo_get_domain_ratings for domain rank or seo_get_traffic_estimates for traffic.
Returns: Record. target, domain_rank (0 to 1000 on DataForSEO, the same kind of number as Ahrefs DR or Moz DA but not the same scale), organic_traffic, organic_keywords, organic_traffic_cost (USD), positions (top_3, top_10, top_100), top_pages[] (url, organic_traffic, organic_keywords), history[] (12 months: month, organic_traffic, organic_keywords) only with history true. null = provider has no data.
Cost: 5 credits; +56 with history. Cached 7 days.
| Parameter | Default and notes |
|---|---|
target | Required |
location | "United States" |
language | "en" |
history | False |
Also takes provider, max_credits, dry_run: see common parameters.
{
"target": "competitor.com"
}#Get a domain's ranked keywords
seo_get_ranked_keywords
Keywords a domain or one page ranks for in the top 100, with position, URL and metrics.
Use when: "what does competitor.com rank for", "which keywords send traffic to this page", building a list of a site's topics.
Not for: keywords a competitor has that you do not, use seo_get_keyword_gap. One keyword's position, use seo_get_position. New keyword ideas, use seo_search_keywords.
Returns: List. rows[]: keyword, rank, url, volume, kd, cpc, intent, traffic (estimated monthly visits from this keyword). Sorted by traffic. null = provider has no data.
Cost: 5 + 5 per 100 rows. Default 100 rows = 10 credits. Cached 7 days.
| Parameter | Default and notes |
|---|---|
target | Required; a domain covers subdomains, a URL is that page only |
location | "United States" |
language | "en" |
limit | 100, max 1000 |
Also takes cursor, provider, max_credits, dry_run: see common parameters.
{
"target": "competitor.com",
"limit": 200
}#Find search competitors
seo_get_serp_competitors
Domains that share search results with a target, with how many keywords overlap. SERP competitors, not business competitors.
Use when: "who competes with example.com in search", "which sites show up for the same queries as X", choosing competitors for a keyword gap.
Not for: the keywords themselves, use seo_get_keyword_gap. A single domain's strength, use seo_get_domain_overview.
Returns: List. rows[]: domain, shared_keywords, avg_position, organic_traffic, organic_keywords. Sorted by shared keywords. The target itself is excluded.
Cost: 5 + 5 per 100 rows. Default 100 rows = 10 credits. Cached 7 days.
| Parameter | Default and notes |
|---|---|
target | Required |
location | "United States" |
language | "en" |
limit | 100, max 1000 |
Also takes cursor, provider, max_credits, dry_run: see common parameters.
{
"target": "example.com",
"limit": 20
}#Find keyword gaps
seo_get_keyword_gap
Keywords one competitor ranks for in the top 100 that the target does not rank for at all.
Use when: "what does competitor.com rank for that we do not", "find gaps against X", content opportunities from a rival.
Not for: everything a domain ranks for, use seo_get_ranked_keywords. Finding who the competitors are, use seo_get_serp_competitors. Fresh ideas around a topic, use seo_search_keywords.
Returns: List. rows[]: keyword, competitor, competitor_rank, competitor_url, volume, kd, cpc, intent. Sorted by volume.
Cost: 5 + 5 per 100 rows. Default 100 rows = 10 credits. Cached 7 days.
| Parameter | Default and notes |
|---|---|
target | Required |
competitor | Required, one domain |
location | "United States" |
language | "en" |
limit | 100, max 1000 |
Also takes cursor, provider, max_credits, dry_run: see common parameters.
{
"target": "example.com",
"competitor": "competitor.com",
"limit": 100
}#Get a backlink summary
seo_get_backlink_summary
Link totals for a domain or page: backlinks, referring domains, dofollow share, link types and domain rank.
Use when: "how many links does X have", "what is X's link profile like", a quick authority check alongside seo_get_domain_overview.
Not for: the individual links or their anchor text, use seo_get_backlinks. The sites linking, use seo_get_referring_domains. Domain rank for many domains, use seo_get_domain_ratings.
Returns: Record. target, domain_rank (equals seo_get_domain_overview's domain_rank), backlinks, referring_domains, referring_main_domains, referring_ips, dofollow_backlinks, dofollow_share (0 to 1), broken_backlinks, first_seen, link_types (anchor, image, redirect, canonical counts). null = provider has no data.
Cost: 10 credits flat. Cached 7 days.
| Parameter | Default and notes |
|---|---|
target | Required; a domain includes subdomains unless include_subdomains is false |
include_subdomains | True |
Also takes provider, max_credits, dry_run: see common parameters.
{
"target": "competitor.com"
}#Get backlinks
seo_get_backlinks
Individual backlinks pointing at a domain or page, strongest referring domain first.
Use when: "show me the links to this page", "which pages link to competitor.com", finding link sources to replicate.
Not for: totals only, use seo_get_backlink_summary. One row per linking site, use seo_get_referring_domains. Rating the linking sites, use seo_get_domain_ratings.
Returns: List. rows[]: url_from, url_to, domain_from, dr_from, page_title, anchor, dofollow, type, first_seen, last_seen, lost.
Cost: 10 + 1.5 per 100 rows. Default 100 rows = 12 credits. Cached 7 days.
| Parameter | Default and notes |
|---|---|
target | Required |
include_subdomains | True |
limit | 100, max 1000 |
Also takes cursor, provider, max_credits, dry_run: see common parameters.
{
"target": "https://competitor.com/blog/best-crm",
"limit": 50
}#Get referring domains
seo_get_referring_domains
Domains linking to a target, one row per domain, with domain rank, link counts and spam score.
Use when: "who links to competitor.com", "build a list of sites to pitch for links", link prospecting from a rival's profile.
Not for: every individual link, use seo_get_backlinks. Totals, use seo_get_backlink_summary. Rating your own list of domains, use seo_get_domain_ratings.
Returns: List. rows[]: domain, domain_rank, backlinks, referring_pages, dofollow_backlinks, spam_score, first_seen, lost. Sorted by domain_rank.
Cost: 10 + 1.5 per 100 rows. Default 100 rows = 12 credits. Cached 7 days.
| Parameter | Default and notes |
|---|---|
target | Required |
include_subdomains | True |
limit | 100, max 1000 |
Also takes cursor, provider, max_credits, dry_run: see common parameters.
{
"target": "competitor.com",
"limit": 200
}#Get domain ratings in bulk
seo_get_domain_ratings
Domain rank only, for up to 1,000 domains in one call. The cheap way to rate a list.
Use when: "rate these domains", "which of these sites are worth a link", filtering a prospect list by authority.
Not for: traffic numbers, use seo_get_traffic_estimates (10x the cost). A full profile of one domain, use seo_get_domain_overview or seo_get_backlink_summary.
Returns: List. rows[]: domain, domain_rank (0 to 1000 on DataForSEO, the same kind of number as Ahrefs DR or Moz DA but not the same scale; null when the index has no data). One row per input domain in the order given. errors[] lists inputs that were not valid domains.
Cost: 1 + 2.5 per 100 domains. Default 100 domains = 4 credits. Cached 7 days.
| Parameter | Default and notes |
|---|---|
targets[] | Required, max 1000 |
Also takes provider, max_credits, dry_run: see common parameters.
{
"targets": [
"example.com",
"competitor.com",
"blog.example.net"
]
}#Get traffic estimates in bulk
seo_get_traffic_estimates
Estimated monthly organic and paid traffic for up to 1,000 domains in one call.
Use when: "how much traffic do these sites get", comparing a list of domains by size, checking a prospect list for reach.
Not for: authority, use seo_get_domain_ratings (a tenth of the cost). One domain in depth, use seo_get_domain_overview.
Returns: List. rows[]: domain, organic_traffic, organic_keywords, paid_traffic. One row per input domain in the order given. null = provider has no data. errors[] lists inputs that were not valid domains.
Cost: 50 + 50 per 100 domains. Default 100 domains = 100 credits. Cached 7 days.
| Parameter | Default and notes |
|---|---|
targets[] | Required, max 1000 |
location | "United States" |
language | "en" |
Also takes provider, max_credits, dry_run: see common parameters.
{
"targets": [
"example.com",
"competitor.com"
]
}#Get an on-page snapshot
seo_get_page
An on-page snapshot of one URL: title, meta description, canonical, robots, headings, word count, schema types and link counts. Fetched live, free.
Use when: "check the on-page SEO of this URL", "what schema does this page use", a quick look before a crawl.
Not for: a whole site, use seo_run_technical_crawl. Rankings for the page, use seo_get_ranked_keywords with the URL. What the page ranks against, use seo_get_serp.
Returns: Record. url, final_url, status, title, meta_description, canonical, robots_meta, lang, h1[], h2[], word_count, schema_types[], links_internal, links_external, images, images_without_alt. null = the tag is absent.
Cost: 0 credits, rate limited. Cached 1 hour.
| Parameter | Default and notes |
|---|---|
url | Required, http or https |
Also takes max_credits, dry_run: see common parameters.
{
"url": "https://example.com/pricing"
}#Run a technical audit
seo_run_technical_crawl
Crawl a site for technical SEO issues. Slow: returns a task_id, then read the result with get_task.
Use when: "audit example.com", "crawl the site for broken links and duplicate titles", a technical health check.
Not for: one page, use seo_get_page. Rankings or traffic, use seo_get_domain_overview.
Returns: Task. task_id now; get_task returns target, pages_requested, pages_crawled, rendered, onpage_score, status_codes, broken_links, broken_resources, non_indexable, duplicate_titles, duplicate_descriptions, issues[] (check, pages, sample_urls[]). Results expire after 30 days.
Cost: 3 credits per 100 pages; 30 per 100 pages rendered. The charge is on max_pages requested, not pages crawled. Default 1,000 pages = 30 credits.
| Parameter | Default and notes |
|---|---|
target | Required, a domain |
max_pages | Required, max 1000 on the Free plan |
render | False; true executes JavaScript and costs 10x |
Note: Lighthouse is not available in this phase.
Also takes max_credits, dry_run: see common parameters.
{
"target": "example.com",
"max_pages": 500
}