Portal API /portal/v1¶
Everything the developer portal does is a JSON call you can make yourself, authenticated with the portal
sign-in token (Authorization: Bearer <ID token>: the Identity Platform ID token the portal holds after you sign in with e-mail and
password or with Google), not an API key. Useful for provisioning keys from your own tooling.
| Method & path | Body / query | Returns |
|---|---|---|
GET /portal/v1/me |
user (with verified, profile, profile_complete), organisations with projects and your role, pricing: {paise_per_1k_chars: 10, currency: "INR", unit}, signup_offer: {chars, limit, left}, voices, model |
|
PUT /portal/v1/me/profile |
{name, company, phone?, use_case, volume?, country?} |
save the sign-up profile; name, company and use_case are required |
GET /portal/v1/signup-offer |
public, no token: the launch offer {chars, limit, left} |
|
POST /portal/v1/orgs |
{name} |
new organisation (you are owner) |
PATCH /portal/v1/orgs/{org} |
{name} |
rename (owner) |
GET /portal/v1/orgs/{org}/members |
members with role and joined/invited state | |
POST /portal/v1/orgs/{org}/members |
{email, role?} |
invite by e-mail (owner); they land in this organisation on first sign-in |
DELETE /portal/v1/orgs/{org}/members/{email} |
remove (owner; the last owner cannot be removed) | |
POST /portal/v1/projects |
{org_id, name} |
new project |
PATCH /portal/v1/projects/{id} |
{name} |
rename |
GET /portal/v1/keys?org_id&project_id? |
keys: id, name, prefix, voices, created_at, revoked_at, last_used_at (never the key itself) |
|
POST /portal/v1/keys |
{project_id, name, voices?: ["saanvi"]} |
{key, row}: the full key, shown only here |
PATCH /portal/v1/keys/{id} |
{name?, voices?} |
update |
DELETE /portal/v1/keys/{id} |
revoke, immediate | |
POST /portal/v1/playground-key |
{project_id} |
{key: "vt_pg_…", expires_in_s: 7200} short-lived key for browsers |
GET /portal/v1/usage?org_id&project_id?&from?&to? |
unix seconds; default last 30 days | totals (with billed_chars), ttfa_p50_ms, ttfa_p95_ms, rtf_avg, per-day series, by_key, by_voice, by_endpoint |
GET /portal/v1/requests?org_id&project_id?&limit? |
≤ 500 | recent requests with billed_chars, chars (normalised length), ttfa_ms, wall_ms, rtf, queue_ms, request_id |
GET /portal/v1/billing?org_id |
plans; status for the current month (month_chars, included_chars, included_left, credits_live, blocked, estimate_*); the credits ledger; invoices; commit_months |
|
POST /portal/v1/billing/topup |
{org_id, amount_inr} (₹100–₹1,00,000) |
a Razorpay Checkout payload for a pay-as-you-go top-up (owner) |
POST /portal/v1/billing/plan |
{org_id, plan}: payg · commit10k · commit25k |
switch plan (owner); a commitment returns a Checkout payload for the first month, a move back to payg applies from next month |
GET|POST /portal/v1/voice-requests |
{org_id, voice_name, language, use_case, hours?, notes?} |
train-your-voice requests and their status |
Errors follow the API's {"error": …} shape: 401 (no/invalid token), 403 (not a member / owners only), 404, 400. Organisation
limits: 50 active keys. Getting a token programmatically: sign in with the Identity Platform REST API using the e-mail and password flow, or use
the portal and copy a token from the browser session for scripts; a service-account flow is on the roadmap.