# Website Traffic Checker: SEO Keywords & Backlinks (`vncntlabs/domain-seo-data`) Actor

Check any website's organic search traffic, the Google keywords it ranks for, top 3/10 positions, traffic value, SEO competitors, domain rank and backlinks in 94 countries. Licensed DataForSEO data, no scraping. Bulk mode checks up to 5,000 domains per run for audits and lead lists.

- **URL**: https://apify.com/vncntlabs/domain-seo-data.md
- **Developed by:** [vncntlabs Labs](https://apify.com/vncntlabs) (community)
- **Categories:** SEO tools, Marketing, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 domain overviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Website Traffic Checker: organic traffic, ranking keywords, competitors and backlinks for any domain

**Check any website's organic search traffic and SEO data** in one run: estimated monthly organic traffic and its value, every Google keyword the domain ranks for, top 3 and top 10 positions, its real SEO competitors, domain rank and backlink profile, in 94 countries. Data comes from licensed DataForSEO databases, not scraping, and bulk mode checks up to 5,000 domains per run, which makes it useful for SEO audits, competitor research and enriching lead lists with website traffic.

The data comes from **DataForSEO's licensed SEO databases**. There's no scraping and no Semrush or Ahrefs subscription, so nothing breaks when their sites change. It covers 94 countries. Bulk mode handles up to 5,000 domains per run.

**Who it's for**

- SEO agencies doing audits and competitor research
- Content teams looking for keyword gaps
- Sales and lead-gen teams scoring prospects by website traffic
- Investors and market researchers sizing companies online

### What you get

| Mode | You give | You get |
|---|---|---|
| **Full domain report** (default) | Up to 200 domains, 1 to 10 countries | **Overview row** per domain and country: organic traffic, keyword count, traffic value (USD), top 3/10/20/50/100 counts, full rank distribution, new/up/down/lost keywords, paid search traffic and keywords. **Ranked keyword rows** (up to 5,000 per domain): position, URL, search volume, CPC, difficulty, intent, estimated traffic, SERP features. **Competitor rows**: shared keywords, average position, competitor traffic. **Backlink profile**: DataForSEO Rank 0–100, backlinks, referring domains/IPs/subnets, dofollow, spam score, top referring TLDs and countries |
| **Bulk traffic & authority** | Up to 5,000 domains | One row per domain and country: organic traffic, organic keywords, paid traffic, paid keywords and domain rank. Built for lead lists and fast domain screening |

**Options**

- Sort keywords by traffic, search volume or position.
- Keep only keywords ranking in the top N, or above a minimum search volume.
- Exclude giant sites (Wikipedia, YouTube, Amazon…) from the competitor list.
- Turn backlinks or authority on or off.
- Choose a language for multilingual countries.

### Input examples

Full report for one site:

```json
{ "domains": ["printify.com"], "countries": ["US"], "maxKeywords": 100, "maxCompetitors": 10, "includeBacklinks": true }
```

Keywords a competitor ranks for on page 1, sorted by search volume:

```json
{ "domains": ["shopify.com"], "maxKeywords": 300, "maxPosition": 10, "keywordSort": "volume", "maxCompetitors": 0, "includeBacklinks": false }
```

Traffic in five markets:

```json
{ "domains": ["printify.com"], "countries": ["US", "GB", "CA", "AU", "DE"], "maxKeywords": 20, "maxCompetitors": 5 }
```

Score a lead list by search traffic and authority:

```json
{ "mode": "bulk", "domains": ["mailchimp.com", "klaviyo.com", "brevo.com"], "countries": ["US"], "includeAuthority": true }
```

**Domain input**

- `example.com`, `www.example.com`, `https://example.com/any/page` and `EXAMPLE.COM` all count as the same domain.
- Subdomains like `blog.example.com` are analyzed on their own.
- Duplicates and invalid entries (emails, IP addresses, unknown extensions) are skipped and listed. They are never charged.

**Countries** are picked from a list of 94 (API: ISO codes such as `US`, `GB`, `DE`). The language defaults to the country's main language.

### Output

**Overview row** (`type: "domain"`), trimmed:

```json
{
  "domain": "printify.com", "country": "US", "status": "ok",
  "organicTraffic": 129516.2, "organicKeywords": 71185, "organicTrafficValueUsd": 512211.38,
  "top3": 2466, "top10": 15202, "top100": 71185,
  "rankDistribution": { "pos_1": 726, "pos_2_3": 1740, "pos_4_10": 12736, "pos_11_20": 17721 },
  "keywordsNew": 25534, "keywordsLost": 43743, "paidTraffic": 0, "paidKeywords": 0,
  "keywordsReturned": 100, "keywordsMatchingFilters": 71185, "competitorsReturned": 10,
  "domainRank": 65, "backlinks": 186234, "referringDomains": 19217, "dofollowReferringDomains": 14565,
  "backlinksSpamScore": 12, "topReferringTlds": { "com": 103279, "net": 8497 }
}
```

**Keyword row** (`type: "keyword"`):

```json
{
  "domain": "printify.com", "country": "US", "rank": 1, "keyword": "printify", "position": 1,
  "url": "https://printify.com/", "searchVolume": 246000, "cpc": 4.61, "competition": "MEDIUM",
  "keywordDifficulty": 43, "intent": "informational", "traffic": 62871.8, "trafficValueUsd": 289839.12,
  "serpFeatures": ["organic", "people_also_ask", "video"], "isNew": false, "isUp": false
}
```

**Competitor row** (`type: "competitor"`):

```json
{
  "domain": "printify.com", "rank": 1, "competitor": "printful.com", "sharedKeywords": 29998,
  "sharedKeywordsPct": 42.1, "avgPosition": 17.3, "competitorTraffic": 112507.6, "competitorKeywords": 68541
}
```

**Bulk row** (`type: "bulk"`):

- `organicTraffic`, `organicKeywords`
- `paidTraffic`, `paidKeywords`
- `domainRank`

**Every run also writes**

- A `status` on every domain:
  - `ok`
  - `no_data`: the domain has no Google rankings in that country, for example a new or tiny site
  - `error`
  - `not_processed`
- `skipped` rows for invalid or duplicate inputs.
- A run summary in the `OUTPUT` record.

**Dataset views:** Domain overview, Ranked keywords, Competitors, Bulk metrics. Export to CSV, Excel or JSON, or pull it via the API.

### Pricing (pay per event)

You pay only for the data you get.

| Event | Charged when |
|---|---|
| **Domain overview** | One domain analyzed in one country that has search data |
| **Ranked keyword** | Each keyword row delivered |
| **Competitor** | Each competitor row delivered |
| **Backlink profile** | Backlink summary for one domain (all countries) |
| **Bulk domain** | Bulk mode: each domain checked in one country |
| **Bulk batch** | Bulk mode: once per batch of up to 1,000 domains |
| **Actor start** | Once per run (Apify standard) |

**Never charged**

- Invalid or duplicate inputs.
- Provider errors.
- Report-mode domains with no search data (`no_data`). In bulk mode, every checked domain is charged, because "no traffic" is itself the answer.
- Backlinks for domains that have no search data in any selected country. These are skipped.

Set a **maximum charge per run** and the Actor plans its work to stay under it. Overviews come first, then keywords, competitors and backlinks. Anything it can't afford is reported as `not_processed`.

**Apify free plan:** each run is limited to:

- 2 domains, 20 keywords, 5 competitors and 1 country (no backlinks) in report mode
- 25 domains (no authority) in bulk mode

### Good to know

- **Traffic is search traffic, not visits.** `organicTraffic` estimates monthly clicks from Google organic search in the selected country. It's calculated from rankings × search volume × click-through rate. It isn't total website visits like Similarweb's, and it won't match Google Analytics. Use it to compare domains with each other.
- **Domain rank is DataForSEO Rank (0–100).** It's computed from the backlink graph much like Ahrefs DR or Moz DA, but it's a different scale. Don't mix them.
- **Ranked keywords** cover Google's top 100 results, up to 5,000 per domain per country, ordered by estimated traffic by default.
  - `keywordsMatchingFilters` shows how many exist in total.
  - Overview counts are always for the whole domain, even when you filter the keyword list.
- **Competitors** are domains that rank for the same keywords, ordered by shared keywords. Giant sites are excluded by default. A domain's own subdomains may appear in the list.
- **Freshness.** Rankings are refreshed continuously, and keyword search volumes monthly. Each keyword row carries `serpUpdated`.
- **No worldwide mode.** Data is per country. Add several countries to compare markets.
- **Lost keywords** come from the provider's history and are only included when it reports them.

### FAQ

**Is this a Semrush or Ahrefs scraper?** No. It doesn't log in to or scrape any SEO tool. The data comes from DataForSEO's own licensed databases, which agencies and SEO tools use. That's why it doesn't break or need your account.

**Why does a domain show `no_data`?** The domain doesn't rank in Google's top 100 for any tracked keyword in that country. This is common for new, tiny or non-English sites; try their main country. You're not charged in report mode.

**Why don't numbers match Semrush or Ahrefs?** Every SEO database estimates traffic and backlinks differently, from different keyword sets and crawls. Use one source consistently when comparing domains.

**Not affiliated** with Google, Semrush, Ahrefs, Moz or Similarweb. Names are used only for comparison.

Made by **VNCNT Labs**. Questions or a missing feature? Open an issue on the Actor page.

# Actor input Schema

## `domains` (type: `array`):

One per line: <code>example.com</code>, a subdomain (<code>blog.example.com</code>) or a URL (only the domain is used). Up to 200 domains in report mode, 5,000 in bulk mode.

## `mode` (type: `string`):

<b>Full report</b>: per domain and country, the SEO overview (organic and paid traffic estimates, number of ranking keywords, top 3/10/20/100 positions, traffic value), the top ranked keywords, top organic competitors and the backlink profile. <b>Bulk metrics</b>: one row per domain with organic/paid traffic, keyword counts and domain rank, for lead lists and market maps (up to 5,000 domains).

## `countries` (type: `array`):

Google market(s) to analyze. Each country is a separate analysis (one overview row per domain per country). Up to 10.

## `maxKeywords` (type: `integer`):

Top keywords the domain ranks for in Google (per country), with position, URL, search volume, CPC, difficulty, intent and estimated traffic. 0 = overview only.

## `keywordSort` (type: `string`):

Which keywords come first when there are more than you asked for.

## `maxPosition` (type: `integer`):

For example 10 = only keywords where the domain is on Google's first page.

## `minSearchVolume` (type: `integer`):

Skip keywords with fewer monthly searches.

## `maxCompetitors` (type: `integer`):

Organic search competitors: domains ranking for the most of the same keywords, with shared keywords, average position and their own traffic. 0 = none.

## `excludeTopDomains` (type: `boolean`):

Leave out sites that rank for everything (YouTube, Wikipedia, Amazon, Reddit and similar) so the list shows real business competitors.

## `includeBacklinks` (type: `boolean`):

Domain rank (DataForSEO Rank 0-100, an authority score like Ahrefs DR), backlinks, referring domains, dofollow share, spam score, first seen, top referring TLDs and countries. One lookup per domain (not per country).

## `includeAuthority` (type: `boolean`):

Bulk mode: add DataForSEO Rank (0-100) for every domain.

## `language` (type: `string`):

Language code such as <code>es</code> for countries with several languages (US: en/es, CA: en/fr, CH: de/fr/it, BE: fr/nl/de, IN: en/hi). Default: English where available, otherwise the country's main language.

## Actor input object example

```json
{
  "domains": [
    "printify.com"
  ],
  "mode": "report",
  "countries": [
    "US"
  ],
  "maxKeywords": 100,
  "keywordSort": "traffic",
  "maxPosition": 100,
  "minSearchVolume": 0,
  "maxCompetitors": 10,
  "excludeTopDomains": true,
  "includeBacklinks": true,
  "includeAuthority": true
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `keywords` (type: `string`):

No description

## `competitors` (type: `string`):

No description

## `bulk` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "domains": [
        "printify.com"
    ],
    "countries": [
        "US"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vncntlabs/domain-seo-data").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "domains": ["printify.com"],
    "countries": ["US"],
}

# Run the Actor and wait for it to finish
run = client.actor("vncntlabs/domain-seo-data").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "domains": [
    "printify.com"
  ],
  "countries": [
    "US"
  ]
}' |
apify call vncntlabs/domain-seo-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vncntlabs/domain-seo-data"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/sM8Skx7slkhgdU8Kk/builds/8EagvVHj2MtWkA3BS/openapi.json
