V1 API Common Conventions
This document describes authentication, billing, shared objects, and error response formats for the V1 Open API (/v1/*).
Scope: Public /v1 Relay endpoints — 12 in total.
Common conventions
Base URL
https://www.guid.ai
Endpoints are mounted at the domain root, e.g. POST https://www.guid.ai/v1/chat/completions.
Authentication
All public /v1 endpoints use Bearer Token:
Authorization: Bearer sk-xxxxxxxxxxxxxxxx
| Rule | Description |
|---|---|
| Token validation | Validates API Key, user status, and balance/quota |
| IP allowlist | If the token has an IP allowlist, the request source is checked |
| Channel override | Admins may append -{channelId} after the Key (e.g. sk-xxx-6); regular users cannot |
| Auth failure | Returns HTTP 401 / 403 |
Exception: GET /v1/videos/{task_id}/content supports both an admin console Session and a Bearer Token.
Content-Type
| Scenario | Content-Type |
|---|---|
| JSON request | application/json |
| Image edit / video create with files | multipart/form-data |
| TTS response | audio/mpeg, audio/wav, etc. (depends on response_format) |
| Chat / Responses streaming | text/event-stream (SSE) |
Billing
- The gateway selects an upstream channel automatically based on
modelin the request body (or path parameter) - Supports token-based, per-request, per-second, and other billing strategies
- Different API Keys may see different model lists
Shared response objects
usage (token billing)
Common in text endpoint responses (Chat / Completions / Responses):
| Field | Type | Description |
|---|---|---|
prompt_tokens | integer | Input token count (Completions / Chat) |
completion_tokens | integer | Output token count (Completions / Chat) |
total_tokens | integer | Total token count |
input_tokens | integer | Input token count (Responses) |
output_tokens | integer | Output token count (Responses) |
prompt_cache_hit_tokens | integer | Cached input tokens (some models) |
prompt_tokens_details | object | Input token breakdown |
prompt_tokens_details.cached_tokens | integer | Cached token count |
prompt_tokens_details.text_tokens | integer | Text token count |
prompt_tokens_details.audio_tokens | integer | Audio token count |
prompt_tokens_details.image_tokens | integer | Image token count |
completion_tokens_details | object | Output token breakdown |
completion_tokens_details.reasoning_tokens | integer | Reasoning token count |
completion_tokens_details.text_tokens | integer | Text token count |
usage (per-request billing, images)
| Field | Type | Description |
|---|---|---|
quota_type | integer | Billing type identifier |
quota | integer | Quota consumed by this request |
request_count | integer | Request count, usually 1 |
prompt_tokens | integer | Input tokens (usually 0 for image endpoints) |
completion_tokens | integer | Output tokens (usually 0 for image endpoints) |
total_tokens | integer | Total tokens (usually 0 for image endpoints) |
Error responses
Standard errors (text / images / audio / video content)
HTTP status codes: 400, 401, 403, 404, 429, 500, etc.
{
"error": {
"message": "Invalid request",
"type": "invalid_request_error",
"code": "invalid_request",
"param": "model"
}
}
| Field | Type | Description |
|---|---|---|
error.message | string | Human-readable error description |
error.type | string | Error type, e.g. invalid_request_error, insufficient_quota |
error.code | string | Error code, e.g. invalid_request, model_not_found |
error.param | string | Request field that caused the error (if any) |
error.metadata | object | Extended metadata (returned by some upstreams) |
Task errors (video task create / query failure)
HTTP status codes: 400, 429, etc.
{
"code": "invalid_request",
"message": "model is required"
}
| Field | Type | Description |
|---|---|---|
code | string | Error code; commonly invalid_request |
message | string | Error description |
On HTTP 429, message is: 当前分组上游负载已饱和,请稍后再试 (upstream load for the current group is saturated; try again later).
Gateway extended errors (model list, voice list, etc.)
HTTP status codes: 200 (business failure) or 400.
{
"success": false,
"message": "get user group failed"
}
| Field | Type | Description |
|---|---|---|
success | boolean | Whether the call succeeded; false means failure |
message | string | Error description |
Token balance & usage details
In addition to Relay endpoints, V1 provides two query endpoints. Authentication matches other /v1 APIs: Authorization: Bearer sk-xxxxxxxx. Each request can only query data for the current Bearer token.
| Method | Path | Description |
|---|---|---|
| GET | /v1/token/balance | Query token balance (⚡) |
| GET | /v1/token/consume | Query current API Key consume records (paginated) |
Authentication: Use Bearer Token. The token is resolved by the auth middleware — do not pass a
keyquery parameter.
GET /v1/token/balance
Query the balance of the current Bearer token, returning the remaining and used quota in ⚡.
Auth: Authorization: Bearer sk-xxxxxxxx
Request parameters
No query parameters.
Request example (curl)
curl https://www.guid.ai/v1/token/balance \
-H "Authorization: Bearer sk-xxxxx"
Response body
HTTP 200
{
"success": true,
"message": "",
"data": {
"id": 1,
"name": "API Token",
"remain_quota_usd": 0.2,
"used_quota_usd": 0.1,
"unlimited_quota": false
}
}
Response fields
| Field | Type | Description |
|---|---|---|
success | boolean | Whether the call succeeded |
message | string | Status message |
data.id | integer | Token ID |
data.name | string | Token name |
data.remain_quota_usd | number | Remaining quota (⚡). Always 0 for unlimited tokens |
data.used_quota_usd | number | Used quota (⚡) |
data.unlimited_quota | boolean | Whether the token has unlimited quota |
GET /v1/token/consume
Paginated query of consume records for the current Bearer API Key (type = 2 only). Filtered by token_id — does not return the owning user's top-up/income wallet logs, and does not aggregate consume logs from the user's other keys.
Auth: Authorization: Bearer sk-xxxxxxxx
Request parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
page | integer | No | Page number, default 1 |
page_size | integer | No | Items per page, default 10, max 100 |
time_range | string | No | Quick time-range filter; only all, today, yesterday, week, month allowed. Takes precedence over start_timestamp / end_timestamp |
start_timestamp | integer | No | Start timestamp (used when time_range is empty) |
end_timestamp | integer | No | End timestamp (used when time_range is empty) |
model_name | string | No | Model name filter |
request_id | string | No | Request ID filter |
upstream_request_id | string | No | Upstream request ID filter |
Request example (curl)
curl "https://www.guid.ai/v1/token/consume?page=1&page_size=10&time_range=today" \
-H "Authorization: Bearer sk-xxxxx"
Response body
HTTP 200
{
"success": true,
"message": "",
"code": 0,
"data": {
"page": 1,
"page_size": 10,
"total": 100,
"items": [
{
"id": 1,
"created_at": 1700000000,
"type": 2,
"type_name": "消费",
"content": "模型推理",
"token_name": "default",
"model_name": "gpt-3.5-turbo",
"app_name": "",
"usage_name": "gpt-3.5-turbo",
"quota_usd": 0.002,
"quota_type": 2
}
]
}
}
Response fields
| Field | Type | Description |
|---|---|---|
success | boolean | Whether the call succeeded |
message | string | Status message |
code | integer | Status code; 0 success, -1 business failure |
data.page | integer | Current page |
data.page_size | integer | Page size |
data.total | integer | Total records |
data.items | array | Consume record list |
data.items[].id | integer | Log ID |
data.items[].created_at | integer | Created-at timestamp |
data.items[].type | integer | Log type; always 2 (consume) |
data.items[].type_name | string | Log type name; always consume |
data.items[].content | string | Log content |
data.items[].token_name | string | Token name |
data.items[].model_name | string | Model name |
data.items[].app_name | string | App name (if from Apps) |
data.items[].usage_name | string | Model name or Apps application name |
data.items[].quota_usd | number | Consumed quota (⚡) |
data.items[].quota_type | integer | Quota change type (0 none, 1 increase, 2 decrease) |

