# SpyFu Alternative — SEO & PPC Competitor Keywords (`khadinakbar/spyfu-alternative`) Actor

Return SpyFu-style competitor SEO and PPC reports: overview, organic/paid keywords, competitors, top pages, and backlinks. Use for PPC spy without a SpyFu login. One row per domain, keyword, competitor, page, or backlink. Charged $0.01/row plus $0.04/API request.

- **URL**: https://apify.com/khadinakbar/spyfu-alternative.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** SEO tools, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 seo records

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## SpyFu Alternative — SEO & PPC Competitor Keywords

PPC teams and AI agents turn a competitor domain into SpyFu-style dataset rows: domain overview, organic keywords, paid keywords with ad copy, competitors, keyword overview, top pages, and backlinks. Each run returns structured JSON with `organicTraffic`, `paidKeywordCount`, `estimatedPaidCostUsd`, and `backlinks`, ready for API, schedule, and MCP use. Owner credentials are already configured.

### Best fit for this Actor

- Score a competitor domain's organic traffic estimate, paid keyword count, estimated paid cost, and backlink summary in one row.
- Export the paid keywords a domain bids on, including ad title, ad description, rank, volume, and estimated paid cost.
- List overlapping SEO or PPC competitors, then inspect their top pages.

When you already have a finished keyword list and only need volume plus CPC, start with [Keyword Search Volume API](https://apify.com/khadinakbar/keyword-search-volume-api). For Semrush-shaped keyword ideas rather than paid-ad spy, use [SEMRush Alternative](https://apify.com/khadinakbar/semrush-alternative). For Google Ads Transparency creatives, use [Google Ads Transparency Scraper](https://apify.com/khadinakbar/google-ads-transparency-scraper).

### Practical scenario

A PPC lead pastes `shopify.com`, keeps `mode` on `domain_overview`, and runs the Actor. The dataset returns one row with `organicTraffic`, `paidKeywordCount`, `estimatedPaidCostUsd`, `backlinks`, and `referringDomains`. They then switch `mode` to `paid_keywords` with `maxResults` 5 to inspect ad copy before briefing a competitor report. Unknown or empty matches finish `SUCCEEDED` with `VALID_EMPTY` and no `seo-record` charge.

### Quick start input

```json
{
  "mode": "domain_overview",
  "target": "shopify.com",
  "locationName": "United States",
  "languageCode": "en",
  "maxResults": 5
}
```

`target` accepts a bare domain or a full URL. Keyword overview uses `keywords` instead of `target`.

### Input reference

| Field | Type | What it controls |
|---|---|---|
| `mode` | enum | `domain_overview`, `organic_keywords`, `paid_keywords`, `competitors`, `keyword_overview`, `top_pages`, or `backlinks`. Default `domain_overview`. |
| `target` | string | Domain or URL for domain, keyword-list, competitor, page, and backlink modes. Example: `shopify.com`. |
| `keywords` | array | Seed phrases for `keyword_overview`. Example: `["shopify"]`. |
| `competitorChannel` | enum | `both`, `paid`, or `organic` for competitors mode. Default `both`. |
| `locationName` | string | Country name. Default United States. |
| `languageCode` | string | Language code such as `en`. Default `en`. |
| `maxResults` | integer | Row cap 1–100. Default 5. Domain overview still writes at most one row. |

Owner API credentials are already configured for Store runs. This Actor does not accept user API keys.

### What data you receive

One dataset item is one domain, keyword, competitor, page, or backlink row.

```json
{
  "mode": "domain_overview",
  "target": "shopify.com",
  "domain": "shopify.com",
  "locationName": "United States",
  "languageCode": "en",
  "organicKeywordCount": 149968,
  "organicTraffic": 45000,
  "paidKeywordCount": 36,
  "estimatedPaidCostUsd": 2200,
  "backlinks": 9000,
  "referringDomains": 1200,
  "source": "spyfu_alternative/domain_overview",
  "status": "OK",
  "fetchedAt": "2026-08-22T00:00:00.000Z"
}
```

| Field | Meaning |
|---|---|
| `organicTraffic` / `paidTraffic` | Organic and paid traffic estimates |
| `estimatedPaidCostUsd` | Estimated paid traffic value or per-keyword paid cost |
| `adDescription` | Public paid-ad description when `mode` is `paid_keywords` |
| `source` | Mode provenance label for the row |

`OUTPUT` and `RUN_SUMMARY` in the default key-value store hold `outcome`, `itemsPushed`, `chargedEventCounts`, and `providerCostUsd`. Download the dataset as JSON, CSV, Excel, or HTML.

### Use through the API

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~spyfu-alternative/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"domain_overview","target":"shopify.com","maxResults":5}'
```

### Use with AI agents through Apify MCP

> Run a SpyFu-style domain overview for shopify.com in the United States. Return organicTraffic, paidKeywordCount, estimatedPaidCostUsd, backlinks, referringDomains, source, and fetchedAt. Read OUTPUT.outcome and itemsPushed. Treat estimatedPaidCostUsd as estimated paid traffic value.

Connect via <https://mcp.apify.com>. Cost signal: about `$0.05` per successful SEO API request plus `$0.01` per saved row.

### Connect the workflow

- When you already have phrases and only need volume plus CPC, then use [Keyword Search Volume API](https://apify.com/khadinakbar/keyword-search-volume-api).
- For Semrush-style keyword ideas after you pick a seed, continue with [SEMRush Alternative](https://apify.com/khadinakbar/semrush-alternative).
- For Google Ads Transparency creatives after you identify an advertiser, continue with [Google Ads Transparency Scraper](https://apify.com/khadinakbar/google-ads-transparency-scraper).

### Pricing

This Actor uses Pay per event plus Apify platform usage. The live Pricing tab is the current source of truth for billing details.

- `apify-actor-start`: $0.00005 per run
- `seo-api-request`: **$0.05** per successful upstream SEO API task
- `seo-record`: **$0.012** per persisted row

A domain-overview prefill is two API tasks plus one row. Empty matches have no `seo-record` charge. Provider cost is recorded in `RUN_SUMMARY.providerCostUsd`.

### How it works

1. Normalize the domain or keyword list for the selected mode.
2. Call the matching upstream SEO API endpoint for that mode.
3. Charge `seo-api-request` after each successful task.
4. Charge `seo-record`, then write each validated dataset row.

### Best results

- Use a real hostname such as `shopify.com` rather than a SpyFu app URL.
- Keep `maxResults` at 5 while you confirm the output shape, then raise it for exports.
- Treat traffic, volume, paid cost, and rank as model estimates for public keywords and domains you are authorized to research.
- A valid query with no match finishes `SUCCEEDED` with `VALID_EMPTY`.

### Builder's note

I found that Store SpyFu scrapers depend on public SpyFu pages that change and that they return one bundled overview per domain. Routing this SKU through owner-managed upstream SEO APIs keeps the SpyFu-shaped modes (overview, organic keywords, paid keywords with ad copy, PPC competitors, top pages, backlinks) on a forecastable HTTP path with owner credentials already configured. Domain overview merges two provider tasks into one billed row so a first run stays cheap to preview.

### Legal and responsible use

Use this Actor with public SEO and PPC research you are authorized to run. Metrics are independent of SpyFu, Inc. Follow applicable law and the upstream data provider terms, and keep the output in your own compliance workflow.

Issues and feature requests: use the Actor Issues tab on Apify.

# Actor input Schema

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

Which SpyFu-style report to run. domain\_overview returns one domain row (organic plus paid traffic estimates and a backlink summary). organic\_keywords lists ranking phrases. paid\_keywords lists Google Ads phrases with ad copy and estimated paid cost. competitors lists overlapping domains. keyword\_overview scores seed phrases. top\_pages lists high-traffic URLs. backlinks lists referring URLs. Default domain\_overview. This is NOT a SpyFu login or API key field.

## `target` (type: `string`):

Website to analyze for domain overview, organic keywords, paid keywords, competitors, top pages, or backlinks. Accepts shopify.com or https://www.shopify.com. Protocol and www are stripped to the hostname except for page-level backlinks. Prefill shopify.com. Not a keyword and not a SpyFu app URL.

## `keywords` (type: `array`):

Seed phrases for keyword\_overview. Example: \["shopify"]. Duplicates collapse. Capped by maxResults. Ignored in domain modes. This is NOT a domain list.

## `competitorChannel` (type: `string`):

Which search channel competitors mode uses. both (default) matches organic and paid overlap. paid is the SpyFu-style PPC rival list. organic is SEO-only overlap. Ignored in other modes. This is NOT a country field.

## `locationName` (type: `string`):

Country name for keyword and domain reports, such as United States or United Kingdom. Defaults to United States. Use the full country name, not a city. Ignored for backlinks mode.

## `languageCode` (type: `string`):

Language code matching the country, such as en, de, or es. Defaults to en. This is a short code, not a language name like English.

## `maxResults` (type: `integer`):

Maximum dataset rows to write (1-100). Defaults to 5 so quality tests and agent calls stay cheap. domain\_overview always writes at most one row. Caps keyword lists in keyword\_overview.

## `includeSubdomains` (type: `boolean`):

When true, keyword and backlink summary include subdomain data. Defaults to true. Does not crawl the live website.

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

When true, competitors mode drops giant generic sites so the list stays closer to real market rivals. Defaults to true. Ignored in other modes.

## Actor input object example

```json
{
  "mode": "domain_overview",
  "target": "shopify.com",
  "keywords": [
    "shopify"
  ],
  "competitorChannel": "both",
  "locationName": "United States",
  "languageCode": "en",
  "maxResults": 5,
  "includeSubdomains": true,
  "excludeTopDomains": true
}
```

# Actor output Schema

## `results` (type: `string`):

Domain, keyword, competitor, page, or backlink rows.

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

Compact OUTPUT record with outcome, itemsPushed, charges, and warnings.

## `runSummary` (type: `string`):

Detailed RUN\_SUMMARY including providerCostUsd and request counts.

# 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 = {
    "mode": "domain_overview",
    "target": "shopify.com",
    "keywords": [
        "shopify"
    ],
    "competitorChannel": "both",
    "locationName": "United States",
    "languageCode": "en",
    "maxResults": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/spyfu-alternative").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 = {
    "mode": "domain_overview",
    "target": "shopify.com",
    "keywords": ["shopify"],
    "competitorChannel": "both",
    "locationName": "United States",
    "languageCode": "en",
    "maxResults": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/spyfu-alternative").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 '{
  "mode": "domain_overview",
  "target": "shopify.com",
  "keywords": [
    "shopify"
  ],
  "competitorChannel": "both",
  "locationName": "United States",
  "languageCode": "en",
  "maxResults": 5
}' |
apify call khadinakbar/spyfu-alternative --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/spyfu-alternative"
        }
    }
}

```

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/wLJ944Yvd4pzD3Tr6/builds/gRJ5iLeRDmnOHLaYr/openapi.json
