post_api_projects_id_automation_setup
const url = 'https://example.com/api/projects/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/automation/setup';const options = { method: 'POST', headers: { cookie: 'supacloud_session=<supacloud_session>', 'Content-Type': 'application/json' }, body: '{"auto_developer_enabled":true,"git_credential_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","git_default_branch":"example","git_provider":"example","git_repo_url":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/api/projects/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/automation/setup \ --header 'Content-Type: application/json' \ --cookie supacloud_session=<supacloud_session> \ --data '{ "auto_developer_enabled": true, "git_credential_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "git_default_branch": "example", "git_provider": "example", "git_repo_url": "example" }'Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Project id
Request Bodyrequired
Section titled “Request Bodyrequired”object
Examplegenerated
{ "auto_developer_enabled": true, "git_credential_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "git_default_branch": "example", "git_provider": "example", "git_repo_url": "example"}Responses
Section titled “Responses”Automation configured successfully
object
object
D1 — materialized Auto Developer workflow id.
ADR 0045 §3.1 Stage 4 — OPTIONAL project autonomy override (mig 214, nullable
SMALLINT). None = inherit the workspace level (the precedence chain resolves
the first non-null). #[serde(default)] keeps pre-214 rows readable.
ADR 0045 §3.1 — per-axis Advanced override vector (mig 214, JSONB NOT NULL DEFAULT '{}'). Empty {} = no per-axis override.
'llm' (default) or 'rules' — how items are classified/prioritized.
Timestamp of the last successful scan; None until the first sweep.
Per-sweep daily budget cap in USD; None leaves only the workspace cap.
Per-sweep fan-out bound. None → falls back to max_concurrent_runs.
'pr_only' (default) | 'auto_on_green' | 'full_auto' (D5).
Kill-switch: the ticker skips a project whose flag is false.
N human approvals required on the in_review → done/merge step (D5).
#712 (ADR 0049) — the SPARSE standard-closeout override (mig 283, nullable
JSONB). None (SQL NULL) = inherit the workspace default entirely; an object
overrides only the steps it names (per-step first-non-null vs the workspace).
Parsed defensively via [crate::models::closeout::CloseoutConfigPatch::parse].
#[serde(default)] keeps any non-SELECT * deserialize path readable. #708 S4 types
the schema interior via CloseoutConfigPatch (was an opaque unknown).
object
Gates the Tier-0 closeout MEMORY proposal. None inherits the next tier.
#708 M5 (mig 296) — the project-TOTAL daily/monthly $-budget caps that AND-gate
EVERY task launch (not just backlog dispatch) under the workspace budget. None
leaves only the workspace cap. FromRow auto-maps them from SELECT *.
ADR 0045 Stage 1b — per-project blast-radius tool denylist (mig 210,
TEXT[] NOT NULL DEFAULT '{}'). #[serde(default)] so pre-209 rows (and any
Deserialize path without the field) read as [].
ADR 0029 — tracker provider/key, OAuth credential and state-name overrides.
ADR 0029 Slice 7 — tracker auto-developer toggle + webhook HMAC secret.
Issue #110: per-project concurrency cap. None = unlimited.
#708 W13 (ADR 0061) — the SPARSE per-project memory-governance override (mig 289,
nullable JSONB). None (SQL NULL) = inherit the workspace policy entirely; an
object overrides only the memory scopes it names (folded per-scope over the
workspace via effective_memory_governance). #[serde(default)] keeps any
non-SELECT * deserialize path readable.
ADR 0046 RUNG 1b — OPTIONAL project worker-group affinity override (mig 227,
nullable UUID[]). None = inherit (the column was NULL — contributes nothing
to the first-non-null profile->project->task chain); Some(vec![]) = an explicit
“no affinity from this source”. Resolved into the task’s required_labels by
services::runners::groups. #[serde(default)] keeps pre-227 rows readable.
Examplegenerated
{ "enabled_events": [ "example" ], "project": { "auto_developer_workflow_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "autonomy_level": 1, "autonomy_overrides": "example", "backlog_classifier": "example", "backlog_cursor_at": "2026-04-15T12:00:00Z", "backlog_daily_budget_usd": 1, "backlog_max_concurrent": 1, "backlog_merge_policy": "example", "backlog_mode_enabled": true, "backlog_required_reviewers": 1, "closeout_config": { "memory": true, "project_docs": { "condition": "example", "enabled": true, "globs": [ "example" ] }, "user_docs": { "condition": "example", "enabled": true, "globs": [ "example" ], "langs": [ "example" ] }, "wiki": { "condition": "example", "enabled": true } }, "created_at": "2026-04-15T12:00:00Z", "daily_budget_usd": 1, "denied_tools": [ "example" ], "detected_stack": "example", "git_credential_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "git_default_branch": "example", "git_provider": "example", "git_repo_url": "example", "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "image_built_at": "2026-04-15T12:00:00Z", "image_config": "example", "image_error": "example", "image_size": 1, "image_status": "example", "image_tag": "example", "issue_tracker": "example", "issue_tracker_autodev_enabled": true, "issue_tracker_credential_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "issue_tracker_key": "example", "issue_tracker_state_map": "example", "max_concurrent_runs": 1, "memory_governance_policy": "example", "monthly_budget_usd": 1, "name": "example", "required_worker_group_ids": [ "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" ], "user_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "workspace_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" }, "webhook_configured": true, "webhook_url": "example"}Structured client error
The canonical JSON body of every error response — the single source of truth
the frontend binds to. Every AppError serializes as this exact shape, and
the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is
what the frontend error schema is generated from, so there is no hand-written
error schema on either end.
object
Machine-readable, stable error code.
Present only on a quota-exceeded 403 — the inline upgrade-CTA payload.
object
The entitlement feature key that was hit, e.g. apps.max_count.
The plan’s limit for this key.
Where to send the user to upgrade.
Current usage (count or bytes, per the key).
Human-readable message (the server’s English text; the client may localize
by code).
Example
{ "code": "not_found"}Authentication required
The canonical JSON body of every error response — the single source of truth
the frontend binds to. Every AppError serializes as this exact shape, and
the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is
what the frontend error schema is generated from, so there is no hand-written
error schema on either end.
object
Machine-readable, stable error code.
Present only on a quota-exceeded 403 — the inline upgrade-CTA payload.
object
The entitlement feature key that was hit, e.g. apps.max_count.
The plan’s limit for this key.
Where to send the user to upgrade.
Current usage (count or bytes, per the key).
Human-readable message (the server’s English text; the client may localize
by code).
Example
{ "code": "not_found"}Permission denied
The canonical JSON body of every error response — the single source of truth
the frontend binds to. Every AppError serializes as this exact shape, and
the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is
what the frontend error schema is generated from, so there is no hand-written
error schema on either end.
object
Machine-readable, stable error code.
Present only on a quota-exceeded 403 — the inline upgrade-CTA payload.
object
The entitlement feature key that was hit, e.g. apps.max_count.
The plan’s limit for this key.
Where to send the user to upgrade.
Current usage (count or bytes, per the key).
Human-readable message (the server’s English text; the client may localize
by code).
Example
{ "code": "not_found"}Structured server error
The canonical JSON body of every error response — the single source of truth
the frontend binds to. Every AppError serializes as this exact shape, and
the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is
what the frontend error schema is generated from, so there is no hand-written
error schema on either end.
object
Machine-readable, stable error code.
Present only on a quota-exceeded 403 — the inline upgrade-CTA payload.
object
The entitlement feature key that was hit, e.g. apps.max_count.
The plan’s limit for this key.
Where to send the user to upgrade.
Current usage (count or bytes, per the key).
Human-readable message (the server’s English text; the client may localize
by code).
Example
{ "code": "not_found"}