Similarweb Traffic and Rank Scraper
Pricing
from $0.75 / 1,000 domains
Similarweb Traffic and Rank Scraper
Get public Similarweb data for any domain. You get traffic, rank, engagement, geography and category signals. No Similarweb API key is needed. It tries a direct request first, then a proxy retry if you turn it on.
Pricing
from $0.75 / 1,000 domains
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
2
Monthly active users
14 hours ago
Last modified
Categories
Share
Similarweb Traffic and Rank Scraper: visits, ranks and traffic mix for any domain
Give it a list of domains and get back the public Similarweb snapshot for each one: global, country and category rank, monthly visits, bounce rate, pages per visit, time on site, where the traffic came from and which countries it came from. No Similarweb account and no API key.
This is the public snapshot, which means it is a monthly figure and it lags. The row tells you which
month it describes in snapshotDate, so check that field before you treat a number as current.
| Input | Domains or URLs, up to 100 per run |
| Output | One row per domain |
| Ceiling | 100 domains per run |
| Account needed | None, and no Similarweb API key |
| Price | $2.40 per 1,000 domains on the free plan, down to $0.65 per 1,000 on Diamond |
🔍 What Similarweb Traffic and Rank Scraper does
You paste domains. It normalises each one, drops duplicates, and asks Similarweb's public data endpoint for the snapshot it publishes for that site. What comes back is the same set of numbers you see on a Similarweb site overview page: the three ranks, estimated visits, the four engagement figures, the traffic-source split and the top countries.
Domains are fetched in parallel, three at a time by default, and you can push that to ten. Every domain produces a row whether it worked or not, so a list of 100 gives you 100 rows and you never have to work out which ones silently vanished.
It does not invent numbers. When Similarweb answers with something that is not usable data, the row
says so in errorCode and leaves the metrics out rather than filling them with zeros.
📥 What you give it
{"domains": ["nasa.gov", "github.com", "apify.com"],"maxConcurrency": 3,"requestTimeoutSecs": 15}
| Field | Default | What it is |
|---|---|---|
domains | empty | Domains or full URLs, up to 100. Duplicates are collapsed before anything is fetched, so you are not charged twice for the same site. The box starts with apify.com in it, which is a suggestion and not a default. |
domain | none | A shortcut when you only want one site. It is added to whatever is in domains. |
maxConcurrency | 3 | How many domains to fetch at once, 1 to 10. Higher finishes sooner and is more likely to get turned down. |
requestTimeoutSecs | 15 | How long to wait for each domain, 5 to 30 seconds. |
retryWithProxy | true | On. When a domain's first request comes back refused or rate limited, try that one domain again through the network settings below. It does nothing at all unless you fill those in. |
proxyConfiguration | {"useApifyProxy": false} | Optional and off. Your own servers are used exactly as given. |
IP addresses, localhost, internal suffixes and URLs with credentials in them are rejected before
any request goes out, and come back as a BAD_INPUT row.
📤 What you get back
A real row for nasa.gov:
{"ok": true,"domain": "nasa.gov","globalRank": 1468,"countryRank": 924,"categoryRank": 3,"totalVisits": 22443884,"bounceRate": 51.85,"pagesPerVisit": 8.18963223230699,"visitDuration": 184.2251173400256,"trafficSources": {"SearchOrganic": 0.4413234435566554, "Direct": 0.3788197225214602,"Referrals": 0.0688418871803049, "SocialOrganic": 0.0518356638534659,"GenAi": 0.02246646486027501, "SocialPaid": 0.014864511434090441,"Mail": 0.012841142217370817, "DisplayAds": 0.007721402798816594,"SearchPaid": 0.0010906791330182425, "Affiliate": 0.0001950824445423099},"countryShares": [{ "Country": 840, "CountryCode": "US", "Value": 0.477063909562973 },{ "Country": 250, "CountryCode": "FR", "Value": 0.0532218179406331 },{ "Country": 356, "CountryCode": "IN", "Value": 0.04886864781900952 }],"category": "science_and_education/science_and_education","snapshotDate": "2026-07-01T00:00:00+00:00","estimatedMonthlyVisits": { "2026-05-01": 25615117, "2026-06-01": 18046103, "2026-07-01": 22443884 },"endpointStatus": 200,"proxyUsed": false,"retrievedAt": "2026-08-22T04:32:32.199Z"}
The country list is cut short above; the row carries five.
| Field | What it is |
|---|---|
snapshotDate | The month the numbers describe. This is not the day you ran it, and the gap is usually weeks. |
totalVisits | Estimated visits for that snapshot month, across all devices Similarweb counts. |
bounceRate | A percentage, so 51.85 means 51.85%. |
visitDuration | Average time on site in seconds. |
trafficSources | Fractions of 1, not percentages, keyed the way Similarweb keys them. GenAi is its own channel. |
countryShares | Top countries as fractions of 1, with the ISO numeric code and the two-letter code. |
estimatedMonthlyVisits | The last three months of visit estimates, keyed by month. It is not a full history. |
category | Similarweb's own category path, like science_and_education/science_and_education. |
proxyUsed | Whether that row came from the first attempt or the retry. |
🧾 Reading the output
Every domain you sent produces exactly one row. ok tells you which kind it is.
| Row | How to spot it | Charged |
|---|---|---|
| A snapshot | ok: true and a snapshotDate | yes |
| The sample row | _sample: true | no |
| A failure | ok: false and an errorCode | no |
Run it with no domains at all and you get one labelled sample row, so you can see the shape before you commit a list.
errorCode | What it means |
|---|---|
BAD_INPUT | Not a usable public domain. An IP address, a localhost-style name, or credentials in the URL. |
REQUEST_FAILED | The domain has no DNS records, or the request could not be completed. Check the spelling. |
SIMILARWEB_NO_METRICS | Similarweb answered normally but published nothing usable for that site. Small and new domains do this. |
SIMILARWEB_ENDPOINT_BLOCKED | Similarweb turned the request down instead of answering. Try again later. |
CREDENTIALS_REQUIRED | Similarweb asked for a login for that request. |
Failure rows carry endpointStatus, contentType, bodyBytes and a 300-character bodySnippet,
which is usually enough to tell "this site has no data" apart from "Similarweb said no today".
▶️ How to run it
- Open Similarweb Traffic and Rank Scraper and click Try for free.
- Put your sites into Domains, one per line.
nasa.govandhttps://nasa.gov/both work. - Leave Concurrency and Request timeout alone unless a run came back short.
- Click Start.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$2.40 per 1,000 domains on the free plan, falling with your Apify plan to $0.65 per 1,000 on Diamond.
You pay per domain that came back with real numbers. Duplicates are removed before anything is
fetched, the sample row is not charged, and a domain that came back ok: false is not charged
either.
💡 What people use it for
- Sizing a list of prospects before anyone writes to them, so the 200-visit sites and the 20-million-visit sites get different treatment.
- Checking where a competitor's traffic actually comes from. A site living on
SearchOrganicand a site living onDisplayAdsare two different businesses. - Watching the
GenAishare across a set of sites, which is the one channel that has moved fastest. - Pulling
countrySharesfor a shortlist before deciding which market to translate a page into. - A monthly scheduled run over the same domain list, joined on
domainandsnapshotDate, so you build the history that the public snapshot does not give you.
🚧 What it does not do
- No live numbers. This is a monthly snapshot and
snapshotDateis often the month before last. - No history beyond three months.
estimatedMonthlyVisitsholds three points and that is all that is published. - No keyword data, no paid-search detail, no referring-site list, no audience demographics.
- Small sites often have nothing. Similarweb does not publish estimates for low-traffic domains,
and those come back
SIMILARWEB_NO_METRICSrather than as zeros. - Estimates, not analytics. These are Similarweb's modelled figures, not the site's own numbers, and they can be well off for any single domain.
- Subdomains and paths are reduced to the domain.
blog.example.comis not looked up separately fromexample.com. - Similarweb can refuse. When it does you get a row saying so, with the status and a snippet of what came back instead. Those rows are not charged.
- Rows are written at the end of the run, not one by one, so a run that hits its time limit writes nothing. Keep big lists inside the limit rather than sending 100 slow domains at once.
🧭 Which research scraper do you need?
| If you want | Use |
|---|---|
| Traffic, ranks and engagement for a domain | This one |
| Who ranks for a query on Google | Google Search Results Scraper |
| The same, on Yandex | Yandex Search Engine Scraper |
| Search interest over time and by region | Google Trends Scraper |
| Image results for a query | Google Images Scraper |
❓ Questions people ask
Do I need a Similarweb subscription? No. This reads the public snapshot, so there is nothing to log into and no quota to manage.
Why is the data a month or two old? Because that is what Similarweb publishes publicly. The
snapshotDate on every row tells you exactly which month you are looking at.
Why did my domain come back with no numbers? Most often the site is too small for Similarweb to
publish an estimate. The errorCode says SIMILARWEB_NO_METRICS and you are not charged for it.
Are the visit numbers accurate? They are estimates from a model, not the site's own analytics. Good for comparing sites against each other, weaker as an absolute figure for any one site.
Can I track a domain over time? Yes. Schedule it monthly and keep domain plus snapshotDate as
your key. That is the usual reason people run this on a schedule.
Is this legal? These are public figures on public pages. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the domain and the run ID. If you got an ok: false
row, its errorCode and bodySnippet usually explain it without anyone digging.