---
title: "Read-only optimizer workflow: save_plan"
method: POST
path: "/workflow/save_plan"
---

# Read-only optimizer workflow: save_plan

`POST /workflow/save_plan`

## Request

- Base URL: `https://api.gravityads.dev` (the document declares no server; this is the origin it was published from)
- URL: `https://api.gravityads.dev/workflow/save_plan`
- Auth: HTTP bearer

## Request body

- object
  - `run_id` string, required
  - `revision` integer, required
  - `plan` union, required
    - union
      - Local3QuarterlyPlan
        - `period_start` string, required
        - `period_end` string, required
        - `kind` 'quarterly', required
        - `objective` string, required
        - `currency` string, required
        - `scenarios` Local3Scenario[], required
          - `name` 'conservative' | 'base' | 'ambitious', required
          - `budget` number, required
          - `assumptions` string, required
          - `capacity` string, required
          - `worst_case` string, required
        - `channels` Local3ChannelRole[], required
          - `platform` 'google' | 'meta' | 'microsoft' | 'tiktok' | 'amazon' | 'linkedin' | 'pinterest' | 'openai', required
          - `role` 'acquisition' | 'remarketing' | 'brand' | 'retail', required
          - `rationale` string, required
          - `attribution_overlap` string, required
        - `measurement` 'platform_attribution' | 'randomized_lift' | 'cross_channel_model', required
        - `measurement_inputs` string, required
        - `checklist` Local3PreparationItem[], required
          - `task` string, required
          - `owner` string, required
          - `due_date` string, required
          - `dependency` string, required
      - Local3ExperimentPlan
        - `period_start` string, required
        - `period_end` string, required
        - `kind` 'experiment', required
        - `hypothesis` string, required
        - `variable` string, required
        - `control` string, required
        - `variant` string, required
        - `audience` string, required
        - `primary_metric` string, required
        - `guardrails` string, required
        - `decision_rule` string, required
        - `stop_rule` string, required
        - `parallel_changes` string, required
        - `design` 'randomized' | 'observational', required
        - `assignment_method` string, required
        - `treatment_fraction` number, required
        - `budget_limit` number, required
        - `currency` string, required
        - `planned_sample` integer, nullable
        - `sample_basis` string, required
        - `metric_type` 'binary_rate' | 'continuous' | 'unknown'
        - `baseline_rate` number, nullable
        - `minimum_detectable_absolute_lift` number, nullable
        - `significance_level` number
        - `target_power` number
    - Local3PauseSelection
      - `kind` 'pause_campaigns', required
      - `campaign_ids` string[], required
      - `reason` string, required
    - Local3BudgetAdjustment
      - `kind` 'campaign_budget', required
      - `campaign_id` string, required
      - `daily_amount` string, required
      - `reason` string, required

## Response `200`

Authorized workflow state; no platform writes

- object

## Other responses

- `400`: Invalid workflow request
- `403`: Access denied

---

[API](https://skmtc.dev/gravityads/apis/gravityads-api.md) · [All operations](https://skmtc.dev/gravityads/apis/gravityads-api/llms.txt) · [OpenAPI document](https://skmtc.dev/gravityads/apis/gravityads-api/revisions/124cd07d534d?raw)
