My Plan API
GET /api/v1/me/plan
Overview
Look up the billing mode and plan contents this API Key currently operates under (added in v1.9.0).
When blocked by a plan limit (plan_feature_not_allowed, plan_daily_limit_reached, too_many_languages, etc. — see Error Code Reference — Plan and Usage Limit Errors), use this endpoint to answer "what does my plan include, how far am I from a limit, and when does the restriction lift?"
- Read-only endpoint: changes no state.
- Queryable even with zero balance: still available after credits run out.
- The response reflects the entitlements this key actually holds; later adjustments to the plan's definition do not affect authorizations already granted.
Related endpoint: API Key Self-Service API (credit lots, usage history, API Key settings).
Use Cases
- After receiving HTTP 403 (
plan_feature_not_allowed) or 402 (plan_daily_limit_reached), look up the plan contents and recovery time - Display the plan's feature bundle, today's usage, and each limit in your UI
- Determine the current billing mode (credit / unlimited plan)
Authentication
Header: X-API-Key (see Authentication)
Request Parameters
This endpoint does not require any request parameters.
Request Example
curl -X GET "https://vas-poc.vurbo.ai/api/v1/me/plan" \
-H "X-API-Key: vas_aB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vW"
Success Response
HTTP 200. The response takes one of three shapes depending on the billing mode of the key:
Shape 1: Unlimited plan (plan-bound)
{
"data": {
"mode": "unlimited",
"plan": {
"name": "專業方案",
"expired_at": "2027-07-31T23:59:59+08:00"
},
"features": [
{ "slug": "stt", "name": "基礎語音轉錄", "included": true },
{ "slug": "bilingual", "name": "互譯模式(雙語)", "included": true },
{ "slug": "ai_interpret", "name": "AI 語音口譯(TTS)", "included": false },
{ "slug": "diarization", "name": "語者分離", "included": true },
{ "slug": "sentence_translate", "name": "整句翻譯", "included": true },
{ "slug": "realtime_translate", "name": "即時翻譯", "included": false },
{ "slug": "vocab", "name": "專業詞語庫", "included": true },
{ "slug": "broadcast", "name": "廣播", "included": false }
],
"oneoff_features": [
{ "slug": "summary", "name": "AI 會議摘要", "included": true },
{ "slug": "retranslate", "name": "全文重翻", "included": true },
{ "slug": "import", "name": "檔案匯入", "included": false }
],
"limits": {
"daily_soft_limit_minutes": 480,
"daily_hard_limit_minutes": 600,
"max_concurrent_sessions": 2,
"daily_used_minutes": 123,
"max_transcription_languages": 4,
"max_session_minutes": 240,
"rolling_limit_minutes": 3000,
"rolling_used_minutes": 850,
"auth_total_limit_minutes": 60000,
"auth_total_used_minutes": 12345,
"restriction_recovery_at": null
}
}
}
Shape 2: Credit mode
{
"data": {
"mode": "credit",
"plan": null,
"available_credit": 480.5
}
}
Shape 3: Unlimited authorization with no plan restrictions (rare)
{
"data": {
"mode": "unlimited",
"plan": null,
"features": { "all": true },
"expired_at": "2027-01-31T23:59:59+08:00"
}
}
Response Field Description
Common fields
| Field | Type | Description |
|---|---|---|
data.mode | string | Billing mode: credit (credit-based) / unlimited (unlimited) |
data.plan | object | null | Basic plan info; null in credit mode and for unlimited authorizations that carry no plan |
Shape 1 (unlimited plan)
| Field | Type | Description |
|---|---|---|
data.plan.name | string | null | Plan name (display only; the entitlements are defined by features / oneoff_features / limits) |
data.plan.expired_at | string | null | Plan expiry time (ISO 8601) |
data.features | array | Per-minute billed features, each with slug / name / included. included: true means the plan includes the feature; broadcasting (broadcast) is always false (broadcasts are never included in unlimited plans and are billed in credits) |
data.oneoff_features | array | One-off features (such as AI meeting summary summary, full-text re-translation retranslate, audio import import); same fields as above |
data.limits | object | The plan's limits and current usage (see the table below) |
data.limits fields (a value of null means the item is unrestricted, or cannot currently be computed)
| Field | Type | Description |
|---|---|---|
daily_soft_limit_minutes | integer | null | Daily usage threshold (minutes). Once reached, the active recording is periodically stopped (daily_limit_disconnect); a new recording can start immediately (when restarting on the same connection, session_started arrives after the previous recording finishes processing) |
daily_hard_limit_minutes | integer | null | Daily usage hard limit (minutes). Once reached, no new recordings / imports can start that day (daily_limit_reached / REST plan_daily_limit_reached); resets the next day |
max_concurrent_sessions | integer | null | Concurrent recording limit (simultaneous recordings on the same API Key) |
daily_used_minutes | integer | null | Minutes used today (recording + import combined, per the account's time zone) |
max_transcription_languages | integer | null | Cap on simultaneously recognized transcription languages. Exceeding it makes start return too_many_languages (details.max carries this value) |
max_session_minutes | integer | null | Single-recording limit (minutes) |
rolling_limit_minutes | integer | null | Rolling cumulative usage limit (minutes) |
rolling_used_minutes | integer | null | Minutes currently accumulated in the rolling window |
auth_total_limit_minutes | integer | null | Total usage limit over the authorization period (minutes) |
auth_total_used_minutes | integer | Cumulative minutes used over the authorization period |
restriction_recovery_at | string | null | While in a restriction window: the estimated recovery time (ISO 8601); null when not in a restriction window |
For real-time recording, the limits above are checked before each minute begins; once one is reached, the next minute does not start and is not counted toward usage. When the same API Key runs several recordings at once, after the periodic-stop threshold is reached, each recording stops before its own next minute begins. Each recording minute is counted in
daily_used_minutes,rolling_used_minutes, andauth_total_used_minutesas soon as it begins.
Shape 2 (credit mode)
| Field | Type | Description |
|---|---|---|
data.available_credit | float | Currently available credits (same type and semantics as remain_quota in POST /api/v1/imports/check-quota) |
Shape 3 (unlimited authorization with no plan restrictions)
| Field | Type | Description |
|---|---|---|
data.features | object | Fixed at { "all": true } (no feature restrictions) |
data.expired_at | string | null | Authorization expiry time (ISO 8601) |
An unlimited authorization is always bound to a single API Key and carries plan contents from the moment it is issued. This shape only appears when an authorization carries no plan contents and is rare in practice; handling it is still recommended so that your integration does not fail to parse the response if it occurs.
Specific Error Codes
This endpoint has no specific error codes; it may only return common authentication errors (such as 401 auth_missing_api_key / auth_invalid_api_key).
Version: V1.24.1 Last Updated: 2026-09-29