REST API

API Key Self-Service API

Use an API Key to look up its own credit lots, usage history, and settings (added in V1.21.0).

Use an API Key to look up its own credit lots, usage history, and settings (added in V1.21.0).

Common to all three endpoints:

  • Read-only endpoints: change no state.
  • Queryable even with zero balance: still available after credits run out.
  • Only this API Key's own data is returned: lots and records of other API Keys in the same account never appear.
  • Responses never include the API Key itself or any part of it, nor the webhook signing secret.

Related endpoint: My Plan API (billing mode, plan contents, and available credit).


GET /api/v1/me/credit-lots

Overview

Lists the credit lots this API Key draws on when it is charged: only lots that still have credit left and have not expired, soonest expiry first.

Lots come from two sources:

poolDescriptionListed when
keyDedicated allotment assigned to this API KeyThis API Key has a dedicated allotment
accountAccount creditThis API Key is allowed to use account credit

Charges draw on the dedicated allotment first, then on account credit; within each source, the lot that expires first is used first.

The lot total can exceed the credit actually available: when this API Key has a monthly credit limit, what it can still spend this month is capped by that limit. For the credit actually available, see available_credit in GET /api/v1/me/plan.

Unlimited API Keys: usage covered by the plan is not charged.

  • API Keys bound to an unlimited plan: returns {"data": []}. These API Keys cannot start broadcasts (see plan_feature_not_allowed in the Broadcasts API), so no credit lots would be drawn.
  • Unlimited authorizations with no plan restrictions (Shape 3 in the My Plan API): lists the account credit lots regardless of whether the key is allowed to use account credit, which broadcasts charged in credits draw from.

Use Cases

  • Show "how much credit is left and when each lot expires" in your UI
  • Remind users before credits expire

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/credit-lots" \
  -H "X-API-Key: YOUR_API_KEY"

Success Response

HTTP 200

{
  "data": [
    {
      "pool": "key",
      "remaining_points": 12.5,
      "expires_at": "2026-10-02T23:59:59+08:00",
      "granted_at": "2026-07-01T10:15:00+08:00"
    },
    {
      "pool": "account",
      "remaining_points": 500.0,
      "expires_at": "2027-03-31T23:59:59+08:00",
      "granted_at": "2026-04-01T09:00:00+08:00"
    },
    {
      "pool": "account",
      "remaining_points": 5.0,
      "expires_at": null,
      "granted_at": "2026-01-15T14:30:00+08:00"
    }
  ]
}

When there are no usable lots, the response is {"data": []}.

Response Field Description

FieldTypeDescription
dataarrayLot list, soonest expiry first; lots that never expire come last
data[].poolstringSource: key (dedicated allotment) / account (account credit)
data[].remaining_pointsfloatCredit remaining in this lot
data[].expires_atstring | nullExpiry time (ISO 8601); null if the lot never expires
data[].granted_atstringWhen this lot was granted (ISO 8601)

Specific Error Codes

This endpoint has no endpoint-specific error codes; it may only return general authentication errors (such as 401 auth_missing_api_key / auth_invalid_api_key).


GET /api/v1/me/usage

Overview

Lists this API Key's charges, newest first. Each recording or broadcast, and each import / summary / retranslation, is one row (not one row per minute).

  • Only charges and refunds are listed; credit grants and expiries are not.
  • Recordings and broadcasts still in progress are listed too, with points showing the running total.
  • Fully refunded records are still listed, with refunded set to true and points set to 0 (the originally charged amount is not shown).
  • The charge records in the dashboard do not list fully refunded records, so the row counts may differ.

Use Cases

  • Show "where the credits went" in your UI
  • Reconciliation: match rows to your own task records by task_id

Authentication

Header: X-API-Key (see Authentication)

Request Parameters

Query parameters

ParameterTypeRequiredDefaultDescription
pageintegerNo1Page number, 1 to 100000; pages past the last one return an empty data
per_pageintegerNo20Rows per page, 5 to 20

Request Example

curl -X GET "https://vas-poc.vurbo.ai/api/v1/me/usage?page=1&per_page=20" \
  -H "X-API-Key: YOUR_API_KEY"

Success Response

HTTP 200

{
  "data": [
    {
      "task_id": "9d3c2b1a-4e5f-4a6b-8c7d-0e1f2a3b4c5d",
      "type": "recording",
      "points": 2.5,
      "in_progress": true,
      "refunded": false,
      "refund_reason": null,
      "occurred_at": "2026-09-29T14:02:11+08:00",
      "ended_at": null
    },
    {
      "task_id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
      "type": "import",
      "points": 6.0,
      "in_progress": false,
      "refunded": false,
      "refund_reason": null,
      "occurred_at": "2026-09-29T11:30:45+08:00",
      "ended_at": "2026-09-29T11:30:45+08:00"
    },
    {
      "task_id": "7f6e5d4c-3b2a-4c1d-9e8f-7a6b5c4d3e2f",
      "type": "recording",
      "points": 0,
      "in_progress": false,
      "refunded": true,
      "refund_reason": "no_audio",
      "occurred_at": "2026-09-28T16:20:00+08:00",
      "ended_at": "2026-09-28T16:23:00+08:00"
    }
  ],
  "meta": {
    "current_page": 1,
    "last_page": 4,
    "per_page": 20,
    "total": 63
  }
}

Response Field Description

FieldTypeDescription
dataarrayUsage records, newest first
data[].task_idstring | nullThe related task ID; null for usage that does not belong to a task (such as a summary or summary translation without a task)
data[].typestringUsage type; see the table below
data[].pointsfloatCredits actually charged. Running total while in progress; 0 for usage covered by an unlimited plan; 0 after a full refund
data[].in_progressbooleanWhether the recording or broadcast is still in progress
data[].refundedbooleanWhether the record was fully refunded
data[].refund_reasonstring | nullRefund reason: no_audio (no audio was received at all; refunded automatically) / manual (refunded by support); null if not refunded
data[].occurred_atstring | nullStart time of a recording or broadcast; charge time for other types (ISO 8601)
data[].ended_atstring | nullEnd time (ISO 8601); null while in progress; same as occurred_at for types other than recordings and broadcasts
meta.current_pageintegerCurrent page number
meta.last_pageintegerLast page number
meta.per_pageintegerRows per page
meta.totalintegerTotal number of rows

type values

ValueDescription
recordingRealtime recording
broadcastBroadcast
importFile import
summaryAI meeting summary
regen_summarySummary regeneration
retranslateFull retranslation
summary_translateSummary translation

More type values may be added later. Display unknown values as general usage instead of failing to parse.

Error Responses

HTTPerror_codeCondition
422validation_failedpage is outside 1 to 100000, or per_page is outside 5 to 20, or either is not an integer

General authentication errors (such as 401 auth_missing_api_key / auth_invalid_api_key) may also be returned.


GET /api/v1/me/key

Overview

Look up this API Key's settings and this month's credit spend.

Use Cases

  • Show this API Key's name, expiry date, and progress against its monthly credit limit in your UI
  • Check the webhook URL and whether a source IP restriction is configured

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/key" \
  -H "X-API-Key: YOUR_API_KEY"

Success Response

HTTP 200

{
  "data": {
    "name": "Customer Service",
    "expires_at": "2027-03-31T23:59:59+08:00",
    "monthly_spend_limit": 200.0,
    "monthly_spent": 42.5,
    "max_concurrent_sessions": 3,
    "allow_account_pool": true,
    "webhook_url": "https://example.com/hook",
    "ip_restricted": true
  }
}

Response Field Description

FieldTypeDescription
data.namestringAPI Key name
data.expires_atstring | nullAPI Key expiry time (ISO 8601); null if it never expires
data.monthly_spend_limitfloat | nullMonthly credit limit; null if not set
data.monthly_spentfloat | nullCredits spent this month (calendar month in the account's time zone, including both the dedicated allotment and account credit); null when no monthly credit limit is set
data.max_concurrent_sessionsinteger | nullThis API Key's concurrent recording limit; null if not set separately
data.allow_account_poolbooleanWhether this API Key may use account credit
data.webhook_urlstring | nullWebhook notification URL. Only the scheme, host, and path are returned (plus the port, if one is specified); any username and password, query string, and fragment in the URL are omitted. The path is returned as is, so do not put verification tokens in the path (use signature verification instead). null if not set
data.ip_restrictedbooleanWhether a source IP restriction is configured (the rules themselves are not returned)

Specific Error Codes

This endpoint has no endpoint-specific error codes; it may only return general authentication errors (such as 401 auth_missing_api_key / auth_invalid_api_key).


Version: V1.24.1 Last Updated: 2026-09-29

Copyright © 2026