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.

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_here

The 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/v1
GET

Tier 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

FieldTypeDescription
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.

GET

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
}
GET

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 tokens

Node.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 hit Too 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_minute to 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.