Website Traffic Estimator: Similarweb Visits & Rank avatar

Website Traffic Estimator: Similarweb Visits & Rank

Pricing

from $1.40 / 1,000 domain checkeds

Go to Apify Store
Website Traffic Estimator: Similarweb Visits & Rank

Website Traffic Estimator: Similarweb Visits & Rank

Check monthly visits, global rank, traffic sources, top countries and keywords for a list of websites from public Similarweb estimates. Compare competitors, score leads and monitor traffic changes. No login or API key.

Pricing

from $1.40 / 1,000 domain checkeds

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Features

Limited permissions

Share

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.

Use it to compare competitors, score leads and monitor traffic. No login or API key is needed. The smallest run is one domain, such as apify.com: it costs $0.004 on the Free plan and usually finishes in under a minute.

Website Traffic Estimator: add domains, get monthly visits, global rank and traffic sources for each website

Table of contents

What it does

You add domains or website URLs. For each domain the Actor returns one dataset row with the latest public Similarweb estimate:

  • 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.

It does not need a Similarweb account, login or cookies. All numbers are estimates from the public source, not data from the site's own analytics.

Good fit

  • 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.

👉 Try it now: open the input form

How it works

  1. The Actor reads your list, removes www, duplicates and broken entries, and keeps one entry per domain.
  2. For each domain it opens the public Similarweb website profile and reads the estimate. If you turn on the fallback, it can also try SimilarSites and the Tranco list.
  3. It saves one row per domain in the dataset, a RUN_SUMMARY report and a COMPARISON table sorted by visits in the key-value store. In monitor mode it also compares each domain with your last run.

👉 Try it now: open the input form

Quick start

Input form: box 1 is the Websites list with apify.com

  1. Open the Input tab. The Websites list already has apify.com (box 1; the picture shows only this field).

  2. Add your own domains or URLs, one per line. You can keep the other settings as they are.

  3. Click Start at the bottom of the page (below the picture's frame).

  4. When the run finishes, open the Output tab and choose the Traffic comparison view (box 4).

  5. Check status, visits and globalRank for each domain (box 5).

    Output table: box 4 is the Traffic comparison view, box 5 covers status, visits and globalRank for apify.com

Expected result: one row for apify.com with status: complete, about 4 million monthly visits and a global rank near 10,000 (the numbers change every month). Channel shares are filled when channelDataStatus is available; if it is unavailable, visits and rank are still there and the shares stay null.

👉 Try it now: open the input form

Use cases

Buyer jobInput pathOutput entityKey fieldsNext integration
Compare competitorsdomainsOne row per domainvisits, globalRank, organicShare, paidShareExport CSV or Excel; COMPARISON record
Score or filter a lead listdomains, minMonthlyVisits, maxGlobalRank, countriesRows that match the filtersvisits, globalRank, countryCode, categoryAPI or Make / Zapier into your CRM
Track traffic over timemode: monitor, stateName, onlyChangesNew or changed profileschangeStatus, visitsChangePercent, monthlyVisitsApify schedule + Slack or Notion summary
Research SEO and channelsdomains, includeSources, includeDetailsFull traffic profiletopKeywords, organicShare, topReferrers, similarSitesSpreadsheet with outputFormat: flat

👉 Try it now: open the input form

Input

Input fields

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffect
domainsWebsitesarray of stringsyes, or one of the two lists belowprefill ["apify.com"]domains or full URLsThe domains to check. www and duplicates are removed. Other subdomains stay separate. Broken entries are skipped and counted in RUN_SUMMARY.invalidEntries.
domainsTextPaste a liststringnoemptycommas, spaces or new linesAdded to Websites. Handy for pasting a long list.
websitesAdditional websitesarray of stringsnoemptydomains or URLsAdded to Websites. For API callers that already use this name.
modeRun modestringnolookuplookup, monitormonitor compares this run with your saved state.
stateNameMonitor store namestringin monitor modeempty3–63 letters, digits or hyphensName of the store that keeps the last results. Reuse it for the same list.
onlyChangesOnly changed profilesbooleannofalseIn monitor mode, write only new or changed profiles.
includeSourcesTraffic sourcesbooleannotrueAdds channel shares and the trafficSources list.
includeCountriesTop countriesbooleannotrueAdds topCountries with traffic shares.
includeDetailsMore public databooleannotrueAdds company, audience, keywords, referrals, social networks, ads, technologies, similar sites and rank history.
includeAiTrafficAI referral reportbooleannofalseAdds AI chatbot referrals and prompts. Costs one extra AI check per domain.
fallbackToOpenDataUse fallback databooleannofalseIf Similarweb fails, try SimilarSites and Tranco. These rows are partial.
outputFormatRow formatstringnofullfull, flatflat turns lists into JSON text columns that end in Json, for spreadsheets.
minMonthlyVisitsMinimum monthly visitsintegerno0 (off)0 or moreWrite only profiles with at least this many visits.
maxGlobalRankLargest global rank numberintegerno0 (off)0 or more100 keeps ranks 1–100.
countriesMain audience countriesarray of stringsno[] (off)two-letter codes like US, GBKeep profiles whose main country is in the list.
categoryFilterCategory containsstringnoempty (off)any textKeep profiles whose category contains this text.
proxyModeConnection routestringnoautoauto, direct, datacenter, residentialauto tries direct, datacenter and residential routes in that order and stops at the first one that works.
maxConcurrencyParallel domain checksintegerno41–15Lower it if the source asks you to slow down.
deliveryConnectorSend results to (optional)stringnoemptyyour MCP connectorPosts a short summary to Slack, Notion or another connector.
deliveryTargetNotion page or channel (optional)stringnoemptyNotion page link or Slack channel IDWhere the summary goes.

An empty list stops the run with DOMAINS_REQUIRED. A list where every entry is broken stops with INVALID_DOMAIN. The Actor sets no fixed list size; your timeout and charge limit decide how many domains one run checks. Tested: 100 domains on the default 300-second timeout. Five of seven runs finished in 151 to 226 seconds. Two runs reached the timeout and stopped partway, after 88 and 96 domains; only the checked domains were charged. For lists above about 50 domains, set the run timeout to 600 seconds or split the list into batches. Lists above 100 domains were not tested.

Interacting settings

WhenInput AInput BEffective behaviorCost/result effect
You use filtersminMonthlyVisits, maxGlobalRank, countries, categoryFilter—All filters must match. Rows that fail are not written.Every checked domain is charged, also filtered ones.
You monitormode: monitoronlyChanges: trueUnchanged profiles are not written.Unchanged domains are still charged.
You monitormode: monitorstateName emptyThe run stops before any check.Only the start fee.
You force a routeproxyMode: direct, datacenter or residential—Every source request uses only that route. If it is blocked, the domain gets status: error.Same domain check charge; no extra route charge.

Input examples

Compare a few competitors

{
"domains": ["apify.com", "scraperapi.com", "brightdata.com"]
}

Expected behavior: the Actor checks 3 domains with the default settings. Expected output: 3 rows with visits, globalRank, channel shares and topCountries. Cost note: start fee plus 3 domain checks.

Weekly monitoring of large sites only

{
"domains": ["apify.com", "scraperapi.com", "brightdata.com"],
"mode": "monitor",
"stateName": "competitors-weekly",
"onlyChanges": true,
"minMonthlyVisits": 100000
}

Expected behavior: the first run marks every domain new. Later runs write only profiles marked increased, decreased or changed. Expected output: rows with changeStatus and visitsChangePercent. Cost note: every checked domain is charged, also unchanged ones.

👉 Try it now: open the input form

Output

Output fields

The main fields are below. Full rows also have rank history, rank competitors, top referrers, social networks, advertising, technologies and interests.

FieldMeaningTypeCan be empty?Example / enum
domainChecked domainstringnoapify.com
statusResult of the checkstringnocomplete, partial, not_found, error
reasonWhy a row is not completestringyesNO_DATA, FALLBACK_UNDATED, SOURCE_RATE_LIMIT
source, sourceUrlWhere the estimate comes fromstringyessimilarweb
snapshotDateMonth of the estimatestringyes2026-09-01
visitsEstimated monthly visitsnumberyes3990936
changePercentChange from the previous month, in percentnumberyes-5.01
monthlyVisitsUp to 3 months of visitsarrayyes[{ "month": "2026-09-01", "visits": 3990936 }]
globalRank, countryRank, categoryRankRanks; 1 is the biggestnumberyes9800, 9730, 272
countryCodeMain audience countrystringyesUS
bounceRateShare of one-page visits, 0–1numberyes0.3595
pagesPerVisit, avgVisitSecPages per visit, visit length in secondsnumberyes7.61, 317
directShare, organicShare, paidShare, referralsShare, social_organicShare, mailShare, adsShare, gen_aiShareTraffic source shares, 0–1 (not percent)numberyes0.44, 0.34
channelDataStatusWhether channel shares were foundstringyesavailable, unavailable
topCountriesCountries with traffic sharearrayyes[{ "countryCode": "US", "share": 0.221 }]
topKeywordsSearch keywords with volume and CPCarrayyes[{ "keyword": "apify", "volume": 798490 }]
similarSitesSimilar websitesarrayyes[{ "domain": "brightdata.com" }]
companyPublic company factsobjectyes{ "name": "Apify", "yearFounded": 2016 }
changeStatusMonitor resultstringnonot_monitored, new, unchanged, increased, decreased, changed
visitsChangePercentChange in visits since your last monitor runnumberyes12.5
aiTraffic, aiTrafficStatusAI chatbot traffic, only when includeAiTraffic is onobject, stringyesavailable, unavailable
fetchedAtWhen the row was madestringnoISO date and time

Output entities and surfaces

SituationWhereResult shapeUser action
Normal itemDataset, views Traffic comparison, Traffic sources, History and monitoring, Audience shares, CompanyOne row per domain, status: completeOpen a view, export, or read visits and globalRank
No estimate for a domainDatasetstatus: not_found, reason: NO_DATA, metrics nullCheck the spelling. Very small sites often have no estimate.
Partial resultDatasetstatus: partial; some fields nullRead source and reason. Fallback rows have no known month.
Channel shares missingDataset and RUN_SUMMARY.channelDataUnavailablestatus: complete, channelDataStatus: unavailable, share fields nullRun the domain again later
Technical failureDataset and RUN_SUMMARYstatus: error with a reason codeRun again later or lower maxConcurrency
Run reportKey-value store RUN_SUMMARYCounts, status, stopReason, invalidEntries, channelDataUnavailable, warnings, deliveryCheck why a run stopped early
Side-by-side tableKey-value store COMPARISONRows sorted by visitsCompare domains quickly
AI referral report (opt-in)Dataset, views AI referrals and AI report detailsAI fields filled only when AI referral report is onTurn on AI referral report; it adds the ai-checked charge

Output example

{
"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
}

This example is trimmed and shows one row from a real run. null means the source did not publish that value. The Actor never fills a gap with a guess.

Send results to Slack or Notion

Pick your connector in the optional deliveryConnector field. After the run saves its data, the Actor posts a short summary (up to 25 rows and a link to the full dataset) there. Put a Notion page link or a Slack channel ID in deliveryTarget: in Notion every run is added on top of that one page, so your workspace does not fill up with new pages. A delivery error never fails the run and costs nothing extra. Connect a service once in Apify Console → MCP connectors.

Each summary line looks like apify.com — complete — 3,990,936 visits — global rank 9800.

👉 Try it now: open the input form

Pricing

Pricing unit

You pay per event. Platform usage is included in these prices: the Actor's developer pays Apify for it, so you get no separate usage bill.

EventWhen it is chargedFree plan priceDiscounts
Actor startOnce per run$0.002same on all plans
Domain checkEach domain the Actor checks$0.002−10% / −20% / −30% on Bronze / Silver / Gold and higher
AI checkEach checked domain, only when includeAiTraffic is on$0.0078−10% / −20% / −30%

The start fee is counted per GB of run memory. This Actor runs with 256–512 MB, so it is one start fee per run.

A domain check costs the same for every result: complete, partial, not_found, error, a row removed by your filters, or an unchanged row in monitor mode. Broken entries that the Actor skips are free. An invalid input (for example, no domains) costs only the start fee. When your charge limit is reached, the run stops with stopReason: CHARGE_LIMIT and the remaining domains are not charged.

Proxy routes are included in the domain check price. There is no extra charge for a retry on another route.

Cost examples

Free plan, default settings, no AI:

ScenarioInput scopeDomain checksBase chargeOptional chargeStop/cap behavior
Smallest run1 domain1$0.004noneMinimum charge limit is $0.004
Competitor list10 domains10$0.022+$0.078 with AIStops at your charge limit
Lead list100 domains100$0.202+$0.78 with AIStops at your charge limit
Large list1,000 domains1,000$2.002+$7.80 with AINeeds a longer timeout (the time is an estimate, not tested)

On the Gold plan, 1,000 domains cost $1.402. A list this large was not tested; the largest tested run is 100 domains.

👉 Try it now: open the input form

Limits

  • 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, channelDataStatus is unavailable, and RUN_SUMMARY.channelDataUnavailable counts 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.
  • Similarweb terms limit automated reuse of its data. Check that your use fits them.

👉 Try it now: open the input form

API, export and integrations

  • API: start a run with POST https://api.apify.com/v2/acts/cliqtomedia~website-traffic-estimator/runs and the input JSON. Read rows from the run's default dataset.
  • Export: download the dataset as JSON, CSV, Excel, XML or HTML. Use outputFormat: flat for clean spreadsheet columns.
  • Scheduling: create an Apify schedule with mode: monitor and a fixed stateName to track the same list every week.
  • Webhooks / no-code: use an Apify webhook, Make, Zapier or n8n on run success, then read visits and globalRank from the dataset.
  • Slack / Notion: set deliveryConnector to get a short summary after each run.

Use with AI agents (MCP)

  • MCP server URL with only this Actor: https://mcp.apify.com?tools=cliqtomedia/website-traffic-estimator
  • Smallest useful input: {"domains": ["apify.com"]}
  • Key output fields: visits (estimated monthly visits), globalRank (1 is the biggest site), organicShare (search share, 0–1), topCountries (main countries with shares) and status (complete, partial, not_found, error).
  • A one-domain run with default settings costs $0.004 on the Free plan and usually finishes in under a minute.
  • Limits: a domain check is charged also for not_found and filtered rows; the default timeout is 300 seconds.

👉 Try it now: open the input form

Troubleshooting

Every row says not_found

Symptom: rows have status: not_found and reason: NO_DATA. Likely reason: the sites are too small for a public estimate, or the domain is misspelled. Check: open the sourceUrl of one row in a browser. Action: fix the spelling, or turn on fallbackToOpenData to get a SimilarSites or Tranco value.

Rows have status: error

Symptom: some rows have status: error and a reason such as SOURCE_RATE_LIMIT. Likely reason: the source slowed or blocked requests. Check: read RUN_SUMMARY for stopReason and the error count. Action: run those domains again later, or lower maxConcurrency to 1–2.

The run stopped before the end of the list

Symptom: RUN_SUMMARY.stopReason is CHARGE_LIMIT or DEADLINE. Likely reason: your charge limit or the run timeout was reached. With DEADLINE after some domains were checked, the run ends as succeeded with a partial status message, and the rows it saved stay in the dataset. A DEADLINE before any domain was checked ends as failed. Check: RUN_SUMMARY.unprocessedDomains lists the domains that were not checked. They were not charged. Action: raise the maximum charge or the run timeout, then run the unprocessed domains.

Channel shares are empty

Symptom: channelDataStatus: unavailable and directShare, organicShare and the other shares are null. Likely reason: the second public source for channel shares did not answer for this domain. Check: RUN_SUMMARY.channelDataUnavailable shows how many rows have this. Action: run those domains again later. Visits and rank in the same row are still valid.

Some of my domains are missing

Symptom: fewer rows than entries in your list. Likely reason: duplicates and www copies were merged, broken entries were skipped (see RUN_SUMMARY.invalidEntries), or your filters removed rows. Action: check RUN_SUMMARY and turn off filters to see every checked domain.

👉 Try it now: open the input form

FAQ

Do I need a Similarweb account?

No. The Actor reads public website profiles. No login, cookies or API key are needed.

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.

👉 Try it now: open the input form

👉 Try it now: open the input form

Support

For a bug, question or feature request, open the Actor's Issues tab on Apify. Include the run ID, the mode you used and the reason code you see. Never send tokens, cookies or private data.

👉 Try it now: open the input form