Abacus API
A free, key-free counter API for page hits, downloads and votes. Read a counter without incrementing it, or increment atomically. CountAPI's live replacement.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the Abacus API?
Abacus is a free hosted counter API. `GET https://abacus.jasoncameron.dev/get/{namespace}/{key}` reads a counter without changing it and returns `{"value": n}`, while `/hit/{namespace}/{key}` increments it atomically and returns the new value. No API key or account is needed.
CountAPI was the standard answer for 'I need a counter and no backend', and its domain no longer resolves at all, which stranded a lot of static sites. Abacus is the drop-in successor with the same mental model: namespaces and keys you invent on the spot, no registration, and an atomic increment that survives concurrent requests.
The distinction between `/hit` and `/get` is the whole API and is worth getting right. `/hit` both increments and returns, so calling it to display a number inflates that number every time the page renders. `/get` is a pure read. Rate limiting is exposed in standard `RateLimit-Policy`, `RateLimit-Remaining` and `RateLimit-Reset` headers, and the observed policy is 30 requests per 10 seconds. Counters are public to anyone who guesses the namespace, so treat them as ornamental, never as billing data.
Quick facts
- Base URL
https://abacus.jasoncameron.dev- Authentication
- No key for the public endpoints. Namespaces are not secret and anyone who knows the pair can read or increment your counter, so choose an unguessable namespace if that matters.
- Rate limit
- Observed policy of 30 requests per 10 seconds, reported in `RateLimit-Policy`, `RateLimit-Remaining` and `RateLimit-Reset` headers.
- Pricing
- Free and open source.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the Abacus API
Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.
1. Read a counter without incrementing it
GET https://abacus.jasoncameron.dev/get/test/test
curl 'https://abacus.jasoncameron.dev/get/test/test'const res = await fetch("https://abacus.jasoncameron.dev/get/test/test");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://abacus.jasoncameron.dev/get/test/test", timeout=20)
res.raise_for_status()
print(res.json()){
"value": 606
}Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
{namespace} | path | Required | A grouping of your choice, typically your domain. Created implicitly on first use. example.com |
{key} | path | Required | The counter name within the namespace, such as a page slug. homepage |
callback | string | Optional | JSONP callback name, for embedding in environments where fetch is unavailable. cb |
Response fields
valueinteger- The counter's current value. `/get` returns it unchanged; `/hit` returns the value after incrementing, so the first hit returns 1, not 0.
RateLimit-Policyheader- The active policy, formatted as `30;w=10` meaning 30 requests per 10-second window.
RateLimit-Remaining / RateLimit-Resetheader- Requests left in the window and the Unix timestamp when it resets.
What you can build with the Abacus API
- Add a view counter to a static site or blog with no backend at all
- Count downloads of a release asset from a plain HTML page
- Run a lightweight poll or upvote widget in documentation
- Track how often a README badge is rendered
- Prototype a counter feature before building real storage for it
Common errors and how to fix them
404 from /get
The namespace and key pair has never been hit, so no counter exists yet.
Fix: Counters are created by `/hit`, not by `/get`. Treat a 404 as zero, or create the counter deliberately before reading.
429
You exceeded 30 requests in a 10-second window.
Fix: Read `RateLimit-Remaining` and pause until `RateLimit-Reset`. Do not retry immediately in a loop.
Counter climbing faster than expected
You are calling `/hit` to display the value, which increments on every render.
Fix: Use `/hit` once per real event and `/get` everywhere you only want to show the number.
Abacus API — frequently asked questions
Is Abacus a replacement for CountAPI?
In practice yes. CountAPI's host no longer resolves, and Abacus offers the same namespace-and-key model with no signup, plus explicit rate-limit headers that CountAPI never had.
Does reading a counter increase it?
Only if you use `/hit`. `/get` is a pure read and leaves the value untouched, which is the endpoint you want behind a display.
Are my counters private?
No. Anyone who knows or guesses the namespace and key can read and increment them. Use a long random namespace if the number is even slightly sensitive, and never use counters for anything financial.
Can I call it directly from browser JavaScript?
Yes. It returns a permissive CORS header, and a JSONP `callback` parameter is available for older embedding scenarios.
Tools that pair with this API
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
Random String Generator
Generate random strings with a custom length and character sets — uppercase, lowercase, digits and symbols. Create many at once with secure randomness.
UUID Generator
Generate 1–100 cryptographically random UUID v4 identifiers at once. Uppercase and hyphen-less options, per-item copy and copy-all. Free UUID generator.
Abacus is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.