Skip to content

API reference

Key info and balance

GET /v1/key tells a key about itself: what's left to spend, its limits, the models it may call and when it expires. Tools and agents call it to show your balance, or to stop before a job runs out of money.

Get the key#

GET/v1/key

Send the key the way you send it to any endpoint, as Authorization: Bearer or x-api-key. The call is free, isn't rate limited and works with every key, whatever models it's locked to. A revoked or unknown key gets 401 invalid_api_key, an expired one 401 key_expired.

The answer is wrapped in data, the shape OpenRouter's key endpoint uses, so tools that already read that can read this. Money is in US dollars.

curl https://fullsendai.com/v1/key -H "Authorization: Bearer $FULLSEND_API_KEY"
Response
{  "data": {    "label": "Production server",    "key": "fs_live_a41f…6da8",    "created_at": "2026-10-15T23:25:20.390Z",    "expires_at": null,    "balance": 56.7767,    "plan_allowance_remaining": 0.97063,    "limit": null,    "usage": 0,    "limit_remaining": null,    "limit_reset": "monthly",    "rate_limit": { "requests": null, "interval": "60s", "account_requests": 600 },    "allowed_models": null,    "project": { "id": 5, "name": "Default project" }  }}

Fields#

labelstring
The key's name, as set on the API keys page.
keystring
The key shortened to its start and last four characters, like fs_live_a41f…6da8. The full key is never returned.
created_atstring
When the key was created (ISO 8601).
expires_atstring | null
When the key stops working, or null if it never expires.
balancenumber
The prepaid balance of the account the key bills, in dollars. Shared by every key and team member on the account. See Plan allowance and balance.
plan_allowance_remainingnumber
What's left of this month's plan allowance, in dollars. It's spent before the balance.
limitnumber | null
The key's monthly spend cap in dollars, or null for none.
usagenumber
What the key has spent this calendar month (UTC), in dollars.
limit_remainingnumber | null
What's left under the cap this month; null when there's no cap. At 0, calls answer 429 key_limit_reached.
limit_resetstring
Always monthly: caps and usage reset on the 1st (UTC).
rate_limitobject
requests is the key's own requests per minute per model, or null when each model's default applies; interval is 60s; account_requests is the account-wide limit per minute. See Rate limits.
allowed_modelsarray | null
The model IDs the key is locked to, or null when it may call every model.
projectobject | null
The project the key spends in: id and name. See Projects.

What the key can spend right now is the smaller of balance + plan_allowance_remaining and limit_remaining (when there is one). A project budget can stop it sooner; that shows on the Projects page.

Examples#

A key locked to two models, with a $50 monthly cap, 30 requests a minute and an expiry date, partway through the month:

Response
{  "data": {    "label": "CI agent",    "key": "fs_live_9c02…71be",    "created_at": "2026-09-01T09:12:44.000Z",    "expires_at": "2026-12-31T00:00:00.000Z",    "balance": 120.5,    "plan_allowance_remaining": 0,    "limit": 50,    "usage": 31.284,    "limit_remaining": 18.716,    "limit_reset": "monthly",    "rate_limit": { "requests": 30, "interval": "60s", "account_requests": 600 },    "allowed_models": ["deepseek-v4.1-flash", "fullsend/auto"],    "project": { "id": 12, "name": "Build pipeline" }  }}

Stop a batch job before it starts when the key can't cover it:

def spendable(key):    total = key["balance"] + key["plan_allowance_remaining"]    return total if key["limit_remaining"] is None else min(total, key["limit_remaining"])key = requests.get("https://fullsendai.com/v1/key", headers={"Authorization": f"Bearer {os.environ['FULLSEND_API_KEY']}"}).json()["data"]if spendable(key) < 5:    raise SystemExit("Less than $5 left on this key: add credit or raise its cap first.")

Showing it in a tool#

A coding agent, editor plugin or status bar can call /v1/key with the key it already has to show “$56.78 left”, warn when a cap is close, or list only the models in allowed_models. Polling every minute or two is plenty: balances change only as calls finish or credit is added. The dashboard shows the same numbers on API keys and Balance and payments.

Stuck? Email [email protected]System statusChangelog