// STATHAT DROP-IN

The drop-in StatHat replacement — migrate by changing one URL.

EzStat is the StatHat alternative that speaks the same /ez, /c and /v wire format as StatHat. Point your calls at api.ezstat.dev, use your EzStat key, and you have a live chart in minutes. Flat pricing from $19/mo.

Change one base URL — most StatHat clients let you override it in one line; hardcoded hosts need a find-and-replace. Stats auto-create on the first POST. Live chart in about five minutes.

// STATHAT SHUT DOWN

StatHat shut down — what happens to your stats now?

StatHat announced its shutdown and its API is offline — it no longer accepts data. If your /ez, /c or /v calls stopped working, the instrumentation itself is fine: point the base URL at api.ezstat.dev, use your EzStat key, and the same calls keep recording. Exported your StatHat history before the shutdown? Import the CSV/JSON and your charts keep their past.

// THE DROP-IN

Change the host, use your EzStat key. Nothing else to rewrite.

EzStat is wire-compatible with StatHat's EZ and Classic API — same parameters, same response shape. Your /ez, /c and /v calls all move the same way.

# BEFORE — your existing StatHat call
curl -X POST https://api.stathat.com/ez \
  -d "ezkey=YOUR_STATHAT_KEY" -d "stat=signups" -d "count=1"

# AFTER — EzStat. Change the host, use your EzStat key. Same params, same response shape.
curl -X POST https://api.ezstat.dev/ez \
  -d "ezkey=YOUR_EZSTAT_KEY" -d "stat=signups" -d "count=1"

# The Classic /c (counter) and /v (value) endpoints move the same way:
#   https://api.stathat.com/c  ->  https://api.ezstat.dev/c
#   https://api.stathat.com/v  ->  https://api.ezstat.dev/v
// NODE
// Node — most StatHat clients let you override the base URL
const res = await fetch("https://api.ezstat.dev/ez", {
  method: "POST",
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
  body: new URLSearchParams({
    ezkey: "YOUR_EZSTAT_KEY",
    stat: "signups",
    count: "1",
  }),
});
// A rejected write is still HTTP 200 — the verdict is in the BODY.
const out = await res.json();
if (out.status !== 200) throw new Error(out.msg);
// PYTHON
# Python
import requests
r = requests.post("https://api.ezstat.dev/ez", data={
    "ezkey": "YOUR_EZSTAT_KEY",
    "stat": "signups",
    "count": 1,
})
# A rejected write is still HTTP 200 — the verdict is in the BODY.
if r.json().get("status") != 200:
    raise RuntimeError(r.json().get("msg"))
// BATCHING (RECOMMENDED)
# BATCHING (recommended) — send up to 100 points in one request
# One POST = 100 points instead of 100 POSTs. Lower latency, no rate-limit pressure.
curl -X POST https://api.ezstat.dev/ez \
  -H "Content-Type: application/json" \
  -d '{
    "ezkey": "YOUR_EZSTAT_KEY",
    "data": [
      {"stat": "signups", "count": 1},
      {"stat": "api.latency", "value": 43.2},
      {"stat": "queue.depth", "count": 9, "t": "1700000000"}
    ]
  }'

# Rule of thumb: 20-100 points per POST. For safe retries, set "t" AND an "ikey"
# (idempotency key) on each ITEM — dedup keys on stat + timestamp + ikey, so a
# resubmit carrying the SAME t and ikey is skipped (first write wins). An item
# with no "t" gets the server's arrival time, so a retry of it double-counts
# (stored and billed again) even with an ikey. A batch-level ikey is not read.
# Atomicity: some points commit individually rather than as one unit, so a
# partly-failed batch can leave earlier points stored. Use t + ikey per item and
# resend the whole batch — deduped items will not double-count.

Step-by-step in the migration guide and the docs.

// HONEST SCOPE

Not a Datadog or Grafana replacement — no traces, logs, APM or host monitoring. It is the “count a number, see it charted, get pinged if it moves” primitive — the thing StatHat did.

// YOU'RE LIVE IN 3 STEPS

Three small steps to a live chart

1

Get your key

Create an account and copy your EzStat API key from Settings.

2

Change one base URL (and swap the key)

Point calls at api.ezstat.dev and use your EzStat key instead of your old StatHat one.

3

POST and watch it land

Send one point — the stat auto-creates and shows on the chart. That's it — you're live.

// BRING YOUR HISTORY

Downloaded your StatHat export? Bring it with you.

If you saved your StatHat CSV or JSON export before it closed, upload it — EzStat recreates each stat and backfills its points within your plan quota. No StatHat key needed. It is not a one-click bulk importer, and a live token-pull is not possible because StatHat's API is offline. You can also backfill live points by passing a unix t timestamp on ingest.

Full import walkthrough in the migration guide.

// PRICING

A flat per-stat ladder — you always know the bill

No per-GB, per-host, per-seat or per-call metering. Start on Indie at $19/mo, then $49 / $99 as you grow.

EZSTAT · INDIE
$19/mo
// WHAT YOU GET

Live today on EzStat

Wire-compatible /ez, /c and /v endpoints — one URL change, no rewrite.
One HTTP POST to track any metric — no agent, no SDK, no YAML.
Auto-generated charts and embeddable share links.
CSV / JSON export any time — your data is yours, no lock-in.
API-key auth with per-plan rate limits.
Billed monthly — cancel any time.
Threshold + Smart Alerts — webhook and Slack delivery, live on paid plans.
Weekly Digest — coming soon.
Ask-Your-Data AI — live. Ask in plain English, get an answer from your own stats.

Live now — a real, running service with fast, reliable ingest.

// QUESTIONS

Coming from StatHat — questions

Did StatHat shut down — is my data locked in here?

If your calls to api.stathat.com stopped working and your dashboards went dark, point your existing code at EzStat and keep going. Your data on EzStat is always yours: CSV and JSON export any time, no lock-in. Billed monthly, cancel any time and export access stays through the period.

What exactly do I change to move my code to EzStat?

Two things: point your calls at api.ezstat.dev instead of api.stathat.com, and use your EzStat API key. EzStat implements the same EZ endpoint (/ez) and the Classic counter/value endpoints (/c and /v) with the same parameters and response shape, so nothing else has to be rewritten. Stats auto-create on the first POST.

Is it really drop-in — what is compatible?

The /ez, /c and /v endpoints are wire-compatible with StatHat. Same params, same JSON response shape, so your calls still work after a hostname swap. Most StatHat client libraries let you override the base URL, so the change is often a one-line config edit; hardcoded hosts need a find-and-replace.

Can I bring my StatHat history across?

If you downloaded your StatHat CSV or JSON export before it closed, upload it and EzStat recreates each stat and backfills its historical points within your plan quota — no StatHat key needed, just the file. It is not a one-click bulk importer, and a live token-pull is not possible because StatHat's API is offline. You can also backfill live points by passing a unix timestamp (t) on ingest.

Is there a free tier, and how does pricing work?

Yes — a free tier is open: no card required, 10 tracked stats and live charts, limited to the first 250 accounts (your slot is claimed when you send your first datapoint). Paid plans are a flat per-stat ladder from $19/mo (Indie) with no per-GB, per-host, per-seat or per-call metering.

Can I self-host EzStat?

No — EzStat is a hosted service. If self-hosting is a hard requirement, statsd with Grafana or Uptrace self-host are the honest answers. EzStat is for people who want the low-ops 'just track a number' primitive without running the stack.

Where are alerts, the weekly digest and the ask-your-data AI?

Threshold and smart anomaly alerts are live on paid plans, delivered to webhooks and Slack; email delivery of alerts is coming soon. The weekly digest is also coming soon. Ask-your-data AI is live: ask a plain-English question and get an answer computed from your own stats. Live today: ingest, auto-charts, threshold + smart alerts (webhook/Slack), share/embed, CSV/JSON export, ask-your-data AI.

Comparing options? See the honest StatHat vs EzStat table.

// GET STARTED

Bring your stats home.

Change one base URL and use your EzStat key — most StatHat clients let you override it in one line; hardcoded hosts need a find-and-replace. You're live in about five minutes. Billed monthly, cancel any time; your data exports any time, no lock-in.

The free tier is live: 10 stats, no card — your first datapoint claims one of the 250 slots. Bringing your history or a team? We'll help you migrate.