---
title: "Batch Replace Steps"
method: PUT
path: "/api/v1/steps/project/{project_id}/batch"
tags: ["steps"]
---

# Batch Replace Steps

`PUT /api/v1/steps/project/{project_id}/batch`

Replace all steps in a project (deploy-time).

## Path parameters

- `project_id` string, uuid, required

## Request body

- StepBatchReplace — Replace all steps in a project (used at deploy time).
  - `steps` StepBatchItem[], required
    - `slug` string, required
    - `title` string
    - `description` string
    - `step_type` 'source' | 'data_read' | 'process' | 'data_sink' | 'database' | 'dashboard', required — The role a step plays in the project DAG.
    - `code_type` 'python' | 'sql' — Runtime language for the step code.
    - `sink_target` 'database' — Where a data_sink step writes its output.
    - `provider_id` string, uuid, nullable
    - `parent_slugs` string[]
    - `in_format` string
    - `out_format` string
    - `code_url` string
    - `referenced_database_ids` string[]
    - `input_schema` object[], nullable
    - `operator_type` string, nullable
    - `operator_config` object, nullable

## Response `200`

Successful Response

- StepRead[]
  - `id` string, uuid, required
  - `project_id` string, uuid, required
  - `company_id` string, uuid, required
  - `user_id` string, uuid, required
  - `slug` string, required
  - `title` string, required
  - `description` string, required
  - `step_type` 'source' | 'data_read' | 'process' | 'data_sink' | 'database' | 'dashboard', required — The role a step plays in the project DAG.
  - `code_type` 'python' | 'sql', required — Runtime language for the step code.
  - `sink_target` 'database', required — Where a data_sink step writes its output.
  - `provider_id` string, uuid, nullable, required
  - `parent_step_ids` string[], required
  - `order` integer, required
  - `code_url` string, required
  - `in_format` string, required
  - `out_format` string, required
  - `referenced_database_ids` string[], required
  - `input_schema` object[], nullable, required
  - `operator_type` string, nullable
  - `operator_config` object, nullable
  - `extra_metadata` object, nullable
  - `entity_id` string, uuid, nullable
  - `status` string
  - `is_suppressed` boolean, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `database_name` string, nullable
  - `trigger` TriggerRead — Trigger response.
    - `id` string, uuid, required
    - `step_id` string, uuid, required
    - `trigger_type` 'on_click' | 'schedule', required — How a root step can be triggered. EVENT (polling) was deprecated in commit c523d2be (2026-05-02) and deleted entirely in Phase 5: cross-dataset reactive updates use the cascade model (database_dep) instead. ON_CLICK is implicit (every dataset can be refreshed manually via the UI, no row needed) and is only kept here for the rejection branch in CreateTrigger.
    - `trigger_config` object, required
    - `is_active` boolean, required
    - `last_triggered_at` string, date-time, nullable, required
    - `created_at` string, date-time, required

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/netter/apis/dmi-backend.md) · [All operations](https://skmtc.net/netter/apis/dmi-backend/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/netter/dmi-backend/versions/a59877bf911b/schema)
