REST API

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

FieldTypeDescription
data.modestringBilling mode: credit (credit-based) / unlimited (unlimited)
data.planobject | nullBasic plan info; null in credit mode and for unlimited authorizations that carry no plan

Shape 1 (unlimited plan)

FieldTypeDescription
data.plan.namestring | nullPlan name (display only; the entitlements are defined by features / oneoff_features / limits)
data.plan.expired_atstring | nullPlan expiry time (ISO 8601)
data.featuresarrayPer-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_featuresarrayOne-off features (such as AI meeting summary summary, full-text re-translation retranslate, audio import import); same fields as above
data.limitsobjectThe 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)

FieldTypeDescription
daily_soft_limit_minutesinteger | nullDaily 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_minutesinteger | nullDaily 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_sessionsinteger | nullConcurrent recording limit (simultaneous recordings on the same API Key)
daily_used_minutesinteger | nullMinutes used today (recording + import combined, per the account's time zone)
max_transcription_languagesinteger | nullCap on simultaneously recognized transcription languages. Exceeding it makes start return too_many_languages (details.max carries this value)
max_session_minutesinteger | nullSingle-recording limit (minutes)
rolling_limit_minutesinteger | nullRolling cumulative usage limit (minutes)
rolling_used_minutesinteger | nullMinutes currently accumulated in the rolling window
auth_total_limit_minutesinteger | nullTotal usage limit over the authorization period (minutes)
auth_total_used_minutesintegerCumulative minutes used over the authorization period
restriction_recovery_atstring | nullWhile 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, and auth_total_used_minutes as soon as it begins.

Shape 2 (credit mode)

FieldTypeDescription
data.available_creditfloatCurrently available credits (same type and semantics as remain_quota in POST /api/v1/imports/check-quota)

Shape 3 (unlimited authorization with no plan restrictions)

FieldTypeDescription
data.featuresobjectFixed at { "all": true } (no feature restrictions)
data.expired_atstring | nullAuthorization 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

Copyright © 2026