Tools

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.

ToolWhat it doesCost
seo_search_keywordsGet keyword ideasFrom 5 credits
seo_get_keyword_metricsCheck keyword metricsFrom 5 credits
seo_get_serpGet search results for a queryFrom 1 credit
seo_get_positionGet a site's position for a keywordFrom 6 credits
seo_get_domain_overviewGet a domain overviewFrom 5 credits
seo_get_ranked_keywordsGet a domain's ranked keywordsFrom 5 credits
seo_get_serp_competitorsFind search competitorsFrom 5 credits
seo_get_keyword_gapFind keyword gapsFrom 5 credits
seo_get_backlink_summaryGet a backlink summaryFrom 10 credits
seo_get_backlinksGet backlinksFrom 10 credits
seo_get_referring_domainsGet referring domainsFrom 10 credits
seo_get_domain_ratingsGet domain ratings in bulkFrom 1 credit
seo_get_traffic_estimatesGet traffic estimates in bulkFrom 50 credits
seo_get_pageGet an on-page snapshotFree
seo_run_technical_crawlRun a technical auditFrom 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.

ParameterDefault and notes
seedRequired
mode"suggestions" contains the seed | "related" SERP-similar | "ideas" same category, default suggestions
location"United States"
language"en"
limit100, max 1000

Also takes cursor, provider, max_credits, dry_run: see common parameters.

JSON
{
  "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.

ParameterDefault and notes
keywords[]Required, max 1000
source"labs" | "google_ads", default labs; google_ads is Google Keyword Planner's own volume, slower
ai_volumeFalse
location"United States"
language"en"

Also takes provider, max_credits, dry_run: see common parameters.

JSON
{
  "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.

ParameterDefault and notes
keywordRequired
location"United States"
language"en"
device"desktop" | "mobile"
depth10, max 100
ai_overviewFalse; true adds Google's AI overview and its cited sources

Also takes provider, max_credits, dry_run: see common parameters.

JSON
{
  "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.

ParameterDefault and notes
keywordRequired
targetRequired; 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.

JSON
{
  "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.

ParameterDefault and notes
targetRequired
location"United States"
language"en"
historyFalse

Also takes provider, max_credits, dry_run: see common parameters.

JSON
{
  "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.

ParameterDefault and notes
targetRequired; a domain covers subdomains, a URL is that page only
location"United States"
language"en"
limit100, max 1000

Also takes cursor, provider, max_credits, dry_run: see common parameters.

JSON
{
  "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.

ParameterDefault and notes
targetRequired
location"United States"
language"en"
limit100, max 1000

Also takes cursor, provider, max_credits, dry_run: see common parameters.

JSON
{
  "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.

ParameterDefault and notes
targetRequired
competitorRequired, one domain
location"United States"
language"en"
limit100, max 1000

Also takes cursor, provider, max_credits, dry_run: see common parameters.

JSON
{
  "target": "example.com",
  "competitor": "competitor.com",
  "limit": 100
}

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.

ParameterDefault and notes
targetRequired; a domain includes subdomains unless include_subdomains is false
include_subdomainsTrue

Also takes provider, max_credits, dry_run: see common parameters.

JSON
{
  "target": "competitor.com"
}

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.

ParameterDefault and notes
targetRequired
include_subdomainsTrue
limit100, max 1000

Also takes cursor, provider, max_credits, dry_run: see common parameters.

JSON
{
  "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.

ParameterDefault and notes
targetRequired
include_subdomainsTrue
limit100, max 1000

Also takes cursor, provider, max_credits, dry_run: see common parameters.

JSON
{
  "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.

ParameterDefault and notes
targets[]Required, max 1000

Also takes provider, max_credits, dry_run: see common parameters.

JSON
{
  "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.

ParameterDefault and notes
targets[]Required, max 1000
location"United States"
language"en"

Also takes provider, max_credits, dry_run: see common parameters.

JSON
{
  "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.

ParameterDefault and notes
urlRequired, http or https

Also takes max_credits, dry_run: see common parameters.

JSON
{
  "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.

ParameterDefault and notes
targetRequired, a domain
max_pagesRequired, max 1000 on the Free plan
renderFalse; true executes JavaScript and costs 10x

Note: Lighthouse is not available in this phase.

Also takes max_credits, dry_run: see common parameters.

JSON
{
  "target": "example.com",
  "max_pages": 500
}