Base URL for all endpoints is: https://<project-id>.api.solti.run/1
where <project-id> is the project ID of your Solti project.
To authenticate, you must provide a valid API key in the X-Solti-Api-Key header. For example:
curl -H "X-Solti-Api-Key: <your-api-key>" https://<project-id>.api.solti.run/1/jobs
The API key can be obtained from either by creating an API key by this API or by Solti's web console.
Endpoints for account, organization, and project management.
These are global (non-project-scoped) endpoints and accept OAuth user authentication only (Solti CLI / SDKs). API Key authentication is rejected because API keys are project-scoped machine-user credentials.
Organization roles: owner, admin, member (see the Zitadel spec §4).
Lists the organizations the authenticated account belongs to.
| offset | integer (Offset) >= 0 Default: 0 |
| limit | integer (Limit) [ 1 .. 100 ] Default: 100 |
{- "organizations": [
- {
- "id": "string",
- "displayName": "string",
- "category": "string",
- "role": "string"
}
]
}Creates an organization; the caller becomes its owner.
| name required | string (Name) [ 1 .. 64 ] characters |
| category | string (Category) <= 32 characters Default: "personal" |
{- "name": "string",
- "category": "personal"
}{- "id": "string",
- "displayName": "string",
- "category": "string",
- "role": "string"
}Updates the organization's display name and/or category. Requires admin or higher.
| org_id required | string (Org Id) |
| displayName required | string (Displayname) [ 1 .. 64 ] characters |
Category (string) or Category (null) (Category) |
{- "displayName": "string",
- "category": "string"
}{- "id": "string",
- "displayName": "string",
- "category": "string",
- "role": "string"
}| org_id required | string (Org Id) |
| offset | integer (Offset) >= 0 Default: 0 |
| limit | integer (Limit) [ 1 .. 100 ] Default: 100 |
{- "members": [
- {
- "userId": "string",
- "email": "string",
- "role": "string"
}
]
}Requires admin or higher. Only owners can grant the owner role.
| org_id required | string (Org Id) |
| member_user_id required | string (Member User Id) |
| role required | string (Role) One of: owner, admin, member. |
{- "role": "string"
}null| org_id required | string (Org Id) |
| offset | integer (Offset) >= 0 Default: 0 |
| limit | integer (Limit) [ 1 .. 100 ] Default: 100 |
{- "projects": [
- {
- "id": "string",
- "displayName": "string",
- "organizationId": "string"
}
]
}Requires admin or higher.
| org_id required | string (Org Id) |
| name required | string (Name) [ 1 .. 64 ] characters |
{- "name": "string"
}{- "id": "string",
- "displayName": "string",
- "organizationId": "string"
}Requires admin or higher.
| project_id required | string (Project Id) |
| displayName required | string (Displayname) [ 1 .. 64 ] characters |
{- "displayName": "string"
}{- "id": "string",
- "displayName": "string",
- "organizationId": "string"
}Endpoints for managing API keys.
API keys are used to authenticate requests to the Solti API. They can be created, listed, updated, and deleted by users with the appropriate permissions.
API keys can have one of the following roles:
Creates a new API key for programmatic access to the Solti API.
Required role: "admin".
| name required | string (Name) [ 3 .. 50 ] characters ^[a-zA-Z0-9][a-zA-Z0-9_-]*$ Human-readable name of the API key. The name must be between 3 and 50 characters long, start with an alphanumeric character, and can contain alphanumeric characters, underscores, or hyphens. |
| role required | string (Role) Enum: "admin" "developer" "viewer" Role to assign to the API key |
Expires At (string) or Expires At (null) (Expires At) Optional expiration timestamp |
{- "name": "string",
- "role": "admin",
- "expires_at": "2019-08-24T14:15:22Z"
}{- "id": "string",
- "name": "string",
- "value": "string",
- "role": "admin",
- "created_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z"
}List API keys given the provided filters.
Required roles: "viewer" or higher.
Name (string) or Name (null) (Name) Filter by human-readable name | |
Offset (integer) or Offset (null) (Offset) Default: 0 Number of items to skip | |
Limit (integer) or Limit (null) (Limit) Default: 50 Maximum number of items to return | |
"created_at" (string) or Sort By (null) (Sort By) Field to sort by | |
Sort Order (string) or Sort Order (null) (Sort Order) Sort order |
{- "keys": [
- {
- "id": "string",
- "name": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "total": 0,
- "offset": 0,
- "limit": 0
}Retrieve an API key by its unique identifier.
Required roles: "viewer" or higher.
| key_id required | string (Key Id) |
{- "id": "string",
- "name": "string",
- "role": "admin",
- "created_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z"
}Update an existing API key's attributes.
Required role: "admin".
| key_id required | string (Key Id) |
Role (string) or Role (null) (Role) New role for the API key |
{- "role": "admin"
}Endpoints for managing Solti connections.
Connections are used to store configuration for external systems. They can be created, listed, updated, and deleted by users with the appropriate permissions.
Creates a new Solti connection. Duplicate names within a project return 409 Conflict.
Required role: "admin".
| name required | string (Name) [ 3 .. 50 ] characters ^[a-zA-Z0-9][a-zA-Z0-9_-]*$ Human-readable name of the connection. The name must be between 3 and 50 characters long, start with an alphanumeric character, and can contain alphanumeric characters, underscores, or hyphens. |
| type required | string (Type) Type of connection (aws) Value: "aws" |
| access_key_id required | string (Access Key Id) AWS access key ID |
| secret_access_key required | string (Secret Access Key) AWS secret access key |
{- "name": "string",
- "type": "aws",
- "access_key_id": "string",
- "secret_access_key": "string"
}{- "name": "string",
- "type": "aws",
- "access_key_id": "string",
- "secret_access_key": "string"
}List Solti connections given the provided filters. Credentials are always redacted.
Required roles: "viewer" or higher.
Name (string) or Name (null) (Name) Filter by human-readable name | |
Offset (integer) or Offset (null) (Offset) Default: 0 Number of items to skip | |
Limit (integer) or Limit (null) (Limit) Default: 50 Maximum number of items to return | |
"name" (string) or Sort By (null) (Sort By) Field to sort by | |
Sort Order (string) or Sort Order (null) (Sort Order) Sort order |
{- "connections": [
- {
- "name": "string",
- "type": "aws",
- "access_key_id": "string",
- "secret_access_key": "string"
}
], - "total": 0,
- "offset": 0,
- "limit": 0
}Retrieve a Solti connection by its name. Inspecting decrypted credential values requires the "admin" role.
Required roles: "viewer" or higher.
| name required | string (Name) |
{- "name": "string",
- "type": "aws",
- "access_key_id": "string",
- "secret_access_key": "string"
}Update an existing Solti connection's attributes (re-encrypts credentials when they change).
Required role: "admin".
| name required | string (Name) |
| type | string (Type) Default: "aws" Type of connection (aws) Value: "aws" |
Access Key Id (string) or Access Key Id (null) (Access Key Id) AWS access key ID | |
Secret Access Key (string) or Secret Access Key (null) (Secret Access Key) AWS secret access key |
{- "type": "aws",
- "access_key_id": "string",
- "secret_access_key": "string"
}{- "name": "string",
- "type": "aws",
- "access_key_id": "string",
- "secret_access_key": "string"
}Endpoints for submitting and managing workloads.
A workload is a declarative container task that Solti routes to the most cost-effective cloud VM via Scarcity. Jobs can be submitted as JSON or YAML.
Submits a declarative workload definition (JSON or YAML body).
name is provided it must be unique within the project (otherwise 409 Conflict).namePrefix is provided, a unique name is generated as <prefix>-<random suffix>.Required roles: "developer" or higher.
{- "job_id": "string",
- "name": "string",
- "status": "queued"
}List jobs in the project, sorted by creation date (newest first).
Supports filtering by status, tag (repeatable), and label as "key=value" (repeatable).
Required roles: "viewer" or higher.
Status (string) or Status (null) (Status) Filter by status | |
Array of Tag (strings) or Tag (null) (Tag) Filter by tags (repeatable) | |
Array of Label (strings) or Label (null) (Label) Filter by labels as "key:value" pairs (repeatable; "key=value" accepted for compatibility) | |
Offset (integer) or Offset (null) (Offset) Default: 0 Number of items to skip | |
Limit (integer) or Limit (null) (Limit) Default: 50 Maximum number of items to return |
{- "jobs": [
- {
- "id": "string",
- "organization_id": "string",
- "project_id": "string",
- "name": "string",
- "namePrefix": "string",
- "status": "queued",
- "credentials_status": "empty",
- "vm_status": "nonassigned",
- "image": "string",
- "command": [
- "string"
], - "args": [
- "string"
], - "env": {
- "property1": "string",
- "property2": "string"
}, - "volumes": [
- { }
], - "resources": { },
- "cloud": [
- "string"
], - "region": [
- "string"
], - "labels": {
- "property1": "string",
- "property2": "string"
}, - "tags": [
- "string"
], - "retry_count": 0,
- "max_retries": 0,
- "selected_provider": "string",
- "selected_region": "string",
- "selected_instance_type": "string",
- "vm_instance_id": "string",
- "ip_address": "string",
- "estimated_cost": 0,
- "actual_cost": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "last_heartbeat_at": "2019-08-24T14:15:22Z",
- "started_at": "2019-08-24T14:15:22Z",
- "ended_at": "2019-08-24T14:15:22Z",
- "timeout_seconds": 3600,
- "error_message": "string"
}
], - "total": 0,
- "offset": 0,
- "limit": 0
}Retrieve a job's state, execution metadata, timing, VM status, cost metrics, retry status, and any logged error summaries. The path parameter accepts either the job's unique UUID or its unique name.
Required roles: "viewer" or higher.
| job_id_or_name required | string (Job Id Or Name) |
{- "id": "string",
- "organization_id": "string",
- "project_id": "string",
- "name": "string",
- "namePrefix": "string",
- "status": "queued",
- "credentials_status": "empty",
- "vm_status": "nonassigned",
- "image": "string",
- "command": [
- "string"
], - "args": [
- "string"
], - "env": {
- "property1": "string",
- "property2": "string"
}, - "volumes": [
- { }
], - "resources": { },
- "cloud": [
- "string"
], - "region": [
- "string"
], - "labels": {
- "property1": "string",
- "property2": "string"
}, - "tags": [
- "string"
], - "retry_count": 0,
- "max_retries": 0,
- "selected_provider": "string",
- "selected_region": "string",
- "selected_instance_type": "string",
- "vm_instance_id": "string",
- "ip_address": "string",
- "estimated_cost": 0,
- "actual_cost": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "last_heartbeat_at": "2019-08-24T14:15:22Z",
- "started_at": "2019-08-24T14:15:22Z",
- "ended_at": "2019-08-24T14:15:22Z",
- "timeout_seconds": 3600,
- "error_message": "string"
}Cancels a queued, booting, or running job. The scheduler detects the transition and triggers immediate VM teardown. The path parameter accepts either the job's unique UUID or its unique name.
Required roles: "developer" or higher.
| job_id_or_name required | string (Job Id Or Name) |
{- "id": "string",
- "organization_id": "string",
- "project_id": "string",
- "name": "string",
- "namePrefix": "string",
- "status": "queued",
- "credentials_status": "empty",
- "vm_status": "nonassigned",
- "image": "string",
- "command": [
- "string"
], - "args": [
- "string"
], - "env": {
- "property1": "string",
- "property2": "string"
}, - "volumes": [
- { }
], - "resources": { },
- "cloud": [
- "string"
], - "region": [
- "string"
], - "labels": {
- "property1": "string",
- "property2": "string"
}, - "tags": [
- "string"
], - "retry_count": 0,
- "max_retries": 0,
- "selected_provider": "string",
- "selected_region": "string",
- "selected_instance_type": "string",
- "vm_instance_id": "string",
- "ip_address": "string",
- "estimated_cost": 0,
- "actual_cost": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "last_heartbeat_at": "2019-08-24T14:15:22Z",
- "started_at": "2019-08-24T14:15:22Z",
- "ended_at": "2019-08-24T14:15:22Z",
- "timeout_seconds": 3600,
- "error_message": "string"
}Endpoints for managing periodic task templates.
All cron expressions are evaluated strictly in UTC. When a cronjob triggers,
the scheduler spawns a new standard job from its job_definition template.
Creates a periodic task definition using a UTC crontab expression and a
job_definition configuration template.
Required role: "admin".
| name required | string (Name) [ 3 .. 100 ] characters ^[a-z0-9][a-z0-9-]*$ Unique name inside the project namespace (slug format) |
| cron_spec required | string (Cron Spec) Standard cron expression evaluated in UTC (e.g. '0 2 * * *') |
required | object (JobDefinition) Job configuration to spawn the job from |
| is_active | boolean (Is Active) Default: true Whether the scheduler should trigger this cronjob |
Project Id (string) or Project Id (null) (Project Id) Project ID (internal use) | |
Organization Id (string) or Organization Id (null) (Organization Id) Organization ID (internal use) |
{- "name": "string",
- "cron_spec": "string",
- "job_definition": {
- "image": "string",
- "command": [
- "string"
], - "args": [
- "string"
], - "env": {
- "property1": "string",
- "property2": "string"
}, - "volumes": {
- "property1": {
- "bucket": "string",
- "mountPath": "string",
- "connection": "string",
- "prefix": "string"
}, - "property2": {
- "bucket": "string",
- "mountPath": "string",
- "connection": "string",
- "prefix": "string"
}
}, - "resources": { },
- "cloud": "string",
- "region": "string",
- "maxRetries": 0,
- "timeoutSeconds": 1,
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "tags": [
- "string"
]
}, - "is_active": true,
- "project_id": "string",
- "organization_id": "string"
}{- "id": "string",
- "organization_id": "string",
- "project_id": "string",
- "name": "string",
- "cron_spec": "string",
- "job_definition": { },
- "is_active": true,
- "last_triggered_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Lists active and inactive cronjobs for the project, sorted by creation date.
Required roles: "viewer" or higher.
| offset | integer (Offset) >= 0 Default: 0 Number of items to skip |
| limit | integer (Limit) ( 0 .. 200 ] Default: 50 Maximum number of items to return |
{- "cronjobs": [
- {
- "id": "string",
- "organization_id": "string",
- "project_id": "string",
- "name": "string",
- "cron_spec": "string",
- "job_definition": { },
- "is_active": true,
- "last_triggered_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "total": 0,
- "offset": 0,
- "limit": 0
}The path parameter accepts either the cronjob's unique UUID or its unique name.
| cronjob_id_or_name required | string (Cronjob Id Or Name) |
{- "id": "string",
- "organization_id": "string",
- "project_id": "string",
- "name": "string",
- "cron_spec": "string",
- "job_definition": { },
- "is_active": true,
- "last_triggered_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Updates cronjob parameters (e.g. toggling is_active, changing cron_spec,
or replacing job_definition) without recreating the resource. The path
parameter accepts either the cronjob's unique UUID or its unique name.
Required role: "admin".
| cronjob_id_or_name required | string (Cronjob Id Or Name) |
Cron Spec (string) or Cron Spec (null) (Cron Spec) New cron expression (UTC) | |
JobDefinition (object) or null New job configuration template | |
Is Active (boolean) or Is Active (null) (Is Active) Toggle scheduler activity | |
Project Id (string) or Project Id (null) (Project Id) Project ID (internal use) | |
Organization Id (string) or Organization Id (null) (Organization Id) Organization ID (internal use) |
{- "cron_spec": "string",
- "job_definition": {
- "image": "string",
- "command": [
- "string"
], - "args": [
- "string"
], - "env": {
- "property1": "string",
- "property2": "string"
}, - "volumes": {
- "property1": {
- "bucket": "string",
- "mountPath": "string",
- "connection": "string",
- "prefix": "string"
}, - "property2": {
- "bucket": "string",
- "mountPath": "string",
- "connection": "string",
- "prefix": "string"
}
}, - "resources": { },
- "cloud": "string",
- "region": "string",
- "maxRetries": 0,
- "timeoutSeconds": 1,
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "tags": [
- "string"
]
}, - "is_active": true,
- "project_id": "string",
- "organization_id": "string"
}{- "id": "string",
- "organization_id": "string",
- "project_id": "string",
- "name": "string",
- "cron_spec": "string",
- "job_definition": { },
- "is_active": true,
- "last_triggered_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Connection Id (string) or Connection Id (null) (Connection Id) Filter by a specific connection ID. |
{- "storages": [
- {
- "id": "string",
- "name": "string",
- "connection_id": "string",
- "connection_type": "aws",
- "platform": "aws",
- "metadata": { },
- "type": "storage"
}
]
}Connection Id (string) or Connection Id (null) (Connection Id) Filter by a specific connection ID. |
{- "repositories": [
- {
- "id": "string",
- "name": "string",
- "connection_id": "string",
- "connection_type": "aws",
- "platform": "aws",
- "metadata": { },
- "type": "storage"
}
]
}Connection Id (string) or Connection Id (null) (Connection Id) Filter by a specific connection ID. |
{- "virtual_machine_pools": [
- {
- "id": "string",
- "name": "string",
- "connection_id": "string",
- "connection_type": "aws",
- "platform": "aws",
- "metadata": { },
- "type": "storage"
}
]
}