How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
apify.comin Websites. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Website Traffic Estimator checks a list of websites and returns public Similarweb traffic estimates for each domain: monthly visits, global and country rank, engagement, traffic sources, top countries and keywords.
- Traffic: monthly visits, change from the previous month and up to 3 months of visit history.
- Ranks: global rank, rank in the main country and rank in the site category.
- Engagement: bounce rate, pages per visit and average visit time.
- Traffic sources: shares of direct, search, paid, referral, social, email, display ads and AI chatbot traffic.
- Audience: top countries, top keywords with search volume, similar sites and public company facts.
Good for
- Compare the traffic of competitors or partners in one table.
- Score a lead list by monthly visits or global rank, and drop small sites with a filter.
- Watch a list of domains every week or month and see which sites grew or fell.
Who uses it
Marketers
Compare the traffic of competitors in one table.
Sales teams
Score a lead list by monthly visits or rank.
Partnership teams
Watch a list of domains and see which sites grow.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Domain checked | $0.002 (from $0.0014 on paid Apify plans) | One domain check with public traffic, channels and keywords, including unavailable, filtered, unchanged and failed profiles. Run start is charged separately. |
| AI referral check | $0.0078 (from $0.00546 on paid Apify plans) | Additional public AI referral report check when enabled, including unavailable reports. |
| Start fee | $0.002 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
Examples
- One domain: about $0.004.
- 1,000 domains: about $2.00.
- Every day 100 domains, for 30 days: about $6.06 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 2,400 domains.
Prices checked on 8 November 2026. See the current price on Apify.
Questions
Do I need a Similarweb account?
No. The tool reads public website profiles. No login, cookies or API key.
How exact are the visits?
They are estimates for one month. Use them to compare sites, not as exact counts.
Why does a domain return not_found?
Small sites often have no estimate. Every checked domain is charged, also not_found.
How accurate are the visits?
They are Similarweb estimates for one month. Use them to compare sites with each other, not as exact counts. For big sites they are usually close; for small sites they are rough or missing.
Why do the shares not add up to 100%?
Shares are fractions from 0 to 1, and the source can hide some channels. Hidden shares are null. If channelDataStatus is unavailable, all shares are null for that row.
Do I pay for domains with no data?
Yes. Every checked domain is charged the same, also not_found and filtered rows. Skipped broken entries and domains left after a charge limit stop are free.
How fresh is the data?
Each row has snapshotDate, the month of the estimate. The source updates it about once a month.
Details
Step by step on Apify
- Open the Input tab. The Websites list already has
apify.com(box 1; the picture shows only this field). - Add your own domains or URLs, one per line. You can keep the other settings as they are.
- Click Start at the bottom of the page (below the picture's frame).
- When the run finishes, open the Output tab and choose the Traffic comparison view (box 4).
- Check
status,visitsandglobalRankfor each domain (box 5).
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Compare competitors | domains | One row per domain | visits, globalRank, organicShare, paidShare | Export CSV or Excel; COMPARISON record |
| Score or filter a lead list | domains, minMonthlyVisits, maxGlobalRank, countries | Rows that match the filters | visits, globalRank, countryCode, category | API or Make / Zapier into your CRM |
| Track traffic over time | mode: monitor, stateName, onlyChanges | New or changed profiles | changeStatus, visitsChangePercent, monthlyVisits | Apify schedule + Slack or Notion summary |
| Research SEO and channels | domains, includeSources, includeDetails | Full traffic profile | topKeywords, organicShare, topReferrers, similarSites | Spreadsheet with outputFormat: flat |
Tips for better results
- Start with one domain such as apify.com to see the columns.
- For more than about 50 domains, set the timeout to 600 seconds or split the list.
- Set a minimum of monthly visits to drop small sites.
Limits and good to know
- All numbers are public Similarweb estimates. They are not exact and can differ from the site's own analytics
- The source publishes one month at a time and up to 3 months of history. The Actor does not make older history
- Small sites often have no estimate. They return
not_found - Some shares and names are hidden by the source. They stay
null - Channel shares come from a second public source. If it does not answer, the row keeps visits and rank,
channelDataStatusisunavailable, andRUN_SUMMARY.channelDataUnavailablecounts these rows. The domain check is charged the same - Fallback rows from SimilarSites have no known month. Tranco gives a popularity rank, not visits
- The source can block or slow requests. The Actor then retries on other connection routes. 100% coverage is not promised
- The default timeout is 300 seconds. That fits about 50 domains with a safe margin. With 100 domains, five of seven test runs finished in 151 to 226 seconds and two stopped at the timeout after 88 and 96 domains. For lists above about 50 domains, set the timeout to 600 seconds in the run options or split the list into batches
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"domain": "apify.com",
"status": "complete",
"source": "similarweb",
"snapshotDate": "2026-09-01",
"visits": 3990936,
"changePercent": -5.01,
"globalRank": 9800,
"countryRank": 9730,
"countryCode": "US",
"categoryRank": 272,
"bounceRate": 0.3595,
"pagesPerVisit": 7.61,
"avgVisitSec": 317,
"directShare": 0.44,
"organicShare": 0.34,
"paidShare": 0.056,
"referralsShare": 0.058,
"social_organicShare": 0.048,
"gen_aiShare": 0.034,
"channelDataStatus": "available",
"topCountries": [{ "countryCode": "US", "share": 0.2211 }],
"topKeywords": [{ "keyword": "apify", "volume": 798490, "cpc": 1.56 }],
"similarSites": [{ "domain": "brightdata.com" }],
"company": { "name": "Apify", "yearFounded": 2016, "city": "Vancouver" },
"changeStatus": "not_monitored",
"reason": null
}Use it from code
Actor ID: cliqtomedia/website-traffic-estimator. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/website-traffic-estimator").call(run_input={
"domains": [
"apify.com"
],
"mode": "lookup"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~website-traffic-estimator/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"domains": ["apify.com"], "mode": "lookup"}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/website-traffic-estimator")
result = tool.invoke({"run_input": {"domains": ["apify.com"], "mode": "lookup"}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (40)
| Field | Type | Meaning |
|---|---|---|
domain | string | Normalized input domain. |
status | string | complete, partial, not_found or error. |
source | string | Data provider. SimilarSites fallback has no known measurement month. |
sourceUrl | string | Public page for this profile. |
fetchedAt | string | UTC time this profile was collected. |
changeStatus | string | Monitor result: new, unchanged, increased, decreased, changed or not_monitored. |
reason | string | Reason for partial, missing or failed data. |
snapshotDate | string | Measurement month published by Similarweb. Null for undated fallback. |
sourceDomain | string | Domain reported by the source. It may be a parent domain. |
countryCode | string | Main audience country, as a two-letter code. |
category | string | Source category path. |
title | string | Public company name, when available. |
trancoDate | string | Date of the Tranco rank. |
visits | number | Estimated visits in the snapshot month. Fallback visits have no known month. |
globalRank | number | Similarweb global rank. 1 is the highest rank. |
countryRank | number | Similarweb rank in the main audience country. |
categoryRank | number | Source category rank. Check source before comparing. |
bounceRate | number | Bounce rate as a fraction from 0 to 1. |
pagesPerVisit | number | Average pages per visit. |
avgVisitSec | number | Average visit duration in seconds. |
changePercent | number | Monthly visit change in percent. |
visitsChangePercent | number | Visit change since the previous monitor observation, in percent. |
trancoRank | number | Tranco popularity rank, separate from Similarweb rank. |
organicSearchShare | number | Organic share of search traffic only, from 0 to 1. |
paidSearchShare | number | Paid share of search traffic only, from 0 to 1. |
directShare | number | Available direct share of traffic, from 0 to 1. Hidden shares are null. |
organicShare | number | Available organic share of traffic, from 0 to 1. Hidden shares are null. |
paidShare | number | Available paid share of traffic, from 0 to 1. Hidden shares are null. |
referralsShare | number | Available referrals share of traffic, from 0 to 1. Hidden shares are null. |
social_organicShare | number | Available social organic share of traffic, from 0 to 1. Hidden shares are null. |
social_paidShare | number | Available social paid share of traffic, from 0 to 1. Hidden shares are null. |
mailShare | number | Available mail share of traffic, from 0 to 1. Hidden shares are null. |
adsShare | number | Available ads share of traffic, from 0 to 1. Hidden shares are null. |
gen_aiShare | number | Available gen ai share of traffic, from 0 to 1. Hidden shares are null. |
affiliateShare | number | Available affiliate share of traffic, from 0 to 1. Hidden shares are null. |
isEstimate | boolean | True: traffic metrics are estimates, not private analytics. |
monthlyVisits | array | Monthly estimates. Older visits are calculated from the latest count and published month changes. Each item states its method. |
monthlyVisitsJson | string | Monthly estimates. Older visits are calculated from the latest count and published month changes. Each item states its method. JSON text in flat mode. |
trafficSources | array | Channel names, available shares and channel ranks. Hidden shares stay null. |
trafficSourcesJson | string | Channel names, available shares and channel ranks. Hidden shares stay null. JSON text in flat mode. |
Input settings (20)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Websites | domains | array | ["apify.com"] |
| Paste a list | domainsText | string | |
| Run mode | mode | string | "lookup" |
| Monitor store name | stateName | string | |
| Traffic sources | includeSources | boolean | true |
| Top countries | includeCountries | boolean | true |
| More public data | includeDetails | boolean | true |
| Only changed profiles | onlyChanges | boolean | false |
| Use fallback data | fallbackToOpenData | boolean | false |
| Row format | outputFormat | string | "full" |
| Minimum monthly visits | minMonthlyVisits | integer | 0 |
| Largest global rank number | maxGlobalRank | integer | 0 |
| Main audience countries | countries | array | [] |
| Category contains | categoryFilter | string | "" |
| AI referral report | includeAiTraffic | boolean | false |
| Connection route | proxyMode | string | "auto" |
| Parallel domain checks | maxConcurrency | integer | 4 |
| Additional websites | websites | array | |
| Send results to (optional) | deliveryConnector | string | |
| Notion page or channel (optional) | deliveryTarget | string |
