---
title: "Patch transforms"
method: PATCH
path: "/v0/multi-file-feeds/{multi_file_feed_id}/transforms"
tags: ["Multi FileFeed Transforms"]
---

# Patch transforms

`PATCH /v0/multi-file-feeds/{multi_file_feed_id}/transforms`

Replaces the Multi FileFeed's HEAD flowgraph with the supplied state.

The `flowgraph.nodes` and `flowgraph.edges` arrays represent the complete
desired state — nodes absent from the payload are deleted, and edges are
fully replaced. Every call must include a `source` node and an `import` or
`import-v2` node or the request will be rejected. Represent the complete
workflow as a single graph.

Within an individual node, `config` uses merge semantics:

If a key is not specified, the current value is left unchanged.
If a key takes a scalar value
- a supplied value replaces the current value
- a null value deletes the key
If a key takes an array value
- supplied value replaces the current array
- a null value deletes the key
If a key takes a hash/object value
- the supplied hash is recursively merged with the current hash (same rules apply at each nested level)
- a null value deletes the key

Auto-commits by default. Use `commit_now: false` to defer committing.

Concurrency guards:
  - `last_known_commit_id` — optimistic lock; 409 if commits changed
  - Dirty-state check — 409 if HEAD has uncommitted UI edits (override with `force: true`)

Requires Multi FileFeed transforms to be enabled for the organization.

## Request body

- object
  - `version` integer, required — Payload format version (must be 1)
  - `commit_now` boolean — Whether to auto-commit after applying (default true)
  - `force` boolean — Override dirty-state check when commit_now is true
  - `last_known_commit_id` integer — Optimistic lock — rejects if latest commit differs
  - `workflow` object — Optional workflow-level metadata to update. Object-merge semantics: only keys present are updated; absent keys leave current values unchanged. `workspace_key` is read-only and ignored if supplied.
    - `name` string — New display name for the workflow
    - `workflow_event_webhook_key` string — Key of the event webhook to attach (null to detach)
    - `workflow_code_action_key` string — Key of the code action to attach (null to detach)
    - `custom_metadata` object — Arbitrary JSON metadata (null to clear)
  - `templates` object[] — Optional full-replace list of template associations for this workflow. When present, replaces all existing associations — entries absent from the array are removed. Omit the field entirely to leave associations unchanged.
    - `template_key` string, required — Portable key of the template to associate
    - `is_required` boolean, required — Whether this template is required for the workflow to run
  - `flowgraph` object, required
    - `nodes` object[], required — Complete desired set of nodes. Every call must include a `source` node and at least one `import` or `import-v2` node. Nodes absent from this array are deleted.
      - `node_key` string, required — Unique identifier for the node within this flowgraph
      - `type` string, required — Node type (e.g. source, import-v2, sheet-transforms)
      - `config` object, required — Node-specific configuration (merge semantics — see above)
      - `position_x` number — X coordinate in the visual editor
      - `position_y` number — Y coordinate in the visual editor
      - `pipeline` object — Pipeline configuration (for single-list nodes only)
        - `template_key` string — Template key reference
        - `config` object — Pipeline step configuration
        - `prompt_generated_code_actions` object[]
          - `key` string, required
          - `label` string, required
          - `user_prompt` string, required
          - `code` string, required
    - `edges` object[], required — Complete desired set of edges. Fully replaced on every call.
      - `from_node_key` string, required — Source node key
      - `to_node_key` string, required — Target node key

## Response `200`

Successfully patched transforms

- object
  - `transforms` object — Full transforms state after patch
  - `commit_id` integer — ID of the created commit (if commit_now was true)
  - `created_at` string, date-time — When the commit was created

## Other responses

- `400` — Bad request (invalid JSON or not an object)
- `401` — Unauthorized
- `403` — Forbidden (feature not enabled or wrong org)
- `409` — Conflict — concurrent modification detected
- `422` — Validation failed (schema, references, or graph errors)

---

[API](https://skmtc.dev/oneschema/apis/templates.md) · [All operations](https://skmtc.dev/oneschema/apis/templates/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/oneschema/templates/revisions/40674aa6d4d9/schema)
