BYTETOOLS

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.

No API key requiredCORS enabledHTTPSFree tier

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
curl 'https://abacus.jasoncameron.dev/get/test/test'
JavaScript (fetch)
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);
Python (requests)
import requests

res = requests.get("https://abacus.jasoncameron.dev/get/test/test", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200
{
  "value": 606
}

Parameters

ParameterTypeRequiredDescription
{namespace}pathRequiredA grouping of your choice, typically your domain. Created implicitly on first use. example.com
{key}pathRequiredThe counter name within the namespace, such as a page slug. homepage
callbackstringOptionalJSONP 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

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.