SFOLN

Catalogue / SEO & search

Competitor Domains Finder (SEO)

sfoln/competitor-domains · SEO tools, Lead generation, Developer tools On request

Find the domains competing with any website in Google organic search: shared keywords, average position, estimated traffic, ranking keywords and top-10 counts per competitor. $0.045 per domain ($45 per 1,000) + $1 per 1,000 competitors.

About

What it does

Competitor Domains Finder (SEO) finds the websites that compete with a domain in Google organic search. For each competitor you get the number of shared keywords, its average position on those keywords, and the size of its whole organic presence: estimated traffic, number of ranking keywords, and top-1, top-3 and top-10 counts (DataForSEO Labs data). Use it to map a market, find content and link opportunities, benchmark clients, or give AI agents competitive context. You pay $0.045 per domain plus $1 per 1,000 competitors delivered.

Price

Price per delivered record

EventPricePer 1,000Charged for
Competitor query
competitor-domains-query
$0.045$45 / 1,000Charged once per domain the upstream processed (covers the per-request fee).
Competitor domain
competitor-domain
$0.001$1 / 1,000Charged once per competitor record delivered.

Apify free plan: up to 5 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~competitor-domains/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains":["dataforseo.com"],"limitPerDomain":5}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/competitor-domains"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~competitor-domains/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Which 20 websites compete most with dataforseo.com in Google organic search? Show shared keywords and estimated traffic for each.

Input

Input fields

Enter domains. Each domain returns up to `limitPerDomain` organic competitors, in the order DataForSEO returns them.

FieldTypeDefaultMeaning
domains *arrayrequiredDomains
Domains or URLs, one per line (URLs are reduced to their domain). Accounts on the Apify free plan can process up to 5 domains per run.
limitPerDomaininteger20Competitors per domain
Maximum competitors returned per domain. Each competitor is billed as competitor-domain. Range 1–100.
locationstring"2840"Location
DataForSEO location code (2840 = United States, 2826 = United Kingdom, 2276 = Germany) or full location name (e.g. "United Kingdom").
languageCodestring"en"Language code
Language code, e.g. en, de, fr, es.
excludeTopDomainsbooleanfalseExclude top domains
Drop very large generic sites (Wikipedia, Amazon, YouTube…) from the competitor list.
maxDomainsinteger100Max domains
Safety cap on how many domains are processed in this run. Range 1–1000.
concurrencyinteger3Concurrency
How many domains are processed in parallel. Range 1–6.
includeRawbooleanfalseInclude raw upstream response
Attach the unmodified DataForSEO item to each result record.
Example input
{
  "domains": [
    "dataforseo.com"
  ],
  "limitPerDomain": 5
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
recordTypestringRecord type
competitor = one competitor; summary = one per input domain. e.g. "competitor"
domainstringDomain
Your (input) domain. e.g. "dataforseo.com"
competitorDomainstringCompetitor
Competing domain. e.g. "semrush.com"
intersectionsinteger | nullShared keywords
Keywords both domains rank for. e.g. 1830
avgPositionnumber | nullAvg position
Competitor’s average position on the shared keywords.
sumPositioninteger | nullSum of positions
Sum of the competitor’s positions on the shared keywords.
organicEtvnumber | nullOrganic traffic
Competitor’s estimated monthly organic traffic (whole domain).
organicKeywordsinteger | nullOrganic keywords
Keywords the competitor ranks for (whole domain).
organicPos1integer | nullPos 1
Keywords at position 1 (whole domain).
organicPos2_3integer | nullPos 2–3
Keywords at positions 2–3.
organicPos4_10integer | nullPos 4–10
Keywords at positions 4–10.
organicTrafficValueUsdnumber | nullTraffic value (USD)
Estimated monthly ad cost of the competitor’s organic traffic.
sharedKeywordsEtvnumber | nullShared keyword traffic
Competitor’s estimated traffic from the shared keywords only.
sharedKeywordsCountinteger | nullShared keyword rankings
Competitor’s rankings counted on the shared keywords.
limitRequestedintegerLimit requested
limitPerDomain as requested (summary records only).
limitUsedintegerLimit used
Competitors requested upstream after the free-plan cap and budget sizing (summary records only).
competitorsReturnedintegerCompetitors returned
Summary records only.
totalAvailableinteger | nullTotal available
Summary records only.
targetOrganicKeywordsinteger | nullTarget organic keywords
Keywords the input domain itself ranks for (summary records only).
targetOrganicEtvnumber | nullTarget organic traffic
Estimated monthly organic traffic of the input domain itself (summary records only).
queryChargedbooleanDomain fee charged
Whether competitor-domains-query was charged (summary records only).
inputstring | object | nullInput
Domain or URL as entered.
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
chargedbooleanCharged
Whether this record incurred a pay-per-event charge.
chargedEventstringCharged event
competitor-domain (competitor records).
warningsarrayWarnings
Non-fatal notes (limit reduced, budget reached...).
errorobjectError
{code, message, provider?} when status is not ok.
sourcestringSource
Upstream data source.
fetchedAtstringFetched at
ISO timestamp.
Example record
{
  "recordType": "competitor",
  "domain": "dataforseo.com",
  "competitorDomain": "semrush.com",
  "intersections": 1830,
  "avgPosition": 23.46,
  "sumPosition": 42930,
  "organicEtv": 9500000.5,
  "organicKeywords": 2100000,
  "organicPos1": 9000,
  "organicPos2_3": 12000,
  "organicPos4_10": 40000,
  "organicTrafficValueUsd": 4000000,
  "sharedKeywordsEtv": 1200,
  "sharedKeywordsCount": 1830,
  "input": "dataforseo.com",
  "status": "ok",
  "charged": true,
  "chargedEvent": "competitor-domain",
  "source": "dataforseo",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents