---
title: "Submit Studio Opportunity"
method: POST
path: "/studio/opportunities/submit"
tags: ["AI_STUDIO", "OPPORTUNITIES"]
---

# Submit Studio Opportunity

`POST /studio/opportunities/submit`

Publish a Studio → User opportunity from an editable draft (AI-7498).

This is the SOLE publish path: the agent only proposes a draft, and this
endpoint runs the full server-side gate pipeline before inserting into the
ClickHouse opportunity tables. Gate failures come back as HTTP 422 with
per-field ``{code, message}`` so the FE surfaces them inline on the form.

## Query parameters

- `navigationSource` string, nullable

## Request body

- SubmitStudioOpportunityRequest — Body for the explicit publish path (``POST /studio/opportunities/submit``). The agent no longer auto-publishes: it emits an editable ``OpportunityFinding`` draft, the user corrects it, and this request publishes it. ``turn_uuid`` is optional — a Mode B (direct-add) finding has no analysis turn to anchor to.
  - `session_id` string, required
  - `turn_uuid` string, nullable
  - `finding` OpportunityFinding, required — A draft finding — the fields a real opportunity carries. Mirrors the tissues cost_savings_ops shape a published opportunity actually stores: a title, a description, the target resource(s), a monthly savings estimate, an effort level, and the Issue/Goal/Context ``agent_instructions`` markdown shown in the opportunity detail's "Agent Instructions" tab.
    - `opportunity_id` string
    - `title` string, required
    - `description` string
    - `resource_name` string
    - `resources` FindingResource[]
      - `resource_name` string, required
      - `resource_type` string, required
      - `resource_uri` string
      - `resource_id` string
      - `workspace_id` string
      - `instance_id` integer, nullable
      - `verified` boolean
    - `estimated_savings_usd_per_month` number
    - `effort` 'low' | 'medium' | 'high'
    - `agent_instructions` string
  - `allow_update` boolean

## Response `200`

Successful Response

- CreateStudioOpportunityResponse
  - `opportunity_id` string, required
  - `instance_id` integer, required
  - `already_existed` boolean

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/myaltimate/apis/fastapi.md) · [All operations](https://skmtc.net/myaltimate/apis/fastapi/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/myaltimate/fastapi/versions/103580dad816/schema)
