Dashboard Overview
Welcome back — here's a snapshot of your system
API Keys
Manage your GenAIPro API keys and credit balances
ElevenLabs API Pool
Real ElevenLabs keys (api.elevenlabs.io direct) — powers the free in-app test-generation menu, separate from the GenAIPro pool above
Fish Audio Pool
Real Fish Audio keys (api.fish.audio direct) — a third generation platform, separate from GenAIPro and ElevenLabs
Usage Statistics
Credit usage and task counts per API key
Developer API
Generate API keys so external apps can call AiVoicee's voice generation API directly
Use a generated key to call the AiVoicee voice generation API from any server-side program. Pass the key in the x-api-key header on every request.
| Header | Value |
|---|---|
| x-api-key | Your generated key, e.g. avk_live_xxxxxxxx |
AiVoicee gives you a choice of three underlying generation platforms, selected per-request with the provider field on POST /api/v1/tts. Each has its own voice catalog and its own voice_id namespace — a voice_id from one provider's catalog will not work with another.
| provider | Catalog | Voice list endpoint | model_id options |
|---|---|---|---|
genaipro (default) | 10,000+ ElevenLabs voices | GET /api/voices | eleven_flash_v2_5, eleven_multilingual_v2, eleven_turbo_v2_5, eleven_v3 |
elevenlabs | ElevenLabs' free premade voices | GET /api/voices/free-tier | same 4 as above |
fishaudio | 50,000+ Fish Audio voices | GET /api/voices/fishaudio | s2.1-pro-free |
genaipro tasks are async (queued, poll for the result). elevenlabs and fishaudio tasks are synchronous — the result is already completed the moment POST /api/v1/tts returns — GET is still there if you want it, but you don't have to poll.
The GenAIPro catalog (10,000+ voices), served from our own database — a background job mirrors it locally and re-syncs daily, so this responds instantly with a real, exact total count rather than proxying the provider live. No API key required. Browse it to find a voice_id to use below. Each voice also includes a preview_url — a short sample clip, so you can let your users listen before picking one. No generation/credits needed to play it, it's a static file.
The other two catalogs work identically (same query params, same response shape, same total/has_more paging) at their own endpoints: GET /api/voices/free-tier (ElevenLabs direct, ~20 voices, no query params needed) and GET /api/voices/fishaudio (50,000+ voices, also takes gender/language/category filters).
| Query param | Notes |
|---|---|
| page | Default 0. |
| page_size | Default 30, max 100 per request. |
| search | Matches voice name/description, or an exact voice_id. |
| gender / age / accent / language / category | Exact-match filters. |
| featured | true/false (GenAIPro catalog only). |
Response also includes total (exact count matching your filters) and has_more. To pull the whole catalog, page through with page_size=100 until has_more is false (~117 requests for the full 10,000+ list) — cache the result on your side rather than re-fetching it all on every load.
async function fetchAllVoices() {
const all = [];
let page = 0;
while (true) {
const res = await fetch(`https://api.aivoicee.com/api/voices?page=${page}&page_size=100`);
const { data } = await res.json();
all.push(...data.voices);
if (!data.has_more) break;
page++;
}
return all; // ~11,000+ voices
}
{
"voice_id": "y2H4TwIU5I2L0JXOdBeX",
"name": "Aria",
"gender": "female",
"accent": "american",
"preview_url": "https://files.genaipro.io/previews/y2H4TwIU5I2L0JXOdBeX.mp3",
"image_url": "https://files.genaipro.io/avatars/y2H4TwIU5I2L0JXOdBeX.jpg"
}
<audio controls src="VOICE.preview_url"></audio>
| Field | Type | Notes |
|---|---|---|
| text | string | Required. Max 5000 characters. |
| voice_id | string | Required. From the matching voices list for your chosen provider — validated against our catalog before we ever call the provider, so an invalid ID fails instantly (see Errors below). |
| provider | string | Optional. genaipro (default) / elevenlabs / fishaudio — see the platform table above. |
| model_id | string | Optional. Default eleven_flash_v2_5. Use s2.1-pro-free for provider fishaudio. |
| speed | number | Optional. 0.7–1.2, default 1.0. |
| stability | number | Optional. 0–1, default 0.75. |
| similarity | number | Optional. 0–1, default 0.5. |
curl -X POST https://api.aivoicee.com/api/v1/tts \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Hello from AiVoicee!",
"voice_id": "VOICE_ID_HERE"
}'
curl -X POST https://api.aivoicee.com/api/v1/tts \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Hello from AiVoicee!",
"voice_id": "FISH_VOICE_ID_HERE",
"provider": "fishaudio",
"model_id": "s2.1-pro-free"
}'
const res = await fetch('https://api.aivoicee.com/api/v1/tts', {
method: 'POST',
headers: {
'x-api-key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
text: 'Hello from AiVoicee!',
voice_id: 'VOICE_ID_HERE',
}),
});
const { data } = await res.json();
console.log(data.task_id);
import requests
res = requests.post(
"https://api.aivoicee.com/api/v1/tts",
headers={"x-api-key": "YOUR_API_KEY"},
json={"text": "Hello from AiVoicee!", "voice_id": "VOICE_ID_HERE"},
)
task_id = res.json()["data"]["task_id"]
print(task_id)
Response:
{
"success": true,
"message": "Task created — poll GET /api/v1/tts/:task_id for status",
"data": { "task_id": "abc123", "char_count": 21 }
}
Poll every 1–2 seconds until status is completed. The result field then holds the audio URL.
curl https://api.aivoicee.com/api/v1/tts/abc123 \
-H "x-api-key: YOUR_API_KEY"
| Status | Meaning |
|---|---|
| 400 | voice_id not found in the catalog for your chosen provider — a voice_id from one provider never works with another; call the matching voices endpoint from the platform table above |
| 401 | Missing, invalid or disabled API key |
| 404 | Task not found (wrong task_id or wrong key) |
| 410 | Voice was in our catalog but the provider no longer has it (removed/renamed upstream) — we drop it from our catalog automatically so this self-heals; pick another voice |
| 503 | No generation capacity available — try again shortly |
Notes: keys are shown once at creation — store them securely on your own server, never in client-side / mobile app code. Disable or delete a key below to revoke access immediately.
Notifications
Send in-app notifications to all users or a specific user
User Analytics
Overview of registered users, activity, and subscriptions
| Country | Status | Plan | Tasks | Avg Chars | Credits | Joined | |
|---|---|---|---|---|---|---|---|
| Loading… | |||||||
Payment Funnel
Track where users click and which payment methods they choose
| Date | Opens | IAP Clicks | Web Clicks | Success | Failed |
|---|---|---|---|---|---|
| Loading… | |||||
| User | Country | Event | Method | Date & Time |
|---|---|---|---|---|
| Loading… | ||||
Purchases
Every wallet topup and subscription across Cryptomus, Google Play, and Razorpay
| User | Method | Amount | Reference | Date |
|---|---|---|---|---|
| Loading… | ||||
Home Banner
First active promo shows as banner on the app home page
Add Promo
Promo Page
All promos shown in the app Promotions screen
Add Promo
Subscription Plans
Manage plans shown in the app — set EN & RU names, prices and credits
Add Plan
App Settings
Configure credit rewards and app behaviour
Blog
Manage blog posts — visible at aivoicee.com/blog
Database Migration
Run this once to apply any missing DB schema changes
This endpoint checks your live database and applies only the missing tables and columns. It is safe to run multiple times — already existing items are skipped automatically.