How to Check Backlinks in Google Search Console
Google Search Console is the only backlink data source that reflects what Google itself has actually indexed and considered for your site — everything else is a third-party crawler's best approximation. This guide walks through the exact clicks to find your backlinks in GSC, what the report shows versus what it omits, how it compares to Ahrefs and Majestic, and how to use the disavow tool correctly (most sites should not). If you want a broader walkthrough of every GSC report, see the Google Search Console tutorial.
Step-by-Step: Find Your Backlinks in GSC
The Links report has been part of GSC since the legacy Search Console days, but its location has shifted. As of 2026, the path is:
1. Sign in to Google Search Console at search.google.com/search-console with the Google account that owns or has access to your property.
2. Select your property from the dropdown in the top-left. If you have both a Domain property and a URL-prefix property, pick the Domain property — it includes backlinks across all subdomains and HTTP/HTTPS variants. URL-prefix properties only show backlinks pointing to that exact prefix.
3. Click "Links" at the very bottom of the left sidebar (below Settings). It is easy to miss because it sits below the "Indexing" and "Experience" groups rather than inside them.
4. The Links overview opens in a two-column layout. The left column is "External links" (your backlinks). The right column is "Internal links" (your own pages linking to each other — covered in a later section).
5. The External links column shows three reports:
• Top linked pages — which of your URLs get the most external links. Click "More" under this card to see the full list of your pages sorted by external link count, then click any URL to see the linking sites and anchor text for that specific page.
• Top linking sites — which domains link to you the most. This is the report most SEOs spend time in. Click any domain to see which of your pages they link to and the count per page.
• Top linking text — the most common anchor text used in links to your site. Useful for spotting unnatural anchor patterns (a sudden spike in commercial keyword anchors is a classic spam-link signal).
6. Drilling deeper: click "More" on any of the three cards to open the full sortable list (capped at 1,000 rows in the UI but more in exports). From there, click any single row to see its detail view with the linking page URLs.
What GSC Shows You vs What It Misses
GSC's Links report is authoritative for one thing: what Google has crawled and counted. It is not a complete map of every link on the web pointing at you.
What GSC includes: followed and nofollowed links Google has crawled, links from indexed and non-indexed pages, links from low-authority and high-authority sites alike. It does not visibly distinguish nofollow from followed in the UI — you have to fetch each linking page to inspect the rel attribute yourself.
What GSC misses or under-reports:
• Recent links. Backlinks typically appear in GSC 1–4 weeks after Google crawls the linking page. A link earned today will not show up immediately.
• Links from pages Google considers low quality. Google appears to filter out a large fraction of obvious spam from the Links report — not because the report is hiding them, but because Google chose not to index those linking pages in the first place.
• Links behind login walls or in JavaScript-only DOM. If Googlebot cannot access or render the link, it does not appear.
• The full URL list above the cap. The Top linking sites card maxes at 1,000 domains in export. If you have more than 1,000 referring domains, you cannot get a complete list from GSC alone.
What GSC does not give you at all: Domain Rating / Domain Authority, traffic estimates per linking page, link first-seen and last-seen dates, link velocity charts, and historical link-loss reports. For these you need a third-party tool.
GSC vs Ahrefs vs Majestic: Overlap and Gaps
Comparing the same site across all three tools is the only way to understand each one's blind spots. In typical mid-sized site audits the overlap is roughly:
• GSC vs Ahrefs: 50–70% domain overlap. Ahrefs almost always reports more total referring domains because it includes links Google has discounted. GSC sometimes shows links Ahrefs missed, particularly from regional sites or pages Ahrefs has not crawled recently.
• GSC vs Majestic: 40–60% domain overlap. Majestic's Trust Flow / Citation Flow methodology surfaces a different cross-section — it tends to find more links from older, established sites and fewer from new domains.
• Ahrefs vs Majestic: 60–75% domain overlap with each other, but the absolute counts diverge significantly because of differing crawler coverage.
The practical takeaway: GSC tells you what Google has acted on, while Ahrefs and Majestic tell you what exists. For ranking decisions, weight GSC. For competitive link gap analysis, you need Ahrefs (or a comparable tool) because GSC will not show you competitor backlinks at all.
Here is a Python comparison script for matching GSC and Ahrefs exports by referring domain:
# Compare GSC and Ahrefs referring domains
import csv
from urllib.parse import urlparse
def domains_from_csv(path, url_column):
domains = set()
with open(path, encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
url = row[url_column].strip()
if not url:
continue
host = urlparse(url if '://' in url else f'http://{url}').netloc
domains.add(host.lower().lstrip('www.'))
return domains
gsc = domains_from_csv('gsc-top-linking-sites.csv', 'Site')
ahrefs = domains_from_csv('ahrefs-referring-domains.csv', 'Domain')
only_gsc = gsc - ahrefs
only_ahrefs = ahrefs - gsc
both = gsc & ahrefs
print(f"In both: {len(both)}")
print(f"GSC only: {len(only_gsc)}")
print(f"Ahrefs only: {len(only_ahrefs)}")
print(f"Overlap ratio: {len(both) / len(gsc | ahrefs):.1%}")Exporting Backlinks: CSV Download and the GSC API
The UI is fine for spot-checks but useless for analysis at scale. Two export paths matter.
CSV download via the UI: from any Links report card, click "More" to open the full list, then the "Export" button at the top right. You get three options: Google Sheets, Excel, and CSV. The export caps at 1,000 rows for each individual report. To export the full backlink-page detail, you have to drill into a single linking site or single linked page and export from inside that detail view, which is also capped at 1,000.
For a typical CSV from "Top linking sites" you get two columns: Site and Number of backlinks. Parse it like this:
# Parse GSC top-linking-sites export, sort by link count
import csv
rows = []
with open('top-linking-sites.csv', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
rows.append({
'site': row['Site'].strip(),
'links': int(row['Number of backlinks']),
})
rows.sort(key=lambda r: r['links'], reverse=True)
top_50 = rows[:50]
# Flag suspiciously high concentrations from a single domain
total = sum(r['links'] for r in rows)
for r in top_50:
pct = r['links'] / total * 100
flag = ' <- review' if pct > 5 else ''
print(f"{r['site']:40s} {r['links']:6d} ({pct:5.1f}%){flag}")GSC API: the official Search Console API does not expose a backlinks endpoint. You cannot pull link data programmatically the way you can pull search performance data. The closest workaround is automating CSV export through scheduled Google Sheets imports, or using the Search Analytics API to track query and page-level changes that correlate with link gain or loss. For a deeper API guide, see the GSC API guide.
Here is a minimal Search Analytics API call (Node.js) showing the auth and request pattern you would use for performance data — the same auth applies if Google ever adds a links endpoint:
// Search Console Search Analytics API - auth and query pattern
import { google } from 'googleapis';
const auth = new google.auth.GoogleAuth({
keyFile: './service-account.json',
scopes: ['https://www.googleapis.com/auth/webmasters.readonly'],
});
const webmasters = google.webmasters({ version: 'v3', auth });
const res = await webmasters.searchanalytics.query({
siteUrl: 'sc-domain:example.com',
requestBody: {
startDate: '2026-04-01',
endDate: '2026-04-29',
dimensions: ['page'],
rowLimit: 25000,
},
});
// Note: there is no public endpoint for backlink data
// You must use the UI export for the Links report
console.log(res.data.rows?.length, 'pages');Filtering for Spam and Disavow Candidates
Once you have a CSV of referring domains, the question is: which ones are actually spam, and which just look unfamiliar? Most unfamiliar domains are not spam. A regex-based first pass quickly separates obvious junk from links worth keeping:
# Flag likely-spam domains by pattern
import re
import csv
# Patterns that frequently signal low-quality directory or PBN domains
SPAM_PATTERNS = [
re.compile(r'^[a-z0-9]{15,}\.'), # random-string subdomains
re.compile(r'(seo|backlink|link|directory|articles?)\d+\.'),
re.compile(r'\.(tk|ml|ga|cf|gq|xyz|top|click)$'),
re.compile(r'^\d+[a-z]+\d+\.'), # alphanumeric mash
re.compile(r'(viagra|casino|poker|payday|loan)', re.I),
]
flagged = []
with open('top-linking-sites.csv', encoding='utf-8') as f:
for row in csv.DictReader(f):
domain = row['Site'].strip().lower()
for pattern in SPAM_PATTERNS:
if pattern.search(domain):
flagged.append((domain, pattern.pattern))
break
# Manual review every flagged item before disavowing
for domain, why in flagged[:50]:
print(f"{domain:50s} matched: {why}")Two important warnings about this approach: regex flagging is a triage step, not a verdict. A domain ending in .xyz can be a legitimate startup. A domain with the word "directory" can be a high-value industry portal. Always open the linking page in a browser and look at it before deciding. And second, in 2026 most spam links are already being ignored by Google's algorithms — flagging them is mostly an exercise in housekeeping, not a ranking lever.
The Disavow Tool: When and How (Most Sites Should NOT)
The disavow tool is one of the most over-used features in Google Search Console. Google's own guidance, repeated by John Mueller and Gary Illyes for years, is that the vast majority of sites should never use it. The algorithm already discounts spam links automatically.
You should consider disavow only if:
• You have a manual action labeled "Unnatural links to your site" in the Manual Actions report. This is the clearest case — without disavow, the manual action will not be lifted.
• You commissioned link-building campaigns in the past that violate Google's spam policies and you want to formally distance the site from them.
• You have direct, time-correlated evidence of a link-driven algorithmic penalty (a sudden ranking drop coinciding with a spam link spike) and you have already exhausted the option of contacting webmasters to request link removal.
You should not disavow: low-quality blog comments, generic forum links, scraper sites copying your content, foreign-language directory entries, or anything that simply "looks weird". Google ignores these for you.
If you are going to disavow, the file format is:
# disavow.txt - one entry per line, plain text, UTF-8 # Comments start with # # Use 'domain:' to disavow a whole domain (preferred for spam) # Or paste a single URL to disavow only that page # Whole-domain disavows domain:spammy-directory-site.example domain:link-farm-2024.example domain:pbn-network-host.example # Single-URL disavows https://example-blog.example/random-comment-page.html https://forum.example.example/thread/12345
Submit at search.google.com/search-console/disavow-links-tool, select your property, and upload the file. Disavow takes effect when Google next crawls each listed page — which can take weeks. Once submitted, do not change the file frequently; Google explicitly recommends treating it as a stable list.
How Often GSC Updates Backlink Data
The Links report does not update in real time. Based on observation across many properties, the actual cadence is:
• New backlinks first appear: 7–28 days after Google crawls the linking page. Highly authoritative sites get crawled within hours, so links from them appear faster; obscure sites can take a month.
• Link removals reflect: 30–90 days after the link is removed. GSC keeps showing a backlink long after the linking page has dropped it, until the linking page is recrawled and reprocessed.
• Top linked pages and Top linking text: updated roughly weekly, sometimes lagging 2 weeks during Google core updates.
• Total link counts: the headline number on the Links overview is rounded and frequently lags the underlying detail tables. Trust the detail tables over the rounded total when the two disagree.
If you launched a campaign yesterday and want immediate feedback on coverage, do not check GSC. Use Ahrefs' live index, Google Alerts on your brand, or direct referrer logs from your analytics.
Why Some Backlinks Don't Show Up in GSC
Five common reasons a known backlink is missing from your Links report:
1. The linking page has not been crawled yet. If the link was added in the past 2–4 weeks, this is almost always the cause. Wait.
2. The linking page is not indexable. If the linking page returns noindex, blocks Googlebot via robots.txt, or returns a non-200 status, Google will not extract its outbound links. Verify by running URL Inspection on the linking page from a property you control, or by fetching it with curl and checking the headers.
3. The link is JavaScript-rendered and Googlebot did not execute the JS. Modern Googlebot does render JavaScript, but rendering happens on a delay and is sometimes skipped for low-priority pages. If a link only exists in the rendered DOM, not the raw HTML, expect inconsistent reporting.
4. The property is wrong. A URL-prefix property for https://www.example.com/ will not show backlinks pointing to https://example.com/ (no www), or http://www.example.com/, or any subdomain. Switch to the Domain property to see all variants.
5. Google chose not to count the link. Links from pages Google considers low-quality, or links inside content patterns Google flags as paid or manipulative, may simply be omitted from the report. There is no way to override this.
Internal Links Report (Different from External)
The right-hand column of the Links overview is "Internal links" — pages on your own site that link to other pages on your own site. This is not a backlink report in the SEO sense, but it is critical for crawl efficiency and ranking signal flow. Pages with very few internal links are often under-indexed because Google crawls them less often.
Use the Internal links report to spot orphan pages (pages with zero internal links pointing to them) and shallow pages (pages with only one or two internal links from a single section). Cross-reference the list against your sitemap — any sitemap URL with under 3 internal links from the GSC report is a candidate for additional internal linking. For a deeper treatment, see internal linking strategy.
Note that the Internal links report shows raw counts, not weighted PageRank-style flow. A link from your homepage and a link from a deep archive page both count as "1" even though the homepage link is dramatically more valuable. Use the report to find structural gaps; do not interpret the count as a ranking score.
Monitoring Backlink Growth and Loss Over Time
GSC does not provide a historical chart of backlink count over time — only a snapshot of the current state. To track growth and loss, you have to build the time series yourself by exporting the same reports on a recurring schedule and storing the snapshots.
The simplest pattern is a monthly Google Sheets export of "Top linking sites", archived by date. Every month, diff the new export against the previous one to identify new domains gained and old domains lost. A 50-line script is enough:
# Diff two monthly GSC top-linking-sites exports
import csv
import sys
def load(path):
with open(path, encoding='utf-8') as f:
return {row['Site']: int(row['Number of backlinks'])
for row in csv.DictReader(f)}
prev = load(sys.argv[1]) # e.g. 2026-03-top-linking-sites.csv
curr = load(sys.argv[2]) # e.g. 2026-04-top-linking-sites.csv
new_domains = set(curr) - set(prev)
lost_domains = set(prev) - set(curr)
shared = set(prev) & set(curr)
gained_links = sum(curr[d] - prev[d] for d in shared if curr[d] > prev[d])
lost_links = sum(prev[d] - curr[d] for d in shared if curr[d] < prev[d])
print(f"New referring domains: {len(new_domains)}")
print(f"Lost referring domains: {len(lost_domains)}")
print(f"Net link gain on shared: {gained_links - lost_links:+d}")
# Show top 10 newly acquired domains by link count
top_new = sorted(((d, curr[d]) for d in new_domains),
key=lambda x: x[1], reverse=True)[:10]
for domain, count in top_new:
print(f" + {domain:40s} {count} links")For sites doing active link building, run this monthly. For sites in a steady state, quarterly is fine. The single most useful metric to watch is referring-domain count month over month — raw backlink count is noisy because a single domain can add or drop hundreds of footer links overnight. Domain count is what tracks actual outreach progress.
If you want this automated end-to-end with no manual export, see the GSC data export guide for scheduled extraction patterns, and the GSC pages report for combining link data with indexing status to find under-linked indexed pages.