DEV Community

Alex Spinov
Alex Spinov

Posted on

Plausible Has a Free API — Privacy-Friendly Analytics Without Google

Google Analytics Is Overkill for Most Projects

Plausible is a lightweight, privacy-friendly analytics tool. Self-hosted version is free and includes full API access.

API Access

import requests

SITE_ID = "yourdomain.com"
API_KEY = "your_plausible_api_key"
BASE = "https://plausible.io/api/v1"  # or your self-hosted URL
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
Enter fullscreen mode Exit fullscreen mode

Get Current Visitors

def realtime_visitors():
    r = requests.get(f"{BASE}/stats/realtime/visitors",
                     headers=HEADERS, params={"site_id": SITE_ID})
    return r.json()

print(f"Current visitors: {realtime_visitors()}")
Enter fullscreen mode Exit fullscreen mode

Get Aggregate Stats

def get_stats(period="30d", metrics="visitors,pageviews,bounce_rate,visit_duration"):
    r = requests.get(f"{BASE}/stats/aggregate", headers=HEADERS,
                     params={"site_id": SITE_ID, "period": period, "metrics": metrics})
    return r.json()["results"]

stats = get_stats()
print(f"Visitors (30d): {stats[visitors][value]}")
print(f"Pageviews: {stats[pageviews][value]}")
print(f"Bounce rate: {stats[bounce_rate][value]}%")
Enter fullscreen mode Exit fullscreen mode

Get Top Pages

def top_pages(period="30d", limit=10):
    r = requests.get(f"{BASE}/stats/breakdown", headers=HEADERS,
                     params={"site_id": SITE_ID, "period": period,
                             "property": "event:page", "limit": limit,
                             "metrics": "visitors,pageviews"})
    return r.json()["results"]

for page in top_pages():
    print(f"{page[pageviews]:>5} views | {page[page]}")
Enter fullscreen mode Exit fullscreen mode

Top Traffic Sources

def top_sources(period="30d"):
    r = requests.get(f"{BASE}/stats/breakdown", headers=HEADERS,
                     params={"site_id": SITE_ID, "period": period,
                             "property": "visit:source", "metrics": "visitors"})
    return r.json()["results"]

for s in top_sources():
    print(f"{s[visitors]:>5} visitors from {s[source]}")
Enter fullscreen mode Exit fullscreen mode

Why Not Google Analytics

Feature Plausible Google Analytics
Privacy No cookies Tracks everything
GDPR Compliant (no banner) Needs consent
Script size 1KB 45KB
Page speed impact None Measurable
Self-hostable Yes No
API Simple REST Complex
Free Self-hosted Yes

More | GitHub


More from me: 10 Dev Tools I Use Daily | 77 Scrapers on a Schedule | 150+ Free APIs

Top comments (0)