Find deployment drift status
Returns the drift status recorded for a drift-detection deployment, including the deployment log itself, the date of the cloud change events currently held for it, and the status of the event scan that produced them.
Authorization
env0_API_Key env zero API authentication is done via API keys. An API Key can either be created by an organization administrator, in which case it will not be connected to any specific user, or via Personal API Keys to authenticate as a user.
Creating an API Key with a Specific Role
- Once you've created your organization, you can set up and manage API Keys.
- Navigate to the Organization Settings page and click the API Keys tab.
- Click Add API Key and enter a name for your key in the Name field. This name is for reference purposes only and isn't used directly in authentication.
❗️Save Your API Key ID and secret The secret will not be available after you close this window.
Creating a Personal API Key
- Click on your avatar (located on the top right of the screen)
- Click on Personal Settings
- Select the API Keys tab
- Click Add API Key, and enter a name for your key in the Name field. This name is for reference purposes and isn't used directly in authentication.
❗️Save your API Key ID & secret The secret will not be available after you close this window.
Using an API Key to Authenticate
Authentication of the env zero API is done using the Basic Authentication method. Each request made should include the API Key ID as the username, and the API Key secret as the password. For example, when using curl, we can include these parameters via flag --user {API Key ID}:{API Key Secret}.
API Key Permissions
When creating an API key through the organization settings, you will need to choose if you’d like to grant it Organization Admin or User permissions. In case of the latter, you can assign fine-grained permissions per project. Personal API Keys can be created through the user’s profile page and will have the same permissions as the user has.
Rate Limits
env zero API allows up to 1K requests per 60 seconds, requests are aggregated by IP, HTTP Method and URI. If you exceed this limit, you will receive a 429 status code.
In: header
Path Parameters
Response Body
application/json
application/json
application/json
curl -X GET "https://example.com/environments/deployments/string/drift-status"{ "driftDeployment": { "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "type": "deploy", "startedBy": "string", "queuedAt": "2019-08-24T14:15:22Z", "startedAt": "2019-08-24T14:15:22Z", "finishedAt": "2019-08-24T14:15:22Z", "output": { "property1": { "value": null, "sensitive": true, "type": "string" }, "property2": { "value": null, "sensitive": true, "type": "string" } }, "error": {}, "failedCommand": "string", "stoppedByTimeoutReason": "DEPLOYMENT_TIME_LIMIT_EXCEEDED", "customEnv0EnvironmentVariables": { "environmentId": "string", "organizationName": "string", "environmentUrl": "string", "projectId": "string", "projectName": "string", "parentProjectIds": "string", "parentProjectPath": "string", "deploymentLogId": "string", "deploymentType": "deploy", "deploymentRevision": "string", "workspaceName": "string", "rootDir": "string", "organizationId": "string", "templateId": "string", "templateDir": "string", "templateName": "string", "environmentName": "string", "environmentCreatorName": "string", "environmentCreatorUserId": "string", "environmentCreatorEmail": "string", "deployerName": "string", "deployerUserId": "string", "deployerEmail": "string", "reviewerName": "string", "reviewerEmail": "string", "reviewerUserId": "string", "vcsProvider": "gitlab", "prAuthor": "string", "prNumber": "string", "prSourceRepository": "string", "prSourceBranch": "string", "prTargetBranch": "string", "commitHash": "string", "commitUrl": "string", "oidcToken": "string", "vcsAccessToken": "string", "tfPlanJson": "string", "cliArgsPlan": "string", "cliArgsApply": "string", "discoveryRepositoryUrl": "string", "discoveryPrNumber": "string", "discoveryVCS": "gitlab" }, "costEstimation": { "totalMonthlyCost": 0, "monthlyCostDiff": 0, "projects": [ { "diff": { "totalMonthlyCost": "string" } } ] }, "status": "IN_PROGRESS", "blueprintId": "string", "blueprintName": "string", "blueprintRepository": "string", "blueprintRevision": "string", "blueprintPath": "string", "blueprintType": "opentofu", "comment": "string", "environmentId": "string", "resourceCount": 0, "resources": [ { "provider": "string", "type": "string", "name": "string", "moduleName": "string", "mode": "managed" } ], "startedByUser": { "email": "string", "user_id": "string", "username": "string", "created_at": "string", "updated_at": "string", "app_metadata": { "organizations": [ { "id": "string", "role": "string", "name": "string" } ], "isApiKey": true, "isAutogeneratedTerraformDeployer": true, "apiKeyType": "oidc", "createdBy": "string", "organizationId": "string", "isSystemUser": true, "readOnly": true }, "picture": "string", "name": "string", "last_login": "string", "given_name": "string", "family_name": "string", "blocked": true }, "isScheduledRun": true, "abortedBy": "string", "abortedByUser": { "email": "string", "user_id": "string", "username": "string", "created_at": "string", "updated_at": "string", "app_metadata": { "organizations": [ { "id": "string", "role": "string", "name": "string" } ], "isApiKey": true, "isAutogeneratedTerraformDeployer": true, "apiKeyType": "oidc", "createdBy": "string", "organizationId": "string", "isSystemUser": true, "readOnly": true }, "picture": "string", "name": "string", "last_login": "string", "given_name": "string", "family_name": "string", "blocked": true }, "gitUser": "string", "gitAvatarUrl": "string", "prNumber": "string", "triggerName": "user", "driftDetected": true, "plan": { "resourceChanges": [ { "id": "string", "cloudId": "string", "moduleName": "string", "driftByCloud": true, "name": "string", "providerName": "string", "type": "string", "path": "string", "action": "create", "attributes": [ { "name": "string", "before": null, "after": null } ], "importing": { "id": "string" }, "actionReason": "replace_because_tainted", "createBeforeDestroy": true, "previousAddress": "string" } ], "outputChanges": [ { "moduleName": "string", "name": "string", "action": "create", "attributes": [ { "name": "string", "before": null, "after": null } ] } ] }, "planSummary": { "added": 0, "changed": 0, "destroyed": 0, "imported": 0 }, "isSkippedApply": true, "workflowDeploymentId": "string", "workflowFile": { "settings": { "environmentRemovalStrategy": "destroy" }, "environments": { "property1": { "environmentId": "string", "toDestroy": true, "isRemoteBackend": true, "k8sNamespace": "string", "vcs": { "type": "opentofu", "tokenName": "string", "tokenId": "string", "sshKeys": [ { "id": "string", "name": "string" } ], "githubInstallationId": 0, "bitbucketClientKey": "string", "isBitbucketServer": true, "isGitLabEnterprise": true, "isGitHubEnterprise": true, "isGitLab": true, "isAzureDevOps": true, "isHelmRepository": true, "vcsConnectionId": "string", "repository": "string", "revision": "string", "path": "string", "fileName": "string", "helmChartName": "string", "terraformVersion": "string", "opentofuVersion": "string", "terragruntVersion": "string", "terragruntTfBinary": "terraform", "pulumiVersion": "string", "ansibleVersion": "string" }, "name": "string", "templateName": "string", "templateId": "string", "templateType": "opentofu", "revision": "string", "workspace": "string", "needs": [ "string" ], "terragruntWorkingDirectory": "string", "requiresApproval": true, "disabled": "string" }, "property2": { "environmentId": "string", "toDestroy": true, "isRemoteBackend": true, "k8sNamespace": "string", "vcs": { "type": "opentofu", "tokenName": "string", "tokenId": "string", "sshKeys": [ { "id": "string", "name": "string" } ], "githubInstallationId": 0, "bitbucketClientKey": "string", "isBitbucketServer": true, "isGitLabEnterprise": true, "isGitHubEnterprise": true, "isGitLab": true, "isAzureDevOps": true, "isHelmRepository": true, "vcsConnectionId": "string", "repository": "string", "revision": "string", "path": "string", "fileName": "string", "helmChartName": "string", "terraformVersion": "string", "opentofuVersion": "string", "terragruntVersion": "string", "terragruntTfBinary": "terraform", "pulumiVersion": "string", "ansibleVersion": "string" }, "name": "string", "templateName": "string", "templateId": "string", "templateType": "opentofu", "revision": "string", "workspace": "string", "needs": [ "string" ], "terragruntWorkingDirectory": "string", "requiresApproval": true, "disabled": "string" } } }, "workflowDeploymentOptions": { "node": "string", "operation": "run-from-here" }, "stateVersionId": "string", "reviewersUsers": [ { "user": { "email": "string", "user_id": "string", "username": "string", "created_at": "string", "updated_at": "string", "app_metadata": { "organizations": [ { "id": "string", "role": "string", "name": "string" } ], "isApiKey": true, "isAutogeneratedTerraformDeployer": true, "apiKeyType": "oidc", "createdBy": "string", "organizationId": "string", "isSystemUser": true, "readOnly": true }, "picture": "string", "name": "string", "last_login": "string", "given_name": "string", "family_name": "string", "blocked": true }, "action": "approved" } ], "reviewers": [ { "userId": "string", "action": "approved" } ], "reviewedBy": "string", "reviewedByUser": { "email": "string", "user_id": "string", "username": "string", "created_at": "string", "updated_at": "string", "app_metadata": { "organizations": [ { "id": "string", "role": "string", "name": "string" } ], "isApiKey": true, "isAutogeneratedTerraformDeployer": true, "apiKeyType": "oidc", "createdBy": "string", "organizationId": "string", "isSystemUser": true, "readOnly": true }, "picture": "string", "name": "string", "last_login": "string", "given_name": "string", "family_name": "string", "blocked": true }, "targets": [ "string" ], "variables": [ { "id": "string", "name": "string", "scope": "SET", "scopeId": "string", "value": "string", "isSensitive": true, "type": 0, "schema": { "type": "string", "enum": [ "string" ], "format": "HCL" }, "userId": "string", "updatedAt": "2019-08-24T14:15:22Z", "projectId": "string" } ], "gitMetadata": { "commit": "string", "branch": "string", "timestamp": "2019-08-24T14:15:22Z" }, "providerVersions": { "property1": "string", "property2": "string" }, "moduleVersions": { "property1": "string", "property2": "string" }, "stateFileHash": { "value": "string" }, "driftCause": { "unappliedCommits": [ { "userEmail": "string", "timestamp": "2019-08-24T14:15:22Z", "commitHash": "string" } ] } }, "currentEventsDate": "2019-08-24T14:15:22Z", "eventsScanStatus": "CAN_RUN"}Download Deployment Plan JSON GET
Downloads the complete Terraform/OpenTofu plan JSON (the output of 'show -json') of the given deployment, including resources with no changes - unlike the parsed plan returned by 'GET /environments/deployments/{id}?fields=plan', which contains only changed resources. Intended for external policy evaluation (for example Checkov). Responses: * 302 (default) - the 'Location' header holds a short-lived (5 minutes) signed download URL. Follow the redirect to download the file, for example with 'curl -L'. * 200 - only when 'redirect=false' is passed: the same signed URL is returned as a JSON body ({ "url": "..." }) instead of a redirect. Browser clients should prefer this, since following the 302 with a cross-origin request that carries custom headers triggers a CORS preflight against the storage bucket. * 404 - the deployment does not exist, or no plan JSON is available for it (see below). * 403 - the caller is not allowed to view the deployment's environment. NOTE: the generated schema below documents only the 200 response body; the default response of this endpoint is the 302 described above. Sensitive values are masked: anything Terraform marks as sensitive is replaced with '<sensitive>', and values of sensitive env zero variables are redacted. Expect masked placeholders rather than real secrets in the file. A plan JSON is available only when all of the following hold, otherwise the endpoint returns 404: * the deployment is a deploy, destroy, or dry run - drift detection, PR plan and remote plan deployments do not produce one * the template is Terraform, OpenTofu or Terragrunt (Terragrunt run-all is not supported) * the deployment reached and completed its plan step * the deployment ran on an agent version that supports the feature (self-hosted agents may need an upgrade) * the deployment is less than 30 days old - plan JSON files are retained for 30 days and then deleted
Get a drifted resource's event details GET
Returns the full detail of one cloud change event on a drifted resource, for inspecting exactly what changed outside of env zero.