Documentation Index
Fetch the complete documentation index at: https://docs.veri.studio/llms.txt
Use this file to discover all available pages before exploring further.
Base URL
https://api.veri.studio/v1
Authentication
All API requests require a Bearer token. Create an API key from the dashboard or via the API keys endpoint.
curl https://api.veri.studio/v1/training_jobs \
-H "Authorization: Bearer vk_your_api_key"
API keys use the vk_ prefix and are hashed server-side. See API Keys for key management.
Endpoints
Datasets
| Method | Endpoint | Description |
|---|
POST | /v1/datasets | Upload a JSONL dataset |
POST | /v1/datasets/connect | Register an external dataset source |
POST | /v1/datasets/connect/validate | Validate a source connection |
GET | /v1/datasets | List datasets |
GET | /v1/datasets/{id} | Get dataset info |
Reward Functions
| Method | Endpoint | Description |
|---|
POST | /v1/reward_functions | Upload a reward function |
GET | /v1/reward_functions | List reward functions |
GET | /v1/reward_functions/{id} | Get reward function info |
Training Jobs
| Method | Endpoint | Description |
|---|
POST | /v1/training_jobs | Create a training job |
GET | /v1/training_jobs | List training jobs (filter by status, method) |
GET | /v1/training_jobs/{id} | Get job status |
POST | /v1/training_jobs/{id}/cancel | Cancel a job |
GET | /v1/training_jobs/{id}/logs | Stream job logs (SSE) |
GET | /v1/training_jobs/{id}/events | Get job lifecycle events |
GET | /v1/training_jobs/{id}/model | Get checkpoint download URL |
Deployments
| Method | Endpoint | Description |
|---|
POST | /v1/deployments | Create an inference deployment |
GET | /v1/deployments | List deployments (filter by status) |
GET | /v1/deployments/{id} | Get deployment details |
POST | /v1/deployments/{id}/stop | Stop a deployment |
POST | /v1/deployments/{id}/chat/completions | OpenAI-compatible inference |
GET | /v1/deployments/{id}/requests | List per-request logs |
GET | /v1/deployments/{id}/metrics | Get aggregate metrics |
Cost
| Method | Endpoint | Description |
|---|
GET | /v1/cost/summary | Get spend summary |
GET | /v1/cost/by_provider | Break down spend by provider |
GET | /v1/cost/by_gpu | Break down spend by GPU type |
GET | /v1/cost/estimate | Estimate cost from GPU shape and duration |
GET | /v1/cost/monthly_projection | Project monthly spend |
GET | /v1/cost/compare | Compare provider costs |
GET | /v1/cost/rates | Get current GPU rates |
Billing
| Method | Endpoint | Description |
|---|
GET | /v1/billing/balance | Get credit balance |
GET | /v1/billing/transactions | List balance transactions |
POST | /v1/billing/check_balance | Check whether a job can be covered by credits |
GET | /v1/billing/burn_rate | Get current credit burn rate from active jobs and deployments |
API Keys
| Method | Endpoint | Description |
|---|
POST | /v1/api_keys | Create a new API key (plaintext returned once) |
GET | /v1/api_keys | List active API keys (prefix only) |
DELETE | /v1/api_keys/{id} | Revoke an API key |
SSH Keys
| Method | Endpoint | Description |
|---|
POST | /v1/ssh_keys | Upload an SSH key pair (encrypted at rest) |
GET | /v1/ssh_keys | List SSH keys |
DELETE | /v1/ssh_keys/{id} | Delete an SSH key |
- JSON endpoints (
POST /v1/training_jobs): Use Content-Type: application/json with a JSON body.
- Upload endpoints (
POST /v1/datasets, POST /v1/reward_functions): Use multipart/form-data.
- Connector endpoints (
POST /v1/datasets/connect, POST /v1/datasets/connect/validate): Send JSON bodies.
Responses are standard JSON. Every response object includes an object field that identifies the resource type (e.g., "training_job", "deployment", "dataset", "reward_function", "api_key", "ssh_key").
Single-resource endpoints return one object. List endpoints return cursor-paginated responses:
{
"object": "list",
"data": [...],
"has_more": false
}
Success (2xx)
{
"id": "job_abc123",
"object": "training_job",
"status": "queued",
"base_model": "Qwen/Qwen3-4B",
"method": "grpo",
"output_name": "my-model",
"gpu_requested": {
"type": "A100-80GB",
"count": 1
},
"gpu": null,
"created_at": "2026-04-14T12:00:00Z"
}
Error (4xx/5xx)
{
"error": {
"type": "invalid_request_error",
"code": null,
"message": "Invalid API key",
"param": null
}
}
Common Status Codes
| Status | Meaning |
|---|
| 400 | Invalid request or unsupported state transition |
| 401 | Missing or invalid API key |
| 402 | Insufficient credit balance |
| 404 | Resource not found or not owned by the caller |
| 422 | Request body failed schema validation |
| 500 | Unexpected server error |
List endpoints support cursor-based pagination with limit and after query parameters:
curl "https://api.veri.studio/v1/datasets?limit=10&after=ds_abc123" \
-H "Authorization: Bearer vk_your_api_key"
| Parameter | Type | Default | Description |
|---|
limit | integer | 20 | Maximum number of items to return |
after | string | — | ID of the last item from the previous page (cursor) |
The response includes a has_more field indicating whether additional pages exist:
{
"object": "list",
"data": [...],
"has_more": true
}
To paginate, pass the id of the last item in data as the after parameter in the next request.