---
title: "Compare resources between environments"
method: POST
path: "/v2/environments/{targetEnvironmentId}/diff"
tags: ["Environments"]
---

# Compare resources between environments

`POST /v2/environments/{targetEnvironmentId}/diff`

## Request

- Base URL: `https://api.notifly.io`
- URL: `https://api.notifly.io/v2/environments/{targetEnvironmentId}/diff`
- Auth: API key in header `Authorization`

Compares workflows and other resources between the source and target environments, returning detailed diff information including additions, modifications, and deletions.

## Path parameters

- `targetEnvironmentId` string, required

## Request body

- DiffEnvironmentRequestDto
  - `sourceEnvironmentId` string: Source environment ID to compare from. Defaults to the Development environment if not provided.

## Response `200`

OK

- object
  - `data` DiffEnvironmentResponseDto
    - `sourceEnvironmentId` string, required: Source environment ID
    - `targetEnvironmentId` string, required: Target environment ID
    - `resources` ResourceDiffResultDto[], required: Diff resources by resource type
      - `resourceType` 'REGULAR' | 'ECHO' | 'BRIDGE', required: Type of the layout
      - `sourceResource` ResourceInfoDto
        - `id` string, nullable: Resource ID (workflow ID or step ID)
        - `name` string, nullable: Resource name (workflow name or step name)
        - `updatedBy` UserInfoDto
          - `_id` string, required: User ID
          - `firstName` string, required: User first name
          - `lastName` string, nullable: User last name
          - `externalId` string: User external ID
        - `updatedAt` string, date-time, nullable: When the resource was last updated
      - `targetResource` ResourceInfoDto
        - `id` string, nullable: Resource ID (workflow ID or step ID)
        - `name` string, nullable: Resource name (workflow name or step name)
        - `updatedBy` UserInfoDto
          - `_id` string, required: User ID
          - `firstName` string, required: User first name
          - `lastName` string, nullable: User last name
          - `externalId` string: User external ID
        - `updatedAt` string, date-time, nullable: When the resource was last updated
      - `changes` ResourceDiffDto[], required: List of specific changes for this resource
        - `sourceResource` ResourceInfoDto
          - `id` string, nullable: Resource ID (workflow ID or step ID)
          - `name` string, nullable: Resource name (workflow name or step name)
          - `updatedBy` UserInfoDto
            - `_id` string, required: User ID
            - `firstName` string, required: User first name
            - `lastName` string, nullable: User last name
            - `externalId` string: User external ID
          - `updatedAt` string, date-time, nullable: When the resource was last updated
        - `targetResource` ResourceInfoDto
          - `id` string, nullable: Resource ID (workflow ID or step ID)
          - `name` string, nullable: Resource name (workflow name or step name)
          - `updatedBy` UserInfoDto
            - `_id` string, required: User ID
            - `firstName` string, required: User first name
            - `lastName` string, nullable: User last name
            - `externalId` string: User external ID
          - `updatedAt` string, date-time, nullable: When the resource was last updated
        - `resourceType` 'REGULAR' | 'ECHO' | 'BRIDGE', required: Type of the layout
        - `action` 'added' | 'modified' | 'deleted' | 'unchanged' | 'moved', required: Type of change
        - `diffs` object: Detailed changes (only for modified resources)
          - `previous` object, nullable: Previous state of the resource (null for added resources)
          - `new` object, nullable: New state of the resource (null for deleted resources)
        - `stepType` string: Step type (only for step resources)
        - `previousIndex` number: Previous index in steps array (for moved/deleted steps)
        - `newIndex` number: New index in steps array (for moved/added steps)
      - `summary` DiffSummaryDto, required
        - `added` number, required: Number of added resources (workflows and steps)
        - `modified` number, required: Number of modified resources (workflows and steps)
        - `deleted` number, required: Number of deleted resources (workflows and steps)
        - `unchanged` number, required: Number of unchanged resources (workflows and steps)
      - `dependencies` ResourceDependencyDto[]: Dependencies that affect this resource
        - `resourceType` 'REGULAR' | 'ECHO' | 'BRIDGE', required: Type of the layout
        - `resourceId` string, required: ID of the dependent resource
        - `resourceName` string, required: Name of the dependent resource
        - `isBlocking` boolean, required: Whether this dependency blocks the operation
        - `reason` 'LAYOUT_REQUIRED_FOR_WORKFLOW' | 'LAYOUT_EXISTS_IN_TARGET' | 'AGENT_REQUIRED_FOR_WORKFLOW' | 'AGENT_EXISTS_IN_TARGET', required: Reason for the dependency
    - `summary` EnvironmentDiffSummaryDto, required
      - `totalEntities` number, required: Total number of entities compared
      - `totalChanges` number, required: Total number of changes detected
      - `hasChanges` boolean, required: Whether any changes were detected

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not Found
- `405`: Method Not Allowed
- `409`: Conflict
- `413`: Payload Too Large
- `414`: URI Too Long
- `415`: Unsupported Media Type
- `422`: Unprocessable Entity
- `429`: The client has sent too many requests in a given amount of time.
- `500`: Internal Server Error
- `503`: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.

---

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