Find the sites that link to your competitors but not to the pages you are trying to lift
Monthly: your pages at positions 8 to 15, the competitors above them, and the referring domains that link to two or more of those competitors but not to you.
How the skill works: your agent reads see who outranks each page from DataForSEO; pages close to page one from Google Search Console; search console property, your domain, location and language, competitor domains (found from the serps when empty) from What you tell it, 1st of the month at 9:00, and gives you a question for you and a telegram ping and the report in the chat.
Reads
DaDataForSEOSee who outranks each page
Google Search ConsolePages close to page one
What you tell itSearch Console property, Your domain, Location and language, Competitor domains (found from the SERPs when empty)
reads
Your agentClaude Code, Codex, Cursor or Gemini1st of the month at 9:00
posts
You get
A question for youOn your board, answered with a tap
A Telegram pingOnly when it needs your answer, if you connect Telegram
The report in the chatEvery run, with or without Briefkin
What you get
Pages close to page one: how many sit at positions 8 to 15, with their main query.
Competitors that outrank them on two or more of those queries.
Link prospects: referring domains linking to two or more of those competitors and not to you, with rank and which competitors they link to.
The shortlist: the 5 to contact, each with the page to pitch.
The ask: whether to draft the outreach.
The card on the right is a sample. Yours shows your own numbers and updates in place every run.
What lands on your board
Your board1st of the month at 9:00
example.comLink prospects for pages close to page one: DataForSEO Backlinks and Search Console · Claude Code
23 sites link to the rivals above your near-page-one pages, not to you
Should I draft outreach emails for these 5?
8 of your pages sit at positions 8 to 15. 23 domains link to two or more of the competitors that outrank them, but not to you; these 5 are worth an email.
Referring domain
Rank
Links to
Pitch
smallbizdaily.com
612
rival.com, ledgerly.io, billflow.co
/invoice-software
freelancerhub.org
588
rival.com, ledgerly.io
/templates/pdf
accountingtoday-blog.com
540
ledgerly.io, billflow.co
/features/recurring
startupstack.io
497
rival.com, billflow.co
/invoice-software
solopreneurguide.net
455
rival.com, ledgerly.io
/blog/payment-terms
smallbizdaily.com links to all three rivals. Pitch /invoice-software, which sits at 11.2 for "invoice software".
An example with made-up numbers. Your agent posts your real ones.
What it does
A page at position 11 often needs links more than words, and a generic backlink gap report is too wide to act on: thousands of domains that link to a competitor for reasons unrelated to the page you want to move. The useful list is much shorter: sites that link to the competitors that beat you on those exact queries.
Once a month the agent finds your pages at positions 8 to 15 in Search Console, checks who outranks them on their main query with the DataForSEO SERP API, and then asks the Backlinks API which domains link to two or more of those competitors but not to you. SEO leads get a ranked shortlist of sites worth an email, each tied to the page to pitch.
How it works
1Find pages close to page one
Call searchanalytics.query for the last 28 full days with dimensions: ["page"] and keep pages with an average position from 8.0 to 15.0 and at least 200 impressions, up to 8 pages. For each, run dimensions: ["page", "query"] filtered to that page and take its query with the most impressions.
Da
2See who outranks each page
Send one POST /v3/serp/google/organic/task_post with one task per query (8 tasks, depth: 10, your location_code and language_code) and read the results with task_get/advanced/<id>. Keep organic domain values ranked above you, lowercase with www. stripped.
3
3Pick the competitors that matter
Keep domains that outrank you on 2 or more of the 8 queries, drop your own domain and sites nobody can win links from (wikipedia.org, youtube.com, reddit.com, amazon.com), and take the top 3 by number of queries. If you set competitor domains, keep only those that appear here, so the list stays tied to these pages.
Da
4Run the link intersection per pair
The Backlinks API returns domains that link to every target, so call POST /v3/backlinks/domain_intersection/live once per pair of competitors (3 calls for 3) with targets: {"1": "rival.com", "2": "ledgerly.io"}, exclude_targets: ["example.com"], backlinks_status_type: "live", order_by: ["1.rank,desc"] and limit: 100.
5
5Merge, rank and ask
Merge the pairs on the referring domain (lowercase, no www.), count how many competitors each links to, drop entries with a high backlinks_spam_score, and rank by rank. Tie each prospect to the page whose query those competitors outrank you on, and post the top 5 as an ask.
Post it to the board
With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.
Install and run it
Pick your agent, where the data comes from and how to schedule it; the commands below follow.
Agent
Data
Schedule
Install the skill
One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.
shellcurl -fsSL https://briefkin.dev/skills/dataforseo-backlink-gap-for-striking-pages/install | sh
Run it
Ask Claude Code:
promptRun the dataforseo-backlink-gap-for-striking-pages skill
Or paste the prompt instead of installing:
promptFrom my Google Search Console property, find up to 8 pages with an average position from 8 to 15 and at least 200 impressions in the last 28 full days, and each page's top query. Fetch the Google top 10 for those queries with DataForSEO's SERP API (Standard queue, United States, English, depth 10). Take the 3 domains that outrank me on the most of those queries (not Wikipedia, YouTube, Reddit or Amazon). For each pair of them, call DataForSEO /v3/backlinks/domain_intersection/live with the pair as targets, my domain in exclude_targets, live backlinks, ordered by rank, limit 100. Merge on the referring domain, keep domains that link to 2 or more competitors, drop spammy ones, and rank by rank. Tie each to the page to pitch. Show me the counts and the top 5, and ask whether to draft outreach.
Put it on a schedule
1st of the month at 9:00, from cron on any machine where Claude Code is signed in:
crontab0 9 1 * * claude -p "Run the dataforseo-backlink-gap-for-striking-pages skill"
Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.
Send it to your board
Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a question for you. How setup works
SKILL.md---
name: dataforseo-backlink-gap-for-striking-pages
description: "Monthly: your pages at positions 8 to 15, the competitors above them, and the referring domains that link to two or more of those competitors but not to you. Use when the user asks for this, or when it runs on a schedule."
---
# Link prospects for pages close to page one: DataForSEO Backlinks and Search Console
Monthly: your pages at positions 8 to 15, the competitors above them, and the referring domains that link to two or more of those competitors but not to you.
A page at position 11 often needs links more than words, and a generic backlink gap report is too wide to act on: thousands of domains that link to a competitor for reasons unrelated to the page you want to move. The useful list is much shorter: sites that link to the competitors that beat you on those exact queries.
Once a month the agent finds your pages at positions 8 to 15 in Search Console, checks who outranks them on their main query with the DataForSEO SERP API, and then asks the Backlinks API which domains link to two or more of those competitors but not to you. SEO leads get a ranked shortlist of sites worth an email, each tied to the page to pitch.
## Two ways to get the data
Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.
## Route A: API or MCP server
### What you need
- Read access to the Search Console property, and your own domain so it can be excluded.
- DataForSEO API login and password, or the DataForSEO MCP server, with Backlinks API access (DataForSEO asks for a $100 monthly commitment that stays on your balance). A run is 8 Standard-queue SERPs and 3 Backlinks requests, well under a dollar; test on `https://sandbox.dataforseo.com/v3/` first.
If something is missing, say what and stop; do not invent numbers.
### Steps
1. **Find pages close to page one** (Google Search Console): Call `searchanalytics.query` for the last 28 full days with `dimensions: ["page"]` and keep pages with an average position from 8.0 to 15.0 and at least 200 impressions, up to 8 pages. For each, run `dimensions: ["page", "query"]` filtered to that page and take its query with the most impressions.
2. **See who outranks each page** (DataForSEO): Send one `POST /v3/serp/google/organic/task_post` with one task per query (8 tasks, `depth: 10`, your `location_code` and `language_code`) and read the results with `task_get/advanced/<id>`. Keep organic `domain` values ranked above you, lowercase with `www.` stripped.
3. **Pick the competitors that matter**: Keep domains that outrank you on 2 or more of the 8 queries, drop your own domain and sites nobody can win links from (wikipedia.org, youtube.com, reddit.com, amazon.com), and take the top 3 by number of queries. If you set competitor domains, keep only those that appear here, so the list stays tied to these pages.
4. **Run the link intersection per pair** (DataForSEO): The Backlinks API returns domains that link to every target, so call `POST /v3/backlinks/domain_intersection/live` once per pair of competitors (3 calls for 3) with `targets: {"1": "rival.com", "2": "ledgerly.io"}`, `exclude_targets: ["example.com"]`, `backlinks_status_type: "live"`, `order_by: ["1.rank,desc"]` and `limit: 100`.
5. **Merge, rank and ask**: Merge the pairs on the referring domain (lowercase, no `www.`), count how many competitors each links to, drop entries with a high `backlinks_spam_score`, and rank by `rank`. Tie each prospect to the page whose query those competitors outrank you on, and post the top 5 as an ask.
## Route B: the browser
### What you need
- Signed in to Google with access to the Search Console property, and to the DataForSEO dashboard with Backlinks API access and a funded balance.
If something is missing, say what and stop; do not invent numbers.
### Steps
Start at https://search.google.com/search-console/performance/search-analytics. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.
1. **Find pages at positions 8 to 15**: Pick the property, set Date to `Last 28 days`, turn on Average position and open the Pages tab. Filter the table to position greater than `7.9` and less than `15.1` and impressions over `199`, take up to 8 pages, and click each to read its top query on the Queries tab.
2. **See who outranks each page**: Open `https://app.dataforseo.com/`, API Playground, SERP API > Google > Organic > Live Advanced, with your location, language and depth `10`. Run each query once and note the domains above you. Keep the 3 that beat you on the most queries, leaving out wikipedia.org, youtube.com, reddit.com and amazon.com.
3. **Run the link intersection per pair**: In the Playground choose Backlinks > Domain Intersection. For each pair of the 3 competitors, enter the pair as targets, your domain under exclude targets, order by rank, limit `100`, and click Request.
4. **Merge and shortlist**: Combine the three results, keep referring domains that appear for 2 or more competitors, skip obvious spam, and sort by rank. Report the top 5 with the competitors each links to and the page of yours to pitch.
Note: Playground requests cost the same as the API and the SERPs run at Live prices. The Backlinks part needs DataForSEO's Backlinks access, which is a separate monthly commitment; without it, the request returns an access error rather than data.
## The report
- **Pages close to page one**: how many sit at positions 8 to 15, with their main query.
- **Competitors** that outrank them on two or more of those queries.
- **Link prospects**: referring domains linking to two or more of those competitors and not to you, with rank and which competitors they link to.
- **The shortlist**: the 5 to contact, each with the page to pitch.
- The ask: whether to draft the outreach.
## Post it to Briefkin
When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.
```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
-H "authorization: Bearer $BRIEFKIN_TOKEN" \
-H "content-type: application/json" \
-d @- <<'JSON'
{
"v": 1,
"event_id": "dataforseo-backlink-gap-for-striking-pages/<date of this run, e.g. 2026-10-16>",
"item_key": "dataforseo-backlink-gap-for-striking-pages",
"project": "example.com",
"source": "Link prospects for pages close to page one: DataForSEO Backlinks and Search Console skill",
"kind": "action",
"title": "23 sites link to the rivals above your near-page-one pages, not to you",
"summary": "**8 of your pages** sit at positions 8 to 15. **23 domains** link to two or more of the competitors that outrank them, but not to you; these **5** are worth an email.",
"action": {
"request": "Should I draft outreach emails for these 5?",
"options": [
"Draft all 5",
"Draft the top 2",
"Show all 23",
"Skip this month"
]
},
"widget": [
{
"type": "Table",
"props": {
"columns": [
"Referring domain",
"Rank",
"Links to",
"Pitch"
],
"align": [
"left",
"right",
"left",
"left"
],
"rows": [
[
"smallbizdaily.com",
612,
"rival.com, ledgerly.io, billflow.co",
"/invoice-software"
],
[
"freelancerhub.org",
588,
"rival.com, ledgerly.io",
"/templates/pdf"
],
[
"accountingtoday-blog.com",
540,
"ledgerly.io, billflow.co",
"/features/recurring"
],
[
"startupstack.io",
497,
"rival.com, billflow.co",
"/invoice-software"
],
[
"solopreneurguide.net",
455,
"rival.com, ledgerly.io",
"/blog/payment-terms"
]
]
}
},
{
"type": "Callout",
"props": {
"text": "smallbizdaily.com links to all three rivals. Pitch /invoice-software, which sits at 11.2 for \"invoice software\".",
"tone": "info"
}
}
]
}
JSON
```
Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.
## Run it on a schedule
Suggested: 1st of the month at 9:00 (`0 9 1 * *`). From cron, with the agent signed in on that machine:
```bash
0 9 1 * * claude -p "Run the dataforseo-backlink-gap-for-striking-pages skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```
Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/dataforseo-backlink-gap-for-striking-pages#schedule
Source: https://briefkin.dev/skills/dataforseo-backlink-gap-for-striking-pages
What your agent needs
Read access to the Search Console property, and your own domain so it can be excluded.
DataForSEO API login and password, or the DataForSEO MCP server, with Backlinks API access (DataForSEO asks for a $100 monthly commitment that stays on your balance). A run is 8 Standard-queue SERPs and 3 Backlinks requests, well under a dollar; test on https://sandbox.dataforseo.com/v3/ first.
DaConnecting DataForSEO
DataForSEO MCP server, DataForSEO's own. Run it locally with npx dataforseo-mcp-server and set DATAFORSEO_USERNAME and DATAFORSEO_PASSWORD to your API login and API password (Dashboard > API Access); add http to the command for clients that want a local HTTP server. A hosted server runs at https://mcp.dataforseo.com/mcp for clients that can send a Basic authorization header. You can turn off the modules a skill doesn't use to keep the tool list short (setup guide).
REST API with Basic auth. Store the same pair in DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD and call the endpoints with curl -u "$DATAFORSEO_LOGIN:$DATAFORSEO_PASSWORD". The free sandbox at https://sandbox.dataforseo.com/v3/ returns sample data at no cost, which is the place to test a skill before it spends money.
The API password can spend your balance but cannot sign in to the dashboard or change billing. Set a low balance alert in the dashboard, and give each skill a fixed keyword list and depth so a run costs the same every time.
Connecting Google Search Console
MCP server. Google doesn't publish one for Search Console. Community MCP servers exist; check which scopes one asks for before you sign in.
API with a service account. Enable the Google Search Console API in a Google Cloud project, create a service account, and add its email under Settings > Users and permissions on the property. Point GOOGLE_APPLICATION_CREDENTIALS at the key and set GSC_SITE_URL to sc-domain:example.com or https://www.example.com/.
OAuth as yourself. When you can't add users to the property, a desktop OAuth client with the webmasters.readonly scope and a stored refresh token works for scheduled runs.
Ask for webmasters.readonly and add the service account as a Restricted user; the reports only read.
Questions
Why pairs of competitors instead of one call with all three?
The Backlinks API's domain intersection returns referring domains that link to every target you pass. With three competitors in one call, you would only see sites that link to all three. Three pair calls catch every site linking to at least two, and the merge step counts how many each one links to.
How does it decide which of my pages to pitch?
Through the queries. Each competitor came from the SERP of a specific page's main query, so a referring domain that links to the competitors on that query maps back to that page. When a domain links to competitors from several SERPs, the page with the most impressions wins. The link itself is domain level, so read the competitor page it points to before writing the email.
Do I need Briefkin to use the Link prospects for pages close to page one: DataForSEO Backlinks and Search Console skill?
No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a asks you, so you can glance at it instead of asking again.
Which agents can run it?
Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.
Can it work without an API or MCP server, from my browser?
Yes. Switch the data source to "Your browser" and the steps change to the DataForSEO and Google Search Console pages themselves: the agent opens search.google.com/search-console/performance/search-analytics in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.
More skills with DataForSEO and Google Search Console
Answer your agents from one board, or from Telegram
Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.