# Competitor Keywords - Ranked Keywords of Any Domain

> See every Google keyword a competitor ranks for: position, URL, search volume, CPC, keyword difficulty, intent and estimated traffic for any domain or page, in 90+ countries. Bulk domains, sortable, filterable. No SEO suite subscription needed.

- Category: Keyword data
- Price: $2 per 1,000 × ranked keyword, 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/competitor-keywords
- Human page: https://wrenfielddata.com/tools/competitor-keywords/
- OpenAPI 3 spec: https://api.apify.com/v2/acts/wrenfield-data~competitor-keywords/builds/default/openapi.json
- MCP tool: https://mcp.apify.com?tools=wrenfield-data/competitor-keywords (appears as `wrenfield-data--competitor-keywords`)

## 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~competitor-keywords/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["backlinko.com"], "location": "United States", "language": "English", "maxKeywordsPerDomain": 20}'
```

## Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `domains` | array | yes | `["backlinko.com"]` | Competitor domains (e.g. example.com) or full page URLs (e.g. https://example.com/blog/post), one per line. https:// and www. are removed automatically for domains. |
| `location` | string |  | `"United States"` | Country of the Google results: name (United States), 2-letter code (GB) or location code (2840). |
| `language` | string |  |  | Language name or code (English, de). Leave empty for the main language of the country. |
| `maxKeywordsPerDomain` | integer |  | `100` | How many ranked keywords to return for each domain (up to 50,000). You pay per keyword returned. |
| `sortBy` | string |  | `"search_volume"` | Which keywords come first (and are kept when you limit the number of keywords). |
| `minSearchVolume` | integer |  | `0` | Only return keywords with at least this many monthly searches. 0 = all. |
| `maxPosition` | integer |  | `100` | Only return keywords where the domain ranks at this position or better (e.g. 10 = first page only). 100 = all. |
| `resultTypes` | string |  | `"organic"` | Which Google result types count as a ranking. |
| `includeSubdomains` | boolean |  | `true` | Count rankings of subdomains (e.g. blog.example.com) for a domain. |

## Example input

```json
{
  "domains": [
    "backlinko.com"
  ],
  "location": "United States",
  "language": "English",
  "maxKeywordsPerDomain": 20
}
```

## Output fields

One flat row per result:

| Field | Type | Description |
|---|---|---|
| `domain` | string | Domain or page URL the keywords were looked up for |
| `keyword` | string | Keyword the domain ranks for in Google |
| `position` | integer | Google rank among results of the same type (1 = top) |
| `position_absolute` | integer | Absolute position on the results page, counting all SERP elements |
| `result_type` | string | Type of the ranking result: organic, paid, featured_snippet, local_pack or ai_overview_reference |
| `url` | string | URL of the ranking page |
| `title` | string | Title of the ranking result |
| `search_volume` | integer | Average monthly Google searches for the keyword |
| `cpc` | number | Average Google Ads cost per click (USD) |
| `competition` | string | Google Ads competition level: LOW, MEDIUM or HIGH |
| `keyword_difficulty` | integer | SEO keyword difficulty, 0-100 (higher = harder to rank) |
| `search_intent` | string | Main search intent: informational, navigational, commercial or transactional |
| `estimated_traffic` | number | Estimated monthly organic visits this ranking brings the domain |
| `estimated_traffic_cost_usd` | number | What that traffic would cost per month in Google Ads (USD) |
| `previous_position` | integer | Previous absolute position, when known |
| `position_change` | string | Change since the previous check: new, up, down or same |
| `serp_features` | array | SERP feature types present on the results page (e.g. people_also_ask, ai_overview) |
| `is_featured_snippet` | boolean | True when the ranking result is a featured snippet |
| `search_volume_trend` | object | Search volume change in % (monthly, quarterly, yearly) |
| `location` | string | Country the data is for, e.g. "United States" |
| `language` | string | Language name, e.g. "English" |
| `serp_checked_at` | string | When the Google results page was last checked (ISO 8601, UTC) |
| `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
