Credits & Quotas
Understanding the NovaKit credit system, quotas, and usage tracking
Credits & Quotas
NovaKit uses a quota-based system to track and manage API usage. This guide explains how quotas work, how they're structured, and how to monitor your usage.
How Credits Work
1 credit = 1,000 tokens (input + output combined)
Credits are used for chat completions. Your monthly credit allowance determines how many tokens you can use for AI chat.
Quota Limits by Plan
Web App Plans
| Resource | Free | Pro | Business |
|---|---|---|---|
| Credits | 100/mo | 200/mo | 800/mo |
| Image generations | - | 150/mo | 600/mo |
| Image edits | - | 75/mo | 300/mo |
| Video seconds | - | 15 min/mo | 60 min/mo |
| STT seconds | - | 60 min/mo | 300 min/mo |
| TTS characters | - | 200K/mo | 800K/mo |
| Music tracks | - | 20/mo | 80/mo |
CLI Plans (API-only)
| Resource | CLI Pro | CLI Team |
|---|---|---|
| Credits | 2,000/mo | 10,000/mo |
| Team members | 1 | 3 |
| All model tiers | ✓ | ✓ |
Token conversion: 1 credit = 1,000 tokens. A Pro plan with 200 credits gives you 200,000 tokens per month.
Model Tiers
Models are categorized into tiers that affect credit consumption:
Basic Tier (1x multiplier)
- GPT-4o Mini
- Claude 3 Haiku
- Gemini 1.5 Flash
- Llama 3.1 8B
- Flux Schnell
- SD 3.5 Turbo
Standard Tier (1.5-2x multiplier)
- GPT-4o
- Claude 3.5 Sonnet
- Gemini 1.5 Pro
- Llama 3.1 70B
- Flux Dev
- MiniMax Video
Powerful Tier (2-3x multiplier)
- GPT-4 Turbo
- Claude 3 Opus
- o1 Preview
- Llama 3.1 405B
- Flux Pro
- Luma Pro
Checking Your Quota
Via Dashboard
Go to Dashboard → Usage to see:
- Current credit balance
- Usage breakdown by bucket
- Historical usage graphs
- Upcoming reset date
Via API
curl https://www.novakit.ai/api/v1/quota \
-H "Authorization: Bearer sk_your_api_key"Response:
{
"org_id": "org_abc123",
"plan": {
"code": "pro_monthly",
"name": "Pro Monthly",
"kind": "recurring",
"entitled": true,
"period_end": "2025-02-01T00:00:00Z"
},
"quotas": {
"credits": {
"remaining": 170,
"limit": 200,
"used": 30,
"usage_percent": 15
},
"image_generations": {
"remaining": 138,
"limit": 150,
"used": 12,
"usage_percent": 8
},
"video_seconds": {
"remaining": 810,
"limit": 900,
"used": 90,
"usage_percent": 10
},
"stt_seconds": {
"remaining": 3240,
"limit": 3600,
"used": 360,
"usage_percent": 10
}
}
}Usage in Responses
Every API response includes usage information:
Chat Completions
{
"choices": [...],
"usage": {
"prompt_tokens": 150,
"completion_tokens": 200,
"total_tokens": 350
},
"model": "openai/gpt-4o-mini",
"model_tier": "basic"
}Tokens are deducted from your credit balance. 1,000 tokens = 1 credit.
Image Generation
{
"data": [...],
"usage": {
"generations_used": 1,
"generations_remaining": 149
},
"model": "fal-ai/flux/dev",
"model_tier": "standard"
}Video Generation
{
"data": {...},
"usage": {
"seconds_used": 5,
"seconds_remaining": 895
},
"model": "fal-ai/minimax/video-01",
"model_tier": "standard"
}Quota Exceeded Errors
When you exceed a quota, you'll receive a 402 Payment Required response:
{
"error": "Quota exceeded for image_generations",
"bucket": "image_generations",
"remaining": 0,
"limit": 100,
"reset_at": "2025-02-01T00:00:00Z"
}Handling Quota Errors
try {
const response = await novakit.images.generate({
prompt: "A sunset",
});
} catch (error) {
if (error.status === 402) {
// Quota exceeded
console.log(`Quota exceeded for ${error.bucket}`);
console.log(`Resets at: ${error.reset_at}`);
// Notify user or upgrade plan
await notifyUser("quota_exceeded", error.bucket);
}
}Top-ups
Purchase additional quota without upgrading your plan:
- Go to Dashboard → Billing → Top-up
- Select a package or custom amount
- Complete payment
- Quota is added immediately
Top-up Bundles
| Bundle | Contents | Price |
|---|---|---|
| Creator Boost | 200 credits + 100 images + 200 edits | ~$15 |
| Media Boost | 10 min video + 30 min STT + 200K TTS | ~$17 |
| API Chat Pack (2.5K) | 2,500 credits | $50 |
| API Chat Pack (10K) | 10,000 credits | $200 |
| Video Pack (15 min) | 15 min video generation | $15 |
| Video Pack (60 min) | 60 min video generation | $60 |
| Music Pack (20) | 20 music tracks | $10 |
| Music Pack (80) | 80 music tracks | $40 |
Per-Unit Pricing
| Resource | Price |
|---|---|
| Credits | $0.02 per credit (1K tokens) |
| Images | $0.10 per image |
| Image edits | $0.05 per edit |
| Video | $1.00 per minute |
| STT | $0.50 per minute |
| TTS | $0.05 per 1K characters |
| Music | $0.50 per track |
| Agent runs | $0.25 per run |
Top-ups don't expire at the end of your billing period. They're used after your plan allowance is exhausted.
Quota Reset
- Monthly plans: Quotas reset on your billing date
- Annual plans: Quotas reset monthly on your signup date
- Top-ups: Never expire, used after plan allowance
Monitoring & Alerts
Low Credit Alerts
NovaKit sends notifications when credits are running low:
| Alert | Trigger |
|---|---|
| Warning | 20% remaining |
| Critical | 10% remaining |
| Depleted | 0% remaining |
Configure alerts in Dashboard → Settings → Notifications.
Webhook Events
Subscribe to billing webhooks for programmatic alerts:
// credits.low event
{
"type": "credits.low",
"data": {
"bucketType": "chat_tokens",
"remaining": 100000,
"limit": 1000000,
"percentUsed": 90
}
}See Webhooks Guide for setup.
Best Practices
1. Monitor Usage Regularly
Check the dashboard weekly and set up alerts to avoid unexpected cutoffs.
2. Use Appropriate Models
Don't use expensive models for simple tasks:
| Task | Recommended Model | Why |
|---|---|---|
| Simple Q&A | GPT-4o Mini | Fast, cheap |
| Complex reasoning | GPT-4o | Good balance |
| Critical tasks | Claude 3 Opus | Best quality |
3. Implement Caching
Cache responses to reduce redundant API calls:
const cache = new Map();
async function getCachedResponse(prompt: string) {
const key = hashPrompt(prompt);
if (cache.has(key)) {
return cache.get(key);
}
const response = await novakit.chat.completions.create({
messages: [{ role: "user", content: prompt }],
});
cache.set(key, response);
return response;
}4. Batch Operations
Use async mode and batch parameters where available:
// Generate multiple images in one request
const response = await novakit.images.generate({
prompt: "A sunset",
n: 4, // Generate 4 images at once
});5. Set Client-Side Limits
Prevent runaway usage with client-side limits:
const MAX_DAILY_REQUESTS = 1000;
let dailyRequests = 0;
async function makeRequest() {
if (dailyRequests >= MAX_DAILY_REQUESTS) {
throw new Error("Daily limit reached");
}
dailyRequests++;
// Make API call...
}Usage Analytics
View detailed usage analytics in Dashboard → Usage:
- Usage by Model: See which models consume the most credits
- Usage by Tool: Breakdown by chat, image, video, etc.
- Daily Trends: Usage patterns over time
- Top Users: If using team features, see per-user breakdown
FAQ
Do unused credits roll over?
Plan allowances reset each billing period. Only top-up credits carry over.
What happens when I exceed my quota?
API requests return 402 Payment Required. Services continue working once you top up or the quota resets.
Can I get a refund for unused credits?
Plan credits are use-it-or-lose-it. Top-up credits are non-refundable but never expire.
How are tokens counted?
We use the same tokenization as OpenAI. Roughly 1 token = 4 characters or ~0.75 words.
Do failed requests consume credits?
No. Credits are only consumed for successful completions. Failed requests don't count against your quota.