# SEO Toolkit All-in-One - Ahrefs & Semrush Alternative

> Domain overview, ranked keywords, competitors, top pages, backlinks, referring domains, keyword metrics and live Google SERPs in one Actor. Licensed DataForSEO data, no scraping of Ahrefs or Semrush, no subscription. One "tool" parameter makes it a perfect MCP tool for AI agents.

- Category: Rank tracking & site SEO
- Price: $3 per 1,000 × result row, billed per result by Apify (no subscription); any other billed events are listed on the Store page. Cap any run with `maxTotalChargeUsd`.
- Store page: https://apify.com/wrenfield-data/seo-toolkit
- Human page: https://wrenfielddata.com/tools/seo-toolkit/
- OpenAPI 3 spec: https://api.apify.com/v2/acts/wrenfield-data~seo-toolkit/builds/default/openapi.json
- MCP tool: https://mcp.apify.com?tools=wrenfield-data/seo-toolkit (appears as `wrenfield-data--seo-toolkit`)

## Call it

Synchronous run that returns the dataset rows as JSON (use `/runs` for long jobs and poll; see the OpenAPI spec):

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/wrenfield-data~seo-toolkit/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"tool": "domain_overview", "targets": ["backlinko.com"], "location": "United States", "maxResults": 20}'
```

## Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `tool` | string | yes | `"domain_overview"` | What to look up. Domain tools read targets; keyword_overview and serp read keywords. |
| `targets` | array |  |  | Domains (example.com) or page URLs, for domain_overview, ranked_keywords, competitors, top_pages, backlinks and referring_domains. Up to 100. |
| `keywords` | array |  |  | Keywords for keyword_overview (up to 2,000) and serp (up to 100). |
| `location` | string |  | `"United States"` | Country: name (United States), 2-letter code (DE) or location code (2840). |
| `language` | string |  |  | Language name or code (English, es). Leave empty for the main language of the country. |
| `maxResults` | integer |  | `50` | Row limit for list tools (ranked keywords, competitors, top pages, backlinks, referring domains, SERP rows). The default of 50 keeps runs fast and cheap. |
| `includeBacklinks` | boolean |  | `true` | Adds domain rank, backlinks, referring domains and spam score to domain_overview (one extra backlinks request per domain). Turn off for traffic and keyword metrics only. |
| `includeSubdomains` | boolean |  | `true` | Count subdomains of the target (e.g. blog.example.com) too. |
| `allBacklinksPerDomain` | boolean |  | `false` | Off = one (strongest) backlink per referring domain, the most useful view. On = every backlink. |
| `serpDepth` | integer |  | `10` | serp tool only: how many Google results to check, in steps of 10 (each 10 results is one SERP request). |
| `device` | string |  | `"desktop"` | serp tool only. |

## Example input

```json
{
  "tool": "domain_overview",
  "targets": [
    "backlinko.com"
  ],
  "location": "United States",
  "maxResults": 20
}
```

## Output fields

One flat row per result:

| Field | Type | Description |
|---|---|---|
| `tool` | string | Tool that produced the row |
| `target` | string | Domain, URL or keyword the row is about |
| `keyword` | string | Keyword (ranked_keywords, keyword_overview, serp) |
| `position` | integer | Google position (ranked_keywords, serp) |
| `position_absolute` | integer | Absolute position counting all result types (serp) |
| `url` | string | Ranking URL (ranked_keywords, serp) or page URL (top_pages) |
| `title` | string | Result title (serp) |
| `description` | string | Result snippet (serp) |
| `domain` | string | Result domain (serp) |
| `result_type` | string | organic, paid or featured_snippet |
| `is_featured_snippet` | boolean | Result is a featured snippet (serp) |
| `has_ai_overview` | boolean | Google shows an AI Overview for the keyword |
| `serp_features` | array | Result types on the Google results page |
| `serp_results_count` | integer | Total results Google reports (serp) |
| `search_volume` | integer | Average monthly Google searches |
| `cpc` | number | Average Google Ads cost per click (USD) |
| `competition` | string | Google Ads competition level |
| `keyword_difficulty` | integer | SEO keyword difficulty 0-100 |
| `difficulty_level` | string | very easy / easy / possible / difficult / hard / very hard |
| `search_intent` | string | Main search intent |
| `search_volume_trend` | object | Search volume change in % (monthly, quarterly, yearly) |
| `estimated_traffic` | number | Estimated monthly visits from this ranking (ranked_keywords) |
| `previous_position` | integer | Previous position (ranked_keywords) |
| `position_change` | string | new, up, down or same (ranked_keywords) |
| `organic_keywords` | integer | Keywords ranking in Google top 100 (domain_overview, top_pages) |
| `organic_traffic` | integer | Estimated monthly organic visits (domain_overview, top_pages) |
| `organic_traffic_value_usd` | number | What the organic traffic would cost in Google Ads per month (USD) |
| `top3_keywords` | integer | Keywords in positions 1-3 |
| `top10_keywords` | integer | Keywords in positions 1-10 |
| `new_keywords` | integer | Newly ranking keywords since the last update (domain_overview) |
| `lost_keywords` | integer | Keywords that stopped ranking (domain_overview) |
| `keywords_up` | integer | Keywords that moved up (domain_overview) |
| `keywords_down` | integer | Keywords that moved down (domain_overview) |
| `paid_keywords` | integer | Keywords with Google Ads (domain_overview) |
| `paid_traffic` | integer | Estimated monthly paid visits (domain_overview) |
| `paid_traffic_cost_usd` | number | Estimated monthly Google Ads spend (USD, domain_overview) |
| `domain_rank` | integer | Domain authority score 0-1000 from the backlink index (domain_overview, referring_domains) |
| `backlinks` | integer | Live backlinks (domain_overview: total; referring_domains: from that domain) |
| `referring_domains` | integer | Referring domains (domain_overview) |
| `referring_main_domains` | integer | Referring root domains (domain_overview) |
| `referring_ips` | integer | Referring IP addresses (domain_overview) |
| `broken_backlinks` | integer | Backlinks pointing to broken pages (domain_overview) |
| `spam_score` | integer | Backlink spam score 0-100 (higher = spammier) |
| `first_seen` | string | When the domain or link was first seen (ISO 8601) |
| `last_seen` | string | When the link was last seen (backlinks) |
| `found` | boolean | domain_overview: false when no data exists for the domain |
| `competitor_domain` | string | Competing domain (competitors) |
| `common_keywords` | integer | Keywords both domains rank for (competitors) |
| `avg_position` | number | Competitor average position on shared keywords (competitors) |
| `shared_keywords_traffic` | integer | Competitor traffic from shared keywords (competitors) |
| `competitor_organic_keywords` | integer | Competitor total organic keywords (competitors) |
| `competitor_organic_traffic` | integer | Competitor total organic traffic (competitors) |
| `competitor_traffic_value_usd` | number | Competitor organic traffic value in USD (competitors) |
| `source_url` | string | Page the backlink is on (backlinks) |
| `source_domain` | string | Domain the backlink is on (backlinks) |
| `source_title` | string | Title of the linking page (backlinks) |
| `target_url` | string | Linked page on the target (backlinks) |
| `anchor` | string | Anchor text (backlinks) |
| `dofollow` | boolean | Link passes authority (backlinks) |
| `link_type` | string | anchor, image, redirect, canonical, ... (backlinks) |
| `source_domain_rank` | integer | Rank 0-1000 of the linking domain (backlinks) |
| `source_page_rank` | integer | Rank 0-1000 of the linking page (backlinks) |
| `referring_domain` | string | Linking domain (referring_domains) |
| `referring_pages` | integer | Pages on the referring domain that link (referring_domains) |
| `location` | string | Country the data is for, e.g. "United States" |
| `language` | string | Language name, e.g. "English" |
| `scraped_at` | string | When this row was produced (ISO 8601, UTC) |

## Notes

- Auth: an Apify API token as `Authorization: Bearer <token>`; the MCP server also supports OAuth sign-in.
- Failed or empty results are not charged on most tools; check the pricing on the Store page.
- Questions: hello@wrenfielddata.com
