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 cookies required.
Your per-minute rate limit is tier-based and changes with your credit balance. As you spend credits and move between tiers, your 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 429 errors.
Tier Info
Current tier, rate limit & neighbouring tiers
Balance
Your current credit balance
Enterprise Balance
Balance for enterprise accounts
Authentication
All account endpoints authenticate with your standard API key passed in the X-AUTHAPI-Key header — the same key you use for data requests, available in your dashboard. No browser session or cookie is needed.
X-AUTHAPI-Key: your_api_key_hereThe trailing slash is required. These routes end in /k/ and must include the final slash. Calling /credits/balance/k (no trailing slash) returns an Invalid session error; /credits/balance/k/ works.
Base URL
https://linkdapi.com/api/i/v1Tier Info
https://linkdapi.com/api/i/v1/credits/tier/k/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. This is the endpoint to call when you need to know your rate limit at runtime.
Request
curl -H "X-AUTHAPI-Key: your_api_key_here" \ https://linkdapi.com/api/i/v1/credits/tier/k/
Response
{
"success": true,
"message": "Tier info retrieved",
"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
},
"errors": 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 | The tier directly above you. 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 | The tier directly below you. null if you are already on the lowest tier. |
next_tier and previous_tier share the same shape as current_tier (name, min_credits, max_credits, limit_per_minute); next_tier additionally includes credits_needed.
Balance
https://linkdapi.com/api/i/v1/credits/balance/k/A lightweight endpoint that returns only your current credit balance. Use it when you just need the number — for low-balance alerts, billing dashboards, or deciding whether to top up — without the full tier payload.
Request
curl -H "X-AUTHAPI-Key: your_api_key_here" \ https://linkdapi.com/api/i/v1/credits/balance/k/
Response
{
"success": true,
"message": "Balance retrieved",
"data": {
"balance": 0.0
},
"errors": null
}Enterprise Balance
https://linkdapi.com/api/i/v1/credits/balance/k/enterprise/Returns the credit balance for an enterprise account. This route is authenticated with your enterprise API key — the one prefixed with enterprise- rather than li-. A standard li- key returns Invalid API key on this route.
Request
curl -H "X-AUTHAPI-Key: enterprise-your_enterprise_key" \ https://linkdapi.com/api/i/v1/credits/balance/k/enterprise/
Response
{
"success": true,
"message": "Balance retrieved",
"data": {
"balance": 798676.0
},
"errors": null
}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 429 responses and failing jobs.
Instead, read the live limit from /credits/tier/k/ and refresh it periodically. Your limiter then always matches your real allowance:
Python
import time, threading, requests
API_KEY = "your_api_key_here"
BASE = "https://linkdapi.com/api/i/v1"
HEADERS = {"X-AUTHAPI-Key": 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 tokensNode.js
const BASE = "https://linkdapi.com/api/i/v1";
const HEADERS = { "X-AUTHAPI-Key": process.env.LINKDAPI_KEY };
let limitPerMinute = 7; // safe default until first refresh
async function refreshRateLimit() {
const res = await fetch(`${BASE}/credits/tier/k/`, { headers: HEADERS });
const { data } = await res.json();
limitPerMinute = data.current_tier.limit_per_minute;
return limitPerMinute;
}
// Refresh on boot, then every 5 minutes.
await refreshRateLimit();
setInterval(() => refreshRateLimit().catch(() => {}), 5 * 60 * 1000);Best 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
429. If you do hitToo many requests, 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 your horizontally-scaled instances.
Need something this section doesn't cover?
Reach out to [email protected] or browse the full endpoint reference.