This morning I wanted a quick answer to a simple question: how do the privacy-first analytics tools split Google search traffic between them? Plausible, Fathom, Simple Analytics. I didn't want to open a suite, export three CSVs and clean them up. I wanted one API call per question and rows I could drop into a script.
So I ran my own Apify Actor, Domain SEO Data, on plausible.io. Below is what came back, what it cost, the code I used, and where other tools on the Apify Store are simply better.
(The Store links here carry my Apify affiliate ID, so Apify pays me a small commission if you sign up through one.)
The run
I started from the Actor's public "Website Traffic Checker" preset (overview plus backlink profile) and asked for 10 ranked keywords and 3 competitors on top:
{
"mode": "report",
"domains": ["plausible.io"],
"countries": ["US"],
"maxKeywords": 10,
"maxCompetitors": 3,
"includeBacklinks": true
}
It finished in about 6 seconds and returned 14 rows: one overview row, 10 keyword rows and 3 competitor rows.
What plausible.io looks like in US Google
| Metric | Value |
|---|---|
| Estimated monthly organic visits (US) | 6,893 |
| Ranking keywords (top 100) | 1,535 |
| Top 3 / top 10 | 139 / 466 |
| Estimated traffic value per month | $103,331 |
| Keywords new / up / down / lost since the last update | 1,035 / 206 / 214 / 756 |
| Paid search traffic | 0 |
| Domain rank (0 to 100) | 73 |
| Backlinks / referring domains | 637,979 / 16,940 |
| Backlink spam score | 15 |
The first thing that jumped out was how brand-heavy it is. The keyword "plausible" alone (60,500 searches a month, position 1) accounts for about 5,338 of those 6,893 estimated visits. That's 77%. For a company that writes a lot of content, I expected more of the traffic to come from the blog.
The second thing was the backlink profile. About 206,000 of the 638,000 backlinks come from .se domains. That smells like a handful of sitewide links (footer or "analytics by" badges) rather than 200,000 editorial mentions. Referring domains (16,940) is the number I'd trust here, not the raw backlink count.
The traffic number is DataForSEO's click model for Google organic results. It is not total visits, and it won't match Plausible's own dashboard or Similarweb. I only compare domains inside one source.
The keywords it ranks for
These came back sorted by estimated traffic, which is the default:
| Keyword | Position | Monthly searches | Ranking URL |
|---|---|---|---|
| plausible | 1 | 60,500 | / |
| plausible analytics | 1 | 1,900 | / |
| google analytics | 66 | 450,000 | / |
| plausible.io | 1 | 170 | / |
| plausible logo | 1 | 210 | / |
| what is plausible | 1 | 720 | / |
| free web analytics service | 13 | 12,100 | /open-source-website-analytics |
| shopify analytics | 5 | 1,600 | /blog/shopify-analytics |
| plausible io | 1 | 170 | / |
| google analytics alternatives | 2 | 720 | / |
One row I don't fully believe: "google analytics" at position 66 gets credited with about 284 visits a month. That's the click model doing math on a 450,000-search keyword. Nobody clicks through to page 7 that often. If you're building a report for a client, I'd filter out anything below position 20 before summing traffic (the Actor has a maxPosition input for exactly this).
The useful find was "shopify analytics" at position 5 with a blog post. That's the kind of content keyword a competitor could go after, and it's the reason people search "competitor keywords" in the first place.
The SEO competitors
| Competitor | Shared keywords | Share of plausible.io's keywords |
|---|---|---|
| semrush.com | 600 | 39.1% |
| backlinko.com | 489 | 31.9% |
| hubspot.com | 485 | 31.6% |
Not Fathom. Not Matomo. Plausible's search competitors are SEO and marketing publishers, because so much of its non-brand content is about analytics and marketing topics. If you want product competitors, you have to name them yourself. That's what bulk mode is for.
Bulk mode: three analytics tools side by side
Bulk mode returns one row per domain (traffic, keyword count, domain rank) and is meant for long lists. I ran it with three:
| Domain | Est. US organic visits | Ranking keywords | Domain rank |
|---|---|---|---|
| plausible.io | 6,893 | 1,535 | 73 |
| usefathom.com | 1,883 | 781 | 73 |
| simpleanalytics.com | 1,125 | 4,261 | 76 |
Simple Analytics ranks for almost three times as many keywords as Plausible but gets about a sixth of the estimated traffic. Lots of long-tail positions, not many clicks. That one table answered my original question better than an hour of clicking around would have.
What it cost
Prices come from the Actor's current pay-per-event pricing on the Store:
| Event | Count | Price | Total |
|---|---|---|---|
| Run start | 1 | $0.005 | $0.005 |
| Domain overview | 1 | $0.02 | $0.02 |
| Ranked keyword | 10 | $0.001 | $0.010 |
| Competitor | 3 | $0.004 | $0.012 |
| Backlink profile | 1 | $0.05 | $0.05 |
| Total | $0.097 |
The bulk run was $0.005 to start, $0.003 per domain and $0.05 per batch of up to 1,000 domains, so $0.064 for three. That batch fee makes bulk silly for three domains and cheap for 1,000 (about $3.06). Domains with no search data aren't charged in report mode.
The public presets worth starting from are Website Traffic Checker (overview plus backlinks, about $0.075), Find a Website's SEO Competitors (25 competitors, up to $0.125) and the Domain Overview Report (100 keywords, 10 competitors and backlinks, up to $0.215).
How it compares with other Apify Actors
I checked these on the Apify API today (October 23, 2026). Prices are per 1,000 results on the free Apify plan unless noted.
| Actor | Data source | What it returns | Price per 1,000 |
|---|---|---|---|
| vncntlabs/domain-seo-data | DataForSEO API | Google organic and paid estimates, ranked keywords, competitors, backlinks | $20 overviews, $1 keywords, $4 competitors, $50 backlink profiles; bulk $3 per domain plus $0.05 per batch |
| tri_angle/fast-similarweb-scraper | Similarweb | Monthly visits, global and country rank, top countries, top keywords | $2 |
| tri_angle/similarweb-scraper | Similarweb | Total visits, traffic sources, competitors, top countries, company info | $13 |
| pro100chok/semrush-scraper | Semrush and Moz | Authority, traffic, backlinks, competitors | $15 free plan, $5 Bronze, $4 Gold and up |
| radeance/semrush-scraper | Semrush | Authority score, traffic, backlinks, competitors | $25 free plan, $20 Silver, $17.50 Gold and up |
| amassuo/semrush-competitor-keywords | Not stated (the slug says Semrush) | Ranked keywords and organic competitors | $2 keywords, $2 competitors |
Where they're better, plainly. If you want total visits from all channels (direct, social, referral), the Similarweb Actors give you that and mine doesn't. Mine only estimates Google search traffic. The fast Similarweb one is also cheaper per domain than my bulk mode, and it has far more users (2,159 versus my 1). The Semrush scrapers give you the Semrush numbers that clients and agencies already recognize. And amassuo's competitor rows cost half of mine.
Where mine fits: keyword rows at $1 per 1,000 are the cheapest I found, the backlink profile comes in the same run, and it calls a licensed data API instead of reading another site's pages. One more honest limit: the numbers update on DataForSEO's schedule, not live. The backlinko.com competitor row today showed the exact same traffic (19,941) and keyword count (30,602) as a run I did on October 17, and the SERP dates on these keywords run from late July to mid September.
The code
Python with apify-client 3.x. In 3.x call() returns a Run object, so the dataset ID is run.default_dataset_id, not run["defaultDatasetId"]:
import os
from decimal import Decimal
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
"mode": "report",
"domains": ["plausible.io"],
"countries": ["US"],
"maxKeywords": 10,
"maxCompetitors": 3,
"includeBacklinks": True,
}
# max_total_charge_usd caps what this run can cost you (pay-per-event)
run = client.actor("vncntlabs/domain-seo-data").call(
run_input=run_input, max_total_charge_usd=Decimal("0.25")
)
rows = list(client.dataset(run.default_dataset_id).iterate_items())
for d in (r for r in rows if r["type"] == "domain"):
print(f"{d['domain']}: ~{d['organicTraffic']:,.0f} organic visits/month, "
f"{d['organicKeywords']:,} keywords, {d['top10']:,} in the top 10")
for k in (r for r in rows if r["type"] == "keyword"):
print(f"#{k['position']:>3} {k['keyword']:<32} vol {k['searchVolume']:>7,} {k['url']}")
for c in (r for r in rows if r["type"] == "competitor"):
print(f"{c['competitor']:<20} {c['sharedKeywords']} shared keywords ({c['sharedKeywordsPct']}%)")
Running that printed plausible.io: ~6,893 organic visits/month, 1,535 keywords, 466 in the top 10 and the rows above.
Bulk mode with curl, as one synchronous call that returns the dataset rows:
curl -sS -X POST "https://api.apify.com/v2/acts/vncntlabs~domain-seo-data/run-sync-get-dataset-items?maxTotalChargeUsd=0.10" \
-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
-d '{"mode":"bulk","domains":["plausible.io","usefathom.com","simpleanalytics.com"],"countries":["US"],"includeAuthority":true}'
And if you'd rather ask an assistant, add this to Claude, ChatGPT or Cursor as a remote MCP server. It loads only this Actor, and you sign in to Apify in the browser, so no token goes in the file:
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=vncntlabs/domain-seo-data"
}
}
}
The tool shows up as vncntlabs--domain-seo-data. Something like "check US organic traffic for these 40 agency domains in bulk mode and sort by traffic" works fine.
Code: https://github.com/PravinrajV/vncntlabs-apify-examples/tree/main/04-website-traffic-checker
If you've compared these traffic estimates against a site's real analytics, I'd like to hear how far off they were. My guess is brand-heavy sites come out closest, but I haven't tested that properly yet.
Disclosure: I build the Apify Actor used here (VNCNT Labs). Every number in this post comes from a real run on Oct 23, 2026, and the prices are Apify Store list prices checked that day.
Top comments (0)