Account & Credits
Read your account's current tier, per-minute rate limit, and credit balance directly with your API key — no dashboard login or session cookie required.
Your per-minute rate limit is tier-based and changes with your credit balance. As you spend credits and move between tiers, limit_per_minute moves with you. These endpoints let your code read the live value instead of hardcoding it — ideal for keeping a client-side rate limiter in sync and avoiding rate-limit errors.
The three endpoints
| Endpoint | Returns |
|---|---|
| Tier Info | Current tier, rate limit & neighbouring tiers |
| Balance | Your current credit balance |
| Enterprise Balance | Balance for an Enterprise workspace |
Authentication
All account endpoints authenticate with your standard X-renidly-apikey header — the same key you use for data requests, available in Workspace → API Keys. No browser session or cookie is needed.
X-renidly-apikey: your_api_key_hereBase URL: https://renidly.com/api/panel
Tier Info
Returns everything about your account's position in the credit tier system: your current tier and its limit_per_minute, your live balance, and the tiers immediately above and below you. Call this when you need to know your rate limit at runtime.
Request
curl https://renidly.com/api/panel/credits/tier/k/ \
-H "X-renidly-apikey: $RENIDLY_API_KEY"Response
{
"success": true,
"message": "Tier info retrieved",
"errors": null,
"data": {
"balance": 0.0,
"credits_per_dollar": 100,
"current_tier": {
"name": "Testing",
"min_credits": 0,
"max_credits": 99,
"limit_per_minute": 7
},
"next_tier": {
"name": "Hobby",
"min_credits": 100,
"max_credits": 9999,
"limit_per_minute": 30,
"credits_needed": 100.0
},
"previous_tier": null
}
}Response fields
| Field | Type | Description |
|---|---|---|
| balance | number | Your current credit balance. |
| credits_per_dollar | integer | How many credits one US dollar buys (e.g. 100 = $1 → 100 credits). |
| current_tier | object | The tier your account is in right now. |
| current_tier.name | string | Display name of the tier (e.g. "Testing", "Hobby"). |
| current_tier.min_credits | integer | Lowest balance that still falls in this tier. |
| current_tier.max_credits | integer | Highest balance that still falls in this tier. |
| current_tier.limit_per_minute | integer | Requests per minute allowed on this tier — the value to feed your rate limiter. |
| next_tier | object | null | null if you are already on the highest tier. |
| next_tier.credits_needed | number | Credits you need to add to reach the next tier. |
| previous_tier | object | null | null if you are already on the lowest tier. |
Balance
A lightweight endpoint that returns only your current credit balance. Use it when you just need the number — low-balance alerts, billing dashboards, deciding whether to top up — without the full tier payload.
Request
curl https://renidly.com/api/panel/credits/balance/k/ \
-H "X-renidly-apikey: $RENIDLY_API_KEY"Response
{
"success": true,
"message": "Balance retrieved",
"errors": null,
"data": {
"balance": 0.0
}
}Enterprise Balance
Returns the credit balance for an Enterprise workspace. This route is authenticated with your Enterprise API key — a Personal-tier key returns Invalid API key on this route.
Request
curl https://renidly.com/api/panel/credits/balance/k/enterprise/ \
-H "X-renidly-apikey: $RENIDLY_ENTERPRISE_KEY"Response
{
"success": true,
"message": "Balance retrieved",
"errors": null,
"data": {
"balance": 798676.0
}
}Use case: a self-tuning rate limiter
The most common reason to call these endpoints is to drive a client-side rate limiter from a horizontally-scaled service. Because limit_per_minute is tier-based, it shifts as your balance crosses tier boundaries — a hardcoded value in your config will drift out of sync, leaving you either over-throttling (wasting throughput) or hitting rate-limit errors and failing jobs.
Instead, read the live limit from /credits/tier/k/ and refresh it periodically. Your limiter then always matches your real allowance:
import time, threading, requests
API_KEY = "your_api_key_here"
BASE = "https://renidly.com/api/panel"
HEADERS = {"X-renidly-apikey": API_KEY}
_limit = {"per_minute": 7} # safe default until first refresh
def refresh_rate_limit():
"""Pull the live per-minute limit for the current tier."""
r = requests.get(f"{BASE}/credits/tier/k/", headers=HEADERS, timeout=10)
data = r.json()["data"]
_limit["per_minute"] = data["current_tier"]["limit_per_minute"]
return _limit["per_minute"]
# Refresh on startup, then every few minutes so the limiter
# tracks tier changes as credits are consumed or topped up.
def keep_in_sync(interval=300):
while True:
try:
refresh_rate_limit()
except Exception:
pass # keep the last known value on transient errors
time.sleep(interval)
refresh_rate_limit()
threading.Thread(target=keep_in_sync, daemon=True).start()
# ... your limiter reads _limit["per_minute"] when allocating tokensBest practices
- Cache, don't poll per request. Read the limit once on startup and refresh on an interval (every 1–5 minutes is plenty). The tier only changes when your balance crosses a boundary.
- Refresh on a rate-limit hit. If you do hit a rate-limit error, immediately re-read
/credits/tier/k/— your tier likely dropped — then back off and resume at the new limit. - Keep a safe default. Seed your limiter with a conservative value so a failed refresh never lets it run unbounded.
- Watch
next_tier.credits_needed. Surface it in your monitoring to know exactly how many credits separate you from a higher limit, and to fire low-balance alerts before jobs start failing. - Stay just under the limit. Target ~90% of
limit_per_minuteto absorb clock skew across horizontally-scaled instances.