Counter
Atomic, namespace-isolated hit counter. Perfect for tracking page views, downloads, or any event that needs counting.
Overview
Use Cases
- Track page views and visits
- Count downloads or clicks
- Monitor API endpoint usage
- Track user actions and events
- Analytics and metrics collection
Features
Namespace isolation for multiple counters
Atomic increments (no race conditions)
Redis-backed for speed
PostgreSQL persistence for durability
RESTful API design
API Endpoints
Increment Counter
Atomically increment a counter in the specified namespace and return the new value
POST
https://api.requiems.xyz/v1/misc/counter/{namespace}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| namespace | string |
Required | Counter namespace (1-64 chars: alphanumeric, hyphen, underscore) |
Try it out
Live DemoRequest
Counter namespace (1-64 chars: alphanumeric, hyphen, underscore)
Sending request...
Response Fields
| Field | Type | Description |
|---|---|---|
| namespace | string |
The counter namespace |
| value | integer |
The new counter value after increment |
Code Examples
curl -X POST https://api.requiems.xyz/v1/misc/counter/page-views \
-H "requiems-api-key: YOUR_API_KEY"
import requests
url = "https://api.requiems.xyz/v1/misc/counter/page-views"
headers = {"requiems-api-key": "YOUR_API_KEY"}
response = requests.post(url, headers=headers)
data = response.json()['data']
print(f"Counter '{data['namespace']}' is now at {data['value']}")
const response = await fetch(
'https://api.requiems.xyz/v1/misc/counter/page-views',
{
method: 'POST',
headers: {
'requiems-api-key': 'YOUR_API_KEY'
}
}
);
const { data } = await response.json();
console.log(`Counter '${data.namespace}' is now at ${data.value}`);
require 'net/http'
require 'json'
uri = URI('https://api.requiems.xyz/v1/misc/counter/page-views')
request = Net::HTTP::Post.new(uri)
request['requiems-api-key'] = 'YOUR_API_KEY'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
data = JSON.parse(response.body)['data']
puts "Counter '#{data['namespace']}' is now at #{data['value']}"
Error Responses
400
bad_request
Invalid namespace: must be 1β64 chars, alphanumeric, hyphen or underscore only
500
internal_error
Internal server error
Get Counter Value
Get the current value of a counter without incrementing it
GET
https://api.requiems.xyz/v1/misc/counter/{namespace}
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| namespace | string |
Required | Counter namespace (1-64 chars: alphanumeric, hyphen, underscore) |
Try it out
Live DemoRequest
Counter namespace (1-64 chars: alphanumeric, hyphen, underscore)
Sending request...
Response Fields
| Field | Type | Description |
|---|---|---|
| namespace | string |
The counter namespace |
| value | integer |
The current counter value (returns 0 if counter doesn't exist) |
Code Examples
curl https://api.requiems.xyz/v1/misc/counter/page-views \
-H "requiems-api-key: YOUR_API_KEY"
import requests
url = "https://api.requiems.xyz/v1/misc/counter/page-views"
headers = {"requiems-api-key": "YOUR_API_KEY"}
response = requests.get(url, headers=headers)
data = response.json()['data']
print(f"Counter '{data['namespace']}' is at {data['value']}")
const response = await fetch(
'https://api.requiems.xyz/v1/misc/counter/page-views',
{
headers: {
'requiems-api-key': 'YOUR_API_KEY'
}
}
);
const { data } = await response.json();
console.log(`Counter '${data.namespace}' is at ${data.value}`);
require 'net/http'
require 'json'
uri = URI('https://api.requiems.xyz/v1/misc/counter/page-views')
request = Net::HTTP::Get.new(uri)
request['requiems-api-key'] = 'YOUR_API_KEY'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
data = JSON.parse(response.body)['data']
puts "Counter '#{data['namespace']}' is at #{data['value']}"
Error Responses
400
bad_request
Invalid namespace: must be 1β64 chars, alphanumeric, hyphen or underscore only
500
internal_error
Internal server error
Frequently Asked Questions
If you GET a namespace that doesn't exist, it returns 0. If you POST (increment) a non-existent namespace, it creates it with value 1.
Yes! The counter uses atomic operations backed by Redis, so concurrent increments are safe and won't lose counts due to race conditions.
Namespaces must be 1-64 characters long and can only contain letters (a-z, A-Z), numbers (0-9), hyphens (-), and underscores (_).
Yes. Counters are stored in Redis for fast access and periodically synced to PostgreSQL for durability. Even if Redis restarts, your counts are safe.
Currently, counters can only be incremented and read. To reset a counter, you would need to create a new namespace or contact support.