Every key, workspace and customer, counted live in one place.
Rate limits per API key, quotas per plan, features used per workspace, response times per customer against the SLA. One stream of product events feeds them all, and your gateway, billing and customer success read the same numbers.
watching
watching
watching
The questions this answers
Typical questions, each with the window it usually looks at. Thresholds are starting points you set yourself.
- Fair use per key
Is one integration flooding the API? Calls per key over the last minute and hour, so one script can't use up a whole organization's capacity.
rolling 1 minute and 1 hour - Enforce the plan
How much of its plan has the organization used this month, across every workspace and key it owns?
calendar month, rolled up - Bill by usage
How many units of each priced item did the organization use last month, exact, ready for the invoice line?
last calendar month, per SKU - Qualify trials
Which trial workspaces used three or more features and invited a teammate in the last 14 days?
rolling 14 days - Keep the SLA
What is this customer's 95th percentile response time this hour, against the number in their contract?
rolling 1 hour, p95 and p99 - Catch broken integrations
What share of this customer's calls failed in the last hour? A failing integration shows up before the support ticket does.
rolling 1 hour, errors / calls
A customer's integration slows down
Each API call carries its duration, so Aggrelis keeps a latency distribution per key, rolled up to the organization. A trigger looks only at slow calls: when one arrives, it asks how Acme's whole hour looks against the response time in Acme's contract, and tells your on-call and account team before Acme opens a ticket.
- Send every API call as an event, with its key, status and duration
- Define the numbers per organization: calls, errors and the 95th percentile response time over the last hour
- Trigger on slow calls only, so the question is asked when it matters
- Act on the answer: open an incident, and give the account team the numbers before the customer asks
{
"id": "call_01JC8B2M5R",
"type": "api_call",
"ts": "2026-11-02T14:03:11Z",
"attrs": {
"key_id": "key_42",
"org_id": "acme",
"endpoint": "/v1/reports",
"status": 200,
"duration_ms": 1840
}
}{
"name": "org_health",
"spec": {
"entity": "organization",
"features": {
"calls1h": {
"state": "calls_by_key",
"window": {
"rolling": "1h"
}
},
"errors1h": {
"state": "errors_by_key",
"window": {
"rolling": "1h"
}
},
"p95Ms1h": {
"state": "latency_by_key",
"window": {
"rolling": "1h"
},
"quantile": 0.95
}
},
"derived": [
{
"name": "errorRate1h",
"expr": "calls1h > 0 ? double(errors1h) / double(calls1h) : 0.0"
}
],
"reasons": [
{
"name": "sla_breach",
"when": "calls1h >= 20 && p95Ms1h != null && p95Ms1h > double(entity.slaP95Ms)"
},
{
"name": "integration_failing",
"when": "calls1h >= 20 && errorRate1h >= 0.25"
}
],
"triggers": [
{
"name": "slow_call",
"on": "api_call",
"when": "attrs.duration_ms > 1000",
"subject": "attrs.org_id"
}
]
}
}{
"type": "trigger.result",
"timestamp": "2026-11-02T14:03:11Z",
"data": {
"trigger": "slow_call",
"profile": "org_health",
"status": "ok",
"entity": {
"type": "organization",
"id": "acme"
},
"values": {
"calls1h": 5212,
"errors1h": 31,
"p95Ms1h": 1460,
"errorRate1h": 0.006
},
"reasons": [
"sla_breach"
],
"event": {
"id": "call_01JC8B2M5R",
"type": "api_call",
"ts": "2026-11-02T14:03:11Z"
},
"profileVersion": "org_health@v3"
}
}The parts of Aggrelis behind it
Nothing built for one industry: the same building blocks, configured for this job.
- Keys, users, workspaces
Keep numbers per API key, user, workspace and organization. One call updates every one it names.
- Key to organization
Roll-ups up to three levels keep limits and health live for the key, the workspace and the organization from the same event.
- Percentiles and exact sums
Response-time percentiles per customer, and metered units kept exact for billing.
- Answers inside the request
The gateway asks while the call waits; billing and success tools read the same answers.
- Triggers with a gate
Ask only when it matters: on slow calls, failed calls, or when an account goes silent. Results arrive as signed webhooks.
- Your customers' ids, kept private
A database of its own for your workspace, ids hashed before they are stored, hosted in the EU.
Your first live numbers, configured not coded
Tell us what you would count first, and we'll help you set it up.