Your job is to identify gaps in SEO/AEO for [YOUR BRAND]. I.e. what prompts/queries should be mentioning/returning [YOUR BRAND] but are not?
If the user has not already provided a topic and article type, brainstorm together with them. You may find it helpful to reference:
Page types include:
| Page type | Primary intent | What to look for in Step 2 |
|---|---|---|
[Competitor] alternatives roundup | Switching / evaluation | Complaints about the competitor (pricing, complexity, gaps) |
Best [category] tools listicle | Evaluation | Recommendations, "what do you use for X" threads, praise & complaints per tool |
[A] vs [B] comparison | Decision | Head-to-head experiences, migration stories |
Pricing guide ([Product] pricing) | Research | Real invoice/contract anecdotes, "is it worth it" threads |
| How-to / guide | Informational | Questions people actually ask, failed-approach stories |
| Glossary / definition | Informational | How practitioners actually use the term |
The AHREFS_API_KEY is already set for this step.
[topic], best [topic],
[topic] tools/software, [topic] free, [competitor] alternatives,
[A] vs [B], [topic] pricing, [topic] api, plus question forms of the
keywordGET /keywords-explorer/overview (or /site-explorer/organic-keywords for
pages that already rank). Both endpoints require a select parameter
(comma-separated list of fields to return). For keywords-explorer/overview,
use
"keywords,volume,global_volume,difficulty,cpc,traffic_potential,intents".
Note: CPC is returned in USD cents (e.g., 400 = $4.00) — divide by 100 for
display. The parameter is keywords (plural, comma-separated), not keyword
(singular). The response is wrapped in { "keywords": [...] }. You can batch
multiple keywords in one call, but keywords with no data are omitted from the
response (not returned with zeroes).match_mode=terms and
order_by=volume:desc to get the highest-volume questions first.site-explorer/organic-keywords with mode=exact|prefix,
select="keyword,best_position,volume,keyword_difficulty,sum_traffic,cpc,is_informational,is_commercial,is_transactional")
YYYY-MM-DD-[topic].md with contents: Keyword | Volume | KD | CPC | Intent
table, SERP notes, the decision and what was rejected, quote shortlist,
verified pricing, API cost footer, and anything learnedThe OCTOLENS_API_KEY is already set for this step.
POST /api/v2/mentions to search the full archive of Val
Town mentions. It covers Reddit/HN/X/Bluesky/LinkedIn going back as far as
collection does. Uses Bearer auth, Body:
{"filters": {"startDate": "...", "endDate": "..."}, "limit": 100, "cursor": "..."},
ISO 8601 dates, cursor-paginate. Note: The base URL is
https://app.octolens.com (not api.octolens.com, which returns 404). If
the API continues to fail, fall back to web_search for Reddit/HN coverage.search field on
POST /api/v2/mentions (free-text across title, body, author handle, and
author name). The search field only covers mentions already tracked by
Octolens, so for comprehensive coverage of competitor/category conversations,
use web_search as the primary tool. Search Reddit, HN, and blogs for tool
comparisons, pricing complaints, and "what do you use for X" threads.Exclude quotes from the [YOUR BRAND] team.
If you created any scripts/files in steps 2 and 3, you can delete them once the report is ready.
Once the user has agreed to your list of keywords, create an evals suite in
./evals. The file name should be formatted as
YYYY-MM-DD-[topic].ts.
If you learned anything during this process, like gotchas with the Octolens API, propose changes to this document.