API reference
ATAILA Cloud Platform API
The versioned API of the ATAILA Cloud Platform. Authenticate with Authorization: Bearer <token> using a personal (ataila_pat_…) or service-account (ataila_sat_…) API token. Errors are RFC 9457 problem details (application/problem+json) with a stable code (Errors, below). Timestamps are RFC 3339 in UTC. Every POST that creates or starts something (all of them except POST /mcp, which only reads) and the node-cache PUT and DELETE accept an Idempotency-Key header, declared on each: for 24 hours the same key with the same request replays the stored response (Idempotent-Replayed: true), with a different request it is a 409 idempotency_key_reused, and while the first request is still running it is a 429 idempotency_request_in_progress with Retry-After. PATCH bodies are JSON Merge Patch (RFC 7396). Limit: 600 requests per minute per token (429 rate_limited with Retry-After). Every response carries X-Request-ID.
Treat every API token as an operator credential. A token is a remote handle on this portal, and the portal holds the credentials the platform itself runs on: whoever holds a token can do, through this API, everything its scopes allow on this installation. Give each token one purpose, only the scopes that purpose needs and the shortest lifetime that works; keep it in a secret store or a protected CI variable, never in a repository or a configuration file; create it with allow_destroy only when it is meant to remove things; and revoke it when its job is done.
Errors. Every error is a problem document with these members: type, urn:ataila:api:problem:<code>, an identifier rather than a link; title, the HTTP status phrase; status, the HTTP status again; detail, what went wrong this time, for a person, worded freely; code, the stable reason to branch on; instance, the request path; and request_id, the same as the X-Request-ID header. Some codes add members, named below; ignore any member you do not know. Each operation names its own codes in its responses. These come from the layers every request passes through, so any operation can answer them:
- 401
not_authenticated: noAuthorizationheader, or notBearer <token>. 401token_invalid: the token is malformed or unknown, or a session token does not verify (an expired one included). 401token_expiredandtoken_revoked: the API token has expired or was revoked. 401principal_disabled: the account behind the token or session is deactivated. 401token_ip_not_allowed: the token's address allowlist does not include the caller. A 401 carriesWWW-Authenticate: Bearer; retrying with the same credential does not help. - 403
forbidden: the operation needs a permission the caller lacks;requiredlists the permission keys, any one of which would do. A token holds only those of its scopes its owner still holds. 403destroy_not_allowed: a destroy (archive, delete, deactivate, retire) with a token created withoutallow_destroy. - 403
licence_locked: the licence has expired or was revoked, so every change is refused except installing a licence (PUT /licence/bundle). 403licence_restricted: this platform is not licensed yet, so nothing that grows it (customers, tenants, projects, releases, AI) can be added or changed. 403licence_required: the licence lacks a module the operation needs, named inentitlement. 403licence_refused: any other licence refusal. Each carriesstate(the licence state),state_reason,remedy(what an operator must do) andremedy_url. A read is never refused for a licence reason. Never retry alicence_*code: only a licence change alters the answer. - 400
invalid_idempotency_key: theIdempotency-Keyis not 1-255 printable characters. 409idempotency_key_reused: the key was used for a different request (method, path, query or body) in the last 24 hours. 429idempotency_request_in_progress: the first request with the key is still running. - 400
invalid_cursor: thecursoris not one this list issued. - 422
validation_failed: the request does not match the schema;errorslists each failure (loc,msg,type) andfieldnames the first offending member. 422immutable_field: a change to a field that is frozen once created;fieldnames it. - 429
rate_limited: more than 600 requests in a minute with this token. - 503
unavailable: the platform cannot answer right now. 503api_tokens_unconfigured: API tokens are not configured on this platform; an operator must act, and retrying does not help. - 404
not_found: every path, this document and the interactive reference included, while the public API is switched off on this platform; and any path that does not exist. 405method_not_allowed: the path exists, the method does not. 500internal_error: an unexpected failure, with no detail;request_idfinds it in the server log.
A 429 and a 503 carry Retry-After (seconds) when a retry can succeed: wait that long, then send the same request again. When no specific code applies, code is the one for the status: bad_request (400), not_authenticated (401), forbidden (403), not_found (404), method_not_allowed (405), conflict (409), gone (410), precondition_failed (412), unsupported_media_type (415), validation_failed (422), rate_limited (429), internal_error (500), bad_gateway (502), unavailable (503) and gateway_timeout (504).
Response headers
The headers the responses declare. Each operation's responses name the ones they carry.
ETagThe brand's
versionas an entity tag ("7"). Send it back asIf-Matchto makePUT /brandconditional.Idempotent-Replayedtruewhen this is the stored answer to an earlier request with the sameIdempotency-Keyand the same request: nothing was done again. Absent on a first answer. Any answer below 500 is stored for 24 hours, so a replayed problem carries it too.LocationThe operation to poll:
/api/v1/operations/{id}, with theidof the operation in the body.Retry-AfterSeconds to wait before retrying. Sent with
rate_limited,idempotency_request_in_progress,unavailableand the other answers a retry can cure; absent when retrying will not help.WWW-AuthenticateBearer: the authentication scheme this API takes.X-Request-IDThe request's id: the caller's own
X-Request-IDwhen it is 1-64 letters, digits,.,_,:or-, a new one otherwise. A problem repeats it asrequest_id, and the audit log records it.
Base URL: https://<your portal>/api/v1. Paths below are relative to it. An ATAILA API token (personal ataila_pat_… or service account ataila_sat_…). A portal session JWT is accepted as well. How to get a token, and the conventions every operation follows, are on the overview.
84 operations in 14 groups. sha256 of the file: d84cf33308fa4662514c572b6afa3eb661dc86f8d6b02546b558e24518710d62
Meta
What this API and platform are, and who is calling.
Operations
Long-running work: poll until succeeded or failed.
Customers
Customers (companies) on this platform.
Tenants
Tenants of a customer and their memberships.
- get /tenants List tenants
- post /tenants Register a tenant
- get /tenants/{tenant_id} One tenant
- patch /tenants/{tenant_id} Change a tenant
- delete /tenants/{tenant_id} Delete an empty tenant
- get /tenants/{tenant_id}/memberships A tenant's memberships
- get /tenants/{tenant_id}/memberships/{user_id} One membership
- put /tenants/{tenant_id}/memberships/{user_id} Add a member or change their role
- delete /tenants/{tenant_id}/memberships/{user_id} Remove a member
Users
Users, role grants and the permission catalog.
- get /permissions The permission catalogue
- get /users List users
- post /users Create a person
- get /users/{user_id} One user
- patch /users/{user_id} Change a user
- delete /users/{user_id} Deactivate a user
- get /users/{user_id}/roles A user's role grants
- get /users/{user_id}/roles/{role} One role grant
- put /users/{user_id}/roles/{role} Grant a role
- delete /users/{user_id}/roles/{role} Revoke a role
Projects
Projects, provisioning and project members.
- get /projects List projects
- post /projects Register a project
- get /projects/{project_id} One project
- patch /projects/{project_id} Change a project
- delete /projects/{project_id} Retire a project
- get /projects/{project_id}/members A project's members
- get /projects/{project_id}/members/{user_id} One project member
- put /projects/{project_id}/members/{user_id} Add a member or change their role
- delete /projects/{project_id}/members/{user_id} Remove a member
- get /projects/{project_id}/provisioning A project's provisioning state
- post /projects/{project_id}/provisioning Start provisioning
- get /projects/{project_id}/stages A project's provisioning stages
Releases
Release promotions, release state and the PROD lock.
- get /projects/{project_id}/prod-lock The PROD data lock
- put /projects/{project_id}/prod-lock Set the PROD data lock
- get /projects/{project_id}/release-operations Release history of a project
- post /projects/{project_id}/release-promotions Request a promotion
- get /projects/{project_id}/release-state Release state of a project
- get /release-operations/{release_operation_id} One release operation
AI gateway
AI gateway virtual keys and serving tiers.
- get /ai/gateway The AI gateway
- get /ai/gateway/keys List virtual keys
- post /ai/gateway/keys Create a virtual key
- get /ai/gateway/keys/{key_id} One virtual key
- patch /ai/gateway/keys/{key_id} Change a virtual key
- delete /ai/gateway/keys/{key_id} Delete a virtual key
- post /ai/gateway/keys/{key_id}/rotations Rotate a virtual key
- get /ai/gateway/tiers List serving tiers
- get /ai/gateway/tiers/{key} One serving tier
- put /ai/gateway/tiers/{key} Pin or enable a serving tier
AI models
The AI model catalogue and node caches.
- get /ai-models List AI models
- post /ai-models Add an AI model to the catalogue
- get /ai-models/load-targets List load targets
- get /ai-models/runs/{run_id} One store run
- get /ai-models/storage Model storage
- get /ai-models/{model_id} One AI model
- patch /ai-models/{model_id} Change an AI model's metadata
- delete /ai-models/{model_id} Remove an AI model from the catalogue
- get /ai-models/{model_id}/node-caches List a model's node caches
- get /ai-models/{model_id}/node-caches/{node} One node cache
- put /ai-models/{model_id}/node-caches/{node} Cache a model on a node
- delete /ai-models/{model_id}/node-caches/{node} Remove a model's cache from a node
AI nodes
AI Center nodes, DGX clusters and the launch catalogue (read-only).
Licence
This platform's licence.
Brand
This platform's branding.
Audit
The platform audit log: every recorded change, read-only.
MCP
Model Context Protocol: every GET operation as a read-only tool.