| Purpose | Address |
|---|---|
| Model calls and OpenAI-compatible queries | https://platform.dataeyes.ai |
| Key quota, user information, and subscription queries | https://www.dataeyes.ai/apex |
| Login and full key retrieval (Section 3.2) | https://www.dataeyes.ai/api |
Authorization: Bearer sk-xxxxxxxxxxxxxxxxAuthorization: Bearer <system_access_token>
apex-api-user: <user_numeric_id>The system access token can be found in the console under "Personal Settings > Account Management > Security Settings". The user numeric ID must be obtained from a backend administrator.
Authorization: Bearer <login_token>apex-api-user header. Follow the three steps in Section 3.2 to obtain the login token and find the key ID.https://platform.dataeyes.aiGET /v1/dashboard/billing/subscription| Name | Required | Description |
|---|---|---|
Authorization | Yes | Bearer <API-Key> |
{
"object": "billing_subscription",
"has_payment_method": true,
"soft_limit_usd": 100000000,
"hard_limit_usd": 100000000,
"system_hard_limit_usd": 100000000,
"access_until": 0
}| Field | Type | Description |
|---|---|---|
object | String | Fixed value "billing_subscription" |
has_payment_method | Boolean | Compatibility field; returns true |
soft_limit_usd | Number | Reported soft quota limit in USD |
hard_limit_usd | Number | Reported hard quota limit in USD |
system_hard_limit_usd | Number | System-level hard limit, identical to hard_limit_usd |
access_until | Integer | Subscription expiration time (Unix timestamp); 0 means never expires |
100000000. This value represents an unlimited key quota, not an account balance of USD 100 million.GET /v1/dashboard/billing/usage| Name | Required | Description |
|---|---|---|
Authorization | Yes | Bearer <API-Key> |
start_date and end_date parameters do not filter the results. This endpoint returns cumulative usage.{
"object": "list",
"total_usage": 601.41
}| Field | Type | Description |
|---|---|---|
object | String | Fixed value "list" |
total_usage | Number | Cumulative usage charges in US cents. Divide by 100 to convert to USD: 601.41 cents = 6.01 |
GET /v1/models| Name | Required | Description |
|---|---|---|
Authorization | Yes | Bearer <API-Key> |
{
"data": [
{
"id": "gpt-4o",
"object": "model",
"created": 1626777600,
"owned_by": "openai",
"supported_endpoint_types": ["openai"]
},
{
"id": "claude-opus-4-6",
"object": "model",
"created": 1626777600,
"owned_by": "vertex-ai",
"supported_endpoint_types": ["openai", "anthropic"]
},
{
"id": "gemini-2.5-pro-thinking",
"object": "model",
"created": 1626777600,
"owned_by": "custom",
"supported_endpoint_types": ["openai", "gemini"]
}
],
"object": "list",
"success": true
}| Field | Type | Description |
|---|---|---|
data | Array | Model list |
data[].id | String | Model identifier — use this value when making API calls |
data[].object | String | Fixed value "model" |
data[].created | Integer | Creation timestamp reported by the API, in Unix seconds |
data[].owned_by | String | Owner or provider label reported by the API, such as openai, vertex-ai, or custom |
data[].supported_endpoint_types | Array | Supported calling formats: openai, anthropic, gemini, image-generation, embeddings, rerank, etc. |
object | String | Fixed value "list" |
success | Boolean | Whether the request succeeded |
https://www.dataeyes.ai/apexGET /api/usage/token/| Name | Required | Description |
|---|---|---|
Authorization | Yes | Bearer <API-Key> |
{
"code": true,
"message": "ok",
"data": {
"object": "token_usage",
"name": "my-production-key",
"total_granted": 5000000,
"total_used": 20,
"total_available": 4999980,
"unlimited_quota": false,
"model_limits": {},
"model_limits_enabled": false,
"expires_at": 0
}
}{
"code": true,
"message": "ok",
"data": {
"object": "token_usage",
"name": "default-key",
"total_granted": 500000,
"total_used": 3007043,
"total_available": -2507043,
"unlimited_quota": true,
"model_limits": {},
"model_limits_enabled": false,
"expires_at": 0
}
}| Field | Type | Description |
|---|---|---|
code | Boolean | Whether the request succeeded; true indicates success |
message | String | Status description; "ok" on success |
data.object | String | Fixed value "token_usage" |
data.name | String | API Key display name |
data.total_granted | Integer | Total allocated quota (internal units). Conversion: ÷ 500,000 = USD |
data.total_used | Integer | Cumulative consumed quota (internal units) |
data.total_available | Integer | Remaining available quota (total_granted − total_used) |
data.unlimited_quota | Boolean | Whether the key's quota limit is disabled. This does not indicate an unlimited account balance |
data.model_limits | Object | Model access restriction rules. Empty object {} means no restrictions |
data.model_limits_enabled | Boolean | Whether model-level access control is enabled |
data.expires_at | Integer | Key expiration time (Unix timestamp); 0 means never expires |
USD Amount = Internal Quota Value ÷ 500,000| Internal Quota Value | Equivalent USD | Calculation |
|---|---|---|
5,000,000 | $10.00 | 5000000 ÷ 500000 = 10 |
3,007,043 | $6.01 | 3007043 ÷ 500000 ≈ 6.01 |
500,000 | $1.00 | 500000 ÷ 500000 = 1 |
unlimited_quota is true, total_available may be negative. This means recorded usage exceeds the allocation; it does not by itself indicate that the key has reached a quota limit.GET /api/user/self| Name | Required | Description |
|---|---|---|
Authorization | Yes | Bearer <system_access_token> |
apex-api-user | Yes | Numeric user ID associated with the system access token |
{
"success": true,
"message": "",
"data": {
"id": 669,
"username": "example_user",
"display_name": "example_user",
"email": "user@example.com",
"role": 1,
"status": 1,
"group": "pro",
"quota": 4084864,
"used_quota": 269527941,
"request_count": 9412,
"aff_code": "xxxx",
"aff_count": 0,
"aff_quota": 0,
"aff_history_quota": 0,
"inviter_id": 0
}
}data object)| Field | Type | Description |
|---|---|---|
id | Integer | User numeric ID |
username | String | Login username |
display_name | String | Display name |
email | String | Registered email address |
role | Integer | User role. 1 = Regular user, 10 = Administrator, 100 = Super administrator |
status | Integer | Account status. 1 = Active, 2 = Disabled |
group | String | User's billing group |
quota | Integer | Account-level remaining quota (internal units, ÷500000 = USD) |
used_quota | Integer | Account-level total consumed quota |
request_count | Integer | Cumulative API request count |
aff_code | String | Referral code |
aff_count | Integer | Number of referred users |
aff_quota | Integer | Pending referral reward quota |
aff_history_quota | Integer | Historical cumulative referral rewards |
inviter_id | Integer | Inviter's user ID; 0 means no inviter |
| Step | Request | Value to use next |
|---|---|---|
| 1. Log in | POST /api/client/login | data.token: login token |
| 2. Find the key ID | GET /api/apex/api/token/search | data.items[].id: key ID |
| 3. Retrieve the full key | POST /api/apex/api/token/{id}/reveal | Full key returned by the reveal request |
POST https://www.dataeyes.ai/api/client/login| Header | Required | Description |
|---|---|---|
Content-Type | Yes | application/json |
| Parameter | Type | Required | Description |
|---|---|---|---|
account | String | Yes | Email address or phone number used to log in to the international website. For a phone number, use the same country code as on the login page and omit spaces |
password | String | Yes | Current login password |
{
"code": 0,
"data": {
"token": "<login_token>"
},
"msg": ""
}| Field | Type | Description |
|---|---|---|
code | Integer | 0 indicates a successful login |
data.token | String | Login token for the following requests |
msg | String | Response message |
code is 0, copy the complete data.token value without the surrounding quotation marks. You do not need to copy the other account information.GET https://www.dataeyes.ai/api/apex/api/token/search| Header | Required | Description |
|---|---|---|
Authorization | Yes | Bearer <login_token>, using data.token from Step 1 |
| Parameter | Type | Required | Description |
|---|---|---|---|
keyword | String | Yes, for this name-search example | Name of the key to retrieve |
p | Integer | No | Page number, starting at 1; this example uses 1 |
size | Integer | No | Items per page; this example uses 20 |
<key_name> with your key's name, for example default.{
"success": true,
"message": "",
"data": {
"page": 1,
"page_size": 20,
"total": 1,
"items": [
{
"id": 12345,
"name": "default"
}
]
}
}| Field | Type | Description |
|---|---|---|
success | Boolean | true indicates a successful query |
message | String | Response message |
data.page | Integer | Current page number |
data.page_size | Integer | Items per page |
data.total | Integer | Number of matching keys |
data.items[].id | Integer | Key ID to include in the URL in Step 3 |
data.items[].name | String | Key name |
id in Step 3. In this example, default has ID 12345; replace it with the ID returned for your own key.p to read another page. An empty data.items array means there are no records on that page.key value in a list or search result is not the full key. Use Step 3 to retrieve the full value.Field in data.items[] | Type | Description |
|---|---|---|
user_id | Integer | Key owner's numeric user ID |
key | String | Masked key value; do not use it for model calls |
viewed | Boolean | Whether the one-time viewing opportunity has been used |
status | Integer | 1 = enabled, 2 = disabled, 3 = expired, 4 = quota exhausted |
created_time | Integer | Creation time, as a Unix timestamp in seconds |
accessed_time | Integer | Last access time, as a Unix timestamp in seconds |
expired_time | Integer | Expiration time, as a Unix timestamp in seconds; -1 means no expiration |
remain_quota | Integer | Remaining key quota in internal units |
unlimited_quota | Boolean | Whether the key's quota limit is disabled |
used_quota | Integer | Consumed quota in internal units |
model_limits_enabled | Boolean | Whether the key's model restrictions are enabled |
model_limits | String | Configured model restrictions |
allow_ips | String | Configured allowed IP addresses; empty means no key-level IP restriction |
group | String | Key's configured group |
cross_group_retry | Boolean | Whether cross-group retry is enabled |
POST https://www.dataeyes.ai/api/apex/api/token/{id}/reveal| Parameter | Type | Required | Description |
|---|---|---|---|
id | Integer | Yes | Key ID returned in Step 2 |
| Header | Required | Description |
|---|---|---|
Authorization | Yes | Bearer <login_token>, using data.token from Step 1 |
12345 in the URL with the key ID from Step 2. Call this endpoint only when you are ready to save the returned key.| Field | Type | Description |
|---|---|---|
success | Boolean | true indicates a successful reveal |
message | String | Response message; token.already_viewed indicates that the viewing opportunity has already been used |
data | To be verified | Full key response; its exact structure must be confirmed by an authenticated test |
sk-, then add the response example and the exact field to copy.GET /api/subscription/self| Name | Required | Description |
|---|---|---|
Authorization | Yes | Bearer <system_access_token> |
apex-api-user | Yes | Numeric user ID associated with the system access token |
{
"success": true,
"message": "",
"data": {
"subscriptions": [],
"all_subscriptions": [],
"billing_preference": "subscription_first"
}
}| Field | Type | Description |
|---|---|---|
data.subscriptions | Array | Currently active subscription plans |
data.all_subscriptions | Array | All subscription plans (including expired) |
data.billing_preference | String | Billing priority. "subscription_first" = prioritize subscription quota |
| Task | Section | Authentication |
|---|---|---|
| Query quota limits | 1.1 | API key |
| Query cumulative usage charges | 1.2 | API key |
| List available models | 1.3 | API key |
| Query a key's quota and usage in internal units | 2.1 | API key |
| Query user information | 3.1 | System access token and numeric user ID |
| Retrieve a full API key | 3.2 | Account password for login, then login token |
| Query subscriptions | 3.3 | System access token and numeric user ID |
| Request | Success condition |
|---|---|
| Login | code is the integer 0 and data.token is present |
| Key quota and usage (Section 2.1) | code is the boolean true |
| User information, key search/list/reveal, and subscriptions | success is true; also check the returned data |
| OpenAI-compatible queries | HTTP 2xx, the expected response fields, and no error object |
msg, message, or error.message for details.| Scenario | Response | What to check |
|---|---|---|
| Missing API key | HTTP 401 | Include Authorization: Bearer <API-Key> |
| Login parameters rejected | Nonzero code, with details in msg | Check the account format and current login password |
| Login requires browser verification | Login response requests additional verification | Complete verification on the website; do not repeatedly submit the same cURL request |
| Login token missing or expired | code: 401, with details in msg | Log in again and use the new data.token in the request header |
| System-token authentication failed | code: 401, with details in msg | Check the system access token and its associated numeric user ID |
| Search returns no records | success: true and an empty result | Check the key name and page number, or use the list request in Step 2 |
| Key has already been viewed | message: "token.already_viewed" | Use the full key you previously saved; logging in again does not reset the viewing opportunity |
| Key retrieval failed | Failure status and a message | Check the login token, key ID, and error message before taking further action |
| Request URL or method is incorrect | HTTP 404 | Compare the method and full URL with the cURL example |
| Group permission denied | Message identifies a group permission problem | Check the key's configured group and available models |
model to an ID returned by /v1/models for that key.unlimited_quota set to false, trigger an alert when total_available falls below your threshold.| Version | Date | Changes |
|---|---|---|
| v2.1 draft | 2026-09-29 | Reorganized full key retrieval; updated authentication, error handling, and wording. Authenticated API testing is pending |