SpyFu Scraper | SEO, PPC and Competitor Data avatar

SpyFu Scraper | SEO, PPC and Competitor Data

Pricing

from $5.91 / 1,000 domains

Go to Apify Store
SpyFu Scraper | SEO, PPC and Competitor Data

SpyFu Scraper | SEO, PPC and Competitor Data

SpyFu scraper for SEO and PPC competitor research: 20 domains in 20 seconds, 44 fields each. Get organic keywords, clicks and traffic value, Google Ads budget, paid keywords, domain strength, top competitors, best and new keywords and monthly history. Start from a domain, keyword or link. No login.

Pricing

from $5.91 / 1,000 domains

Rating

0.0

(0)

Developer

SilentFlow

SilentFlow

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

2 days ago

Last modified

Share

SpyFu Scraper | SEO, PPC and Competitor Data (2026)

SpyFu domains, 44 fields each, from any domain.

From SilentFlow. Creators of Facebook Search Scraper and Pinterest Scraper, with 570,000+ combined lifetime runs.

Every number SpyFu shows for a domain, one flat row each: organic traffic and its value, ad budget, paid keywords, top competitors, best keywords and up to 20 years of monthly history. 20 domains in about 20 seconds.

Why choose this actor?

Opening SpyFu one domain at a time to fill a competitor report? Wondering who else bids on the keyword that costs you the most? Cleaning up exports where every number is text and every competitor list is one long string?

  • 42 fields on every domain, as real numbers. On our default test run, 42 data fields were filled on every one of the 20 domains: organic keywords, organic clicks and their monthly value, paid keywords, paid clicks, ad budget, average positions, domain strength, the traffic split, month-over-month and year-over-year changes, newly ranked, gained and lost keywords, the top 5 SEO and PPC competitors with the keywords they share, the top and newest organic and paid keywords with their search volume and cost per click, keywords per country and 12 months of history. The most used SpyFu actor lists 27 fields in its sample output, with numbers written as text and its lists as comma-separated strings.
  • Start from a keyword, not only a domain. Type a domain, a keyword or paste a link (a SpyFu page or any web page): three ways in, where the most used SpyFu actor takes domains only. A keyword brings up the domain ranked first on Google and every domain SpyFu saw bidding on it, the steadiest bidders first: crm software brought up 294 domains, led by salesforce.com, zoho.com, monday.com, hubspot.com and pipedrive.com, each delivered as a full row.
  • Nothing to fill before the first run. No field is required. The prefilled form ran as is and delivered 20 domains in 21 seconds: the 3 domains it lists, then 17 domains that compete on running shoes. The most used SpyFu actor will not start until its domain field is filled.

Try SpyFu Scraper

Try your first domains

Paste this input in the actor's Input tab, or keep the prefilled one, and press Start:

{
"domains": ["nike.com", "hubspot.com", "shopify.com"],
"keywords": ["running shoes"],
"country": "us",
"maxItems": 20,
"historyMonths": 12
}

You get 20 domains in about 20 seconds: nike.com, hubspot.com and shopify.com, then the domains that compete on running shoes (ebay.com, ranked first on Google, then on.com, hoka.com, newbalance.com, brooksrunning.com and more). Each one is a row with its traffic, ad budget, competitors, keywords and a year of monthly history. The Apify Free plan covers runs like this one every month, so you can check the data before you point it at your whole market.

How it works

Copy to your AI assistant

Paste this block into Claude, ChatGPT or Cursor to give it full context about this scraper:

You have access to the SpyFu Scraper on Apify: silentflow/spyfu-scraper
It reads SpyFu (spyfu.com) competitor data. One dataset row per domain, for one SpyFu country database per run.
Input (no field is required, give at least one of the first three):
- domains (array of strings): domains or web addresses. Examples: "nike.com", "hubspot.com", "https://www.shopify.com/pricing" (read as shopify.com)
- keywords (array of strings): search terms. Each one brings up the domain ranked first on Google plus every domain SpyFu saw bidding on it in Google Ads, steadiest bidders first, and each becomes a full domain row. Examples: "running shoes", "crm software"
- startUrls (array of {url}): SpyFu pages (https://www.spyfu.com/overview/domain?query=nike.com, any /seo/ or /ppc/ domain page, https://www.spyfu.com/keyword/overview?query=running+shoes) or any web page, read as its domain
- country (string, default "us"): SpyFu database. One of us, gb, ar, au, at, be, br, ca, cl, cz, dk, fi, fr, de, in, ie, it, jp, mx, nl, nz, no, pl, pt, sg, za, es, se, ch, tr, ua, ve. Also accepts 3-letter codes (gbr) and English names (United Kingdom); "uk" works.
- maxItems (integer, default 100): domains to deliver for the whole run. Typed domains come first, then keyword domains.
- historyMonths (integer, default 12, 0 to 300): months of history in monthlyHistory, latest first. 300 keeps everything (back to 2006 for old domains), 0 leaves it out.
Output per domain (42 data fields, flat, camelCase, numbers as numbers, null when SpyFu has no value, dates RFC 3339):
- identity: id (the domain, stable), domain, url (SpyFu overview page), websiteUrl, countryCode (ISO, GB for the UK)
- SEO, latest month: organicKeywords, monthlyOrganicClicks, monthlyOrganicValue, averageOrganicRank, organicKeywordsMoMPercent, organicClicksMoMPercent, organicClicksYoYPercent, newlyRankedKeywords, gainedRankKeywords, lostRankKeywords
- PPC, latest month: paidKeywords, monthlyPaidClicks, monthlyAdBudget, averageAdPosition, paidClicksMoMPercent, adBudgetMoMPercent, adBudgetYoYPercent
- whole domain: domainStrength (0 to 100), organicTrafficShare, paidTrafficShare (percent of clicks), latestMonth, trackedSince, monthsTracked
- competitors: topOrganicCompetitor, topPaidCompetitor, organicCompetitors[] and paidCompetitors[] ({domain, commonKeywords}, 5 each)
- keywords: topOrganicKeyword, topPaidKeyword, topOrganicKeywords[] and newOrganicKeywords[] ({keyword, position, positionChange, searchVolume, monthlyClicks, costPerClick, rankingDifficulty, url}, 5 each), topPaidKeywords[] and newPaidKeywords[] ({keyword, searchVolume, costPerClick, monthlyCost, rankingDifficulty, paidCompetitors, lastSeenAt}, 5 each)
- countries: primaryCountry, countriesTracked, keywordsByCountry[] ({countryCode, organicKeywords})
- history: monthlyHistory[] ({month, organicKeywords, monthlyOrganicClicks, monthlyOrganicValue, averageOrganicRank, paidKeywords, monthlyPaidClicks, monthlyAdBudget, averageAdPosition, domainStrength})
- meta: searchKeyword (on rows found through a keyword), scrapedAt
Use apify-client for Python or JavaScript: client.actor("silentflow/spyfu-scraper").call(run_input=...), then read the default dataset.

How to scrape SpyFu competitor data

Get the SEO and PPC numbers of your competitors

List the domains you want side by side. Each one comes back as a row you can sort by organic clicks, ad budget or domain strength.

{
"domains": ["hubspot.com", "salesforce.com", "pipedrive.com", "zoho.com"]
}

Find every domain bidding on a keyword

One keyword gives the domain ranked first on Google, then every domain SpyFu saw bidding on it, the ones seen in the most months first. Our run on crm software delivered salesforce.com, zoho.com, monday.com, hubspot.com, getjobber.com, pipedrive.com and attio.com among the first 15.

{
"keywords": ["crm software"],
"maxItems": 15
}

Compare UK retailers over two years

Pick another SpyFu country and keep more history. Our run on these four UK sites took 5 seconds and returned 24 months each, from October 2024 to September 2026.

{
"domains": ["bbc.co.uk", "theguardian.com", "asos.com", "tesco.com"],
"country": "gb",
"historyMonths": 24,
"maxItems": 10
}

Input parameters

FieldTypeDefaultWhat it does
domainsarray of stringsprefilled with 3 domainsDomains or web addresses to analyze. Each one becomes a row.
keywordsarray of stringsprefilled with running shoesSearch terms. Each brings up the domain ranked first and the domains bidding on it, each as a full row.
startUrlsarray of linksnoneSpyFu domain or keyword pages, or any web page read as its domain.
countrystringusThe SpyFu country database to read, 32 countries.
maxItemsinteger100 (prefill 20)Domains to deliver for the whole run.
historyMonthsinteger12Months of history per row, 0 to 300.

No field is required. Give at least a domain, a keyword or a link.

Formats accepted

  • Domains: nike.com, www.nike.com, NIKE.com, https://www.nike.com/shoes?color=red all read as nike.com. Subdomains are kept as typed (shop.example.co.uk). A line that is not a domain (not a domain) is skipped and named in the log, the others still run.
  • SpyFu links: https://www.spyfu.com/overview/domain?query=nike.com, https://www.spyfu.com/seo/overview/domain?query=nike.com, https://www.spyfu.com/ppc/keywords/domain?query=nike.com, https://www.spyfu.com/overview/url?query=https://www.nike.com/shoes read the domain; https://www.spyfu.com/keyword/overview?query=running+shoes reads the keyword.
  • Keywords: any search term, as you would type it on Google, dotted terms included (node.js, asp.net). A link typed in the keyword box (starting with https:// or www.) is read as a domain.
  • Country: a code (us, gb, de), a 3-letter code (gbr, deu) or an English name (United Kingdom, Germany). uk reads the United Kingdom. A country SpyFu does not cover stops the run with a message naming the choices.
  • Duplicates: a domain typed twice, or found by both a domain and a keyword, is delivered once.

What data can you extract from SpyFu?

Each row is one domain in one SpyFu country database. 42 data fields per row, grouped like this:

GroupFields
Identityid, domain, url, websiteUrl, countryCode
SEO, latest monthorganicKeywords, monthlyOrganicClicks, monthlyOrganicValue, averageOrganicRank, organicKeywordsMoMPercent, organicClicksMoMPercent, organicClicksYoYPercent, newlyRankedKeywords, gainedRankKeywords, lostRankKeywords
PPC, latest monthpaidKeywords, monthlyPaidClicks, monthlyAdBudget, averageAdPosition, paidClicksMoMPercent, adBudgetMoMPercent, adBudgetYoYPercent
Whole domaindomainStrength, organicTrafficShare, paidTrafficShare, latestMonth, trackedSince, monthsTracked
CompetitorstopOrganicCompetitor, topPaidCompetitor, organicCompetitors, paidCompetitors
KeywordstopOrganicKeyword, topPaidKeyword, topOrganicKeywords, newOrganicKeywords, topPaidKeywords, newPaidKeywords
CountriesprimaryCountry, countriesTracked, keywordsByCountry
HistorymonthlyHistory
MetasearchKeyword (rows found through a keyword), scrapedAt

Inside the lists:

  • each competitor has 2 fields: domain and commonKeywords, the number of keywords it shares with the row's domain;
  • each organic keyword has 8: keyword, position, positionChange, searchVolume, monthlyClicks (the clicks this domain gets from it), costPerClick, rankingDifficulty (0 to 100) and url, the page that ranks;
  • each paid keyword has 7: keyword, searchVolume, costPerClick, monthlyCost, rankingDifficulty, paidCompetitors (how many domains bid on it) and lastSeenAt, the latest month SpyFu saw this domain's ad on it;
  • each country has 2: countryCode and organicKeywords;
  • each month of history has 10: month, organicKeywords, monthlyOrganicClicks, monthlyOrganicValue, averageOrganicRank, paidKeywords, monthlyPaidClicks, monthlyAdBudget, averageAdPosition and domainStrength.

Good to know when you use the data:

  • id is the domain itself, so a row joins on id from one month to the next. url is the domain's permanent SpyFu overview page.
  • Dates are RFC 3339 in UTC. Monthly figures are dated on the first day of their month: latestMonth was 2026-09-01T00:00:00Z on our run of 21 October 2026, since SpyFu refreshes its numbers once a month.
  • Percent changes compare the latest month with the month before (MoM) and the same month a year earlier (YoY). They are null when the earlier month had no data or was zero.
  • organicTrafficShare and paidTrafficShare split the domain's estimated clicks between Google results and Google Ads, in percent.
  • Values are SpyFu's estimates, the same numbers its site shows for the domain.
  • Keyword lists hold the top 5 rows SpyFu shows for each list. The totals (organicKeywords, paidKeywords, newlyRankedKeywords and the others) count every keyword.

Output example

One complete row from our default run, hubspot.com in the United States database:

{
"id": "hubspot.com",
"domain": "hubspot.com",
"url": "https://www.spyfu.com/overview/domain?query=hubspot.com",
"websiteUrl": "https://hubspot.com",
"countryCode": "US",
"organicKeywords": 885500,
"monthlyOrganicClicks": 911100,
"monthlyOrganicValue": 13920000,
"averageOrganicRank": 40.3,
"organicKeywordsMoMPercent": -2.7,
"organicClicksMoMPercent": -3,
"organicClicksYoYPercent": -45.9,
"newlyRankedKeywords": 283458,
"gainedRankKeywords": 214245,
"lostRankKeywords": 179718,
"paidKeywords": 65860,
"monthlyPaidClicks": 451100,
"monthlyAdBudget": 1918000,
"averageAdPosition": 2.4,
"paidClicksMoMPercent": 2.5,
"adBudgetMoMPercent": -4.9,
"adBudgetYoYPercent": -29.5,
"domainStrength": 72,
"organicTrafficShare": 66.9,
"paidTrafficShare": 33.1,
"latestMonth": "2026-09-01T00:00:00Z",
"trackedSince": "2006-11-01T00:00:00Z",
"monthsTracked": 229,
"topOrganicCompetitor": "mailchimp.com",
"topPaidCompetitor": "attio.com",
"organicCompetitors": [
{
"domain": "mailchimp.com",
"commonKeywords": 26096
},
{
"domain": "salesforce.com",
"commonKeywords": 33288
},
{
"domain": "shopify.com",
"commonKeywords": 32939
},
{
"domain": "neilpatel.com",
"commonKeywords": 13228
},
{
"domain": "wix.com",
"commonKeywords": 21195
}
],
"paidCompetitors": [
{
"domain": "attio.com",
"commonKeywords": 13054
},
{
"domain": "monday.com",
"commonKeywords": 18133
},
{
"domain": "pipedrive.com",
"commonKeywords": 11919
},
{
"domain": "kintone.com",
"commonKeywords": 8996
},
{
"domain": "top5-crm.com",
"commonKeywords": 2119
}
],
"topOrganicKeyword": "hubspot",
"topPaidKeyword": "slack",
"topOrganicKeywords": [
{
"keyword": "hubspot",
"position": 1,
"positionChange": 0,
"searchVolume": 231000,
"monthlyClicks": 37900,
"costPerClick": 2.75,
"rankingDifficulty": 8,
"url": "https://www.hubspot.com/"
},
{
"keyword": "crm",
"position": 2,
"positionChange": 1,
"searchVolume": 247000,
"monthlyClicks": 20700,
"costPerClick": 25.2,
"rankingDifficulty": 49,
"url": "https://www.hubspot.com/products/crm"
},
{
"keyword": "wordpress",
"position": 6,
"positionChange": null,
"searchVolume": 554000,
"monthlyClicks": 16000,
"costPerClick": 2.32,
"rankingDifficulty": 13,
"url": "https://blog.hubspot.com/website/what-is-wordpress"
},
{
"keyword": "github",
"position": 13,
"positionChange": 1,
"searchVolume": 993000,
"monthlyClicks": 13500,
"costPerClick": 2.27,
"rankingDifficulty": 10,
"url": "https://blog.hubspot.com/website/what-is-github-used-for"
},
{
"keyword": "google contacts",
"position": 8,
"positionChange": null,
"searchVolume": 262000,
"monthlyClicks": 5700,
"costPerClick": 0.95,
"rankingDifficulty": 9,
"url": "https://blog.hubspot.com/marketing/the-ultimate-guide-to-google-contacts"
}
],
"newOrganicKeywords": [
{
"keyword": "wordpress",
"position": 6,
"positionChange": null,
"searchVolume": 554000,
"monthlyClicks": 16000,
"costPerClick": 2.32,
"rankingDifficulty": 13,
"url": "https://blog.hubspot.com/website/what-is-wordpress"
},
{
"keyword": "google contacts",
"position": 8,
"positionChange": null,
"searchVolume": 262000,
"monthlyClicks": 5700,
"costPerClick": 0.95,
"rankingDifficulty": 9,
"url": "https://blog.hubspot.com/marketing/the-ultimate-guide-to-google-contacts"
},
{
"keyword": "smart goals",
"position": 15,
"positionChange": null,
"searchVolume": 199000,
"monthlyClicks": 2400,
"costPerClick": 1.25,
"rankingDifficulty": 59,
"url": "https://blog.hubspot.com/marketing/smart-goal-examples"
},
{
"keyword": "google logo",
"position": 9,
"positionChange": null,
"searchVolume": 105000,
"monthlyClicks": 2000,
"costPerClick": 1.18,
"rankingDifficulty": 44,
"url": "https://blog.hubspot.com/marketing/google-logo-history"
},
{
"keyword": "new gmail account",
"position": 7,
"positionChange": null,
"searchVolume": 74000,
"monthlyClicks": 1800,
"costPerClick": 0.54,
"rankingDifficulty": 5,
"url": "https://www.hubspot.com/email-signature-generator/set-up-gmail-account"
}
],
"topPaidKeywords": [
{
"keyword": "slack",
"searchVolume": 1260000,
"costPerClick": 0.55,
"monthlyCost": 43571.7,
"rankingDifficulty": 7,
"paidCompetitors": 63,
"lastSeenAt": "2026-05-01T00:00:00Z"
},
{
"keyword": "shopify",
"searchVolume": 870000,
"costPerClick": 5.16,
"monthlyCost": 229188.9,
"rankingDifficulty": 9,
"paidCompetitors": 127,
"lastSeenAt": "2026-09-01T00:00:00Z"
},
{
"keyword": "squarespace",
"searchVolume": 603000,
"costPerClick": 1.05,
"monthlyCost": 41988,
"rankingDifficulty": 7,
"paidCompetitors": 127,
"lastSeenAt": "2026-07-01T00:00:00Z"
},
{
"keyword": "salesforce",
"searchVolume": 420000,
"costPerClick": 2.85,
"monthlyCost": 98170.5,
"rankingDifficulty": 6,
"paidCompetitors": 127,
"lastSeenAt": "2026-10-01T00:00:00Z"
},
{
"keyword": "notion",
"searchVolume": 412000,
"costPerClick": 0.35,
"monthlyCost": 981.6,
"rankingDifficulty": 6,
"paidCompetitors": 73,
"lastSeenAt": "2026-04-01T00:00:00Z"
}
],
"newPaidKeywords": [
{
"keyword": "affiliate marketing",
"searchVolume": 63500,
"costPerClick": 6.32,
"monthlyCost": 12449.1,
"rankingDifficulty": 42,
"paidCompetitors": 127,
"lastSeenAt": "2026-10-01T00:00:00Z"
},
{
"keyword": "chatgpt alternative",
"searchVolume": 25000,
"costPerClick": null,
"monthlyCost": null,
"rankingDifficulty": 28,
"paidCompetitors": 95,
"lastSeenAt": "2026-10-01T00:00:00Z"
},
{
"keyword": "profit and loss template",
"searchVolume": 3900,
"costPerClick": 0.28,
"monthlyCost": 16.2,
"rankingDifficulty": 41,
"paidCompetitors": 54,
"lastSeenAt": "2026-10-01T00:00:00Z"
},
{
"keyword": "free gantt chart software",
"searchVolume": 1900,
"costPerClick": null,
"monthlyCost": null,
"rankingDifficulty": 23,
"paidCompetitors": 27,
"lastSeenAt": "2026-09-01T00:00:00Z"
},
{
"keyword": "chimamanda",
"searchVolume": 1700,
"costPerClick": 0.33,
"monthlyCost": 0.3,
"rankingDifficulty": 16,
"paidCompetitors": 2,
"lastSeenAt": "2026-08-01T00:00:00Z"
}
],
"primaryCountry": "US",
"countriesTracked": 32,
"keywordsByCountry": [
{
"countryCode": "US",
"organicKeywords": 885500
},
{
"countryCode": "GB",
"organicKeywords": 423200
},
{
"countryCode": "IN",
"organicKeywords": 50530
},
{
"countryCode": "AU",
"organicKeywords": 38950
},
{
"countryCode": "CA",
"organicKeywords": 35600
},
{
"countryCode": "DE",
"organicKeywords": 20440
},
{
"countryCode": "BR",
"organicKeywords": 15650
},
{
"countryCode": "FR",
"organicKeywords": 11330
},
{
"countryCode": "NL",
"organicKeywords": 10050
},
{
"countryCode": "SG",
"organicKeywords": 8213
},
{
"countryCode": "ZA",
"organicKeywords": 7355
},
{
"countryCode": "IE",
"organicKeywords": 5595
},
{
"countryCode": "IT",
"organicKeywords": 4933
},
{
"countryCode": "ES",
"organicKeywords": 4269
},
{
"countryCode": "UA",
"organicKeywords": 3157
},
{
"countryCode": "NO",
"organicKeywords": 3037
},
{
"countryCode": "BE",
"organicKeywords": 2736
},
{
"countryCode": "MX",
"organicKeywords": 2652
},
{
"countryCode": "DK",
"organicKeywords": 2646
},
{
"countryCode": "SE",
"organicKeywords": 2354
},
{
"countryCode": "PT",
"organicKeywords": 2315
},
{
"countryCode": "CH",
"organicKeywords": 2253
},
{
"countryCode": "NZ",
"organicKeywords": 1939
},
{
"countryCode": "AT",
"organicKeywords": 1656
},
{
"countryCode": "FI",
"organicKeywords": 1620
},
{
"countryCode": "JP",
"organicKeywords": 1597
},
{
"countryCode": "VE",
"organicKeywords": 998
},
{
"countryCode": "AR",
"organicKeywords": 954
},
{
"countryCode": "CZ",
"organicKeywords": 917
},
{
"countryCode": "PL",
"organicKeywords": 900
},
{
"countryCode": "CL",
"organicKeywords": 769
},
{
"countryCode": "TR",
"organicKeywords": 556
}
],
"monthlyHistory": [
{
"month": "2026-09-01T00:00:00Z",
"organicKeywords": 885500,
"monthlyOrganicClicks": 911100,
"monthlyOrganicValue": 13920000,
"averageOrganicRank": 40.3,
"paidKeywords": 65860,
"monthlyPaidClicks": 451100,
"monthlyAdBudget": 1918000,
"averageAdPosition": 2.4,
"domainStrength": 72
},
{
"month": "2026-08-01T00:00:00Z",
"organicKeywords": 910300,
"monthlyOrganicClicks": 938900,
"monthlyOrganicValue": 14500000,
"averageOrganicRank": 40.8,
"paidKeywords": 62160,
"monthlyPaidClicks": 440000,
"monthlyAdBudget": 2017000,
"averageAdPosition": 2.4,
"domainStrength": 72
},
{
"month": "2026-07-01T00:00:00Z",
"organicKeywords": 911700,
"monthlyOrganicClicks": 903200,
"monthlyOrganicValue": 14270000,
"averageOrganicRank": 41.3,
"paidKeywords": 60080,
"monthlyPaidClicks": 435900,
"monthlyAdBudget": 2165000,
"averageAdPosition": 2.4,
"domainStrength": 72
},
{
"month": "2026-06-01T00:00:00Z",
"organicKeywords": 1063000,
"monthlyOrganicClicks": 964800,
"monthlyOrganicValue": 17390000,
"averageOrganicRank": 42.8,
"paidKeywords": 57390,
"monthlyPaidClicks": 415600,
"monthlyAdBudget": 2164000,
"averageAdPosition": 2.4,
"domainStrength": 73
},
{
"month": "2026-05-01T00:00:00Z",
"organicKeywords": 1119000,
"monthlyOrganicClicks": 977800,
"monthlyOrganicValue": 18780000,
"averageOrganicRank": 43.7,
"paidKeywords": 47580,
"monthlyPaidClicks": 328500,
"monthlyAdBudget": 2175000,
"averageAdPosition": 2.5,
"domainStrength": 73
},
{
"month": "2026-04-01T00:00:00Z",
"organicKeywords": 1148000,
"monthlyOrganicClicks": 1014000,
"monthlyOrganicValue": 18970000,
"averageOrganicRank": 44.3,
"paidKeywords": 34660,
"monthlyPaidClicks": 182600,
"monthlyAdBudget": 2408000,
"averageAdPosition": 2.7,
"domainStrength": 73
},
{
"month": "2026-03-01T00:00:00Z",
"organicKeywords": 917500,
"monthlyOrganicClicks": 1040000,
"monthlyOrganicValue": 18480000,
"averageOrganicRank": 44.7,
"paidKeywords": 29099,
"monthlyPaidClicks": 166900,
"monthlyAdBudget": 2806000,
"averageAdPosition": 2.8,
"domainStrength": 66
},
{
"month": "2026-02-01T00:00:00Z",
"organicKeywords": 883800,
"monthlyOrganicClicks": 970400,
"monthlyOrganicValue": 11890000,
"averageOrganicRank": 47.9,
"paidKeywords": 25130,
"monthlyPaidClicks": 151000,
"monthlyAdBudget": 3188000,
"averageAdPosition": 2.8,
"domainStrength": 64
},
{
"month": "2026-01-01T00:00:00Z",
"organicKeywords": 945400,
"monthlyOrganicClicks": 994100,
"monthlyOrganicValue": 5653000,
"averageOrganicRank": 47.8,
"paidKeywords": 21900,
"monthlyPaidClicks": 139100,
"monthlyAdBudget": 3393000,
"averageAdPosition": 2.8,
"domainStrength": 61
},
{
"month": "2025-12-01T00:00:00Z",
"organicKeywords": 990700,
"monthlyOrganicClicks": 1122000,
"monthlyOrganicValue": 5901000,
"averageOrganicRank": 47.1,
"paidKeywords": 19520,
"monthlyPaidClicks": 125400,
"monthlyAdBudget": 5276000,
"averageAdPosition": 2.8,
"domainStrength": 62
},
{
"month": "2025-11-01T00:00:00Z",
"organicKeywords": 1361000,
"monthlyOrganicClicks": 1412000,
"monthlyOrganicValue": 8312000,
"averageOrganicRank": 45.9,
"paidKeywords": 6843,
"monthlyPaidClicks": 5249,
"monthlyAdBudget": 3396000,
"averageAdPosition": 2.5,
"domainStrength": 64
},
{
"month": "2025-10-01T00:00:00Z",
"organicKeywords": 1395000,
"monthlyOrganicClicks": 1552000,
"monthlyOrganicValue": 8382000,
"averageOrganicRank": 45.9,
"paidKeywords": 6914,
"monthlyPaidClicks": 8376,
"monthlyAdBudget": 3352000,
"averageAdPosition": 2.6,
"domainStrength": 64
}
],
"scrapedAt": "2026-10-21T15:31:24Z"
}

Advanced usage

Follow a client and its competitors every month

Save this input as a task and schedule it monthly, after SpyFu's refresh. Each run gives one row per domain with its month-over-month and year-over-year changes already computed, so the report is a filter away.

{
"domains": ["hubspot.com", "salesforce.com", "pipedrive.com"],
"historyMonths": 1
}

Keep a domain's whole history

Set historyMonths to 300 to keep every month SpyFu has. nike.com came back with 230 months, from June 2006 to September 2026, in 3 seconds: enough to chart two decades of organic and paid search.

{
"domains": ["nike.com"],
"historyMonths": 300
}

Map who competes on a keyword in another country

Keywords run in the country you pick. laufschuhe in the German database brought up 31 domains; the first five of our run were 21run.com, lauf-bar.de, shop4runners.com, adidas.de and nike.com.

{
"keywords": ["laufschuhe"],
"country": "de",
"maxItems": 30
}

Paste the SpyFu pages you already have open

Copy the addresses of SpyFu domain or keyword pages, or any page of a website, and run them together. Our run on a semrush.com SpyFu page, an ahrefs.com blog page and the SpyFu keyword page for seo tools delivered 10 domains in 10 seconds: semrush.com, ahrefs.com, then techradar.com, seranking.com, similarweb.com, moz.com and others competing on the keyword.

{
"startUrls": [
{ "url": "https://www.spyfu.com/overview/domain?query=semrush.com" },
{ "url": "https://www.ahrefs.com/blog/" },
{ "url": "https://www.spyfu.com/keyword/overview?query=seo%20tools" }
],
"maxItems": 10,
"historyMonths": 6
}

Rank a prospect list by ad budget in Python

Agencies qualify leads by how much they spend on Google Ads. Run your list, then sort it:

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("silentflow/spyfu-scraper").call(run_input={
"domains": ["getjobber.com", "housecallpro.com", "servicetitan.com", "workiz.com"],
"historyMonths": 0,
})
rows = client.dataset(run["defaultDatasetId"]).list_items().items
for r in sorted(rows, key=lambda r: r["monthlyAdBudget"] or 0, reverse=True):
print(f'{r["domain"]:<22} ads {r["monthlyAdBudget"] or 0:>12,.0f}/month '
f'organic clicks {r["monthlyOrganicClicks"] or 0:>10,} '
f'YoY {r["organicClicksYoYPercent"]}% top rival {r["topPaidCompetitor"]}')

The same dataset downloads as CSV, Excel or JSON from the run's Storage tab, or through the dataset API. Nested lists such as organicCompetitors become numbered columns in CSV and Excel.

FAQ

What is SpyFu? SpyFu is a competitor research tool for search marketing. For millions of domains it estimates the keywords they rank for on Google, the clicks those rankings bring, the keywords they buy ads on and their monthly ad budget, with history back to 2006. This actor reads those public numbers and hands them to you as rows.

What does one row contain? One domain in one SpyFu country: 42 data fields covering its organic and paid search for the latest month, the changes against last month and last year, its 5 top SEO and PPC competitors, 5 top and 5 new organic and paid keywords with their metrics, its keywords per country and its monthly history.

Do I need a SpyFu account or an API key? No. The actor reads what SpyFu shows to any visitor. No login, no API key, nothing to connect.

How fresh is the data? SpyFu updates its estimates once a month. Every run reads SpyFu live, and latestMonth on each row tells you which month the numbers describe (September 2026 on our runs of 21 October 2026).

Why do keyword lists stop at 5? SpyFu shows the first 5 rows of each keyword list to visitors without an account, and that is what each row carries. The totals are complete: organicKeywords counts every keyword the domain ranks for, paidKeywords every keyword it buys, newlyRankedKeywords, gainedRankKeywords and lostRankKeywords every movement of the month.

What happens with a domain SpyFu does not track? It gives no row, so you never get an empty line for it. The log names it and the run's status says that SpyFu has no data for it in that country. Small sites often have data in one country only: keywordsByCountry on a known domain shows where SpyFu tracks it.

Which countries can I read? The 32 countries SpyFu covers: the United States, the United Kingdom, Argentina, Australia, Austria, Belgium, Brazil, Canada, Chile, Czechia, Denmark, Finland, France, Germany, India, Ireland, Italy, Japan, Mexico, the Netherlands, New Zealand, Norway, Poland, Portugal, Singapore, South Africa, Spain, Sweden, Switzerland, Turkey, Ukraine and Venezuela. One country per run; run again for another one.

How does a keyword turn into domains? The actor takes the domain ranked first on Google for the keyword, then every domain SpyFu saw bidding on it over the past months, ordered by the number of months it bid: a steady advertiser comes before a one-off. Each of them is then read as a full domain row, and searchKeyword says which keyword brought it in.

How many domains can I run at once? As many as you like: maxItems sets the stop. A domain takes about a second; our default run delivered 20 in 21 seconds. Domains you type are always read before the domains of your keywords.

Are the numbers exact? They are SpyFu's estimates, the same ones its website displays. Use them to compare domains with each other and over time, the way SpyFu users do.

Can I get the data in Google Sheets or my own database? Yes. Every run's dataset downloads as CSV, Excel, JSON or XML, and the Apify API, the Python and JavaScript clients, webhooks and integrations such as Google Sheets, Make or Zapier read it directly.

More SilentFlow scrapers

🛒 E-commerce

💼 Jobs

🏠 Real estate

📣 Social media

🏢 Business data

✈️ Travel

🎯 Lead generation

🔎 SEO

📈 Marketing

🧰 More tools

Support

Need something this scraper doesn't do yet? We ship features fast.

  • Feature requests go straight to our backlog
  • Enterprise needs? We do custom integrations and high-volume plans
  • Pricing questions? Check the Monetization tab on the actor page

Response time: usually under 24 hours.

This Actor extracts publicly available competitor research data from SpyFu: domain-level estimates of search traffic, keywords, ad budgets and competitors. It does not bypass any login, paywall or CAPTCHA, and never uses a SpyFu account. The rows describe websites and companies, not people. Users are responsible for complying with SpyFu's terms of service and applicable data protection laws (GDPR, CCPA, and PIPL where relevant). SpyFu is a trademark of its owner; this Actor is not affiliated with or endorsed by SpyFu. The data returned is informational and made of estimates; verify accuracy before using it for regulated or financial decisions.

SpyFu Scraper by SilentFlow: the traffic, ad budget, competitors and keywords of any domain, ready for your spreadsheet.