Enable or disable AI, or change the model or draft language, without touching credentials
const url = 'https://beta-api.plune.ai/v1/settings/ai';const options = { method: 'PATCH', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"enabled":false}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PATCH \ --url https://beta-api.plune.ai/v1/settings/ai \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "enabled": false }'Owner only. Disabling keeps the credentials for a later re-enable (AC-20); a draft already awaiting_decision is unaffected either way (AC-20) — new requests are what gets refused while AI is off (AC-07). Re-enabling with no prior connect (no row yet) answers 409: PUT connects first. model and language change independently of credentials, per SCR-03’s “choose model” being its own action, separate from “replace credentials”.
Authorizations
Section titled “Authorizations ”Request Body required
Section titled “Request Body required ”No credentials here — replacing them is PUT, removing them is DELETE .../credentials.
object
Same rules as AiSettingsConnect.model.
Examples
{ "enabled": false}{ "model": "claude-opus-5-5"}Responses
Section titled “ Responses ”Updated — the owner view
What an owner reads — AiSettingsStatus plus AC-05/AC-09/AC-15. Never includes the credentials themselves (AC-12).
object
Whether a provider has ever been connected (an ai_settings row exists).
Present exactly when configured is true.
Present exactly when configured is true.
Present when provider is custom.
Draft language, default en (AC-05) — a project setting, not the reader’s interface language.
Present exactly when configured is true (AC-05, AC-12 — “коли й ким”, never the value).
userId of the owner who last connected or replaced credentials.
AC-09 — the most recent provider issue, if any; null otherwise. Never aborted-shaped: a timeout is not a provider failure.
Present exactly when configured is true.
object
Calendar month, UTC.
object
object
Sum of costUsd over calls whose model had a known price at call time.
Count of calls whose tokens the provider reported but whose model has no price — “ціна невідома” — never folded into knownUsd as zero (SAD §8 rule 6). A call that reported no tokens (a timeout, a rejected key) has nothing to price and is counted in calls, not here.
GET, owner only (#896): the model the platform recommends for each provider it lists — none for custom, whose owner names the model. The connect form offers it first; always a model with a known price (AC-15).
object
GET, owner only (#898): the models the connect form lets the owner choose from for each provider the platform lists — the ones it has a price for, the recommended first, each with that price. None for custom. A model that is not listed is still allowed (model is free text): the list is a help, not a gate.
object
One model the connect form lists (#898): the id as a provider writes it and what the platform’s own price table charges for it, per million tokens (AC-15).
object
USD for a million input tokens.
USD for a million output tokens.
One model the connect form lists (#898): the id as a provider writes it and what the platform’s own price table charges for it, per million tokens (AC-15).
object
USD for a million input tokens.
USD for a million output tokens.
Example
{ "provider": "anthropic", "lastIssueKind": "key_rejected", "models": { "anthropic": [ { "id": "claude-sonnet-4-5", "inputUsdPerMillion": 3, "outputUsdPerMillion": 15 } ], "openrouter": [ { "id": "claude-sonnet-4-5", "inputUsdPerMillion": 3, "outputUsdPerMillion": 15 } ] }}Empty body, or an unknown field
object
Example generated
{ "error": "example"}No / invalid token or session
A member or a reader asked
object
Example
{ "error": "project owner only"}No provider connected yet — PUT first
object
Example
{ "error": "AI is not connected yet — connect a provider first"}Rate-limited: either the per-route throttle or a tenant quota. Retry-After carries the seconds until the window rolls over.
object
Example generated
{ "error": "example"}Headers
Section titled “Headers ”Seconds until the window rolls over