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).
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:
pool | Description | Listed when |
|---|---|---|
key | Dedicated allotment assigned to this API Key | This API Key has a dedicated allotment |
account | Account credit | This 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_creditinGET /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 (seeplan_feature_not_allowedin 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
| Field | Type | Description |
|---|---|---|
data | array | Lot list, soonest expiry first; lots that never expire come last |
data[].pool | string | Source: key (dedicated allotment) / account (account credit) |
data[].remaining_points | float | Credit remaining in this lot |
data[].expires_at | string | null | Expiry time (ISO 8601); null if the lot never expires |
data[].granted_at | string | When 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
pointsshowing the running total. - Fully refunded records are still listed, with
refundedset totrueandpointsset to0(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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
page | integer | No | 1 | Page number, 1 to 100000; pages past the last one return an empty data |
per_page | integer | No | 20 | Rows 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
| Field | Type | Description |
|---|---|---|
data | array | Usage records, newest first |
data[].task_id | string | null | The related task ID; null for usage that does not belong to a task (such as a summary or summary translation without a task) |
data[].type | string | Usage type; see the table below |
data[].points | float | Credits actually charged. Running total while in progress; 0 for usage covered by an unlimited plan; 0 after a full refund |
data[].in_progress | boolean | Whether the recording or broadcast is still in progress |
data[].refunded | boolean | Whether the record was fully refunded |
data[].refund_reason | string | null | Refund reason: no_audio (no audio was received at all; refunded automatically) / manual (refunded by support); null if not refunded |
data[].occurred_at | string | null | Start time of a recording or broadcast; charge time for other types (ISO 8601) |
data[].ended_at | string | null | End time (ISO 8601); null while in progress; same as occurred_at for types other than recordings and broadcasts |
meta.current_page | integer | Current page number |
meta.last_page | integer | Last page number |
meta.per_page | integer | Rows per page |
meta.total | integer | Total number of rows |
type values
| Value | Description |
|---|---|
recording | Realtime recording |
broadcast | Broadcast |
import | File import |
summary | AI meeting summary |
regen_summary | Summary regeneration |
retranslate | Full retranslation |
summary_translate | Summary translation |
More
typevalues may be added later. Display unknown values as general usage instead of failing to parse.
Error Responses
| HTTP | error_code | Condition |
|---|---|---|
| 422 | validation_failed | page 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
| Field | Type | Description |
|---|---|---|
data.name | string | API Key name |
data.expires_at | string | null | API Key expiry time (ISO 8601); null if it never expires |
data.monthly_spend_limit | float | null | Monthly credit limit; null if not set |
data.monthly_spent | float | null | Credits 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_sessions | integer | null | This API Key's concurrent recording limit; null if not set separately |
data.allow_account_pool | boolean | Whether this API Key may use account credit |
data.webhook_url | string | null | Webhook 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_restricted | boolean | Whether 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