Skip to main content
GET
/
v1
/
workflows
/
{workflow_id}
/
revisions
/
diff
Diff two workflow revisions
curl --request GET \
  --url https://api-sandbox.featherhq.com/v1/workflows/{workflow_id}/revisions/diff \
  --header 'x-api-key: <api-key>'
{
  "workflow_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "base": {
    "revision_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "name": "<string>"
  },
  "target": {
    "revision_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "name": "<string>"
  },
  "source_diff": {
    "instructions": {
      "segments": [
        {
          "text": "<string>"
        }
      ]
    },
    "system_prompt": {
      "segments": [
        {
          "text": "<string>"
        }
      ]
    },
    "config": {
      "added": [
        {
          "field": "<string>",
          "text_diff": {
            "segments": [
              {
                "text": "<string>"
              }
            ]
          },
          "before": null,
          "after": null
        }
      ],
      "removed": [
        {
          "field": "<string>",
          "text_diff": {
            "segments": [
              {
                "text": "<string>"
              }
            ]
          },
          "before": null,
          "after": null
        }
      ],
      "changed": [
        {
          "field": "<string>",
          "text_diff": {
            "segments": [
              {
                "text": "<string>"
              }
            ]
          },
          "before": null,
          "after": null
        }
      ]
    },
    "policies": {
      "added": [
        "<string>"
      ],
      "removed": [
        "<string>"
      ]
    },
    "tool_input_defaults": {
      "added": [
        {
          "field": "<string>",
          "text_diff": {
            "segments": [
              {
                "text": "<string>"
              }
            ]
          },
          "before": null,
          "after": null
        }
      ],
      "removed": [
        {
          "field": "<string>",
          "text_diff": {
            "segments": [
              {
                "text": "<string>"
              }
            ]
          },
          "before": null,
          "after": null
        }
      ],
      "changed": [
        {
          "field": "<string>",
          "text_diff": {
            "segments": [
              {
                "text": "<string>"
              }
            ]
          },
          "before": null,
          "after": null
        }
      ]
    },
    "model_settings": {
      "analyzer": [
        {
          "field": "<string>",
          "text_diff": {
            "segments": [
              {
                "text": "<string>"
              }
            ]
          },
          "before": null,
          "after": null
        }
      ],
      "router": [
        {
          "field": "<string>",
          "text_diff": {
            "segments": [
              {
                "text": "<string>"
              }
            ]
          },
          "before": null,
          "after": null
        }
      ]
    }
  },
  "graph_diff": {
    "summary": {
      "nodes_added": 0,
      "nodes_removed": 0,
      "nodes_changed": 0,
      "edges_added": 0,
      "edges_removed": 0,
      "edges_changed": 0,
      "context_vars_added": 0,
      "context_vars_removed": 0,
      "context_vars_changed": 0,
      "escape_hatches_added": 0,
      "escape_hatches_removed": 0,
      "escape_hatches_changed": 0
    },
    "graph_meta": {
      "persona": {
        "segments": [
          {
            "text": "<string>"
          }
        ]
      },
      "system_prompt": {
        "segments": [
          {
            "text": "<string>"
          }
        ]
      }
    },
    "nodes": {
      "added": [
        {
          "id": "<string>",
          "is_entry": false,
          "instructions": "<string>",
          "required_writes": [
            "<string>"
          ],
          "writes": [
            "<string>"
          ],
          "done_when_readable": "<string>",
          "tools": [
            {
              "canonical_key": "<string>",
              "display_name": "<string>",
              "produces_variables": [
                "<string>"
              ]
            }
          ],
          "knowledge_bases": [
            {
              "kb_id": "<string>",
              "display_name": "<string>",
              "clearance_level": 123
            }
          ],
          "description": "<string>",
          "failure_message": "<string>",
          "steps": [
            {
              "id": "<string>",
              "text": "<string>",
              "tool_display_name": "<string>",
              "knowledge_base_names": [
                "<string>"
              ]
            }
          ],
          "result_write_names": [
            "<string>"
          ],
          "static_text": "<string>",
          "voice_config": {
            "targets": [
              {
                "label": "<string>",
                "when_to_use": "<string>"
              }
            ],
            "connecting_text": "<string>",
            "mode": "cold",
            "max_retries": 1,
            "retry_text": "<string>"
          },
          "on_failure": "<string>",
          "condition_readable": "<string>",
          "approver_role": "<string>",
          "suspend_message": "<string>",
          "timeout_seconds": 123,
          "on_approve": "<string>",
          "on_deny": "<string>"
        }
      ],
      "removed": [
        {
          "id": "<string>",
          "is_entry": false,
          "instructions": "<string>",
          "required_writes": [
            "<string>"
          ],
          "writes": [
            "<string>"
          ],
          "done_when_readable": "<string>",
          "tools": [
            {
              "canonical_key": "<string>",
              "display_name": "<string>",
              "produces_variables": [
                "<string>"
              ]
            }
          ],
          "knowledge_bases": [
            {
              "kb_id": "<string>",
              "display_name": "<string>",
              "clearance_level": 123
            }
          ],
          "description": "<string>",
          "failure_message": "<string>",
          "steps": [
            {
              "id": "<string>",
              "text": "<string>",
              "tool_display_name": "<string>",
              "knowledge_base_names": [
                "<string>"
              ]
            }
          ],
          "result_write_names": [
            "<string>"
          ],
          "static_text": "<string>",
          "voice_config": {
            "targets": [
              {
                "label": "<string>",
                "when_to_use": "<string>"
              }
            ],
            "connecting_text": "<string>",
            "mode": "cold",
            "max_retries": 1,
            "retry_text": "<string>"
          },
          "on_failure": "<string>",
          "condition_readable": "<string>",
          "approver_role": "<string>",
          "suspend_message": "<string>",
          "timeout_seconds": 123,
          "on_approve": "<string>",
          "on_deny": "<string>"
        }
      ],
      "changed": [
        {
          "id": "<string>",
          "changes": [
            {
              "field": "<string>",
              "text_diff": {
                "segments": [
                  {
                    "text": "<string>"
                  }
                ]
              },
              "before": null,
              "after": null
            }
          ]
        }
      ]
    },
    "edges": {
      "added": [
        {
          "from_node": "<string>",
          "to_node": "<string>",
          "condition_readable": "<string>",
          "is_failure_path": false
        }
      ],
      "removed": [
        {
          "from_node": "<string>",
          "to_node": "<string>",
          "condition_readable": "<string>",
          "is_failure_path": false
        }
      ],
      "changed": [
        {
          "from_node": "<string>",
          "to_node": "<string>",
          "changes": [
            {
              "field": "<string>",
              "text_diff": {
                "segments": [
                  {
                    "text": "<string>"
                  }
                ]
              },
              "before": null,
              "after": null
            }
          ]
        }
      ]
    },
    "context_variables": {
      "added": [
        {
          "name": "<string>",
          "type": "<string>",
          "source": "<string>",
          "enum_values": [
            "<string>"
          ],
          "reask_cap": 123,
          "description": "<string>"
        }
      ],
      "removed": [
        {
          "name": "<string>",
          "type": "<string>",
          "source": "<string>",
          "enum_values": [
            "<string>"
          ],
          "reask_cap": 123,
          "description": "<string>"
        }
      ],
      "changed": [
        {
          "name": "<string>",
          "changes": [
            {
              "field": "<string>",
              "text_diff": {
                "segments": [
                  {
                    "text": "<string>"
                  }
                ]
              },
              "before": null,
              "after": null
            }
          ]
        }
      ]
    },
    "escape_hatches": {
      "added": [
        {
          "trigger": "<string>",
          "target_label": "<string>",
          "static_line": "<string>"
        }
      ],
      "removed": [
        {
          "trigger": "<string>",
          "target_label": "<string>",
          "static_line": "<string>"
        }
      ],
      "changed": [
        {
          "trigger": "<string>",
          "changes": [
            {
              "field": "<string>",
              "text_diff": {
                "segments": [
                  {
                    "text": "<string>"
                  }
                ]
              },
              "before": null,
              "after": null
            }
          ]
        }
      ]
    }
  }
}

Authorizations

x-api-key
string
header
required

Path Parameters

workflow_id
string<uuid>
required

Query Parameters

base
string<uuid>
required
target
string<uuid>
required

Response

Successful Response

Top-level response returned by GET /workflows/{id}/revisions/diff.

workflow_id
string<uuid>
required
base
RevisionDiffSide · object
required

Metadata about one side of the diff (base or target).

target
RevisionDiffSide · object
required

Metadata about one side of the diff (base or target).

fidelity
enum<string>
required
Available options:
exact,
approximate,
source_only
source_diff
SourceDiff · object
required

Source-layer diff — exactly what the author edited (authored config columns).

Always present and always deterministic regardless of graph provenance.

graph_diff
GraphDiff · object

Full behavior diff — projected graph comparison.