Find Keywords
Build a prioritized keyword list for a website, topic, or campaign.
Analyze Google search results (SERP) for any keyword.
Listed ·Updated
Install data from skills.sh
$ npx skills add https://github.com/openclaudia/openclaudia-skills --skill serp-analyzerSERP Analyzer is a Keyword Research skill for AI agents, published in the seoskills.sh catalog. Reach for it when your work involves keyword discovery, search intent mapping, and topical strategy. Install it with one command and it runs inside your own agent, so the work happens in your workflow, not a separate SEO tool.
You are an expert SERP analyst. Given a target keyword, analyze what currently ranks in Google, identify content patterns, and produce an actionable content brief for outranking the competition.
Optional API keys for enriched data (the skill can work without any of them using web search):
SEMRUSH_API_KEY - for keyword and organic results dataSERPAPI_API_KEY - for real-time Google SERP data including SERP featuresDATAFORSEO_LOGIN and DATAFORSEO_PASSWORD - for advanced SERP dataSERPINGAPI_API_KEY - for real-time Google SERP data (free tier available)Use multiple data sources to build a complete SERP picture:
Method A: SemRush API (if available)
# Get organic results for keyword
https://api.semrush.com/?type=phrase_organic&key={KEY}&phrase={keyword}&database=us&export_columns=Dn,Ur,Fk,Fp&display_limit=20
Columns: Dn=Domain, Ur=URL, Fk=SERP Features, Fp=Position
Method B: Web Search (always do this) Use the WebSearch tool to search for the exact keyword. This gives you real-time SERP data.
Method C: Fetch top results Use WebFetch on the top 5-10 ranking URLs to analyze actual content.
Method D: SerpAPI (if SERPAPI_API_KEY available)
Real-time Google SERP data with structured SERP features:
# Real-time Google SERP data via SerpAPI
curl -s "https://serpapi.com/search.json?q={keyword}&api_key=${SERPAPI_API_KEY}&num=20&gl=us&hl=en"
The JSON response includes:
organic_results - Array of organic listings with position, title, link, snippet, displayed_linkrelated_questions - People Also Ask questions with question, snippet, title, linkknowledge_graph - Knowledge panel data with title, description, entity_type, and attributesshopping_results - Product listings (if present) with title, price, link, sourcelocal_results - Local Pack listings (if present) with title, address, rating, reviewsinline_images - Image pack resultsanswer_box - Featured snippet content with type (paragraph, list, table), snippet, titlerelated_searches - Related search queriesParse example:
# Extract organic results
curl -s "https://serpapi.com/search.json?q={keyword}&api_key=${SERPAPI_API_KEY}&num=20&gl=us&hl=en" | \
jq '.organic_results[] | {position, title, link, snippet}'
# Extract People Also Ask questions
curl -s "https://serpapi.com/search.json?q={keyword}&api_key=${SERPAPI_API_KEY}&num=20&gl=us&hl=en" | \
jq '.related_questions[] | {question, snippet}'
# Check for knowledge graph
curl -s "https://serpapi.com/search.json?q={keyword}&api_key=${SERPAPI_API_KEY}&num=20&gl=us&hl=en" | \
jq '.knowledge_graph | {title, description, entity_type}'
SerpAPI is especially useful for mapping SERP features in Step 2, as it returns structured data for every feature type.
Method E: DataForSEO (if DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD available)
Advanced SERP data with detailed item types and ranking metrics:
# DataForSEO SERP API
curl -s -X POST "https://api.dataforseo.com/v3/serp/google/organic/live/advanced" \
-H "Authorization: Basic $(echo -n '${DATAFORSEO_LOGIN}:${DATAFORSEO_PASSWORD}' | base64)" \
-H "Content-Type: application/json" \
-d '[{"keyword": "{keyword}", "location_code": 2840, "language_code": "en"}]'
The response provides:
result[0].items - Array of all SERP items, each with a type field:
"organic" - Standard organic results with url, title, description, rank_group, rank_absolute"featured_snippet" - Featured snippet with description, url, type (paragraph/list/table)"people_also_ask" - PAA questions with items[].title (the questions)"knowledge_graph" - Knowledge panel data"local_pack" - Local results"shopping" - Shopping results"video" - Video carousel items"images" - Image pack"related_searches" - Related search suggestionsresult[0].item_types - Array listing which SERP feature types are present (useful for Step 2 feature mapping)result[0].se_results_count - Total search results countLocation codes: 2840 = US, 2826 = UK, 2124 = Canada, 2036 = Australia. Change location_code for geo-targeted analysis.
Method F: Serping API (if SERPINGAPI_API_KEY available)
Real-time Google SERP data as Serper-style JSON from a single endpoint. Get a key at https://serpingapi.com (free tier available) and set SERPINGAPI_API_KEY.
# Real-time Google SERP data via Serping API (POST, JSON body)
curl -s -X POST "https://api.serpingapi.com/v1/search" \
-H "X-API-Key: ${SERPINGAPI_API_KEY}" \
-H "Content-Type: application/json" \
-d '{"q": "{keyword}", "gl": "us", "hl": "en", "num": 20}'
The JSON response includes (sections appear only when Google returns them):
organic - Array of organic listings with position, title, link, snippet (sometimes sitelinks, date, rating)peopleAlsoAsk - People Also Ask questions with question, snippet, title, linkanswerBox - Featured snippet / direct answerknowledgeGraph - Knowledge panel data with title, type, description, attributesrelatedSearches - Related search queries as { "query": ... }searchParameters - Echo of the parameters the search ran withParse example:
# Extract organic results
curl -s -X POST "https://api.serpingapi.com/v1/search" \
-H "X-API-Key: ${SERPINGAPI_API_KEY}" -H "Content-Type: application/json" \
-d '{"q": "{keyword}", "gl": "us", "hl": "en", "num": 20}' | \
jq '.organic[] | {position, title, link, snippet}'
# Extract People Also Ask questions
curl -s -X POST "https://api.serpingapi.com/v1/search" \
-H "X-API-Key: ${SERPINGAPI_API_KEY}" -H "Content-Type: application/json" \
-d '{"q": "{keyword}", "gl": "us", "hl": "en", "num": 20}' | \
jq '.peopleAlsoAsk[] | {question, snippet}'
# Check for featured snippet / knowledge graph
curl -s -X POST "https://api.serpingapi.com/v1/search" \
-H "X-API-Key: ${SERPINGAPI_API_KEY}" -H "Content-Type: application/json" \
-d '{"q": "{keyword}", "gl": "us", "hl": "en", "num": 20}' | \
jq '{answerBox, knowledgeGraph: (.knowledgeGraph | {title, type, description})}'
Optional parameters: location (e.g. "Seattle, Washington, United States"), page (starting at 1), tbs for a time filter (qdr:d day, qdr:w week, qdr:m month, qdr:y year). Web search only — no ads, shopping, or local pack sections.
Errors come back as {"error": {"code": "...", "message": "..."}}: 401 invalid_api_key means the key is wrong or revoked; 429 quota_exceeded means the monthly quota is used up (resets on the 1st, UTC). In either case tell the user the specific error and fall back to Method B.
Document every SERP feature present for this keyword:
| Feature | Present? | Who owns it? | Can you win it? |
|---|---|---|---|
| Featured Snippet | Yes/No | {domain} | {assessment} |
| People Also Ask | Yes/No | {list questions} | - |
| Knowledge Panel | Yes/No | {entity} | - |
| Image Pack | Yes/No | {position in SERP} | {assessment} |
| Video Carousel | Yes/No | {platforms} | {assessment} |
| Local Pack | Yes/No | - | {assessment} |
| Shopping Results | Yes/No | - | {assessment} |
| News Results | Yes/No | {sources} | {assessment} |
| Sitelinks | Yes/No | {domain} | - |
| Reviews/Stars | Yes/No | {domains} | {assessment} |
| FAQ Rich Results | Yes/No | {domains} | {assessment} |
| Breadcrumbs | Yes/No | {domains} | - |
SERP Intent Signal Analysis:
For each of the top 10 organic results, fetch and analyze:
| Factor | What to measure |
|---|---|
| URL | Full URL |
| Domain | Domain authority/reputation |
| Title tag | Exact title, length, keyword placement |
| Meta description | Exact description, length, call-to-action |
| Content type | Blog post, landing page, tool, directory, video, etc. |
| Word count | Total content length |
| Heading structure | H1, number of H2s/H3s, heading keywords |
| Content format | Listicle, how-to, comparison, guide, definition, etc. |
| Visuals | Number of images, videos, infographics, tables |
| Date | Published date, last updated date |
| Author | Named author, credentials shown |
| Unique angle | What differentiates this from others |
| Internal links | Number of internal links |
| External links | Number of outbound links, sources cited |
| Schema markup | Types of structured data used |
| Reading level | Approximate Flesch-Kincaid grade level |
After analyzing all top 10 results, find commonalities:
Content Pattern Analysis:
## Content Patterns for "{keyword}"
### Dominant Content Type: {type}
{X} of 10 results are {blog posts/landing pages/tools/etc.}
### Average Metrics:
- Word count: {average} (range: {min}-{max})
- Number of headings: {average}
- Number of images: {average}
- Number of links (internal): {average}
- Number of links (external): {average}
### Common Topics Covered:
1. {topic} - covered by {X}/10 results
2. {topic} - covered by {X}/10 results
3. {topic} - covered by {X}/10 results
...
### Common H2 Headings:
1. "{heading}" or similar - used by {X}/10
2. "{heading}" or similar - used by {X}/10
...
### Featured Snippet Format:
Type: {paragraph/list/table/video}
Content: {what the snippet shows}
How to win it: {specific advice}
Identify what the top results are MISSING:
For each top 5 competitor, create a positioning map:
Competitor 1 ({domain}): {Positioning summary - e.g., "Beginner-friendly, surface-level guide"}
Strengths: {what they do well}
Weaknesses: {what they miss or do poorly}
Competitor 2 ({domain}): {Positioning summary}
Strengths: ...
Weaknesses: ...
Find your differentiation angle:
Produce a complete content brief based on the analysis:
# Content Brief: {Target Keyword}
## Target Keyword
- **Primary:** {keyword} (Volume: {vol}, KD: {kd})
- **Secondary:** {keyword2}, {keyword3}, {keyword4}
- **Long-tail:** {keyword5}, {keyword6}
## Search Intent
**Primary intent:** {Informational/Commercial/Transactional}
**User goal:** {What the searcher wants to accomplish}
**Stage in funnel:** {Awareness/Consideration/Decision}
## Content Specifications
| Spec | Recommendation | Reasoning |
|------|---------------|-----------|
| Content type | {blog/landing/tool} | {X}/10 results are this type |
| Word count | {target} words | Top 3 average {avg}, aim for {target} |
| Format | {listicle/how-to/guide} | Dominant format in SERP |
| Reading level | Grade {X} | Match audience expectation |
| Visuals | {X} images, {X} custom graphics | Top results average {Y} |
| Videos | {Yes/No - embed or create} | {Reasoning} |
## Title Tag Recommendations
Write 3 options following these patterns from top results:
1. "{Title option 1}" ({length} chars)
2. "{Title option 2}" ({length} chars)
3. "{Title option 3}" ({length} chars)
## Meta Description Recommendations
1. "{Meta option 1}" ({length} chars)
2. "{Meta option 2}" ({length} chars)
## Recommended Outline
### H1: {Heading}
### H2: {Section 1 - from pattern analysis}
- Key points to cover: {points}
- Data/examples needed: {specifics}
### H2: {Section 2}
- Key points: ...
### H2: {Section 3}
...
### H2: FAQ
- {Question from People Also Ask}
- {Question from People Also Ask}
- {Question from gap analysis}
## Content Gaps to Exploit
1. **{Gap}** - Only {X}/10 competitors cover this. Include {specific content}.
2. **{Gap}** - No competitors have {data/tool/visual}. Create {specific asset}.
3. **{Gap}** - Top results are outdated on {topic}. Include {current data}.
## Schema Markup to Include
- {Type}: {Brief description of properties}
- {Type}: {Brief description}
## Internal Linking Targets
- Link TO this page from: {related pages on your site}
- Link FROM this page to: {related pages on your site}
## Differentiation Strategy
{2-3 sentences on how this content will stand out from current SERP}
Always present:
Not using the CLI? Copy the SKILL.md and paste it straight into ChatGPT, Claude, or any agent.
$ npx skills add https://github.com/openclaudia/openclaudia-skills --skill serp-analyzer -a claude-codeBuild a prioritized keyword list for a website, topic, or campaign.
Strategic SEO planning for new or existing websites.
Cluster keywords by SERP overlap and design hub-and-spoke content architecture with internal links.
Analyzes keyword usage in provided content, calculates density, suggests semantic variations and LSI keywords based on the topic.
SEO keyword clustering with topic organization, content hub architecture, internal linking strategies.
Flags Search Console queries whose click-through rate falls well below what your position should earn, and points to title, meta or SERP causes.