Atako API API

The Atako customer API — manage AI agents, their files, integrations, billing, and your company/team, programmatically.

Operations 319

Showing the first 250 of 319. The full set is in the contract, and via get_provider_operations.

GET /agents List your agents #
POST /agents Create an agent #
GET /agents/{id} Get agent detail #
POST /agents/{id}/cancel Cancel a provisioning agent #
POST /agents/{id}/retry-provisioning Retry a failed provisioning #
POST /agents/{id}/end End an active agent #
POST /agents/{id}/resume Resume a paused agent #
GET /agents/{id}/export Export everything an agent holds, as a JSON attachment #
GET /agents/{id}/upgrade-status Check whether an engine upgrade is available #
POST /agents/{id}/upgrade Trigger an in-place engine image upgrade #
PATCH /agents/{id}/name Set the agent's display name #
PATCH /agents/{id}/role Set or clear the agent's job title #
PATCH /agents/{id}/finish Set or clear the agent's 3D body finish (« skin ») #
PATCH /agents/{id}/instructions Edit the agent's mission, instructions and business context #
PATCH /agents/{id}/team Move the agent to a team, or make it personal #
PATCH /agents/{id}/model Change the LLM model of a live agent #
PATCH /agents/{id}/llm-key Reassign the agent's BYOK LLM key #
GET /agents/{agentId}/conversations List the caller's chat sessions with an agent #
POST /agents/{agentId}/conversations Open a new chat session with an agent #
POST /agents/{agentId}/conversations/archive Archive or un-archive several chat sessions at once #
GET /conversations/{id} One chat session #
PATCH /conversations/{id} Rename, archive or un-archive a chat session #
GET /agents/{agentId}/messages List an agent's chat messages #
POST /agents/{agentId}/messages Send a chat message to the agent #
POST /agents/{agentId}/turns/steer Add an instruction to the agent's running turn #
POST /agents/{agentId}/turns/stop Stop the agent's running turn #
POST /agents/{agentId}/messages/{messageId}/flag Flag a message as an error (deprecated — recorded as a thumbs down, use PUT …/feedback) #
PUT /agents/{agentId}/messages/{messageId}/feedback Thumbs up / down an agent reply (replaces any previous verdict) #
DELETE /agents/{agentId}/messages/{messageId}/feedback Remove your thumbs up / down from an agent reply (idempotent) #
GET /agents/{agentId}/events SSE stream of new messages and live-activity events #
GET /agents/{agentId}/activity Live-activity feed history #
GET /agents/{agentId}/activity/state Current working/idle state #
GET /agents/{agentId}/turns/{turnId}/sources Knowledge items an agent read during one turn #
GET /models List visible AI models (for the create-agent form) #
GET /models/catalog List the whole OpenRouter catalog with Atako flags #
GET /models/recent Models the caller's company already launched agents on #
GET /models/favorites List the starred model slugs (company-wide) #
PUT /models/favorites Star or unstar one model for the whole company #
GET /harnesses List visible harnesses (for the create-agent form) #
GET /agent-engines List runtime engines and the default used when creating an agent #
GET /users/api-keys List the company's programmatic API keys #
POST /users/api-keys Create an API key #
DELETE /users/api-keys/{id} Revoke an API key #
DELETE /users/api-keys/{id}/permanent Permanently delete an already-revoked API key #
GET /company/audit-log List the company audit journal #
GET /company/audit-log/export Export the company audit journal as CSV #
GET /agents/{id}/files List files an agent can access (granted files + its dedicated folder) #
GET /agents/{id}/files/{nodeId}/download-url Get a signed download URL for a file accessible to the agent #
GET /client/files List the company drive #
GET /client/files/usage Total size and file count of the drive you can see #
POST /client/files/folders Create a folder #
POST /client/files/nodes Create a file node (before uploading) #
PATCH /client/files/{nodeId} Rename and/or move a file or folder #
DELETE /client/files/{nodeId} Delete a file or folder (recursive) #
POST /client/files/{nodeId}/upload-url Get a signed upload URL for a file node #
GET /client/files/{nodeId}/download-url Get a signed download URL for a file node #
POST /client/files/{nodeId}/complete-upload Finalize an upload #
GET /agents/{agentId}/file-grants List client files granted to an agent #
POST /agents/{agentId}/file-grants Grant client files to an agent #
DELETE /agents/{agentId}/file-grants/{grantId} Revoke a file grant #
POST /agents/{agentId}/file-grants/dedicated-folder Create (or return) the agent's dedicated agent-writable folder #
GET /agents/{agentId}/cron-jobs List cron jobs created by the agent #
GET /agents/{agentId}/cron-jobs/{jobId}/executions/{executionId} Read one execution's full output #
POST /agents/{agentId}/cron-jobs/{jobId}/stop Stop a still-active cron job #
GET /agents/{agentId}/sub-agents List sub-agents spawned by the agent #
GET /agents/{agentId}/agent-messages List inter-agent messages sent/received by this agent #
GET /agents/{agentId}/agent-messages/{id} Get an inter-agent message and its thread #
POST /integrations Request a new (not-yet-available) integration #
GET /integrations/catalog List available/coming-soon connectors #
POST /integrations/{key}/interest Register interest in a coming-soon connector #
GET /integrations/connections/usage Which agents and teams use each visible connection #
GET /integrations/connections List your company's integration connections #
POST /integrations/connections Connect an integration via a pasted API key/secret #
PATCH /integrations/connections/{id} Replace an integration connection's credential, or rename it, in place #
DELETE /integrations/connections/{id} Revoke an integration connection #
GET /integrations/connections/{id}/context-index Read the « Index in Context » switch, scope and sync progress of an indexable connection (Notion, GitHub…) #
PATCH /integrations/connections/{id}/context-index Turn « Index in Context » on or off, and set its scope, for an indexable connection #
GET /integrations/connections/{id}/context-scopes List the scope items the connection token sees (GitHub repositories…) and which are chosen #
GET /integrations/mcp/status Whether custom MCP servers can be connected on this deployment #
POST /integrations/mcp/probe Test a remote MCP server and list its tools (nothing stored) #
POST /integrations/mcp/connections Connect a remote MCP server as a custom integration #
GET /integrations/connections/{id}/mcp A custom MCP connection: server, every tool (with review state), agents holding it #
POST /integrations/connections/{id}/mcp/refresh Re-sync a custom MCP connection's tools #
PATCH /integrations/connections/{id}/mcp/tools Enable, disable, approve or re-scope a custom MCP connection's tools #
PUT /integrations/connections/{id}/mcp/auth Replace a custom MCP connection's credential (re-probed first) #
POST /integrations/oauth/{provider}/start Start an OAuth2 connection flow #
GET /integrations/oauth/callback OAuth2 provider redirect callback #
GET /agents/{agentId}/integration-grants List integration grants for an agent #
POST /agents/{agentId}/integration-grants Grant (or update) an agent's access to an integration connection #
PATCH /agents/{agentId}/integration-grants/{grantId} Update an integration grant's constraints #
DELETE /agents/{agentId}/integration-grants/{grantId} Revoke an integration grant #
GET /agents/{agentId}/integration-activity Recent integration/tool call audit log for an agent #
GET /subscriptions/plans List active subscription plans #
GET /subscriptions/company Get your company's subscription #
POST /subscriptions/company Subscribe your company to a plan #
PATCH /subscriptions/company Change plan/price or seat count #
DELETE /subscriptions/company Cancel your company's subscription #
POST /subscriptions/checkout Create a Stripe Checkout session for a new subscription #
POST /subscriptions/checkout/add-sessions Add seats to an existing subscription #
POST /subscriptions/agents/reduce Schedule a reduction of purchased seats for the end of the current period #
POST /subscriptions/agents/reduce/cancel Cancel a pending scheduled seat reduction #
POST /subscriptions/billing-interval Schedule a monthly ↔ annual switch for the end of the current period #
POST /subscriptions/billing-interval/cancel Cancel a pending billing interval switch #
POST /subscriptions/licenses/preview Preview the billing effect of a target total seat count #
POST /subscriptions/checkout/verify Sync the subscription with Stripe after a Checkout redirect #
GET /subscriptions/invoices List Stripe invoices for your company #
GET /subscriptions/billing-details Get the company billing details (legal name, address, tax IDs) #
POST /subscriptions/checkout/canceled Restore the legal name and address after a Checkout left through its cancel URL #
GET /subscriptions/portal Get a Stripe billing portal URL #
GET /subscriptions/credits/balance Get your company's credit balance #
GET /subscriptions/credits/transactions Paginated credit ledger #
POST /subscriptions/credits/checkout Buy a one-time credits top-up #
GET /subscriptions/credits/subscription Get your company's recurring credit subscription #
PATCH /subscriptions/credits/subscription Change the recurring credit amount #
DELETE /subscriptions/credits/subscription Cancel the recurring credit subscription #
POST /subscriptions/credits/subscription/checkout Start a recurring credit subscription #
POST /subscriptions/trial/activate Activate the self-serve 14-day trial #
GET /users/me Get your user profile #
POST /users/me Upsert your user profile (call on first login) #
PATCH /users/me Update your user profile #
DELETE /users/me Self-service account deletion (GDPR) #
GET /users/me/email-preferences Get your email preferences #
PATCH /users/me/email-preferences Subscribe to or unsubscribe from email types #
POST /users/me/tour-seen Mark the guided tour as seen #
POST /users/me/storey-tours/{storey}/seen Mark a storey's guided tour as seen #
POST /users/me/tours/reset Reset the guided tours #
GET /users/me/impersonation Is this session an admin impersonation? #
POST /users/me/impersonation/end Leave an admin impersonation session #
GET /users/intercom-token Get a signed Intercom identity token #
GET /company/me Get your company #
PATCH /company/me Update company name / context #
GET /company/me/members List company members #
PATCH /company/me/members/{userId} Change a member's role #
DELETE /company/me/members/{userId} Remove a member from the company #
PATCH /company/me/members/{userId}/agent-permission Set whether a member can create agents #
PATCH /company/me/members/{userId}/team Move a member to a different team #
GET /company/me/invitations List pending invitations #
POST /company/me/invitations Invite a member by email #
DELETE /company/me/invitations/{id} Cancel a pending invitation #
POST /company/invitations/accept Accept a company invitation #
GET /teams List your company's teams (org chart) #
POST /teams Create a team #
GET /teams/mine List teams you own or hold a position in #
GET /teams/assignable List the teams you can attach an agent to #
GET /teams/{id} Get team detail #
PUT /teams/{id} Update a team #
DELETE /teams/{id} Delete a team #
POST /teams/{id}/positions Add an org-chart position to a team #
PUT /teams/{id}/positions/{positionId} Update an org-chart position #
DELETE /teams/{id}/positions/{positionId} Delete an org-chart position #
GET /agent-drafts List the company's open agent drafts #
POST /agent-drafts Create an agent draft #
GET /agent-drafts/{id} Get an agent draft #
PATCH /agent-drafts/{id} Update an agent draft #
DELETE /agent-drafts/{id} Delete an agent draft for good #
POST /agent-drafts/{id}/submit Submit a draft for review (draft to in_review) #
POST /agent-drafts/{id}/review Check or uncheck a review step #
POST /agent-drafts/{id}/launch Launch a draft: create the agent it describes #
GET /floor/state Aggregated Agent Floor state (teams, agents, members) #
GET /knowledge/search Search the content of your company's knowledge (wiki pages, cards, projects, files, company context) #
GET /knowledge/items/{id} One knowledge item with its full text and its linked items #
GET /knowledge/items/{id}/download-url Signed download URL of the file behind a knowledge item #
GET /knowledge/tree Browse the knowledge as nested clusters (domains, subjects, groups, then items) #
POST /knowledge/exports Ask for a ZIP of markdown of the knowledge you can read (company, project or cluster) #
GET /knowledge/exports Your knowledge exports, most recent first #
GET /knowledge/exports/{id} Status of a knowledge export, with a download link once it is done #
GET /search Global search across your company (agents, teams, people, projects, cards, wiki pages, sessions, cron jobs, webhook endpoints, files, integrations) #
GET /floor/past-agents Completed agents of your company (« ghosts » mode) #
PUT /floor/layout Replace the stored floor arrangement #
DELETE /floor/layout Back to the automatic floor layout #
PATCH /floor/agents/{id}/position Move one agent on the floor #
PATCH /floor/members/{id}/position Move one member (human) on the floor #
PATCH /floor/teams/{id}/position Move a team platform on the floor #
POST /floor/agents/{id}/place Drop a not-yet-placed agent on a team #
GET /organization/chart The company org chart #
GET /organization/candidates Who may be named manager, or team lead #
PUT /organization/teams/{id}/lead Designate (or clear) a team lead #
PUT /organization/agents/{id}/manager Give an agent its own manager #
PUT /organization/members/{userId}/manager Give a person their manager #
PUT /organization/agents/{id}/team Move an agent to another team #
GET /projects List your company's projects #
POST /projects Create a project #
GET /projects/spaces List the spaces of your company #
POST /projects/spaces Create a space #
PATCH /projects/spaces/{id} Rename or reposition a space #
DELETE /projects/spaces/{id} Delete a space (its projects are kept) #
GET /projects/{id} Get a project in full #
PATCH /projects/{id} Update a project #
DELETE /projects/{id} Archive a project (never deletes) #
POST /projects/{id}/restore Reopen an archived project #
POST /projects/{id}/columns Add a column to a project's board #
PATCH /projects/{id}/columns/order Rewrite the board's column order #
PATCH /projects/{id}/columns/{columnId} Rename a column or change its kind #
DELETE /projects/{id}/columns/{columnId} Delete an empty column #
GET /projects/{id}/members List a project's participants #
POST /projects/{id}/members Add a human or an agent to a project #
PATCH /projects/{id}/members/{memberId} Change a participant's role on the project #
DELETE /projects/{id}/members/{memberId} Remove a participant from a project #
POST /projects/{projectId}/cards Add a card to a column #
PATCH /projects/{projectId}/cards/{cardId} Edit a card #
DELETE /projects/{projectId}/cards/{cardId} Archive a card (never deletes) #
PATCH /projects/{projectId}/cards/{cardId}/move Move a card to a column and a position #
POST /projects/{projectId}/cards/{cardId}/restore Bring an archived card back #
GET /projects/{projectId}/cards/archived List the archived cards of a project #
GET /projects/{projectId}/cards/{cardId}/comments Read a card's discussion #
POST /projects/{projectId}/cards/{cardId}/comments Comment on a card #
PATCH /projects/{projectId}/cards/{cardId}/comments/{commentId} Edit your own comment #
DELETE /projects/{projectId}/cards/{cardId}/comments/{commentId} Delete your own comment #
POST /projects/{projectId}/cards/{cardId}/comments/{commentId}/resolve Resolve or reopen a card comment thread #
GET /projects/{projectId}/cards/{cardId}/activity Read a card's history #
GET /projects/{projectId}/wiki/{pageId}/comments Read a wiki page's comments #
POST /projects/{projectId}/wiki/{pageId}/comments Comment on a wiki page #
PATCH /projects/{projectId}/wiki/{pageId}/comments/{commentId} Edit your own page comment #
DELETE /projects/{projectId}/wiki/{pageId}/comments/{commentId} Delete your own page comment #
POST /projects/{projectId}/wiki/{pageId}/comments/{commentId}/resolve Resolve or reopen a page comment thread #
GET /projects/{projectId}/wiki Read a project's wiki table of contents #
POST /projects/{projectId}/wiki Create a wiki page #
GET /projects/{projectId}/wiki/{pageId} Open a wiki page #
PATCH /projects/{projectId}/wiki/{pageId} Rename a wiki page and/or write a new revision #
DELETE /projects/{projectId}/wiki/{pageId} Delete a wiki page and everything under it #
PATCH /projects/{projectId}/wiki/{pageId}/move Re-file a wiki page in the table of contents #
GET /projects/{projectId}/assets List a project's assets #
POST /projects/{projectId}/assets Open the upload of a project asset #
PATCH /projects/{projectId}/assets/{assetId} Rename a project asset #
DELETE /projects/{projectId}/assets/{assetId} Delete a project asset #
GET /projects/{projectId}/wiki/{pageId}/revisions Page through a wiki page's history #
GET /projects/{projectId}/wiki/{pageId}/revisions/{revisionId} Read one revision's full text #
POST /projects/{projectId}/wiki/{pageId}/revisions/{revisionId}/restore Go back to an earlier version of a page #
GET /projects/{projectId}/wiki/suggestions List agents' suggestions on pages a person wrote #
POST /projects/{projectId}/wiki/suggestions/{suggestionId}/accept Accept an agent's suggestion #
POST /projects/{projectId}/wiki/suggestions/{suggestionId}/refuse Refuse an agent's suggestion #
GET /public/plans List active subscription plans (public pricing page) #
GET /public/credit-rate Get the public €→credits conversion rate #
GET /public/stats/agents Count the agents in production right now #
GET /public/integrations/catalog List available/coming-soon connectors, without a session #
GET /public/invitations/{token} Preview a company invitation #
POST /public/sign-in-method Which sign-in method an address uses (password or e-mail code) #
POST /public/newsletter Subscribe an email to the newsletter #
GET /public/newsletter/confirm Confirm a newsletter subscription (link of the double opt-in e-mail) #
GET /public/email-preferences/unsubscribe Unsubscribe from an optional-email family (the link in the footer) #
POST /public/email-preferences/unsubscribe RFC 8058 one-click unsubscribe #
POST /public/email-check Pre-flight check of a signup email #
GET /use-cases List published use cases #
GET /use-cases/{slug} Get a published use case #
GET /use-case-blueprints/{id} Get a use case deploy blueprint #
POST /use-case-blueprints/{id}/deploy Deploy a use case blueprint #
GET /integration-pages List published integration marketing pages #
GET /integration-pages/{slug} Get a published integration marketing page #
GET /integration-pages/{slug}/related-use-cases Published use cases that reference this integration #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/atako-ai:atako-api-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

atako-ai-api-openapi.json Raw ↑
{"openapi":"3.1.0","info":{"title":"Atako API","version":"0.1.0","description":"The Atako customer API — manage AI agents, their files, integrations, billing, and your company/team, programmatically.\n\n## Authentication\n\nEvery non-public endpoint takes a Bearer token that is either:\n- a **programmatic API key** (`aik_…`) — create one at [app.atako.ai](https://app.atako.ai) → Settings → API keys (company-admin only), or\n- a **Supabase session JWT** — what the web app itself sends; not practical to obtain outside a browser session.\n\n```bash\ncurl https://api.atako.ai/agents -H \"Authorization: Bearer aik_...\"\n```\n\nAn API key acts as its owning user, within the limits of the key:\n\n- **Scope** — a `read` key can only call GET operations (any other verb: `403 API_KEY_READ_ONLY`); a `write` key can call everything its user can, except the operations below.\n- **Forbidden to every key** — billing changes (every non-GET `/subscriptions/*`), minting agent tokens, listing or managing API keys (every `/users/api-keys` operation), deleting the account: `403 API_KEY_FORBIDDEN`. These need a signed-in user in the app.\n- **Expiry** — optional (30, 90 or 365 days); an expired key gets `401 API_KEY_EXPIRED`.\n\nEach operation carries `x-atako-api-key: read | write | forbidden` — the minimum key scope it needs, or `forbidden`.\n\n## Live events\n\n`GET /notifications/sse` and `GET /agents/{agentId}/events` are Server-Sent Events streams (`text/event-stream`), authenticated with the same Bearer header — an API key works.\n\n## Uploading a file\n\nTwo steps: `POST /client/files/nodes` then `POST /client/files/{nodeId}/upload-url` return a signed storage URL; `PUT` the raw bytes to it, then call `POST /client/files/{nodeId}/complete-upload`. Grant it to an agent with `POST /agents/{agentId}/file-grants`.\n\n## Other Atako HTTP surfaces (not covered by this spec)\n\n- **Atako MCP server** — `POST /mcp` (auth: same Bearer token as above) exposes the same capabilities as Model Context Protocol tools for AI clients (Claude Code, Claude Desktop, Cursor, ChatGPT), grouped in toolsets (`/mcp?toolsets=projects,agents`); a `read` key only gets read-only tools. See [docs.atako.ai/developers/mcp/overview](https://docs.atako.ai/developers/mcp/overview).\n- **Content API** (`cak_…` key, `/content/*`) — a separate, more restricted key type for headless CMS-style access to blog/news/use-case content. Not documented here.\n\n## Errors\n\nErrors use a JSON envelope: `{ \"error\": string, \"code\"?: string }`. `error` is either a short human-readable message or a SCREAMING_SNAKE_CASE code, depending on the route — treat it as an opaque string to match against, not a stable enum across the whole API.\n\n## Rate limits\n\nAuthenticated routes: 6000 requests/min per user (`authRateLimit`). Public GET routes: 60/min per IP. A handful of sensitive public POST routes (newsletter signup, signup email check, invitation preview) are limited to 10 requests / 15 min per IP.\n\n## Pagination\n\nList endpoints use either simple `limit`/`offset` query params (marketing content — a plain JSON array response, capped at the documented max) or `page`/`limit` (credit transactions). Neither returns a total count today; fetch until a page comes back shorter than `limit`."},"servers":[{"url":"https://api.atako.ai","description":"Production"}],"tags":[{"name":"Agents"},{"name":"Messages"},{"name":"Activity"},{"name":"Agent Options"},{"name":"API Keys"},{"name":"Files"},{"name":"Cron Jobs"},{"name":"Sub-Agents"},{"name":"Interagent Messages"},{"name":"Integrations"},{"name":"Subscriptions"},{"name":"Users"},{"name":"Company"},{"name":"Teams"},{"name":"Floor"},{"name":"Search"},{"name":"Notices"},{"name":"Organization"},{"name":"Projects"},{"name":"Notifications"},{"name":"Agent Shared Items"},{"name":"Agent Email"},{"name":"Agent Webhooks"},{"name":"Company Dashboard"},{"name":"LLM Provider Keys"},{"name":"Public"},{"name":"Marketing Content"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An `aik_…` programmatic API key (app.atako.ai → Settings → API keys) or a Supabase session JWT."}},"schemas":{"Error":{"type":"object","description":"Atako's standard error envelope. `error` is either a short human-readable message or a SCREAMING_SNAKE_CASE code (routes are inconsistent about which — treat it as an opaque string and match on it exactly if you need to branch on error type). Some routes add extra fields alongside `error` (see the operation's own error responses).","properties":{"error":{"type":"string"},"code":{"type":"string","description":"Present on some routes; a stable machine-readable code duplicating or refining `error`."}},"required":["error"],"additionalProperties":true},"LocalizedText":{"type":"object","description":"A French base value plus optional translations. `fr` is always present; other IETF locale keys are present when translated.","properties":{"fr":{"type":"string"},"en":{"type":"string"},"de":{"type":"string"},"es":{"type":"string"},"it":{"type":"string"},"pt-BR":{"type":"string"},"nl":{"type":"string"},"pl":{"type":"string"},"sv":{"type":"string"},"da":{"type":"string"},"tr":{"type":"string"},"ja":{"type":"string"},"ko":{"type":"string"}},"required":["fr"],"additionalProperties":{"type":"string"}},"LocalizedStringArray":{"type":"object","description":"Same shape as LocalizedText, but each locale holds a string array.","properties":{"fr":{"type":"array","items":{"type":"string"}}},"required":["fr"],"additionalProperties":{"type":"array","items":{"type":"string"}}},"AgentStatus":{"type":"string","enum":["active","completed","paused","provisioning","unresponsive","failed"]},"ActivitySummary":{"type":"object","nullable":true,"description":"In-memory working/idle snapshot for the agent, or null when nothing is tracked yet.","properties":{"working":{"type":"boolean"},"labelKey":{"type":"string"},"labelParams":{"type":"object","additionalProperties":{"type":"string"}}},"required":["working"]},"Agent":{"type":"object","description":"List-view agent summary, as returned by GET /agents.","properties":{"id":{"type":"string","format":"uuid"},"clientId":{"type":"string","format":"uuid"},"teamId":{"type":"string","format":"uuid","nullable":true},"teamName":{"type":"string","nullable":true},"scope":{"type":"string","enum":["personal","team"]},"access":{"type":"string","enum":["owner","team"]},"ownerName":{"type":"string"},"status":{"$ref":"#/components/schemas/AgentStatus"},"startDate":{"type":"string","format":"date-time"},"endDate":{"type":"string","format":"date-time","nullable":true},"name":{"type":"string"},"image":{"type":"string","description":"PNG filename under apps/web/public/aiygents/."},"engine":{"type":"string","enum":["openclaw","hermes","opencode"]},"lastMessage":{"type":"object","nullable":true,"description":"List-view preview only — content truncated to 280 chars server-side.","properties":{"role":{"type":"string"},"content":{"type":"string","maxLength":280},"timestamp":{"type":"string","format":"date-time"}}},"hasUnreadMessages":{"type":"boolean"},"activity":{"$ref":"#/components/schemas/ActivitySummary"}},"required":["id","clientId","scope","access","status","name","image","engine","hasUnreadMessages"]},"AgentDetail":{"type":"object","description":"Single-agent detail, as returned by GET /agents/{id}.","properties":{"id":{"type":"string","format":"uuid"},"clientId":{"type":"string","format":"uuid"},"clientName":{"type":"string"},"clientCompany":{"type":"string","nullable":true},"teamId":{"type":"string","format":"uuid","nullable":true},"teamName":{"type":"string","nullable":true},"scope":{"type":"string","enum":["personal","team"]},"access":{"type":"string","enum":["owner","team"]},"status":{"$ref":"#/components/schemas/AgentStatus"},"startDate":{"type":"string","format":"date-time"},"activatedAt":{"type":"string","format":"date-time","nullable":true},"endDate":{"type":"string","format":"date-time","nullable":true},"lastHeartbeatAt":{"type":"string","format":"date-time","nullable":true},"upgradingAt":{"type":"string","format":"date-time","nullable":true},"name":{"type":"string"},"image":{"type":"string"},"directModelId":{"type":"string","nullable":true,"description":"Raw model id for a direct-provider (BYOK openai/anthropic) agent; null for an OpenRouter-catalogue agent."},"modelName":{"type":"string","nullable":true,"description":"Display name of the agent's OpenRouter-catalogue model (ai_models.name); null for a direct-provider agent (see directModelId) or an agent left on the platform default."},"harnessName":{"type":"string","nullable":true,"description":"Display name of the agent's harness (harnesses.name); null when no harness was picked at creation — the runtime `engine` below is then the only harness."},"engine":{"type":"string","enum":["openclaw","hermes","opencode"]},"engineVersion":{"type":"string","nullable":true},"engineRequestedVersion":{"type":"string","nullable":true},"machineLost":{"type":"boolean"},"activity":{"$ref":"#/components/schemas/ActivitySummary"},"mission":{"type":"string","nullable":true,"description":"The agent's mission (1–3 sentences). Present only when the caller can administer the agent (`canManage`)."},"systemPrompt":{"type":"string","nullable":true,"description":"The agent's raw instructions. Present only when the caller can administer the agent."},"clientContext":{"type":"string","nullable":true,"description":"Per-agent business context. Present only when the caller can administer the agent."}},"required":["id","clientId","scope","access","status","name","image","engine","machineLost"]},"AgentRecord":{"type":"object","description":"The raw `agents` table row, returned verbatim by POST /agents (201) and POST /agents/{id}/end (200, under `.session`). Every column, including several operational/internal fields not otherwise exposed.","properties":{"id":{"type":"string","format":"uuid"},"clientId":{"type":"string","format":"uuid"},"teamId":{"type":"string","format":"uuid","nullable":true},"companyId":{"type":"string","format":"uuid","nullable":true},"name":{"type":"string"},"image":{"type":"string"},"systemPrompt":{"type":"string","nullable":true,"description":"Raw user instructions (no business context appended)."},"mission":{"type":"string","nullable":true},"profileUpdatedAt":{"type":"string","format":"date-time"},"modelId":{"type":"string","format":"uuid","nullable":true},"directModelId":{"type":"string","nullable":true},"modelConfig":{"type":"object","nullable":true,"description":"Per-task-type model overrides.","properties":{"vision":{"type":"string","nullable":true},"low_effort":{"type":"string","nullable":true},"medium_effort":{"type":"string","nullable":true},"high_effort":{"type":"string","nullable":true}}},"llmKeyId":{"type":"string","format":"uuid","nullable":true,"description":"Set for a BYOK agent (company LLM provider key); null for the platform key."},"harnessId":{"type":"string","format":"uuid","nullable":true},"engine":{"type":"string","enum":["openclaw","hermes","opencode"]},"status":{"$ref":"#/components/schemas/AgentStatus"},"agentAuthTokenHash":{"type":"string","nullable":true},"agentAuthIssuedAt":{"type":"string","format":"date-time","nullable":true},"agentAuthLastUsedAt":{"type":"string","format":"date-time","nullable":true},"startDate":{"type":"string","format":"date-time"},"activatedAt":{"type":"string","format":"date-time","nullable":true},"endDate":{"type":"string","format":"date-time","nullable":true},"lastHeartbeatAt":{"type":"string","format":"date-time","nullable":true},"lastReadAt":{"type":"string","format":"date-time","nullable":true},"engineVersion":{"type":"string","nullable":true},"engineImage":{"type":"string","nullable":true},"engineRequestedVersion":{"type":"string","nullable":true},"upgradingAt":{"type":"string","format":"date-time","nullable":true},"upgradeRequestedAt":{"type":"string","format":"date-time","nullable":true},"upgradeStatus":{"type":"string","enum":["requested","running","succeeded","failed"],"nullable":true},"upgradeError":{"type":"string","nullable":true},"provisioningError":{"type":"string","nullable":true},"pausedAt":{"type":"string","format":"date-time","nullable":true},"pausedReason":{"type":"string","nullable":true},"clientContext":{"type":"string","nullable":true,"description":"Per-agent \"contexte business\" free text."},"createdAt":{"type":"string","format":"date-time"}},"required":["id","clientId","name","image","engine","status","startDate","createdAt"]},"CreateAgentBody":{"type":"object","required":["name","image"],"properties":{"name":{"type":"string","minLength":1},"image":{"type":"string","description":"PNG filename under apps/web/public/aiygents/."},"finish":{"type":"string","nullable":true,"enum":["carbone","chrome-studio","titane","candy","nacre-ormeau","velours","ceramique","marbre","terrazzo","cuir","jade","maille","mercure","lave","eau","glace","malachite","labradorite","calacatta","noyer","soie","ecailles"],"description":"The 3D body finish (the user-facing « skin »). Absent or null = carbone; unknown → 400 FINISH_INVALID."},"mission":{"type":"string","nullable":true,"maxLength":20000,"description":"The agent's mission in 1–3 sentences, trimmed."},"systemPrompt":{"type":"string","nullable":true,"maxLength":20000,"description":"Free-text agent instructions, trimmed. Stored and sent to the orchestrator as-is (no business context appended)."},"clientContext":{"type":"string","nullable":true,"maxLength":20000,"description":"Free-text per-agent business context, trimmed. Kept in its own column."},"modelId":{"type":"string","description":"Either an `ai_models` UUID (from GET /models or `aiModelId` in GET /models/catalog) or a raw OpenRouter slug (`slug` in GET /models/catalog, e.g. \"mistralai/mistral-small\"). A slug unknown to the catalog is rejected with 400. Omitted → admin-declared default model. With a direct-provider BYOK key (openai/anthropic), this is instead the provider's own model id.","example":"anthropic/claude-sonnet-4"},"harnessId":{"type":"string","format":"uuid","description":"From GET /harnesses."},"teamId":{"type":"string","format":"uuid","nullable":true,"description":"Assigns the agent to a shared team instead of keeping it personal."},"modelConfig":{"type":"object","description":"Per-task-type model overrides, forwarded to the orchestrator webhook.","properties":{"vision":{"type":"string","nullable":true},"low_effort":{"type":"string","nullable":true},"medium_effort":{"type":"string","nullable":true},"high_effort":{"type":"string","nullable":true}}},"engine":{"type":"string","enum":["openclaw","hermes","opencode"],"description":"Defaults to the platform default engine (hermes). `opencode` additionally requires `allowedRepos`."},"allowedRepos":{"type":"array","items":{"type":"string"},"description":"Repositories (`owner/repo`) the agent may work on. REQUIRED (≥1) for `engine: opencode`, which also requires an active company GitHub connection; ignored by the other engines."},"llmKeyId":{"type":"string","format":"uuid","description":"BYOK: id of a company LLM provider key (see docs — BYOK key management is not part of this customer API cut)."}}},"UpgradeStatus":{"type":"object","properties":{"available":{"type":"boolean","description":"True only when `target` is strictly semver-newer than `current`."},"current":{"type":"string","nullable":true},"target":{"type":"string","nullable":true},"upgrading":{"type":"boolean"},"upgradeStatus":{"type":"string","enum":["requested","running","succeeded","failed"],"nullable":true},"upgradeError":{"type":"string","nullable":true}},"required":["available","upgrading"]},"AiModel":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"modelId":{"type":"string","description":"OpenRouter-style model id, e.g. \"openai/gpt-4-turbo\"."},"name":{"type":"string"},"logoUrl":{"type":"string","nullable":true},"termsUrl":{"type":"string","nullable":true},"visible":{"type":"boolean"},"taskTypes":{"type":"array","items":{"type":"string"}},"contextLength":{"type":"integer","nullable":true},"isFree":{"type":"boolean"},"isDefault":{"type":"boolean"},"recommendedFor":{"type":"array","items":{"type":"string"},"description":"Task types this model is the admin-curated recommendation for (e.g. 'vision', 'low_effort')."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","modelId","name","visible"]},"CatalogModel":{"type":"object","required":["slug","name","provider","providerLabel","suggested","isDefault"],"properties":{"slug":{"type":"string","description":"OpenRouter model id, e.g. \"anthropic/claude-sonnet-4\"."},"name":{"type":"string","description":"OpenRouter display name, e.g. \"Anthropic: Claude Sonnet 4\"."},"provider":{"type":"string","description":"Slug prefix before '/'."},"providerLabel":{"type":"string","description":"Human label — the name prefix before ':', else the capitalized provider."},"description":{"type":"string","nullable":true},"contextLength":{"type":"integer","nullable":true,"description":"No provider pricing is exposed to clients: Atako sells inference at its own rate."},"suggested":{"type":"boolean","description":"Recommended by Atako (`ai_models.visible`)."},"isDefault":{"type":"boolean","description":"Preselected when the client picks nothing."},"aiModelId":{"type":"string","format":"uuid","nullable":true,"description":"Catalog row id, present once anyone launched an agent on this model."}}},"RecentModel":{"type":"object","required":["slug","name","lastUsedAt"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"lastUsedAt":{"type":"string","format":"date-time","description":"Creation date of the most recent company agent using this model."}}},"Harness":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"logoUrl":{"type":"string","nullable":true},"termsUrl":{"type":"string","nullable":true},"visible":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","name","visible"]},"Conversation":{"type":"object","description":"One chat session between the caller and an agent. A user may hold several; see docs/specs/agent-sessions.md.","properties":{"id":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"key":{"type":"string","description":"Opaque engine-side key of this thread — the bare user id for the historical thread, `chat:<conversationId>` for every session created since. Read-only."},"title":{"type":"string","nullable":true,"description":"Derived from the first user message when not set explicitly."},"meta":{"type":"object","additionalProperties":true,"description":"Free-form per-session payload."},"archived":{"type":"boolean"},"unreadCount":{"type":"integer","description":"Agent messages newer than this session's read cursor."},"lastReadAt":{"type":"string","format":"date-time","nullable":true},"lastMessageAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","agentId","key","title","archived","unreadCount","createdAt"]},"Message":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"conversationId":{"type":"string","format":"uuid","description":"Session this message belongs to."},"role":{"type":"string","enum":["user","agent"]},"content":{"type":"string"},"meta":{"type":"object","additionalProperties":true},"flaggedAsError":{"type":"boolean","description":"Deprecated — see `feedback`."},"deliveryState":{"type":"string"},"feedback":{"type":"string","enum":["up","down"],"description":"The caller's thumbs up/down on this agent reply, if any."},"timestamp":{"type":"string","format":"date-time"}},"required":["id","agentId","role","content","timestamp"]},"ActivityEvent":{"type":"object","description":"One entry of the live-activity feed (GET /agents/{agentId}/activity).","properties":{"id":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"eventId":{"type":"string"},"seq":{"type":"number"},"ts":{"type":"string","format":"date-time"},"origin":{"type":"object","description":"Discriminated on `kind`: 'chat' | 'cron' | 'subagent' | 'system' | 'email' | 'webhook' | 'interagent', each with kind-specific extra fields (conversationKey, cronJobId, subAgentId, threadId, endpointId, contextId, …).","properties":{"kind":{"type":"string","enum":["chat","cron","subagent","system","email","webhook","interagent"]}},"required":["kind"],"additionalProperties":true},"conversationId":{"type":"string","format":"uuid","description":"Chat-origin events only: the session this event belongs to. Absent on agent-wide origins (cron/subagent/system/email/webhook/interagent)."},"turnId":{"type":"string"},"type":{"type":"string","enum":["turn.started","turn.finished","thinking.step","tool.started","tool.finished","plan.updated","subagent.started","subagent.finished","integration.call","llm_call"]},"category":{"type":"string","enum":["web","files","memory","code","integration","planning","delegation","llm","other"]},"labelKey":{"type":"string"},"labelParams":{"type":"object","additionalProperties":{"type":"string"}},"status":{"type":"string","enum":["running","ok","error"]},"durationMs":{"type":"number"},"detail":{"type":"object","description":"Event-type-specific extra data (tool name/args/result previews, token counts, todos, integration call info, error message, …).","additionalProperties":true}},"required":["id","agentId","eventId","seq","ts","type","labelKey"]},"ActivityState":{"type":"object","properties":{"working":{"type":"boolean"},"labelKey":{"type":"string"},"labelParams":{"type":"object","additionalProperties":{"type":"string"}},"since":{"type":"string","format":"date-time"},"lastPlan":{"type":"object","properties":{"todos":{"type":"array","items":{"type":"object","properties":{"content":{"type":"string"},"status":{"type":"string"}}}},"ts":{"type":"string","format":"date-time"}}},"queued":{"type":"object","nullable":true,"description":"Message of the requested conversation (`?conversationId=`) queued behind a background turn; null otherwise.","properties":{"agentId":{"type":"string","format":"uuid"},"conversationId":{"type":"string","format":"uuid"},"messageId":{"type":"string","format":"uuid"},"busy":{"type":"object","properties":{"kind":{"type":"string","enum":["interagent","cron","internal","email","webhook","chat","subagent","system"]},"peerAgentId":{"type":"string","format":"uuid"},"peerName":{"type":"string"},"since":{"type":"string","format":"date-time"}},"required":["kind","since"]}}}},"required":["working","since"]},"FileNode":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"clientId":{"type":"string","format":"uuid"},"parentId":{"type":"string","format":"uuid","nullable":true},"type":{"type":"string","enum":["folder","file"]},"name":{"type":"string"},"storagePath":{"type":"string","nullable":true},"mimeType":{"type":"string","nullable":true},"fileSize":{"type":"integer","nullable":true},"agentTag":{"type":"string","format":"uuid","nullable":true},"uploadSource":{"type":"string","enum":["client","agent"],"nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","clientId","type","name","createdAt"]},"SignedDownloadUrl":{"type":"object","properties":{"signedUrl":{"type":"string","format":"uri"},"expiresIn":{"type":"integer","description":"Seconds; 3600."}},"required":["signedUrl","expiresIn"]},"SignedUploadUrl":{"type":"object","properties":{"signedUrl":{"type":"string","format":"uri"},"storagePath":{"type":"string"},"token":{"type":"string"}},"required":["signedUrl","storagePath","token"]},"FileGrant":{"type":"object","description":"A client file/folder granted to an agent (GET/POST /agents/{agentId}/file-grants).","properties":{"id":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"nodeId":{"type":"string","format":"uuid"},"grantedBy":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"node":{"type":"object","description":"Only present on the list endpoint (joined).","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"type":{"type":"string","enum":["folder","file"]},"storagePath":{"type":"string","nullable":true},"mimeType":{"type":"string","nullable":true},"fileSize":{"type":"integer","nullable":true},"parentId":{"type":"string","format":"uuid","nullable":true},"agentTag":{"type":"string","format":"uuid","nullable":true},"uploadSource":{"type":"string","enum":["client","agent"],"nullable":true}}}},"required":["id","agentId","nodeId","createdAt"]},"DedicatedFolderResult":{"type":"object","properties":{"folder":{"$ref":"#/components/schemas/FileNode"},"grant":{"allOf":[{"$ref":"#/components/schemas/FileGrant"}],"nullable":true},"existing":{"type":"boolean"}},"required":["folder","existing"]},"CronExecution":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"cronJobId":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["running","success","failed"]},"startedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":"string","format":"date-time","nullable":true},"durationMs":{"type":"integer","nullable":true},"error":{"type":"string","nullable":true},"output":{"type":"string","nullable":true,"description":"Execution content (F1.1, agent-cron-channel). Always null on GET /agents/{agentId}/cron-jobs (perf(projects-cron), PLAN-perf.md E3) — read it via GET /agents/{agentId}/cron-jobs/{jobId}/executions/{executionId} instead."},"outputPreview":{"type":"string","nullable":true,"description":"Truncated preview of execution content (max 280 chars) for list display only. Not returned on other endpoints."},"summary":{"type":"string","nullable":true},"businessState":{"type":"string","enum":["ok","failed"],"nullable":true},"noChange":{"type":"boolean","description":"Monitor-mode run where nothing changed (successful, no output). Never posted to the chat."},"createdAt":{"type":"string","format":"date-time"}},"required":["id","cronJobId","state","startedAt"]},"CronExecutionOutput":{"type":"object","description":"One execution's full output, read on demand (perf(projects-cron), PLAN-perf.md E3).","properties":{"id":{"type":"string","format":"uuid"},"output":{"type":"string","nullable":true}},"required":["id","output"]},"CronJob":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"prompt":{"type":"string"},"schedule":{"type":"string","description":"Cron expression (or a deterministic \"once at <ts>\" one-shot)."},"nextRunAt":{"type":"string","format":"date-time","nullable":true},"lastRunAt":{"type":"string","format":"date-time","nullable":true},"lastRunState":{"type":"string","enum":["running","success","failed"],"nullable":true},"enabled":{"type":"boolean"},"timezone":{"type":"string","nullable":true},"repeatTimes":{"type":"integer","nullable":true,"description":"Total planned runs reported by the engine; null = infinite or unknown. A success of a job with a finite count is also posted to the owner's conversation."},"paused":{"type":"boolean","description":"Job paused engine-side."},"pausedReason":{"type":"string","nullable":true},"mode":{"type":"string","enum":["agent","monitor"],"description":"monitor = watch job, silent while nothing changes."},"continuity":{"type":"boolean","description":"Session continuity between runs."},"reasoningEffort":{"type":"string","nullable":true},"archivedAt":{"type":"string","format":"date-time","nullable":true},"stoppedAt":{"type":"string","format":"date-time","nullable":true,"description":"Stopped from the UI (POST .../stop). A stopped job is always archived and disabled."},"stoppedBy":{"type":"string","format":"uuid","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"executions":{"type":"array","description":"Up to 20 most recent executions.","items":{"$ref":"#/components/schemas/CronExecution"}}},"required":["id","agentId","title","prompt","schedule","enabled","createdAt"]},"CronJobsResponse":{"type":"object","properties":{"channelEnabled":{"type":"boolean","description":"AGENT_CRON_CHANNEL_ENABLED."},"canManage":{"type":"boolean","description":"The caller may stop a job (owner or company admin)."},"jobs":{"type":"array","items":{"$ref":"#/components/schemas/CronJob"}}},"required":["channelEnabled","jobs"]},"SubAgent":{"type":"object","description":"Deduplicated by name (case-insensitive) — most recent run per logical sub-agent.","properties":{"id":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"engineId":{"type":"string"},"name":{"type":"string"},"model":{"type":"string","nullable":true},"status":{"type":"string","enum":["queued","running","succeeded","failed","timed_out","cancelled"]},"startedAt":{"type":"string","format":"date-time","nullable":true},"durationMs":{"type":"integer","nullable":true,"description":"Hermes only."},"toolCalls":{"type":"integer","nullable":true,"description":"Hermes only."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","agentId","engineId","name","status"]},"InteragentMessageListItem":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"direction":{"type":"string","enum":["sent","received"]},"peerAgentId":{"type":"string","format":"uuid"},"peerAgentName":{"type":"string"},"peerAgentImage":{"type":"string"},"subject":{"type":"string","nullable":true},"bodyPreview":{"type":"string","maxLength":300},"deliveryState":{"type":"string","enum":["pending_agent","delivered"]},"contextId":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"hopCount":{"type":"integer"},"replyToId":{"type":"string","format":"uuid","nullable":true}},"required":["id","direction","peerAgentId","deliveryState","contextId","createdAt"]},"InteragentMessageDetail":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"fromAgentId":{"type":"string","format":"uuid"},"fromAgentName":{"type":"string"},"toAgentId":{"type":"string","format":"uuid"},"toAgentName":{"type":"string"},"subject":{"type":"string","nullable":true},"body":{"type":"string"},"payload":{"description":"Arbitrary jsonb, nullable.","nullable":true},"processingNote":{"type":"string","nullable":true},"deliveryState":{"type":"string","enum":["pending_agent","delivered"]},"contextId":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"deliveredToAgentAt":{"type":"string","format":"date-time","nullable":true},"hopCount":{"type":"integer"},"replyToId":{"type":"string","format":"uuid","nullable":true}},"required":["id","fromAgentId","toAgentId","body","deliveryState","contextId","createdAt"]},"IntegrationCatalogEntry":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"authType":{"type":"string","enum":["api_key","oauth2","mcp","internal"]},"baseUrl":{"type":"string"},"logo":{"type":"string"},"description":{"type":"string","nullable":true},"docsUrl":{"type":"string","nullable":true},"keyHelp":{"type":"string","nullable":true},"secretLabel":{"type":"string","nullable":true},"configFields":{"type":"array","description":"Connector-defined config field descriptors.","items":{"type":"object","additionalProperties":true}},"oauthConfigured":{"type":"boolean","nullable":true},"apiKeyAlt":{"type":"boolean"},"oauthSkipsConfig":{"type":"boolean"},"availability":{"type":"string","enum":["available","coming_soon"]},"companyWide":{"type":"boolean","description":"Native platform capability (e.g. 'projects'): its connection is a company-wide singleton, resolved lazily wherever needed — never manually connected."},"defaultGranted":{"type":"boolean","description":"Paired with companyWide: every agent of the company holds a virtual full grant on this connection until an explicit grant row (opt-out or adjustment) exists — see IntegrationGrant.isDefault."},"nonDeletable":{"type":"boolean","description":"The connection can't be disconnected — DELETE /integrations/connections/{id} refuses with connection_not_deletable."},"actions":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"scope":{"type":"string"},"description":{"type":"string"}}}}},"required":["key","name","authType","availability"]},"IntegrationConnection":{"type":"object","description":"Never

# --- truncated at 32 KB (571 KB total) ---
# Full source: https://artifacts.apis.io/atako-ai/openapi/_original/atako-ai-api-openapi.json