SEO: Ranking Keywords & Internal Links avatar

SEO: Ranking Keywords & Internal Links

Pricing

from $5.00 / 1,000 opportunities

Go to Apify Store
SEO: Ranking Keywords & Internal Links

SEO: Ranking Keywords & Internal Links

Find keywords Google shows but nobody clicks: striking distance, low CTR, cannibalization and content gaps from Search Console data. Get an internal link plan, content briefs and a did-it-work tracker.

Pricing

from $5.00 / 1,000 opportunities

Rating

0.0

(0)

Developer

APIzilla

APIzilla

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

14 hours ago

Last modified

Categories

Share

SEO Ranking: Ranking Keywords & Internal Links

Find the keywords Google already shows your site for, but nobody clicks. Get a ranked fix list, an internal link plan and content briefs. Run it every week and see what worked.

Your site was shown 6,200 times for "swe bench benchmark problems" and got 0 clicks, because it ranks at position 38. This Actor finds those keywords from your Google Search Console data, tells you what to do for each one, and tells you which of your pages should link to the page you want to push.

It is built as an API: send the data, get JSON, CSV and a readable report back. You can call it from Make, n8n, Zapier, a cron job or a daily Apify schedule. It does not use Google Keyword Planner (see the FAQ).

What you get

ResultWhat it is
Opportunities (dataset)One row per keyword group, with page, impressions, clicks, CTR, position, the extra clicks if it reached the top 3, a priority score from 0 to 100 and the action to take.
Striking distance / no-clickKeywords at position 8 to 50 with many impressions and almost no clicks. Action: optimize the page.
Low CTRKeywords on page 1 whose CTR is far below normal for that position. Action: rewrite the title and meta description.
CannibalizationSeveral of your pages compete for the same queries, with each page's share. Action: consolidate or differentiate.
Content gapsQueries where no page on your site is a good match. Action: create a new guide. The planned URL is included.
Internal link planFor each target page: which of your pages (ranked by their own traffic) should link to it, the exact anchor text and where to put it (an existing sentence to link, or a sentence to add). Links that already exist are skipped. Orphan pages (no internal links) are flagged and get links too. Table in the report, internal-links.csv and JSON.
Content briefsTarget and secondary keywords, title and meta description options, H2/H3 outline, questions to answer, word count target, internal links to add, schema suggestions.
Guide drafts (optional)With your own OpenAI, Anthropic or Gemini key the Actor also writes a full draft from each brief. We never use a key of ours.
Did it work?Run again later: the Actor compares with the last run and reports fixed, improved, regressed and new opportunities, pages you edited and links you added, with clicks per day before and now.
Reportreport.html and report.md in the key-value store: one readable page with everything above.

How to use it

1. Easy way: a Search Console CSV export (2 minutes)

  1. In Search Console open Performance, set 3 months, click Export and download the CSV or ZIP.
  2. Open the Actor, enter your Site URL, upload the file in Search Console CSV or ZIP files (or paste the text in Or paste the CSV), click Start.

A plain export of the Queries tab works, but the Search Console web export has no page per query. For the best result (exact pages and cannibalization) use a table with a Query and a Page column: the API (below), Looker Studio, or a Google Sheet with the Search Analytics add-on. With queries only, each query is matched to the closest page found in the crawl.

2. Automatic way: the Search Console API (for daily or weekly schedules)

Add googleServiceAccountJson (a Google Cloud service account key) and add the service account's email as a user of your property in Search Console (Settings > Users and permissions, "Restricted" is enough). Or use OAuth: googleClientId, googleClientSecret, googleRefreshToken. The Actor reads query + page data (28 days by default, up to 480) with the searchAnalytics.query endpoint, with paging, and picks the right property for your site (domain properties first). Secrets are stored encrypted and never saved in the results.

Then create an Apify schedule (for example every Monday). The same tracker name keeps one baseline and the report starts to show progress from the second run.

3. As an API

curl -X POST "https://api.apify.com/v2/acts/apizilla~seo-ranking/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"siteUrl":"https://example.com","gscCsvUrls":["https://example.com/gsc-export.csv"],"maxPages":100}'

Standby mode (answer in one request, no run to poll): POST https://apizilla--seo-ranking.apify.actor/analyze with the same JSON and an Authorization: Bearer <token> header. The response has summary, opportunities, progress, internalLinks, briefs and orphanPages.

How it decides (no black box)

  • Expected CTR by position is a generic curve (about 28% at position 1, 10% at 3, 1.8% at 10, under 1% after position 15). It is an assumption, not Google data. Branded queries and rich results change real CTR. Use Brand terms to ignore to skip your own brand.
  • Extra clicks = impressions x expected CTR at the target position (3 by default) minus current clicks. Realistic extra clicks multiply this by how likely the move is (closer to page 1 = more likely). The priority score is a log scale of the realistic extra clicks.
  • Query clusters: queries that differ by word order, plural or small words are grouped (stemming, no AI), so you get one row per topic.
  • Content gap = no crawled page matches the query well (weighted word overlap with title, H1, headings and text), and the query ranks past position 8 or on a weak page.
  • Internal links come from pages that already get traffic (from your own data), match the topic, and do not link to the target yet. Anchor text comes from the query and existing text on the page.
  • Crawl: sitemap first, then links. It respects robots.txt, reads HTML pages only, 3 at a time with a short delay, and identifies itself as SeoRankingBot. Pages with Search Console impressions are read first.
  • Google needs about 3 to 4 days to register a page change. Schedule runs at least 4 days apart.

Input (short)

FieldMeaning
siteUrlRequired. https://example.com, or sc-domain:example.com
gscCsvUrls / gscCsvTextCSV, ZIP or a public Google Sheet link, or pasted text
googleServiceAccountJson + gscPropertyAPI access (property optional)
brandTermsWords to skip (your brand)
opportunityTypesPick which of the four types to find
minImpressions, minPosition, maxPosition, targetPositionThresholds (100, 8, 50, 3)
crawlSite, maxPagesCrawl on/off and page limit (200)
maxBriefs, maxLinksPerTarget, maxLinkTargetsHow many briefs and links to produce
llmProvider, llmApiKey, llmModel, maxDraftsYour own AI key for guide drafts
trackChanges, trackerName, resetBaselineProgress tracking between runs

Pricing (pay per event)

You pay for what you get. A maximum cost per run is always respected: the Actor stops adding results when it is reached and trims the optional parts first (drafts, then briefs, then links). The crawl never takes more than 40% of your maximum.

EventPricePer 1,000
Actor start (once per run)$0.003
Opportunity$0.005$5.00
Page crawled$0.001$1.00
Internal link$0.001$1.00
Content brief$0.010$10.00
Guide draft (your own AI key)$0.030$30.00
Progress update$0.002$2.00

Example: 34 opportunities, 30 pages crawled, 4 links and 5 briefs cost about $0.26. A guide draft also costs you the AI tokens on your own key (a few cents for a small model).

What was tested, and how (honest status)

Live (real services):

  • Runs on the Apify platform with a pasted CSV and with an uploaded-file style signed link; named tracker storage kept between two runs (the second run reported fixed and improved keywords); the Standby API; dataset validation by the platform; pay-per-event charging and the maximum cost.
  • A real crawl of a small public site (30 pages of danluu.com, sitemap + robots.txt, polite).

Mocked or synthetic (not yet proven live):

  • The Search Console numbers in the live runs are synthetic (made up, on real pages). Nobody's real Search Console property was used.
  • The Search Console API path was not tested against Google. It is built from the public REST documentation and tested against a mock Google server that checks the request shape and the service account JWT signature. Please report any difference you see with a real property.
  • The AI draft calls (OpenAI, Anthropic, Gemini) were tested against fake servers, not with real keys. Model defaults are the cheap current ones and can be changed with llmModel.
  • "Did it work" page-edit and added-link detection was tested on a local test site. In the live runs the site was not edited, so only the position and click changes were seen.
  • Titles, outlines and anchors are a rule-based scaffold built from your own queries and pages, not a copy of what ranks. Check the live search results before you write.

FAQ

Why not Keyword Planner? It gives search volume estimates and needs a Google Ads account. This Actor uses your own Search Console data, which is real impressions and clicks for your site, free, and the only data that shows "shown but not clicked".

Do you change my site? No. It only reads public pages and your Search Console data. You publish the guides and add the links.

Which sites work? Any site with a sitemap or normal links. Pages built only with JavaScript are not read (the crawl uses plain HTML), so those pages may show as missing.

Is my data kept? Results and your tracker baseline stay in your own Apify storage. API keys are secret input fields.

Limits. Search Console shows anonymized queries only in part; rows below its privacy threshold are missing. Crawl up to 2,000 pages per run.