Similarweb Monthly Traffic Changes & Channel Comparison
Pricing
from $10.40 / 1,000 domain × month compareds
Similarweb Monthly Traffic Changes & Channel Comparison
Similarweb data you already scraped, compared across two different data months: per domain and month, visits change, channel and country share shifts, new and lost referrers and keywords, ranks, competitor share, data conflicts. AI and summaries on paid plans. 3 domains × 12 months: $1.89 on BRONZE.
Pricing
from $10.40 / 1,000 domain × month compareds
Rating
0.0
(0)
Developer
daehwan kim
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
4 days ago
Last modified
Share
You already scrape Similarweb. This Actor takes those results and turns them into one row per domain and month: how visits moved against the month before, which traffic channels moved with them, which countries, referring sites and search keywords came and went, how ranks and your share of a competitor group changed, and what in the data does not add up.
What it needs: two different data months of the same domain — the month the numbers are of (snapshotDate, engagementMonth), not the day you scraped. Two scrapes of the same data month are merged into one row (duplicate-snapshot conflict), not compared. One scrape whose rows carry a monthly-visits list (estimatedMonthlyVisits, monthlyVisits) also works: those months get visits-only rows.
It reads your data; it does not scrape. It shows what moved together in your data — not proof of what caused them: it will not tell you why traffic moved, only what moved with it.
| Free plan (preview) | Paid Apify plan | |
|---|---|---|
| Domain × month rows | the first 5 (domains in input order, newest month first): the verdict (up, down, steady, baseline, unknown) and one sign without numbers (the channel that moved most with the total) | every month (maxPeriodsPerDomain, default 12; maxPeriods a run, default 2,000), in full |
| Visits, channel, country, referral, keyword, rank and competitor-group numbers, measurement conflicts | locked — each locked field says how many a paid run gives for that row ({ "locked": true, "count": 2, "paidGets": "…" }) | all of them |
| AI explanation of each change (checked against the row's numbers) | locked — no model is called | on (aiExplanations), up to aiMaxPeriods a run |
| Domain and group summary rows | — | one per domain and one per group (summaries) |
| The last row | free-plan-preview: how many rows were found, how many are locked, what a paid run would add, its price estimate in the three ways to run it, and what this free run cost — all counted on your input | — |
| Price | FREE tier: a free run uses your plan's credit — at most $0.105 for a normal run ($0.005 run start + 5 × $0.02) | tier discount below |
The whole paid output is shown on fixed, made-up data below (Output) and in the preview row's example field.
Paid-plan discounts on every event (Apify store tiers):
| Tier | Discount |
|---|---|
| FREE | 0% |
| BRONZE | 20% |
| SILVER | 35% |
| GOLD, PLATINUM, DIAMOND | 48% |
Three ways to run it — the same 3 competitor domains × 12 months (36 rows, 33 with a comparison, 3 domain summaries and 1 group summary), BRONZE:
| Run | Switches | Price |
|---|---|---|
| Rules only | aiExplanations: false and summaries: false | $0.58 |
| Rules + summaries | aiExplanations: false | $0.836 |
| Everything (default) | both on | $1.892 |
Not in these prices: your Apify plan, and the runs of the scrapers that made your data. Inputs of more than 1,000 source rows add a rows-read event per further 1,000 rows (see Pricing). The free preview row gives these three prices for your own input.
What it is for
- "What moved with last month's drop?" — the row says visits went down 20% and that the estimated search visits fell by 25,200 while direct stayed flat: search moved with the drop. It does not say why.
- Competitor watch — run the same scraper every month on your site and three rivals; get each one's rank and share of the group, and which channel each one gained or lost share of.
- A sanity check before a report — channel shares that add up to 95%, a missing month, two snapshots of the same month that disagree, a monthly-visits list that restates a number, two months taken from two different scrapers: each is flagged on the row as a
conflictsentry. - New referrers and keywords — what entered and left the top lists since the month before.
Input
Give any of these (they can be mixed):
datasetIds— datasets in your Apify account from a Similarweb scraper. The fields of these scrapers are recognised by themselves: tri_angle/similarweb-scraper, tri_angle/fast-similarweb-scraper, curious_coder/similarweb-scraper, pro100chok/similarweb-scraper (percent values too), radeance/similarweb-scraper, vortex_data/similarweb-scraper and memo23/similarweb-scraper.csvUrls/jsonUrls— public file addresses. An Apify CSV export works as is (itstrafficSources/directVisitsShareandtopCountries/0/visitsSharecolumns are folded back, and dotted headers such asengagements.visitsare read as the fields they name), and so does your own monthly export withdomain,month,visitsand channel columns.snapshots— snapshots pasted as JSON in a scraper's shape.
What gives a comparison and what does not:
| Your input | What you get |
|---|---|
| The same domain in two different data months (e.g. a scrape in August and one in September) | a compared row for the later month (up/down/steady), a baseline row for the first |
| Two scrapes of the same data month (e.g. two days of the same week) | one row for that month (duplicate-snapshot conflict when their numbers differ), charged once — no comparison |
| One scrape with a monthly-visits list | one row per listed month, visits only (channels only where the snapshot has them) |
| One month of one domain | a baseline row (charged: the month was placed and checked, there is nothing to compare it with) |
Options: domains (keep only these), groups (competitor groups [{ "name": "...", "domains": [...] }]; with none given, all domains of the run form one group), compareTo (previous or year-ago), minVisitsChangePct (default 10), minShareChange (default 10 points), maxPeriodsPerDomain, maxPeriods, aiExplanations, aiMaxPeriods, summaries, maxItemsPerSource.
Output
Every row has recordType.
period — one domain and one month
The made-up example below (example-shop.com, 2026-09 against 2026-08, in a group with example-rival.com) is exactly what the rules give for the example input; the ai part is a real answer of the model about this row that passed our checks.
verdict: down — visits 120000 → 96000 (-20%).channels: search share 45% → 30% (-15 points), direct 40% → 50% (+10 points); with the estimated visits per channel (visits × share).movedWith: search -25200 visits (105% of the total change) — search moved with the drop; referral and mail rose a little.countriesEntered: FR ·countriesLeft: DE.referrals.new: coupons-example.org ·referrals.gone: deals-example.net ·keywords.new: example sale.groups[0]: share of the group's visits 37.5% → 29.4%; share of the group's search visits 35.1% → 18.5%; of its display visits 37.5% → 55.6% (tookFromexample-rival.com).conflicts: none here. Possible codes:channel-shares-not-100,country-shares-over-100,period-gap,duplicate-snapshot,visits-disagree,visits-restated, andsources-differ— the two months were read from two different scrapers' shapes, whose estimates often differ a lot (in the store examples, one scraper puts apify.com at 285,658 monthly visits and another at 1,911,397).ai(paid; the model's checked answer,claude-haiku-5-5):"Visits fell 20% from August to September, with search traffic dropping while direct share rose." change: search, down — "Search visits estimate fell from 54000 to 28800 and search share dropped 15 points, alongside a fall in the competitor group's search share." — facts:
search visits (estimate) 54000 → 28800 (-25200),search share of visits 45% → 30% (-15 points),share of the group's search visits 35.1% → 18.5% (-16.5 points)
On a free plan the same row reads verdict: "down", evidence: { "kind": "moved-with-total", "channel": "search", "direction": "down" }, and every other field above is { "locked": true, "count": …, "paidGets": "…" }.
Other fields: periodKey, domain, period, periodStart, periodEnd, comparedTo, comparedToBasis, visits (current, previous, change, changePct, source), channelsCompared, channelShifts, countries, countryShifts, keywords, ranks (global, country, category: current, previous, change — negative is a better place), note, sources, plan, locked, billedEvents, disclaimer.
domain-summary and group-summary (paid)
- Domain: visits first to last month, best and worst month, channel shares first to last, the three biggest monthly moves and the channels that moved with them, countries in and out, conflicts by code, the AI headlines.
- Group: the ranking by visits for every month, rank changes first to last, and per channel, who took share of the group's visits from that channel and who lost it (
channelShareTakers).
Notices and the run report
noticeCode rows explain what was skipped or stopped (not charged): source-unreadable, source-no-snapshots, source-parse-error (CSV rows with more cells than the header are left out: skippedRows and the first line; at a row that is not valid CSV — a quote never closed, or text right after a closing quote — reading of that file stops: the rows before it are read, from its line on (notReadFromLine, restNotRead: true) nothing is read or charged, and that part is said to be not read, not invalid), rows-skipped, duplicate-input, input-limit, reading-stopped, charge-limit-reached, ai-off, ai-stopped-charge-limit, free-plan-preview and others. A run-started-marker row (not charged) is written right before the run-start fee is asked for, so that a restarted run never asks for that fee twice; a rows-read-marker row (not charged) does the same right before each charge of rows-read events. A limits row and the RUN-SUMMARY key-value record hold the run's numbers (reading: rows read and rows-read events).
The AI layer (paid plans)
For every month with a comparison and visits on both sides, the model (Anthropic claude-haiku-5-5) gets the row's numbers as numbered facts and writes what moved and what moved with it. Our code checks every answer before it is delivered or charged:
- every change cites facts that were sent, and at least one cited fact of the change's own factor moved the way the change says;
- every number it writes is in the data;
- it states no cause ("because", "due to", "caused", "led to", "drove", "thanks to"…) — the data shows what moved together, not why;
- no e-mail or web address.
An answer that fails is thrown away and not charged; the row keeps its rule comparison. Measured on 24 month rows (11 from the scrapers' public store examples, 13 built for Korean and English sites) before release: 23 answers passed the checks. When AI is on, the row's numbers, domain names and keywords are sent to Anthropic's API (USA). Free runs never call the model.
Pricing
Pay per event; the list price (FREE tier) and the BRONZE price:
| Event | What one is | FREE | BRONZE |
|---|---|---|---|
run-started | once per run that has something to read, before reading — it pays for the first 1,000 source rows | $0.005 | $0.004 |
rows-read | paid plans: each further 1,000 source rows read (or part of them) — dataset rows, file rows, snapshots entries, also rows that are not snapshots | $0.002 | $0.0016 |
period-compared | one domain×month row — also a baseline, steady or conflicting one | $0.02 | $0.016 |
change-explained | one AI explanation that passed the checks (paid plans) | $0.04 | $0.032 |
domain-summary | one domain or group summary row (paid plans) | $0.08 | $0.064 |
Example: 3 domains × 12 months = 36 rows (36 source rows: no rows-read), 33 with a comparison, 3 domain summaries and 1 group summary → BRONZE $0.004 + 36 × $0.016 + 33 × $0.032 + 4 × $0.064 = $1.892; rules only $0.58; rules + summaries $0.836. A dataset of 5,000 rows adds 4 × $0.0016 = $0.0064.
Your run's maximum charge is respected. The run asks before it reads: when the maximum charge no longer pays for the next 1,000 rows next to the rows of what it has read, it stops reading (reading-stopped) and compares what it read. It stops at the limit (SUCCEEDED) with a charge-limit-reached row, and when only the AI explanations no longer fit it stops those and goes on with the rule rows. A free run reads up to 5,000 source rows without rows-read; past that its counts are lower bounds. Platform usage is not passed on. Two runs started at the same time on the same input each deliver and charge their own rows.
Results are delivered first and charged after, and a row is never charged twice. A restarted run does not pay again for rows it already paid to read; if the platform's charge count does not yet show an earlier reading charge, that charge is not made again, it counts against your maximum charge, and reading stops where the count ends (run the same input again as a new run to read the rest). It first checks the platform's own charge count against the rows it already delivered; if some of them are not shown as charged, it does not charge them again and stops there. If a charge call fails, nothing more is delivered until the platform's own count shows it went through; if it does not show it, that charge is not made again and the run stops.
Limits and accuracy
- Similarweb numbers are third-party estimates; this Actor lines them up and flags where they disagree, it does not correct them. Visits by channel are visits × share (estimates).
- A domain's share of a group is counted over the members with data in both months.
- At most 50 datasets and files, 100,000 snapshots and 20,000 domain×month rows a run; at most 500
domains, 50groupsand 50 domains in a group. What an input limit leaves out is said in aninput-limitrow, inlimits.input(snapshotsLeftOut,domainsLeftOut,groupsLeftOut,groupMembersLeftOut) and in the status message.
Responsibility
Unofficial tool, not affiliated with, endorsed by or sponsored by Similarweb or any scraper whose output it reads. It analyses only the data you supply and sends no messages. You are responsible for having the right to use this data and for complying with the law and the terms of the services it comes from. Every result row carries this notice in disclaimer.