# Verda Cloud Public API - **OpenAPI Version:** `3.1.0` - **API Version:** `v1` # Introduction Verda Cloud API allows you to deploy, control instances & more via external code. ## Open API schema Download OpenAPI 3.1.0 schema here: [/v1/openapi.json](/v1/openapi.json) The API is a RESTful API over HTTPS, all requests & responses use JSON as the data exchange format. ## Official SDKs The following SDK packages maintained by Verda Cloud and use this API: - **Python SDK**: - **Go SDK**: - **Terraform** and **OpenTofu** provider: # Quick Start Guide We use [OAuth 2.0 Client Credentials](https://oauth.net/2/grant-types/client-credentials/) authentication scheme. You can generate credentials via the console UI for external applications to use Verda API. The credentials are used to generate Access & Refresh tokens. All requests to this API must be authenticated using the Access token, except for a few open endpoints. Access tokens have a short lifespan, and can be regenerated using the Refresh token. ## 1. Get Credentials from the Verda Cloud Dashboard Go to the Project page => **Keys** => **Cloud API Credentials** section and click on **Create**. These credentials will be used like a username & password for your application. Store the client secret safely - like a password. ## 2. Generate Access Token An Access Token is needed to be sent with any API call for authentication. The Access Token has a limited lifetime and is expired after a while as defined in `expires_in`. It is used as a [bearer token](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#bearer) ### To get an access token, call the token endpoint with the credentials obtained in step 1: ```json { "method": "post", "url": "https://api.verda.com/v1/oauth2/token", "headers": { "Content-Type": "application/json" }, "body": { "grant_type": "client_credentials", "client_id": "", "client_secret": "" } } ``` A valid response would look similar to this: ```json { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJoZXkiOiJ5b3UgYWN1YWxseSBjaGVja2VkIHRoaXM_In0.0RjcdKQ1NJP9gbRyXITE6LFFLwKGzeeshuubnkkfkb8", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ3b3ciOiJhbmQgdGhpcyB0b28_In0.AC5gk-o-MOptUgrouEErlhr8WT3Hg_RR6px6A0I7ZEk", "scope": "cloud-api-v1" } ``` `access_token` is the token value, to be used in the next step. `expires_in` is the duration in seconds until the token is expired. `refresh_token` can be used to create a new access token if expired. When an Access Token expires, create a new one using the refresh token: ```json { "method": "post", "url": "https://api.verda.com/v1/oauth2/token", "headers": { "Content-Type": "application/json" }, "body": { "grant_type": "refresh_token", "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ3b3ciOiJhbmQgdGhpcyB0b28_In0.AC5gk-o-MOptUgrouEErlhr8WT3Hg_RR6px6A0I7ZEk" } } ``` The response will include a new token. ## 3. Make REST API Calls That's it, you are ready to use the API, don't forget to add the Access Token to your calls: Let's call the `/balance` endpoint. Add the Access Token value to the `Authorization` header, preceded by the "Bearer" string and a space: ```json { "method": "get", "url": "https://api.verda.com/v1/balance", "headers": { "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJoZXkiOiJ5b3UgYWN1YWxseSBjaGVja2VkIHRoaXM_In0.0RjcdKQ1NJP9gbRyXITE6LFFLwKGzeeshuubnkkfkb8" } } ``` # Rate Limits Authenticated public API requests are rate limited per project in 60 second windows. ## Limits enforced - **Project limit**: 500 requests per minute for all authenticated API requests made for the same project - **Endpoint limit**: 60 requests per minute for the same project, HTTP method, and request path combination The endpoint limit key includes the full request path. Route-specific endpoint policies override the regular endpoint limit for the matching request path. ## Headers Rate limit information is returned in response headers on authenticated requests: - `RateLimit-Policy`: configured limits and window - `RateLimit`: current remaining quota and reset time per limit If a limit is exceeded, the API will return HTTP `429 Too Many Requests` and also include a `Retry-After` header with the number of seconds until requests are allowed again. ### Example of successful response with rate limits policy specified ```curl curl -X GET --verbose https://api.verda.com/v1/instances HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Length: 213 RateLimit-Policy: "project";q=500;w=60, "endpoint";q=60;w=60 RateLimit: "project";r=486;t=37, "endpoint";r=48;t=37 {...} ``` ### Example of throttled response ```curl curl -X GET --verbose https://api.verda.com/v1/instances HTTP/1.1 429 Too Many Requests Content-Type: application/json; charset=utf-8 Content-Length: 11 RateLimit-Policy: "project";q=500;w=60, "endpoint";q=50;w=60 RateLimit: "project";r=419;t=44, "endpoint";r=0;t=49 Retry-After: 49 ``` # Pagination Some endpoints support pagination using the `page` and `pageSize` query parameters. For backward compatibility, pagination does not change the JSON response payload format. Instead, clients request a page with query parameters and read pagination metadata from response headers. ## Request and response format - `page`: `1` - `pageSize`: `10` (can be extended to a maximum of 100 records per page) When pagination is available, the response includes these headers: - `X-Page`: current page number - `X-Page-Size`: current page size - `X-Total-Count`: total number of matching items Example request: ```bash GET /v1/scripts?page=1&pageSize=100 ``` Example response: ```http HTTP/1.1 200 OK Content-Type: application/json Content-Length: 11111 X-Page: 1 X-Page-Size: 100 X-Total-Count: 10000 [{ "id": "2b1af58-7537-4edb-ba81-82cee082c5e9", "name": "My startup script" }] ``` # Errors Error response body has following schema: | Key | Info | | ------- | ---------------------------------------- | | code | Error type | | message | Textual description of the error details | ## Error types | Code | Description | Matching HTTP error code | | --------------------- | ------------------------------------------------------------------------------- | ------------------------ | | invalid\_request | Invalid request, usually an input error - missing or invalid property etc. | 400 | | unauthorized\_request | Access token is missing or invalid | 401 | | insufficient\_funds | Not enough funds to perform the action | 402 | | forbidden\_action | Can't perform the current action | 403 | | not\_found | Resource not found, or invalid path | 404 | | rate\_limit\_exceeded | Too many requests for the current project or endpoint window | 429 | | server\_error | Error on datacrunch's side | 500 | | service\_unavailable | Not enough resources at the moment, try again later or use a different resource | 503 | # Compatibility The API is versioned in the path (`/v1`) and evolves in place. We add to it regularly, so your client should tolerate the following without breaking: - **New response fields.** Ignore properties you do not recognise rather than rejecting the response. Avoid strict schema validation that fails on unknown properties. - **New enum values.** Treat every enumerated set as open-ended. Handle unrecognised values with a sensible default rather than an exhaustive match that throws. # Changelog ## 2026-10-07 Automatic top-ups in the audit log A top-up charged automatically by auto top-up is now reported as an `auto_top_up` event instead of a `topup` one, so it can be told apart from a top-up you started yourself. This covers the charge being created, completed and failing — `com.verda.api.cloud.auto_top_up.create.v1`, `.complete.v1` and `.cancel.v1`. - [GET /v1/audit/log](/v1/docs#tag/journal/GET/v1/audit/log) - [POST /v1/audit/log/download](/v1/docs#tag/journal/POST/v1/audit/log/download) Filtering by `object_type=topup` therefore no longer returns automatic charges; use `auto_top_up` for those. Events recorded before this change have been relabelled the same way, so the audit log reads consistently for past and future charges. Top-ups you started yourself are unaffected. ## 2026-09-25 Inference model prices in your billing currency [GET /v1/inference/models](/v1/docs#tag/inference/GET/v1/inference/models) and [GET /v1/inference/models/{code}](/v1/docs#tag/inference/GET/v1/inference/models/%7Bcode%7D) now quote `pricing` and `service_tier_pricing` in the currency your account is billed in. Previously prices were always in USD. Each service tier in `service_tier_pricing` is quoted at its own rate, and a service tier without prices of its own is left out. ## 2026-09-24 Managed instance groups Managed instance groups provide reusable placement and template defaults for related instances. Use the `/v1/instance-groups` endpoints to manage groups. `POST /v1/instances` now accepts an optional `instance_group_id`; group instances inherit the group's instance type, image and location defaults. ## 2026-09-23 Deployment system logs System logs of serverless container and job deployments are available through the public API. System logs are platform events about a deployment, such as scheduling failures, image pull errors and failed health checks. - [GET /v1/container-deployments/{deployment\_name}/system-logs](/v1/docs#tag/serverless-containers/GET/v1/container-deployments/%7Bdeployment_name%7D/system-logs) returns the system logs of a container deployment. - [GET /v1/job-deployments/{jobName}/system-logs](/v1/docs#tag/serverless-jobs/GET/v1/job-deployments/%7BjobName%7D/system-logs) returns the system logs of a job deployment. Filter the events by `reason`, `involved_object` and `search_text`, and select the time range with `since`, `start` and `end`. Repeated events are grouped into one entry, with the number of grouped records in `count`. ## 2026-09-21 SSH key creator attribution SSH key responses now include the additive nullable UUID field `created_by_user_id`, identifying the user who added that SSH key record to the project. Historical records without a matching creation event return `null`. - [GET /v1/ssh-keys](/v1/docs#tag/SSH-Keys/GET/v1/ssh-keys) - [GET /v1/ssh-keys/{sshKeyId}](/v1/docs#tag/SSH-Keys/GET/v1/ssh-keys/%7BsshKeyId%7D) - [GET /v1/sshkeys](/v1/docs#tag/SSH-Keys/GET/v1/sshkeys) (deprecated alias) - [GET /v1/sshkeys/{sshKeyId}](/v1/docs#tag/SSH-Keys/GET/v1/sshkeys/%7BsshKeyId%7D) (deprecated alias) ## 2026-09-21 HDD storage is being decommissioned HDD storage is being decommissioned. Creating and resizing `HDD` volumes is no longer supported, and these requests now receive an HTTP 400 Bad Request response. Existing HDD volumes keep working. You can still list, attach, detach, rename, restore and delete them, and you can clone one to `NVMe` to move off HDD. To migrate an existing HDD volume, first detach it, or shut down the instance it is attached to — cloning requires the source to be detached, or its instance to be offline. Then clone it with `action: "clone"` and `type: "NVMe"`. Once the clone reaches the `detached` status, delete the HDD source. ## 2026-09-16 Inference model service tiers [GET /v1/inference/models](/v1/docs#tag/inference/GET/v1/inference/models) and [GET /v1/inference/models/{code}](/v1/docs#tag/inference/GET/v1/inference/models/%7Bcode%7D) now return `service_tiers` (the service tiers a model supports, similar to OpenAI's `service_tier`), `service_tier_pricing` (a price breakdown per tier), and `endpoint_model` (the id to send as `model` in an inference request). `endpoint_model` is always present, and is usually the same as `code`. Send it as-is; there is no case where you have to fall back to another field. ## 2026-09-15 New image categories [GET /v1/images](/v1/docs#tag/os-images/GET/v1/images) and [GET /v1/images/cluster](/v1/docs#tag/clusters/GET/v1/images/cluster) can now return `confidentialComputing` and `docker` in the `category` field, for confidential computing and Docker images. ## 2026-09-14 Container deployment templates Curated model templates for serverless containers are available through the public API. A template pins an open model from Hugging Face to a serving engine and a tested configuration, so one request creates a working inference deployment. - [GET /v1/container-deployment-templates](/v1/docs#tag/serverless-containers/GET/v1/container-deployment-templates) lists the templates, with the recommended compute for each. - [GET /v1/container-deployment-templates/{template\_id}](/v1/docs#tag/serverless-containers/GET/v1/container-deployment-templates/%7Btemplate_id%7D) returns one template with its variants and features. - [POST /v1/container-deployment-templates/{template\_id}/deployments](/v1/docs#tag/serverless-containers/POST/v1/container-deployment-templates/%7Btemplate_id%7D/deployments) creates a container deployment from the template. Variant, features, compute, scaling, the Hugging Face token secret, and the shared memory size are optional. ## 2026-09-14 Deployment logs Replica logs of serverless container and job deployments are available through the public API. Replica logs are the output that your containers write. - [GET /v1/container-deployments/{deployment\_name}/logs](/v1/docs#tag/serverless-containers/GET/v1/container-deployments/%7Bdeployment_name%7D/logs) returns the logs of a container deployment. - [GET /v1/job-deployments/{jobName}/logs](/v1/docs#tag/serverless-jobs/GET/v1/job-deployments/%7BjobName%7D/logs) returns the logs of a job deployment. Filter the log lines by `container_name`, `pod` and `search_text`, and select the time range with `since`, `start` and `end`. The default time range is the last 15 minutes, and a time range cannot be longer than 7 days. ## 2026-09-11 Resource tags Instances, clusters, and volumes now support key-value tags. Use tags to organize resources and filter the instance list. - Add tags while provisioning a new instance, cluster, or volume with the `tags` request property. New volumes included in an instance deployment can also have their own tags. - Add or remove tags from existing resources: - Instances: [POST](/v1/docs#tag/instances/POST/v1/instances/%7Binstance_id%7D/tags) or [DELETE](/v1/docs#tag/instances/DELETE/v1/instances/%7Binstance_id%7D/tags/%7BtagId%7D) tags. - Clusters: [POST](/v1/docs#tag/clusters/POST/v1/clusters/%7Bid%7D/tags) or [DELETE](/v1/docs#tag/clusters/DELETE/v1/clusters/%7Bid%7D/tags/%7BtagId%7D) tags. - Volumes: [POST](/v1/docs#tag/volumes/POST/v1/volumes/%7Bvolume_id%7D/tags) or [DELETE](/v1/docs#tag/volumes/DELETE/v1/volumes/%7Bvolume_id%7D/tags/%7BtagId%7D) tags. - Tags are reusable within a project: the same key-value pair receives the same tag id wherever it is applied. - Filter instances with `GET /v1/instances?tag=key` or `GET /v1/instances?tag=key=value`. Repeat `tag` to require multiple tags. Each resource can have up to 10 tags. Tag keys are normalized to lowercase; omit `value` to create a freeform tag. ## 2026-07-30 Audit logs The project audit logs is now available in the console and via the public API. It gives you a record of who did what in a project, when, and from where, using the [CloudEvents 1.0](https://github.com/cloudevents/spec) JSON format. - [GET /v1/audit/log](/v1/docs#tag/journal/GET/v1/audit/log) reads events, newest first. - [POST /v1/audit/log/download](/v1/docs#tag/journal/POST/v1/audit/log/download) exports the matching events as a single JSON file. Returns temporary URL that can be used to download the file. Only the project owner and members with the `admin` role can read or export the audit log. Read more about the audit log in the [Audit logs](https://docs.verda.com/resources/audit-logs/) section in our documentation. ## 2026-06-12 Startup script list sorting `GET /v1/scripts` is now sorted by creation date **descending by default**, so the most recently created scripts appear first and land on the first page. Previously the list was sorted ascending, which pushed newly created scripts onto the last page once pagination was in effect. You can control the order with the optional `orderBy` and `orderDirection` query parameters: - `orderBy=created_at` — field to sort by. The only supported value is `created_at`, the script's creation timestamp from the response payload (also the default). - `orderDirection=desc` — sort direction, either `asc` or `desc`. Defaults to `desc`. The startup script payload now also includes the `created_at` timestamp. To restore the previous behavior (oldest first), request ascending order explicitly: ```bash GET /v1/scripts?orderBy=created_at&orderDirection=asc ``` Example response: ```json [ { "id": "9f3c1e2a-1b7d-4a4e-9c2f-8d5b6e7a0c11", "name": "Older startup script", "created_at": "2026-05-01T08:15:00Z" }, { "id": "2b1af58-7537-4edb-ba81-82cee082c5e9", "name": "My startup script", "created_at": "2026-06-12T10:30:00Z" } ] ``` ## 2026-06-09 SSH key fingerprint The SSH keys endpoints now return a `fingerprint` field — the MD5 fingerprint of the public key as colon-separated hex (the same value as `ssh-keygen -E md5`), useful for automation and for matching a key against a local copy. The fingerprint is computed from the stored public key, so no extra request is needed. It is `null` for stored keys that cannot be parsed. - [GET /v1/sshkeys](/v1/docs#tag/ssh-keys/GET/v1/sshkeys) - [GET /v1/sshkeys/{sshKeyId}](/v1/docs#tag/ssh-keys/GET/v1/sshkeys/%7BsshKeyId%7D) Example response: ```json [ { "id": "39479972-f06d-4a94-8027-75a0b42dcf6b", "name": "my-laptop", "key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAXy2Jl8/DqhHm9akSXVyRx3Zh5W4SzncepC2mKZEeDC user@example.com", "fingerprint": "9b:11:74:af:5c:04:48:31:40:ef:b5:ef:e3:dc:33:81" } ] ``` ## 2026-03-30 Startup script quota and pagination Total number of startup scripts in a project now limited by a per-user quota with a default of `100` scripts and a hard maximum of `10000`. `GET /v1/scripts` now supports pagination via the `page` and `pageSize` query parameters. For backward compatibility, the response payload shape is unchanged and pagination metadata is returned in headers instead. See the [Pagination](#pagination) section for details. ## 2026-03-20 Scope-based access control for API tokens API tokens created via the OAuth 2.0 Client Credentials flow are now issued with the scope `cloud-api-v1` and restricted to documented Public API endpoints only. Previously, these tokens could access internal endpoints not intended for external use. If you are using API tokens for any undocumented endpoints, those requests will now return `403 Forbidden` with `"Insufficient scope"`. Only the endpoints listed in this API documentation are accessible with API tokens. ## 2026-03-20 Long term periods endpoints `GET /v1/long-term/periods` is now **deprecated**. Use the dedicated endpoints instead: - [GET /v1/long-term/periods/instances](/v1/docs#tag/Long-Term/GET/v1/long-term/periods/instances) — long term periods for instances - [GET /v1/long-term/periods/clusters](/v1/docs#tag/Long-Term/GET/v1/long-term/periods/clusters) — long term periods for clusters Improved OpenAPI documentation for all long term period endpoints with detailed property descriptions and examples. ## 2026-03-19 Property `location_code` is now required The location\_code property is now required in the request body when creating instances, clusters, and volumes via the Public API. Requests that omit it will receive an HTTP 400 Bad Request response instead of silently defaulting to FIN-01. This brings the API in line with the SDK, where specifying a region has always been mandatory. Breakdown of API changes: | Description | Endpoint | Schema change | | ---------------------------------------------------------- | -------------------- | ----------------------------------------------- | | [Deploy instance](#tag/instances/POST/v1/instances) | `POST /v1/instances` | `{ /* required */ location_code: string, ... }` | | [Deploy cluster](#tag/clusters/POST/v1/clusters) | `POST /v1/clusters` | `{ /* required */ location_code: string, ... }` | | [Create block volume or SFS](#tag/volumes/POST/v1/volumes) | `POST /v1/volumes` | `{ /* required */ location_code: string, ... }` | ## 2026-03-19 OpenAPI spec auth fix Fixed the OpenAPI specification incorrectly requiring bearer authentication on public endpoints (`/v1/instance-types`, `/v1/cluster-types`, `/v1/container-types`, `/v1/long-term/periods`). These endpoints are publicly accessible and no longer show an authentication requirement in the spec. ## 2026-03-16 Volume response improvements `GET /v1/volumes/{id}` now includes `is_permanently_deleted` and `deleted_at` fields when the volume is in `deleted` status. These fields are omitted for active volumes. The OpenAPI schema for this endpoint now uses `oneOf` to distinguish between the active-volume and deleted-volume response shapes. ## 2026-03-12 Improved instance action and volume deletion responses Bulk instance actions (`PUT /v1/instances`) now return structured per-action results. Each result includes the instance `id`, a `status` (`success` or `error`), and an `error` message when applicable. When all actions succeed the response is `202 Accepted`; when some fail, you receive a `207 Multi-Status` with individual outcomes. A single-instance action that is already in the requested state now returns `204 No Content` instead of an error. Volume deletion (`DELETE /v1/volumes/{id}`) now returns `204 No Content` when the volume is already deleted, making the operation idempotent. OpenAPI schema fields that accept both a single UUID string and an array of UUIDs (`id`, `ssh_key_ids`, `volume_ids`) are now documented with `oneOf` for accurate client generation. ## 2026-03-11 API rate limits Introduced rate limits to our Public API to ensure the stability of our API and platform for everyone. Rate limits are restrictions our API enforces on how frequently a user or client can make requests to our services within a given timeframe. Please take a look at our API documentation section ["Rate limits"](https://api.verda.com/v1/docs#description/rate-limits). ## 2026-02-03 Spot instance volume policy When creating a spot instance, it is now possible to specify a removal policy for the OS volume and any additional volumes created alongside it. Use the `on_spot_discontinue` field: [POST /v1/instances](/v1/docs#tag/instances/POST/v1/instances) ```js POST v1/instances { "instance_type": "CPU.4V.16G", "image": "ubuntu-24.04", "ssh_key_ids": ["442e6a59-26c2-4cea-a619-39762c0d2385"], "hostname": "test-instance", "location_code": "FIN-03", "is_spot": true, "os_volume": { "name": "test-instance-os-volume", "size": 55, // If "delete_permanently", the volume will be deleted when the spot instance is discontinued "on_spot_discontinue": "keep_detached" | "move_to_trash" | "delete_permanently" } } ``` ## 2026-02-03 Delete volumes permanently when deleting an instance When deleting an instance, you can now specify whether its volumes should be moved to deleted storage (default) or deleted permanently: [PUT /v1/instances](/v1/docs#tag/instances/PUT/v1/instances) ```js PUT v1/instances { "action": "delete", "id": "442e6a59-26c2-4cea-a619-39762c0d2385", "volume_ids": ["5e9e63a9-fc3b-427b-b259-0c77dce61090"], // Will delete the instance and volumes permanently "delete_permanently": true } ``` ## Servers - **URL:** `http://localhost:3010` ## Operations ### Get access token - **Method:** `POST` - **Path:** `/v1/oauth2/token` - **Tags:** Authentication Get access token for public API using client credentials or refresh token.You can manage your credentials at , under the **Keys** => **Cloud API credentials** section. #### Request Body ##### Content-Type: application/json **One of:** - **`client_id` (required)** `string` - **`client_secret` (required)** `string` - **`grant_type` (required)** `string`, possible values: `"client_credentials", "refresh_token"` * **`grant_type` (required)** `string`, possible values: `"client_credentials", "refresh_token"` * **`refresh_token` (required)** `string` **Example:** ```json { "grant_type": "client_credentials", "client_id": "6a51jsgnISg6JOyE7wYZh", "client_secret": "TvSBFujsqloJb4Jbcezths1OPK9my3zodM3zot9Fn5" } ``` #### Responses ##### Status: 200 Valid credentials ###### Content-Type: application/json - **`access_token` (required)** `string` — Access token value - **`expires_in` (required)** `number` — Token expiration time in seconds - **`refresh_token` (required)** `string` — Refresh token value - **`scope` (required)** `string` — Access scope - **`token_type` (required)** `string` — Token type **Example:** ```json { "access_token": "eyJhbGciOiJIUzI1NiI...", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "OU4O2BwA690cKg2OfGS8pgIfGSTD2vJ...", "scope": "cloud-api-v1" } ``` ##### Status: 400 Invalid request ###### Content-Type: application/json - **`code` (required)** `string`, possible values: `"invalid_request", "unauthorized_request", "insufficient_funds", "forbidden_action", "not_found", "conflict", "server_error", "service_unavailable"` - **`message` (required)** `string` — Error message **Example:** ```json { "code": "invalid_request", "message": "" } ``` ##### Status: 401 Unauthorized ###### Content-Type: application/json - **`code` (required)** `string`, possible values: `"invalid_request", "unauthorized_request", "insufficient_funds", "forbidden_action", "not_found", "conflict", "server_error", "service_unavailable"` - **`message` (required)** `string` — Error message **Example:** ```json { "code": "invalid_request", "message": "" } ``` ### Get project balance - **Method:** `GET` - **Path:** `/v1/balance` - **Tags:** Balance #### Responses ##### Status: 200 Returns the project balance ###### Content-Type: application/json - **`amount` (required)** `number` — Project balance - **`currency` (required)** `string`, possible values: `"usd", "eur"`, default: `"usd"` — Currency type **Example:** ```json { "amount": 1000, "currency": "usd" } ``` ### Get images types for instances - **Method:** `GET` - **Path:** `/v1/images` - **Tags:** Images #### Responses ##### Status: 200 Returns available image types for instances ###### Content-Type: application/json **Array of:** - **`category` (required)** `string` — Image category - **`details` (required)** `array` — Image details **Items:** `string` - **`id` (required)** `string` — Image id - **`image_type` (required)** `string` — Image type - **`is_cluster` (required)** `boolean` — Is cluster - **`is_default` (required)** `boolean` — Is default image - **`name` (required)** `string` — Image name **Example:** ```json [ { "id": "8cf4043b-b5e2-4f91-a0e2-50d8bfff2ad3", "image_type": "ubuntu-24.04", "name": "Ubuntu 24.04", "is_default": false, "details": [ "Ubuntu 24.04", "Minimal Image" ], "category": "ubuntu", "is_cluster": false } ] ``` ##### Status: 404 Instance type not found ### Get images types for cluster - **Method:** `GET` - **Path:** `/v1/images/cluster` - **Tags:** Images, Clusters #### Responses ##### Status: 200 Returns available image types for cluster ###### Content-Type: application/json **Array of:** - **`category` (required)** `string` — Image category - **`details` (required)** `array` — Image details **Items:** `string` - **`id` (required)** `string` — Image id - **`image_type` (required)** `string` — Image type - **`is_cluster` (required)** `boolean` — Is cluster - **`is_default` (required)** `boolean` — Is default image - **`name` (required)** `string` — Image name **Example:** ```json [ { "id": "8cf4043b-b5e2-4f91-a0e2-50d8bfff2ad3", "image_type": "ubuntu-24.04", "name": "Ubuntu 24.04", "is_default": false, "details": [ "Ubuntu 24.04", "Minimal Image" ], "category": "ubuntu", "is_cluster": false } ] ``` ##### Status: 404 Instance type not found ### Get all volumes - **Method:** `GET` - **Path:** `/v1/volumes` - **Tags:** Volumes #### Responses ##### Status: 200 Returns a list of all volumes ### Rate limits This endpoint is rate limited to 120 requests per minute per project. ###### Content-Type: application/json **Array of:** - **`base_hourly_cost` (required)** `number` — Volume base hourly cost - **`contract` (required)** `string` — Volume contract type - **`create_directory_command` (required)** `string` — Create directory command - **`created_at` (required)** `string` — Volume creation date - **`currency` (required)** `string`, possible values: `"usd", "eur"` — Volume currency - **`filesystem_to_fstab_command` (required)** `string` — Filesystem to fstab command - **`id` (required)** `string` — Volume ID - **`instance_id` (required)** `string` — Instance ID - **`instances` (required)** `array` — Instance info the volume is attached to **Items:** `string` - **`is_os_volume` (required)** `boolean` — Is OS volume - **`location` (required)** `string` — Volume location - **`long_term` (required)** `object` — Long term contract details - **`monthly_price` (required)** `number` — Volume monthly price - **`mount_command` (required)** `string` — Mount command - **`name` (required)** `string` — Volume name - **`pseudo_path` (required)** `string` — Volume pseudo path. Unique identifier for your filesystem - **`size` (required)** `number` — Volume size in GB - **`ssh_key_ids` (required)** `array` — Array of SSH key IDs that are linked to the volume if it is an OS volume **Items:** `string` - **`status` (required)** `string`, possible values: `"ordered", "attached", "attaching", "detached", "deleted", "cloning", "detaching", "deleting", "restoring", "created", "exported", "canceled", "canceling"` — Volume status - **`tags` (required)** `array` **Items:** - **`id` (required)** `string` - **`key` (required)** `string` - **`value` (required)** `string` — Empty string for a freeform tag - **`target` (required)** `string` — Volume target - **`type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` — Volume type - **`created_by_user_id`** `string` **Example:** ```json [ { "id": "4cde5a92-dfeb-4032-87f0-bf3f6014f87a", "instance_id": "479a5578-cc6e-4081-9c2f-8e7def744663", "instances": [ { "id": "479a5578-cc6e-4081-9c2f-8e7def744663", "auto_rental_extension": null, "ip": "123.123.123.123", "instance_type": "4A100.88V", "status": "running", "os_volume_id": "01f67384-c409-48c1-874a-9b42db3a4d0f", "hostname": "hazy-star-swims-fin-01", "instance_template": { "instance_type": "4A100.88V", "cpu_cores": 128, "gpu_number": 4, "gpu_vram_gb": 80, "ram_gb": 512 }, "instance_model": { "code": "A100_80G", "manufacturer": "NVIDIA", "category": "GPU", "cluster_model_code": null } } ], "name": "OS-NVMe-84Ca37Jf", "created_at": "2024-07-08T19:19:54.247Z", "created_by_user_id": "7dfc2631-0158-4f74-93f6-6b46dcb90fef", "status": "attached", "size": 100, "is_os_volume": true, "target": "vda", "type": "NVMe", "location": "FIN-01", "ssh_key_ids": [ "d9e2bd98-aa00-4fc0-8d54-d600a562e398" ], "pseudo_path": "volume-84Ca37Jf", "create_directory_command": "mkdir -p /mnt/volume", "mount_command": "mount -t nfs -o nconnect=16 nfs.fin-01.datacrunch.io:volume-88eb67d0 /mnt/volume", "filesystem_to_fstab_command": "grep -qxF 'nfs.fin-01.datacrunch.io:volume-88eb67d0 /mnt/volume nfs defaults 0 0' /etc/fstab || echo 'nfs.fin-01.datacrunch.io:volume-88eb67d0 /mnt/volume nfs defaults 0 0' | sudo tee -a /etc/fstab", "contract": "LONG_TERM", "base_hourly_cost": 0.0273972602739726, "monthly_price": 20, "currency": "eur", "long_term": { "end_date": "2025-01-08T19:34:16.663Z", "long_term_period": "3 months", "discount_percentage": 14, "auto_rental_extension": false, "next_period_price": 49.93356, "current_period_price": 49.93356 }, "tags": [ { "id": "tag_0aB1cD2eF3gH4iJ5kL6mN7", "key": "environment", "value": "production" } ] } ] ``` ### Create volume - **Method:** `POST` - **Path:** `/v1/volumes` - **Tags:** Volumes #### Request Body ##### Content-Type: application/json - **`location_code` (required)** `string` — Location code - **`name` (required)** `string` — Volume name - **`size` (required)** `number` — Volume size in GB - **`type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` — Volume type - **`instance_id`** `string` — Instance ID to attach the volume to - **`instance_ids`** `array` — Array of instance IDs to attach the volume to **Items:** `string` - **`tags`** `array` — Key-value tags for the new volume. Maximum 10. Omit \`value\` for a freeform tag. Keys are lowercased. **Items:** - **`key` (required)** `string` - **`value`** `string` — Omit for a freeform tag with no value **Example:** ```json { "type": "NVMe", "location_code": "FIN-01", "size": 50, "instance_id": "1400cecc-e894-4d06-bd29-6cddaaeeb623", "instance_ids": [ "8c1b7338-713d-4070-98cb-c7d7f16c0df3", "3b58159d-60a2-4eb5-80bb-2d13ebe552bd" ], "name": "my-volume", "tags": [ { "key": "environment", "value": "production" } ] } ``` #### Responses ##### Status: 202 Volume ID ###### Content-Type: application/json ##### Status: 403 One or more of the specified instances is not shut down ### Perform action on a volume or multiple volumes - **Method:** `PUT` - **Path:** `/v1/volumes` - **Tags:** Volumes #### Request Body ##### Content-Type: application/json - **`action` (required)** `string`, possible values: `"attach", "detach", "delete", "rename", "resize", "restore", "clone", "cancel", "create", "export", "transfer"` — Action to perform on the volume(s) The \`clone\` action returns its destination volume ID: \`{"id":"..."}\`. Send a \`cancel\` action with that same ID to interrupt a cross-datacenter clone. - **`id` (required)** `object` — Volume ID(s) to perform the action on. Single volume id or an array of volume ids - **`instance_id`** `string` — Instance ID to attach the volume to, if the action is attach - **`instance_ids`** `array` — Array of instance IDs to attach the volume to, if the action is attach **Items:** `string` - **`is_permanent`** `boolean` — If deleting volume(s), delete them permanently - **`location_code`** `string` — Target location code if cloning the volume - **`name`** `string` — New volume name - **`size`** `number` — New volume size in GB. Can't be lower than current size - **`type`** `string` — Target volume type **Example:** ```json { "action": "detach", "id": [ "563454aa-623d-494e-a831-add51c95f293" ], "size": 100, "instance_id": "3e88621d-ba46-4fad-8ec7-a2110df33091", "instance_ids": [ "7a18e723-20af-41cd-a181-bcc7149c87ea", "d752543b-24f9-4280-b0fd-b65367e2c620" ], "name": "volume-name", "type": "NVMe", "is_permanent": true, "location_code": "FIN-01" } ``` #### Responses ##### Status: 202 ### Get all volumes that are in trash - **Method:** `GET` - **Path:** `/v1/volumes/trash` - **Tags:** Volumes #### Responses ##### Status: 200 Returns a list of all volumes in trash ###### Content-Type: application/json **Array of:** - **`base_hourly_cost` (required)** `number` — Volume base hourly cost - **`contract` (required)** `string` — Volume contract type - **`created_at` (required)** `string` — Volume creation date - **`currency` (required)** `string`, possible values: `"usd", "eur"` — Volume currency - **`deleted_at` (required)** `string` — Volume deletion date - **`id` (required)** `string` — Volume ID - **`instance_id` (required)** `string` — Instance ID - **`instances` (required)** `array` — Instance info the volume is attached to **Items:** `string` - **`is_os_volume` (required)** `boolean` — Is OS volume - **`is_permanently_deleted` (required)** `boolean` — Is volume permanently deleted - **`location` (required)** `string` — Volume location - **`monthly_price` (required)** `number` — Volume monthly price - **`name` (required)** `string` — Volume name - **`size` (required)** `number` — Volume size in GB - **`ssh_key_ids` (required)** `array` — Array of SSH key IDs that are linked to the volume if it is an OS volume **Items:** `string` - **`status` (required)** `string`, possible values: `"ordered", "attached", "attaching", "detached", "deleted", "cloning", "detaching", "deleting", "restoring", "created", "exported", "canceled", "canceling"` — Volume status - **`tags` (required)** `array` **Items:** - **`id` (required)** `string` - **`key` (required)** `string` - **`value` (required)** `string` — Empty string for a freeform tag - **`target` (required)** `string` — Volume target - **`type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` — Volume type **Example:** ```json [ { "id": "4cde5a92-dfeb-4032-87f0-bf3f6014f87a", "instance_id": "479a5578-cc6e-4081-9c2f-8e7def744663", "instances": [ { "id": "479a5578-cc6e-4081-9c2f-8e7def744663", "auto_rental_extension": null, "ip": "123.123.123.123", "instance_type": "4A100.88V", "status": "running", "os_volume_id": "01f67384-c409-48c1-874a-9b42db3a4d0f", "hostname": "hazy-star-swims-fin-01", "instance_template": { "instance_type": "4A100.88V", "cpu_cores": 128, "gpu_number": 4, "gpu_vram_gb": 80, "ram_gb": 512 }, "instance_model": { "code": "A100_80G", "manufacturer": "NVIDIA", "category": "GPU", "cluster_model_code": null } } ], "name": "OS-NVMe-84Ca37Jf", "created_at": "2024-07-08T19:19:54.247Z", "status": "attached", "size": 100, "is_os_volume": true, "target": "vda", "type": "NVMe", "location": "FIN-01", "ssh_key_ids": [ "d9e2bd98-aa00-4fc0-8d54-d600a562e398" ], "contract": "LONG_TERM", "base_hourly_cost": 0.0273972602739726, "monthly_price": 20, "currency": "eur", "tags": [ { "id": "tag_0aB1cD2eF3gH4iJ5kL6mN7", "key": "environment", "value": "production" } ], "deleted_at": "2025-01-10T11:35:47.633Z", "is_permanently_deleted": false } ] ``` ### Get volume by id - **Method:** `GET` - **Path:** `/v1/volumes/{volume_id}` - **Tags:** Volumes #### Responses ##### Status: 200 Returns volume details ###### Content-Type: application/json **One of:** - **`base_hourly_cost` (required)** `number` — Volume base hourly cost - **`contract` (required)** `string` — Volume contract type - **`create_directory_command` (required)** `string` — Create directory command - **`created_at` (required)** `string` — Volume creation date - **`currency` (required)** `string`, possible values: `"usd", "eur"` — Volume currency - **`filesystem_to_fstab_command` (required)** `string` — Filesystem to fstab command - **`id` (required)** `string` — Volume ID - **`instance_id` (required)** `string` — Instance ID - **`instances` (required)** `array` — Instance info the volume is attached to **Items:** `string` - **`is_os_volume` (required)** `boolean` — Is OS volume - **`location` (required)** `string` — Volume location - **`long_term` (required)** `object` — Long term contract details - **`monthly_price` (required)** `number` — Volume monthly price - **`mount_command` (required)** `string` — Mount command - **`name` (required)** `string` — Volume name - **`pseudo_path` (required)** `string` — Volume pseudo path. Unique identifier for your filesystem - **`size` (required)** `number` — Volume size in GB - **`ssh_key_ids` (required)** `array` — Array of SSH key IDs that are linked to the volume if it is an OS volume **Items:** `string` - **`status` (required)** `string`, possible values: `"ordered", "attached", "attaching", "detached", "deleted", "cloning", "detaching", "deleting", "restoring", "created", "exported", "canceled", "canceling"` — Volume status - **`tags` (required)** `array` **Items:** - **`id` (required)** `string` - **`key` (required)** `string` - **`value` (required)** `string` — Empty string for a freeform tag - **`target` (required)** `string` — Volume target - **`type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` — Volume type - **`created_by_user_id`** `string` * **`base_hourly_cost` (required)** `number` — Volume base hourly cost * **`contract` (required)** `string` — Volume contract type * **`created_at` (required)** `string` — Volume creation date * **`currency` (required)** `string`, possible values: `"usd", "eur"` — Volume currency * **`deleted_at` (required)** `string` — Volume deletion date * **`id` (required)** `string` — Volume ID * **`instance_id` (required)** `string` — Instance ID * **`instances` (required)** `array` — Instance info the volume is attached to **Items:** `string` * **`is_os_volume` (required)** `boolean` — Is OS volume * **`is_permanently_deleted` (required)** `boolean` — Is volume permanently deleted * **`location` (required)** `string` — Volume location * **`monthly_price` (required)** `number` — Volume monthly price * **`name` (required)** `string` — Volume name * **`size` (required)** `number` — Volume size in GB * **`ssh_key_ids` (required)** `array` — Array of SSH key IDs that are linked to the volume if it is an OS volume **Items:** `string` * **`status` (required)** `string`, possible values: `"ordered", "attached", "attaching", "detached", "deleted", "cloning", "detaching", "deleting", "restoring", "created", "exported", "canceled", "canceling"` — Volume status * **`tags` (required)** `array` **Items:** - **`id` (required)** `string` - **`key` (required)** `string` - **`value` (required)** `string` — Empty string for a freeform tag * **`target` (required)** `string` — Volume target * **`type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` — Volume type **Example:** ```json { "id": "4cde5a92-dfeb-4032-87f0-bf3f6014f87a", "instance_id": "479a5578-cc6e-4081-9c2f-8e7def744663", "instances": [ { "id": "479a5578-cc6e-4081-9c2f-8e7def744663", "auto_rental_extension": null, "ip": "123.123.123.123", "instance_type": "4A100.88V", "status": "running", "os_volume_id": "01f67384-c409-48c1-874a-9b42db3a4d0f", "hostname": "hazy-star-swims-fin-01", "instance_template": { "instance_type": "4A100.88V", "cpu_cores": 128, "gpu_number": 4, "gpu_vram_gb": 80, "ram_gb": 512 }, "instance_model": { "code": "A100_80G", "manufacturer": "NVIDIA", "category": "GPU", "cluster_model_code": null } } ], "name": "OS-NVMe-84Ca37Jf", "created_at": "2024-07-08T19:19:54.247Z", "created_by_user_id": "7dfc2631-0158-4f74-93f6-6b46dcb90fef", "status": "attached", "size": 100, "is_os_volume": true, "target": "vda", "type": "NVMe", "location": "FIN-01", "ssh_key_ids": [ "d9e2bd98-aa00-4fc0-8d54-d600a562e398" ], "pseudo_path": "volume-84Ca37Jf", "create_directory_command": "mkdir -p /mnt/volume", "mount_command": "mount -t nfs -o nconnect=16 nfs.fin-01.datacrunch.io:volume-88eb67d0 /mnt/volume", "filesystem_to_fstab_command": "grep -qxF 'nfs.fin-01.datacrunch.io:volume-88eb67d0 /mnt/volume nfs defaults 0 0' /etc/fstab || echo 'nfs.fin-01.datacrunch.io:volume-88eb67d0 /mnt/volume nfs defaults 0 0' | sudo tee -a /etc/fstab", "contract": "LONG_TERM", "base_hourly_cost": 0.0273972602739726, "monthly_price": 20, "currency": "eur", "long_term": { "end_date": "2025-01-08T19:34:16.663Z", "long_term_period": "3 months", "discount_percentage": 14, "auto_rental_extension": false, "next_period_price": 49.93356, "current_period_price": 49.93356 }, "tags": [ { "id": "tag_0aB1cD2eF3gH4iJ5kL6mN7", "key": "environment", "value": "production" } ] } ``` ### Delete volume by id - **Method:** `DELETE` - **Path:** `/v1/volumes/{volume_id}` - **Tags:** Volumes #### Request Body ##### Content-Type: application/json - **`is_permanent`** `boolean`, default: `false` — If true, the volume will be removed permanently **Example:** ```json { "is_permanent": false } ``` #### Responses ##### Status: 202 ### Add a tag to a volume - **Method:** `POST` - **Path:** `/v1/volumes/{volume_id}/tags` - **Tags:** Volumes Add one key-value tag. Maximum 10 tags per volume. Omit `value` for a freeform tag. Keys are lowercased. A matching project tag is reused; adding one already linked to this volume returns 409. #### Request Body ##### Content-Type: application/json - **`key` (required)** `string` - **`value`** `string` — Omit for a freeform tag with no value **Example:** ```json { "key": "environment", "value": "production" } ``` #### Responses ##### Status: 201 Tag created ###### Content-Type: application/json - **`id` (required)** `string` - **`key` (required)** `string` - **`value` (required)** `string` — Empty string for a freeform tag **Example:** ```json { "id": "tag_0aB1cD2eF3gH4iJ5kL6mN7", "key": "environment", "value": "production" } ``` ##### Status: 403 Forbidden ##### Status: 409 The matching tag is already linked to the volume ### Remove a tag from a volume - **Method:** `DELETE` - **Path:** `/v1/volumes/{volume_id}/tags/{tagId}` - **Tags:** Volumes #### Responses ##### Status: 204 Tag removed ##### Status: 403 Forbidden ##### Status: 404 Volume or tag not found ### Get volume types - **Method:** `GET` - **Path:** `/v1/volume-types` - **Tags:** Volume Types #### Responses ##### Status: 200 Returns the list of available volume types ###### Content-Type: application/json **Array of:** - **`burst_bandwidth` (required)** `number` — Burst bandwidth - **`continuous_bandwidth` (required)** `number` — Continuous bandwidth - **`internal_network_speed` (required)** `number` — Internal network speed - **`iops` (required)** `string` — IOPS - **`is_shared_fs` (required)** `boolean` — Is shared file system - **`price` (required)** `object` — Price details - **`throughput_gbps` (required)** `number` — Throughput in GB/s - **`type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` — Volume type **Example:** ```json [ { "type": "NVMe", "price": { "price_per_month_per_gb": 0.2, "cps_per_gb": 7.6103500761035e-8, "currency": "usd" }, "is_shared_fs": false, "burst_bandwidth": 2500, "continuous_bandwidth": 2000, "internal_network_speed": 50, "iops": "100k", "throughput_gbps": 4 } ] ``` ### Get instances - **Method:** `GET` - **Path:** `/v1/instances` - **Tags:** Instances Return all instances of the project, optionally filtered by status and/or tags. Tag filters: `tag=key` matches instances carrying the key with any value, `tag=key=value` matches the value exactly (split at the first `=`). Repeat the parameter to require multiple tags at once. ### Rate limits This endpoint is rate limited to 120 requests per minute per project. #### Responses ##### Status: 200 Instance or a list of instances ###### Content-Type: application/json **Array of:** - **`contract` (required)** `string`, possible values: `"LONG_TERM", "PAY_AS_YOU_GO", "SPOT"` - **`cpu` (required)** `object` - **`created_at` (required)** `string` - **`description` (required)** `string` — Instance description; an empty string when none was supplied. - **`gpu` (required)** `object` - **`gpu_memory` (required)** `object` - **`hostname` (required)** `string` - **`id` (required)** `string` - **`image` (required)** `string` - **`instance_type` (required)** `string` - **`ip` (required)** `string` — Public address; \`null\` when the instance is not reachable from the internet - **`is_spot` (required)** `boolean` - **`jupyter_token` (required)** `string` - **`location` (required)** `string` - **`memory` (required)** `object` - **`os_name` (required)** `string` - **`os_volume_id` (required)** `string` - **`price_per_hour` (required)** `number` - **`pricing` (required)** `string`, possible values: `"DYNAMIC_PRICE", "FIXED_PRICE"` - **`ssh_key_ids` (required)** `array` **Items:** `string` - **`startup_script_id` (required)** `string` - **`status` (required)** `string`, possible values: `"running", "provisioning", "offline", "discontinued", "unknown", "ordered", "notfound", "new", "error", "deleting", "validating", "no_capacity", "installation_failed"` - **`storage` (required)** `object` - **`tags` (required)** `array` **Items:** - **`id` (required)** `string` - **`key` (required)** `string` - **`value` (required)** `string` — Empty string for a freeform tag - **`volume_ids` (required)** `array` **Items:** `string` - **`created_by_user_id`** `string` **Example:** ```json [ { "id": "edbbc4b4-809b-41d6-a6ee-f33e1d9d740e", "ip": "1.2.3.4", "status": "running", "created_at": "2023-07-15T14:10:26.654Z", "created_by_user_id": "7dfc2631-0158-4f74-93f6-6b46dcb90fef", "cpu": { "description": "176 CPU", "number_of_cores": 176, "model": "AMD Genoa" }, "gpu": { "description": "8x A100", "number_of_gpus": 8 }, "gpu_memory": { "description": "80GB GPU RAM", "size_in_gigabytes": 80 }, "memory": { "description": "640GB RAM", "size_in_gigabytes": 640 }, "storage": { "description": "dynamic" }, "hostname": "hazy-star-swims-fin-01", "description": "ubuntu-22-04-cuda-12-0-docker-fin-01", "tags": [ { "id": "tag_0aB1cD2eF3gH4iJ5kL6mN7", "key": "environment", "value": "production" } ], "location": "FIN-01", "price_per_hour": 2.481, "is_spot": false, "instance_type": "8A100.176V", "image": "ubuntu-22-04-cuda-12-0-docker", "os_name": "Ubuntu 22.04", "startup_script_id": "95cec4c3-af69-42eb-a790-fcacebfdfcea", "ssh_key_ids": [ "dd50b622-1c36-48c2-a485-f4d4937a3ea1" ], "os_volume_id": "95cec4c3-af69-42eb-a790-fcacebfdfcea", "jupyter_token": "b9e6d8517db3a722ccfb309ca599a35f", "contract": "PAY_AS_YOU_GO", "pricing": "FIXED_PRICE", "volume_ids": [ "95cec4c3-af69-42eb-a790-fcacebfdfcea", "dd50b622-1c36-48c2-a485-f4d4937a3ea1" ] } ] ``` ### Deploy instance - **Method:** `POST` - **Path:** `/v1/instances` - **Tags:** Instances Deploy a new instance. Before deploying an instance, you need to add at least ssh key to be able to access your instance. Instance types can be listed using the `GET /instance-types` endpoint. Available images can be listed using the `GET /images` endpoint, using the `image_type` value from the result. Existing detached OS volumes could be used as an image, put the volume ID as the `image` value. It's also possible to define new volumes that will be created and attached to the new instance. New volumes location will be the same as the instance. Existing detached volumes can be attached to the deployed instance by adding their IDs to the `existing_volumes` property. #### Request Body ##### Content-Type: application/json - **`hostname` (required)** `string` - **`contract`** `string`, possible values: `"LONG_TERM", "PAY_AS_YOU_GO", "SPOT"` - **`coupon`** `string` - **`description`** `string` — Optional instance description. - **`existing_volumes`** `array` — IDs of additional existing detached volumes to attach to this new instance when its created. (To configure instance \*\*OS\*\* volume, use \`"image"\` and \`"os\_volume"\` properties.) **Items:** `string` - **`image`** `string` — Required unless \`instance\_group\_id\` is set, in which case the group's template supplies the default (a group instance may override it). OS image specification for the created instance. There are two options: 1. OS image type or UUID. For a list of advertised images, check \`GET /images\`. Hidden images can also be deployed directly. The image must be enabled or explicitly enabled for the project owner. To set the name and size, use \`"os\_volume"\` property. 2. Previously customized OS volume ID. (To create an OS volume, first make an instance with existing \`"image"\` type. To customize the volume content, ssh into that instance. Finally, delete the instance but keep the volume.) - **`instance_group_id`** `string` — Create this instance in the given instance group. - **`instance_type`** `string` — Required unless \`instance\_group\_id\` is set, in which case the group supplies it. - **`is_spot`** `boolean` — Create a spot instance. Spot instances may be evicted by Verda at any time without warning. - **`location_code`** `string` — Location code for the instance and any newly created volumes. Required unless \`instance\_group\_id\` is set, in which case the group supplies it. - **`os_volume`** `object` — Newly created OS volume name and size (in GB). Use when \`"image"\` property is an OS image type. For a group instance, the size must be at least the group's OS volume size. Object properties: \* \`name\` - Name of the OS volume \* \`size\` - Size of the OS volume in GB \* \`on\_spot\_discontinue\` - Removal policy for the OS volume for spot instances. Optional, by default, nothing is deleted. Allowed values: \`keep\_detached\` (default behavior), \`move\_to\_trash\` (will be deleted after 96 hours and counts towards the storage volume quota), \`delete\_permanently\` (will be deleted immediately). - **`pricing`** `string`, possible values: `"DYNAMIC_PRICE", "FIXED_PRICE"` — This field is deprecated as DYNAMIC\_PRICE is removed. Only FIXED\_PRICE is supported now. - **`ssh_key_ids`** `object` - **`startup_script_id`** `string` - **`tags`** `array` — Key-value tags for the new instance. Maximum 10. Omit \`value\` for a freeform tag. Keys are lowercased. **Items:** - **`key` (required)** `string` - **`value`** `string` — Omit for a freeform tag with no value - **`volumes`** `array` — Additional (\*\*non-OS\*\*) volumes to create and attach to this new instance. (To configure \*\*OS\*\* volume, use \`"image"\` and \`"os\_volume"\` properties.) **Items:** - **`name` (required)** `string` - **`size` (required)** `number` - **`type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` - **`on_spot_discontinue`** `string`, possible values: `"keep_detached", "move_to_trash", "delete_permanently"` — Optional, by default, nothing is deleted. Should we automatically delete, if instance is deleted because of spot? Allowed values: \* \`keep\_detached\` (default behavior, volume will be detached), \* \`move\_to\_trash\` (will be deleted after 96 hours and counts towards the storage volume quota), \* \`delete\_permanently\` (will be deleted immediately). - **`tags`** `array` — Key-value tags for the new volume. Maximum 10. Omit \`value\` for a freeform tag. Keys are lowercased. **Items:** - **`key` (required)** `string` - **`value`** `string` — Omit for a freeform tag with no value **Example:** ```json { "instance_group_id": "6953837c-aa1a-4670-81bf-94cbc96be920", "instance_type": "1H100.80S.30V", "image": "ubuntu-22.04-cuda-12.4-docker", "ssh_key_ids": [ "3eafa73f-82a9-4f21-aadb-5a15392469fb" ], "startup_script_id": "7f81d466-a071-472c-8b4f-7862f2b3858b", "hostname": "my-instance-hostname", "description": "", "tags": [ { "key": "environment", "value": "production" }, { "key": "benchmark" } ], "location_code": "FIN-01", "os_volume": { "name": "custom-os-volume-name", "size": 100, "on_spot_discontinue": "keep_detached" }, "is_spot": true, "coupon": "COUPON-CODE-2026", "volumes": [ { "name": "additional-volume-name", "size": 1000, "type": "NVMe" } ], "existing_volumes": [ "b8480094-b065-4b50-9204-e07d742eba01" ], "contract": "PAY_AS_YOU_GO" } ``` #### Responses ##### Status: 202 Instance ID ###### Content-Type: application/json ##### Status: 503 The requested instance type has no capacity in the selected location ###### Content-Type: application/json ### Perform action on an instance or multiple instances - **Method:** `PUT` - **Path:** `/v1/instances` - **Tags:** Instances Perform an action on a single or multiple instances. Note: to `hibernate` an instance, you must first `shutdown` it. All instance volumes would be detached and the instance will be deleted. **Important**: To remove an instance and stop charging your account, you must `delete` it. Using `shutdown` will keep charging your account. When deleting an instance, you can specify which of its' attached volumes will be deleted by providing `volume_ids` array. Any attached volumes that are not specified in the array would be detached. Note: If not providing a `volume_ids` array, only the OS volume will be deleted and the rest detached. #### Request Body ##### Content-Type: application/json - **`action` (required)** `string`, possible values: `"boot", "start", "shutdown", "delete", "discontinue", "hibernate", "configure_spot", "force_shutdown", "delete_stuck", "deploy", "transfer"` - **`id` (required)** `object` — Instance ID or list of instance IDs - **`delete_permanently`** `boolean`, default: `false` — Delete the volumes permanently. Only applicable for delete (or discontinue) action, when volume IDs to delete are also provided. - **`volume_ids`** `array` — Volume IDs to delete. Specify empty array to indicate no volumes should be deleted (previously known as "hibernate") **Items:** `string` **Example:** ```json { "action": "boot", "id": [ "ec127c7e-173b-457e-b71c-504ceda7d44e" ], "volume_ids": [ "00eab353-034b-42f6-bc55-6acdb377f3ea" ], "delete_permanently": false } ``` #### Responses ##### Status: 202 All actions completed successfully ###### Content-Type: application/json **Array of:** - **`action` (required)** `string`, possible values: `"boot", "start", "shutdown", "delete", "discontinue", "hibernate", "configure_spot", "force_shutdown", "delete_stuck", "deploy", "transfer"` — Action that was requested - **`instanceId` (required)** `string`, format: `uuid` — Instance ID - **`status` (required)** `string`, possible values: `"success", "error"` — Whether the action succeeded or failed - **`error`** `string` — Error message if the action failed - **`statusCode`** `number` — HTTP status code of the error **Example:** ```json [ { "instanceId": "", "action": "boot", "status": "success", "error": "", "statusCode": 400 } ] ``` ##### Status: 204 Instance is already in the requested state (single action only) ##### Status: 207 Some actions failed - returns per-action results with individual statuses and errors ###### Content-Type: application/json **Array of:** - **`action` (required)** `string`, possible values: `"boot", "start", "shutdown", "delete", "discontinue", "hibernate", "configure_spot", "force_shutdown", "delete_stuck", "deploy", "transfer"` — Action that was requested - **`instanceId` (required)** `string`, format: `uuid` — Instance ID - **`status` (required)** `string`, possible values: `"success", "error"` — Whether the action succeeded or failed - **`error`** `string` — Error message if the action failed - **`statusCode`** `number` — HTTP status code of the error **Example:** ```json [ { "instanceId": "", "action": "boot", "status": "success", "error": "", "statusCode": 400 } ] ``` ##### Status: 400 Invalid request or action not allowed (single action only) ##### Status: 404 Instance not found (single action only) ### Get instance types - deprecated ⚠️ Deprecated - **Method:** `GET` - **Path:** `/v1/instances/types` - **Tags:** Instances #### Responses ##### Status: 200 ### Get instance by id - **Method:** `GET` - **Path:** `/v1/instances/{instance_id}` - **Tags:** Instances #### Responses ##### Status: 200 Instance details ###### Content-Type: application/json - **`contract` (required)** `string`, possible values: `"LONG_TERM", "PAY_AS_YOU_GO", "SPOT"` - **`cpu` (required)** `object` - **`created_at` (required)** `string` - **`description` (required)** `string` — Instance description; an empty string when none was supplied. - **`gpu` (required)** `object` - **`gpu_memory` (required)** `object` - **`hostname` (required)** `string` - **`id` (required)** `string` - **`image` (required)** `string` - **`instance_type` (required)** `string` - **`ip` (required)** `string` — Public address; \`null\` when the instance is not reachable from the internet - **`is_spot` (required)** `boolean` - **`jupyter_token` (required)** `string` - **`location` (required)** `string` - **`memory` (required)** `object` - **`os_name` (required)** `string` - **`os_volume_id` (required)** `string` - **`price_per_hour` (required)** `number` - **`pricing` (required)** `string`, possible values: `"DYNAMIC_PRICE", "FIXED_PRICE"` - **`ssh_key_ids` (required)** `array` **Items:** `string` - **`startup_script_id` (required)** `string` - **`status` (required)** `string`, possible values: `"running", "provisioning", "offline", "discontinued", "unknown", "ordered", "notfound", "new", "error", "deleting", "validating", "no_capacity", "installation_failed"` - **`storage` (required)** `object` - **`tags` (required)** `array` **Items:** - **`id` (required)** `string` - **`key` (required)** `string` - **`value` (required)** `string` — Empty string for a freeform tag - **`volume_ids` (required)** `array` **Items:** `string` - **`created_by_user_id`** `string` **Example:** ```json { "id": "edbbc4b4-809b-41d6-a6ee-f33e1d9d740e", "ip": "1.2.3.4", "status": "running", "created_at": "2023-07-15T14:10:26.654Z", "created_by_user_id": "7dfc2631-0158-4f74-93f6-6b46dcb90fef", "cpu": { "description": "176 CPU", "number_of_cores": 176, "model": "AMD Genoa" }, "gpu": { "description": "8x A100", "number_of_gpus": 8 }, "gpu_memory": { "description": "80GB GPU RAM", "size_in_gigabytes": 80 }, "memory": { "description": "640GB RAM", "size_in_gigabytes": 640 }, "storage": { "description": "dynamic" }, "hostname": "hazy-star-swims-fin-01", "description": "ubuntu-22-04-cuda-12-0-docker-fin-01", "tags": [ { "id": "tag_0aB1cD2eF3gH4iJ5kL6mN7", "key": "environment", "value": "production" } ], "location": "FIN-01", "price_per_hour": 2.481, "is_spot": false, "instance_type": "8A100.176V", "image": "ubuntu-22-04-cuda-12-0-docker", "os_name": "Ubuntu 22.04", "startup_script_id": "95cec4c3-af69-42eb-a790-fcacebfdfcea", "ssh_key_ids": [ "dd50b622-1c36-48c2-a485-f4d4937a3ea1" ], "os_volume_id": "95cec4c3-af69-42eb-a790-fcacebfdfcea", "jupyter_token": "b9e6d8517db3a722ccfb309ca599a35f", "contract": "PAY_AS_YOU_GO", "pricing": "FIXED_PRICE", "volume_ids": [ "95cec4c3-af69-42eb-a790-fcacebfdfcea", "dd50b622-1c36-48c2-a485-f4d4937a3ea1" ] } ``` ### Check instance type availability - deprecated ⚠️ Deprecated - **Method:** `GET` - **Path:** `/v1/instances/availability/{instanceType}` - **Tags:** Instances #### Responses ##### Status: 200 ### Perform action - deprecated ⚠️ Deprecated - **Method:** `POST` - **Path:** `/v1/instances/action` - **Tags:** Instances #### Request Body ##### Content-Type: application/json - **`action` (required)** `string`, possible values: `"boot", "start", "shutdown", "delete", "discontinue", "hibernate", "configure_spot", "force_shutdown", "delete_stuck", "deploy", "transfer"` - **`id` (required)** `object` — Instance ID or list of instance IDs - **`delete_permanently`** `boolean`, default: `false` — Delete the volumes permanently. Only applicable for delete (or discontinue) action, when volume IDs to delete are also provided. - **`volume_ids`** `array` — Volume IDs to delete. Specify empty array to indicate no volumes should be deleted (previously known as "hibernate") **Items:** `string` **Example:** ```json { "action": "boot", "id": [ "ec127c7e-173b-457e-b71c-504ceda7d44e" ], "volume_ids": [ "00eab353-034b-42f6-bc55-6acdb377f3ea" ], "delete_permanently": false } ``` #### Responses ##### Status: 202 ### Add a tag to an instance - **Method:** `POST` - **Path:** `/v1/instances/{instance_id}/tags` - **Tags:** Instances Add one key-value tag. Maximum 10 tags per instance. Omit `value` for a freeform tag. Keys are lowercased. A matching project tag is reused; adding one already linked to this instance returns 409. #### Request Body ##### Content-Type: application/json - **`key` (required)** `string` - **`value`** `string` — Omit for a freeform tag with no value **Example:** ```json { "key": "environment", "value": "production" } ``` #### Responses ##### Status: 201 Tag created ###### Content-Type: application/json - **`id` (required)** `string` - **`key` (required)** `string` - **`value` (required)** `string` — Empty string for a freeform tag **Example:** ```json { "id": "tag_0aB1cD2eF3gH4iJ5kL6mN7", "key": "environment", "value": "production" } ``` ##### Status: 403 Forbidden ##### Status: 409 The matching tag is already linked to the instance ### Remove a tag from an instance - **Method:** `DELETE` - **Path:** `/v1/instances/{instance_id}/tags/{tagId}` - **Tags:** Instances #### Responses ##### Status: 204 Tag removed ##### Status: 403 Forbidden ##### Status: 404 Instance or tag not found ### Get instance types - **Method:** `GET` - **Path:** `/v1/instance-types` - **Tags:** Instance Types #### Responses ##### Status: 200 ###### Content-Type: application/json **Array of:** - **`best_for` (required)** `array` — Use cases for instance type **Items:** `string` - **`cpu` (required)** `object` — CPU details - **`currency` (required)** `string`, possible values: `"usd", "eur"` — Currency type - **`description` (required)** `string` — Instance type description - **`display_name` (required)** `string` — Display name - **`gpu` (required)** `object` — GPU details - **`gpu_memory` (required)** `object` — GPU memory details - **`id` (required)** `string` — Instance type ID - **`instance_type` (required)** `string` — Instance type - **`manufacturer` (required)** `string` — Manufacturer - **`max_dynamic_price` (required)** `string` — Ceiling value for dynamic price - **`memory` (required)** `object` — Memory details - **`model` (required)** `string` — GPU model - **`name` (required)** `string` — GPU model name - **`p2p` (required)** `string` — P2P details - **`price_per_hour` (required)** `string` — Price per hour - **`spot_price` (required)** `string` — Spot price per hour - **`storage` (required)** `object` — Storage details - **`supported_os` (required)** `array` — Supported OS image types **Items:** `string` - **`deploy_warning`** `string` — Deploy warning - **`dynamic_price`** `string` — Current dynamic price - **`serverless_price`** `string` — Current serverless price - **`serverless_spot_price`** `string` — Current serverless spot price **Example:** ```json [ { "best_for": [ "Giant ML models", "Multi-GPU training", "FP64 calculations", "NVLINK" ], "cpu": { "description": "22 CPU", "number_of_cores": 22, "model": "AMD Genoa" }, "deploy_warning": "Make sure your VM is running on latest Nvidia Driver 525.100+ or newer", "description": "Dedicated Hardware Instance", "gpu": { "description": "1x H100 SXM5 80GB", "number_of_gpus": 1 }, "gpu_memory": { "description": "80GB GPU RAM", "size_in_gigabytes": 80 }, "id": "c01dd00d-0000-4972-ae4e-d429115d055b", "instance_type": "1H100.80S.22V", "memory": { "description": "187GB RAM", "size_in_gigabytes": 187 }, "model": "H100", "name": "H100 SXM5 80GB", "p2p": "600 GB/s", "price_per_hour": "3.17", "spot_price": "0.31", "serverless_price": "1.75", "serverless_spot_price": "0.87", "storage": { "description": "dynamic" }, "currency": "usd", "manufacturer": "NVIDIA", "display_name": "NVIDIA H100 SXM5 80GB", "supported_os": [ "ubuntu-22.04-cuda-12.3", "ubuntu-24.04" ] } ] ``` ### Get daily dynamic price history (only the last price update per day) - Not supported anymore ⚠️ Deprecated - **Method:** `GET` - **Path:** `/v1/instance-types/price-history` - **Tags:** Instance Types #### Responses ##### Status: 200 ### Get all instance type availabilities for all locations - **Method:** `GET` - **Path:** `/v1/instance-availability` - **Tags:** Instance Availability #### Responses ##### Status: 200 Returns the instance type availabilities for all locations ###### Content-Type: application/json **Array of:** - **`availabilities` (required)** `array` — Array of available instance types **Items:** `string` - **`location_code` (required)** `string` — Location code **Example:** ```json [ { "location_code": "FIN-01", "availabilities": [ "1H100.80S.22V", "2H100.80S.60V", "4H100.80S.176V", "8H100.80S.352V" ] } ] ``` ### Get instance type availability - **Method:** `GET` - **Path:** `/v1/instance-availability/{instance_type}` - **Tags:** Instance Availability #### Responses ##### Status: 200 Returns the instance type availability ###### Content-Type: application/json `boolean` **Example:** ```json true ``` ### Get SSH keys - **Method:** `GET` - **Path:** `/v1/ssh-keys` - **Tags:** SSH Keys #### Responses ##### Status: 200 Returns a list of the project's SSH keys ###### Content-Type: application/json **Array of:** - **`created_by_user_id` (required)** `string`, format: `uuid` — ID of the user who added this SSH key record to the project. \`null\` when the creator is unknown or no longer exists. - **`fingerprint` (required)** `string` — MD5 fingerprint of the public key as colon-separated hex (matches \`ssh-keygen -E md5\`). \`null\` if the stored key cannot be parsed. - **`id` (required)** `string` — SSH key id - **`key` (required)** `string` — Public SSH key - **`name` (required)** `string` — Name of the SSH key **Example:** ```json [ { "id": "f7b3b3b3-1b3b-4b3b-8b3b-3b3b3b3b3b3b", "name": "my-key", "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD...", "fingerprint": "9b:11:74:af:5c:04:48:31:40:ef:b5:ef:e3:dc:33:81", "created_by_user_id": "" } ] ``` ### Add new SSH key - **Method:** `POST` - **Path:** `/v1/ssh-keys` - **Tags:** SSH Keys #### Request Body ##### Content-Type: application/json - **`key` (required)** `string` — Public SSH key - **`name` (required)** `string` — Name of the SSH key **Example:** ```json { "name": "my-key", "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD..." } ``` #### Responses ##### Status: 201 Returns the ID of the newly created SSH key ###### Content-Type: application/json ### Delete ssh keys - **Method:** `DELETE` - **Path:** `/v1/ssh-keys` - **Tags:** SSH Keys #### Request Body ##### Content-Type: application/json - **`keys` (required)** `array` **Items:** `string` **Example:** ```json { "keys": [ "64636a03-c285-41a8-b36b-836ecd2aa07d" ] } ``` #### Responses ##### Status: 200 ### Get single SSH key by ID - **Method:** `GET` - **Path:** `/v1/ssh-keys/{sshKeyId}` - **Tags:** SSH Keys #### Responses ##### Status: 200 Returns the SSH key ###### Content-Type: application/json - **`created_by_user_id` (required)** `string`, format: `uuid` — ID of the user who added this SSH key record to the project. \`null\` when the creator is unknown or no longer exists. - **`fingerprint` (required)** `string` — MD5 fingerprint of the public key as colon-separated hex (matches \`ssh-keygen -E md5\`). \`null\` if the stored key cannot be parsed. - **`id` (required)** `string` — SSH key id - **`key` (required)** `string` — Public SSH key - **`name` (required)** `string` — Name of the SSH key **Example:** ```json { "id": "f7b3b3b3-1b3b-4b3b-8b3b-3b3b3b3b3b3b", "name": "my-key", "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD...", "fingerprint": "9b:11:74:af:5c:04:48:31:40:ef:b5:ef:e3:dc:33:81", "created_by_user_id": "" } ``` ### Delete single SSH key by ID - **Method:** `DELETE` - **Path:** `/v1/ssh-keys/{sshKeyId}` - **Tags:** SSH Keys #### Responses ##### Status: 200 ### Get SSH keys ⚠️ Deprecated - **Method:** `GET` - **Path:** `/v1/sshkeys` - **Tags:** SSH Keys #### Responses ##### Status: 200 Returns a list of the project's SSH keys ###### Content-Type: application/json **Array of:** - **`created_by_user_id` (required)** `string`, format: `uuid` — ID of the user who added this SSH key record to the project. \`null\` when the creator is unknown or no longer exists. - **`fingerprint` (required)** `string` — MD5 fingerprint of the public key as colon-separated hex (matches \`ssh-keygen -E md5\`). \`null\` if the stored key cannot be parsed. - **`id` (required)** `string` — SSH key id - **`key` (required)** `string` — Public SSH key - **`name` (required)** `string` — Name of the SSH key **Example:** ```json [ { "id": "f7b3b3b3-1b3b-4b3b-8b3b-3b3b3b3b3b3b", "name": "my-key", "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD...", "fingerprint": "9b:11:74:af:5c:04:48:31:40:ef:b5:ef:e3:dc:33:81", "created_by_user_id": "" } ] ``` ### Add new SSH key ⚠️ Deprecated - **Method:** `POST` - **Path:** `/v1/sshkeys` - **Tags:** SSH Keys #### Request Body ##### Content-Type: application/json - **`key` (required)** `string` — Public SSH key - **`name` (required)** `string` — Name of the SSH key **Example:** ```json { "name": "my-key", "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD..." } ``` #### Responses ##### Status: 201 Returns the ID of the newly created SSH key ###### Content-Type: application/json ### Delete ssh keys ⚠️ Deprecated - **Method:** `DELETE` - **Path:** `/v1/sshkeys` - **Tags:** SSH Keys #### Request Body ##### Content-Type: application/json - **`keys` (required)** `array` **Items:** `string` **Example:** ```json { "keys": [ "64636a03-c285-41a8-b36b-836ecd2aa07d" ] } ``` #### Responses ##### Status: 200 ### Get single SSH key by ID ⚠️ Deprecated - **Method:** `GET` - **Path:** `/v1/sshkeys/{sshKeyId}` - **Tags:** SSH Keys #### Responses ##### Status: 200 Returns the SSH key ###### Content-Type: application/json - **`created_by_user_id` (required)** `string`, format: `uuid` — ID of the user who added this SSH key record to the project. \`null\` when the creator is unknown or no longer exists. - **`fingerprint` (required)** `string` — MD5 fingerprint of the public key as colon-separated hex (matches \`ssh-keygen -E md5\`). \`null\` if the stored key cannot be parsed. - **`id` (required)** `string` — SSH key id - **`key` (required)** `string` — Public SSH key - **`name` (required)** `string` — Name of the SSH key **Example:** ```json { "id": "f7b3b3b3-1b3b-4b3b-8b3b-3b3b3b3b3b3b", "name": "my-key", "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD...", "fingerprint": "9b:11:74:af:5c:04:48:31:40:ef:b5:ef:e3:dc:33:81", "created_by_user_id": "" } ``` ### Delete single SSH key by ID ⚠️ Deprecated - **Method:** `DELETE` - **Path:** `/v1/sshkeys/{sshKeyId}` - **Tags:** SSH Keys #### Responses ##### Status: 200 ### Get startup scripts - **Method:** `GET` - **Path:** `/v1/scripts` - **Tags:** Startup Scripts #### Responses ##### Status: 200 Returns a list of the project's startup scripts ###### Content-Type: application/json **Array of:** - **`created_at` (required)** `string` — Script creation date - **`id` (required)** `string` — Script ID - **`name` (required)** `string` — Script name - **`script` (required)** `string` — Script content **Example:** ```json [ { "id": "31a47f4e-ad0a-4d6e-8226-e4e8e6b96db0", "name": "My startup script", "script": "#!/bin/bash\n\necho hello world", "created_at": "2026-06-12T10:30:00.000Z" } ] ``` ### Add new startup script - **Method:** `POST` - **Path:** `/v1/scripts` - **Tags:** Startup Scripts #### Request Body ##### Content-Type: application/json - **`name` (required)** `string` — Script name - **`script` (required)** `string` — Script content **Example:** ```json { "name": "My startup script", "script": "#!/bin/bash\n\necho hello world" } ``` #### Responses ##### Status: 201 Returns the ID of the newly created script ###### Content-Type: application/json ### Delete startup scripts - **Method:** `DELETE` - **Path:** `/v1/scripts` - **Tags:** Startup Scripts #### Request Body ##### Content-Type: application/json - **`scripts` (required)** `array` **Items:** `string` **Example:** ```json { "scripts": [ "dcb35caa-9727-44a4-8b0c-5f17e1862f7c" ] } ``` #### Responses ##### Status: 200 ### Get single startup script by ID - **Method:** `GET` - **Path:** `/v1/scripts/{scriptId}` - **Tags:** Startup Scripts #### Responses ##### Status: 200 Return startup script with specific ID ###### Content-Type: application/json - **`created_at` (required)** `string` — Script creation date - **`id` (required)** `string` — Script ID - **`name` (required)** `string` — Script name - **`script` (required)** `string` — Script content **Example:** ```json { "id": "31a47f4e-ad0a-4d6e-8226-e4e8e6b96db0", "name": "My startup script", "script": "#!/bin/bash\n\necho hello world", "created_at": "2026-06-12T10:30:00.000Z" } ``` ### Delete single startup script by ID - **Method:** `DELETE` - **Path:** `/v1/scripts/{scriptId}` - **Tags:** Startup Scripts #### Responses ##### Status: 200 ### Returns a list of available locations - **Method:** `GET` - **Path:** `/v1/locations` - **Tags:** Locations #### Responses ##### Status: 200 Returns a list of available locations ###### Content-Type: application/json **Array of:** - **`code` (required)** `string` — Datacenter location code - **`country_code` (required)** `string` — Country code - **`name` (required)** `string` — Location name **Example:** ```json [ { "code": "FIN-01", "name": "Finland 1", "country_code": "FI" } ] ``` ### Get long term periods ⚠️ Deprecated - **Method:** `GET` - **Path:** `/v1/long-term/periods` - **Tags:** Long Term #### Responses ##### Status: 200 Returns the long term periods ###### Content-Type: application/json **Array of:** - **`code` (required)** `string` — Long term period code - **`discount_percentage` (required)** `number` — Discount percentage - **`is_enabled` (required)** `boolean` — Is long term period enabled - **`name` (required)** `string` — Long term period name - **`unit_name` (required)** `string`, possible values: `"hour", "day", "week", "month", "year"` — Time unit name - **`unit_value` (required)** `number` — Time unit value **Example:** ```json [ { "code": "3_MONTHS", "name": "3 months", "is_enabled": true, "unit_name": "month", "unit_value": 3, "discount_percentage": 14 } ] ``` ### Get long term periods for instances - **Method:** `GET` - **Path:** `/v1/long-term/periods/instances` - **Tags:** Long Term #### Responses ##### Status: 200 Returns the long term periods for instances ###### Content-Type: application/json **Array of:** - **`code` (required)** `string` — Long term period code - **`discount_percentage` (required)** `number` — Discount percentage - **`is_enabled` (required)** `boolean` — Is long term period enabled - **`name` (required)** `string` — Long term period name - **`unit_name` (required)** `string`, possible values: `"hour", "day", "week", "month", "year"` — Time unit name - **`unit_value` (required)** `number` — Time unit value **Example:** ```json [ { "code": "3_MONTHS", "name": "3 months", "is_enabled": true, "unit_name": "month", "unit_value": 3, "discount_percentage": 14 } ] ``` ### Get long term periods for clusters - **Method:** `GET` - **Path:** `/v1/long-term/periods/clusters` - **Tags:** Long Term #### Responses ##### Status: 200 Returns the long term periods for clusters ###### Content-Type: application/json **Array of:** - **`code` (required)** `string` — Long term period code - **`discount_percentage` (required)** `number` — Discount percentage - **`is_enabled` (required)** `boolean` — Is long term period enabled - **`name` (required)** `string` — Long term period name - **`unit_name` (required)** `string`, possible values: `"hour", "day", "week", "month", "year"` — Time unit name - **`unit_value` (required)** `number` — Time unit value **Example:** ```json [ { "code": "3_MONTHS", "name": "3 months", "is_enabled": true, "unit_name": "month", "unit_value": 3, "discount_percentage": 14 } ] ``` ### Get container types - **Method:** `GET` - **Path:** `/v1/container-types` - **Tags:** Container Types #### Responses ##### Status: 200 ###### Content-Type: application/json **Array of:** - **`cpu` (required)** `object` — CPU details - **`currency` (required)** `string`, possible values: `"usd", "eur"` — Currency type - **`gpu` (required)** `object` — GPU details - **`gpu_memory` (required)** `object` — GPU memory details - **`id` (required)** `string` — Instance type ID - **`instance_type` (required)** `string` — Instance type - **`manufacturer` (required)** `string` — Manufacturer - **`memory` (required)** `object` — Memory details - **`model` (required)** `string` — GPU model - **`name` (required)** `string` — GPU model name - **`serverless_price` (required)** `string` — Current serverless price - **`serverless_spot_price` (required)** `string` — Current serverless spot price **Example:** ```json [ { "id": "60006000-6000-47af-8ff0-600060006004", "model": "RTX PRO 6000", "name": "RTX PRO 6000 96GB", "instance_type": "8RTXPRO6000.224V", "cpu": { "description": "224 CPU", "number_of_cores": 224, "model": "AMD Turin" }, "gpu": { "description": "8x RTX PRO 6000 96GB", "number_of_gpus": 8 }, "gpu_memory": { "description": "768GB GPU RAM", "size_in_gigabytes": 768 }, "memory": { "description": "680GB RAM", "size_in_gigabytes": 680 }, "serverless_price": "1.529", "serverless_spot_price": "0.7645", "currency": "usd", "manufacturer": "NVIDIA" } ] ``` ### Get managed inference endpoint prices - **Method:** `GET` - **Path:** `/v1/managed-endpoints/pricing` - **Tags:** Managed Endpoints #### Responses ##### Status: 200 ###### Content-Type: application/json **Array of:** - **`currency` (required)** `string`, possible values: `"usd", "eur"` — Currency type - **`external_id` (required)** `string` — External managed endpoint / inference model identifier - **`resource` (required)** `string` — Managed endpoint / inference model identifier - **`unit_name` (required)** `string`, possible values: `"generation", "image", "video", "input_token", "output_token", "token", "audio_second", "video_second", "inference_second", "hour", "second", "minute", "undefined", "gpu_hour", "gb_hour", "gb_month", "request"` — Unit the price is charged per - **`unit_price` (required)** `number` — Unit price in the requested currency **Example:** ```json [ { "resource": "NVIDIA-H100-80GB-HBM3", "external_id": "meta-llama-3-1-8b-instruct", "unit_price": 0.99, "unit_name": "hour", "currency": "usd" } ] ``` ### Get container registry price - **Method:** `GET` - **Path:** `/v1/container-registry/pricing` - **Tags:** Container Registry #### Responses ##### Status: 200 Returns the container registry price per GB per month ###### Content-Type: application/json - **`currency` (required)** `string`, possible values: `"usd", "eur"` — Currency - **`price_per_month_per_gb` (required)** `number` — Price per GB per month **Example:** ```json { "price_per_month_per_gb": 0.2, "currency": "usd" } ``` ### List instance groups - **Method:** `GET` - **Path:** `/v1/instance-groups` - **Tags:** Instance groups Returns this project’s live instance groups, oldest first. #### Responses ##### Status: 200 ###### Content-Type: application/json **Array of:** - **`created_at` (required)** `string`, format: `date-time` - **`deleted_at` (required)** `string`, format: `date-time` — Non-null only on a tombstoned group. Public and internal reads return live groups only. - **`description` (required)** `string` - **`id` (required)** `string` - **`instance_type` (required)** `string` - **`instances` (required)** `array` **Items:** - **`hostname` (required)** `string` - **`id` (required)** `string` - **`status` (required)** `string` - **`location_code` (required)** `string` - **`name` (required)** `string` - **`project_id` (required)** `string` - **`size` (required)** `number` — Number of live instances in the group. - **`template` (required)** `object` — The instance template stored by the group. - **`updated_at` (required)** `string`, format: `date-time` **Example:** ```json [ { "id": "", "project_id": "", "name": "", "description": "", "location_code": "", "instance_type": "", "template": {}, "created_at": "", "updated_at": "", "deleted_at": "", "instances": [ { "id": "", "hostname": "", "status": "" } ], "size": 1 } ] ``` ### Create an instance group - **Method:** `POST` - **Path:** `/v1/instance-groups` - **Tags:** Instance groups Creates a project-scoped group with a name, description, location, instance type and template. #### Request Body ##### Content-Type: application/json - **`instance_type` (required)** `string` — A known instance type code. Fixed for the life of the group. - **`location_code` (required)** `string` - **`name` (required)** `string` - **`template` (required)** `object` - **`image` (required)** `string` - **`os_volume`** `object` - **`size` (required)** `number` — Default and minimum OS volume size in GB for instances created in this group. - **`ssh_key_ids`** `array` — Default SSH keys for instances created from this group. **Items:** `string` - **`startup_script_id`** `string` — Default startup script for instances created from this group. - **`description`** `string` **Example:** ```json { "name": "hive-b300-pool-1", "description": "", "location_code": "FIN-02", "instance_type": "8B300.640S.176V", "template": { "image": "ubuntu-24.04-cuda-12.8-docker", "os_volume": { "size": 200 }, "ssh_key_ids": [ "" ], "startup_script_id": "" } } ``` #### Responses ##### Status: 201 ###### Content-Type: application/json - **`created_at` (required)** `string`, format: `date-time` - **`deleted_at` (required)** `string`, format: `date-time` — Non-null only on a tombstoned group. Public and internal reads return live groups only. - **`description` (required)** `string` - **`id` (required)** `string` - **`instance_type` (required)** `string` - **`instances` (required)** `array` **Items:** - **`hostname` (required)** `string` - **`id` (required)** `string` - **`status` (required)** `string` - **`location_code` (required)** `string` - **`name` (required)** `string` - **`project_id` (required)** `string` - **`size` (required)** `number` — Number of live instances in the group. - **`template` (required)** `object` — The instance template stored by the group. - **`updated_at` (required)** `string`, format: `date-time` **Example:** ```json { "id": "", "project_id": "", "name": "", "description": "", "location_code": "", "instance_type": "", "template": {}, "created_at": "", "updated_at": "", "deleted_at": "", "instances": [ { "id": "", "hostname": "", "status": "" } ], "size": 1 } ``` ### Get an instance group - **Method:** `GET` - **Path:** `/v1/instance-groups/{instance_group_id}` - **Tags:** Instance groups #### Responses ##### Status: 200 ###### Content-Type: application/json - **`created_at` (required)** `string`, format: `date-time` - **`deleted_at` (required)** `string`, format: `date-time` — Non-null only on a tombstoned group. Public and internal reads return live groups only. - **`description` (required)** `string` - **`id` (required)** `string` - **`instance_type` (required)** `string` - **`instances` (required)** `array` **Items:** - **`hostname` (required)** `string` - **`id` (required)** `string` - **`status` (required)** `string` - **`location_code` (required)** `string` - **`name` (required)** `string` - **`project_id` (required)** `string` - **`size` (required)** `number` — Number of live instances in the group. - **`template` (required)** `object` — The instance template stored by the group. - **`updated_at` (required)** `string`, format: `date-time` **Example:** ```json { "id": "", "project_id": "", "name": "", "description": "", "location_code": "", "instance_type": "", "template": {}, "created_at": "", "updated_at": "", "deleted_at": "", "instances": [ { "id": "", "hostname": "", "status": "" } ], "size": 1 } ``` ### Update an instance group - **Method:** `PATCH` - **Path:** `/v1/instance-groups/{instance_group_id}` - **Tags:** Instance groups Name, description, and template SSH keys or startup script can change. Location, instance type, image and OS volume are immutable. #### Request Body ##### Content-Type: application/json - **`description`** `string` - **`name`** `string` - **`template`** `object` — Mutable template defaults. **Example:** ```json { "name": "", "description": "", "template": { "ssh_key_ids": [ "" ], "startup_script_id": "" } } ``` #### Responses ##### Status: 200 ###### Content-Type: application/json - **`created_at` (required)** `string`, format: `date-time` - **`deleted_at` (required)** `string`, format: `date-time` — Non-null only on a tombstoned group. Public and internal reads return live groups only. - **`description` (required)** `string` - **`id` (required)** `string` - **`instance_type` (required)** `string` - **`instances` (required)** `array` **Items:** - **`hostname` (required)** `string` - **`id` (required)** `string` - **`status` (required)** `string` - **`location_code` (required)** `string` - **`name` (required)** `string` - **`project_id` (required)** `string` - **`size` (required)** `number` — Number of live instances in the group. - **`template` (required)** `object` — The instance template stored by the group. - **`updated_at` (required)** `string`, format: `date-time` **Example:** ```json { "id": "", "project_id": "", "name": "", "description": "", "location_code": "", "instance_type": "", "template": {}, "created_at": "", "updated_at": "", "deleted_at": "", "instances": [ { "id": "", "hostname": "", "status": "" } ], "size": 1 } ``` ##### Status: 400 The patch contains an immutable or invalid field. ##### Status: 409 The update conflicts with the current group state. ### Delete an instance group - **Method:** `DELETE` - **Path:** `/v1/instance-groups/{instance_group_id}` - **Tags:** Instance groups Removes the group from caller-facing reads while retaining its historical row and allowing its name to be reused. #### Responses ##### Status: 204 ## Schemas ### CreatePrivateNetworkAddressMappingDto - **Type:**`object` * **`location_code` (required)** `string` * **`service` (required)** `string` * **`source_cidr` (required)** `string` * **`source_private_network_id` (required)** `string` * **`target_cidr` (required)** `string` * **`target_private_network_id` (required)** `string` **Example:** ```json { "service": "mk8s", "location_code": "FIN-01", "source_private_network_id": "pn_4hs96f02", "source_cidr": "10.0.1.0/24", "target_private_network_id": "pn_d90ky5tk", "target_cidr": "10.100.1.0/24" } ``` ### Location - **Type:**`object` * **`code` (required)** `string` — Datacenter location code * **`country_code` (required)** `string` — Country code * **`name` (required)** `string` — Location name **Example:** ```json { "code": "FIN-01", "name": "Finland 1", "country_code": "FI" } ``` ### PrivateNetworkAddressMappingResponseDto - **Type:**`object` * **`created_at` (required)** `string`, format: `date-time` * **`id` (required)** `string` * **`location` (required)** `object` — Datacenter this mapping applies in * **`service` (required)** `string` * **`source_cidr` (required)** `string` — Original IPv4 prefix in the source network * **`source_private_network_id` (required)** `string` — Network containing the original addresses * **`target_cidr` (required)** `string` — IPv4 prefix representing the source addresses in the target network * **`target_private_network_id` (required)** `string` — Network in which the mapped addresses are reachable **Example:** ```json { "id": "am_rh9sph53", "service": "mk8s", "location": { "code": "FIN-01", "name": "Finland 1", "country_code": "FI" }, "source_private_network_id": "pn_4hs96f02", "source_cidr": "10.0.1.0/24", "target_private_network_id": "pn_d90ky5tk", "target_cidr": "10.100.1.0/24", "created_at": "" } ``` ### ModelPricingDto - **Type:**`object` * **`cache_read`** `string` — Price per input token served from cache, in the project owner billing currency * **`cache_write`** `string` — Price per input token written to cache, in the project owner billing currency * **`image`** `string` — Price per input image, in the project owner billing currency * **`input`** `string` — Price per input token, in the project owner billing currency * **`output`** `string` — Price per output token, in the project owner billing currency * **`request`** `string` — Price per request on top of token charges, in the project owner billing currency **Example:** ```json { "input": "0.0000014", "output": "0.0000044", "cache_read": "0.00000026", "cache_write": "0.00000175", "image": "0.015", "request": "0.001" } ``` ### ModelServiceTierPricingDto - **Type:**`object` * **`pricing` (required)** `object` — Per-token prices for this service tier, in the project owner billing currency * **`service_tier` (required)** `string`, possible values: `"standard", "flex", "batch", "fast"` — The service tier these prices apply to **Example:** ```json { "service_tier": "standard", "pricing": { "input": "0.0000014", "output": "0.0000044", "cache_read": "0.00000026", "cache_write": "0.00000175", "image": "0.015", "request": "0.001" } } ``` ### ModelDatacenterDto - **Type:**`object` * **`country_code` (required)** `string` — ISO 3166-1 alpha-2 country code **Example:** ```json { "country_code": "FI" } ``` ### ModelReasoningDto - **Type:**`object` * **`optional` (required)** `boolean` — Whether reasoning can be disabled. False means every request pays for it * **`supported_efforts` (required)** `array` — Accepted effort levels, cheapest first **Items:** `string` * **`default_effort`** `string` — Effort applied when the request does not ask for one **Example:** ```json { "optional": true, "supported_efforts": [ "low", "high", "max" ], "default_effort": "high" } ``` ### ModelSectionItemDto - **Type:**`object` * **`description` (required)** `string` — Section body * **`title` (required)** `string` — Section heading **Example:** ```json { "title": "Long-horizon coding", "description": "Sustains multi-step refactors across large repositories." } ``` ### ModelBenchmarkIndexDto - **Type:**`object` * **`better_than` (required)** `number` — Percentage of compared models this model scores above * **`label` (required)** `string` — Index name * **`value` (required)** `number` — Index score **Example:** ```json { "label": "Intelligence Index", "value": 51.1, "better_than": 91 } ``` ### ModelBenchmarkItemDto - **Type:**`object` * **`description` (required)** `string` — What the benchmark measures * **`name` (required)** `string` — Benchmark name * **`value` (required)** `number` — Score as a percentage (0-100) **Example:** ```json { "name": "GPQA Diamond", "description": "Graduate-level scientific reasoning", "value": 89.5 } ``` ### ModelBenchmarkGroupDto - **Type:**`object` * **`items` (required)** `array` — Benchmarks in this group **Items:** - **`description` (required)** `string` — What the benchmark measures - **`name` (required)** `string` — Benchmark name - **`value` (required)** `number` — Score as a percentage (0-100) * **`title` (required)** `string` — Benchmark group title **Example:** ```json { "title": "Reasoning", "items": [ { "name": "GPQA Diamond", "description": "Graduate-level scientific reasoning", "value": 89.5 } ] } ``` ### ModelBenchmarkComparisonRowDto - **Type:**`object` * **`label` (required)** `string` — Benchmark name * **`values` (required)** `array` — One score per entry in \`columns\`, in the same order. Null where a score was not published **Items:** `string` **Example:** ```json { "label": "AIME 2025", "values": [ 89.6, 87.2, null ] } ``` ### ModelBenchmarkComparisonDto - **Type:**`object` * **`columns` (required)** `array` — Column headers. The first entry is this model **Items:** `string` * **`rows` (required)** `array` — One row per benchmark **Items:** - **`label` (required)** `string` — Benchmark name - **`values` (required)** `array` — One score per entry in \`columns\`, in the same order. Null where a score was not published **Items:** `string` **Example:** ```json { "columns": [ "Kimi K2.7 Code", "Claude Opus 5", "GPT-5.6" ], "rows": [ { "label": "AIME 2025", "values": [ 89.6, 87.2, null ] } ] } ``` ### ModelBenchmarksDto - **Type:**`object` * **`groups` (required)** `array` — Individual benchmarks, grouped by theme **Items:** - **`items` (required)** `array` — Benchmarks in this group **Items:** - **`description` (required)** `string` — What the benchmark measures - **`name` (required)** `string` — Benchmark name - **`value` (required)** `number` — Score as a percentage (0-100) - **`title` (required)** `string` — Benchmark group title * **`indices` (required)** `array` — Headline composite indices **Items:** - **`better_than` (required)** `number` — Percentage of compared models this model scores above - **`label` (required)** `string` — Index name - **`value` (required)** `number` — Index score * **`comparison`** `object` — Head-to-head comparison table **All of:** - **`columns` (required)** `array` — Column headers. The first entry is this model **Items:** `string` - **`rows` (required)** `array` — One row per benchmark **Items:** - **`label` (required)** `string` — Benchmark name - **`values` (required)** `array` — One score per entry in \`columns\`, in the same order. Null where a score was not published **Items:** `string` **Example:** ```json { "indices": [ { "label": "Intelligence Index", "value": 51.1, "better_than": 91 } ], "groups": [ { "title": "Reasoning", "items": [ { "name": "GPQA Diamond", "description": "Graduate-level scientific reasoning", "value": 89.5 } ] } ], "comparison": { "columns": [ "Kimi K2.7 Code", "Claude Opus 5", "GPT-5.6" ], "rows": [ { "label": "AIME 2025", "values": [ 89.6, 87.2, null ] } ] } } ``` ### ModelResponseDto - **Type:**`object` * **`about` (required)** `string` — Long-form "About model" copy * **`active_parameters_b` (required)** `number` — Parameters activated per token, in billions * **`benchmarks` (required)** `object` — Published benchmark scores, when available **All of:** - **`groups` (required)** `array` — Individual benchmarks, grouped by theme **Items:** - **`items` (required)** `array` — Benchmarks in this group **Items:** - **`description` (required)** `string` — What the benchmark measures - **`name` (required)** `string` — Benchmark name - **`value` (required)** `number` — Score as a percentage (0-100) - **`title` (required)** `string` — Benchmark group title - **`indices` (required)** `array` — Headline composite indices **Items:** - **`better_than` (required)** `number` — Percentage of compared models this model scores above - **`label` (required)** `string` — Index name - **`value` (required)** `number` — Index score - **`comparison`** `object` — Head-to-head comparison table **All of:** - **`columns` (required)** `array` — Column headers. The first entry is this model **Items:** `string` - **`rows` (required)** `array` — One row per benchmark **Items:** - **`label` (required)** `string` — Benchmark name - **`values` (required)** `array` — One score per entry in \`columns\`, in the same order. Null where a score was not published **Items:** `string` * **`capabilities` (required)** `array` — Key capabilities, when published **Items:** - **`description` (required)** `string` — Section body - **`title` (required)** `string` — Section heading * **`category` (required)** `string`, possible values: `"text", "image", "audio", "video", "embedding", "rerank"` — Catalog section the model belongs to * **`code` (required)** `string` — Our catalog id for the model, and the \`{code}\` parameter of the single-model route * **`created_at` (required)** `string`, format: `date-time` — When the catalog entry was created * **`dashboard_priority` (required)** `number` — Sort key for the catalog dashboard, ascending. Null sorts last, ties broken by name * **`description` (required)** `string` — Long-form description * **`endpoint_model` (required)** `string` — The id to send as \`model\` in an inference request. Usually the same as \`code\`, and always present * **`input_modalities` (required)** `array` — Accepted input modalities **Items:** `string`, possible values: `"text", "image", "file", "audio", "video", "embeddings", "rerank", "speech", "transcription"` * **`is_free` (required)** `boolean` — Whether calls are free under every offered service tier * **`knowledge_cutoff` (required)** `string` — Training data cutoff (YYYY-MM-DD) * **`license` (required)** `string` — Weight license * **`license_url` (required)** `string` — Full license text * **`logo_url` (required)** `string` — Absolute URL of the model or provider logo. Consumers fall back to a generated tile when null * **`name` (required)** `string` — Display name of the model * **`output_modalities` (required)** `array` — Produced output modalities **Items:** `string`, possible values: `"text", "image", "file", "audio", "video", "embeddings", "rerank", "speech", "transcription"` * **`pricing` (required)** `object` — Per-token prices in the project owner billing currency. Empty when the model has no published rate * **`provider_id` (required)** `string` — Organization id (namespace) that produced the model; the leading segment of the slug * **`provider_name` (required)** `string` — Organization name that produced the model * **`reasoning` (required)** `object` — Reasoning controls, when the model reasons at all **All of:** - **`optional` (required)** `boolean` — Whether reasoning can be disabled. False means every request pays for it - **`supported_efforts` (required)** `array` — Accepted effort levels, cheapest first **Items:** `string` - **`default_effort`** `string` — Effort applied when the request does not ask for one * **`release_date` (required)** `string` — Release date of this model version (YYYY-MM-DD), when the model was released to the public by the provider. * **`replacement_code` (required)** `string` — Code of the model that supersedes this one * **`request_rate_limit_per_min` (required)** `number` — Same value as \`capacity\_rpm\`. Use \`capacity\_rpm\` instead; per-project limits are returned by \`GET /v1/inference/rate-limits\` * **`service_tier_pricing` (required)** `array` — Per-token prices in the project owner billing currency, broken down by service tier, one entry per value in \`service\_tiers\` that has prices of its own. A tier without prices is left out **Items:** - **`pricing` (required)** `object` — Per-token prices for this service tier, in the project owner billing currency - **`service_tier` (required)** `string`, possible values: `"standard", "flex", "batch", "fast"` — The service tier these prices apply to * **`service_tiers` (required)** `array` — Service tiers this model is served under, similar to OpenAI \`service\_tier\`. Always includes \`standard\` **Items:** `string`, possible values: `"standard", "flex", "batch", "fast"` * **`slug` (required)** `string` — Namespaced model identifier, derived as \`\/\\`. Contains a slash, so it is not a route parameter * **`status` (required)** `string`, possible values: `"coming_soon", "beta", "available"` — Lifecycle state of the model * **`supported_features` (required)** `array` — Capabilities a client can branch on. Streaming is absent because it is always supported **Items:** `string`, possible values: `"tools", "json_mode", "structured_outputs", "logprobs", "web_search", "reasoning"` * **`supported_sampling_parameters` (required)** `array` — Sampling parameters the model honours. Anything absent is rejected or ignored **Items:** `string`, possible values: `"temperature", "top_p", "top_k", "min_p", "top_a", "frequency_penalty", "presence_penalty", "repetition_penalty", "stop", "seed", "max_tokens", "logit_bias"` * **`tagline` (required)** `string` — Short headline shown on a catalog card * **`tags` (required)** `array` — Capability labels shown as chips **Items:** `string` * **`tokenizer` (required)** `string` — Tokenizer family, used to estimate cost before calling * **`total_parameters_b` (required)** `number` — Total parameter count in billions * **`updated_at` (required)** `string`, format: `date-time` — When the catalog entry was last edited * **`uses` (required)** `array` — Suggested use cases **Items:** `string` * **`weights_url` (required)** `string` — Where the weights can be downloaded * **`capacity_rpm`** `number` — Total requests per minute of the deployment on the standard service tier, shared by all customers * **`capacity_tpm`** `number` — Total tokens per minute of the deployment on the standard service tier, shared by all customers * **`context_length`** `number` — Largest prompt the model accepts, in tokens * **`datacenters`** `array` — Datacenters serving this deployment **Items:** - **`country_code` (required)** `string` — ISO 3166-1 alpha-2 country code * **`deprecation_date`** `string` — When the model stops being served (YYYY-MM-DD). Absent unless a retirement has been announced * **`discount_to_user`** `number` — Fraction of the published price charged to end users. Below 1.0 * **`hugging_face_id`** `string` — Hugging Face repository holding the weights. Published for open-weights models so consumers can dedupe us against other hosts of the same model * **`max_output_length`** `number` — Largest completion the model will produce, in tokens * **`quantization`** `string`, possible values: `"int4", "int8", "fp4", "mxfp4", "nvfp4", "fp6", "fp8", "mxfp8", "fp16", "bf16", "fp32"` — Weight quantisation this deployment is served at. Omitted, never guessed **Example:** ```json { "code": "kimi-k3", "slug": "moonshotai/kimi-k3", "endpoint_model": "moonshotai/Kimi-K3", "name": "Kimi K3", "provider_id": "moonshotai", "provider_name": "Moonshot AI", "category": "text", "status": "available", "is_free": false, "discount_to_user": 0.85, "dashboard_priority": 0, "tagline": "Frontier reasoning + tool use", "description": "Moonshot AI's flagship open-weights model for agentic work.", "about": "A 2.8T-parameter mixture-of-experts model that routes 16 of 896 experts per token.", "tags": [ "Reasoning", "Chat", "Code" ], "uses": [ "Agentic coding", "Reasoning" ], "logo_url": "https://avatars.githubusercontent.com/u/129152888", "input_modalities": [ "text", "image" ], "output_modalities": [ "text" ], "supported_sampling_parameters": [ "temperature", "top_p" ], "supported_features": [ "tools", "json_mode" ], "pricing": { "input": "0.0000014", "output": "0.0000044", "cache_read": "0.00000026", "cache_write": "0.00000175", "image": "0.015", "request": "0.001" }, "service_tiers": [ "standard" ], "service_tier_pricing": [ { "service_tier": "standard", "pricing": { "input": "0.0000014", "output": "0.0000044", "cache_read": "0.00000026", "cache_write": "0.00000175", "image": "0.015", "request": "0.001" } } ], "created_at": "2026-07-25T08:00:00.000Z", "context_length": 1048576, "max_output_length": 131072, "quantization": "int4", "capacity_tpm": 500000, "capacity_rpm": 120, "datacenters": [ { "country_code": "FI" } ], "total_parameters_b": 2800, "active_parameters_b": 40, "tokenizer": "Moonshot", "hugging_face_id": "moonshotai/Kimi-K3", "weights_url": "https://huggingface.co/moonshotai/Kimi-K3", "license": "MIT", "license_url": "https://opensource.org/license/mit", "release_date": "2026-07-15", "knowledge_cutoff": "2026-02-16", "deprecation_date": "2027-01-31", "replacement_code": "kimi-k4", "reasoning": { "optional": true, "supported_efforts": [ "low", "high", "max" ], "default_effort": "high" }, "capabilities": [ { "title": "Long-horizon coding", "description": "Sustains multi-step refactors across large repositories." } ], "benchmarks": { "indices": [ { "label": "Intelligence Index", "value": 51.1, "better_than": 91 } ], "groups": [ { "title": "Reasoning", "items": [ { "name": "GPQA Diamond", "description": "Graduate-level scientific reasoning", "value": 89.5 } ] } ], "comparison": { "columns": [ "Kimi K2.7 Code", "Claude Opus 5", "GPT-5.6" ], "rows": [ { "label": "AIME 2025", "values": [ 89.6, 87.2, null ] } ] } }, "updated_at": "2026-07-30T09:12:44.000Z" } ``` ### ModelsResponseDto - **Type:**`object` * **`data` (required)** `array` — One entry per catalog model **Items:** - **`about` (required)** `string` — Long-form "About model" copy - **`active_parameters_b` (required)** `number` — Parameters activated per token, in billions - **`benchmarks` (required)** `object` — Published benchmark scores, when available **All of:** - **`groups` (required)** `array` — Individual benchmarks, grouped by theme **Items:** - **`items` (required)** `array` — Benchmarks in this group **Items:** - **`description` (required)** `string` — What the benchmark measures - **`name` (required)** `string` — Benchmark name - **`value` (required)** `number` — Score as a percentage (0-100) - **`title` (required)** `string` — Benchmark group title - **`indices` (required)** `array` — Headline composite indices **Items:** - **`better_than` (required)** `number` — Percentage of compared models this model scores above - **`label` (required)** `string` — Index name - **`value` (required)** `number` — Index score - **`comparison`** `object` — Head-to-head comparison table **All of:** - **`columns` (required)** `array` — Column headers. The first entry is this model **Items:** `string` - **`rows` (required)** `array` — One row per benchmark **Items:** - **`label` (required)** `string` — Benchmark name - **`values` (required)** `array` — One score per entry in \`columns\`, in the same order. Null where a score was not published **Items:** `string` - **`capabilities` (required)** `array` — Key capabilities, when published **Items:** - **`description` (required)** `string` — Section body - **`title` (required)** `string` — Section heading - **`category` (required)** `string`, possible values: `"text", "image", "audio", "video", "embedding", "rerank"` — Catalog section the model belongs to - **`code` (required)** `string` — Our catalog id for the model, and the \`{code}\` parameter of the single-model route - **`created_at` (required)** `string`, format: `date-time` — When the catalog entry was created - **`dashboard_priority` (required)** `number` — Sort key for the catalog dashboard, ascending. Null sorts last, ties broken by name - **`description` (required)** `string` — Long-form description - **`endpoint_model` (required)** `string` — The id to send as \`model\` in an inference request. Usually the same as \`code\`, and always present - **`input_modalities` (required)** `array` — Accepted input modalities **Items:** `string`, possible values: `"text", "image", "file", "audio", "video", "embeddings", "rerank", "speech", "transcription"` - **`is_free` (required)** `boolean` — Whether calls are free under every offered service tier - **`knowledge_cutoff` (required)** `string` — Training data cutoff (YYYY-MM-DD) - **`license` (required)** `string` — Weight license - **`license_url` (required)** `string` — Full license text - **`logo_url` (required)** `string` — Absolute URL of the model or provider logo. Consumers fall back to a generated tile when null - **`name` (required)** `string` — Display name of the model - **`output_modalities` (required)** `array` — Produced output modalities **Items:** `string`, possible values: `"text", "image", "file", "audio", "video", "embeddings", "rerank", "speech", "transcription"` - **`pricing` (required)** `object` — Per-token prices in the project owner billing currency. Empty when the model has no published rate - **`provider_id` (required)** `string` — Organization id (namespace) that produced the model; the leading segment of the slug - **`provider_name` (required)** `string` — Organization name that produced the model - **`reasoning` (required)** `object` — Reasoning controls, when the model reasons at all **All of:** - **`optional` (required)** `boolean` — Whether reasoning can be disabled. False means every request pays for it - **`supported_efforts` (required)** `array` — Accepted effort levels, cheapest first **Items:** `string` - **`default_effort`** `string` — Effort applied when the request does not ask for one - **`release_date` (required)** `string` — Release date of this model version (YYYY-MM-DD), when the model was released to the public by the provider. - **`replacement_code` (required)** `string` — Code of the model that supersedes this one - **`request_rate_limit_per_min` (required)** `number` — Same value as \`capacity\_rpm\`. Use \`capacity\_rpm\` instead; per-project limits are returned by \`GET /v1/inference/rate-limits\` - **`service_tier_pricing` (required)** `array` — Per-token prices in the project owner billing currency, broken down by service tier, one entry per value in \`service\_tiers\` that has prices of its own. A tier without prices is left out **Items:** - **`pricing` (required)** `object` — Per-token prices for this service tier, in the project owner billing currency - **`service_tier` (required)** `string`, possible values: `"standard", "flex", "batch", "fast"` — The service tier these prices apply to - **`service_tiers` (required)** `array` — Service tiers this model is served under, similar to OpenAI \`service\_tier\`. Always includes \`standard\` **Items:** `string`, possible values: `"standard", "flex", "batch", "fast"` - **`slug` (required)** `string` — Namespaced model identifier, derived as \`\/\\`. Contains a slash, so it is not a route parameter - **`status` (required)** `string`, possible values: `"coming_soon", "beta", "available"` — Lifecycle state of the model - **`supported_features` (required)** `array` — Capabilities a client can branch on. Streaming is absent because it is always supported **Items:** `string`, possible values: `"tools", "json_mode", "structured_outputs", "logprobs", "web_search", "reasoning"` - **`supported_sampling_parameters` (required)** `array` — Sampling parameters the model honours. Anything absent is rejected or ignored **Items:** `string`, possible values: `"temperature", "top_p", "top_k", "min_p", "top_a", "frequency_penalty", "presence_penalty", "repetition_penalty", "stop", "seed", "max_tokens", "logit_bias"` - **`tagline` (required)** `string` — Short headline shown on a catalog card - **`tags` (required)** `array` — Capability labels shown as chips **Items:** `string` - **`tokenizer` (required)** `string` — Tokenizer family, used to estimate cost before calling - **`total_parameters_b` (required)** `number` — Total parameter count in billions - **`updated_at` (required)** `string`, format: `date-time` — When the catalog entry was last edited - **`uses` (required)** `array` — Suggested use cases **Items:** `string` - **`weights_url` (required)** `string` — Where the weights can be downloaded - **`capacity_rpm`** `number` — Total requests per minute of the deployment on the standard service tier, shared by all customers - **`capacity_tpm`** `number` — Total tokens per minute of the deployment on the standard service tier, shared by all customers - **`context_length`** `number` — Largest prompt the model accepts, in tokens - **`datacenters`** `array` — Datacenters serving this deployment **Items:** - **`country_code` (required)** `string` — ISO 3166-1 alpha-2 country code - **`deprecation_date`** `string` — When the model stops being served (YYYY-MM-DD). Absent unless a retirement has been announced - **`discount_to_user`** `number` — Fraction of the published price charged to end users. Below 1.0 - **`hugging_face_id`** `string` — Hugging Face repository holding the weights. Published for open-weights models so consumers can dedupe us against other hosts of the same model - **`max_output_length`** `number` — Largest completion the model will produce, in tokens - **`quantization`** `string`, possible values: `"int4", "int8", "fp4", "mxfp4", "nvfp4", "fp6", "fp8", "mxfp8", "fp16", "bf16", "fp32"` — Weight quantisation this deployment is served at. Omitted, never guessed **Example:** ```json { "data": [ { "code": "kimi-k3", "slug": "moonshotai/kimi-k3", "endpoint_model": "moonshotai/Kimi-K3", "name": "Kimi K3", "provider_id": "moonshotai", "provider_name": "Moonshot AI", "category": "text", "status": "available", "is_free": false, "discount_to_user": 0.85, "dashboard_priority": 0, "tagline": "Frontier reasoning + tool use", "description": "Moonshot AI's flagship open-weights model for agentic work.", "about": "A 2.8T-parameter mixture-of-experts model that routes 16 of 896 experts per token.", "tags": [ "Reasoning", "Chat", "Code" ], "uses": [ "Agentic coding", "Reasoning" ], "logo_url": "https://avatars.githubusercontent.com/u/129152888", "input_modalities": [ "text", "image" ], "output_modalities": [ "text" ], "supported_sampling_parameters": [ "temperature", "top_p" ], "supported_features": [ "tools", "json_mode" ], "pricing": { "input": "0.0000014", "output": "0.0000044", "cache_read": "0.00000026", "cache_write": "0.00000175", "image": "0.015", "request": "0.001" }, "service_tiers": [ "standard" ], "service_tier_pricing": [ { "service_tier": "standard", "pricing": { "input": "0.0000014", "output": "0.0000044", "cache_read": "0.00000026", "cache_write": "0.00000175", "image": "0.015", "request": "0.001" } } ], "created_at": "2026-07-25T08:00:00.000Z", "context_length": 1048576, "max_output_length": 131072, "quantization": "int4", "capacity_tpm": 500000, "capacity_rpm": 120, "datacenters": [ { "country_code": "FI" } ], "total_parameters_b": 2800, "active_parameters_b": 40, "tokenizer": "Moonshot", "hugging_face_id": "moonshotai/Kimi-K3", "weights_url": "https://huggingface.co/moonshotai/Kimi-K3", "license": "MIT", "license_url": "https://opensource.org/license/mit", "release_date": "2026-07-15", "knowledge_cutoff": "2026-02-16", "deprecation_date": "2027-01-31", "replacement_code": "kimi-k4", "reasoning": { "optional": true, "supported_efforts": [ "low", "high", "max" ], "default_effort": "high" }, "capabilities": [ { "title": "Long-horizon coding", "description": "Sustains multi-step refactors across large repositories." } ], "benchmarks": { "indices": [ { "label": "Intelligence Index", "value": 51.1, "better_than": 91 } ], "groups": [ { "title": "Reasoning", "items": [ { "name": "GPQA Diamond", "description": "Graduate-level scientific reasoning", "value": 89.5 } ] } ], "comparison": { "columns": [ "Kimi K2.7 Code", "Claude Opus 5", "GPT-5.6" ], "rows": [ { "label": "AIME 2025", "values": [ 89.6, 87.2, null ] } ] } }, "updated_at": "2026-07-30T09:12:44.000Z" } ] } ``` ### ModelQuotaDto - **Type:**`object` * **`max_enqueued_tokens` (required)** `number` — Tokens that can be queued at once. Set only for the batch service tier * **`rpm` (required)** `number` — Requests per minute. Null for the batch service tier * **`tpm` (required)** `number` — Tokens per minute. Null for the batch service tier **Example:** ```json { "rpm": 60, "tpm": 100000, "max_enqueued_tokens": null } ``` ### ModelServiceTierQuotaDto - **Type:**`object` * **`quota` (required)** `object` — Rate limits of the project for this model on this service tier * **`service_tier` (required)** `string`, possible values: `"standard", "flex", "batch", "fast"` — The service tier this quota applies to **Example:** ```json { "service_tier": "standard", "quota": { "rpm": 60, "tpm": 100000, "max_enqueued_tokens": null } } ``` ### ModelDetailResponseDto - **Type:**`object` * **`about` (required)** `string` — Long-form "About model" copy * **`active_parameters_b` (required)** `number` — Parameters activated per token, in billions * **`benchmarks` (required)** `object` — Published benchmark scores, when available **All of:** - **`groups` (required)** `array` — Individual benchmarks, grouped by theme **Items:** - **`items` (required)** `array` — Benchmarks in this group **Items:** - **`description` (required)** `string` — What the benchmark measures - **`name` (required)** `string` — Benchmark name - **`value` (required)** `number` — Score as a percentage (0-100) - **`title` (required)** `string` — Benchmark group title - **`indices` (required)** `array` — Headline composite indices **Items:** - **`better_than` (required)** `number` — Percentage of compared models this model scores above - **`label` (required)** `string` — Index name - **`value` (required)** `number` — Index score - **`comparison`** `object` — Head-to-head comparison table **All of:** - **`columns` (required)** `array` — Column headers. The first entry is this model **Items:** `string` - **`rows` (required)** `array` — One row per benchmark **Items:** - **`label` (required)** `string` — Benchmark name - **`values` (required)** `array` — One score per entry in \`columns\`, in the same order. Null where a score was not published **Items:** `string` * **`capabilities` (required)** `array` — Key capabilities, when published **Items:** - **`description` (required)** `string` — Section body - **`title` (required)** `string` — Section heading * **`category` (required)** `string`, possible values: `"text", "image", "audio", "video", "embedding", "rerank"` — Catalog section the model belongs to * **`code` (required)** `string` — Our catalog id for the model, and the \`{code}\` parameter of the single-model route * **`created_at` (required)** `string`, format: `date-time` — When the catalog entry was created * **`dashboard_priority` (required)** `number` — Sort key for the catalog dashboard, ascending. Null sorts last, ties broken by name * **`description` (required)** `string` — Long-form description * **`endpoint_model` (required)** `string` — The id to send as \`model\` in an inference request. Usually the same as \`code\`, and always present * **`input_modalities` (required)** `array` — Accepted input modalities **Items:** `string`, possible values: `"text", "image", "file", "audio", "video", "embeddings", "rerank", "speech", "transcription"` * **`is_free` (required)** `boolean` — Whether calls are free under every offered service tier * **`knowledge_cutoff` (required)** `string` — Training data cutoff (YYYY-MM-DD) * **`license` (required)** `string` — Weight license * **`license_url` (required)** `string` — Full license text * **`logo_url` (required)** `string` — Absolute URL of the model or provider logo. Consumers fall back to a generated tile when null * **`name` (required)** `string` — Display name of the model * **`output_modalities` (required)** `array` — Produced output modalities **Items:** `string`, possible values: `"text", "image", "file", "audio", "video", "embeddings", "rerank", "speech", "transcription"` * **`pricing` (required)** `object` — Per-token prices in the project owner billing currency. Empty when the model has no published rate * **`provider_id` (required)** `string` — Organization id (namespace) that produced the model; the leading segment of the slug * **`provider_name` (required)** `string` — Organization name that produced the model * **`quota_rpm` (required)** `number` — Requests per minute of the project for this model on the standard service tier. 0 when standard is not available on this tier * **`quota_tier` (required)** `number` — The project owner's inference tier, which sets the quotas below * **`quota_tpm` (required)** `number` — Tokens per minute of the project for this model on the standard service tier. 0 when standard is not available on this tier * **`reasoning` (required)** `object` — Reasoning controls, when the model reasons at all **All of:** - **`optional` (required)** `boolean` — Whether reasoning can be disabled. False means every request pays for it - **`supported_efforts` (required)** `array` — Accepted effort levels, cheapest first **Items:** `string` - **`default_effort`** `string` — Effort applied when the request does not ask for one * **`release_date` (required)** `string` — Release date of this model version (YYYY-MM-DD), when the model was released to the public by the provider. * **`replacement_code` (required)** `string` — Code of the model that supersedes this one * **`request_rate_limit_per_min` (required)** `number` — Same value as \`capacity\_rpm\`. Use \`capacity\_rpm\` instead; per-project limits are returned by \`GET /v1/inference/rate-limits\` * **`service_tier_pricing` (required)** `array` — Per-token prices in the project owner billing currency, broken down by service tier, one entry per value in \`service\_tiers\` that has prices of its own. A tier without prices is left out **Items:** - **`pricing` (required)** `object` — Per-token prices for this service tier, in the project owner billing currency - **`service_tier` (required)** `string`, possible values: `"standard", "flex", "batch", "fast"` — The service tier these prices apply to * **`service_tier_quota` (required)** `array` — Rate limits of the project per service tier, one entry per value in \`service\_tiers\` available on this tier. Each project has its own quota **Items:** - **`quota` (required)** `object` — Rate limits of the project for this model on this service tier - **`service_tier` (required)** `string`, possible values: `"standard", "flex", "batch", "fast"` — The service tier this quota applies to * **`service_tiers` (required)** `array` — Service tiers this model is served under, similar to OpenAI \`service\_tier\`. Always includes \`standard\` **Items:** `string`, possible values: `"standard", "flex", "batch", "fast"` * **`slug` (required)** `string` — Namespaced model identifier, derived as \`\/\\`. Contains a slash, so it is not a route parameter * **`status` (required)** `string`, possible values: `"coming_soon", "beta", "available"` — Lifecycle state of the model * **`supported_features` (required)** `array` — Capabilities a client can branch on. Streaming is absent because it is always supported **Items:** `string`, possible values: `"tools", "json_mode", "structured_outputs", "logprobs", "web_search", "reasoning"` * **`supported_sampling_parameters` (required)** `array` — Sampling parameters the model honours. Anything absent is rejected or ignored **Items:** `string`, possible values: `"temperature", "top_p", "top_k", "min_p", "top_a", "frequency_penalty", "presence_penalty", "repetition_penalty", "stop", "seed", "max_tokens", "logit_bias"` * **`tagline` (required)** `string` — Short headline shown on a catalog card * **`tags` (required)** `array` — Capability labels shown as chips **Items:** `string` * **`tokenizer` (required)** `string` — Tokenizer family, used to estimate cost before calling * **`total_parameters_b` (required)** `number` — Total parameter count in billions * **`updated_at` (required)** `string`, format: `date-time` — When the catalog entry was last edited * **`uses` (required)** `array` — Suggested use cases **Items:** `string` * **`weights_url` (required)** `string` — Where the weights can be downloaded * **`capacity_rpm`** `number` — Total requests per minute of the deployment on the standard service tier, shared by all customers * **`capacity_tpm`** `number` — Total tokens per minute of the deployment on the standard service tier, shared by all customers * **`context_length`** `number` — Largest prompt the model accepts, in tokens * **`datacenters`** `array` — Datacenters serving this deployment **Items:** - **`country_code` (required)** `string` — ISO 3166-1 alpha-2 country code * **`deprecation_date`** `string` — When the model stops being served (YYYY-MM-DD). Absent unless a retirement has been announced * **`discount_to_user`** `number` — Fraction of the published price charged to end users. Below 1.0 * **`hugging_face_id`** `string` — Hugging Face repository holding the weights. Published for open-weights models so consumers can dedupe us against other hosts of the same model * **`max_output_length`** `number` — Largest completion the model will produce, in tokens * **`quantization`** `string`, possible values: `"int4", "int8", "fp4", "mxfp4", "nvfp4", "fp6", "fp8", "mxfp8", "fp16", "bf16", "fp32"` — Weight quantisation this deployment is served at. Omitted, never guessed **Example:** ```json { "code": "kimi-k3", "slug": "moonshotai/kimi-k3", "endpoint_model": "moonshotai/Kimi-K3", "name": "Kimi K3", "provider_id": "moonshotai", "provider_name": "Moonshot AI", "category": "text", "status": "available", "is_free": false, "discount_to_user": 0.85, "dashboard_priority": 0, "tagline": "Frontier reasoning + tool use", "description": "Moonshot AI's flagship open-weights model for agentic work.", "about": "A 2.8T-parameter mixture-of-experts model that routes 16 of 896 experts per token.", "tags": [ "Reasoning", "Chat", "Code" ], "uses": [ "Agentic coding", "Reasoning" ], "logo_url": "https://avatars.githubusercontent.com/u/129152888", "input_modalities": [ "text", "image" ], "output_modalities": [ "text" ], "supported_sampling_parameters": [ "temperature", "top_p" ], "supported_features": [ "tools", "json_mode" ], "pricing": { "input": "0.0000014", "output": "0.0000044", "cache_read": "0.00000026", "cache_write": "0.00000175", "image": "0.015", "request": "0.001" }, "service_tiers": [ "standard" ], "service_tier_pricing": [ { "service_tier": "standard", "pricing": { "input": "0.0000014", "output": "0.0000044", "cache_read": "0.00000026", "cache_write": "0.00000175", "image": "0.015", "request": "0.001" } } ], "created_at": "2026-07-25T08:00:00.000Z", "context_length": 1048576, "max_output_length": 131072, "quantization": "int4", "capacity_tpm": 500000, "capacity_rpm": 120, "datacenters": [ { "country_code": "FI" } ], "total_parameters_b": 2800, "active_parameters_b": 40, "tokenizer": "Moonshot", "hugging_face_id": "moonshotai/Kimi-K3", "weights_url": "https://huggingface.co/moonshotai/Kimi-K3", "license": "MIT", "license_url": "https://opensource.org/license/mit", "release_date": "2026-07-15", "knowledge_cutoff": "2026-02-16", "deprecation_date": "2027-01-31", "replacement_code": "kimi-k4", "reasoning": { "optional": true, "supported_efforts": [ "low", "high", "max" ], "default_effort": "high" }, "capabilities": [ { "title": "Long-horizon coding", "description": "Sustains multi-step refactors across large repositories." } ], "benchmarks": { "indices": [ { "label": "Intelligence Index", "value": 51.1, "better_than": 91 } ], "groups": [ { "title": "Reasoning", "items": [ { "name": "GPQA Diamond", "description": "Graduate-level scientific reasoning", "value": 89.5 } ] } ], "comparison": { "columns": [ "Kimi K2.7 Code", "Claude Opus 5", "GPT-5.6" ], "rows": [ { "label": "AIME 2025", "values": [ 89.6, 87.2, null ] } ] } }, "updated_at": "2026-07-30T09:12:44.000Z", "quota_tier": 1, "quota_rpm": 60, "quota_tpm": 100000, "service_tier_quota": [ { "service_tier": "standard", "quota": { "rpm": 60, "tpm": 100000, "max_enqueued_tokens": null } } ] } ``` ### InferenceUsageRowDto - **Type:**`object` * **`cache_read_tokens` (required)** `number` — Prompt tokens served from cache * **`day` (required)** `string` — UTC calendar day * **`input_tokens` (required)** `number` — Uncached prompt tokens * **`model` (required)** `string` * **`output_tokens` (required)** `number` * **`requests` (required)** `number` **Example:** ```json { "requests": 42, "input_tokens": 120000, "cache_read_tokens": 980000, "output_tokens": 15000, "day": "2026-09-16", "model": "kimi-k3" } ``` ### InferenceUsageTotalsDto - **Type:**`object` * **`cache_read_tokens` (required)** `number` — Prompt tokens served from cache * **`input_tokens` (required)** `number` — Uncached prompt tokens * **`output_tokens` (required)** `number` * **`requests` (required)** `number` **Example:** ```json { "requests": 42, "input_tokens": 120000, "cache_read_tokens": 980000, "output_tokens": 15000 } ``` ### InferenceUsageRangeDto - **Type:**`object` * **`end` (required)** `string` * **`start` (required)** `string` **Example:** ```json { "start": "2026-08-17T12:00:00.000Z", "end": "2026-09-16T12:00:00.000Z" } ``` ### InferenceUsageResponseDto - **Type:**`object` * **`range` (required)** `object` - **`end` (required)** `string` - **`start` (required)** `string` * **`rows` (required)** `array` — One row per (day, model), newest day first **Items:** - **`cache_read_tokens` (required)** `number` — Prompt tokens served from cache - **`day` (required)** `string` — UTC calendar day - **`input_tokens` (required)** `number` — Uncached prompt tokens - **`model` (required)** `string` - **`output_tokens` (required)** `number` - **`requests` (required)** `number` * **`totals` (required)** `object` - **`cache_read_tokens` (required)** `number` — Prompt tokens served from cache - **`input_tokens` (required)** `number` — Uncached prompt tokens - **`output_tokens` (required)** `number` - **`requests` (required)** `number` **Example:** ```json { "rows": [ { "requests": 42, "input_tokens": 120000, "cache_read_tokens": 980000, "output_tokens": 15000, "day": "2026-09-16", "model": "kimi-k3" } ], "totals": { "requests": 42, "input_tokens": 120000, "cache_read_tokens": 980000, "output_tokens": 15000 }, "range": { "start": "2026-08-17T12:00:00.000Z", "end": "2026-09-16T12:00:00.000Z" } } ``` ### InferenceRateLimitResponseDto - **Type:**`object` * **`max_enqueued_tokens` (required)** `number` — Tokens that can be queued at once. Set only for the batch service tier * **`model_code` (required)** `string` — The model code * **`rpm` (required)** `number` — Requests per minute. Null for the batch service tier * **`service_tier` (required)** `string`, possible values: `"standard", "flex", "batch", "fast"` — Service tier the limit applies to * **`tpm` (required)** `number` — Tokens per minute. Null for the batch service tier **Example:** ```json { "model_code": "kimi-k3", "service_tier": "standard", "rpm": 60, "tpm": 100000, "max_enqueued_tokens": null } ``` ### InferenceRateLimitsResponseDto - **Type:**`object` * **`rate_limits` (required)** `array` — Limits of this project, one entry per model and service tier it may use. Other projects of the same owner have their own, separate limits **Items:** - **`max_enqueued_tokens` (required)** `number` — Tokens that can be queued at once. Set only for the batch service tier - **`model_code` (required)** `string` — The model code - **`rpm` (required)** `number` — Requests per minute. Null for the batch service tier - **`service_tier` (required)** `string`, possible values: `"standard", "flex", "batch", "fast"` — Service tier the limit applies to - **`tpm` (required)** `number` — Tokens per minute. Null for the batch service tier * **`tier` (required)** `number` — The project owner's inference tier **Example:** ```json { "tier": 1, "rate_limits": [ { "model_code": "kimi-k3", "service_tier": "standard", "rpm": 60, "tpm": 100000, "max_enqueued_tokens": null } ] } ``` ### GetAccessTokenDto - **Type:**`object` * **`client_id` (required)** `string` * **`client_secret` (required)** `string` * **`grant_type` (required)** `string`, possible values: `"client_credentials", "refresh_token"` **Example:** ```json { "grant_type": "client_credentials", "client_id": "6a51jsgnISg6JOyE7wYZh", "client_secret": "TvSBFujsqloJb4Jbcezths1OPK9my3zodM3zot9Fn5" } ``` ### RefreshAccessTokenPublicApiDto - **Type:**`object` * **`grant_type` (required)** `string`, possible values: `"client_credentials", "refresh_token"` * **`refresh_token` (required)** `string` **Example:** ```json { "grant_type": "refresh_token", "refresh_token": "OU4O2BwA690cKg2OfGS8pgIfGSTD2vJ..." } ``` ### GetAccessTokenResponseDto - **Type:**`object` * **`access_token` (required)** `string` — Access token value * **`expires_in` (required)** `number` — Token expiration time in seconds * **`refresh_token` (required)** `string` — Refresh token value * **`scope` (required)** `string` — Access scope * **`token_type` (required)** `string` — Token type **Example:** ```json { "access_token": "eyJhbGciOiJIUzI1NiI...", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "OU4O2BwA690cKg2OfGS8pgIfGSTD2vJ...", "scope": "cloud-api-v1" } ``` ### PublicApiErrorResponseDto - **Type:**`object` * **`code` (required)** `string`, possible values: `"invalid_request", "unauthorized_request", "insufficient_funds", "forbidden_action", "not_found", "conflict", "server_error", "service_unavailable"` * **`message` (required)** `string` — Error message **Example:** ```json { "code": "invalid_request", "message": "" } ``` ### BalanceResponseDto - **Type:**`object` * **`amount` (required)** `number` — Project balance * **`currency` (required)** `string`, possible values: `"usd", "eur"`, default: `"usd"` — Currency type **Example:** ```json { "amount": 1000, "currency": "usd" } ``` ### Os - **Type:**`object` * **`category` (required)** `string` — Image category * **`details` (required)** `array` — Image details **Items:** `string` * **`id` (required)** `string` — Image id * **`image_type` (required)** `string` — Image type * **`is_cluster` (required)** `boolean` — Is cluster * **`is_default` (required)** `boolean` — Is default image * **`name` (required)** `string` — Image name **Example:** ```json { "id": "8cf4043b-b5e2-4f91-a0e2-50d8bfff2ad3", "image_type": "ubuntu-24.04", "name": "Ubuntu 24.04", "is_default": false, "details": [ "Ubuntu 24.04", "Minimal Image" ], "category": "ubuntu", "is_cluster": false } ``` ### AuditLogResponseDto - **Type:**`object` * **`data` (required)** `object` — The data of the event, varies for different object types. For the subject of the event, the corresponding object is embedded; other related objects are referenced by ID. * **`id` (required)** `string` * **`source` (required)** `string` * **`specversion` (required)** `string` — The version of the CloudEvents specification that the event uses. * **`subject` (required)** `string` — This identifies the subject of the event in the context of the event producer. Typically it is ID of the object that the event is related to. * **`time` (required)** `string` — The time the event occurred. * **`type` (required)** `string` — The type of event that occurred, as \`com.verda.api.\.\.\.v1\`. **Example:** ```json { "specversion": "1.0", "id": "log_033FNaNcc0AtphhH71DLBW", "source": "https://api.verda.com/project/d6e7f8a9-b0c1-2345-defa-456789012345", "type": "com.verda.api.cloud.compute.create.v1", "subject": "7bdb4161-c7d2-478c-9850-05719adc8381", "time": "2026-03-17T14:15:52.872Z", "data": { "location_code": "FIN-01", "request_origin": "console-11.17.0", "actor_id": "5bbb59cb-fced-44a4-85c6-5005e7480a8f", "compute": { "id": "7bdb4161-c7d2-478c-9850-05719adc8381", "hostname": "tiny-tree-unfolds-fin-01", "instance_type": "CPU.4V.16G", "is_cluster": false, "ip": "1.1.1.1", "os_volume_id": "a6e77869-5012-42c0-b98e-792b4ba2cad9", "location_code": "FIN-01" } } } ``` ### GetAuditLogResponseListDto - **Type:**`object` * **`data` (required)** `array` — List of audit log events **Items:** - **`data` (required)** `object` — The data of the event, varies for different object types. For the subject of the event, the corresponding object is embedded; other related objects are referenced by ID. - **`id` (required)** `string` - **`source` (required)** `string` - **`specversion` (required)** `string` — The version of the CloudEvents specification that the event uses. - **`subject` (required)** `string` — This identifies the subject of the event in the context of the event producer. Typically it is ID of the object that the event is related to. - **`time` (required)** `string` — The time the event occurred. - **`type` (required)** `string` — The type of event that occurred, as \`com.verda.api.\.\.\.v1\`. * **`cursor`** `string` — Cursor for next page, if there are more results **Example:** ```json { "data": [ { "specversion": "1.0", "id": "log_033FNaNcc0AtphhH71DLBW", "source": "https://api.verda.com/project/d6e7f8a9-b0c1-2345-defa-456789012345", "type": "com.verda.api.cloud.compute.create.v1", "subject": "7bdb4161-c7d2-478c-9850-05719adc8381", "time": "2026-03-17T14:15:52.872Z", "data": { "location_code": "FIN-01", "request_origin": "console-11.17.0", "actor_id": "5bbb59cb-fced-44a4-85c6-5005e7480a8f", "compute": { "id": "7bdb4161-c7d2-478c-9850-05719adc8381", "hostname": "tiny-tree-unfolds-fin-01", "instance_type": "CPU.4V.16G", "is_cluster": false, "ip": "1.1.1.1", "os_volume_id": "a6e77869-5012-42c0-b98e-792b4ba2cad9", "location_code": "FIN-01" } } } ], "cursor": "log_033FNaNcc0AtphhH71DLBW" } ``` ### DownloadAuditLogParamsDto - **Type:**`object` * **`action`** `string`, possible values: `"other", "create", "start", "start_complete", "shutdown_complete", "shutdown", "delete", "delete_complete", "attach", "attach_complete", "detach", "detach_complete", "clone", "resize", "rename", "transfer", "trash", "trash_complete", "restore", "cancel", "provisioning", "running", "configure_spot", "authenticate", "expire", "accept", "update_role", "revoke", "login", "logout", "login_failed", "auth_mfa_enable", "auth_mfa_disable", "auth_mfa_challenge", "auth_mfa_verify", "password_reset", "complete", "redeem", "suspend", "unsuspend", "approve", "decline", "update", "rotate_secret", "disable", "enable"` — Filter by action type * **`end_date`** `string` — Return events created at or before this timestamp. Cannot be before the start date. * **`object_type`** `string`, possible values: `"compute", "volume", "ssh_key", "invite", "user", "member", "cloud_api_credential", "object_storage_bucket", "object_storage_key_pair", "custom_image", "startup_script", "topup", "coupon", "bank_transfer", "bank_transfer_account", "balance", "other", "object_storage", "quota_request", "webhook", "auto_top_up"` — Filter by object type * **`start_date`** `string` — Return events created at or after this timestamp. Cannot be earlier than 90 days ago. Default is 90 days ago. **Example:** ```json { "action": "other", "object_type": "compute", "start_date": "2026-01-01T00:00:00.000Z", "end_date": "" } ``` ### DownloadAuditLogResponseDto - **Type:**`object` * **`expires_at` (required)** `string` — ISO timestamp after which the download URL expires. * **`url` (required)** `string` — Pre-signed URL to download the exported audit log JSON file. Short-lived; request a new export once it expires. **Example:** ```json { "url": "https://object.storage.com/project-id/audit-log-20260317-141552-uuid.json?X-Amz-Signature=...", "expires_at": "2026-03-17T14:30:52.872Z" } ``` ### ActivityVolumeDto - **Type:**`object` * **`created_at` (required)** `string` * **`gb` (required)** `number` * **`id` (required)** `string` * **`is_shared_fs` (required)** `boolean` * **`location_code` (required)** `string` * **`name` (required)** `string` * **`template_type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` **Example:** ```json { "id": "28068e04-7097-4a73-97c4-53803cc2f855", "name": "volume-1", "created_at": "2026-03-17T14:15:52.872Z", "gb": 100, "is_shared_fs": false, "template_type": "NVMe", "location_code": "FIN-01" } ``` ### ActivityComputeDto - **Type:**`object` * **`compute_type` (required)** `string` * **`hostname` (required)** `string` * **`id` (required)** `string` * **`is_cluster` (required)** `boolean` * **`ip`** `string` * **`location_code`** `string` * **`os_volume_id`** `string` **Example:** ```json { "id": "7c0a5233-9037-4e8b-9de0-ef843a31f5a5", "hostname": "example-fin-01", "compute_type": "4A100.88V", "is_cluster": false, "ip": "1.2.3.4", "os_volume_id": "6cab90d5-bc96-4a33-9ebd-cbbe9f2e8819", "location_code": "FIN-01" } ``` ### GetActivityJournalResponseDto - **Type:**`object` * **`action_code` (required)** `string`, possible values: `"create", "start", "start:complete", "shutdown:complete", "shutdown", "delete", "delete:complete", "attach", "attach:complete", "detach", "detach:complete", "clone", "resize", "rename", "restore", "transfer", "trash", "trash:complete", "configure_spot", "cancel", "provisioning", "running", "installation:failed", "validating", "deleting", "error"` — Action that was performed on the object. * **`id` (required)** `string` — Event ID, unique within the project. Please note that it is not UUID but a combined string to identify the event. * **`location_code` (required)** `string` — Datacenter location code where the event happened or this object is located. * **`object_id` (required)** `string` — ID of the object that the event is related to. * **`object_type` (required)** `string`, possible values: `"compute", "volume"` — Object type that the event is related to. * **`project_id` (required)** `string` — ID of the project that the event is related to. * **`timestamp` (required)** `string` — When the event happened. * **`actor_email`** `string` — Email of the actor that performed the action. * **`actor_id`** `string` — ID of the actor that performed the action. For some actions, such as spot discontinue, the actor is not available and assumed to be system. * **`compute`** `object` — Detailed compute object, if the object type is a compute. * **`error_message`** `string` — For error events, the error message * **`parent_id`** `string` — For some events, for example attach volume during instance provisioning, the ID of the parent event. * **`properties`** `object` — Additional properties of the event. * **`request_ip`** `string` — IP address of the request that caused the event. * **`request_origin`** `string` — Origin of the request that caused the event. For example, public API, Console UI, or undefined for the internal system. * **`service`** `string` — For some events, the internal service that caused the event. * **`source_compute`** `object` — Associated source compute object **All of:** - **`compute_type` (required)** `string` - **`hostname` (required)** `string` - **`id` (required)** `string` - **`is_cluster` (required)** `boolean` - **`ip`** `string` - **`location_code`** `string` - **`os_volume_id`** `string` * **`source_compute_id`** `string` — For some events, the ID of the source compute. * **`source_volume`** `object` — Associated source volume object **All of:** - **`created_at` (required)** `string` - **`gb` (required)** `number` - **`id` (required)** `string` - **`is_shared_fs` (required)** `boolean` - **`location_code` (required)** `string` - **`name` (required)** `string` - **`template_type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` * **`source_volume_id`** `string` — For some events, the ID of the source volume. * **`target_compute`** `object` — Associated target compute object **All of:** - **`compute_type` (required)** `string` - **`hostname` (required)** `string` - **`id` (required)** `string` - **`is_cluster` (required)** `boolean` - **`ip`** `string` - **`location_code`** `string` - **`os_volume_id`** `string` * **`target_compute_id`** `string` — For some events, the ID of the target compute. * **`target_location_code`** `string` — For cross-datacenter events, the location code of the target location. * **`target_volume`** `object` — Associated target volume object **All of:** - **`created_at` (required)** `string` - **`gb` (required)** `number` - **`id` (required)** `string` - **`is_shared_fs` (required)** `boolean` - **`location_code` (required)** `string` - **`name` (required)** `string` - **`template_type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` * **`target_volume_id`** `string` — For some events, the ID of the target volume. * **`volume`** `object` — Associated volume object, if the object is a volume. **Example:** ```json { "id": "instance-log-123", "object_id": "00695fcc-b2f3-4420-902c-35bc8e1bda61", "object_type": "compute", "action_code": "start", "actor_id": "40ea2285-d81c-4dc6-aa85-acdd156e6c49", "actor_email": "user@datacrunch.io", "project_id": "e43504fd-2a0e-47ca-a922-89ea5d4f564f", "timestamp": "2026-03-17T14:15:52.872Z", "location_code": "FIN-01", "request_origin": "public-api-v1", "request_ip": "127.0.0.1", "error_message": "GPU_QUOTA_EXCEEDED", "parent_id": "compute-log-123", "service": "VolumeProvider", "target_location_code": "ICE-01", "volume": { "id": "28068e04-7097-4a73-97c4-53803cc2f855", "name": "volume-1", "created_at": "2026-03-17T14:15:52.872Z", "gb": 100, "is_shared_fs": false, "template_type": "NVMe", "location_code": "FIN-01" }, "compute": { "id": "7c0a5233-9037-4e8b-9de0-ef843a31f5a5", "hostname": "example-fin-01", "compute_type": "4A100.88V", "is_cluster": false, "ip": "1.2.3.4", "os_volume_id": "6cab90d5-bc96-4a33-9ebd-cbbe9f2e8819", "location_code": "FIN-01" }, "target_volume_id": "cbc36662-220a-4fbb-8ad3-a3d1494791b0", "target_volume": { "id": "28068e04-7097-4a73-97c4-53803cc2f855", "name": "volume-1", "created_at": "2026-03-17T14:15:52.872Z", "gb": 100, "is_shared_fs": false, "template_type": "NVMe", "location_code": "FIN-01" }, "target_compute_id": "f5379869-30d3-4922-9f32-eefcb7ead93e", "target_compute": { "id": "7c0a5233-9037-4e8b-9de0-ef843a31f5a5", "hostname": "example-fin-01", "compute_type": "4A100.88V", "is_cluster": false, "ip": "1.2.3.4", "os_volume_id": "6cab90d5-bc96-4a33-9ebd-cbbe9f2e8819", "location_code": "FIN-01" }, "source_volume_id": "3cf8fc94-38a7-42bf-a731-03beb6db31ce", "source_volume": { "id": "28068e04-7097-4a73-97c4-53803cc2f855", "name": "volume-1", "created_at": "2026-03-17T14:15:52.872Z", "gb": 100, "is_shared_fs": false, "template_type": "NVMe", "location_code": "FIN-01" }, "source_compute_id": "78a8ceeb-926f-468c-ad3d-1ff7b7103a8a", "source_compute": { "id": "7c0a5233-9037-4e8b-9de0-ef843a31f5a5", "hostname": "example-fin-01", "compute_type": "4A100.88V", "is_cluster": false, "ip": "1.2.3.4", "os_volume_id": "6cab90d5-bc96-4a33-9ebd-cbbe9f2e8819", "location_code": "FIN-01" }, "properties": { "delete_reason": "evicted_by_on_demand" } } ``` ### TagResponseDto - **Type:**`object` * **`id` (required)** `string` * **`key` (required)** `string` * **`value` (required)** `string` — Empty string for a freeform tag **Example:** ```json { "id": "tag_0aB1cD2eF3gH4iJ5kL6mN7", "key": "environment", "value": "production" } ``` ### GetVolumePublicResponseDto - **Type:**`object` * **`base_hourly_cost` (required)** `number` — Volume base hourly cost * **`contract` (required)** `string` — Volume contract type * **`create_directory_command` (required)** `string` — Create directory command * **`created_at` (required)** `string` — Volume creation date * **`currency` (required)** `string`, possible values: `"usd", "eur"` — Volume currency * **`filesystem_to_fstab_command` (required)** `string` — Filesystem to fstab command * **`id` (required)** `string` — Volume ID * **`instance_id` (required)** `string` — Instance ID * **`instances` (required)** `array` — Instance info the volume is attached to **Items:** `string` * **`is_os_volume` (required)** `boolean` — Is OS volume * **`location` (required)** `string` — Volume location * **`long_term` (required)** `object` — Long term contract details * **`monthly_price` (required)** `number` — Volume monthly price * **`mount_command` (required)** `string` — Mount command * **`name` (required)** `string` — Volume name * **`pseudo_path` (required)** `string` — Volume pseudo path. Unique identifier for your filesystem * **`size` (required)** `number` — Volume size in GB * **`ssh_key_ids` (required)** `array` — Array of SSH key IDs that are linked to the volume if it is an OS volume **Items:** `string` * **`status` (required)** `string`, possible values: `"ordered", "attached", "attaching", "detached", "deleted", "cloning", "detaching", "deleting", "restoring", "created", "exported", "canceled", "canceling"` — Volume status * **`tags` (required)** `array` **Items:** - **`id` (required)** `string` - **`key` (required)** `string` - **`value` (required)** `string` — Empty string for a freeform tag * **`target` (required)** `string` — Volume target * **`type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` — Volume type * **`created_by_user_id`** `string` **Example:** ```json { "id": "4cde5a92-dfeb-4032-87f0-bf3f6014f87a", "instance_id": "479a5578-cc6e-4081-9c2f-8e7def744663", "instances": [ { "id": "479a5578-cc6e-4081-9c2f-8e7def744663", "auto_rental_extension": null, "ip": "123.123.123.123", "instance_type": "4A100.88V", "status": "running", "os_volume_id": "01f67384-c409-48c1-874a-9b42db3a4d0f", "hostname": "hazy-star-swims-fin-01", "instance_template": { "instance_type": "4A100.88V", "cpu_cores": 128, "gpu_number": 4, "gpu_vram_gb": 80, "ram_gb": 512 }, "instance_model": { "code": "A100_80G", "manufacturer": "NVIDIA", "category": "GPU", "cluster_model_code": null } } ], "name": "OS-NVMe-84Ca37Jf", "created_at": "2024-07-08T19:19:54.247Z", "created_by_user_id": "7dfc2631-0158-4f74-93f6-6b46dcb90fef", "status": "attached", "size": 100, "is_os_volume": true, "target": "vda", "type": "NVMe", "location": "FIN-01", "ssh_key_ids": [ "d9e2bd98-aa00-4fc0-8d54-d600a562e398" ], "pseudo_path": "volume-84Ca37Jf", "create_directory_command": "mkdir -p /mnt/volume", "mount_command": "mount -t nfs -o nconnect=16 nfs.fin-01.datacrunch.io:volume-88eb67d0 /mnt/volume", "filesystem_to_fstab_command": "grep -qxF 'nfs.fin-01.datacrunch.io:volume-88eb67d0 /mnt/volume nfs defaults 0 0' /etc/fstab || echo 'nfs.fin-01.datacrunch.io:volume-88eb67d0 /mnt/volume nfs defaults 0 0' | sudo tee -a /etc/fstab", "contract": "LONG_TERM", "base_hourly_cost": 0.0273972602739726, "monthly_price": 20, "currency": "eur", "long_term": { "end_date": "2025-01-08T19:34:16.663Z", "long_term_period": "3 months", "discount_percentage": 14, "auto_rental_extension": false, "next_period_price": 49.93356, "current_period_price": 49.93356 }, "tags": [ { "id": "tag_0aB1cD2eF3gH4iJ5kL6mN7", "key": "environment", "value": "production" } ] } ``` ### GetVolumeInTrashPublicResponseDto - **Type:**`object` * **`base_hourly_cost` (required)** `number` — Volume base hourly cost * **`contract` (required)** `string` — Volume contract type * **`created_at` (required)** `string` — Volume creation date * **`currency` (required)** `string`, possible values: `"usd", "eur"` — Volume currency * **`deleted_at` (required)** `string` — Volume deletion date * **`id` (required)** `string` — Volume ID * **`instance_id` (required)** `string` — Instance ID * **`instances` (required)** `array` — Instance info the volume is attached to **Items:** `string` * **`is_os_volume` (required)** `boolean` — Is OS volume * **`is_permanently_deleted` (required)** `boolean` — Is volume permanently deleted * **`location` (required)** `string` — Volume location * **`monthly_price` (required)** `number` — Volume monthly price * **`name` (required)** `string` — Volume name * **`size` (required)** `number` — Volume size in GB * **`ssh_key_ids` (required)** `array` — Array of SSH key IDs that are linked to the volume if it is an OS volume **Items:** `string` * **`status` (required)** `string`, possible values: `"ordered", "attached", "attaching", "detached", "deleted", "cloning", "detaching", "deleting", "restoring", "created", "exported", "canceled", "canceling"` — Volume status * **`tags` (required)** `array` **Items:** - **`id` (required)** `string` - **`key` (required)** `string` - **`value` (required)** `string` — Empty string for a freeform tag * **`target` (required)** `string` — Volume target * **`type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` — Volume type **Example:** ```json { "id": "4cde5a92-dfeb-4032-87f0-bf3f6014f87a", "instance_id": "479a5578-cc6e-4081-9c2f-8e7def744663", "instances": [ { "id": "479a5578-cc6e-4081-9c2f-8e7def744663", "auto_rental_extension": null, "ip": "123.123.123.123", "instance_type": "4A100.88V", "status": "running", "os_volume_id": "01f67384-c409-48c1-874a-9b42db3a4d0f", "hostname": "hazy-star-swims-fin-01", "instance_template": { "instance_type": "4A100.88V", "cpu_cores": 128, "gpu_number": 4, "gpu_vram_gb": 80, "ram_gb": 512 }, "instance_model": { "code": "A100_80G", "manufacturer": "NVIDIA", "category": "GPU", "cluster_model_code": null } } ], "name": "OS-NVMe-84Ca37Jf", "created_at": "2024-07-08T19:19:54.247Z", "status": "attached", "size": 100, "is_os_volume": true, "target": "vda", "type": "NVMe", "location": "FIN-01", "ssh_key_ids": [ "d9e2bd98-aa00-4fc0-8d54-d600a562e398" ], "contract": "LONG_TERM", "base_hourly_cost": 0.0273972602739726, "monthly_price": 20, "currency": "eur", "tags": [ { "id": "tag_0aB1cD2eF3gH4iJ5kL6mN7", "key": "environment", "value": "production" } ], "deleted_at": "2025-01-10T11:35:47.633Z", "is_permanently_deleted": false } ``` ### TagDto - **Type:**`object` * **`key` (required)** `string` * **`value`** `string` — Omit for a freeform tag with no value **Example:** ```json { "key": "environment", "value": "production" } ``` ### CreateVolumePublicDto - **Type:**`object` * **`location_code` (required)** `string` — Location code * **`name` (required)** `string` — Volume name * **`size` (required)** `number` — Volume size in GB * **`type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` — Volume type * **`instance_id`** `string` — Instance ID to attach the volume to * **`instance_ids`** `array` — Array of instance IDs to attach the volume to **Items:** `string` * **`tags`** `array` — Key-value tags for the new volume. Maximum 10. Omit \`value\` for a freeform tag. Keys are lowercased. **Items:** - **`key` (required)** `string` - **`value`** `string` — Omit for a freeform tag with no value **Example:** ```json { "type": "NVMe", "location_code": "FIN-01", "size": 50, "instance_id": "1400cecc-e894-4d06-bd29-6cddaaeeb623", "instance_ids": [ "8c1b7338-713d-4070-98cb-c7d7f16c0df3", "3b58159d-60a2-4eb5-80bb-2d13ebe552bd" ], "name": "my-volume", "tags": [ { "key": "environment", "value": "production" } ] } ``` ### PerformVolumeActionPublicDto - **Type:**`object` * **`action` (required)** `string`, possible values: `"attach", "detach", "delete", "rename", "resize", "restore", "clone", "cancel", "create", "export", "transfer"` — Action to perform on the volume(s) The \`clone\` action returns its destination volume ID: \`{"id":"..."}\`. Send a \`cancel\` action with that same ID to interrupt a cross-datacenter clone. * **`id` (required)** `object` — Volume ID(s) to perform the action on. Single volume id or an array of volume ids * **`instance_id`** `string` — Instance ID to attach the volume to, if the action is attach * **`instance_ids`** `array` — Array of instance IDs to attach the volume to, if the action is attach **Items:** `string` * **`is_permanent`** `boolean` — If deleting volume(s), delete them permanently * **`location_code`** `string` — Target location code if cloning the volume * **`name`** `string` — New volume name * **`size`** `number` — New volume size in GB. Can't be lower than current size * **`type`** `string` — Target volume type **Example:** ```json { "action": "detach", "id": [ "563454aa-623d-494e-a831-add51c95f293" ], "size": 100, "instance_id": "3e88621d-ba46-4fad-8ec7-a2110df33091", "instance_ids": [ "7a18e723-20af-41cd-a181-bcc7149c87ea", "d752543b-24f9-4280-b0fd-b65367e2c620" ], "name": "volume-name", "type": "NVMe", "is_permanent": true, "location_code": "FIN-01" } ``` ### DeleteVolumePublicDto - **Type:**`object` * **`is_permanent`** `boolean`, default: `false` — If true, the volume will be removed permanently **Example:** ```json { "is_permanent": false } ``` ### VolumeType - **Type:**`object` * **`burst_bandwidth` (required)** `number` — Burst bandwidth * **`continuous_bandwidth` (required)** `number` — Continuous bandwidth * **`internal_network_speed` (required)** `number` — Internal network speed * **`iops` (required)** `string` — IOPS * **`is_shared_fs` (required)** `boolean` — Is shared file system * **`price` (required)** `object` — Price details * **`throughput_gbps` (required)** `number` — Throughput in GB/s * **`type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` — Volume type **Example:** ```json { "type": "NVMe", "price": { "price_per_month_per_gb": 0.2, "cps_per_gb": 7.6103500761035e-8, "currency": "usd" }, "is_shared_fs": false, "burst_bandwidth": 2500, "continuous_bandwidth": 2000, "internal_network_speed": 50, "iops": "100k", "throughput_gbps": 4 } ``` ### GetInstanceResponsePublicApiDto - **Type:**`object` * **`contract` (required)** `string`, possible values: `"LONG_TERM", "PAY_AS_YOU_GO", "SPOT"` * **`cpu` (required)** `object` * **`created_at` (required)** `string` * **`description` (required)** `string` — Instance description; an empty string when none was supplied. * **`gpu` (required)** `object` * **`gpu_memory` (required)** `object` * **`hostname` (required)** `string` * **`id` (required)** `string` * **`image` (required)** `string` * **`instance_type` (required)** `string` * **`ip` (required)** `string` — Public address; \`null\` when the instance is not reachable from the internet * **`is_spot` (required)** `boolean` * **`jupyter_token` (required)** `string` * **`location` (required)** `string` * **`memory` (required)** `object` * **`os_name` (required)** `string` * **`os_volume_id` (required)** `string` * **`price_per_hour` (required)** `number` * **`pricing` (required)** `string`, possible values: `"DYNAMIC_PRICE", "FIXED_PRICE"` * **`ssh_key_ids` (required)** `array` **Items:** `string` * **`startup_script_id` (required)** `string` * **`status` (required)** `string`, possible values: `"running", "provisioning", "offline", "discontinued", "unknown", "ordered", "notfound", "new", "error", "deleting", "validating", "no_capacity", "installation_failed"` * **`storage` (required)** `object` * **`tags` (required)** `array` **Items:** - **`id` (required)** `string` - **`key` (required)** `string` - **`value` (required)** `string` — Empty string for a freeform tag * **`volume_ids` (required)** `array` **Items:** `string` * **`created_by_user_id`** `string` **Example:** ```json { "id": "edbbc4b4-809b-41d6-a6ee-f33e1d9d740e", "ip": "1.2.3.4", "status": "running", "created_at": "2023-07-15T14:10:26.654Z", "created_by_user_id": "7dfc2631-0158-4f74-93f6-6b46dcb90fef", "cpu": { "description": "176 CPU", "number_of_cores": 176, "model": "AMD Genoa" }, "gpu": { "description": "8x A100", "number_of_gpus": 8 }, "gpu_memory": { "description": "80GB GPU RAM", "size_in_gigabytes": 80 }, "memory": { "description": "640GB RAM", "size_in_gigabytes": 640 }, "storage": { "description": "dynamic" }, "hostname": "hazy-star-swims-fin-01", "description": "ubuntu-22-04-cuda-12-0-docker-fin-01", "tags": [ { "id": "tag_0aB1cD2eF3gH4iJ5kL6mN7", "key": "environment", "value": "production" } ], "location": "FIN-01", "price_per_hour": 2.481, "is_spot": false, "instance_type": "8A100.176V", "image": "ubuntu-22-04-cuda-12-0-docker", "os_name": "Ubuntu 22.04", "startup_script_id": "95cec4c3-af69-42eb-a790-fcacebfdfcea", "ssh_key_ids": [ "dd50b622-1c36-48c2-a485-f4d4937a3ea1" ], "os_volume_id": "95cec4c3-af69-42eb-a790-fcacebfdfcea", "jupyter_token": "b9e6d8517db3a722ccfb309ca599a35f", "contract": "PAY_AS_YOU_GO", "pricing": "FIXED_PRICE", "volume_ids": [ "95cec4c3-af69-42eb-a790-fcacebfdfcea", "dd50b622-1c36-48c2-a485-f4d4937a3ea1" ] } ``` ### OsVolumeDto - **Type:**`object` * **`name` (required)** `string` * **`size` (required)** `number` * **`on_spot_discontinue`** `string`, possible values: `"keep_detached", "move_to_trash", "delete_permanently"` — Optional, by default, nothing is deleted. Should we automatically delete, if instance is deleted because of spot? Allowed values: \* \`keep\_detached\` (default behavior, volume will be detached), \* \`move\_to\_trash\` (will be deleted after 96 hours and counts towards the storage volume quota), \* \`delete\_permanently\` (will be deleted immediately). * **`tags`** `array` — Key-value tags for the new volume. Maximum 10. Omit \`value\` for a freeform tag. Keys are lowercased. **Items:** - **`key` (required)** `string` - **`value`** `string` — Omit for a freeform tag with no value **Example:** ```json { "name": "custom-os-volume-name", "size": "100", "on_spot_discontinue": "keep_detached", "tags": [ { "key": "environment", "value": "production" } ] } ``` ### VolumeDto - **Type:**`object` * **`name` (required)** `string` * **`size` (required)** `number` * **`type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` * **`on_spot_discontinue`** `string`, possible values: `"keep_detached", "move_to_trash", "delete_permanently"` — Optional, by default, nothing is deleted. Should we automatically delete, if instance is deleted because of spot? Allowed values: \* \`keep\_detached\` (default behavior, volume will be detached), \* \`move\_to\_trash\` (will be deleted after 96 hours and counts towards the storage volume quota), \* \`delete\_permanently\` (will be deleted immediately). * **`tags`** `array` — Key-value tags for the new volume. Maximum 10. Omit \`value\` for a freeform tag. Keys are lowercased. **Items:** - **`key` (required)** `string` - **`value`** `string` — Omit for a freeform tag with no value **Example:** ```json { "name": "custom-os-volume-name", "size": "100", "on_spot_discontinue": "keep_detached", "tags": [ { "key": "environment", "value": "production" } ], "type": "HDD" } ``` ### DeployInstancePublicDto - **Type:**`object` * **`hostname` (required)** `string` * **`contract`** `string`, possible values: `"LONG_TERM", "PAY_AS_YOU_GO", "SPOT"` * **`coupon`** `string` * **`description`** `string` — Optional instance description. * **`existing_volumes`** `array` — IDs of additional existing detached volumes to attach to this new instance when its created. (To configure instance \*\*OS\*\* volume, use \`"image"\` and \`"os\_volume"\` properties.) **Items:** `string` * **`image`** `string` — Required unless \`instance\_group\_id\` is set, in which case the group's template supplies the default (a group instance may override it). OS image specification for the created instance. There are two options: 1. OS image type or UUID. For a list of advertised images, check \`GET /images\`. Hidden images can also be deployed directly. The image must be enabled or explicitly enabled for the project owner. To set the name and size, use \`"os\_volume"\` property. 2. Previously customized OS volume ID. (To create an OS volume, first make an instance with existing \`"image"\` type. To customize the volume content, ssh into that instance. Finally, delete the instance but keep the volume.) * **`instance_group_id`** `string` — Create this instance in the given instance group. * **`instance_type`** `string` — Required unless \`instance\_group\_id\` is set, in which case the group supplies it. * **`is_spot`** `boolean` — Create a spot instance. Spot instances may be evicted by Verda at any time without warning. * **`location_code`** `string` — Location code for the instance and any newly created volumes. Required unless \`instance\_group\_id\` is set, in which case the group supplies it. * **`os_volume`** `object` — Newly created OS volume name and size (in GB). Use when \`"image"\` property is an OS image type. For a group instance, the size must be at least the group's OS volume size. Object properties: \* \`name\` - Name of the OS volume \* \`size\` - Size of the OS volume in GB \* \`on\_spot\_discontinue\` - Removal policy for the OS volume for spot instances. Optional, by default, nothing is deleted. Allowed values: \`keep\_detached\` (default behavior), \`move\_to\_trash\` (will be deleted after 96 hours and counts towards the storage volume quota), \`delete\_permanently\` (will be deleted immediately). * **`pricing`** `string`, possible values: `"DYNAMIC_PRICE", "FIXED_PRICE"` — This field is deprecated as DYNAMIC\_PRICE is removed. Only FIXED\_PRICE is supported now. * **`ssh_key_ids`** `object` * **`startup_script_id`** `string` * **`tags`** `array` — Key-value tags for the new instance. Maximum 10. Omit \`value\` for a freeform tag. Keys are lowercased. **Items:** - **`key` (required)** `string` - **`value`** `string` — Omit for a freeform tag with no value * **`volumes`** `array` — Additional (\*\*non-OS\*\*) volumes to create and attach to this new instance. (To configure \*\*OS\*\* volume, use \`"image"\` and \`"os\_volume"\` properties.) **Items:** - **`name` (required)** `string` - **`size` (required)** `number` - **`type` (required)** `string`, possible values: `"HDD", "NVMe", "HDD_Shared", "NVMe_Shared", "NVMe_Local_Storage", "NVMe_Shared_Cluster", "NVMe_OS_Cluster"` - **`on_spot_discontinue`** `string`, possible values: `"keep_detached", "move_to_trash", "delete_permanently"` — Optional, by default, nothing is deleted. Should we automatically delete, if instance is deleted because of spot? Allowed values: \* \`keep\_detached\` (default behavior, volume will be detached), \* \`move\_to\_trash\` (will be deleted after 96 hours and counts towards the storage volume quota), \* \`delete\_permanently\` (will be deleted immediately). - **`tags`** `array` — Key-value tags for the new volume. Maximum 10. Omit \`value\` for a freeform tag. Keys are lowercased. **Items:** - **`key` (required)** `string` - **`value`** `string` — Omit for a freeform tag with no value **Example:** ```json { "instance_group_id": "6953837c-aa1a-4670-81bf-94cbc96be920", "instance_type": "1H100.80S.30V", "image": "ubuntu-22.04-cuda-12.4-docker", "ssh_key_ids": [ "3eafa73f-82a9-4f21-aadb-5a15392469fb" ], "startup_script_id": "7f81d466-a071-472c-8b4f-7862f2b3858b", "hostname": "my-instance-hostname", "description": "", "tags": [ { "key": "environment", "value": "production" }, { "key": "benchmark" } ], "location_code": "FIN-01", "os_volume": { "name": "custom-os-volume-name", "size": 100, "on_spot_discontinue": "keep_detached" }, "is_spot": true, "coupon": "COUPON-CODE-2026", "volumes": [ { "name": "additional-volume-name", "size": 1000, "type": "NVMe" } ], "existing_volumes": [ "b8480094-b065-4b50-9204-e07d742eba01" ], "contract": "PAY_AS_YOU_GO" } ``` ### PerformInstanceActionPublicDto - **Type:**`object` * **`action` (required)** `string`, possible values: `"boot", "start", "shutdown", "delete", "discontinue", "hibernate", "configure_spot", "force_shutdown", "delete_stuck", "deploy", "transfer"` * **`id` (required)** `object` — Instance ID or list of instance IDs * **`delete_permanently`** `boolean`, default: `false` — Delete the volumes permanently. Only applicable for delete (or discontinue) action, when volume IDs to delete are also provided. * **`volume_ids`** `array` — Volume IDs to delete. Specify empty array to indicate no volumes should be deleted (previously known as "hibernate") **Items:** `string` **Example:** ```json { "action": "boot", "id": [ "ec127c7e-173b-457e-b71c-504ceda7d44e" ], "volume_ids": [ "00eab353-034b-42f6-bc55-6acdb377f3ea" ], "delete_permanently": false } ``` ### InstanceActionResultDto - **Type:**`object` * **`action` (required)** `string`, possible values: `"boot", "start", "shutdown", "delete", "discontinue", "hibernate", "configure_spot", "force_shutdown", "delete_stuck", "deploy", "transfer"` — Action that was requested * **`instanceId` (required)** `string`, format: `uuid` — Instance ID * **`status` (required)** `string`, possible values: `"success", "error"` — Whether the action succeeded or failed * **`error`** `string` — Error message if the action failed * **`statusCode`** `number` — HTTP status code of the error **Example:** ```json { "instanceId": "", "action": "boot", "status": "success", "error": "", "statusCode": 400 } ``` ### GetClusterResponsePublicApiDto - **Type:**`object` * **`cluster_type` (required)** `string` * **`contract` (required)** `string`, possible values: `"LONG_TERM", "PAY_AS_YOU_GO"` — Contract type used for this cluster * **`cpu` (required)** `object` * **`created_at` (required)** `string` * **`description` (required)** `string` — Cluster description; an empty string when none was supplied. * **`gpu` (required)** `object` * **`gpu_memory` (required)** `object` * **`hostname` (required)** `string` * **`id` (required)** `string` * **`image` (required)** `string` — OS image used to deploy the cluster nodes * **`ip` (required)** `string` — Jump host IP address * **`location` (required)** `string` * **`memory` (required)** `object` * **`os_name` (required)** `string` * **`price_per_hour` (required)** `number` * **`ssh_key_ids` (required)** `array` — SSH key IDs used to access the cluster jump host **Items:** `string` * **`status` (required)** `string`, possible values: `"running", "provisioning", "offline", "discontinued", "unknown", "ordered", "notfound", "new", "error", "deleting", "validating", "no_capacity", "installation_failed"` * **`tags` (required)** `array` **Items:** - **`id` (required)** `string` - **`key` (required)** `string` - **`value` (required)** `string` — Empty string for a freeform tag * **`auto_rental_extension`** `boolean` — Deprecated: use extension\_settings instead. * **`created_by_user_id`** `string` * **`extension_settings`** `string`, possible values: `"auto_renew", "pay_as_you_go", "end_contract"` — Extension settings for long-term contracts * **`long_term_period`** `string` — Long-term rental period for this cluster, e.g. 1 week etc. * **`shared_volumes`** `array` — Shared volumes attached to this cluster. There is always one shared volume mounted as /home. **Items:** `string` * **`startup_script_id`** `string` * **`turn_to_pay_as_you_go`** `boolean` — Deprecated: use extension\_settings instead. * **`worker_nodes`** `array` — Worker nodes of this cluster. You can access them from the jump host by executing \`ssh \\` **Items:** `string` **Example:** ```json { "id": "10ea334f-a5f1-44a6-a4cb-b35bd4f87651", "ip": "1.2.3.4", "status": "running", "created_at": "2023-07-15T14:10:26.654Z", "created_by_user_id": "7dfc2631-0158-4f74-93f6-6b46dcb90fef", "cpu": { "description": "176 CPU", "number_of_cores": 176, "model": "AMD Genoa" }, "gpu": { "description": "8x A100", "number_of_gpus": 8 }, "gpu_memory": { "description": "80GB GPU RAM", "size_in_gigabytes": 80 }, "memory": { "description": "640GB RAM", "size_in_gigabytes": 640 }, "hostname": "hazy-star-swims-fin-01", "description": "ubuntu-22-04-cuda-12-0-docker-fin-01", "tags": [ { "id": "tag_0aB1cD2eF3gH4iJ5kL6mN7", "key": "environment", "value": "production" } ], "location": "FIN-01", "price_per_hour": 2.481, "cluster_type": "16H200", "image": "ubuntu-22-04-cuda-12-0-docker", "os_name": "Ubuntu 22.04", "startup_script_id": "95cec4c3-af69-42eb-a790-fcacebfdfcea", "ssh_key_ids": [ "dd50b622-1c36-48c2-a485-f4d4937a3ea1" ], "contract": "LONG_TERM", "extension_settings": "auto_renew", "long_term_period": "1 week", "worker_nodes": [ { "id": "1", "hostname": "worker-1", "public_ip": "1.2.3.4", "private_ip": "1.2.3.4", "status": "running" } ], "shared_volumes": [ { "id": "1", "name": "shared-volume-1", "mount_point": "/home", "size_in_gigabytes": 100 } ] } ``` ### SharedVolumeDto - **Type:**`object` * **`name` (required)** `string` — Name of the shared cluster volume * **`size` (required)** `number` — Size of the shared cluster volume in GB **Example:** ```json { "name": "SFS-pmAna3o2", "size": 30000 } ``` ### ExistingSharedVolumeDto - **Type:**`object` * **`id` (required)** `string` — Existing shared volume ID **Example:** ```json { "id": "519c4608-0b61-43f1-9b92-7888ac3da36b" } ``` ### DeployClusterPublicDto - **Type:**`object` * **`cluster_type` (required)** `string` — Cluster instance type. Can be listed using the \`GET /v1/cluster-types\` endpoint. * **`hostname` (required)** `string` * **`image` (required)** `string` — OS image type or UUID for the cluster. For a list of advertised images, check \`GET /v1/images/cluster\`. Hidden images can also be deployed directly. The image must be enabled or explicitly enabled for the project owner and compatible with the cluster type. * **`location_code` (required)** `string` — Location code for the cluster and its shared volume * **`shared_volume` (required)** `object` — Shared cluster volume (SFS) specification. Clusters have one shared volume mounted as /home. The OS volume is ephemeral and created automatically by the system. * **`auto_rental_extension`** `boolean` — Deprecated: use extension\_settings instead. Enable automatic rental extension for long-term contracts. * **`contract`** `string`, possible values: `"PAY_AS_YOU_GO", "LONG_TERM"` — Contract type. For clusters, only PAY\_AS\_YOU\_GO currently supported. * **`description`** `string` — Optional cluster description. Omit or pass null to use an empty string. * **`existing_volumes`** `array` — Existing shared volumes to attach to the cluster. Should be in the same location as the cluster. Must be previously created and attached to the cluster. **Items:** - **`id` (required)** `string` — Existing shared volume ID * **`extension_settings`** `string`, possible values: `"auto_renew", "pay_as_you_go", "end_contract"` — Extension settings for long-term contracts. Takes priority over auto\_rental\_extension and turn\_to\_pay\_as\_you\_go. * **`ssh_key_ids`** `object` — SSH key IDs to attach to the cluster. Required if image is an OS image type. * **`startup_script_id`** `string` — Startup script ID to run on cluster initialization * **`tags`** `array` — Key-value tags for the new cluster. Maximum 10. Omit \`value\` for a freeform tag. Keys are lowercased. **Items:** - **`key` (required)** `string` - **`value`** `string` — Omit for a freeform tag with no value * **`turn_to_pay_as_you_go`** `boolean` — Deprecated: use extension\_settings instead. Automatically convert to pay-as-you-go after the long-term period ends. **Example:** ```json { "cluster_type": "16H200", "image": "ubuntu-22.04-cuda-12.4-cluster", "ssh_key_ids": [ "c8fea806-02ef-4f7e-923e-bb676bd45b09" ], "startup_script_id": "202eade6-71bb-40cc-996a-64798ae81743", "hostname": "dark-vm-shrinks-fin-01", "description": "ubuntu-22-04-cuda-12-4-16b200-fin-01", "tags": [ { "key": "environment", "value": "production" }, { "key": "benchmark" } ], "location_code": "FIN-01", "contract": "PAY_AS_YOU_GO", "extension_settings": "auto_renew", "shared_volume": { "name": "cluster-volume-name", "size": 30000 }, "existing_volumes": [] } ``` ### DeployClusterResponsePublicApiDto - **Type:**`object` * **`id` (required)** `string` **Example:** ```json { "id": "1e68a9ad-83b0-45f2-bbb2-052799fae870" } ``` ### PerformClusterActionPublicDto - **Type:**`object` * **`action` (required)** `string`, possible values: `"discontinue"` * **`id` (required)** `string` — Cluster ID **Example:** ```json { "action": "discontinue", "id": "e3c41028-d120-420c-9e1a-e147906397f1" } ``` ### PerformClusterActionsBulkDto - **Type:**`object` * **`actions` (required)** `array` — Array of cluster actions, one per each cluster **Items:** - **`action` (required)** `string`, possible values: `"discontinue"` - **`id` (required)** `string` — Cluster ID **Example:** ```json { "actions": [ { "action": "discontinue", "id": "0b4f91cd-3dfe-41b3-8083-0a14b27b021d" }, { "action": "discontinue", "id": "f1bbbf3b-b57d-4ca6-bb1f-98c078b78356" } ] } ``` ### PerformClusterNodeActionPublicDto - **Type:**`object` * **`action` (required)** `string`, possible values: `"boot", "shutdown", "force_shutdown"` **Example:** ```json { "action": "shutdown" } ``` ### InstanceType - **Type:**`object` * **`best_for` (required)** `array` — Use cases for instance type **Items:** `string` * **`cpu` (required)** `object` — CPU details * **`currency` (required)** `string`, possible values: `"usd", "eur"` — Currency type * **`description` (required)** `string` — Instance type description * **`display_name` (required)** `string` — Display name * **`gpu` (required)** `object` — GPU details * **`gpu_memory` (required)** `object` — GPU memory details * **`id` (required)** `string` — Instance type ID * **`instance_type` (required)** `string` — Instance type * **`manufacturer` (required)** `string` — Manufacturer * **`max_dynamic_price` (required)** `string` — Ceiling value for dynamic price * **`memory` (required)** `object` — Memory details * **`model` (required)** `string` — GPU model * **`name` (required)** `string` — GPU model name * **`p2p` (required)** `string` — P2P details * **`price_per_hour` (required)** `string` — Price per hour * **`spot_price` (required)** `string` — Spot price per hour * **`storage` (required)** `object` — Storage details * **`supported_os` (required)** `array` — Supported OS image types **Items:** `string` * **`deploy_warning`** `string` — Deploy warning * **`dynamic_price`** `string` — Current dynamic price * **`serverless_price`** `string` — Current serverless price * **`serverless_spot_price`** `string` — Current serverless spot price **Example:** ```json { "best_for": [ "Giant ML models", "Multi-GPU training", "FP64 calculations", "NVLINK" ], "cpu": { "description": "22 CPU", "number_of_cores": 22, "model": "AMD Genoa" }, "deploy_warning": "Make sure your VM is running on latest Nvidia Driver 525.100+ or newer", "description": "Dedicated Hardware Instance", "gpu": { "description": "1x H100 SXM5 80GB", "number_of_gpus": 1 }, "gpu_memory": { "description": "80GB GPU RAM", "size_in_gigabytes": 80 }, "id": "c01dd00d-0000-4972-ae4e-d429115d055b", "instance_type": "1H100.80S.22V", "memory": { "description": "187GB RAM", "size_in_gigabytes": 187 }, "model": "H100", "name": "H100 SXM5 80GB", "p2p": "600 GB/s", "price_per_hour": "3.17", "spot_price": "0.31", "serverless_price": "1.75", "serverless_spot_price": "0.87", "storage": { "description": "dynamic" }, "currency": "usd", "manufacturer": "NVIDIA", "display_name": "NVIDIA H100 SXM5 80GB", "supported_os": [ "ubuntu-22.04-cuda-12.3", "ubuntu-24.04" ] } ``` ### InstanceAvailabilityResponseDto - **Type:**`object` * **`availabilities` (required)** `array` — Array of available instance types **Items:** `string` * **`location_code` (required)** `string` — Location code **Example:** ```json { "location_code": "FIN-01", "availabilities": [ "1H100.80S.22V", "2H100.80S.60V", "4H100.80S.176V", "8H100.80S.352V" ] } ``` ### ClusterAvailabilityResponseDto - **Type:**`object` * **`availabilities` (required)** `array` — Array of available cluster types **Items:** `string` * **`location_code` (required)** `string` — Location code **Example:** ```json { "location_code": "FIN-01", "availabilities": [ "16H200", "32H200" ] } ``` ### GetKeysResponseDto - **Type:**`object` * **`created_by_user_id` (required)** `string`, format: `uuid` — ID of the user who added this SSH key record to the project. \`null\` when the creator is unknown or no longer exists. * **`fingerprint` (required)** `string` — MD5 fingerprint of the public key as colon-separated hex (matches \`ssh-keygen -E md5\`). \`null\` if the stored key cannot be parsed. * **`id` (required)** `string` — SSH key id * **`key` (required)** `string` — Public SSH key * **`name` (required)** `string` — Name of the SSH key **Example:** ```json { "id": "f7b3b3b3-1b3b-4b3b-8b3b-3b3b3b3b3b3b", "name": "my-key", "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD...", "fingerprint": "9b:11:74:af:5c:04:48:31:40:ef:b5:ef:e3:dc:33:81", "created_by_user_id": "" } ``` ### AddKeyDto - **Type:**`object` * **`key` (required)** `string` — Public SSH key * **`name` (required)** `string` — Name of the SSH key **Example:** ```json { "name": "my-key", "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD..." } ``` ### DeleteKeysPublicDto - **Type:**`object` * **`keys` (required)** `array` **Items:** `string` **Example:** ```json { "keys": [ "64636a03-c285-41a8-b36b-836ecd2aa07d" ] } ``` ### GetScriptResponseDto - **Type:**`object` * **`created_at` (required)** `string` — Script creation date * **`id` (required)** `string` — Script ID * **`name` (required)** `string` — Script name * **`script` (required)** `string` — Script content **Example:** ```json { "id": "31a47f4e-ad0a-4d6e-8226-e4e8e6b96db0", "name": "My startup script", "script": "#!/bin/bash\n\necho hello world", "created_at": "2026-06-12T10:30:00.000Z" } ``` ### AddScriptDto - **Type:**`object` * **`name` (required)** `string` — Script name * **`script` (required)** `string` — Script content **Example:** ```json { "name": "My startup script", "script": "#!/bin/bash\n\necho hello world" } ``` ### DeleteScriptsDto - **Type:**`object` * **`scripts` (required)** `array` **Items:** `string` **Example:** ```json { "scripts": [ "dcb35caa-9727-44a4-8b0c-5f17e1862f7c" ] } ``` ### LongTermPeriodResponseDto - **Type:**`object` * **`code` (required)** `string` — Long term period code * **`discount_percentage` (required)** `number` — Discount percentage * **`is_enabled` (required)** `boolean` — Is long term period enabled * **`name` (required)** `string` — Long term period name * **`unit_name` (required)** `string`, possible values: `"hour", "day", "week", "month", "year"` — Time unit name * **`unit_value` (required)** `number` — Time unit value **Example:** ```json { "code": "3_MONTHS", "name": "3 months", "is_enabled": true, "unit_name": "month", "unit_value": 3, "discount_percentage": 14 } ``` ### ClusterType - **Type:**`object` * **`cluster_type` (required)** `string` — Instance type * **`cpu` (required)** `object` — CPU details * **`currency` (required)** `string`, possible values: `"usd", "eur"` — Currency type * **`gpu` (required)** `object` — GPU details * **`gpu_memory` (required)** `object` — GPU memory details * **`id` (required)** `string` — Instance type ID * **`manufacturer` (required)** `string` — Manufacturer * **`memory` (required)** `object` — Memory details * **`model` (required)** `string` — GPU model * **`name` (required)** `string` — GPU model name * **`node_details` (required)** `array` — Node details **Items:** `string` * **`price_per_hour` (required)** `string` — Price per hour * **`supported_os` (required)** `array` — Supported OS image types **Items:** `string` **Example:** ```json { "id": "c01dd00d-0000-4972-ae4e-d429115d055b", "model": "B200 Cluster", "name": "H100 SXM5 80GB", "cluster_type": "16H200", "cpu": { "description": "128 CPU", "number_of_cores": 128, "model": "AMD Turin" }, "gpu": { "description": "1x H100 SXM5 80GB", "number_of_gpus": 1 }, "gpu_memory": { "description": "80GB GPU RAM", "size_in_gigabytes": 80 }, "memory": { "description": "187GB RAM", "size_in_gigabytes": 187 }, "price_per_hour": "3.17", "currency": "usd", "manufacturer": "NVIDIA", "node_details": [ { "GPU VRAM": "1536 GB" }, { "AMD Turin CPU": "128 cores" }, { "InfiniBand": "3200 Gbit/s" }, { "Ethernet": "100 Gbit/s" }, { "Uplink": "5 Gbit/s" } ], "supported_os": [ "ubuntu-22.04-cuda-12.3", "ubuntu-24.04" ] } ``` ### ContainerType - **Type:**`object` * **`cpu` (required)** `object` — CPU details * **`currency` (required)** `string`, possible values: `"usd", "eur"` — Currency type * **`gpu` (required)** `object` — GPU details * **`gpu_memory` (required)** `object` — GPU memory details * **`id` (required)** `string` — Instance type ID * **`instance_type` (required)** `string` — Instance type * **`manufacturer` (required)** `string` — Manufacturer * **`memory` (required)** `object` — Memory details * **`model` (required)** `string` — GPU model * **`name` (required)** `string` — GPU model name * **`serverless_price` (required)** `string` — Current serverless price * **`serverless_spot_price` (required)** `string` — Current serverless spot price **Example:** ```json { "id": "60006000-6000-47af-8ff0-600060006004", "model": "RTX PRO 6000", "name": "RTX PRO 6000 96GB", "instance_type": "8RTXPRO6000.224V", "cpu": { "description": "224 CPU", "number_of_cores": 224, "model": "AMD Turin" }, "gpu": { "description": "8x RTX PRO 6000 96GB", "number_of_gpus": 8 }, "gpu_memory": { "description": "768GB GPU RAM", "size_in_gigabytes": 768 }, "memory": { "description": "680GB RAM", "size_in_gigabytes": 680 }, "serverless_price": "1.529", "serverless_spot_price": "0.7645", "currency": "usd", "manufacturer": "NVIDIA" } ``` ### ManagedEndpointPrice - **Type:**`object` * **`currency` (required)** `string`, possible values: `"usd", "eur"` — Currency type * **`external_id` (required)** `string` — External managed endpoint / inference model identifier * **`resource` (required)** `string` — Managed endpoint / inference model identifier * **`unit_name` (required)** `string`, possible values: `"generation", "image", "video", "input_token", "output_token", "token", "audio_second", "video_second", "inference_second", "hour", "second", "minute", "undefined", "gpu_hour", "gb_hour", "gb_month", "request"` — Unit the price is charged per * **`unit_price` (required)** `number` — Unit price in the requested currency **Example:** ```json { "resource": "NVIDIA-H100-80GB-HBM3", "external_id": "meta-llama-3-1-8b-instruct", "unit_price": 0.99, "unit_name": "hour", "currency": "usd" } ``` ### AccessKeyPublicResponseDto - **Type:**`object` * **`access_key` (required)** `string` — S3-compatible access key * **`created_at` (required)** `string`, format: `date-time` — When the access key was created * **`id` (required)** `string` — Unique identifier of the access key pair * **`name` (required)** `string` — Name of the access key pair **Example:** ```json { "id": "7dfc2631-0158-4f74-93f6-6b46dcb90fef", "name": "my-key", "access_key": "AKIAIOSFODNN7EXAMPLE", "created_at": "2024-01-15T14:10:27.114Z" } ``` ### CreateAccessKeyPublicDto - **Type:**`object` * **`name` (required)** `string` — Name of the access key pair **Example:** ```json { "name": "my-key" } ``` ### CreateAccessKeyPublicResponseDto - **Type:**`object` * **`access_key` (required)** `string` — S3-compatible access key * **`created_at` (required)** `string`, format: `date-time` — When the access key was created * **`id` (required)** `string` — Unique identifier of the access key pair * **`name` (required)** `string` — Name of the access key pair * **`secret_key` (required)** `string` — S3-compatible secret key **Example:** ```json { "id": "7dfc2631-0158-4f74-93f6-6b46dcb90fef", "name": "my-key", "access_key": "AKIAIOSFODNN7EXAMPLE", "secret_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", "created_at": "2024-01-15T14:10:27.114Z" } ``` ### GetBucketResponseDto - **Type:**`object` * **`created_at` (required)** `string`, format: `date-time` — When the bucket was created * **`id` (required)** `string` — Unique identifier of the bucket * **`name` (required)** `string` — Globally unique bucket name * **`object_count`** `number` — Number of objects stored in the bucket * **`size_gb`** `number` — Total size of all objects in GB **Example:** ```json { "id": "7dfc2631-0158-4f74-93f6-6b46dcb90fef", "name": "my-app-uploads", "object_count": 42, "size_gb": 1, "created_at": "2024-01-15T14:10:27.114Z" } ``` ### BucketNameRequestDto - **Type:**`object` * **`bucket_name` (required)** `string` — Globally unique bucket name (S3 naming rules apply) * **`location_code` (required)** `string` — Location code **Example:** ```json { "bucket_name": "my-app-uploads", "location_code": "FIN-03" } ``` ### BucketNameAvailabilityResponseDto - **Type:**`object` * **`is_available` (required)** `boolean` — Whether the bucket name is available for use **Example:** ```json { "is_available": true } ``` ### ContainerRegistryPricingResponseDto - **Type:**`object` * **`currency` (required)** `string`, possible values: `"usd", "eur"` — Currency * **`price_per_month_per_gb` (required)** `number` — Price per GB per month **Example:** ```json { "price_per_month_per_gb": 0.2, "currency": "usd" } ``` ### GroupInstanceResponseDto - **Type:**`object` * **`hostname` (required)** `string` * **`id` (required)** `string` * **`status` (required)** `string` **Example:** ```json { "id": "", "hostname": "", "status": "" } ``` ### InstanceGroupResponseDto - **Type:**`object` * **`created_at` (required)** `string`, format: `date-time` * **`deleted_at` (required)** `string`, format: `date-time` — Non-null only on a tombstoned group. Public and internal reads return live groups only. * **`description` (required)** `string` * **`id` (required)** `string` * **`instance_type` (required)** `string` * **`instances` (required)** `array` **Items:** - **`hostname` (required)** `string` - **`id` (required)** `string` - **`status` (required)** `string` * **`location_code` (required)** `string` * **`name` (required)** `string` * **`project_id` (required)** `string` * **`size` (required)** `number` — Number of live instances in the group. * **`template` (required)** `object` — The instance template stored by the group. * **`updated_at` (required)** `string`, format: `date-time` **Example:** ```json { "id": "", "project_id": "", "name": "", "description": "", "location_code": "", "instance_type": "", "template": {}, "created_at": "", "updated_at": "", "deleted_at": "", "instances": [ { "id": "", "hostname": "", "status": "" } ], "size": 1 } ``` ### InstanceGroupOsVolumeDto - **Type:**`object` * **`size` (required)** `number` — Default and minimum OS volume size in GB for instances created in this group. **Example:** ```json { "size": 200 } ``` ### InstanceGroupTemplateDto - **Type:**`object` * **`image` (required)** `string` * **`os_volume`** `object` - **`size` (required)** `number` — Default and minimum OS volume size in GB for instances created in this group. * **`ssh_key_ids`** `array` — Default SSH keys for instances created from this group. **Items:** `string` * **`startup_script_id`** `string` — Default startup script for instances created from this group. **Example:** ```json { "image": "ubuntu-24.04-cuda-12.8-docker", "os_volume": { "size": 200 }, "ssh_key_ids": [ "" ], "startup_script_id": "" } ``` ### CreateInstanceGroupDto - **Type:**`object` * **`instance_type` (required)** `string` — A known instance type code. Fixed for the life of the group. * **`location_code` (required)** `string` * **`name` (required)** `string` * **`template` (required)** `object` - **`image` (required)** `string` - **`os_volume`** `object` - **`size` (required)** `number` — Default and minimum OS volume size in GB for instances created in this group. - **`ssh_key_ids`** `array` — Default SSH keys for instances created from this group. **Items:** `string` - **`startup_script_id`** `string` — Default startup script for instances created from this group. * **`description`** `string` **Example:** ```json { "name": "hive-b300-pool-1", "description": "", "location_code": "FIN-02", "instance_type": "8B300.640S.176V", "template": { "image": "ubuntu-24.04-cuda-12.8-docker", "os_volume": { "size": 200 }, "ssh_key_ids": [ "" ], "startup_script_id": "" } } ``` ### MutableInstanceGroupTemplateDto - **Type:**`object` * **`ssh_key_ids`** `array` **Items:** `string` * **`startup_script_id`** `string` **Example:** ```json { "ssh_key_ids": [ "" ], "startup_script_id": "" } ``` ### UpdateInstanceGroupDto - **Type:**`object` * **`description`** `string` * **`name`** `string` * **`template`** `object` — Mutable template defaults. **Example:** ```json { "name": "", "description": "", "template": { "ssh_key_ids": [ "" ], "startup_script_id": "" } } ```