API-ul pentru medii
Endpoint-urile /v1/projects și /v1/environments de pe ai.codai.ro, cu exemple de cereri și răspunsuri.
URL de bază https://ai.codai.ro, Authorization: Bearer codai_…, JSON la intrare și la ieșire. Starea live a daemonului (online, porturi care ascultă, stare git, lock-uri, clienți atașați) este servită de relay la https://relay.codai.ro/v1/environments/{id}/status, cu aceeași cheie.
Convenții, toate preluate din gateway:
- Rândurile de proiect și de mediu sunt returnate în camelCase, așa cum sunt stocate; corpurile cererilor și listele de membri/secrete sunt în snake_case.
- Un proiect sau un mediu pe care nu îl poți vedea răspunde
404(niciodată403), ca id-urile să nu poată fi enumerate. O încălcare de rol pe ceva ce poți vedea răspunde403. - Erorile folosesc anvelopa gateway-ului
{ "error": { "message", "type", "code" } }; erorile de validare sunt400 bad_request. - Fiecare modificare adaugă un rând în
environment_events.
Endpoint-uri
| Metodă | Cale | Rol minim | Observații |
|---|---|---|---|
GET | /v1/projects | — | Ale tale plus ale organizațiilor tale, cele mai noi primele |
POST | /v1/projects | — | org_id cere owner/admin de organizație |
GET | /v1/projects/{id} | vizibil | Proiectul + toate mediile lui |
PATCH | /v1/projects/{id} | proprietar de proiect / admin de organizație | Slug-ul nu se poate schimba |
DELETE | /v1/projects/{id} | proprietar de proiect / admin de organizație | 409 project_has_environments până când toate sunt distruse |
GET | /v1/environments | — | ?project_id=, ?for_user_id=me |
POST | /v1/environments | proiect vizibil | Furnizorii administrați sunt activați per cont (403) |
GET | /v1/environments/{id} | viewer | Mediu + rol + izolare + membri + porturi + ultimele 20 de evenimente |
PATCH | /v1/environments/{id} | maintainer | name, idle_timeout_minutes |
POST | /v1/environments/{id}/start · stop · archive | maintainer | 409 invalid_transition |
POST | /v1/environments/{id}/destroy | owner | |
POST | /v1/environments/{id}/enroll-token | maintainer | Doar BYO (409 not_byo) |
POST | /v1/environments/enroll | token | Apelat de codaid, fără cheie API |
GET | /v1/environments/{id}/members | viewer | |
POST | /v1/environments/{id}/members | maintainer | owner cere owner |
PUT | /v1/environments/{id}/members/me/ssh-key | developer | Propria ta cheie |
POST | /v1/environments/{id}/members/me/ssh-cert | developer | { public_key } → certificat de utilizator OpenSSH valabil 12 ore pentru utilizatorul tău Linux (certificate, principal, valid_before, host); 503 ssh_ca_unconfigured fără CA |
GET | /v1/environments/{id}/ssh-ca | viewer | { public_keys } ale autorității SSH în care au încredere mașinile virtuale; 404 când nu e configurată nicio CA |
PATCH · DELETE | /v1/environments/{id}/members/{userId} | maintainer | Ca să pleci singur nu ai nevoie de rol |
GET | /v1/environments/{id}/ports | viewer | Porturi publicate |
PUT · DELETE | /v1/environments/{id}/ports/{port} | developer | public cere maintainer |
GET | /v1/environments/{id}/secrets | developer | Doar nume |
PUT · DELETE | /v1/environments/{id}/secrets/{name} | maintainer | Nume în stil ENV_STYLE |
GET | /v1/environments/{id}/tasks | viewer | Ultimele 50 de sarcini ale agentului |
POST | /v1/environments/{id}/tasks | developer | 202; mediul trebuie să fie running (409 environment_not_running) |
GET | /v1/environments/{id}/tasks/{taskId} | viewer | |
POST | /v1/environments/{id}/exec | developer | O operație pe relay, blocantă; 409 environment_offline, 504 host_timeout |
GET | /v1/environments/{id}/files | developer | ?path= (implicit spațiul tău de lucru) |
GET · PUT | /v1/environments/{id}/files/{path} | developer | Text UTF-8; citire ≤ 512 KB, scriere ≤ 2 MB (413) |
POST | /v1/environments/{id}/jobs | developer | Job în fundal, întoarce imediat job_id |
GET | /v1/environments/{id}/jobs/{jobId} | developer | Stare + output (?since=, ?tail=) |
Creează un proiect
curl https://ai.codai.ro/v1/projects \
-H "Authorization: Bearer $CODAI_API_KEY" -H "Content-Type: application/json" \
-d '{ "name": "brivio", "repo_url": "https://github.com/acme/brivio", "isolation": "shared_vm" }'201:
{
"project": {
"id": "2b6d1c0e-4f3a-4b9c-8d7e-1a2b3c4d5e6f",
"ownerUserId": "5f0c…", "orgId": null,
"name": "brivio", "slug": "brivio",
"repoUrl": "https://github.com/acme/brivio", "defaultBranch": "main", "devcontainerPath": null,
"isolation": "shared_vm", "settings": {},
"createdAt": "2026-09-25T09:00:00.000Z", "updatedAt": "2026-09-25T09:00:00.000Z"
}
}slug are implicit valoarea numelui transformat în slug și trebuie să fie unic între proiectele tale (409 slug_taken). isolation este shared_vm (implicit), container sau vm_per_dev.
Creează un mediu
| Câmp | Tip | Observații |
|---|---|---|
project_id | uuid | Obligatoriu. |
provider | byo · openstack · hetzner | Obligatoriu. local este rezervat. |
name | șir ≤ 120 | Obligatoriu, cu excepția proiectelor vm_per_dev (implicit <proiect> — <tu>). |
slug | ^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$ | Implicit <slug-proiect>-<4 caractere aleatorii>; unic la nivel global (409 slug_taken). |
size | small · medium · large | Doar administrate; implicit small. |
region | șir | Doar administrate; implicit eu-east-1 (OpenStack) sau nbg1 (Hetzner). |
idle_timeout_minutes | 5–1440 | Implicit 30. |
budget_micro_eur | întreg ≥ 0 sau null | Doar administrate; plafon lunar de calcul. |
curl https://ai.codai.ro/v1/environments \
-H "Authorization: Bearer $CODAI_API_KEY" -H "Content-Type: application/json" \
-d '{ "project_id": "2b6d1c0e-4f3a-4b9c-8d7e-1a2b3c4d5e6f", "name": "dev-box", "provider": "byo" }'201:
{
"environment": {
"id": "9c1e5a7b-2d4f-4e6a-8b0c-3d5e7f9a1b2c",
"projectId": "2b6d1c0e-4f3a-4b9c-8d7e-1a2b3c4d5e6f",
"ownerUserId": "5f0c…", "orgId": null, "forUserId": null, "for_user_id": null,
"isolation": "shared_vm",
"name": "dev-box", "slug": "brivio-k3xq",
"provider": "byo", "region": null, "size": null,
"state": "pending", "stateReason": null,
"deviceId": null, "providerRef": null, "publicIp": null,
"idleTimeoutMinutes": 30, "lastActivityAt": null, "startedAt": null, "stoppedAt": null,
"hourlyRateMicroEur": null, "includedHoursUsedSeconds": 0,
"metadata": {},
"createdAt": "2026-09-25T09:01:00.000Z", "updatedAt": "2026-09-25T09:01:00.000Z"
}
}Un furnizor administrat pornește în creating, cu size, region, hourlyRateMicroEur (de ex. 30000 pentru small) și metadata.budget_micro_eur completate. Într-un proiect vm_per_dev, un al doilea mediu activ primește răspunsul:
{
"error": { "message": "You already have an environment in this vm_per_dev project.", "type": "invalid_request_error", "code": "already_has_env" },
"environment_id": "9c1e5a7b-2d4f-4e6a-8b0c-3d5e7f9a1b2c"
}Înrolează o mașină BYO
curl -X POST https://ai.codai.ro/v1/environments/$ENV_ID/enroll-token -H "Authorization: Bearer $CODAI_API_KEY"{ "token": "codai_env_4Qm9…32 chars", "expires_at": "2026-09-25T09:31:00.000Z", "environment_id": "9c1e5a7b-…" }Tokenul este returnat o singură dată, se stochează doar ca hash SHA-256, e valabil 30 de minute, iar o nouă generare îl înlocuiește. codaid îl prezintă la POST /v1/environments/enroll:
{ "token": "codai_env_…", "device_id": "1c2f…-uuid", "daemon_version": "0.3.3", "os": "linux", "arch": "x86_64" }→ { "environment_id": "9c1e…", "relay_url": "wss://relay.codai.ro" } (mașinile administrate primesc în plus un api_key afișat o singură dată). Un token necunoscut, folosit sau expirat înseamnă 401 invalid_api_key; o stare care nu permite înrolarea înseamnă 409 not_enrollable.
Acțiuni de ciclu de viață
curl -X POST https://ai.codai.ro/v1/environments/$ENV_ID/stop -H "Authorization: Bearer $CODAI_API_KEY"{ "environment": { "id": "9c1e…", "state": "stopping", "stateReason": "user_request", "…": "…" }, "from": "running", "to": "stopping" }Tranzițiile permise sunt pe pagina mediilor administrate; mediile BYO acceptă doar archive și destroy.
Membri
curl https://ai.codai.ro/v1/environments/$ENV_ID/members \
-H "Authorization: Bearer $CODAI_API_KEY" -H "Content-Type: application/json" \
-d '{ "email": "ana@example.com", "role": "developer" }'201 → { "member": { "user_id": "7a1c09e4-…", "role": "developer", "linux_username": "u-7a1c09e4", "port_range_start": 30100 } }. GET …/members întoarce { "members": [{ "user_id", "role", "email", "name", "linux_username", "port_range_start", "ssh_public_key": true, "provisioned_at", "created_at" }] } — ssh_public_key este doar un indicator. Erori: 404 (niciun cont cu acel e-mail), 409 already_member, 409 vm_per_dev_single_member, 409 last_owner.
Înregistrează-ți propria cheie:
curl -X PUT https://ai.codai.ro/v1/environments/$ENV_ID/members/me/ssh-key \
-H "Authorization: Bearer $CODAI_API_KEY" -H "Content-Type: application/json" \
-d '{ "public_key": "ssh-ed25519 AAAAC3Nza… ana@laptop" }'→ { "user_id": "…", "ssh_public_key": true }.
Certificate SSH de scurtă durată
În loc de o cheie permanentă în authorized_keys, ceri CA-ului SSH al mediului un certificat valabil 12 ore. CA-ul semnează chei publice ssh-ed25519 și ecdsa-sha2-nistp256 — acestea din urmă sunt cheile produse de Secure Enclave pe iPhone, neexportabile, așa că aplicația codai pentru iOS nu ține niciodată o cheie privată care poate fi copiată. Alte tipuri de chei (RSA, alte curbe) primesc 400.
curl https://ai.codai.ro/v1/environments/$ENV_ID/members/me/ssh-cert \
-H "Authorization: Bearer $CODAI_API_KEY" -H "Content-Type: application/json" \
-d '{ "public_key": "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAI… ana@iphone" }'→ { "certificate": "ecdsa-sha2-nistp256-cert-v01@openssh.com AAAA… user:<uuid>/env:<id>", "principal": "u-7a1c09e4", "valid_before": "…", "host": "203.0.113.7" }. Salvează certificate lângă cheie ca <cheie>-cert.pub (codaid env ssh face asta pentru tine). Certificatul e valabil de acum 5 minute până peste 12 ore, doar pentru utilizatorul tău Linux.
Porturi
PUT /v1/environments/{id}/ports/{port} cu { "visibility": "owner" | "org" | "authenticated" | "public", "label"?: șir ≤ 64, "protocol"?: "http" } întoarce { "port": { "id", "environmentId", "port", "protocol", "label", "visibility", "openedByUserId", "createdAt", "updatedAt" } }. Vezi porturi și preview-uri.
Secrete
curl -X PUT https://ai.codai.ro/v1/environments/$ENV_ID/secrets/DATABASE_URL \
-H "Authorization: Bearer $CODAI_API_KEY" -H "Content-Type: application/json" \
-d '{ "value": "postgres://…" }'201 → { "name": "DATABASE_URL", "updated": false } (200 și true la înlocuire). Valorile sunt sigilate prin criptare de tip envelope (≤ 64 KB) și nu sunt returnate niciodată; GET …/secrets listează { "name", "created_by_user_id", "created_at", "updated_at" }. Injectarea secretelor în shell-urile din mediu vine în curând; azi se folosește doar CODAI_GIT_TOKEN, pentru clonare (vezi echipa).
Sarcini pentru agent
„Trimite și uită”: pui un prompt în coadă, închizi laptopul și primești o notificare când munca e în commit.
curl https://ai.codai.ro/v1/environments/$ENV_ID/tasks \
-H "Authorization: Bearer $CODAI_API_KEY" -H "Content-Type: application/json" \
-d '{ "prompt": "Adaugă o rută /health cu un test", "branch": "feat/health" }'202 → { "task_id": "…", "session_id": "…", "status": "queued" }. Relay-ul predă sarcina daemonului la următorul heartbeat; agentul rulează fără interfață ca utilizatorul tău Linux, în worktree-ul tău, pe branch (implicit codai/task-<primele 8 caractere din id>), cu permisiuni autopilot și o limită de 2 ore. La final, modificările necomise intră într-un commit codai task <id8> cu identitatea ta git. Primești apoi o notificare în inbox (GET /v1/notifications) și un push pe telefon: env.task.done cu statisticile diff, SHA-ul scurt și un URL de preview dacă un server de dezvoltare ascultă în intervalul tău de porturi, sau env.task.failed cu motivul (no_agent_runtime când mașina nu are sidecar-ul agentului instalat).
session_id este o sesiune partajată obișnuită: deschide-o în aplicația desktop sau pe telefon ca să urmărești rularea live, s-o ghidezi sau s-o anulezi. GET …/tasks/{taskId} întoarce status (queued → running → done | failed) și result (diff_stat, commit_sha, branch, preview_url, error).
Exec prin REST
Rulează comenzi și lucrează cu fișiere într-un mediu pornit prin HTTPS simplu, fără client WebSocket. Gateway-ul deschide o conexiune scurtă la relay în numele tău (cu propria ta cheie API, deci se aplică aceleași verificări de rol), trimite o operație și întoarce răspunsul. Viewerii primesc 403; comanda rulează ca utilizatorul tău Linux, în spațiul tău de lucru.
curl https://ai.codai.ro/v1/environments/$ENV_ID/exec \
-H "Authorization: Bearer $CODAI_API_KEY" -H "Content-Type: application/json" \
-d '{ "command": "pnpm test", "timeout_ms": 120000 }'200 → { "ok": true, "exit_code": 0, "stdout": "…", "stderr": "", "timed_out": false, "truncated": false, "duration_ms": 8123 }. timeout_ms este implicit 60 000 (maxim 600 000). Celelalte operații ale relay-ului trec prin același endpoint cu op + args ({ "op": "fs_roots" }, { "op": "job_kill", "args": { "id": 3 } }) și întorc { ok, result }; un refuz pe mașină (cale în afara rădăcinilor tale, job necunoscut) este 200 { "ok": false, "error": "…" }. Erori: 409 environment_offline (daemonul nu e conectat), 504 host_timeout, 502 relay_unavailable.
- Fișiere:
GET …/files?path=/home/u-…/worklistează un director;GET …/files/home/u-…/work/README.mdîntoarce{ path, content, size, truncated }(64 KB implicit,?max_bytes=până la 512 KB);PUT …/files/<cale>cu un corp text brut (≤ 2 MB, altfel413) îl scrie și creează directoarele părinte. - Lucru lung:
POST …/jobs{ "command": "pnpm build", "expected_s": 300 }→201 { "job_id": 4 }; interogheazăGET …/jobs/4?since=<next_offset>pentru{ job, output }în loc să ții un exec deschis.
Starea din relay
curl https://relay.codai.ro/v1/environments/$ENV_ID/status -H "Authorization: Bearer $CODAI_API_KEY"{
"environment_id": "9c1e…", "online": true, "instance": "relay-7f3a", "last_heartbeat": 1790326860000,
"activity": "agent",
"ports": [{ "port": 3000, "pid": 4121, "process": "node" }],
"git_state": { "branch": "main", "dirty": true, "ahead": 1, "behind": 0, "worktrees": ["/home/u-7a1c09e4/work/brivio"] },
"daemon": { "daemon_version": "0.3.3", "os": "linux", "arch": "x86_64", "capabilities": ["shell", "pty", "tcp", "http", "lock:build", "identity:per-user"] },
"streams": 2,
"attached": [{ "client_id": "…", "user_id": "…", "role": "owner", "kind": "agent", "device_id": "…", "name": "Laptop de lucru", "platform": "desktop", "attached_at": "2026-09-25T09:20:00.000Z" }],
"locks": [{ "name": "build-0123456789ab", "holder": "u-7a1c09e4 · pnpm build", "since": "2026-09-25T09:20:30Z" }],
"clients": 1
}Referință
bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Proiectele tale.
application/json- response
projects*array<>curl -X GET 'https://ai.codai.ro/v1/projects'{ "projects": [ { "id": "2b6d1c0e-4f3a-4b9c-8d7e-1a2b3c4d5e6f", "ownerUserId": "283eeac5-beea-465a-80a5-763009480d0f", "orgId": "25b2c2d5-a7fc-47d0-89e4-8709a1560bfa", "name": "brivio", "slug": "brivio", "repoUrl": "https://github.com/acme/brivio", "defaultBranch": "main", "devcontainerPath": ".devcontainer/devcontainer.json", "isolation": "shared_vm", "settings": {}, "prebuildPoolSize": 0, "prebuildProvider": "openstack", "prebuildSize": "small", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" } ]}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
name*string1 <= length <= 120slug?stringImplicit, name transformat în slug.
^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$repo_url?|urilength <= 2048default_branch?string1 <= length <= 255"main"devcontainer_path?|1 <= length <= 512isolation?stringCum sunt partajate mediile unui proiect. shared_vm (implicit) — o mașină, mai mulți membri; container — câte un container per membru; vm_per_dev — câte o mașină per dezvoltator, alocată prin for_user_id.
"shared_vm""shared_vm""container""vm_per_dev"org_id?|Atașează la o organizație pe care o deții sau o administrezi.
uuidProiectul nou.
application/json- response
project*Rândul de proiect stocat (camelCase, așa cum este persistat).
curl -X POST 'https://ai.codai.ro/v1/projects' \ -H 'Content-Type: application/json' \ -d '{ "name": "brivio"}'{ "project": { "id": "2b6d1c0e-4f3a-4b9c-8d7e-1a2b3c4d5e6f", "ownerUserId": "283eeac5-beea-465a-80a5-763009480d0f", "orgId": "25b2c2d5-a7fc-47d0-89e4-8709a1560bfa", "name": "brivio", "slug": "brivio", "repoUrl": "https://github.com/acme/brivio", "defaultBranch": "main", "devcontainerPath": ".devcontainer/devcontainer.json", "isolation": "shared_vm", "settings": {}, "prebuildPoolSize": 0, "prebuildProvider": "openstack", "prebuildSize": "small", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" }}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul proiectului. O valoare malformată dă 400; un proiect necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Proiectul și mediile lui.
application/json- response
project*Rândul de proiect stocat (camelCase, așa cum este persistat).
environments*array<>curl -X GET 'https://ai.codai.ro/v1/projects/497f6eca-6276-4993-bfeb-53cbbbba6f08'{ "project": { "id": "2b6d1c0e-4f3a-4b9c-8d7e-1a2b3c4d5e6f", "ownerUserId": "283eeac5-beea-465a-80a5-763009480d0f", "orgId": "25b2c2d5-a7fc-47d0-89e4-8709a1560bfa", "name": "brivio", "slug": "brivio", "repoUrl": "https://github.com/acme/brivio", "defaultBranch": "main", "devcontainerPath": ".devcontainer/devcontainer.json", "isolation": "shared_vm", "settings": {}, "prebuildPoolSize": 0, "prebuildProvider": "openstack", "prebuildSize": "small", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" }, "environments": [ { "id": "9c1e5a7b-2d4f-4e6a-8b0c-3d5e7f9a1b2c", "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8", "ownerUserId": "283eeac5-beea-465a-80a5-763009480d0f", "orgId": "25b2c2d5-a7fc-47d0-89e4-8709a1560bfa", "forUserId": "e7ebe9fe-55a5-420c-a31b-7f6410828de5", "for_user_id": "5c382187-9b39-4b04-b883-3a2ecc9f4e6e", "isolation": "shared_vm", "name": "brivio — Ana", "slug": "brivio-k3xq", "provider": "byo", "region": "nbg1", "size": "small", "state": "pending", "stateReason": "string", "deviceId": "4de4adb9-21ee-47e3-aeb4-8cf8ed6c109a", "providerRef": "string", "publicIp": "string", "idleTimeoutMinutes": 30, "lastActivityAt": "2019-08-24T14:15:22Z", "startedAt": "2019-08-24T14:15:22Z", "stoppedAt": "2019-08-24T14:15:22Z", "hourlyRateMicroEur": 0, "includedHoursUsedSeconds": 0, "metadata": {}, "prebuild": false, "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" } ]}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul proiectului. O valoare malformată dă 400; un proiect necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
Este necesar cel puțin un câmp.
name?string1 <= length <= 120repo_url?|urilength <= 2048default_branch?string1 <= length <= 255devcontainer_path?|1 <= length <= 512isolation?ProjectIsolationCum sunt partajate mediile unui proiect. shared_vm (implicit) — o mașină, mai mulți membri; container — câte un container per membru; vm_per_dev — câte o mașină per dezvoltator, alocată prin for_user_id.
"shared_vm""container""vm_per_dev"prebuild_pool_size?integerDimensiunea pool-ului de prebuild; owner-ul proiectului plătește compute-ul și stocarea pool-ului.
0 <= value <= 5prebuild_provider?string"openstack""hetzner"prebuild_size?string"small""medium""large"Proiectul actualizat.
application/json- response
project*Rândul de proiect stocat (camelCase, așa cum este persistat).
curl -X PATCH 'https://ai.codai.ro/v1/projects/497f6eca-6276-4993-bfeb-53cbbbba6f08' \ -H 'Content-Type: application/json' \ -d '{}'{ "project": { "id": "2b6d1c0e-4f3a-4b9c-8d7e-1a2b3c4d5e6f", "ownerUserId": "283eeac5-beea-465a-80a5-763009480d0f", "orgId": "25b2c2d5-a7fc-47d0-89e4-8709a1560bfa", "name": "brivio", "slug": "brivio", "repoUrl": "https://github.com/acme/brivio", "defaultBranch": "main", "devcontainerPath": ".devcontainer/devcontainer.json", "isolation": "shared_vm", "settings": {}, "prebuildPoolSize": 0, "prebuildProvider": "openstack", "prebuildSize": "small", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" }}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul proiectului. O valoare malformată dă 400; un proiect necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Șters.
application/json- response
deleted*truetrueid*stringuuidcurl -X DELETE 'https://ai.codai.ro/v1/projects/497f6eca-6276-4993-bfeb-53cbbbba6f08'{ "deleted": true, "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
project_id?stringRestrânge la un singur proiect.
uuidfor_user_id?"me"Este acceptat doar me — propriile tale medii per dezvoltator.
"me"x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Mediile pe care le poți vedea.
application/json- response
environments*array<>curl -X GET 'https://ai.codai.ro/v1/environments'{ "environments": [ { "id": "9c1e5a7b-2d4f-4e6a-8b0c-3d5e7f9a1b2c", "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8", "ownerUserId": "283eeac5-beea-465a-80a5-763009480d0f", "orgId": "25b2c2d5-a7fc-47d0-89e4-8709a1560bfa", "forUserId": "e7ebe9fe-55a5-420c-a31b-7f6410828de5", "for_user_id": "5c382187-9b39-4b04-b883-3a2ecc9f4e6e", "isolation": "shared_vm", "name": "brivio — Ana", "slug": "brivio-k3xq", "provider": "byo", "region": "nbg1", "size": "small", "state": "pending", "stateReason": "string", "deviceId": "4de4adb9-21ee-47e3-aeb4-8cf8ed6c109a", "providerRef": "string", "publicIp": "string", "idleTimeoutMinutes": 30, "lastActivityAt": "2019-08-24T14:15:22Z", "startedAt": "2019-08-24T14:15:22Z", "stoppedAt": "2019-08-24T14:15:22Z", "hourlyRateMicroEur": 0, "includedHoursUsedSeconds": 0, "metadata": {}, "prebuild": false, "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" } ]}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
project_id*stringuuidname?stringObligatoriu, cu excepția proiectelor vm_per_dev (unde implicit este <project> — <you>).
1 <= length <= 120slug?stringImplicit <project-slug>-<4 caractere aleatorii>.
^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$provider*EnvironmentProviderbyo (îți aduci propria mașină; daemonul se înrolează cu un token) este deschis oricărei chei. openstack / hetzner sunt administrați de worker și facturați la oră; gce (Google Cloud) oferă mărimile CPU la cerere small/medium/large (e2-standard-2/4/8) și mărimea GPU gpu-l4 (Spot, limită de 30 de minute); este disponibil doar unde implementarea îl activează ȘI pentru conturile super_admin (403 pentru toate celelalte); local este o comoditate pentru dezvoltatori. Furnizorii administrați răspund cu 403 până când sunt activați pentru cheia ta.
"byo""openstack""hetzner""local""gce"region?stringFurnizori administrați; valoare implicită per furnizor (hetzner → nbg1, openstack → eu-east-1).
1 <= length <= 64size?stringFurnizori administrați; una dintre dimensiunile din catalog, implicit small.
1 <= length <= 64idle_timeout_minutes?integer5 <= value <= 144030budget_micro_eur?|Plafon de cheltuieli per mediu, în micro-EUR, aplicat de worker; null = fără plafon.
0 <= valueMediul nou (sau prebuild-ul revendicat).
application/json- response
environment*Rândul de mediu stocat (camelCase, așa cum este persistat) plus for_user_id în snake_case și, când este cunoscut, isolation al proiectului. metadata nu conține niciodată hash-ul tokenului de înrolare.
prebuild_claimed?booleanPrezent și true când a fost revendicată și pornită o mașină din pool-ul de prebuild în loc să fie provizionată una nouă.
curl -X POST 'https://ai.codai.ro/v1/environments' \ -H 'Content-Type: application/json' \ -d '{ "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9", "provider": "byo"}'{ "environment": { "id": "9c1e5a7b-2d4f-4e6a-8b0c-3d5e7f9a1b2c", "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8", "ownerUserId": "283eeac5-beea-465a-80a5-763009480d0f", "orgId": "25b2c2d5-a7fc-47d0-89e4-8709a1560bfa", "forUserId": "e7ebe9fe-55a5-420c-a31b-7f6410828de5", "for_user_id": "5c382187-9b39-4b04-b883-3a2ecc9f4e6e", "isolation": "shared_vm", "name": "brivio — Ana", "slug": "brivio-k3xq", "provider": "byo", "region": "nbg1", "size": "small", "state": "pending", "stateReason": "string", "deviceId": "4de4adb9-21ee-47e3-aeb4-8cf8ed6c109a", "providerRef": "string", "publicIp": "string", "idleTimeoutMinutes": 30, "lastActivityAt": "2019-08-24T14:15:22Z", "startedAt": "2019-08-24T14:15:22Z", "stoppedAt": "2019-08-24T14:15:22Z", "hourlyRateMicroEur": 0, "includedHoursUsedSeconds": 0, "metadata": {}, "prebuild": false, "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" }, "prebuild_claimed": true}x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
token*string^codai_env_[0-9A-Za-z]{32}$device_id*stringUUID-ul dispozitivului daemonului (ales de client; înregistrat sub owner când nu este cunoscut).
uuiddaemon_version*string1 <= length <= 64os*string1 <= length <= 32arch*string1 <= length <= 32Înrolat.
application/json- response
environment_id*stringuuidrelay_url*stringURL-ul WebSocket la care trebuie să se conecteze daemonul.
uriapi_key?stringDoar furnizori administrați — o cheie API de owner pentru daemon, returnată o singură dată.
curl -X POST 'https://ai.codai.ro/v1/environments/enroll' \ -H 'Content-Type: application/json' \ -d '{ "token": "string", "device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940", "daemon_version": "string", "os": "linux", "arch": "x64"}'{ "environment_id": "40ef0e48-a11f-4963-a229-e396c9f7e7c4", "relay_url": "wss://relay.codai.ro", "api_key": "string"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Detaliile mediului.
application/json- response
environment*Rândul de mediu stocat (camelCase, așa cum este persistat) plus for_user_id în snake_case și, când este cunoscut, isolation al proiectului. metadata nu conține niciodată hash-ul tokenului de înrolare.
isolation*ProjectIsolationCum sunt partajate mediile unui proiect. shared_vm (implicit) — o mașină, mai mulți membri; container — câte un container per membru; vm_per_dev — câte o mașină per dezvoltator, alocată prin for_user_id.
"shared_vm""container""vm_per_dev"role*stringRolul tău efectiv (owner / admin de organizație → owner; membru simplu al organizației → viewer).
"owner""maintainer""developer""viewer"members*array<>ports*array<>events*array<>Cele mai recente 20 de evenimente, cele mai noi primele.
items <= 20curl -X GET 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08'{ "environment": { "id": "9c1e5a7b-2d4f-4e6a-8b0c-3d5e7f9a1b2c", "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8", "ownerUserId": "283eeac5-beea-465a-80a5-763009480d0f", "orgId": "25b2c2d5-a7fc-47d0-89e4-8709a1560bfa", "forUserId": "e7ebe9fe-55a5-420c-a31b-7f6410828de5", "for_user_id": "5c382187-9b39-4b04-b883-3a2ecc9f4e6e", "isolation": "shared_vm", "name": "brivio — Ana", "slug": "brivio-k3xq", "provider": "byo", "region": "nbg1", "size": "small", "state": "pending", "stateReason": "string", "deviceId": "4de4adb9-21ee-47e3-aeb4-8cf8ed6c109a", "providerRef": "string", "publicIp": "string", "idleTimeoutMinutes": 30, "lastActivityAt": "2019-08-24T14:15:22Z", "startedAt": "2019-08-24T14:15:22Z", "stoppedAt": "2019-08-24T14:15:22Z", "hourlyRateMicroEur": 0, "includedHoursUsedSeconds": 0, "metadata": {}, "prebuild": false, "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" }, "isolation": "shared_vm", "role": "owner", "members": [ { "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5", "role": "owner", "email": "user@example.com", "name": "string", "linux_username": "string", "port_range_start": 0, "ssh_public_key": true, "provisioned_at": "2019-08-24T14:15:22Z", "created_at": "2019-08-24T14:15:22Z" } ], "ports": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "environmentId": "19f5cc2e-7657-437a-9268-83cd3d563563", "port": 3000, "protocol": "http", "label": "web", "visibility": "owner", "openedByUserId": "c717c8e6-87b5-4b69-9353-93a60c6b5d41", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" } ], "events": [ { "id": 0, "environmentId": "19f5cc2e-7657-437a-9268-83cd3d563563", "actorUserId": "94141e08-adc7-44ce-bed3-45f031b9f36f", "actorKind": "user", "kind": "state:pending->enrolling", "payload": {}, "createdAt": "2019-08-24T14:15:22Z" } ]}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
Trimite name și/sau idle_timeout_minutes.
name?string1 <= length <= 120idle_timeout_minutes?integer5 <= value <= 1440Mediul actualizat.
application/json- response
environment*Rândul de mediu stocat (camelCase, așa cum este persistat) plus for_user_id în snake_case și, când este cunoscut, isolation al proiectului. metadata nu conține niciodată hash-ul tokenului de înrolare.
curl -X PATCH 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08' \ -H 'Content-Type: application/json' \ -d '{}'{ "environment": { "id": "9c1e5a7b-2d4f-4e6a-8b0c-3d5e7f9a1b2c", "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8", "ownerUserId": "283eeac5-beea-465a-80a5-763009480d0f", "orgId": "25b2c2d5-a7fc-47d0-89e4-8709a1560bfa", "forUserId": "e7ebe9fe-55a5-420c-a31b-7f6410828de5", "for_user_id": "5c382187-9b39-4b04-b883-3a2ecc9f4e6e", "isolation": "shared_vm", "name": "brivio — Ana", "slug": "brivio-k3xq", "provider": "byo", "region": "nbg1", "size": "small", "state": "pending", "stateReason": "string", "deviceId": "4de4adb9-21ee-47e3-aeb4-8cf8ed6c109a", "providerRef": "string", "publicIp": "string", "idleTimeoutMinutes": 30, "lastActivityAt": "2019-08-24T14:15:22Z", "startedAt": "2019-08-24T14:15:22Z", "stoppedAt": "2019-08-24T14:15:22Z", "hourlyRateMicroEur": 0, "includedHoursUsedSeconds": 0, "metadata": {}, "prebuild": false, "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" }}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Tranziția care a fost aplicată.
application/json- response
environment*Rândul de mediu stocat (camelCase, așa cum este persistat) plus for_user_id în snake_case și, când este cunoscut, isolation al proiectului. metadata nu conține niciodată hash-ul tokenului de înrolare.
from*EnvironmentStateStarea din ciclul de viață. byo pornește în pending și ajunge în enrolling când daemonul se înrolează; furnizorii administrați pornesc în creating și ajung în running după înrolare. destroyed este finală.
"pending""creating""enrolling""starting""running""stopping""stopped""archiving""archived""destroying""destroyed""error"to*EnvironmentStateStarea din ciclul de viață. byo pornește în pending și ajunge în enrolling când daemonul se înrolează; furnizorii administrați pornesc în creating și ajung în running după înrolare. destroyed este finală.
"pending""creating""enrolling""starting""running""stopping""stopped""archiving""archived""destroying""destroyed""error"curl -X POST 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/start'{ "environment": { "id": "9c1e5a7b-2d4f-4e6a-8b0c-3d5e7f9a1b2c", "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8", "ownerUserId": "283eeac5-beea-465a-80a5-763009480d0f", "orgId": "25b2c2d5-a7fc-47d0-89e4-8709a1560bfa", "forUserId": "e7ebe9fe-55a5-420c-a31b-7f6410828de5", "for_user_id": "5c382187-9b39-4b04-b883-3a2ecc9f4e6e", "isolation": "shared_vm", "name": "brivio — Ana", "slug": "brivio-k3xq", "provider": "byo", "region": "nbg1", "size": "small", "state": "pending", "stateReason": "string", "deviceId": "4de4adb9-21ee-47e3-aeb4-8cf8ed6c109a", "providerRef": "string", "publicIp": "string", "idleTimeoutMinutes": 30, "lastActivityAt": "2019-08-24T14:15:22Z", "startedAt": "2019-08-24T14:15:22Z", "stoppedAt": "2019-08-24T14:15:22Z", "hourlyRateMicroEur": 0, "includedHoursUsedSeconds": 0, "metadata": {}, "prebuild": false, "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" }, "from": "pending", "to": "pending"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Tranziția care a fost aplicată.
application/json- response
environment*Rândul de mediu stocat (camelCase, așa cum este persistat) plus for_user_id în snake_case și, când este cunoscut, isolation al proiectului. metadata nu conține niciodată hash-ul tokenului de înrolare.
from*EnvironmentStateStarea din ciclul de viață. byo pornește în pending și ajunge în enrolling când daemonul se înrolează; furnizorii administrați pornesc în creating și ajung în running după înrolare. destroyed este finală.
"pending""creating""enrolling""starting""running""stopping""stopped""archiving""archived""destroying""destroyed""error"to*EnvironmentStateStarea din ciclul de viață. byo pornește în pending și ajunge în enrolling când daemonul se înrolează; furnizorii administrați pornesc în creating și ajung în running după înrolare. destroyed este finală.
"pending""creating""enrolling""starting""running""stopping""stopped""archiving""archived""destroying""destroyed""error"curl -X POST 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/stop'{ "environment": { "id": "9c1e5a7b-2d4f-4e6a-8b0c-3d5e7f9a1b2c", "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8", "ownerUserId": "283eeac5-beea-465a-80a5-763009480d0f", "orgId": "25b2c2d5-a7fc-47d0-89e4-8709a1560bfa", "forUserId": "e7ebe9fe-55a5-420c-a31b-7f6410828de5", "for_user_id": "5c382187-9b39-4b04-b883-3a2ecc9f4e6e", "isolation": "shared_vm", "name": "brivio — Ana", "slug": "brivio-k3xq", "provider": "byo", "region": "nbg1", "size": "small", "state": "pending", "stateReason": "string", "deviceId": "4de4adb9-21ee-47e3-aeb4-8cf8ed6c109a", "providerRef": "string", "publicIp": "string", "idleTimeoutMinutes": 30, "lastActivityAt": "2019-08-24T14:15:22Z", "startedAt": "2019-08-24T14:15:22Z", "stoppedAt": "2019-08-24T14:15:22Z", "hourlyRateMicroEur": 0, "includedHoursUsedSeconds": 0, "metadata": {}, "prebuild": false, "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" }, "from": "pending", "to": "pending"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Tranziția care a fost aplicată.
application/json- response
environment*Rândul de mediu stocat (camelCase, așa cum este persistat) plus for_user_id în snake_case și, când este cunoscut, isolation al proiectului. metadata nu conține niciodată hash-ul tokenului de înrolare.
from*EnvironmentStateStarea din ciclul de viață. byo pornește în pending și ajunge în enrolling când daemonul se înrolează; furnizorii administrați pornesc în creating și ajung în running după înrolare. destroyed este finală.
"pending""creating""enrolling""starting""running""stopping""stopped""archiving""archived""destroying""destroyed""error"to*EnvironmentStateStarea din ciclul de viață. byo pornește în pending și ajunge în enrolling când daemonul se înrolează; furnizorii administrați pornesc în creating și ajung în running după înrolare. destroyed este finală.
"pending""creating""enrolling""starting""running""stopping""stopped""archiving""archived""destroying""destroyed""error"curl -X POST 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/archive'{ "environment": { "id": "9c1e5a7b-2d4f-4e6a-8b0c-3d5e7f9a1b2c", "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8", "ownerUserId": "283eeac5-beea-465a-80a5-763009480d0f", "orgId": "25b2c2d5-a7fc-47d0-89e4-8709a1560bfa", "forUserId": "e7ebe9fe-55a5-420c-a31b-7f6410828de5", "for_user_id": "5c382187-9b39-4b04-b883-3a2ecc9f4e6e", "isolation": "shared_vm", "name": "brivio — Ana", "slug": "brivio-k3xq", "provider": "byo", "region": "nbg1", "size": "small", "state": "pending", "stateReason": "string", "deviceId": "4de4adb9-21ee-47e3-aeb4-8cf8ed6c109a", "providerRef": "string", "publicIp": "string", "idleTimeoutMinutes": 30, "lastActivityAt": "2019-08-24T14:15:22Z", "startedAt": "2019-08-24T14:15:22Z", "stoppedAt": "2019-08-24T14:15:22Z", "hourlyRateMicroEur": 0, "includedHoursUsedSeconds": 0, "metadata": {}, "prebuild": false, "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" }, "from": "pending", "to": "pending"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Tranziția care a fost aplicată.
application/json- response
environment*Rândul de mediu stocat (camelCase, așa cum este persistat) plus for_user_id în snake_case și, când este cunoscut, isolation al proiectului. metadata nu conține niciodată hash-ul tokenului de înrolare.
from*EnvironmentStateStarea din ciclul de viață. byo pornește în pending și ajunge în enrolling când daemonul se înrolează; furnizorii administrați pornesc în creating și ajung în running după înrolare. destroyed este finală.
"pending""creating""enrolling""starting""running""stopping""stopped""archiving""archived""destroying""destroyed""error"to*EnvironmentStateStarea din ciclul de viață. byo pornește în pending și ajunge în enrolling când daemonul se înrolează; furnizorii administrați pornesc în creating și ajung în running după înrolare. destroyed este finală.
"pending""creating""enrolling""starting""running""stopping""stopped""archiving""archived""destroying""destroyed""error"curl -X POST 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/destroy'{ "environment": { "id": "9c1e5a7b-2d4f-4e6a-8b0c-3d5e7f9a1b2c", "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8", "ownerUserId": "283eeac5-beea-465a-80a5-763009480d0f", "orgId": "25b2c2d5-a7fc-47d0-89e4-8709a1560bfa", "forUserId": "e7ebe9fe-55a5-420c-a31b-7f6410828de5", "for_user_id": "5c382187-9b39-4b04-b883-3a2ecc9f4e6e", "isolation": "shared_vm", "name": "brivio — Ana", "slug": "brivio-k3xq", "provider": "byo", "region": "nbg1", "size": "small", "state": "pending", "stateReason": "string", "deviceId": "4de4adb9-21ee-47e3-aeb4-8cf8ed6c109a", "providerRef": "string", "publicIp": "string", "idleTimeoutMinutes": 30, "lastActivityAt": "2019-08-24T14:15:22Z", "startedAt": "2019-08-24T14:15:22Z", "stoppedAt": "2019-08-24T14:15:22Z", "hourlyRateMicroEur": 0, "includedHoursUsedSeconds": 0, "metadata": {}, "prebuild": false, "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" }, "from": "pending", "to": "pending"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Tokenul (în clar, returnat o singură dată).
application/json- response
token*stringTokenul codai_env_… în clar, returnat o singură dată; se stochează doar hash-ul lui.
expires_at*stringLa 30 de minute după emitere.
date-timeenvironment_id*stringuuidcurl -X POST 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/enroll-token'{ "token": "string", "expires_at": "2019-08-24T14:15:22Z", "environment_id": "40ef0e48-a11f-4963-a229-e396c9f7e7c4"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Membrii mediului.
application/json- response
members*array<>curl -X GET 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/members'{ "members": [ { "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5", "role": "owner", "email": "user@example.com", "name": "string", "linux_username": "string", "port_range_start": 0, "ssh_public_key": true, "provisioned_at": "2019-08-24T14:15:22Z", "created_at": "2019-08-24T14:15:22Z" } ]}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
Este necesar exact unul dintre user_id sau email.
user_id?stringuuidemail?stringemailrole?stringImplicit developer. owner poate fi acordat doar de un owner.
"developer""owner""maintainer""developer""viewer"Apartenența, așa cum a fost stocată.
application/json- response
member*curl -X POST 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/members' \ -H 'Content-Type: application/json' \ -d '{}'{ "member": { "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5", "role": "owner", "linux_username": "string", "port_range_start": 0 }}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
public_key*stringO linie authorized_keys (ssh-ed25519, ssh-rsa sau ecdsa-*).
1 <= length <= 1000Stocată.
application/json- response
user_id*stringuuidssh_public_key*truetruecurl -X PUT 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/members/me/ssh-key' \ -H 'Content-Type: application/json' \ -d '{ "public_key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGx7v0o6Q3m1q0Y4bJw2m9V7a2X5b1x6ZJ3o8Kk1QzAB ana@laptop"}'{ "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5", "ssh_public_key": true}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuiduserId*stringUUID-ul membrului.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
role*EnvironmentRoleRolul unui membru într-un mediu; owner ≥ maintainer ≥ developer ≥ viewer.
"owner""maintainer""developer""viewer"Apartenența actualizată.
application/json- response
member*curl -X PATCH 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/members/497f6eca-6276-4993-bfeb-53cbbbba6f08' \ -H 'Content-Type: application/json' \ -d '{ "role": "owner"}'{ "member": { "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5", "role": "owner" }}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuiduserId*stringUUID-ul membrului de eliminat (propriul tău id pentru a pleca).
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Eliminat.
application/json- response
deleted*truetrueuser_id*stringuuidcurl -X DELETE 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/members/497f6eca-6276-4993-bfeb-53cbbbba6f08'{ "deleted": true, "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Porturile publicate.
application/json- response
ports*array<>curl -X GET 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/ports'{ "ports": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "environmentId": "19f5cc2e-7657-437a-9268-83cd3d563563", "port": 3000, "protocol": "http", "label": "web", "visibility": "owner", "openedByUserId": "c717c8e6-87b5-4b69-9353-93a60c6b5d41", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" } ]}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidport*integerPortul TCP din interiorul mediului (1..65535).
1 <= value <= 65535x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
visibility*PortVisibilityCine poate accesa un port publicat prin routerul de preview. Setarea public necesită maintainer.
"owner""org""authenticated""public"label?|1 <= length <= 64protocol?string"http""http""https""tcp"Portul era deja publicat și a fost actualizat.
application/json- response
port*curl -X PUT 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/ports/1' \ -H 'Content-Type: application/json' \ -d '{ "visibility": "owner"}'{ "port": { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "environmentId": "19f5cc2e-7657-437a-9268-83cd3d563563", "port": 3000, "protocol": "http", "label": "web", "visibility": "owner", "openedByUserId": "c717c8e6-87b5-4b69-9353-93a60c6b5d41", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" }}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidport*integerPortul TCP din interiorul mediului (1..65535).
1 <= value <= 65535x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Publicare retrasă.
application/json- response
deleted*truetrueport*integercurl -X DELETE 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/ports/1'{ "deleted": true, "port": 0}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Numele secretelor.
application/json- response
secrets*array<>curl -X GET 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/secrets'{ "secrets": [ { "name": "DATABASE_URL", "created_by_user_id": "209f54c4-4c33-43bc-9c6a-ef4c65ad7473", "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z" } ]}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidname*stringNumele secretului, ENV_STYLE.
^[A-Z_][A-Z0-9_]{0,127}$x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
value*stringSigilat înainte de stocare; nu este returnat niciodată.
1 <= length <= 65536Înlocuit.
application/json- response
name*stringupdated*booleantrue când a fost înlocuită o valoare existentă.
curl -X PUT 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/secrets/string' \ -H 'Content-Type: application/json' \ -d '{ "value": "string"}'{ "name": "string", "updated": true}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidname*stringNumele secretului, ENV_STYLE.
^[A-Z_][A-Z0-9_]{0,127}$x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Șters.
application/json- response
deleted*truetruename*stringcurl -X DELETE 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/secrets/string'{ "deleted": true, "name": "string"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Sarcinile mediului.
application/json- response
data*array<>curl -X GET 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/tasks'{ "data": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "environment_id": "40ef0e48-a11f-4963-a229-e396c9f7e7c4", "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5", "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82", "prompt": "string", "branch": "string", "status": "queued", "result": { "diff_stat": "string", "commit_sha": "string", "branch": "string", "preview_url": "string", "error": "string" }, "created_at": "2019-08-24T14:15:22Z", "started_at": "2019-08-24T14:15:22Z", "finished_at": "2019-08-24T14:15:22Z", "output_signature": { "alg": "hide-hybrid-ed25519-mldsa65", "context": "codai.agent-output.v1", "key_id": "string", "sig": "string", "signed_at": "2019-08-24T14:15:22Z" } } ]}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Promptul și, opțional, o ramură.
application/json- body
prompt*stringCe trebuie să facă agentul (1..20000 de caractere).
1 <= length <= 20000branch?stringRamura git creată pentru lucru; implicit codai/task-<primele 8 caractere din id>.
length <= 200Pusă în coadă.
application/json- response
task_id*stringuuidsession_id*stringSesiunea de conversație în care rulează agentul (urmărește-o cu API-ul de sesiuni).
uuidstatus*"queued""queued"curl -X POST 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/tasks' \ -H 'Content-Type: application/json' \ -d '{ "prompt": "string"}'{ "task_id": "736fde4d-9029-4915-8189-01353d6982cb", "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82", "status": "queued"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidtaskId*stringId-ul sarcinii agentului.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Sarcina.
application/json- response
task*curl -X GET 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/tasks/497f6eca-6276-4993-bfeb-53cbbbba6f08'{ "task": { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "environment_id": "40ef0e48-a11f-4963-a229-e396c9f7e7c4", "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5", "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82", "prompt": "string", "branch": "string", "status": "queued", "result": { "diff_stat": "string", "commit_sha": "string", "branch": "string", "preview_url": "string", "error": "string" }, "created_at": "2019-08-24T14:15:22Z", "started_at": "2019-08-24T14:15:22Z", "finished_at": "2019-08-24T14:15:22Z", "output_signature": { "alg": "hide-hybrid-ed25519-mldsa65", "context": "codai.agent-output.v1", "key_id": "string", "sig": "string", "signed_at": "2019-08-24T14:15:22Z" } }}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
op?stringOperația relay-ului; shell cere command (sau args.cmd).
"shell""shell""fs_read""fs_write""fs_list""fs_roots""info""job_start""job_status""job_output""job_send""job_wait""job_kill""job_list"command?stringLinia de shell pentru op: shell.
length <= 100000args?Argumentele operației (ex. { path } pentru fs_read, { id } pentru job_kill, cwd pentru shell).
timeout_ms?integerBugetul cererii, implicit 60000 (maxim 10 minute).
1000 <= value <= 600000Rezultatul operației.
application/json- response
ok*booleanexit_code?|Codul de ieșire al shell-ului; -1 când a fost oprit forțat.
stdout?stringstderr?stringtimed_out?booleantruncated?booleanduration_ms?integer|nullresult?unknownRezultatul brut al unei operații care nu este shell.
error?string|nullcurl -X POST 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/exec' \ -H 'Content-Type: application/json' \ -d '{}'{ "ok": true, "exit_code": 0, "stdout": "string", "stderr": "string", "timed_out": true, "truncated": true, "duration_ms": 0, "result": null, "error": "string"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidpath?stringCalea absolută a directorului; implicit spațiul tău de lucru.
length <= 4096x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Intrările directorului.
application/json- response
path*stringentries*array<>truncated*booleancurl -X GET 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/files'{ "path": "string", "entries": [ { "name": "string", "kind": "string", "size": 0 } ], "truncated": true}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidpath*stringCalea absolută a fișierului în mediu (slash-uri permise, fiecare segment codat URL); trebuie să fie sub rădăcinile pe care daemonul ți le servește.
length <= 4096max_bytes?integerCitește cel mult atâția octeți (1..524288).
1 <= value <= 524288x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Conținutul fișierului.
application/json- response
path*stringcontent*stringsize*integertruncated*booleancurl -X GET 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/files/string'{ "path": "string", "content": "string", "size": 0, "truncated": true}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidpath*stringCalea absolută a fișierului în mediu (slash-uri permise, fiecare segment codat URL); trebuie să fie sub rădăcinile pe care daemonul ți le servește.
length <= 4096x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128body*stringtext/plainScris.
application/json- response
path*stringbytes*integercreated*booleancurl -X PUT 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/files/string' \ -H 'Content-Type: text/plain' \ -d 'string'{ "path": "string", "bytes": 0, "created": true}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
command*stringlength <= 100000cwd?stringlength <= 4096expected_s?integerDurata estimată în secunde (afișată în starea jobului).
1 <= valuesession?stringlength <= 120Jobul a pornit.
application/json- response
job_id*integerlabel?stringcurl -X POST 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/jobs' \ -H 'Content-Type: application/json' \ -d '{ "command": "string"}'{ "job_id": 0, "label": "string"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul mediului. O valoare malformată dă 400; un mediu necunoscut sau străin dă 404.
uuidjobId*stringId-ul jobului din startEnvironmentJob.
^(job)?[0-9]{1,18}$since?integerOffsetul în octeți de la care continuă output-ul (next_offset din apelul anterior).
0 <= valuetail?integerÎntoarce doar ultimii N octeți de output.
0 <= valuesession?stringSesiunea în care a fost pornit jobul (implicit default).
length <= 120x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Stare și output.
application/json- response
job*|Intrarea job_status: id, label, state, exit_code, runtime_s…
output*Fragmentul job_output: text, from, next_offset, state…
curl -X GET 'https://ai.codai.ro/v1/environments/497f6eca-6276-4993-bfeb-53cbbbba6f08/jobs/string'{ "job": {}, "output": {}}Ultima actualizare:
Facturare
Mediile administrate se taxează din portofel pe secundă de rulare și pe GB-lună de disc păstrat, în regim fail-closed; propriile servere sunt gratuite.
Autentificare cu codai
auth.codai.ro este un provider OpenID Connect standard. Îl folosești când aplicația ta trebuie să acționeze în numele unui utilizator codai; folosești o cheie API simplă când nu trebuie.