John KuehJohn Kueh
All skills

Claude Code skill

serp-data

Geo-targeted SERP analysis and SERP features.

Install all skills in one command:

claude mcp add-plugin johnkueh/claude-skills

Why it exists

Knowing who ranks for '[keyword] near me' in Sydney vs Melbourne usually requires a $130/month SEMrush or Ahrefs seat. DataForSEO charges fractions of a cent per query. This skill is a CLI wrapper for their SERP API with --dry-run cost preview, geo-targeted queries, and SERP feature extraction (featured snippets, People Also Ask, knowledge panels).

In practice

Cost preview
Input
pnpm serp-data "best ramen" --location "Sydney, Australia" --dry-run
Output
Estimated cost: $0.0006. Returns 100 organic results, featured snippet, PAA, related searches.
Real query
Input
pnpm serp-data "best ramen" --location "Sydney, Australia"
Output
Ranked URLs by domain, featured snippet body, 4 PAA questions, competitor domains. Total spend logged.
skills/serp-data/SKILL.mdRaw
---
name: serp-data
description: DataForSEO SERP analysis for geo-targeted search result analysis. See who ranks for keywords in specific locations (Australia, US, UK, etc.), identify content gaps, analyze SERP features (featured snippets, PAA), and find competitor domains. Supports --dry-run to preview costs. Triggers on "who ranks for", "SERP analysis", "search results for", "Google results for [keyword]", "competitors for [keyword]", "featured snippet", "people also ask", "ranking domains", "top 10 for", or "SERP features".
---

# SERP Data (DataForSEO)

Geo-targeted SERP analysis CLI using DataForSEO APIs. Unlike WebFetch, this provides accurate local search results (e.g., Australia-specific rankings).

**Setup:** Set `DATAFORSEO_API_KEY` environment variable with your base64-encoded DataForSEO credentials.

## CLI Location

```
<skill-dir>
```

## Why This Skill?

WebFetch cannot search by local geography. This skill solves that by using DataForSEO's SERP API to:
- Get accurate Australian SERP rankings
- See who ranks for target keywords
- Identify content gaps and opportunities
- Analyze SERP features (featured snippets, PAA)

---

## Quick Start

```bash
cd <skill-dir>

# Check balance first
uv run python cli.py balance

# See who ranks for a keyword in Australia
uv run python cli.py serp "voidable transaction australia" --location au

# Analyze multiple keywords to find top competitors
uv run python cli.py bulk "liquidator" "doca" "voluntary administration"

# Find SERP feature opportunities
uv run python cli.py features "what is voluntary administration"

# Find content gaps (where you don't rank)
uv run python cli.py gaps example-site.com "liquidator" "rocap form" "form 507"
```

---

## Commands

### 1. `serp` - Single keyword SERP analysis

Get organic rankings and SERP features for one keyword.

```bash
cd <skill-dir>

# Basic usage (Australia default)
uv run python cli.py serp "rocap form"

# Specify location
uv run python cli.py serp "liquidator" --location au
uv run python cli.py serp "liquidator" --location us

# Get more results
uv run python cli.py serp "voluntary administration" --depth 20

# Include all SERP features (advanced)
uv run python cli.py serp "unfair preference" -a

# Save raw JSON for detailed analysis
uv run python cli.py serp "form 507" -j
```

**Cost:** ~$0.003 per 10 results

---

### 2. `bulk` - Multi-keyword competitor analysis

Analyze multiple keywords and identify which domains rank across them.

```bash
cd <skill-dir>

# Analyze competitor landscape
uv run python cli.py bulk "liquidator" "voluntary administration" "doca" "winding up"

# Check form-related keywords
uv run python cli.py bulk "form 507" "rocap form" "asic forms" "form 505"
```

**Output:** Competitor ranking summary showing domains that rank for multiple keywords.

**Cost:** ~$0.003 per keyword

---

### 3. `features` - SERP feature opportunities

Deep analysis of SERP features including featured snippets, People Also Ask, related searches.

```bash
cd <skill-dir>

# Analyze SERP features
uv run python cli.py features "what is voluntary administration"

# Find PAA questions to target
uv run python cli.py features "voidable transaction australia"

# Check for featured snippet opportunity
uv run python cli.py features "relation back day meaning"
```

**Output:**
- Featured snippet holder (if any)
- People Also Ask questions
- Related searches
- Knowledge graph presence
- Optimization recommendations

**Cost:** ~$0.004 per 10 results

---

### 4. `gaps` - Content gap analysis

Find keywords where a target domain doesn't rank but competitors do.

```bash
cd <skill-dir>

# Find where example-site doesn't rank
uv run python cli.py gaps example-site.com "liquidator" "doca" "form 507" "rocap"

# Analyze competitor's gaps
uv run python cli.py gaps svpartners.com.au "voidable transaction" "unfair preference"
```

**Output:**
- Keywords where domain doesn't rank in top 20
- Current rankings for keywords where domain does rank
- Top competitor for each gap keyword

**Cost:** ~$0.003 per keyword

---

### 5. `balance` - Check account balance (FREE)

```bash
cd <skill-dir> && uv run python cli.py balance
```

### 6. `costs` - Show cost estimates (FREE)

```bash
cd <skill-dir> && uv run python cli.py costs
```

### 7. `locations` - List location shortcuts (FREE)

```bash
cd <skill-dir> && uv run python cli.py locations
```

---

## Options

| Option | Description |
|--------|-------------|
| `--location`, `-l` | Location shortcut (au, us, uk, ca, nz) or code |
| `--depth`, `-d` | Number of results (default: 10 or 20) |
| `--device` | desktop or mobile (default: desktop) |
| `--advanced`, `-a` | Include all SERP features |
| `--output`, `-o` | Save results to CSV file |
| `--json-output`, `-j` | Also save raw JSON response |
| `--dry-run` | Preview cost before executing |

---

## Location Shortcuts

| Shortcut | Code | Country |
|----------|------|---------|
| au | 2036 | Australia |
| us | 2840 | United States |
| uk | 2826 | United Kingdom |
| ca | 2124 | Canada |
| nz | 2554 | New Zealand |

---

## Cost Reference

| Command | Cost |
|---------|------|
| `serp` (regular) | $0.003 per 10 results |
| `serp -a` (advanced) | $0.004 per 10 results |
| `bulk` | $0.003 per keyword (10 results) |
| `features` | $0.004 per 10 results |
| `gaps` | $0.003 per keyword |
| `balance`, `costs`, `locations` | FREE |

**Example session costs:**
- Single keyword analysis: ~$0.003
- 10 keyword competitor scan: ~$0.03
- 50 keyword gap analysis: ~$0.15

---

## Auto-Save

All results are automatically saved to:
```
<skill-dir>/results/
```

Filenames: `{command}_{keyword}_{location}_{timestamp}.csv`

Examples:
- `serp_voidable-transaction-australia_au_2026-02-05_143022.csv`
- `bulk_liquidator_au_2026-02-05_144155.csv`
- `gaps_example-site.com_au_2026-02-05_145230.csv`

---

## Example: Australian Insolvency SERP Research

```bash
cd <skill-dir>

# 1. Check balance
uv run python cli.py balance

# 2. Scan competitor landscape for high-volume terms (~$0.03)
uv run python cli.py bulk "liquidator" "voluntary administration" "doca" "winding up" "insolvent trading"

# 3. Check specific keyword SERPs (~$0.01)
uv run python cli.py serp "rocap form" --location au -a
uv run python cli.py serp "form 507 asic" --location au -a

# 4. Find SERP feature opportunities (~$0.01)
uv run python cli.py features "what is a voidable transaction"
uv run python cli.py features "voluntary administration meaning"

# 5. Analyze content gaps (~$0.06)
uv run python cli.py gaps example-site.com \
  "liquidator" "doca" "voluntary administration" \
  "form 507" "rocap form" "unfair preference" \
  "insolvent trading" "winding up" "relation back day"

# Total: ~$0.11 for comprehensive SERP analysis
```

---

## Workflow: SERP Analysis for Content Strategy

### Step 1: Competitor Discovery
```bash
# Find who dominates your target keywords
uv run python cli.py bulk "liquidator" "voluntary administration" "doca" \
  "winding up" "insolvent trading" "rocap form" "form 507"
```

### Step 2: SERP Feature Opportunities
```bash
# Check for featured snippet opportunities on question keywords
uv run python cli.py features "what is voluntary administration"
uv run python cli.py features "what is a voidable transaction"
uv run python cli.py features "how to fill form 507"
```

### Step 3: Gap Analysis
```bash
# Find keywords where you don't rank
uv run python cli.py gaps yourdomain.com [list of target keywords]
```

### Step 4: Update Strategy Document
Use results to update SERP Analysis section in STRATEGY.md with actual Australian ranking data.

---

## Integration with keyword-data Skill

Use both skills together for complete SEO research:

```bash
# 1. Discover keywords (keyword-data skill)
cd <keyword-data-skill-dir>
uv run python cli.py suggestions "insolvency" --limit 100

# 2. Get volume data (keyword-data skill)
uv run python cli.py volume "liquidator" "doca" "voluntary administration"

# 3. Analyze SERPs for high-volume terms (serp-data skill)
cd <skill-dir>
uv run python cli.py bulk "liquidator" "doca" "voluntary administration"

# 4. Deep-dive on opportunities
uv run python cli.py features "liquidator"
uv run python cli.py gaps example-site.com "liquidator" "doca"
```

---

## Output Fields

### serp/bulk
| Field | Description |
|-------|-------------|
| rank | Position in SERP (1 = top) |
| domain | Ranking domain |
| title | Page title |
| url | Full URL |
| description | Meta description snippet |

### features
Returns structured data for:
- Featured snippets (domain, title, content)
- People Also Ask questions
- Related searches
- Knowledge graph
- Organic rankings

### gaps
| Field | Description |
|-------|-------------|
| keyword | Search term |
| domain_rank | Your rank (null if not ranking) |
| top_competitor | Domain ranking #1 |
| top_rank | Competitor's rank |