curl "https://api.hooked.so/v1/account" \
-H "x-api-key: your_api_key_here"
const response = await fetch("https://api.hooked.so/v1/account", {
headers: { "x-api-key": process.env.HOOKED_API_KEY },
});
const { data: account } = await response.json();
if (account.billingMode === "byok") {
const broken = account.keys.filter((key) => key.status !== "ok").map((key) => key.provider);
if (broken.length) console.warn("Fix these keys first:", broken);
} else if (account.credits.balance < 500) {
console.warn("Low on credits:", account.credits.balance);
}
import os
import requests
response = requests.get(
"https://api.hooked.so/v1/account",
headers={"x-api-key": os.environ["HOOKED_API_KEY"]},
)
account = response.json()["data"]
print(account["billingMode"], account["credits"]["balance"])
{
"success": true,
"message": "Account fetched successfully",
"data": {
"team": { "id": "cm4w0team0001ab12cd34ef56", "name": "Acme Growth" },
"billingMode": "managed",
"plan": { "name": "pro", "status": "active", "renewsAt": "2026-11-01T00:00:00.000Z" },
"credits": { "balance": 1840, "chargedForGeneration": true },
"storage": { "usedBytes": 3221225472, "limitBytes": 53687091200 },
"keys": null
}
}
{
"success": true,
"message": "Account fetched successfully",
"data": {
"team": { "id": "cm4w0team0001ab12cd34ef56", "name": "Acme Growth" },
"billingMode": "byok",
"plan": { "name": "starter", "status": "active", "renewsAt": "2026-11-01T00:00:00.000Z" },
"credits": { "balance": 0, "chargedForGeneration": false },
"storage": { "usedBytes": 524288000, "limitBytes": 10737418240 },
"keys": [
{ "provider": "openrouter", "configured": true, "status": "ok" },
{ "provider": "elevenlabs", "configured": true, "status": "invalid" },
{ "provider": "firecrawl", "configured": false, "status": "missing" },
{ "provider": "bria", "configured": false, "status": "missing" },
{ "provider": "gemini", "configured": true, "status": "ok" }
]
}
}
Account
Get Account
Your team’s plan, billing mode, credit balance, storage and provider keys
GET
/
v1
/
account
curl "https://api.hooked.so/v1/account" \
-H "x-api-key: your_api_key_here"
const response = await fetch("https://api.hooked.so/v1/account", {
headers: { "x-api-key": process.env.HOOKED_API_KEY },
});
const { data: account } = await response.json();
if (account.billingMode === "byok") {
const broken = account.keys.filter((key) => key.status !== "ok").map((key) => key.provider);
if (broken.length) console.warn("Fix these keys first:", broken);
} else if (account.credits.balance < 500) {
console.warn("Low on credits:", account.credits.balance);
}
import os
import requests
response = requests.get(
"https://api.hooked.so/v1/account",
headers={"x-api-key": os.environ["HOOKED_API_KEY"]},
)
account = response.json()["data"]
print(account["billingMode"], account["credits"]["balance"])
{
"success": true,
"message": "Account fetched successfully",
"data": {
"team": { "id": "cm4w0team0001ab12cd34ef56", "name": "Acme Growth" },
"billingMode": "managed",
"plan": { "name": "pro", "status": "active", "renewsAt": "2026-11-01T00:00:00.000Z" },
"credits": { "balance": 1840, "chargedForGeneration": true },
"storage": { "usedBytes": 3221225472, "limitBytes": 53687091200 },
"keys": null
}
}
{
"success": true,
"message": "Account fetched successfully",
"data": {
"team": { "id": "cm4w0team0001ab12cd34ef56", "name": "Acme Growth" },
"billingMode": "byok",
"plan": { "name": "starter", "status": "active", "renewsAt": "2026-11-01T00:00:00.000Z" },
"credits": { "balance": 0, "chargedForGeneration": false },
"storage": { "usedBytes": 524288000, "limitBytes": 10737418240 },
"keys": [
{ "provider": "openrouter", "configured": true, "status": "ok" },
{ "provider": "elevenlabs", "configured": true, "status": "invalid" },
{ "provider": "firecrawl", "configured": false, "status": "missing" },
{ "provider": "bria", "configured": false, "status": "missing" },
{ "provider": "gemini", "configured": true, "status": "ok" }
]
}
}
Overview
Returns the team behind your API key. Call it before a batch to know whether the videos will go through:billingMode:managedmeans generation runs on Hooked’s provider keys and is paid with credits;byokmeans your team generates with its own provider keys (Settings → AI keys in the dashboard) and no credits are taken.plan: the plan, its subscription status and the next renewal. A managed team needs a live plan (active,trialingorpast_due) to generate.credits.balance: credits left (the plan’s plus any extra credits).chargedForGenerationistrueon managed andfalseon byok, where the balance is shown but not spent on generation.storage: bytes used by your library and videos, and your plan’s limit.keys(byok only,nullon managed): one entry per provider withconfiguredandstatus(ok,missingorinvalid). Which keys a format needs is listed on each create page and in Creating videos.
curl "https://api.hooked.so/v1/account" \
-H "x-api-key: your_api_key_here"
const response = await fetch("https://api.hooked.so/v1/account", {
headers: { "x-api-key": process.env.HOOKED_API_KEY },
});
const { data: account } = await response.json();
if (account.billingMode === "byok") {
const broken = account.keys.filter((key) => key.status !== "ok").map((key) => key.provider);
if (broken.length) console.warn("Fix these keys first:", broken);
} else if (account.credits.balance < 500) {
console.warn("Low on credits:", account.credits.balance);
}
import os
import requests
response = requests.get(
"https://api.hooked.so/v1/account",
headers={"x-api-key": os.environ["HOOKED_API_KEY"]},
)
account = response.json()["data"]
print(account["billingMode"], account["credits"]["balance"])
{
"success": true,
"message": "Account fetched successfully",
"data": {
"team": { "id": "cm4w0team0001ab12cd34ef56", "name": "Acme Growth" },
"billingMode": "managed",
"plan": { "name": "pro", "status": "active", "renewsAt": "2026-11-01T00:00:00.000Z" },
"credits": { "balance": 1840, "chargedForGeneration": true },
"storage": { "usedBytes": 3221225472, "limitBytes": 53687091200 },
"keys": null
}
}
{
"success": true,
"message": "Account fetched successfully",
"data": {
"team": { "id": "cm4w0team0001ab12cd34ef56", "name": "Acme Growth" },
"billingMode": "byok",
"plan": { "name": "starter", "status": "active", "renewsAt": "2026-11-01T00:00:00.000Z" },
"credits": { "balance": 0, "chargedForGeneration": false },
"storage": { "usedBytes": 524288000, "limitBytes": 10737418240 },
"keys": [
{ "provider": "openrouter", "configured": true, "status": "ok" },
{ "provider": "elevenlabs", "configured": true, "status": "invalid" },
{ "provider": "firecrawl", "configured": false, "status": "missing" },
{ "provider": "bria", "configured": false, "status": "missing" },
{ "provider": "gemini", "configured": true, "status": "ok" }
]
}
}
Errors
| Status | When |
|---|---|
| 401 | Missing or invalid API key (code: "not_authenticated") |
| 403 | The team does not have the Hooked app product (code: "entitlement_required") |