diff --git a/.github/workflows/copy-cloud-docs-for-tfe.yml b/.github/workflows/copy-cloud-docs-for-tfe.yml
index ad2d10f58e..2ee6a005aa 100644
--- a/.github/workflows/copy-cloud-docs-for-tfe.yml
+++ b/.github/workflows/copy-cloud-docs-for-tfe.yml
@@ -4,7 +4,7 @@ on:
workflow_dispatch:
inputs:
branch:
- description: 'Ex: docs-tfe-releases/v123456-1; ptfe-releases/v123456-1'
+ description: 'Release branch. (Ex: docs-tfe-releases/v123456-1, ptfe-releases/v123456-1)'
required: true
env:
@@ -69,51 +69,41 @@ jobs:
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
with:
ref: ${{env.release_branch}}
- path: "${{github.workspace}}/release"
+ path: '${{github.workspace}}/release'
- - name: Checkout main for new docs version ACTUAL PR
+ # MAKE THE RELEASE PR
+ - name: Checkout main for new docs version RELEASE PR
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
with:
- path: "${{github.workspace}}/new-docs-pr"
-
- - name: Checkout main for new docs version DIFF PR
- uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
- with:
- path: "${{github.workspace}}/new-docs-diff-pr"
+ path: '${{github.workspace}}/new-docs-pr'
- name: Generate version-metadata for workflow
- working-directory: "${{github.workspace}}/release"
+ working-directory: '${{github.workspace}}/release'
run: |
npm i
npm run prebuild-only-version-metadata
- # MAKING THE DIFF PR
- - name: Copy files for new docs version DIFF PR
- uses: ./release/.github/actions/copy-cloud-docs-for-tfe
- with:
- source_path: "${{github.workspace}}/release"
- target_path: "${{github.workspace}}/new-docs-diff-pr"
+ - name: Create the new TFE version folder for RELEASE PR
+ run: |
+ version=$(jq -r '.["terraform-enterprise"][] | select(.isLatest == true) | .version' "${{github.workspace}}/release/app/api/versionMetadata.json")
+ echo "Latest terraform-enterprise version: ${version}"
+ echo "LATEST_TFE_VERSION=$version" >> $GITHUB_ENV
+
+ mkdir -p "${{github.workspace}}/new-docs-pr/content/terraform-enterprise/${{env.SERIES}}-${{env.RELEASE}}"
+
+ cp -a "${{github.workspace}}/release/content/terraform-enterprise/${version}" "${{github.workspace}}/new-docs-pr/content/terraform-enterprise/${{env.SERIES}}-${{env.RELEASE}}"
- - name: Open new docs docs version DIFF PR
- working-directory: "${{github.workspace}}/new-docs-diff-pr"
+ - name: Open new docs version RELEASE PR
+ working-directory: '${{github.workspace}}/new-docs-pr'
env:
- branch_name: docs-diff/${{env.SERIES}}-${{env.RELEASE}}
+ branch_name: docs/${{env.SERIES}}-${{env.RELEASE}}
pr_body: |
- # Automated Docs DIFF PR for TFE ${{env.SERIES}}-${{env.RELEASE}}
-
- **❗ DO NOT MERGE THIS PR, IT IS FOR DIFFS ONLY ❗**
+ # Automated Docs Release PR for TFE ${{env.SERIES}}-${{env.RELEASE}}
**TFE Series**: ${{ env.SERIES }}
**TFE Release**: ${{ env.RELEASE }}
- This copies over `cloud-docs` from:
- - ${{github.server_url}}/${{github.repository}}/tree/${{env.release_branch}}
-
- This PR was created via:
- - ${{github.server_url}}/${{github.repository}}/actions/runs/${{github.run_id}}
-
- Triggered by creation of branch:
- - ${{github.server_url}}/${{github.repository}}/tree/${{env.release_branch}}
+ ...Waiting for the diff PR to be created, before finishing this PR's description...
# secrets.WORKFLOW_TESTING_TOKEN requires permissions read:org, repo, workflow
run: |
@@ -132,38 +122,40 @@ jobs:
git checkout -b ${{env.branch_name}}
git add .
- git commit -m "Automated Docs DIFF PR" --no-verify
+ git commit -m "Automated Release Docs PR" --no-verify
git push origin HEAD
gh pr create \
--body="${{env.pr_body}}" \
- --title="Automated Docs DIFF PR for TFE ${{env.SERIES}}-${{env.RELEASE}}" \
+ --title="Automated Docs Release PR for TFE ${{env.SERIES}}-${{env.RELEASE}}" \
--draft \
--head ${{env.branch_name}} \
--base main
- diff_pr_url=$(gh pr view --json url --jq '.url')
- echo "DIFF_PR_URL=${diff_pr_url}" >> $GITHUB_ENV
- echo "**Automated DIFF PR URL**: ${diff_pr_url}" >> $GITHUB_STEP_SUMMARY
-
- echo "(Closed DIFF PR at ${diff_pr_url} in order to prevent an accidental merge)" >> $GITHUB_STEP_SUMMARY
- gh pr close "${diff_pr_url}"
+ pr_url=$(gh pr view --json url --jq '.url')
+ echo "PR_URL=${pr_url}" >> $GITHUB_ENV
+ echo "**Automated Release PR URL**: ${pr_url}" >> $GITHUB_STEP_SUMMARY
+ # MAKE THE DIFF PR
+ - name: Checkout main for new docs version DIFF PR
+ uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
+ with:
+ path: '${{github.workspace}}/new-docs-diff-pr'
- # MAKING THE ACTUAL PR
- - name: Copy files for new docs version ACTUAL PR
+ - name: Copy files for new docs version DIFF PR
uses: ./release/.github/actions/copy-cloud-docs-for-tfe
with:
- source_path: "${{github.workspace}}/release"
- target_path: "${{github.workspace}}/new-docs-pr"
+ source_path: '${{github.workspace}}/release'
+ target_path: '${{github.workspace}}/new-docs-diff-pr'
new_TFE_version: ${{env.SERIES}}-${{env.RELEASE}}
- - name: Open new docs version ACTUAL PR
- working-directory: "${{github.workspace}}/new-docs-pr"
+ - name: Open new docs version DIFF PR
+ working-directory: '${{github.workspace}}/new-docs-diff-pr'
env:
- branch_name: docs/${{env.SERIES}}-${{env.RELEASE}}
+ release_branch_name: docs/${{env.SERIES}}-${{env.RELEASE}}
+ branch_name: docs-diff/${{env.SERIES}}-${{env.RELEASE}}
pr_body: |
- # Automated Docs PR for TFE ${{env.SERIES}}-${{env.RELEASE}}
+ # Automated Docs Diff PR for TFE ${{env.SERIES}}-${{env.RELEASE}}
**TFE Series**: ${{ env.SERIES }}
**TFE Release**: ${{ env.RELEASE }}
@@ -177,15 +169,8 @@ jobs:
Triggered by creation of branch:
- ${{github.server_url}}/${{github.repository}}/tree/${{env.release_branch}}
- Changes against the current TFE docs:
- - ${{ env.DIFF_PR_URL }}
-
- ### Reviewers
-
- > **Note**: The `digital-content-events` GH App currently does not have permissions to request PR reviews from teams.
-
- - [ ] @hashicorp/ptfe-review
- - [ ] @hashicorp/web-platform
+ Merges into the new docs release version branch:
+ - ${{ env.PR_URL }}
# secrets.WORKFLOW_TESTING_TOKEN requires permissions read:org, repo, workflow
run: |
@@ -204,16 +189,48 @@ jobs:
git checkout -b ${{env.branch_name}}
git add .
- git commit -m "Automated Docs PR" --no-verify
+ git commit -m "Automated Docs Diff PR" --no-verify
git push origin HEAD
gh pr create \
--body="${{env.pr_body}}" \
- --title="Automated Docs PR for TFE ${{env.SERIES}}-${{env.RELEASE}}" \
+ --title="Automated Docs Diff PR for TFE ${{env.SERIES}}-${{env.RELEASE}}" \
--draft \
--head ${{env.branch_name}} \
- --base main
+ --base ${{env.release_branch_name}}
- pr_url=$(gh pr view --json url --jq '.url')
- echo "PR_URL=${pr_url}" >> $GITHUB_ENV
- echo "**Automated ACTUAL PR URL**: ${pr_url}" >> $GITHUB_STEP_SUMMARY
+ diff_pr_url=$(gh pr view --json url --jq '.url')
+ echo "DIFF_PR_URL=${diff_pr_url}" >> $GITHUB_ENV
+ echo "**Automated DIFF PR URL**: ${diff_pr_url}" >> $GITHUB_STEP_SUMMARY
+
+ - name: Update RELEASE PR with DIFF PR URL
+ env:
+ branch_name: docs/${{env.SERIES}}-${{env.RELEASE}}
+ pr_body: |
+ # Automated Docs Release PR for TFE ${{env.SERIES}}-${{env.RELEASE}}
+
+ **TFE Series**: ${{ env.SERIES }}
+ **TFE Release**: ${{ env.RELEASE }}
+
+ This PR was created via:
+ - ${{github.server_url}}/${{github.repository}}/actions/runs/${{github.run_id}}
+
+ Triggered by creation of branch:
+ - ${{github.server_url}}/${{github.repository}}/tree/${{env.release_branch}}
+
+ Changes against the current TFE docs:
+ - ${{ env.DIFF_PR_URL }}
+
+ ### Reviewers
+
+ > **Note**: The `digital-content-events` GH App currently does not have permissions to request PR reviews from teams.
+
+ - [ ] @hashicorp/ptfe-review
+ - [ ] @hashicorp/web-platform
+ run: |
+ echo ${{ secrets.WORKFLOW_TESTING_TOKEN }} | gh auth login --with-token
+ git config --global user.email "team-rel-eng@hashicorp.com"
+ git config --global user.name "tfe-release-bot"
+
+ gh pr update ${{env.PR_URL}} \
+ --body="${{env.pr_body}}"
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/data/.gitkeep b/content/terraform-enterprise/v000011-1/v202504-1/data/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/data/enterprise-nav-data.json b/content/terraform-enterprise/v000011-1/v202504-1/data/enterprise-nav-data.json
new file mode 100644
index 0000000000..d12ca760d0
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/data/enterprise-nav-data.json
@@ -0,0 +1,1486 @@
+[
+ { "heading": "Terraform Enterprise" },
+ { "title": "Overview", "path": "" },
+ {
+ "title": "API",
+ "routes": [
+ {
+ "title": "API Docs template",
+ "path": "api-docs/_template",
+ "hidden": true
+ },
+ { "title": "Overview", "path": "api-docs" },
+ { "title": "Account", "path": "api-docs/account" },
+ {
+ "title": "Admin",
+ "routes": [
+ { "title": "Overview", "path": "api-docs/admin" },
+ {
+ "title": "Registry Sharing",
+ "path": "api-docs/admin/registry-sharing"
+ },
+ {
+ "title": "Module Sharing",
+ "path": "api-docs/admin/module-sharing"
+ },
+ {
+ "title": "Organizations",
+ "path": "api-docs/admin/organizations"
+ },
+ { "title": "Runs", "path": "api-docs/admin/runs" },
+ {
+ "title": "Settings",
+ "path": "api-docs/admin/settings"
+ },
+ {
+ "title": "Terraform Versions",
+ "path": "api-docs/admin/terraform-versions"
+ },
+ {
+ "title": "OPA Versions",
+ "path": "api-docs/admin/opa-versions"
+ },
+ {
+ "title": "Sentinel Versions",
+ "path": "api-docs/admin/sentinel-versions"
+ },
+ { "title": "Users", "path": "api-docs/admin/users" },
+ { "title": "Initial Admin User", "path": "api-docs/admin/initial-admin-user" },
+ {
+ "title": "Workspaces",
+ "path": "api-docs/admin/workspaces"
+ }
+ ]
+ },
+ {
+ "title": "Agent Pools",
+ "path": "api-docs/agents"
+ },
+ { "title": "Agent Tokens", "path": "api-docs/agent-tokens" },
+ { "title": "Applies", "path": "api-docs/applies" },
+ { "title": "Assessment Results", "path": "api-docs/assessment-results" },
+ {
+ "title": "Comments",
+ "path": "api-docs/comments"
+ },
+ {
+ "title": "Configuration Versions",
+ "path": "api-docs/configuration-versions"
+ },
+ {
+ "title": "Cost Estimates",
+ "path": "api-docs/cost-estimates"
+ },
+ { "title": "Data Retention Policies", "path": "api-docs/data-retention-policies" },
+ {
+ "title": "GitHub App Installations",
+ "path": "api-docs/github-app-installations"
+ },
+ {
+ "title": "Notification Configurations",
+ "path": "api-docs/notification-configurations"
+ },
+ {
+ "title": "No-Code Provisioning",
+ "path": "api-docs/no-code-provisioning"
+ },
+ { "title": "OAuth Clients", "path": "api-docs/oauth-clients" },
+ { "title": "OAuth Tokens", "path": "api-docs/oauth-tokens" },
+ { "title": "Organizations", "path": "api-docs/organizations" },
+ {
+ "title": "Organization Memberships",
+ "path": "api-docs/organization-memberships"
+ },
+ {
+ "title": "Organization Tags",
+ "path": "api-docs/organization-tags"
+ },
+ {
+ "title": "Organization Tokens",
+ "path": "api-docs/organization-tokens"
+ },
+ { "title": "Plan Exports", "path": "api-docs/plan-exports" },
+ { "title": "Plans", "path": "api-docs/plans" },
+ { "title": "Policies", "path": "api-docs/policies" },
+ { "title": "Policy Checks", "path": "api-docs/policy-checks" },
+ {
+ "title": "Policy Evaluations",
+ "path": "api-docs/policy-evaluations"
+ },
+ { "title": "Policy Sets", "path": "api-docs/policy-sets" },
+ {
+ "title": "Policy Set Parameters",
+ "path": "api-docs/policy-set-params"
+ },
+ {
+ "title": "Private Registry",
+ "routes": [
+ { "title": "Modules", "path": "api-docs/private-registry/modules" },
+ { "title": "Manage Module Versions", "path": "api-docs/private-registry/manage-module-versions" },
+ {
+ "title": "Providers",
+ "path": "api-docs/private-registry/providers"
+ },
+ {
+ "title": "Private Provider Versions and Platforms",
+ "path": "api-docs/private-registry/provider-versions-platforms"
+ },
+ { "title": "GPG Keys", "path": "api-docs/private-registry/gpg-keys" },
+ {
+ "title": "Tests",
+ "path": "api-docs/private-registry/tests"
+ }
+ ]
+ },
+ { "title": "Projects", "path": "api-docs/projects" },
+ {
+ "title": "Project Team Access",
+ "path": "api-docs/project-team-access"
+ },
+ { "title": "Reserved Tag Keys", "path": "api-docs/reserved-tag-keys"},
+ { "title": "Runs", "path": "api-docs/run" },
+ {
+ "title": "Run Tasks",
+ "routes": [
+ { "title": "Run Tasks", "path": "api-docs/run-tasks/run-tasks" },
+ {
+ "title": "Stages and Results",
+ "path": "api-docs/run-tasks/run-task-stages-and-results"
+ },
+ {
+ "title": "Custom Integration",
+ "path": "api-docs/run-tasks/run-tasks-integration"
+ }
+ ]
+ },
+ { "title": "Run Triggers", "path": "api-docs/run-triggers" },
+ { "title": "SSH Keys", "path": "api-docs/ssh-keys" },
+ {
+ "title": "State Versions",
+ "path": "api-docs/state-versions"
+ },
+ {
+ "title": "State Version Outputs",
+ "path": "api-docs/state-version-outputs"
+ },
+ { "title": "Team Access", "path": "api-docs/team-access" },
+ { "title": "Team Membership", "path": "api-docs/team-members" },
+ { "title": "Team Tokens", "path": "api-docs/team-tokens" },
+ { "title": "Teams", "path": "api-docs/teams" },
+ { "title": "User Tokens", "path": "api-docs/user-tokens" },
+ { "title": "Users", "path": "api-docs/users" },
+ { "title": "Variables", "path": "api-docs/variables" },
+ { "title": "VCS Events", "path": "api-docs/vcs-events" },
+ { "title": "Workspaces", "path": "api-docs/workspaces" },
+ {
+ "title": "Workspace-Specific Variables",
+ "path": "api-docs/workspace-variables"
+ },
+ {
+ "title": "Workspace Resources",
+ "path": "api-docs/workspace-resources"
+ },
+ {
+ "title": "Variable Sets",
+ "path": "api-docs/variable-sets"
+ },
+ {
+ "title": "Changelog",
+ "path": "api-docs/changelog"
+ },
+ {
+ "title": "Stability Policy",
+ "path": "api-docs/stability-policy"
+ }
+ ]
+ },
+ {
+ "title": "Deploy Terraform Enterprise",
+ "routes": [
+ { "title": "Overview", "path": "deploy" },
+ {
+ "title": "Migrate to a non-Replicated runtime",
+ "path": "deploy/replicated-migration"
+ },
+ {
+ "title": "Prepare host environment",
+ "path": "deploy/prepare-host"
+ },
+ {
+ "title": "Create deployment configuration",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "deploy/configuration"
+ },
+ {
+ "title": "Configure a license",
+ "path": "deploy/configuration/license"
+ },
+ {
+ "title": "Configure network access",
+ "path": "deploy/configuration/network"
+ },
+ {
+ "title": "Configure data storage",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "deploy/configuration/storage"
+ },
+ {
+ "title": "Configure operational mode",
+ "path": "deploy/configuration/storage/configure-mode"
+ },
+ {
+ "title": "Configure object storage",
+ "path": "deploy/configuration/storage/connect-object"
+ },
+ {
+ "title": "Configure database connection",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "deploy/configuration/storage/connect-database"
+ },
+ {
+ "title": "Connect to PostgreSQL",
+ "path": "deploy/configuration/storage/connect-database/postgres"
+ },
+ {
+ "title": "Connect to a PostgreSQL cluster BETA",
+ "path": "deploy/configuration/storage/connect-database/postgres-cluster"
+ },
+ {
+ "title": "Connect to a PostgreSQL cluster deployed with Patroni BETA",
+ "path": "deploy/configuration/storage/connect-database/patroni"
+ },
+ {
+ "title": "Connect to a PostgreSQL cluster deployed with Aurora BETA",
+ "path": "deploy/configuration/storage/connect-database/aurora"
+ },
+ {
+ "title": "Measure database failover resilience BETA",
+ "path": "deploy/configuration/storage/connect-database/failover-resilience"
+ }
+ ]
+ },
+ {
+ "title": "Configure Redis connection",
+ "path": "deploy/configuration/storage/connect-redis"
+ },
+ {
+ "title": "Configure external Vault connection",
+ "path": "deploy/configuration/storage/connect-vault"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "title": "Deploy to Nomad",
+ "path": "deploy/nomad"
+ },
+ {
+ "title": "Deploy to Kubernetes",
+ "routes": [
+ {
+ "title": "Install Terraform Enterprise",
+ "path": "deploy/kubernetes"
+ },
+ {
+ "title": "Scale up your Kubernetes deployment",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "deploy/kubernetes/scale"
+ },
+ {
+ "title": "Increase replicas",
+ "path": "deploy/kubernetes/scale/replicas"
+ },
+ {
+ "title": "Increase run capacity",
+ "path": "deploy/kubernetes/scale/run-capacity"
+ }
+
+ ]
+ }
+ ]
+ },
+ {
+ "title": "Deploy to OpenShift",
+ "path": "deploy/openshift"
+ },
+ {
+ "title": "Deploy to Podman",
+ "path": "deploy/podman"
+ },
+ {
+ "title": "Deploy to Docker",
+ "routes": [
+ {
+ "title": "Install Terraform Enterprise",
+ "path": "deploy/docker"
+ },
+ {
+ "title": "Scale up your Docker deployment",
+ "path": "deploy/docker/scale"
+ }
+ ]
+ },
+ {
+ "title": "Deploy to Replicated DEPRECATED",
+ "routes": [
+ { "title": "Overview", "path": "deploy/replicated" },
+ {
+ "title": "Requirements",
+ "routes": [
+ {
+ "title": "Credentials",
+ "path": "deploy/replicated/requirements/credentials"
+ },
+ {
+ "title": "Hardware",
+ "path": "deploy/replicated/requirements/hardware"
+ },
+ {
+ "title": "Operating System",
+ "routes": [
+ {
+ "title": "Supported OS",
+ "path": "deploy/replicated/requirements/os-specific/supported-os"
+ },
+ {
+ "title": "RedHat Linux",
+ "path": "deploy/replicated/requirements/os-specific/rhel-requirements"
+ },
+ {
+ "title": "CentOS Linux",
+ "path": "deploy/replicated/requirements/os-specific/centos-requirements"
+ }
+ ]
+ },
+ {
+ "title": "Data Storage",
+ "routes": [
+ {
+ "title": "Operation Mode",
+ "path": "deploy/replicated/requirements/data-storage/operational-mode-requirements"
+ },
+ {
+ "title": "PostgreSQL",
+ "path": "deploy/replicated/requirements/data-storage/postgres-requirements"
+ },
+ {
+ "title": "Minio Setup Guide",
+ "path": "deploy/replicated/requirements/data-storage/minio-setup-guide"
+ }
+ ]
+ },
+ {
+ "title": "Network",
+ "path": "deploy/replicated/requirements/network"
+ },
+ {
+ "title": "Docker Engine",
+ "path": "deploy/replicated/requirements/docker_engine"
+ }
+ ]
+ },
+ {
+ "title": "Installation",
+ "routes": [
+ {
+ "title": "Pre-Install Checklist",
+ "path": "deploy/replicated/install/pre-install-checklist"
+ },
+ {
+ "title": "Operation Modes",
+ "path": "deploy/replicated/install/operation-modes"
+ },
+ {
+ "title": "Interactive Install",
+ "routes": [
+ {
+ "title": "1. Run Installer",
+ "path": "deploy/replicated/install/interactive/installer"
+ },
+ {
+ "title": "2. Configure in Browser",
+ "path": "deploy/replicated/install/interactive/config"
+ }
+ ]
+ },
+ {
+ "title": "Automated Install",
+ "routes": [
+ {
+ "title": "Automated Installation",
+ "path": "deploy/replicated/install/automated/automating-the-installer"
+ },
+ {
+ "title": "Active/Active",
+ "path": "deploy/replicated/install/automated/active-active"
+ },
+ {
+ "title": "Initial User Automation",
+ "path": "deploy/replicated/install/automated/automating-initial-user"
+ },
+ {
+ "title": "Encryption Password",
+ "path": "deploy/replicated/install/automated/encryption-password"
+ }
+ ]
+ },
+ {
+ "title": "External Vault",
+ "path": "deploy/replicated/install/vault"
+ },
+ {
+ "title": "Uninstall",
+ "path": "deploy/replicated/install/uninstall"
+ }
+ ]
+ },
+ {
+ "title": "Administration",
+ "routes": [
+ { "title": "Overview", "path": "deploy/replicated/administration" },
+ {
+ "title": "License",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "deploy/replicated/administration/license"
+ },
+ {
+ "title": "Updating Terraform Enterprise License",
+ "path": "deploy/replicated/administration/license/update-tfe-license"
+ },
+ {
+ "title": "Automated License Utilization Reporting",
+ "path": "deploy/replicated/administration/license/automated-license-utilization-reporting"
+ }
+ ]
+ },
+ {
+ "title": "Infrastructure",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "deploy/replicated/administration/infrastructure"
+ },
+ {
+ "title": "Automated Recovery",
+ "path": "deploy/replicated/administration/infrastructure/automated-recovery"
+ },
+ {
+ "title": "Upgrades",
+ "routes": [
+ {
+ "title":"Overview",
+ "path": "deploy/replicated/administration/infrastructure/upgrades"
+ },
+ {
+ "title": "Prepare to upgrade",
+ "path": "deploy/replicated/administration/infrastructure/upgrades/prepare"
+ },
+ {
+ "title":"Upgrade",
+ "path": "deploy/replicated/administration/infrastructure/upgrades/upgrade"
+ }
+ ]
+ },
+ {
+ "title": "Backups and Restores",
+ "path": "deploy/replicated/administration/infrastructure/backup-restore"
+ },
+ {
+ "title": "Admin CLI Commands",
+ "path": "deploy/replicated/administration/infrastructure/admin-cli"
+ },
+ {
+ "title": "Alternative Worker to Agent Migration",
+ "path": "deploy/replicated/administration/infrastructure/worker-to-agent-migration"
+ },
+ {
+ "title": "Migrating from Mounted Disk Mode to External Services Mode",
+ "path": "deploy/replicated/administration/infrastructure/mounted-to-external-migration"
+ },
+ {
+ "title": "Consolidated Services",
+ "path": "deploy/replicated/administration/infrastructure/consolidated-services"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "title": "Architecture",
+ "routes": [
+ {
+ "title": "Reference",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "deploy/replicated/architecture/reference-architecture"
+ },
+ {
+ "title": "AWS Reference Architecture",
+ "path": "deploy/replicated/architecture/reference-architecture/aws"
+ },
+ {
+ "title": "Azure Reference Architecture",
+ "path": "deploy/replicated/architecture/reference-architecture/azure"
+ },
+ {
+ "title": "GCP Reference Architecture",
+ "path": "deploy/replicated/architecture/reference-architecture/gcp"
+ },
+ {
+ "title": "VMware Reference Architecture",
+ "path": "deploy/replicated/architecture/reference-architecture/vmware"
+ }
+ ]
+ },
+ {
+ "title": "System",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "deploy/replicated/architecture/system-overview"
+ },
+ {
+ "title": "Reliability & Availability",
+ "path": "deploy/replicated/architecture/system-overview/reliability-availability"
+ },
+ {
+ "title": "Capacity & Performance",
+ "path": "deploy/replicated/architecture/system-overview/capacity"
+ },
+ {
+ "title": "Security Model",
+ "path": "deploy/replicated/architecture/system-overview/security-model"
+ },
+ {
+ "title": "Data Security",
+ "path": "deploy/replicated/architecture/system-overview/data-security"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "title": "Monitoring",
+ "routes": [
+ {
+ "title": "Log Forwarding",
+ "path": "deploy/replicated/monitoring/logging"
+ },
+ {
+ "title": "Metrics and monitoring",
+ "path": "deploy/replicated/monitoring/monitoring"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "title": "Create initial admin user",
+ "path": "deploy/initial-admin-user"
+ },
+ {
+ "title": "Create a custom worker image",
+ "path": "deploy/custom-image"
+ },
+ {
+ "title": "Manage deployment",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "deploy/manage"
+ },
+ {
+ "title": "Connect to Terraform Enterprise CLI",
+ "path": "deploy/manage/access-cli"
+ },
+ {
+ "title": "Backup and restore",
+ "path": "deploy/manage/backup-restore"
+ },
+ {
+ "title": "Database failover",
+ "path": "deploy/manage/failover"
+ },
+ {
+ "title": "Upgrade",
+ "path": "deploy/manage/upgrade"
+ },
+ {
+ "title": "Monitor",
+ "path": "deploy/manage/monitor"
+ },
+ { "title": "Enable automated license utilization reports",
+ "path": "deploy/manage/license-report"
+ },
+ { "title": "Enable automated product usage reports",
+ "path": "deploy/manage/product-report"
+ }
+ ]
+ },
+ {
+ "title": "Reference",
+ "routes": [
+ {
+ "title": "Configuration",
+ "path": "deploy/reference/configuration"
+ },
+ {
+ "title": "CLI",
+ "path": "deploy/reference/cli"
+ },
+ {
+ "title": "Startup checks",
+ "path": "deploy/reference/startup-checks"
+ },
+ {
+ "title": "Container metrics",
+ "path": "deploy/reference/metrics"
+ },
+ {
+ "title": "Application services",
+ "path": "deploy/reference/services"
+ },
+ {
+ "title": "Data security",
+ "path": "deploy/reference/data-security"
+ },
+ {
+ "title": "Application security",
+ "path": "deploy/reference/application-security"
+ },
+ {
+ "title": "License usage data",
+ "path": "deploy/reference/license-data"
+ },
+ {
+ "title": "Product usage data",
+ "path": "deploy/reference/product-data"
+ }
+ ]
+ },
+ {
+ "title": "Troubleshoot",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "deploy/troubleshoot"
+ },
+ {
+ "title": "Contact support",
+ "path": "deploy/troubleshoot/contact-support"
+ },
+ {
+ "title": "Perform diagnostics",
+ "path": "deploy/troubleshoot/perform-diagnostics"
+ },
+ {
+ "title": "Error messages",
+ "path": "deploy/troubleshoot/error-messages"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "title": "Application Administration",
+ "routes": [
+ { "title": "Overview", "path": "application-administration" },
+ {
+ "title": "Access the Admin Interface",
+ "path": "application-administration/admin-access"
+ },
+ {
+ "title": "General Settings",
+ "path": "application-administration/general"
+ },
+ {
+ "title": "Customize the UI",
+ "path": "application-administration/customization"
+ },
+ {
+ "title": "Integration Settings",
+ "path": "application-administration/integration"
+ },
+ {
+ "title": "OPA Tool Version Settings",
+ "path": "application-administration/opa-tool-versions"
+ },
+ {
+ "title": "Sentinel Tool Version Settings",
+ "path": "application-administration/sentinel-tool-versions"
+ },
+ {
+ "title": "GitHub App Integration",
+ "path": "application-administration/github-app-integration"
+ },
+ {
+ "title": "Manage Accounts and Resources",
+ "path": "application-administration/resources"
+ },
+ {
+ "title": "Share Registry Artifacts",
+ "path": "application-administration/registry-sharing"
+ },
+ {
+ "title": "Agents on Terraform Enterprise",
+ "path": "application-administration/agents-on-tfe"
+ }
+ ]
+ },
+ {
+ "title": "Users, Teams, Organizations",
+ "routes": [
+ { "title": "Users", "path": "users-teams-organizations/users" },
+ {
+ "title": "Teams",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "users-teams-organizations/teams"
+ },
+ {
+ "title": "Manage teams",
+ "path": "users-teams-organizations/teams/manage"
+ },
+ {
+ "title": "Notifications",
+ "path": "users-teams-organizations/teams/notifications"
+ }
+ ]
+ },
+ {
+ "title": "Organizations",
+ "routes": [
+ {"title": "Overview","path": "users-teams-organizations/organizations"},
+ {
+ "title": "Manage reserved tag keys",
+ "path": "users-teams-organizations/organizations/manage-reserved-tags"
+ },
+ { "title": "VCS status checks", "path": "users-teams-organizations/organizations/vcs-status-checks" },
+ { "title": "Automatically cancel plan-only runs", "path": "users-teams-organizations/organizations/vcs-speculative-plan-management" }
+ ]
+ },
+ {
+ "title": "Permissions",
+ "path": "users-teams-organizations/permissions"
+ },
+
+ {
+ "title": "Two-factor Authentication",
+ "path": "users-teams-organizations/2fa"
+ },
+ {
+ "title": "API Tokens",
+ "path": "users-teams-organizations/api-tokens"
+ }
+ ]
+ },
+ {
+ "title": "SAML SSO",
+ "routes": [
+ {
+ "title": "Configuration",
+ "path": "saml/configuration"
+ },
+ {
+ "title": "Team Membership",
+ "path": "saml/team-membership"
+ },
+ {
+ "title": "Attributes",
+ "path": "saml/attributes"
+ },
+ {
+ "title": "Login",
+ "path": "saml/login"
+ },
+ {
+ "title": "Identity Providers",
+ "routes": [
+ {
+ "title": "Sample Auth Request",
+ "path": "saml/idp-configuration"
+ },
+ {
+ "title": "ADFS",
+ "path": "saml/idp-configuration/adfs"
+ },
+ {
+ "title": "Azure Active Directory",
+ "path": "saml/idp-configuration/aad"
+ },
+ {
+ "title": "Okta",
+ "path": "saml/idp-configuration/okta"
+ },
+ {
+ "title": "OneLogin",
+ "path": "saml/idp-configuration/onelogin"
+ }
+ ]
+ },
+ {
+ "title": "Troubleshooting",
+ "path": "saml/troubleshooting"
+ }
+ ]
+ },
+ {
+ "title": "Projects",
+ "routes": [
+ { "title": "Overview", "path": "projects" },
+ {
+ "title": "Managing Projects",
+ "path": "projects/manage"
+ },
+ { "title": "Best Practices", "path": "projects/best-practices" }
+ ]
+ },
+ {
+ "title": "Workspaces",
+ "routes": [
+ { "title": "Overview", "path": "workspaces" },
+ {
+ "title": "Create Workspaces",
+ "path": "workspaces/create"
+ },
+ {
+ "title": "Create tags",
+ "path": "workspaces/tags"
+ },
+ {
+ "title": "Browse workspaces",
+ "path": "workspaces/browse"
+ },
+ {
+ "title": "Terraform Configurations",
+ "path": "workspaces/configurations"
+ },
+ {
+ "title": "Dynamic Provider Credentials",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "workspaces/dynamic-provider-credentials"
+ },
+ {
+ "title": "Workload Identity Tokens",
+ "path": "workspaces/dynamic-provider-credentials/workload-identity-tokens"
+ },
+ {
+ "title": "Vault Configuration",
+ "path": "workspaces/dynamic-provider-credentials/vault-configuration"
+ },
+ {
+ "title": "AWS Configuration",
+ "path": "workspaces/dynamic-provider-credentials/aws-configuration"
+ },
+ {
+ "title": "GCP Configuration",
+ "path": "workspaces/dynamic-provider-credentials/gcp-configuration"
+ },
+ {
+ "title": "Azure Configuration",
+ "path": "workspaces/dynamic-provider-credentials/azure-configuration"
+ },
+ { "title": "Kubernetes Configuration",
+ "path": "workspaces/dynamic-provider-credentials/kubernetes-configuration"
+ },
+ {
+ "title": "HCP Configuration",
+ "path": "workspaces/dynamic-provider-credentials/hcp-configuration"
+ },
+ {
+ "title": "HCP Vault Secrets",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "workspaces/dynamic-provider-credentials/hcp-vault-secrets-backed"
+ },
+ {
+ "title": "AWS Configuration",
+ "path": "workspaces/dynamic-provider-credentials/hcp-vault-secrets-backed/aws-configuration"
+ },
+ {
+ "title": "GCP Configuration",
+ "path": "workspaces/dynamic-provider-credentials/hcp-vault-secrets-backed/gcp-configuration"
+ }
+ ]
+ },
+ {
+ "title": "Manually Generating Workload Identity Tokens",
+ "path": "workspaces/dynamic-provider-credentials/manual-generation"
+ },
+ {
+ "title": "Specifying Multiple Configurations",
+ "path": "workspaces/dynamic-provider-credentials/specifying-multiple-configurations"
+ },
+ {
+ "title": "Vault-Backed Dynamic Credentials",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "workspaces/dynamic-provider-credentials/vault-backed"
+ },
+ {
+ "title": "AWS Configuration",
+ "path": "workspaces/dynamic-provider-credentials/vault-backed/aws-configuration"
+ },
+ {
+ "title": "GCP Configuration",
+ "path": "workspaces/dynamic-provider-credentials/vault-backed/gcp-configuration"
+ },
+ {
+ "title": "Azure Configuration",
+ "path": "workspaces/dynamic-provider-credentials/vault-backed/azure-configuration"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "title": "Variables",
+ "routes": [
+ { "title": "Overview", "path": "workspaces/variables" },
+ {
+ "title": "Managing Variables",
+ "path": "workspaces/variables/managing-variables"
+ }
+ ]
+ },
+ { "title": "Health", "path": "workspaces/health" },
+ {
+ "title": "Settings",
+ "routes": [
+ { "title": "Overview", "path": "workspaces/settings" },
+ { "title": "VCS Connections", "path": "workspaces/settings/vcs" },
+ { "title": "Access", "path": "workspaces/settings/access" },
+ {
+ "title": "Notifications",
+ "path": "workspaces/settings/notifications"
+ },
+ {
+ "title": "SSH Keys for Modules",
+ "path": "workspaces/settings/ssh-keys"
+ },
+ {
+ "title": "Run Triggers",
+ "path": "workspaces/settings/run-triggers"
+ },
+ {
+ "title": "Run Tasks",
+ "path": "workspaces/settings/run-tasks"
+ },
+ {
+ "title": "Destruction and Deletion",
+ "path": "workspaces/settings/deletion"
+ }
+ ]
+ },
+ { "title": "Terraform State", "path": "workspaces/state" },
+ {
+ "title": "JSON Filtering",
+ "path": "workspaces/json-filtering"
+ },
+ { "title": "Best Practices", "path": "workspaces/best-practices"}
+ ]
+ },
+ {
+ "title": "Terraform Runs",
+ "routes": [
+ { "title": "Remote Operations", "path": "run/remote-operations" },
+ { "title": "Viewing and Managing Runs", "path": "run/manage" },
+ { "title": "Run States and Stages", "path": "run/states" },
+ { "title": "Run Modes and Options", "path": "run/modes-and-options" },
+ { "title": "UI/VCS-driven Runs", "path": "run/ui" },
+ { "title": "API-driven Runs", "path": "run/api" },
+ { "title": "CLI-driven Runs", "path": "run/cli" },
+ {
+ "title": "The Run Environment",
+ "path": "run/run-environment"
+ },
+ {
+ "title": "Installing Software",
+ "path": "run/install-software"
+ }
+ ]
+ },
+
+ {
+ "title": "Connect to VCS",
+ "routes": [
+ { "title": "Overview", "path": "vcs" },
+ { "title": "GitHub.com (OAuth)", "path": "vcs/github" },
+ {
+ "title": "GitHub Enterprise",
+ "path": "vcs/github-enterprise"
+ },
+ { "title": "GitLab.com", "path": "vcs/gitlab-com" },
+ { "title": "GitLab EE and CE", "path": "vcs/gitlab-eece" },
+ { "title": "Bitbucket Cloud", "path": "vcs/bitbucket-cloud" },
+ {
+ "title": "Bitbucket Data Center",
+ "path": "vcs/bitbucket-data-center"
+ },
+ {
+ "title": "Azure DevOps Services",
+ "path": "vcs/azure-devops-services"
+ },
+ {
+ "title": "Azure DevOps Server",
+ "path": "vcs/azure-devops-server"
+ },
+ { "title": "Troubleshooting", "path": "vcs/troubleshooting" }
+ ]
+ },
+
+ {
+ "title": "Private Registry",
+ "routes": [
+ { "title": "Overview", "path": "registry" },
+ {
+ "title": "Adding Public Providers and Modules",
+ "path": "registry/add"
+ },
+ {
+ "title": "Publishing Private Providers",
+ "path": "registry/publish-providers"
+ },
+ {
+ "title": "Public Providers in an Airgapped Installation",
+ "path": "registry/airgapped-providers"
+ },
+ {
+ "title": "Publishing Private Modules",
+ "path": "registry/publish-modules"
+ },
+ { "title": "Deprecate Module Versions", "path": "registry/manage-module-versions" },
+ {
+ "title": "Test-Integrated Modules",
+ "path": "registry/test"
+ },
+ { "title": "Using Providers and Modules", "path": "registry/using" },
+ {
+ "title": "Configuration Designer",
+ "path": "registry/design"
+ }
+ ]
+ },
+ {
+ "title": "No-Code Provisioning",
+ "routes": [
+ {
+ "title": "Designing No-Code Ready Modules",
+ "path": "no-code-provisioning/module-design"
+ },
+ {
+ "title": "Provisioning No-Code Infrastructure",
+ "path": "no-code-provisioning/provisioning"
+ }
+ ]
+ },
+ {
+ "title": "Migrating to Terraform Enterprise",
+ "routes": [
+ {
+ "title": "Manually migrate",
+ "path": "migrate"
+ },
+ {
+ "title": "Use the tf-migrate CLI",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "migrate/tf-migrate"
+ },
+ {
+ "title": "tf-migrate commands reference",
+ "routes": [
+ {
+ "title": "Configuration file reference",
+ "path": "migrate/tf-migrate/reference/configuration"
+ },
+ {
+ "title": "prepare command",
+ "path": "migrate/tf-migrate/reference/prepare"
+ },
+ {
+ "title": "execute command",
+ "path": "migrate/tf-migrate/reference/execute"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "title": "Policy enforcement",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "policy-enforcement"
+ },
+ {
+ "title": "Define policies",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "policy-enforcement/define-policies"
+ },
+ {
+ "title": "Custom Sentinel policies",
+ "path": "policy-enforcement/define-policies/custom-sentinel"
+ },
+ {
+ "title": "OPA policies",
+ "path": "policy-enforcement/define-policies/opa"
+ }
+ ]
+ },
+ {
+ "title": "Create and manage policy sets",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "policy-enforcement/manage-policy-sets"
+ },
+ {
+ "title": "Create Sentinel policy sets in VCS",
+ "path": "policy-enforcement/manage-policy-sets/sentinel-vcs"
+ },
+ {
+ "title": "Connect to OPA policies in VCS",
+ "path": "policy-enforcement/manage-policy-sets/opa-vcs"
+ }
+ ]
+ },
+ {
+ "title": "Run pre-written Sentinel policies",
+ "path": "policy-enforcement/prewritten-sentinel"
+ },
+ {
+ "title": "Test Sentinel policies",
+ "path": "policy-enforcement/test-sentinel"
+ },
+ {
+ "title": "View policy results",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "policy-enforcement/view-results"
+ },
+ {
+ "title": "View Sentinel JSON results",
+ "path": "policy-enforcement/view-results/json"
+ }
+ ]
+ },
+ {
+ "title": "Pre-written policy library",
+ "path": "policy-enforcement/prewritten-library"
+ },
+ {
+ "title": "Sentinel import reference",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "policy-enforcement/import-reference"
+ },
+ {
+ "title": "tfconfig",
+ "path": "policy-enforcement/import-reference/tfconfig"
+ },
+ {
+ "title": "tfconfig/v2",
+ "path": "policy-enforcement/import-reference/tfconfig-v2"
+ },
+ {
+ "title": "tfplan",
+ "path": "policy-enforcement/import-reference/tfplan"
+ },
+ {
+ "title": "tfplan/v2",
+ "path": "policy-enforcement/import-reference/tfplan-v2"
+ },
+ {
+ "title": "tfstate",
+ "path": "policy-enforcement/import-reference/tfstate"
+ },
+ {
+ "title": "tfstate/v2",
+ "path": "policy-enforcement/import-reference/tfstate-v2"
+ },
+ {
+ "title": "tfrun",
+ "path": "policy-enforcement/import-reference/tfrun"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "title": "Cost Estimation",
+ "routes": [
+ { "title": "Overview", "path": "cost-estimation" },
+ { "title": "AWS", "path": "cost-estimation/aws" },
+ { "title": "GCP", "path": "cost-estimation/gcp" },
+ { "title": "Azure", "path": "cost-estimation/azure" }
+ ]
+ },
+
+ {
+ "title": "Integrations",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "integrations"
+ },
+ {
+ "title": "Kubernetes Operator",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "integrations/kubernetes"
+ },
+ {
+ "title": "Setup",
+ "path": "integrations/kubernetes/setup"
+ },
+ {
+ "title": "API Reference",
+ "path": "integrations/kubernetes/api-reference"
+ },
+ {
+ "title": "Annotations and Labels",
+ "path": "integrations/kubernetes/annotations-and-labels"
+ },
+ {
+ "title": "Migration Guide",
+ "path": "integrations/kubernetes/ops-v2-migration"
+ }
+ ]
+ },
+ {
+ "title": "ServiceNow Integrations",
+ "routes": [
+ {
+ "title": "Service Catalog for Terraform",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "integrations/service-now/service-catalog-terraform"
+ },
+ {
+ "title": "Service Catalog",
+ "path": "integrations/service-now/service-catalog-terraform/service-catalog-config"
+ },
+ {
+ "title": "Admin Guide",
+ "path": "integrations/service-now/service-catalog-terraform/admin-guide"
+ },
+ {
+ "title": "Developer Reference",
+ "path": "integrations/service-now/service-catalog-terraform/developer-reference"
+ },
+ {
+ "title": "Example Customizations",
+ "path": "integrations/service-now/service-catalog-terraform/example-customizations"
+ },
+ {
+ "title": "Troubleshoot",
+ "path": "integrations/service-now/service-catalog-terraform/troubleshoot"
+ }
+ ]
+ },
+ {
+ "title": "Service Graph Connector for Terraform",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "integrations/service-now/service-graph"
+ },
+ {
+ "title": "Setup",
+ "path": "integrations/service-now/service-graph/service-graph-setup"
+ },
+ {
+ "title": "Resource Coverage",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "integrations/service-now/service-graph/resource-coverage"
+ },
+ {
+ "title": "AWS",
+ "path": "integrations/service-now/service-graph/resource-coverage/aws"
+ },
+ {
+ "title": "Azure",
+ "path": "integrations/service-now/service-graph/resource-coverage/azure"
+ },
+ {
+ "title": "GCP",
+ "path": "integrations/service-now/service-graph/resource-coverage/gcp"
+ },
+ {
+ "title": "vSphere",
+ "path": "integrations/service-now/service-graph/resource-coverage/vsphere"
+ }
+ ]
+ },
+ {
+ "title": "Customizations",
+ "path": "integrations/service-now/service-graph/customizations"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "title": "Run Tasks Integration",
+ "path": "integrations/run-tasks"
+ },
+ {
+ "title": "AWS Service Catalog Integration",
+ "path": "integrations/aws-service-catalog"
+ }
+ ]
+ },
+ {
+ "title": "Releases",
+ "routes": [
+ {
+ "title": "Overview",
+ "path": "releases"
+ },
+ {
+ "title": "2025",
+ "routes": [
+ { "title": "Overview", "path": "releases/2025" },
+ { "title": "v202504-1", "path": "releases/2025/v202504-1" },
+ { "title": "v202503-1", "path": "releases/2025/v202503-1" },
+ { "title": "v202502-2", "path": "releases/2025/v202502-2" },
+ { "title": "v202502-1", "path": "releases/2025/v202502-1" },
+ { "title": "v202501-1", "path": "releases/2025/v202501-1" }
+ ]
+ },
+ {
+ "title": "2024",
+ "routes": [
+ { "title": "Overview", "path": "releases/2024" },
+ { "title": "v202411-2", "path": "releases/2024/v202411-2" },
+ { "title": "v202411-1", "path": "releases/2024/v202411-1" },
+ { "title": "v202410-1", "path": "releases/2024/v202410-1" },
+ { "title": "v202409-3", "path": "releases/2024/v202409-3" },
+ { "title": "v202409-2", "path": "releases/2024/v202409-2" },
+ { "title": "v202409-1", "path": "releases/2024/v202409-1" },
+ { "title": "v202408-1", "path": "releases/2024/v202408-1" },
+ { "title": "v202407-1", "path": "releases/2024/v202407-1" },
+ { "title": "v202406-1", "path": "releases/2024/v202406-1" },
+ { "title": "v202405-1", "path": "releases/2024/v202405-1" },
+ { "title": "v202404-2", "path": "releases/2024/v202404-2" },
+ { "title": "v202404-1", "path": "releases/2024/v202404-1" },
+ { "title": "v202402-2", "path": "releases/2024/v202402-2" },
+ { "title": "v202402-1", "path": "releases/2024/v202402-1" },
+ { "title": "v202401-2", "path": "releases/2024/v202401-2" },
+ { "title": "v202401-1", "path": "releases/2024/v202401-1" }
+ ]
+ },
+ {
+ "title": "2023",
+ "routes": [
+ { "title": "Overview", "path": "releases/2023" },
+ { "title": "v202312-1", "path": "releases/2023/v202312-1" },
+ { "title": "v202311-1", "path": "releases/2023/v202311-1" },
+ { "title": "v202310-1", "path": "releases/2023/v202310-1" },
+ { "title": "v202309-1", "path": "releases/2023/v202309-1" },
+ { "title": "v202308-1", "path": "releases/2023/v202308-1" },
+ { "title": "v202307-1", "path": "releases/2023/v202307-1" },
+ { "title": "v202306-1", "path": "releases/2023/v202306-1" },
+ { "title": "v202305-2", "path": "releases/2023/v202305-2" },
+ { "title": "v202305-1", "path": "releases/2023/v202305-1" },
+ { "title": "v202304-1", "path": "releases/2023/v202304-1" },
+ { "title": "v202303-1", "path": "releases/2023/v202303-1" },
+ { "title": "v202302-1", "path": "releases/2023/v202302-1" },
+ { "title": "v202301-2", "path": "releases/2023/v202301-2" },
+ { "title": "v202301-1", "path": "releases/2023/v202301-1" }
+ ]
+ },
+ {
+ "title": "2022",
+ "routes": [
+ { "title": "Overview", "path": "releases/2022" },
+ { "title": "v202212-2", "path": "releases/2022/v202212-2" },
+ { "title": "v202212-1", "path": "releases/2022/v202212-1" },
+ { "title": "v202211-1", "path": "releases/2022/v202211-1" },
+ { "title": "v202210-1", "path": "releases/2022/v202210-1" },
+ { "title": "v202209-2", "path": "releases/2022/v202209-2" },
+ { "title": "v202209-1", "path": "releases/2022/v202209-1" },
+ { "title": "v202208-3", "path": "releases/2022/v202208-3" },
+ { "title": "v202208-2", "path": "releases/2022/v202208-2" },
+ { "title": "v202208-1", "path": "releases/2022/v202208-1" },
+ { "title": "v202207-2", "path": "releases/2022/v202207-2" },
+ { "title": "v202207-1", "path": "releases/2022/v202207-1" },
+ { "title": "v202206-1", "path": "releases/2022/v202206-1" },
+ { "title": "v202205-1", "path": "releases/2022/v202205-1" },
+ { "title": "v202204-2", "path": "releases/2022/v202204-2" },
+ { "title": "v202204-1", "path": "releases/2022/v202204-1" },
+ { "title": "v202203-1", "path": "releases/2022/v202203-1" },
+ { "title": "v202202-1", "path": "releases/2022/v202202-1" },
+ { "title": "v202201-2", "path": "releases/2022/v202201-2" },
+ { "title": "v202201-1", "path": "releases/2022/v202201-1" }
+ ]
+ },
+ {
+ "title": "2021",
+ "routes": [
+ { "title": "Overview", "path": "releases/2021" },
+ { "title": "v202112-2", "path": "releases/2021/v202112-2" },
+ { "title": "v202112-1", "path": "releases/2021/v202112-1" },
+ { "title": "v202111-1", "path": "releases/2021/v202111-1" },
+ { "title": "v202110-1", "path": "releases/2021/v202110-1" },
+ { "title": "v202109-2", "path": "releases/2021/v202109-2" },
+ { "title": "v202109-1", "path": "releases/2021/v202109-1" },
+ { "title": "v202108-1", "path": "releases/2021/v202108-1" },
+ { "title": "v202107-1", "path": "releases/2021/v202107-1" },
+ { "title": "v202106-1", "path": "releases/2021/v202106-1" },
+ { "title": "v202105-1", "path": "releases/2021/v202105-1" },
+ { "title": "v202104-1", "path": "releases/2021/v202104-1" },
+ { "title": "v202103-3", "path": "releases/2021/v202103-3" },
+ { "title": "v202103-2", "path": "releases/2021/v202103-2" },
+ { "title": "v202103-1", "path": "releases/2021/v202103-1" },
+ { "title": "v202102-2", "path": "releases/2021/v202102-2" },
+ { "title": "v202102-1", "path": "releases/2021/v202102-1" },
+ { "title": "v202101-1", "path": "releases/2021/v202101-1" }
+ ]
+ },
+ {
+ "title": "2020",
+ "routes": [{ "title": "Overview", "path": "releases/2020" }]
+ },
+ {
+ "title": "2019",
+ "routes": [{ "title": "Overview", "path": "releases/2019" }]
+ },
+ {
+ "title": "2018",
+ "routes": [{ "title": "Overview", "path": "releases/2018" }]
+ }
+ ]
+ },
+ { "divider": true },
+ { "title": "HCP Terraform Agents", "href": "/cloud-docs/agents" }
+]
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/.gitkeep b/content/terraform-enterprise/v000011-1/v202504-1/docs/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/_template.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/_template.mdx
new file mode 100644
index 0000000000..94c74253f0
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/_template.mdx
@@ -0,0 +1,222 @@
+---
+page_title: /example-endpoint API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/endpoint-name` to {A meaningful
+ description of this endpoint}. Aim for 130-160 characters total.
+source: terraform-docs-common
+---
+
+Follow this template to format each API method. There are usually multiple sections like this on a given API endpoint page.
+
+
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: http://jsonapi.org/format/#error-objects
+
+# Example name API reference
+
+A explanatory sentence about what this thing in HCP Terraform does.
+
+## Create a Something
+
+Add at least one sentence of description about what this endpoint does.
+
+
+
+`POST /organizations/:organization_name/somethings`
+
+
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:organization_name` | The name of the organization to create the something in. The organization must already exist in the system, and the user must have permissions to create new somethings. |
+
+
+
+-> **Note:** This endpoint cannot be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+
+
+| Status | Response | Reason |
+| ------- | -------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "somethings"`) | Successfully created a team |
+| [400][] | [JSON API error object][] | Invalid `include` parameter |
+| [404][] | [JSON API error object][] | Organization not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [500][] | [JSON API error object][] | Failure during team creation |
+
+
+
+### Query Parameters
+
+[These are standard URL query parameters](/terraform/enterprise/api-docs#query-parameters); remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+
+
+| Parameter | Description |
+| ----------------------- | ------------------------------------------------------------- |
+| `filter[workspace][id]` | **Required.** The workspace ID where this action will happen. |
+
+
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+
+
+| Key path | Type | Default | Description |
+| --------------------------- | ------ | ------- | ------------------------------------------------------------------------------------------------------ |
+| `data.type` | string | | Must be `"somethings"`. |
+| `data[].type` | string | | ... |
+| `data.attributes.category` | string | | Whether this is a blue or red something. Valid values are `"blue"` or `"red"`. |
+| `data.attributes.sensitive` | bool | `false` | Whether the value is sensitive. If true then the something is written once and not visible thereafter. |
+| `filter.workspace.name` | string | | The name of the workspace that owns the something. |
+| `filter.organization.name` | string | | The name of the organization that owns the workspace. |
+
+
+
+### Available Related Resources
+
+
+
+This GET endpoint can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource Name | Description |
+| ------------------ | --------------------------------------------- |
+| `organization` | The full organization record. |
+| `current_run` | Additional information about the current run. |
+| `current_run.plan` | The plan used in the current run. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type":"somethings",
+ "attributes": {
+ "category":"red",
+ "sensitive":true
+ }
+ },
+ "filter": {
+ "organization": {
+ "name":"my-organization"
+ },
+ "workspace": {
+ "name":"my-workspace"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/somethings
+```
+
+
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id":"som-EavQ1LztoRTQHSNT",
+ "type":"somethings",
+ "attributes": {
+ "sensitive":true,
+ "category":"red",
+ },
+ "relationships": {
+ "configurable": {
+ "data": {
+ "id":"ws-4j8p6jX1w33MiDC7",
+ "type":"workspaces"
+ },
+ "links": {
+ "related":"/api/v2/organizations/my-organization/workspaces/my-workspace"
+ }
+ }
+ },
+ "links": {
+ "self":"/api/v2/somethings/som-EavQ1LztoRTQHSNT"
+ }
+ }
+}
+```
+
+
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/account.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/account.mdx
new file mode 100644
index 0000000000..570770ef0d
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/account.mdx
@@ -0,0 +1,278 @@
+---
+page_title: /account API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/account` endpoint to manage the current
+ user. Learn how to read and update your account's details and change your
+ password.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Account API reference
+
+Account represents the current user interacting with Terraform. It returns the same type of object as the [Users](/terraform/enterprise/api-docs/users) API, but also includes an email address, which is hidden when viewing info about other users.
+
+For internal reasons, HCP Terraform associates team and organization tokens with a synthetic user account called _service user_. HCP Terraform returns the associated service user for account requests authenticated by a team or organization token. Use the `authenticated-resource` relationship to access the underlying team or organization associated with a token. For user tokens, you can use the user, itself.
+
+## Get your account details
+
+`GET /account/details`
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | -------------------------- |
+| [200][] | [JSON API document][] (`type: "users"`) | The request was successful |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/account/details
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "user-V3R563qtJNcExAkN",
+ "type": "users",
+ "attributes": {
+ "username": "admin",
+ "is-service-account": false,
+ "auth-method": "tfc",
+ "avatar-url": "https://www.gravatar.com/avatar/9babb00091b97b9ce9538c45807fd35f?s=100&d=mm",
+ "v2-only": false,
+ "is-site-admin": true,
+ "is-sso-login": false,
+ "email": "admin@hashicorp.com",
+ "unconfirmed-email": null,
+ "permissions": {
+ "can-create-organizations": true,
+ "can-change-email": true,
+ "can-change-username": true
+ }
+ },
+ "relationships": {
+ "authentication-tokens": {
+ "links": {
+ "related": "/api/v2/users/user-V3R563qtJNcExAkN/authentication-tokens"
+ }
+ },
+ "authenticated-resource": {
+ "data": {
+ "id": "user-V3R563qtJNcExAkN",
+ "type": "users"
+ },
+ "links": {
+ "related": "/api/v2/users/user-V3R563qtJNcExAkN"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/users/user-V3R563qtJNcExAkN"
+ }
+ }
+}
+```
+
+## Update your account info
+
+Your username and email address can be updated with this endpoint.
+
+`PATCH /account/update`
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "users"`) | Your info was successfully updated |
+| [401][] | [JSON API error object][] | Unauthorized |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| -------------------------- | ------ | ------- | --------------------------------------------------------------- |
+| `data.type` | string | | Must be `"users"` |
+| `data.attributes.username` | string | | New username |
+| `data.attributes.email` | string | | New email address (must be confirmed afterwards to take effect) |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "users",
+ "attributes": {
+ "email": "admin@example.com",
+ "username": "admin"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/account/update
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "user-V3R563qtJNcExAkN",
+ "type": "users",
+ "attributes": {
+ "username": "admin",
+ "is-service-account": false,
+ "auth-method": "hcp_username_password",
+ "avatar-url": "https://www.gravatar.com/avatar/9babb00091b97b9ce9538c45807fd35f?s=100&d=mm",
+ "v2-only": false,
+ "is-site-admin": true,
+ "is-sso-login": false,
+ "email": "admin@hashicorp.com",
+ "unconfirmed-email": null,
+ "permissions": {
+ "can-create-organizations": true,
+ "can-change-email": true,
+ "can-change-username": true
+ }
+ },
+ "relationships": {
+ "authentication-tokens": {
+ "links": {
+ "related": "/api/v2/users/user-V3R563qtJNcExAkN/authentication-tokens"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/users/user-V3R563qtJNcExAkN"
+ }
+ }
+}
+```
+
+## Change your password
+
+`PATCH /account/password`
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "users"`) | Your password was successfully changed |
+| [401][] | [JSON API error object][] | Unauthorized |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| --------------------------------------- | ------ | ------- | ------------------------------------------------------- |
+| `data.type` | string | | Must be `"users"` |
+| `data.attributes.current_password` | string | | Current password |
+| `data.attributes.password` | string | | New password (must be at least 10 characters in length) |
+| `data.attributes.password_confirmation` | string | | New password (confirmation) |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "users",
+ "attributes": {
+ "current_password": "current password e.g. 2:C)e'G4{D\n06:[d1~y",
+ "password": "new password e.g. 34rk492+jgLL0@xhfyisj",
+ "password_confirmation": "new password e.g. 34rk492+jLL0@xhfyisj"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/account/password
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "user-V3R563qtJNcExAkN",
+ "type": "users",
+ "attributes": {
+ "username": "admin",
+ "is-service-account": false,
+ "auth-method": "hcp_github",
+ "avatar-url": "https://www.gravatar.com/avatar/9babb00091b97b9ce9538c45807fd35f?s=100&d=mm",
+ "v2-only": false,
+ "is-site-admin": true,
+ "is-sso-login": false,
+ "email": "admin@hashicorp.com",
+ "unconfirmed-email": null,
+ "permissions": {
+ "can-create-organizations": true,
+ "can-change-email": true,
+ "can-change-username": true
+ }
+ },
+ "relationships": {
+ "authentication-tokens": {
+ "links": {
+ "related": "/api/v2/users/user-V3R563qtJNcExAkN/authentication-tokens"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/users/user-V3R563qtJNcExAkN"
+ }
+ }
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/index.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/index.mdx
new file mode 100644
index 0000000000..e2138cb2f8
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/index.mdx
@@ -0,0 +1,17 @@
+---
+page_title: /admin API reference for Terraform Enterprise
+description: >-
+ Use the `/admin` set of endpoints to configure and support your Terraform Enterprise installation. Learn about operations available in the HTTP API.
+---
+
+# Terraform Enterprise Admin API Documentation
+
+-> **Terraform Enterprise Only:** The admin API is exclusive to Terraform Enterprise, and can only be used by the admins and operators who install and maintain their organization's Terraform Enterprise instance.
+
+Terraform Enterprise provides an API to allow administrators to configure and support their installation.
+
+## Authentication
+
+With the exception of the [user impersonation endpoints](/terraform/enterprise/api-docs/admin/users#impersonate-another-user), all requests must be authenticated with a bearer token belonging to a site administrator. Use the HTTP Header `Authorization` with the value `Bearer `. This token can be generated or revoked on the [tokens tab of the user settings page](/terraform/enterprise/users-teams-organizations/users#api-tokens). In the context of the Admin API, your token has management access to all resources in the system.
+
+For more information on authentication behavior, refer to [the API overview section](/terraform/enterprise/api-docs#authentication).
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/initial-admin-user.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/initial-admin-user.mdx
new file mode 100644
index 0000000000..e64a4f6e84
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/initial-admin-user.mdx
@@ -0,0 +1,69 @@
+---
+page_title: /initial-admin-user/ API reference for Terraform Enterprise
+description: Learn how to call the initial-admin-user API endpoint to create the initial admin user.
+---
+
+# `initial-admin-user` API endpoint
+
+This topic provides reference information about the `initial-admin-user` API endpoint.
+
+## Introduction
+
+Send a `POST` request to the `/initial-admin-user` API endpoint to create the initial admin user after deploying Terraform Enterprise. Refer to [Create the initial admin user](/terraform/enterprise/deploy/initial-admin-user) for additional information.
+
+## Query parameters
+
+The following table describes the URL query parameters you can include in the request. If your client does not automatically encode URLs, use HTML URL-encoding characters to ensure that requests are successful.
+
+| Parameter | Description |
+| --------- | --------------------------------------------------------- |
+| `token` | **Required.** The IACT token retrieved via API or command |
+
+## Request body
+
+This `POST` endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type |Description |
+| ---------- | ------ |------------------------------------ |
+| `username` | string |The username to assign the new user. |
+| `email` | string |The email address of the new user. |
+| `password` | string |The password of the new user. |
+
+## Response body
+
+The `POST` endpoint returns a JSON object with the following properties.
+
+| Key path | Type | Description |
+| -------- | ------ | -------------------------------------------------------------------------- |
+| `status` | string | Either `"created"` or `"error"`. |
+| `token` | string | If status is `"created"`, this contains a Terraform Enterprise user token for the new user. |
+| `error` | string | If status is `"error"`, this contains the reason for the error. |
+
+## Sample payload
+
+```json
+{
+ "username": "manage",
+ "email": "it@mycompany.com",
+ "password": "thisisabadpassword"
+}
+```
+
+## Sample request
+
+```shell
+curl \
+ --header "Content-Type: application/json" \
+ --request POST \
+ --data @payload.json \
+ https://${TFE_HOSTNAME}/admin/initial-admin-user?token=${IACT_TOKEN}
+```
+
+## Sample response
+
+```json
+{
+ "status": "created",
+ "token": "aabbccdd.v1.atlas.ddeeffgghhiijjkkllmmnnooppqqrrssttuuvvxxyyzz"
+}
+```
\ No newline at end of file
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/module-sharing.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/module-sharing.mdx
new file mode 100644
index 0000000000..1edd604bc7
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/module-sharing.mdx
@@ -0,0 +1,121 @@
+---
+page_title: /module-consumers API reference for Terraform Enterprise
+description: >-
+ Use the `/module-consumers` endpoint to manage sharing permissions for modules in your registry. Learn how to update an organization's module consumers using the API.
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Admin Module Consumers API
+
+Admins and operators who install and maintain their organization's Terraform Enterprise instance are able to use the `module-consumers` endpoint.
+
+~> **This endpoint is deprecated**: We will remove this endpoint in a future release. Use the [Registry Sharing API](/terraform/enterprise/api-docs/admin/registry-sharing) instead. Continue using the [Admin Organizations API](/terraform/enterprise/api-docs/admin/organizations#update-an-organization) to configure global module sharing.
+
+There are two ways to configure module sharing using the Admin API:
+
+- This endpoint, which allows an organization to share modules with a specific list of other organizations.
+- The [update an organization endpoint](/terraform/enterprise/api-docs/admin/organizations#update-an-organization), whose `data.attributes.global-module-sharing` property allows an organization to share modules with every organization in the instance.
+
+
+## Update an Organization's Module Consumers
+
+-> This API endpoint is available in Terraform Enterprise as of version 202012-1.
+
+`PATCH /admin/organizations/:name/module-consumers`
+
+This endpoint sets the list of organizations that can use modules from the sharing organization's private registry. Sharing with specific organizations will automatically turn off global module sharing, which is configured with the [update an organization endpoint](/terraform/enterprise/api-docs/admin/organizations#update-an-organization) (via the `data.attributes.global-module-sharing` property).
+
+| Parameter | Description |
+| --------- | ----------------------------------------------------------- |
+| `:name` | The name of the organization whose registry is being shared |
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "module-partnerships"`) | The list of module consumers was successfully updated |
+| [404][] | [JSON API error object][] | Organization not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| --------------------------------------------------- | -------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"module-partnerships"` |
+| `data.attributes.module-consuming-organization-ids` | array\[string] | | A list of external ids for organizations that will be able to access modules in the producing organization's registry. These should have an `org-` prefix. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "module-partnerships",
+ "attributes": {
+ "module-consuming-organization-ids": [
+ "org-939hp5K7kecppVmd"
+ ]
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://tfe.example.com/api/v2/admin/organizations/my-organization/module-consumers
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "mp-tQATArr4gyYDBvkF",
+ "type": "module-partnerships",
+ "attributes": {
+ "consuming-organization-id": "org-939hp5K7kecppVmd",
+ "consuming-organization-name": "other-organization",
+ "producing-organization-id": "org-etdex8r9VLnyHFct",
+ "producing-organization-name": "my-organization"
+ }
+ }
+ ]
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/opa-versions.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/opa-versions.mdx
new file mode 100644
index 0000000000..63effadd7c
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/opa-versions.mdx
@@ -0,0 +1,358 @@
+---
+page_title: /admin/opa-versions API reference for Terraform Enterprise
+description: >-
+ Use the `/admin/opa-versions` endpoint to manage available Open Policy Agent (OPA) versions. Learn how to list, show, create, update, and delete OPA versions using the HTTP API.
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Admin OPA Versions API
+
+The `/opa-versions` endpoint lets site administrators manage which versions of OPA you can use to enforce policies.
+
+-> **Terraform Enterprise Only:** The admin API is exclusive to Terraform Enterprise, and can only be used by the admins and operators who install and maintain their organization's Terraform Enterprise instance.
+
+## List all OPA versions
+
+`GET /api/v2/admin/opa-versions`
+
+This endpoint lists all known versions of OPA.
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | -------------------------------------- |
+| [200][] | [JSON API document][] (`type: "opa-versions"`) | Successfully lists OPA versions. |
+| [404][] | [JSON API error object][] | Client is not an administrator. |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `filter[version]` | **Optional.** A query string. This will find an exact OPA version matching the version queried. This option takes precedence over search queries. |
+| `search[version]` | **Optional.** A search query string. This will search for OPA versions matching the version number queried. |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 OPA versions per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ "https://app.terraform.io/api/v2/admin/opa-versions"
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "tool-L4oe7rNwn7J4E5Yr",
+ "type": "opa-versions",
+ "attributes": {
+ "version": "0.55.0",
+ "url": "https://github.com/open-policy-agent/opa/releases/download/v0.55.0/opa_linux_arm64_static",
+ "sha": "d19603df4ab619e98cc515084f62b839464ee5bff61383d1df7724db8a7027a9",
+ "deprecated": false,
+ "deprecated-reason": null,
+ "official": true,
+ "enabled": true,
+ "beta": false,
+ "usage": 0,
+ "created-at": "2023-08-23T22:34:24.561Z"
+ }
+ },
+ {
+ "id": "tool-qcbYn12vuRKPgPpy",
+ "type": "opa-versions",
+ "attributes": {
+ "version": "0.54.0",
+ "url": "https://github.com/open-policy-agent/opa/releases/download/v0.54.0/opa_linux_arm64_static",
+ "sha": "883e22c082508e2f95ba25333559ba8a5c38c9c5ef667314e132c9d8451450d8",
+ "deprecated": false,
+ "deprecated-reason": null,
+ "official": true,
+ "enabled": true,
+ "beta": false,
+ "usage": 2,
+ "created-at": "2023-08-23T22:34:24.561Z"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://tfe.example.com/api/v2/admin/opa-versions?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://tfe.example.com/api/v2/admin/opa-versions?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": "https://tfe.example.com/api/v2/admin/opa-versions?page%5Bnumber%5D=2&page%5Bsize%5D=20",
+ "last": "https://tfe.example.com/api/v2/admin/opa-versions?page%5Bnumber%5D=4&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": 2,
+ "total-pages": 4,
+ "total-count": 70
+ }
+ }
+}
+```
+
+## Create an OPA version
+
+`POST /api/v2/admin/opa-versions`
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | ---------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "opa-versions"`) | The OPA version was successfully created. |
+| [404][] | [JSON API error object][] | Client is not an administrator. |
+| [422][] | [JSON API error object][] | Validation errors. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------------- | ------ | ------- | ----------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"opa-versions"`. |
+| `data.attributes.version` | string | | A semantic version string in N.N.N or N.N.N-bundleName format (`"0.11.0"` or `"0.12.20-beta1"`). |
+| `data.attributes.url` | string | | The URL where you can download the 64-bit Linux binary of this version. |
+| `data.attributes.sha` | string | | The SHA-256 checksum of the OPA binary. |
+| `data.attributes.deprecated` | bool | `false` | Whether or not this version of OPA is deprecated. |
+| `data.attributes.deprecated-reason` | string | `null` | Additional context about why a version of OPA is deprecated. Field is null unless deprecated is `true`. |
+| `data.attributes.official` | bool | `false` | Whether or not this is an official release of OPA. |
+| `data.attributes.enabled` | bool | `true` | Whether or not this version of OPA is enabled for use in HCP Terraform. |
+| `data.attributes.beta` | bool | `false` | Whether or not this version of OPA is a beta pre-release. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "opa-versions",
+ "attributes": {
+ "version": "0.11.8",
+ "url": "https://github.com/open-policy-agent/opa/releases/download/v0.54.0/opa_linux_arm64_static",
+ "sha": "883e22c082508e2f95ba25333559ba8a5c38c9c5ef667314e132c9d8451450d8",
+ "official": true,
+ "enabled": true,
+ "beta": false
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/admin/opa-versions
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "tool-L4oe7rNwn7J4E5Yr",
+ "type": "opa-versions",
+ "attributes": {
+ "version": "0.54.0",
+ "url": "https://github.com/open-policy-agent/opa/releases/download/v0.54.0/opa_linux_arm64_static",
+ "sha": "883e22c082508e2f95ba25333559ba8a5c38c9c5ef667314e132c9d8451450d8",
+ "official": true,
+ "deprecated": false,
+ "deprecated-reason": null,
+ "enabled": true,
+ "beta": false,
+ "usage": 0,
+ "created-at": "2023-08-23T22:34:24.561Z"
+ }
+ }
+}
+```
+
+## Show an OPA version
+
+`GET /api/v2/admin/opa-versions/:id`
+
+| Parameter | Description |
+| --------- | --------------------------------------- |
+| `:id` | The ID of the OPA version to show. |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "opa-versions"`) | The request was successful, returns the OPA version with the matching ID. |
+| [404][] | [JSON API error object][] | The request could not find a matching OPA version with the specified ID, or the client is not an administrator. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/admin/opa-versions/tool-L4oe7rNwn7J4E5Yr
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "tool-L4oe7rNwn7J4E5Yr",
+ "type": "opa-versions",
+ "attributes": {
+ "version": "0.54.0",
+ "url": "https://github.com/open-policy-agent/opa/releases/download/v0.54.0/opa_linux_arm64_static",
+ "sha": "883e22c082508e2f95ba25333559ba8a5c38c9c5ef667314e132c9d8451450d8",
+ "official": true,
+ "deprecated": false,
+ "deprecated-reason": null,
+ "enabled": true,
+ "beta": false,
+ "usage": 0,
+ "created-at": "2023-08-23T22:34:24.561Z"
+ }
+ }
+}
+```
+
+## Update an OPA version
+
+`PATCH /api/v2/admin/opa-versions/:id`
+
+| Parameter | Description |
+| --------- | ----------------------------------------- |
+| `:id` | The ID of the OPA version to update. |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "opa-versions"`) | The OPA version was successfully updated. |
+| [404][] | [JSON API error object][] | The request could not find a matching OPA version with the specified ID, or the client is not an administrator. |
+| [422][] | [JSON API error object][] | Validation errors. |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------------- | ------ | ---------------- | ----------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"opa-versions"`. |
+| `data.attributes.version` | string | (previous value) | A semantic version string in N.N.N or N.N.N-bundleName format (`"0.11.0"` or `"0.12.20-beta1"`). |
+| `data.attributes.url` | string | (previous value) | The URL where you can download the 64-bit Linux binary of this version. |
+| `data.attributes.sha` | string | (previous value) | The SHA-256 checksum of the OPA binary. |
+| `data.attributes.official` | bool | (previous value) | Whether or not this is an official release of OPA. |
+| `data.attributes.deprecated` | bool | (previous value) | Whether or not this version of OPA is deprecated. |
+| `data.attributes.deprecated-reason` | string | (previous value) | Additional context about why a version of OPA is deprecated. |
+| `data.attributes.enabled` | bool | (previous value) | Whether or not this version of OPA is enabled for use in HCP Terraform. |
+| `data.attributes.beta` | bool | (previous value) | Whether or not this version of OPA is a beta pre-release. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "opa-versions",
+ "attributes": {
+ "deprecated": true,
+ "deprecated-reason": "A bug was discovered in this version of OPA. Please upgrade as soon as possible"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/admin/opa-versions/tool-L4oe7rNwn7J4E5Yr
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "tool-L4oe7rNwn7J4E5Yr",
+ "type": "opa-versions",
+ "attributes": {
+ "version": "0.54.0",
+ "url": "https://github.com/open-policy-agent/opa/releases/download/v0.54.0/opa_linux_arm64_static",
+ "sha": "883e22c082508e2f95ba25333559ba8a5c38c9c5ef667314e132c9d8451450d8",
+ "official": true,
+ "deprecated": true,
+ "deprecated-reason": "A bug was discovered in this version of OPA. Please upgrade as soon as possible",
+ "enabled": true,
+ "beta": false,
+ "usage": 0,
+ "created-at": "2023-08-23T22:34:24.561Z"
+ }
+ }
+}
+```
+
+## Delete an OPA version
+
+`DELETE /api/v2/admin/opa-versions/:id`
+
+This endpoint removes an OPA version from HCP Terraform. You cannot remove officially labeled OPA versions or versions used by a workspace or policy set.
+
+| Parameter | Description |
+| --------- | ----------------------------------------- |
+| `:id` | The ID of the OPA version to delete. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------------------------------------------------------------------- |
+| [204][] | Empty response | The OPA version was successfully deleted. |
+| [404][] | [JSON API error object][] | The request could not find a matching OPA version with the specified ID, or the client is not an administrator. |
+| [422][] | [JSON API error object][] | The request could not remove the OPA version because it is an official version or a workspace or policy set uses it. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/admin/opa-versions/tool-L4oe7rNwn7J4E5Yr
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/organizations.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/organizations.mdx
new file mode 100644
index 0000000000..2943057cc5
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/organizations.mdx
@@ -0,0 +1,624 @@
+---
+page_title: /admin/organizations API reference for Terraform Enterprise
+description: >-
+ Use the `/admin/organizations` endpoint to manage organizations. Learn how to list, show, update, and delete organizations, list module and provider consumers, and update module consumers.
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Admin Organizations API
+
+The `admin/organizations` API endpoint contains endpoints to help site administrators manage organizations.
+
+-> **Terraform Enterprise Only:** The admin API is exclusive to Terraform Enterprise, and can only be used by the admins and operators who install and maintain their organization's Terraform Enterprise instance.
+
+
+
+## List all Organizations
+
+`GET /api/v2/admin/organizations`
+
+This endpoint lists all organizations in the Terraform Enterprise installation.
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | --------------------------------- |
+| [200][] | [JSON API document][] (`type: "organizations"`) | Successfully listed organizations |
+| [404][] | [JSON API error object][] | Client is not an administrator. |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `q` | **Optional.** A search query string. Organizations are searchable by name and notification email. This query takes precedence over the attribute specific searches `q[email]` or `q[name]`. |
+| `q[email]` | **Optional.** A search query string. This query searches organizations by notification email. If used with `q[name]`, it returns organizations that match both queries. |
+| `q[name]` | **Optional.** A search query string. This query searches organizations by name. If used with `q[email]`, it returns organizations that match both queries. |
+| `filter[module_producer]` | **Optional.** Allows filtering organizations based on their module sharing configuration. Accepts a boolean true/false value. A `true` value returns organizations that are configured to share their modules, and a `false` value returns organizations that are not configured to share their modules. |
+| `filter[provider_producer]` | **Optional.** Allows filtering organizations based on their provider sharing configuration. Accepts a boolean true/false value. A `true` value returns organizations that are configured to share their providers, and a `false` value returns organizations that are not configured to share their providers. |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 organizations per page. |
+
+### Available Related Resources
+
+This GET endpoint can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource Name | Description |
+| ------------- | --------------------------------------- |
+| `owners` | A list of owners for each organization. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ "https://tfe.example.com/api/v2/admin/organizations"
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "my-organization",
+ "type": "organizations",
+ "attributes": {
+ "access-beta-tools": false,
+ "external-id": "org-XBiRp755dav5p3P2",
+ "is-disabled": false,
+ "name": "my-organization",
+ "apply-timeout": null,
+ "plan-timeout": null,
+ "terraform-worker-sudo-enabled": false,
+ "notification-email": "my-organization@example.com",
+ "global-module-sharing": false,
+ "global-provider-sharing": false,
+ "sso-enabled": false,
+ "workspace-limit": null
+ },
+ "relationships": {
+ "owners": {
+ "data": [
+ {
+ "id": "user-hxTQDETqnJsi5VYP",
+ "type": "users"
+ }
+ ]
+ },
+ "subscription": {
+ "data": null
+ },
+ "feature-set": {
+ "data": null
+ },
+ "module-consumers": {
+ "links": {
+ "related": "/api/v2/admin/organizations/my-organization/relationships/module-consumers"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/admin/organizations/my-organization"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://tfe.example.com/api/v2/admin/organizations?page%5Bnumber%5D=1\u0026page%5Bsize%5D=20",
+ "first": "https://tfe.example.com/api/v2/admin/organizations?page%5Bnumber%5D=1\u0026page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://tfe.example.com/api/v2/admin/organizations?page%5Bnumber%5D=1\u0026page%5Bsize%5D=20"
+ },
+ "meta": {
+ "status-counts": {
+ "total": 1,
+ "active": 1,
+ "disabled": 0
+ },
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 1
+ }
+ }
+}
+```
+
+## Show an Organization
+
+`GET /api/v2/admin/organizations/:name`
+
+| Parameter | Description |
+| --------- | ------------------------------------ |
+| `:name` | The name of the organization to show |
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | --------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "organizations"`) | The request was successful |
+| [404][] | [JSON API error object][] | Organization not found, or client is not an administrator |
+
+### Available Related Resources
+
+This GET endpoint can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource Name | Description |
+| ------------- | -------------------------------------- |
+| `owners` | A list of owners for the organization. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://tfe.example.com/api/v2/admin/organizations/my-organization
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "my-organization",
+ "type": "organizations",
+ "attributes": {
+ "access-beta-tools": false,
+ "external-id": "org-XBiRp755dav5p3P2",
+ "is-disabled": false,
+ "name": "my-organization",
+ "apply-timeout": null,
+ "plan-timeout": null,
+ "terraform-worker-sudo-enabled": false,
+ "notification-email": "my-organization@example.com",
+ "global-module-sharing": false,
+ "global-provider-sharing": false,
+ "sso-enabled": false,
+ "workspace-limit": null
+ },
+ "relationships": {
+ "owners": {
+ "data": [
+ {
+ "id": "user-hxTQDETqnJsi5VYP",
+ "type": "users"
+ }
+ ]
+ },
+ "subscription": {
+ "data": null
+ },
+ "feature-set": {
+ "data": null
+ },
+ "module-consumers": {
+ "links": {
+ "related": "/api/v2/admin/organizations/my-organization/relationships/module-consumers"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/admin/organizations/my-organization"
+ }
+ }
+}
+```
+
+## Update an Organization
+
+`PATCH /admin/organizations/:name`
+
+| Parameter | Description |
+| --------- | -------------------------------------- |
+| `:name` | The name of the organization to update |
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "organizations"`) | The organization was successfully updated |
+| [404][] | [JSON API error object][] | Organization not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload. Note that the Admin Organizations API may offer a different set of attributes than the [Organizations API](/terraform/enterprise/api-docs/organizations#request-body-1).
+
+| Key path | Type | Default | Description |
+| ------------------------------------------------------ | ------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"organizations"` |
+| `data.attributes.access-beta-tools` | boolean | false | Whether or not workspaces in the organization can be configured to use beta Terraform versions. |
+| `data.attributes.global-module-sharing` | boolean | false | If true, modules in the organization's private module repository will be available to all other organizations in this Terraform Enterprise instance. Enabling this will disable any previously configured [module consumers](#list-module-consumers-for-an-organization). |
+| `data.attributes.global-provider-sharing` | boolean | false | If true, providers in the organization's private provider repository will be available to all other organizations in this Terraform Enterprise instance. Enabling this will disable any previously configured [provider consumers](#list-provicer-consumers-for-an-organization). |
+| `data.attributes.is-disabled` | boolean | false | Removes all permissions from the organization and makes it inaccessible to users. |
+| `data.attributes.apply-timeout` | string | 24h | Maximum run time for Terraform applies for this organization. Will use the configured global defaults if left unset. Specify a duration with a decimal number and a unit suffix. |
+| `data.attributes.plan-timeout` | string | 2h | Maximum run time for Terraform plans for this organization. Will use the configured global defaults if left unset. Specify a duration with a decimal number and a unit suffix. |
+| `data.attributes.terraform-build-worker-apply-timeout` | string | 24h | Deprecated. Please use `data.attributes.apply-timeout` instead. |
+| `data.attributes.terraform-build-worker-plan-timeout` | string | 2h | Deprecated. Please use `data.attributes.plan-timeout` instead. |
+| `data.attributes.workspace-limit` | integer | | Maximum number of workspaces for this organization. If this number is set to a value lower than the number of workspaces the organization has, it will prevent additional workspaces from being created, but existing workspaces will not be affected. If set to 0, this limit will have no effect. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "organizations",
+ "attributes": {
+ "global-module-sharing": true
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://tfe.example.com/api/v2/admin/organizations/my-organization
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "my-organization",
+ "type": "organizations",
+ "attributes": {
+ "access-beta-tools": false,
+ "external-id": "org-XBiRp755dav5p3P2",
+ "is-disabled": false,
+ "name": "my-organization",
+ "apply-timeout": null,
+ "plan-timeout": null,
+ "terraform-worker-sudo-enabled": false,
+ "notification-email": "my-organization@example.com",
+ "global-module-sharing": true,
+ "global-provider-sharing": false,
+ "sso-enabled": false,
+ "workspace-limit": null
+ },
+ "relationships": {
+ "owners": {
+ "data": [
+ {
+ "id": "user-hxTQDETqnJsi5VYP",
+ "type": "users"
+ }
+ ]
+ },
+ "subscription": {
+ "data": null
+ },
+ "feature-set": {
+ "data": null
+ },
+ "module-consumers": {
+ "links": {
+ "related": "/api/v2/admin/organizations/my-organization/relationships/module-consumers"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/admin/organizations/my-organization"
+ }
+ }
+}
+```
+
+## Delete an Organization
+
+`DELETE /admin/organizations/:name`
+
+| Parameter | Description |
+| --------- | -------------------------------------- |
+| `:name` | The name of the organization to delete |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | --------------------------------------------------------- |
+| [204][] | Empty response | The organization was successfully deleted |
+| [404][] | [JSON API error object][] | Organization not found, or client is not an administrator |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://tfe.example.com/api/v2/admin/organizations/my-organization
+```
+
+## List Module Consumers for an Organization
+
+-> This API endpoint is available in Terraform Enterprise as of version 202103-1.
+
+`GET /api/v2/admin/organizations/:name/relationships/module-consumers`
+
+This endpoint lists specific organizations in the Terraform Enterprise installation that have permission to use an organization's modules. It will be empty if the organization is sharing modules using global module sharing, or if the organization has no module sharing configuration.
+
+| Parameter | Description |
+| --------- | -------------------------------------------------------------------- |
+| `:name` | The name of the organization whose module consumers should be listed |
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | --------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "organizations"`) | The request was successful |
+| [404][] | [JSON API error object][] | Organization not found, or client is not an administrator |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | ----------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 organizations per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://tfe.example.com/api/v2/admin/organizations/my-organization/relationships/module-consumers
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "my-organization",
+ "type": "organizations",
+ "attributes": {
+ "access-beta-tools": false,
+ "external-id": "org-XBiRp755dav5p3P2",
+ "is-disabled": false,
+ "name": "my-organization",
+ "apply-timeout": null,
+ "plan-timeout": null,
+ "terraform-worker-sudo-enabled": false,
+ "notification-email": "my-organization@example.com",
+ "global-module-sharing": false,
+ "global-provider-sharing": false,
+ "sso-enabled": false,
+ "workspace-limit": null
+ },
+ "relationships": {
+ "module-consumers": {
+ "links": {
+ "related": "/api/v2/admin/organizations/my-organization/relationships/module-consumers"
+ }
+ },
+ "owners": {
+ "data": [
+ {
+ "id": "user-hxTQDETqnJsi5VYP",
+ "type": "users"
+ }
+ ]
+ },
+ "subscription": {
+ "data": null
+ },
+ "feature-set": {
+ "data": null
+ }
+ },
+ "links": {
+ "self": "https://tfe.example.com/api/v2/admin/organizations/my-organization/relationships/module-consumers?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://tfe.example.com/api/v2/admin/organizations/my-organization/relationships/module-consumers?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://tfe.example.com/api/v2/admin/organizations/my-organization/relationships/module-consumers?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 1
+ }
+ }
+ }
+ ]
+}
+```
+
+## Update an Organization's Module Consumers
+
+-> This API endpoint is available in Terraform Enterprise as of version 202103-1.
+
+~> **Note:** This API endpoint is **deprecated** and will be removed in a future release. Transition existing integrations with this API to the [Admin Registry Sharing API](/terraform/enterprise/api-docs/admin/registry-sharing).
+
+`PATCH /admin/organizations/:name/relationships/module-consumers`
+
+This endpoint is used to specify a list of organizations that can use modules from the sharing organization's private registry. Setting a list of module consumers will turn off global module sharing for an organization.
+
+| Parameter | Description |
+| --------- | ----------------------------------------------------------- |
+| `:name` | The name of the organization whose registry is being shared |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------------------------------------ |
+| [204][] | No content | The list of module consumers was successfully updated |
+| [404][] | [JSON API error object][] | Organization not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, module consumer not found, etc..) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| -------- | -------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data[]` | array\[object] | | A list of resource identifier objects that defines which organizations will consume modules. These objects must contain `id` and `type` properties, and the `type` property must be `organizations` (e.g. `{ "id": "an-org", "type": "organizations" }`). |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "id": "an-org",
+ "type": "organizations"
+
+ },
+ {
+ "id": "another-org",
+ "type": "organizations"
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://tfe.example.com/api/v2/admin/organizations/my-organization/relationships/module-consumers
+```
+
+### Sample Response
+
+The response body will be empty if successful.
+
+## List Provider Consumers for an Organization
+
+-> This API endpoint is available in Terraform Enterprise as of version 202301-1.
+
+`GET /api/v2/admin/organizations/:name/relationships/provider-consumers`
+
+This endpoint lists specific organizations in the Terraform Enterprise installation that have permission to use an organization's providers. It will be empty if the organization is sharing providers using global provider sharing, or if the organization has no provider sharing configuration.
+
+| Parameter | Description |
+| --------- | ---------------------------------------------------------------------- |
+| `:name` | The name of the organization whose provider consumers should be listed |
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | --------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "organizations"`) | The request was successful |
+| [404][] | [JSON API error object][] | Organization not found, or client is not an administrator |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | ----------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 organizations per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://tfe.example.com/api/v2/admin/organizations/my-organization/relationships/provider-consumers
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "my-organization",
+ "type": "organizations",
+ "attributes": {
+ "access-beta-tools": false,
+ "external-id": "org-XBiRp755dav5p3P2",
+ "is-disabled": false,
+ "name": "my-organization",
+ "apply-timeout": null,
+ "plan-timeout": null,
+ "terraform-worker-sudo-enabled": false,
+ "notification-email": "my-organization@example.com",
+ "global-module-sharing": false,
+ "global-provider-sharing": false,
+ "sso-enabled": false,
+ "workspace-limit": null
+ },
+ "relationships": {
+ "provider-consumers": {
+ "links": {
+ "related": "/api/v2/admin/organizations/my-organization/relationships/provider-consumers"
+ }
+ },
+ "owners": {
+ "data": [
+ {
+ "id": "user-hxTQDETqnJsi5VYP",
+ "type": "users"
+ }
+ ]
+ },
+ "subscription": {
+ "data": null
+ },
+ "feature-set": {
+ "data": null
+ }
+ },
+ "links": {
+ "self": "https://tfe.example.com/api/v2/admin/organizations/my-organization/relationships/provider-consumers?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://tfe.example.com/api/v2/admin/organizations/my-organization/relationships/provider-consumers?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://tfe.example.com/api/v2/admin/organizations/my-organization/relationships/provider-consumers?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 1
+ }
+ }
+ }
+ ]
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/registry-sharing.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/registry-sharing.mdx
new file mode 100644
index 0000000000..565a5b4e02
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/registry-sharing.mdx
@@ -0,0 +1,92 @@
+---
+page_title: /registry-partnerships API reference for Terraform Enterprise
+description: >-
+ Use the `/registry-partnerships` endpoint to configure registry sharing. Learn how to update which organizations can use modules and providers from your private registry using the HTTP API.
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Registry Partnership API Endpoint
+
+Admins and operators who install and maintain their organization's Terraform Enterprise instance are able to use the `registry-partnerships` endpoint to configure registry sharing.
+
+## Introduction
+
+There are two ways to configure registry sharing via the Admin API:
+
+- This endpoint, which allows an organization to share modules and providers with a specific list of other organizations.
+- The [update an organization endpoint](/terraform/enterprise/api-docs/admin/organizations#update-an-organization), whose `data.attributes.global-module-sharing` and `data.attributes.global-provider-sharing` properties allows an organization to share modules and providers with every organization in the instance.
+
+Enabling one option will automatically disable the other. For more information, see [Administration: Registry Sharing](/terraform/enterprise/application-administration/registry-sharing).
+
+## Update an Organization's Provider Partnership
+
+-> This API endpoint is available in Terraform Enterprise as of version 202301-1.
+
+`PUT /admin/organizations/:name/registry-partnerships`
+
+This endpoint sets the list of organizations that can use modules and providers from the sharing organization's private registry. Sharing with specific organizations will automatically turn off global module and/or provider sharing, which is configured with the [update an organization endpoint](/terraform/enterprise/api-docs/admin/organizations#update-an-organization) (via the `data.attributes.global-module-sharing` and `data.attributes.global-provider-sharing` properties).
+
+| Parameter | Description |
+| --------- | ----------------------------------------------------------- |
+| `:name` | The name of the organization whose registry is being shared |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------------ |
+| [204][] | No content | The list of module and provider consumers was successfully updated |
+| [404][] | [JSON API error object][] | Organization not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PUT endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| ------------------------------------ | -------------- | ------- | ------------------------------------------------------------------------------------------------------------ |
+| `data.type` | string | | Must be `"registry-partnerships"` |
+| `data.attributes.module-consumers` | array\[string] | | A list of organization names that will be able to access modules in the producing organization's registry. |
+| `data.attributes.provider-consumers` | array\[string] | | A list of organization names that will be able to access providers in the producing organization's registry. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "registry-partnerships",
+ "attributes": {
+ "module_consumers": ["org1-name"],
+ "provider_consumers": ["org1-name", "org2-name"]
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PUT \
+ --data @payload.json \
+ https://tfe.example.com/api/v2/admin/organizations/my-organization/registry-partnerships
+```
+
+### Sample Response
+
+The response body will be empty if successful.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/runs.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/runs.mdx
new file mode 100644
index 0000000000..780b620006
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/runs.mdx
@@ -0,0 +1,224 @@
+---
+page_title: /admin/runs API reference for Terraform Enterprise
+description: >-
+ Use the `/admin/runs` endpoint to interact with Terraform runs. Learn how to list runs and cancel runs using the HTTP API.
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Admin Runs API
+
+-> **Terraform Enterprise Only:** The admin API is exclusive to Terraform Enterprise, and can only be used by the admins and operators who install and maintain their organization's Terraform Enterprise instance.
+
+The Runs Admin API contains endpoints to help site administrators manage runs.
+
+## List all runs
+
+`GET /api/v2/admin/runs`
+
+This endpoint lists all runs in the Terraform Enterprise installation.
+
+| Status | Response | Reason |
+| ------- | -------------------------------------- | ------------------------------- |
+| [200][] | [JSON API document][] (`type: "runs"`) | Successfully listed runs |
+| [404][] | [JSON API error object][] | Client is not an administrator. |
+
+### Query Parameters
+
+[These are standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `q` | **Optional.** A search query string. Runs are searchable by ID, workspace name, organization name or email, and VCS repository identifier. |
+| `filter[status]` | **Optional.** A comma-separated list of Run statuses to restrict results to, which can include any of the following: `"pending"`, `"plan_queued"`, `"planning"`, `"planned"`, `"confirmed"`, `"apply_queued"`, `"applying"`, `"applied"`, `"discarded"`, `"errored"`, `"canceled"`, `"cost_estimating"`, `"cost_estimated"`, `"policy_checking"`, `"policy_override"`, `"policy_soft_failed"`, `"policy_checked"`, and `"planned_and_finished"`. |
+| `filter[from]` | **Optional.** Must be formatted in RFC 3339 and UTC. |
+| `filter[to]` | **Optional.** Must be formatted in RFC 3339 and UTC. |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 runs per page. |
+
+A VCS repository identifier is a reference to a VCS repository in the format `:org/:repo`, where `:org` and `:repo` refer to the organization (or project) and repository in your VCS provider.
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ "https://app.terraform.io/api/v2/admin/runs"
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "run-VCsNJXa59eUza53R",
+ "type": "runs",
+ "attributes": {
+ "status": "pending",
+ "status-timestamps": {
+ "planned-at": "2018-03-02T23:42:06+00:00",
+ "discarded-at": "2018-03-02T23:42:06+00:00"
+ },
+ "has-changes": true,
+ "created-at": "2018-03-02T23:42:06.651Z"
+ },
+ "relationships": {
+ "workspace": {
+ "data": {
+ "id": "ws-mJtb6bXGybq5zbf3",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/runs/run-VCsNJXa59eUza53R"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/admin/runs?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/admin/runs?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/admin/runs?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 1
+ },
+ "status-counts": {
+ "pending": 1,
+ "planning": 0,
+ "planned": 0,
+ "confirmed": 0,
+ "applying": 0,
+ "applied": 0,
+ "discarded": 0,
+ "errored": 0,
+ "canceled": 0,
+ "policy-checking": 0,
+ "policy-override": 0,
+ "policy-checked": 0,
+ "total": 1
+ }
+ }
+}
+```
+
+## Force a run into the "cancelled" state
+
+`POST /admin/runs/:id/actions/force-cancel`
+
+| Parameter | Description |
+| --------- | ---------------------------- |
+| `:id` | The ID of the run to cancel. |
+
+This endpoint forces a run (and its plan/apply, if applicable) into the `"canceled"` state. This action should only be performed for runs that are stuck and no longer progressing normally, as there is a risk of lost state data if a progressing apply is force-canceled. Healthy runs can be [requested for cancellation by end-users](/terraform/enterprise/run/states).
+
+| Status | Response | Reason |
+| ------- | -------------------------------------- | ------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "runs"`) | Successfully canceled the run. |
+| [404][] | [JSON API error object][] | Run not found, or client is not an administrator. |
+
+### Request body
+
+This POST endpoint allows an optional JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| --------- | ------ | ------- | ----------------------------------------------------------- |
+| `comment` | string | `null` | An optional explanation for why the run was force-canceled. |
+
+### Sample Payload
+
+```json
+{
+ "comment": "This run was stuck and would never finish."
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ "https://app.terraform.io/api/v2/admin/runs/run-VCsNJXa59eUza53R/actions/force-cancel"
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "run-VCsNJXa59eUza53R",
+ "type": "runs",
+ "attributes": {
+ "status": "errored",
+ "status-timestamps": {
+ "planned-at": "2018-03-02T23:42:06Z"
+ },
+ "has-changes": true,
+ "created-at": "2018-03-02T23:42:06.651Z"
+ },
+ "relationships": {
+ "workspace": {
+ "data": {
+ "id": "ws-mJtb6bXGybq5zbf3",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/runs/run-VCsNJXa59eUza53R"
+ }
+ }
+}
+```
+
+### Available Related Resources
+
+This GET endpoint can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource Name | Description |
+| ------------------------------- | ----------------------------------------------------------- |
+| `workspace` | The workspace this run belongs in. |
+| `workspace.organization` | The organization of the associated workspace. |
+| `workspace.organization.owners` | The owners of the organization of the associated workspace. |
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/sentinel-versions.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/sentinel-versions.mdx
new file mode 100644
index 0000000000..74c34ff625
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/sentinel-versions.mdx
@@ -0,0 +1,346 @@
+---
+page_title: /admin/sentinel-versions API reference for Terraform Enterprise
+description: >-
+ Use the `/admin/sentinel-versions` endpoint to manage available Sentinel versions. Learn how to list, show, create, update, and delete Sentinel versions using the HTTP API.
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Admin Sentinel Versions API
+
+-> **Terraform Enterprise Only:** The admin API is exclusive to Terraform Enterprise, and can only be used by the admins and operators who install and maintain their organization's Terraform Enterprise instance.
+
+The Sentinel Versions Admin API lets site administrators manage which versions of Sentinel are available to the HCP Terraform users within their enterprise.
+
+## List all Sentinel versions
+
+`GET /api/v2/admin/sentinel-versions`
+
+This endpoint lists all known versions of Sentinel.
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | -------------------------------------- |
+| [200][] | [JSON API document][] (`type: "sentinel-versions"`) | Successfully lists Sentinel versions. |
+| [404][] | [JSON API error object][] | Client is not an administrator. |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `filter[version]` | **Optional.** A query string. This will find an exact Sentinel version matching the version queried. This option takes precedence over search queries. |
+| `search[version]` | **Optional.** A search query string. This will search for Sentinel versions matching the version number queried. |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 Sentinel versions per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ "https://app.terraform.io/api/v2/admin/sentinel-versions"
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "tool-L4oe7rNwn7J4E5Yr",
+ "type": "sentinel-versions",
+ "attributes": {
+ "version": "0.22.1",
+ "url": "https://releases.hashicorp.com/sentinel/0.22.1/sentinel_0.22.1_linux_amd64.zip",
+ "sha": "0a4a2b2baf46bfeb81d5137b2656b159ccc881487df3bebacd350ea48b53e76c",
+ "deprecated": false,
+ "deprecated-reason": null,
+ "official": true,
+ "enabled": true,
+ "beta": false,
+ "usage": 0,
+ "created-at": "2023-08-23T22:34:24.561Z"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://tfe.example.com/api/v2/admin/sentinel-versions?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://tfe.example.com/api/v2/admin/sentinel-versions?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": "https://tfe.example.com/api/v2/admin/sentinel-versions?page%5Bnumber%5D=2&page%5Bsize%5D=20",
+ "last": "https://tfe.example.com/api/v2/admin/sentinel-versions?page%5Bnumber%5D=4&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": 2,
+ "total-pages": 4,
+ "total-count": 70
+ }
+ }
+}
+```
+
+## Create a Sentinel version
+
+`POST /api/v2/admin/sentinel-versions`
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | ---------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "sentinel-versions"`) | The Sentinel version was successfully created. |
+| [404][] | [JSON API error object][] | The client is not an administrator. |
+| [422][] | [JSON API error object][] | Validation errors. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------------- | ------ | ------- | ------------------------------------------------------------------------------------------------------------ |
+| `data.type` | string | | Must be `"sentinel-versions"`. |
+| `data.attributes.version` | string | | A semantic version string in N.N.N or N.N.N-bundleName format (`"0.11.0"` or `"0.12.20-beta1"`). |
+| `data.attributes.url` | string | | The URL where you can download the 64-bit Linux binary of this version. |
+| `data.attributes.sha` | string | | The SHA-256 checksum of the compressed Sentinel binary. |
+| `data.attributes.deprecated` | bool | `false` | Whether or not this version of Sentinel is deprecated. |
+| `data.attributes.deprecated-reason` | string | `null` | Additional context about why a version of Sentinel is deprecated. Field is null unless deprecated is `true`. |
+| `data.attributes.official` | bool | `false` | Whether or not this is an official release of Sentinel. |
+| `data.attributes.enabled` | bool | `true` | Whether or not this version of Sentinel is enabled for use in HCP Terraform. |
+| `data.attributes.beta` | bool | `false` | Whether or not this version of Sentinel is a beta pre-release. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "sentinel-versions",
+ "attributes": {
+ "version": "0.22.1",
+ "url": "https://releases.hashicorp.com/sentinel/0.22.1/sentinel_0.22.1_linux_amd64.zip",
+ "sha": "0a4a2b2baf46bfeb81d5137b2656b159ccc881487df3bebacd350ea48b53e76c",
+ "official": true,
+ "enabled": true,
+ "beta": false
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/admin/sentinel-versions
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "tool-L4oe7rNwn7J4E5Yr",
+ "type": "sentinel-versions",
+ "attributes": {
+ "version": "0.22.1",
+ "url": "https://releases.hashicorp.com/sentinel/0.22.1/sentinel_0.22.1_linux_amd64.zip",
+ "sha": "0a4a2b2baf46bfeb81d5137b2656b159ccc881487df3bebacd350ea48b53e76c",
+ "official": true,
+ "deprecated": false,
+ "deprecated-reason": null,
+ "enabled": true,
+ "beta": false,
+ "usage": 0,
+ "created-at": "2023-08-23T22:34:24.561Z"
+ }
+ }
+}
+```
+
+## Show a Sentinel version
+
+`GET /api/v2/admin/sentinel-versions/:id`
+
+| Parameter | Description |
+| --------- | --------------------------------------- |
+| `:id` | The ID of the Sentinel version to show. |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | --------------------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "sentinel-versions"`) | Successfully shows the specified Sentinel version. |
+| [404][] | [JSON API error object][] | Could not find the specified Sentinel version, or client is not an administrator. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/admin/sentinel-versions/tool-L4oe7rNwn7J4E5Yr
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "tool-L4oe7rNwn7J4E5Yr",
+ "type": "sentinel-versions",
+ "attributes": {
+ "version": "0.22.1",
+ "url": "https://releases.hashicorp.com/sentinel/0.22.1/sentinel_0.22.1_linux_amd64.zip",
+ "sha": "0a4a2b2baf46bfeb81d5137b2656b159ccc881487df3bebacd350ea48b53e76c",
+ "official": true,
+ "deprecated": false,
+ "deprecated-reason": null,
+ "enabled": true,
+ "beta": false,
+ "usage": 0,
+ "created-at": "2023-08-23T22:34:24.561Z"
+ }
+ }
+}
+```
+
+## Update a Sentinel version
+
+`PATCH /api/v2/admin/sentinel-versions/:id`
+
+| Parameter | Description |
+| --------- | ----------------------------------------- |
+| `:id` | The ID of the Sentinel version to update. |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | --------------------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "sentinel-versions"`) | The Sentinel version was successfully updated. |
+| [404][] | [JSON API error object][] | Could not find the specified Sentinel version, or client is not an administrator. |
+| [422][] | [JSON API error object][] | Validation errors. |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------------- | ------ | ---------------- | --------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"sentinel-versions"`. |
+| `data.attributes.version` | string | (previous value) | A semantic version string in N.N.N or N.N.N-bundleName format (`"0.11.0"`, `"0.12.20-beta1"`). |
+| `data.attributes.url` | string | (previous value) | The URL you can download the 64-bit Linux binary of this version. |
+| `data.attributes.sha` | string | (previous value) | The SHA-256 checksum of the compressed Sentinel binary. |
+| `data.attributes.official` | bool | (previous value) | Whether or not this is an official release of Sentinel. |
+| `data.attributes.deprecated` | bool | (previous value) | Whether or not this version of Sentinel is deprecated. |
+| `data.attributes.deprecated-reason` | string | (previous value) | Additional context about why a version of Sentinel is deprecated. |
+| `data.attributes.enabled` | bool | (previous value) | Whether or not this version of Sentinel is enabled for use in HCP Terraform. |
+| `data.attributes.beta` | bool | (previous value) | Whether or not this version of Sentinel is a beta pre-release. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "sentinel-versions",
+ "attributes": {
+ "deprecated": true,
+ "deprecated-reason": "A bug was discovered in this version of Sentinel. Please upgrade as soon as possible"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/admin/sentinel-versions/tool-L4oe7rNwn7J4E5Yr
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "tool-L4oe7rNwn7J4E5Yr",
+ "type": "sentinel-versions",
+ "attributes": {
+ "version": "0.22.1",
+ "url": "https://releases.hashicorp.com/sentinel/0.22.1/sentinel_0.22.1_linux_amd64.zip",
+ "sha": "0a4a2b2baf46bfeb81d5137b2656b159ccc881487df3bebacd350ea48b53e76c",
+ "official": true,
+ "deprecated": true,
+ "deprecated-reason": "A bug was discovered in this version of Sentinel. Please upgrade as soon as possible",
+ "enabled": true,
+ "beta": false,
+ "usage": 0,
+ "created-at": "2023-08-23T22:34:24.561Z"
+ }
+ }
+}
+```
+
+## Delete a Sentinel version
+
+`DELETE /api/v2/admin/sentinel-versions/:id`
+
+This endpoint removes a Sentinel version from HCP Terraform. You cannot remove officially labeled Sentinel versions or any version used by a workspace.
+
+| Parameter | Description |
+| --------- | ----------------------------------------- |
+| `:id` | The ID of the Sentinel version to delete. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------------------------------------------------------------------- |
+| [204][] | Empty response | The Sentinel version was successfully deleted. |
+| [404][] | [JSON API error object][] | The request could not find a matching Sentinel version with the specified ID, or the client is not an administrator. |
+| [422][] | [JSON API error object][] | The request could not remove the Sentinel version because it is an official version or a workspace uses it. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/admin/sentinel-versions/tool-L4oe7rNwn7J4E5Yr
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/settings.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/settings.mdx
new file mode 100644
index 0000000000..c1da765c68
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/settings.mdx
@@ -0,0 +1,897 @@
+---
+page_title: /admin/general-settings API reference for Terraform Enterprise
+description: >-
+ Use the `/admin/general-settings` set of endpoints to configure Terraform Enterprise. Learn how to list and update general, customization, cost estimation, SAML, SMTP, and Twilio settings using the HTTP API.
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+[speculative plans]: /terraform/enterprise/run/remote-operations#speculative-plans
+
+# Terraform Enterprise Settings API
+
+This topic provides reference information for the following endpoints:
+
+- `/admin/general-settings`
+- `/admin/data-retention-policy-settings`
+- `/admin/cost-estimation-settings`
+- `/admin/saml-settings`
+- `/admin/smtp-settings`
+- `/admin/twilio-settings`
+- `/admin/customization-settings`
+- `/admin/oidc-settings`
+
+-> **Terraform Enterprise Only:** The admin API is exclusive to Terraform Enterprise, and can only be used by the admins and operators who install and maintain their organization's Terraform Enterprise instance.
+
+## List General Settings
+
+`GET /api/v2/admin/general-settings`
+
+| Status | Response | Reason |
+| ------- | -------------------------------------------------- | ------------------------------------ |
+| [200][] | [JSON API document][] (`type: "general-settings"`) | Successfully listed General settings |
+| [404][] | [JSON API error object][] | User unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/admin/general-settings
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "general",
+ "type": "general-settings",
+ "attributes": {
+ "limit-user-organization-creation": true,
+ "api-rate-limiting-enabled": true,
+ "api-rate-limit": 30,
+ "plan-timeout": "2h",
+ "apply-timeout": "24h",
+ "send-passing-statuses-for-untriggered-speculative-plans": false,
+ "allow-speculative-plans-on-pull-requests-from-forks": false,
+ "default-remote-state-access": true
+ }
+ }
+}
+```
+
+## Update General Settings
+
+`PATCH /api/v2/admin/general-settings`
+
+| Status | Response | Reason |
+| ------- | -------------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "general-settings"`) | Successfully updated the General settings |
+| [404][] | [JSON API error object][] | User unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| ------------------------------------------------------------------------- | ------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.attributes.allow-speculative-plans-on-pull-requests-from-forks` | bool | `false` | When set to `false`, [speculative plans][] are not run on pull requests from forks of a repository. It is currently supported for the following VCS providers: GitHub.com, GitHub.com (OAuth), GitHub Enterprise, Bitbucket Cloud, Azure DevOps Server, Azure DevOps Services. To learn more about this setting, refer to the [documentation](/terraform/enterprise/application-administration/general#allow-speculative-plans-on-pull-requests-from-forks) |
+| `data.attributes.api-rate-limit` | integer | 30 | The number of allowable API requests per second for any client. This value cannot be less than 30. To learn more about API Rate Limiting, refer to the [rate limiting documentation][] |
+| `data.attributes.api-rate-limiting-enabled` | bool | `true` | Whether or not rate limiting is enabled for API requests. To learn more about API Rate Limiting, refer to the [rate limiting documentation][] |
+| `data.attributes.default-remote-state-access` | bool | `true` | Determines the default value for the `global-remote-state` attribute on new workspaces. For more details, refer to [Administration: General Settings](/terraform/enterprise/application-administration/general#remote-state-sharing) and [Workspaces API: Create a Workspace](/terraform/enterprise/api-docs/workspaces#create-a-workspace). |
+| `data.attributes.limit-user-organization-creation` | bool | `true` | When set to `true`, limits the ability to create organizations to users with the `site-admin` permission only. |
+| `data.attributes.send-passing-statuses-for-untriggered-speculative-plans` | bool | `false` | When set to `true`, workspaces automatically send passing commit statuses for any pull requests that don't affect their tracked files. |
+| `data.attributes.plan-timeout` | string | `2h` | Default maximum run time for Terraform plans. Can be overridden on a per-organization basis. Specify a duration with a decimal number and a unit suffix. |
+| `data.attributes.apply-timeout` | string | `24h` | Default maximum run time for Terraform applies. Can be overridden on a per-organization basis. Specify a duration with a decimal number and a unit suffix. |
+| `data.attributes.terraform-build-worker-plan-timeout` | string | `2h` | Deprecated. Please use `data.attributes.plan-timeout` instead. |
+| `data.attributes.terraform-build-worker-apply-timeout` | string | `24h` | Deprecated. Please use `data.attributes.apply-timeout` instead. |
+
+
+[rate limiting documentation]: /terraform/enterprise/api-docs#rate-limiting
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "limit-user-organization-creation": true,
+ "api-rate-limiting-enabled": true,
+ "api-rate-limit": 50,
+ "plan-timeout": "2h",
+ "apply-timeout": "24h"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/admin/general-settings
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "general",
+ "type": "general-settings",
+ "attributes": {
+ "limit-user-organization-creation": true,
+ "api-rate-limiting-enabled": true,
+ "api-rate-limit": 50,
+ "send-passing-statuses-for-untriggered-speculative-plans": false,
+ "allow-speculative-plans-on-pull-requests-from-forks": false,
+ "plan-timeout": "2h",
+ "apply-timeout": "24h",
+ "default-remote-state-access": true
+ }
+ }
+}
+```
+
+## Show data retention policy settings
+
+`GET /api/v2/admin/data-retention-policy-settings`
+
+This endpoint returns the global data retention policy for all organizations.
+When a global data retention policy is not set, organizations retain all backing data by default.
+Read more about [admin data retention policy settings](/terraform/enterprise/application-administration/general#data-retention-policies).
+
+Admin settings only support the [`data-retention-policy-delete-olders`](/terraform/enterprise/api-docs/data-retention-policies#data-retention-policy-delete-olders) policy type.
+
+Refer to [Data Retention Policy API](/terraform/enterprise/api-docs/data-retention-policies#show-data-retention-policy) for details.
+
+## Create or update data retention policy settings
+
+`POST /api/v2/admin/data-retention-policy-settings`
+
+This endpoint creates a default data retention policy for all organizations on the site.
+When a global data retention policy is not set, organizations retain all backing data by default.
+Read more about [admin data retention policy settings](/terraform/enterprise/application-administration/general#data-retention-policies).
+
+Admin settings only support the [`data-retention-policy-delete-olders`](/terraform/enterprise/api-docs/data-retention-policies#data-retention-policy-delete-olders) policy type.
+
+Refer to [Data Retention Policy API](/terraform/enterprise/api-docs/data-retention-policies#create-or-update-data-retention-policy) for details.
+
+## Remove data retention policy
+
+`DELETE /api/v2/admin/data-retention-policy-settings`
+
+This endpoint removes the data retention policy set at the site admin level.
+When a data retention policy is not set for the site admin, organizations retain all backing data by default.
+
+Read more about [admin data retention policy settings](/terraform/enterprise/application-administration/general#data-retention-policies).
+
+See [Data Retention Policy API](/terraform/enterprise/api-docs/data-retention-policies#remove-data-retention-policy) for details.
+
+## List Cost Estimation Settings
+
+`GET /api/v2/admin/cost-estimation-settings`
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------------- | -------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "cost-estimation-settings"`) | Successfully listed Cost Estimation settings |
+| [404][] | [JSON API error object][] | User unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/admin/cost-estimation-settings
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "cost-estimation",
+ "type": "cost-estimation-settings",
+ "attributes": {
+ "enabled": true,
+ "aws-access-key-id": "AKIAIOSFODNN7EXAMPLE",
+ "aws-secret-key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
+ "gcp-credentials": "{\"private_key\":\"-----BEGIN PRIVATE KEY-----\\n....=\\n-----END PRIVATE KEY-----\",\"private_key_id\":\"some_id\",...}",
+ "azure-client-id": "9b516fe8-415s-9119-bab0-EXAMPLEID1",
+ "azure-client-secret": "9b516fe8-415s-9119-bab0-EXAMPLESEC1",
+ "azure-subscription-id": "9b516fe8-415s-9119-bab0-EXAMPLEID2",
+ "azure-tenant-id": "9b516fe8-415s-9119-bab0-EXAMPLEID3"
+ }
+ }
+}
+```
+
+## Update Cost Estimation Settings
+
+`PATCH /api/v2/admin/cost-estimation-settings`
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "cost-estimation-settings"`) | Successfully updated Cost Estimation settings |
+| [404][] | [JSON API error object][] | User unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+If `data.attributes.enabled` is set to `true`, there must be at least one set of credentials populated with valid values. For example, either both `aws-access-key-id` and `aws-secret-key` must be set, _or_ `gcp-credentials` must be set.
+
+See [SAML Configuration](/terraform/enterprise/saml/configuration) for more details on attribute values.
+
+| Key path | Type | Default | Description |
+| --------------------------------------- | ------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `data.attributes.enabled` | bool | `false` | Allows organizations to opt-in to the Cost Estimation feature. |
+| `data.attributes.aws-access-key-id` | string | | An AWS Access Key ID that the Cost Estimation feature will use to authorize to AWS's Pricing API. |
+| `data.attributes.aws-secret-key` | string | | An AWS Secret Key that the Cost Estimation feature will use to authorize to AWS's Pricing API. |
+| `data.attributes.gcp-credentials` | string | | A JSON string containing GCP credentials that the Cost Estimation feature will use to authorize to the Google Cloud Platform's Pricing API. This must be the contents of a valid JSON key that is downloaded when [creating a Service Account in GCP](https://cloud.google.com/video-intelligence/docs/common/auth#creating_a_service_account_in_the). |
+| `data.attributes.azure-client-id` | string | | An Azure Client ID that the Cost Estimation feature will use to authorize to Azure's RateCard API. |
+| `data.attributes.azure-client-secret` | string | | An Azure Client Secret that the Cost Estimation feature will use to authorize to Azure's RateCard API. |
+| `data.attributes.azure-subscription-id` | string | | An Azure Subscription ID that the Cost Estimation feature will use to authorize to Azure's RateCard API. |
+| `data.attributes.azure-tenant-id` | string | | An Azure Tenant ID that the Cost Estimation feature will use to authorize to Azure's RateCard API. |
+
+```json
+{
+ "data": {
+ "attributes": {
+ "enabled": true,
+ "aws-access-key-id": "AKIAIOSFODNN7EXAMPLE",
+ "aws-secret-key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
+ "gcp-credentials": "{\"private_key\":\"-----BEGIN PRIVATE KEY-----\\n....=\\n-----END PRIVATE KEY-----\",\"private_key_id\":\"some_id\",...}",
+ "azure-client-id": "9b516fe8-415s-9119-bab0-EXAMPLEID1",
+ "azure-client-secret": "9b516fe8-415s-9119-bab0-EXAMPLESEC1",
+ "azure-subscription-id": "9b516fe8-415s-9119-bab0-EXAMPLEID2",
+ "azure-tenant-id": "9b516fe8-415s-9119-bab0-EXAMPLEID3"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/admin/cost-estimation-settings
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "cost-estimation",
+ "type": "cost-estimation-settings",
+ "attributes": {
+ "enabled": true,
+ "aws-access-key-id": "AKIAIOSFODNN7EXAMPLE",
+ "aws-secret-key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
+ "gcp-credentials": "{\"private_key\":\"-----BEGIN PRIVATE KEY-----\\n....=\\n-----END PRIVATE KEY-----\",\"private_key_id\":\"some_id\",...}",
+ "azure-client-id": "9b516fe8-415s-9119-bab0-EXAMPLEID1",
+ "azure-client-secret": "9b516fe8-415s-9119-bab0-EXAMPLESEC1",
+ "azure-subscription-id": "9b516fe8-415s-9119-bab0-EXAMPLEID2",
+ "azure-tenant-id": "9b516fe8-415s-9119-bab0-EXAMPLEID3"
+ }
+ }
+}
+```
+
+## List SAML Settings
+
+`GET /api/v2/admin/saml-settings`
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | ----------------------------------- |
+| [200][] | [JSON API document][] (`type: "saml-settings"`) | Successfully listed SAML settings |
+| [404][] | [JSON API error object][] | User unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/admin/saml-settings
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "saml",
+ "type": "saml-settings",
+ "attributes": {
+ "enabled": true,
+ "debug": false,
+ "old-idp-cert": null,
+ "idp-cert": "SAMPLE-CERTIFICATE",
+ "slo-endpoint-url": "https://example.com/slo",
+ "sso-endpoint-url": "https://example.com/sso",
+ "attr-username": "Username",
+ "attr-groups": "MemberOf",
+ "attr-site-admin": "SiteAdmin",
+ "site-admin-role": "site-admins",
+ "sso-api-token-session-timeout": 1209600,
+ "acs-consumer-url": "https://example.com/users/saml/auth",
+ "metadata-url": "https://example.com/users/saml/metadata"
+ }
+ }
+}
+```
+
+## Update SAML Settings
+
+`PATCH /api/v2/admin/saml-settings`
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "saml-settings"`) | Successfully updated SAML settings |
+| [404][] | [JSON API error object][] | User unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+If `data.attributes.enabled` is set to `true`, all remaining attributes must have valid values. You can omit attributes if they have a default value, or if a value was set by a previous update. Omitted attributes keep their previous values.
+
+See [SAML Configuration](/terraform/enterprise/saml/configuration) for more details on attribute values.
+
+| Key path | Type | Default | Description |
+| ----------------------------------------------- | ------- | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.attributes.enabled` | bool | `false` | Allows SAML to be used. If true, all remaining attributes must have valid values. |
+| `data.attributes.debug` | bool | `false` | Enables a SAML debug dialog that allows an admin to see the SAMLResponse XML and processed values during login. |
+| `data.attributes.idp-cert` | string | | Identity Provider Certificate specifies the PEM encoded X.509 Certificate as provided by the IdP configuration. |
+| `data.attributes.slo-endpoint-url` | string | | Single Log Out URL specifies the HTTPS endpoint on your IdP for single logout requests. This value is provided by the IdP configuration. |
+| `data.attributes.sso-endpoint-url` | string | | Single Sign On URL specifies the HTTPS endpoint on your IdP for single sign-on requests. This value is provided by the IdP configuration. |
+| `data.attributes.attr-username` | string | `"Username"` | Username Attribute Name specifies the name of the SAML attribute that determines the user's username. |
+| `data.attributes.attr-groups` | string | `"MemberOf"` | Team Attribute Name specifies the name of the SAML attribute that determines team membership. |
+| `data.attributes.attr-site-admin` | string | `"SiteAdmin"` | Specifies the role for site admin access. Overrides the "Site Admin Role" method. |
+| `data.attributes.site-admin-role` | string | `"site-admins"` | Specifies the role for site admin access, provided in the list of roles sent in the Team Attribute Name attribute. |
+| `data.attributes.sso-api-token-session-timeout` | integer | 1209600 | Specifies the Single Sign On session timeout in seconds. Defaults to 14 days. |
+
+```json
+{
+ "data": {
+ "attributes": {
+ "enabled": true,
+ "debug": false,
+ "idp-cert": "NEW-CERTIFICATE",
+ "slo-endpoint-url": "https://example.com/slo",
+ "sso-endpoint-url": "https://example.com/sso",
+ "attr-username": "Username",
+ "attr-groups": "MemberOf",
+ "attr-site-admin": "SiteAdmin",
+ "site-admin-role": "site-admins",
+ "sso-api-token-session-timeout": 1209600
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/admin/saml-settings
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "saml",
+ "type": "saml-settings",
+ "attributes": {
+ "enabled": true,
+ "debug": false,
+ "old-idp-cert": "SAMPLE-CERTIFICATE",
+ "idp-cert": "NEW-CERTIFICATE",
+ "slo-endpoint-url": "https://example.com/slo",
+ "sso-endpoint-url": "https://example.com/sso",
+ "attr-username": "Username",
+ "attr-groups": "MemberOf",
+ "attr-site-admin": "SiteAdmin",
+ "site-admin-role": "site-admins",
+ "sso-api-token-session-timeout": 1209600,
+ "acs-consumer-url": "https://example.com/users/saml/auth",
+ "metadata-url": "https://example.com/users/saml/metadata"
+ }
+ }
+}
+```
+
+## Revoke previous SAML IdP Certificate
+
+`POST /api/v2/admin/saml-settings/actions/revoke-old-certificate`
+
+When reconfiguring the IdP certificate, Terraform Enterprise will retain the old IdP certificate to allow for a rotation period. This PUT endpoint will revoke the older IdP certificate when the new IdP certificate is known to be functioning correctly.
+
+See [SAML Configuration](/terraform/enterprise/saml/configuration) for more details.
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/admin/saml-settings/actions/revoke-old-certificate
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "saml",
+ "type": "saml-settings",
+ "attributes": {
+ "enabled": true,
+ "debug": false,
+ "old-idp-cert": null,
+ "idp-cert": "NEW-CERTIFICATE",
+ "slo-endpoint-url": "https://example.com/slo",
+ "sso-endpoint-url": "https://example.com/sso",
+ "attr-username": "Username",
+ "attr-groups": "MemberOf",
+ "attr-site-admin": "SiteAdmin",
+ "site-admin-role": "site-admins",
+ "sso-api-token-session-timeout": 1209600,
+ "acs-consumer-url": "https://example.com/users/saml/auth",
+ "metadata-url": "https://example.com/users/saml/metadata"
+ }
+ }
+}
+```
+
+## List SMTP Settings
+
+`GET /api/v2/admin/smtp-settings`
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | ----------------------------------- |
+| [200][] | [JSON API document][] (`type: "smtp-settings"`) | Successfully listed SMTP settings |
+| [404][] | [JSON API error object][] | User unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/admin/smtp-settings
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "smtp",
+ "type": "smtp-settings",
+ "attributes": {
+ "enabled": true,
+ "host": "example.com",
+ "port": 25,
+ "sender": "sample_user@example.com",
+ "auth": "login",
+ "username": "sample_user"
+ }
+ }
+}
+```
+
+## Update SMTP Settings
+
+`PATCH /api/v2/admin/smtp-settings`
+
+When a request to this endpoint is submitted, a test message will be sent to the specified `test-email-address`. If the test message delivery fails, the API will return an error code indicating the reason for the failure.
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "smtp-settings"`) | Successfully updated the SMTP settings |
+| [401][] | [JSON API error object][] | SMTP user credentials are invalid |
+| [404][] | [JSON API error object][] | User unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [500][] | [JSON API error object][] | SMTP server returned a server error |
+| [504][] | [JSON API error object][] | SMTP server timed out |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+If `data.attributes.enabled` is set to `true`, all remaining attributes must have valid values. You can omit attributes if they have a default value, or if a value was set by a previous update. Omitted attributes keep their previous values.
+
+| Key path | Type | Default | Description |
+| ------------------------------------ | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------- |
+| `data.attributes.enabled` | bool | `false` | Allows SMTP to be used. If true, all remaining attributes must have valid values. |
+| `data.attributes.host` | string | | The host address of the SMTP server. |
+| `data.attributes.port` | integer | | The port of the SMTP server. |
+| `data.attributes.sender` | string | | The desired sender address. |
+| `data.attributes.auth` | string | `"none"` | The authentication type. Valid values are `"none"`, `"plain"`, and `"login"`. |
+| `data.attributes.username` | string | | The username used to authenticate to the SMTP server. Only required if `data.attributes.auth` is set to `"login"` or `"plain"`. |
+| `data.attributes.password` | string | | The username used to authenticate to the SMTP server. Only required if `data.attributes.auth` is set to `"login"` or `"plain"`. |
+| `data.attributes.test-email-address` | string | | The email address to send a test message to. Not persisted and only used during testing. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "enabled": true,
+ "host": "example.com",
+ "port": 25,
+ "sender": "sample_user@example.com",
+ "auth": "login",
+ "username": "sample_user",
+ "password": "sample_password",
+ "test-email-address": "test@example.com"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/admin/smtp-settings
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "smtp",
+ "type": "smtp-settings",
+ "attributes": {
+ "enabled": true,
+ "host": "example.com",
+ "port": 25,
+ "sender": "sample_user@example.com",
+ "auth": "login",
+ "username": "sample_user"
+ }
+ }
+}
+```
+
+## List Twilio Settings
+
+`GET /api/v2/admin/twilio-settings`
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------- | ----------------------------------- |
+| [200][] | [JSON API document][] (`type: "twilio-settings"`) | Successfully listed Twilio settings |
+| [404][] | [JSON API error object][] | User unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/admin/twilio-settings
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "twilio",
+ "type": "twilio-settings",
+ "attributes": {
+ "enabled": true,
+ "account-sid": "12345abcd",
+ "from-number": "555-555-5555"
+ }
+ }
+}
+```
+
+## Update Twilio Settings
+
+`PATCH /api/v2/admin/twilio-settings`
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "twilio-settings"`) | Successfully listed Twilio settings |
+| [404][] | [JSON API error object][] | User unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+If `data.attributes.enabled` is set to `true`, all remaining attributes must have valid values. You can omit attributes if they have a default value, or if a value was set by a previous update. Omitted attributes keep their previous values.
+
+| Key path | Type | Default | Description |
+| ----------------------------- | ------ | ------- | ----------------------------------------------------------------------------------- |
+| `data.attributes.enabled` | bool | `false` | Allows Twilio to be used. If true, all remaining attributes must have valid values. |
+| `data.attributes.account-sid` | string | | The Twilio account id. |
+| `data.attributes.auth-token` | string | | The Twilio authentication token. |
+| `data.attributes.from-number` | string | | The Twilio registered phone number that will be used to send the message. |
+
+```json
+{
+ "data": {
+ "attributes": {
+ "enabled": true,
+ "account-sid": "12345abcd",
+ "auth-token": "sample_token",
+ "from-number": "555-555-5555"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/admin/twilio-settings
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "twilio",
+ "type": "twilio-settings",
+ "attributes": {
+ "enabled": true,
+ "account-sid": "12345abcd",
+ "from-number": "555-555-5555"
+ }
+ }
+}
+```
+
+## Verify Twilio Settings
+
+`POST /api/v2/admin/twilio-settings/verify`
+
+Uses the `test-number` attribute to send a test SMS when Twilio is enabled.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------------------------- |
+| [200][] | none | Twilio test message sent successfully |
+| [400][] | [JSON API error object][] | Verification settings invalid (missing test number, Twilio disabled, etc.) |
+| [404][] | [JSON API error object][] | User unauthorized to perform action |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| ----------------------------- | ------ | ------- | ------------------------------------------------------------------------------------- |
+| `data.attributes.test-number` | string | | The target phone number for the test SMS. Not persisted and only used during testing. |
+
+```json
+{
+ "data": {
+ "attributes": {
+ "test-number": "555-555-0000"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/admin/twilio-settings/verify
+```
+
+## List Customization Settings
+
+`GET /api/v2/admin/customization-settings`
+
+-> This API endpoint is available in Terraform Enterprise as of version 202003-1.
+
+| Status | Response | Reason |
+| ------- | -------------------------------------------------------- | ------------------------------------------ |
+| [200][] | [JSON API document][] (`type: "customization-settings"`) | Successfully listed Customization settings |
+| [404][] | [JSON API error object][] | User unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/admin/customization-settings
+```
+
+### Sample Response
+
+Note that the `support-email-address` attribute in the following example returns `support@hashicorp.com`, which is a not a functional email address. If you need assistance, visit the [HashiCorp support page](https://support.hashicorp.com/hc/en-us) and open a ticket.
+
+```json
+{
+ "data": {
+ "id": "customization",
+ "type": "customization-settings",
+ "attributes": {
+ "support-email-address": "support@hashicorp.com",
+ "login-help": "",
+ "footer": "",
+ "error": "",
+ "new-user": ""
+ }
+ }
+}
+```
+
+## Update Customization Settings
+
+`PATCH /api/v2/admin/customization-settings`
+
+| Status | Response | Reason |
+| ------- | -------------------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "customization-settings"`) | Successfully updated the Customization settings |
+| [404][] | [JSON API error object][] | User unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| --------------------------------------- | ------ | ------------------------- | --------------------------------------------------------------------------------------------- |
+| `data.attributes.support-email-address` | string | `"support@hashicorp.com"`
Note that this is a non-functional address. If you need assistance, visit the [HashiCorp support page](https://support.hashicorp.com/hc/en-us) and open a ticket.
| The deprecated support address for outgoing emails. |
+| `data.attributes.login-help` | string | `""` | The login help text presented to users on the login page. |
+| `data.attributes.footer` | string | `""` | Custom footer content that is added to the application. |
+| `data.attributes.error` | string | `""` | Error instruction content that is presented to users upon unexpected errors. |
+| `data.attributes.new-user` | string | `""` | New user instructions that is presented when the user is not yet attached to an organization. |
+
+### Sample Payload
+
+In the following example, the `support-email-address` attribute specifies `support@hashicorp.com`, which is not a functional email address. If you need assistance, visit the [HashiCorp support page](https://support.hashicorp.com/hc/en-us) and open a ticket.
+
+```json
+{
+ "data": {
+ "attributes": {
+ "support-email-address": "support@hashicorp.com",
+ "login-help": "
Login Help
",
+ "footer": "
Custom Footer Content
",
+ "error": "Custom Error Instructions",
+ "new-user": "New user? Click Here"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/admin/customization-settings
+```
+
+### Sample Response
+
+In the following example, the `support-email-address` attribute specifies `support@hashicorp.com`, which is a not a functional address. If you need assistance, visit the [HashiCorp support page](https://support.hashicorp.com/hc/en-us) and open a ticket.
+
+```json
+{
+ "data": {
+ "id": "customization",
+ "type": "customization-settings",
+ "attributes": {
+ "support-email-address": "support@hashicorp.com",
+ "login-help": "\u003cdiv\u003eLogin Help\u003c/div\u003e",
+ "footer": "\u003cp\u003eCustom Footer Content\u003c/p\u003e",
+ "error": "\u003cem\u003eCustom Error Instructions\u003c/em\u003e",
+ "new-user": "New user? \u003ca href=\"#\"\u003eClick Here\u003c/a\u003e"
+ }
+ }
+}
+```
+
+## Rotate OIDC Signing Key
+
+`POST /api/v2/admin/oidc-settings/actions/rotate-key`
+
+This endpoint rotates the OIDC signing key used for signing tokens issued for [dynamic provider credentials](/terraform/enterprise/workspaces/dynamic-provider-credentials). This key automatically rotates every 90 days, hitting this endpoint resets this timer. Hitting this endpoint has _no effect_ on the next trim time. This endpoint should only be used if a leak of the key is suspected.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------------- |
+| [204][] | none | Successfully rotated key |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/admin/oidc-settings/actions/rotate-key
+```
+
+## Trim OIDC Signing Key
+
+`POST /api/v2/admin/oidc-settings/actions/trim-key`
+
+This endpoint trims the OIDC signing key used for signing tokens issued for [dynamic provider credentials](/terraform/enterprise/workspaces/dynamic-provider-credentials). This key automatically trims old versions 30 days after the last rotation, hitting this endpoint resets this timer. Hitting this endpoint has _no effect_ on the next rotation time. This endpoint should only be used after rotating the key if a leak of the key is suspected.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------------- |
+| [204][] | none | Successfully trimmed key |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/admin/oidc-settings/actions/trim-key
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/terraform-versions.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/terraform-versions.mdx
new file mode 100644
index 0000000000..d96eeff064
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/terraform-versions.mdx
@@ -0,0 +1,363 @@
+---
+page_title: /admin/terraform-versions API reference for Terraform Enterprise
+description: >-
+ Use the `/admin/terraform-versions` endpoint to manage available Terraform versions. Learn how to list, show, create, update, and delete Terraform versions using the HTTP API.
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Admin Terraform Versions API
+
+The `/admin/terraform-versions` API endpoint lets site administrators manage which versions of Terraform are available to use for Terraform operations.
+
+-> **Terraform Enterprise Only:** The admin API is exclusive to Terraform Enterprise, and can only be used by the admins and operators who install and maintain their organization's Terraform Enterprise instance.
+
+
+## List all Terraform versions
+
+`GET /api/v2/admin/terraform-versions`
+
+This endpoint lists all known versions of Terraform.
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | -------------------------------------- |
+| [200][] | [JSON API document][] (`type: "terraform-versions"`) | Successfully listed Terraform versions |
+| [404][] | [JSON API error object][] | Client is not an administrator. |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `filter[version]` | **Optional.** A query string. This will find an exact Terraform version matching the version queried. This option takes precedence over search queries. |
+| `search[version]` | **Optional.** A search query string. This will search for Terraform versions matching the version number queried. |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 Terraform versions per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ "https://app.terraform.io/api/v2/admin/terraform-versions"
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "tool-L4oe7rNwn7J4E5Yr",
+ "type": "terraform-versions",
+ "attributes": {
+ "version": "0.11.8",
+ "url": "https://releases.hashicorp.com/terraform/0.11.8/terraform_0.11.8_linux_amd64.zip",
+ "sha": "84ccfb8e13b5fce63051294f787885b76a1fedef6bdbecf51c5e586c9e20c9b7",
+ "deprecated": false,
+ "deprecated-reason": null,
+ "official": true,
+ "enabled": true,
+ "beta": false,
+ "usage": 0,
+ "created-at": "2018-08-15T22:34:24.561Z"
+ }
+ },
+ {
+ "id": "tool-qcbYn12vuRKPgPpy",
+ "type": "terraform-versions",
+ "attributes": {
+ "version": "0.11.7",
+ "url": "https://releases.hashicorp.com/terraform/0.11.7/terraform_0.11.7_linux_amd64.zip",
+ "sha": "6b8ce67647a59b2a3f70199c304abca0ddec0e49fd060944c26f666298e23418",
+ "deprecated": false,
+ "deprecated-reason": null,
+ "official": true,
+ "enabled": true,
+ "beta": false,
+ "usage": 2,
+ "created-at": null
+ }
+ }
+ ],
+ "links": {
+ "self": "https://tfe.example.com/api/v2/admin/terraform-versions?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://tfe.example.com/api/v2/admin/terraform-versions?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": "https://tfe.example.com/api/v2/admin/terraform-versions?page%5Bnumber%5D=2&page%5Bsize%5D=20",
+ "last": "https://tfe.example.com/api/v2/admin/terraform-versions?page%5Bnumber%5D=4&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": 2,
+ "total-pages": 4,
+ "total-count": 70
+ }
+ }
+}
+```
+
+## Create a Terraform version
+
+`POST /api/v2/admin/terraform-versions`
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | ---------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "terraform-versions"`) | The Terraform version was successfully created |
+| [404][] | [JSON API error object][] | Client is not an administrator |
+| [422][] | [JSON API error object][] | Validation errors |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------------- | ------ | ------- | ----------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"terraform-versions"` |
+| `data.attributes.version` | string | | A semantic version string in N.N.N or N.N.N-bundleName format (e.g. `"0.11.0"`, `"0.12.20-beta1"`.) |
+| `data.attributes.url` | string | | The URL where a ZIP-compressed 64-bit Linux binary of this version can be downloaded |
+| `data.attributes.sha` | string | | The SHA-256 checksum of the compressed Terraform binary |
+| `data.attributes.deprecated` | bool | `false` | Whether or not this version of Terraform is deprecated |
+| `data.attributes.deprecated-reason` | string | `null` | Additional context about why a version of Terraform is deprecated. Field is null unless deprecated is true. |
+| `data.attributes.official` | bool | `false` | Whether or not this is an official release of Terraform |
+| `data.attributes.enabled` | bool | `true` | Whether or not this version of Terraform is enabled for use in HCP Terraform |
+| `data.attributes.beta` | bool | `false` | Whether or not this version of Terraform is a beta pre-release |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "terraform-versions",
+ "attributes": {
+ "version": "0.11.8",
+ "url": "https://releases.hashicorp.com/terraform/0.11.8/terraform_0.11.8_linux_amd64.zip",
+ "sha": "84ccfb8e13b5fce63051294f787885b76a1fedef6bdbecf51c5e586c9e20c9b7",
+ "official": true,
+ "enabled": true,
+ "beta": false
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/admin/terraform-versions
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "tool-L4oe7rNwn7J4E5Yr",
+ "type": "terraform-versions",
+ "attributes": {
+ "version": "0.11.8",
+ "url": "https://releases.hashicorp.com/terraform/0.11.8/terraform_0.11.8_linux_amd64.zip",
+ "sha": "84ccfb8e13b5fce63051294f787885b76a1fedef6bdbecf51c5e586c9e20c9b7",
+ "official": true,
+ "deprecated": false,
+ "deprecated-reason": null,
+ "enabled": true,
+ "beta": false,
+ "usage": 0,
+ "created-at": "2018-08-15T22:34:24.561Z"
+ }
+ }
+}
+```
+
+## Show a Terraform version
+
+`GET /api/v2/admin/terraform-versions/:id`
+
+| Parameter | Description |
+| --------- | --------------------------------------- |
+| `:id` | The ID of the Terraform version to show |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "terraform-versions"`) | The request was successful |
+| [404][] | [JSON API error object][] | Terraform version not found, or client is not an administrator |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/admin/terraform-versions/tool-L4oe7rNwn7J4E5Yr
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "tool-L4oe7rNwn7J4E5Yr",
+ "type": "terraform-versions",
+ "attributes": {
+ "version": "0.11.8",
+ "url": "https://releases.hashicorp.com/terraform/0.11.8/terraform_0.11.8_linux_amd64.zip",
+ "sha": "84ccfb8e13b5fce63051294f787885b76a1fedef6bdbecf51c5e586c9e20c9b7",
+ "official": true,
+ "deprecated": false,
+ "deprecated-reason": null,
+ "enabled": true,
+ "beta": false,
+ "usage": 0,
+ "created-at": "2018-08-15T22:34:24.561Z"
+ }
+ }
+}
+```
+
+## Update a Terraform version
+
+`PATCH /api/v2/admin/terraform-versions/:id`
+
+| Parameter | Description |
+| --------- | ----------------------------------------- |
+| `:id` | The ID of the Terraform version to update |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "terraform-versions"`) | The Terraform version was successfully updated |
+| [404][] | [JSON API error object][] | Terraform version not found, or client is not an administrator |
+| [422][] | [JSON API error object][] | Validation errors |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------------- | ------ | ---------------- | --------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"terraform-versions"` |
+| `data.attributes.version` | string | (previous value) | A semantic version string in N.N.N or N.N.N-bundleName format (e.g. `"0.11.0"`, `"0.12.20-beta1"`.) |
+| `data.attributes.url` | string | (previous value) | The URL where a ZIP-compressed 64-bit Linux binary of this version can be downloaded |
+| `data.attributes.sha` | string | (previous value) | The SHA-256 checksum of the compressed Terraform binary |
+| `data.attributes.official` | bool | (previous value) | Whether or not this is an official release of Terraform |
+| `data.attributes.deprecated` | bool | (previous value) | Whether or not this version of Terraform is deprecated |
+| `data.attributes.deprecated-reason` | string | (previous value) | Additional context about why a version of Terraform is deprecated. |
+| `data.attributes.enabled` | bool | (previous value) | Whether or not this version of Terraform is enabled for use in HCP Terraform |
+| `data.attributes.beta` | bool | (previous value) | Whether or not this version of Terraform is a beta pre-release |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "terraform-versions",
+ "attributes": {
+ "deprecated": true,
+ "deprecated-reason": "A bug was discovered in this version of Terraform. Please upgrade as soon as possible"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/admin/terraform-versions/tool-L4oe7rNwn7J4E5Yr
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "tool-L4oe7rNwn7J4E5Yr",
+ "type": "terraform-versions",
+ "attributes": {
+ "version": "0.11.8",
+ "url": "https://releases.hashicorp.com/terraform/0.11.8/terraform_0.11.8_linux_amd64.zip",
+ "sha": "84ccfb8e13b5fce63051294f787885b76a1fedef6bdbecf51c5e586c9e20c9b7",
+ "official": true,
+ "deprecated": true,
+ "deprecated-reason": "A bug was discovered in this version of Terraform. Please upgrade as soon as possible",
+ "enabled": true,
+ "beta": false,
+ "usage": 0,
+ "created-at": "2018-08-15T22:34:24.561Z"
+ }
+ }
+}
+```
+
+## Delete a Terraform version
+
+`DELETE /api/v2/admin/terraform-versions/:id`
+
+This endpoint removes a Terraform version from HCP Terraform. Versions cannot be removed if they are labeled as official versions of Terraform or if there are workspaces using them.
+
+| Parameter | Description |
+| --------- | ----------------------------------------- |
+| `:id` | The ID of the Terraform version to delete |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | --------------------------------------------------------------------- |
+| [204][] | Empty response | The Terraform version was successfully deleted |
+| [404][] | [JSON API error object][] | Terraform version not found, or client is not an administrator |
+| [422][] | [JSON API error object][] | The Terraform version cannot be removed (it is official or is in use) |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/admin/terraform-versions/tool-L4oe7rNwn7J4E5Yr
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/users.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/users.mdx
new file mode 100644
index 0000000000..f71cc4ab6b
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/users.mdx
@@ -0,0 +1,509 @@
+---
+page_title: /admin/users API reference for Terraform Enterprise
+description: >-
+ Use the `/admin/users` endpoint to manage users. Learn how to list, delete, suspend, re-activate, and impersonate users, grant and revoke administrative privileges, and disable 2FA.
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Admin Users API
+
+The `admin/users` API contains endpoints to help site administrators manage user accounts.
+
+-> **Terraform Enterprise Only:** The admin API is exclusive to Terraform Enterprise, and can only be used by the admins and operators who install and maintain their organization's Terraform Enterprise instance.
+
+## List all users
+
+`GET /api/v2/admin/users`
+
+This endpoint lists all user accounts in the Terraform Enterprise installation.
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | ------------------------------- |
+| [200][] | [JSON API document][] (`type: "users"`) | Successfully listed users |
+| [404][] | [JSON API error object][] | Client is not an administrator. |
+
+### Query Parameters
+
+[These are standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| ------------------- | ------------------------------------------------------------------------------------------------------- |
+| `q` | **Optional.** A search query string. Users are searchable by username and email address. |
+| `filter[admin]` | **Optional.** Can be `"true"` or `"false"` to show only administrators or non-administrators. |
+| `filter[suspended]` | **Optional.** Can be `"true"` or `"false"` to show only suspended users or users who are not suspended. |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 users per page. |
+
+### Available Related Resources
+
+This GET endpoint can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource Name | Description |
+| --------------- | ------------------------------------------------------ |
+| `organizations` | A list of organizations that each user is a member of. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ "https://app.terraform.io/api/v2/admin/users"
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "user-ZL4MsEKnd6iTigTb",
+ "type": "users",
+ "attributes": {
+ "username": "myuser",
+ "email": "myuser@example.com",
+ "avatar-url": "https://www.gravatar.com/avatar/3a23b75d5aa41029b88b73f47a0d90db?s=100&d=mm",
+ "is-admin": true,
+ "is-suspended": false,
+ "is-service-account": false
+ },
+ "relationships": {
+ "organizations": {
+ "data": [
+ {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/users/myuser"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/admin/users?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/admin/users?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/admin/users?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 1
+ },
+ "status-counts": {
+ "total": 1,
+ "suspended": 0,
+ "admin": 1
+ }
+ }
+}
+```
+
+## Delete a user account
+
+`DELETE /admin/users/:id`
+
+This endpoint deletes a user's account from Terraform Enterprise. To prevent unowned organizations, a user cannot be deleted if they are the sole owner of any organizations. The organizations must be given a new owner or deleted first.
+
+| Parameter | Description |
+| --------- | ----------------------------- |
+| `:id` | The ID of the user to delete. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ---------------------------------------------------------------------------------------- |
+| [204][] | Empty body | Successfully removed the user account. |
+| [404][] | [JSON API error object][] | Client is not an administrator. |
+| [422][] | [JSON API error object][] | The user cannot be deleted because they are the sole owner of one or more organizations. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ "https://app.terraform.io/api/v2/admin/users/user-ZL4MsEKnd6iTigTb"
+```
+
+## Suspend a user
+
+`POST /admin/users/:id/actions/suspend`
+
+| Parameter | Description |
+| --------- | ------------------------------ |
+| `:id` | The ID of the user to suspend. |
+
+This endpoint suspends a user's account, preventing them from authenticating and accessing resources.
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | ------------------------------------------ |
+| [200][] | [JSON API document][] (`type: "users"`) | Successfully suspended the user's account. |
+| [400][] | [JSON API error object][] | User is already suspended. |
+| [404][] | [JSON API error object][] | Client is not an administrator. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ "https://app.terraform.io/api/v2/admin/users/user-ZL4MsEKnd6iTigTb/actions/suspend"
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "user-ZL4MsEKnd6iTigTb",
+ "type": "users",
+ "attributes": {
+ "username": "myuser",
+ "email": "myuser@example.com",
+ "avatar-url": "https://www.gravatar.com/avatar/3a23b75d5aa41029b88b73f47a0d90db?s=100&d=mm",
+ "is-admin": false,
+ "is-suspended": true,
+ "is-service-account": false
+ },
+ "relationships": {
+ "organizations": {
+ "data": [
+ {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/users/myuser"
+ }
+ }
+}
+```
+
+## Re-activate a suspended user
+
+`POST /admin/users/:id/actions/unsuspend`
+
+| Parameter | Description |
+| --------- | ---------------------------------- |
+| `:id` | The ID of the user to re-activate. |
+
+This endpoint re-activates a suspended user's account, allowing them to resume authenticating and accessing resources.
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | -------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "users"`) | Successfully re-activated the user's account. |
+| [400][] | [JSON API error object][] | User is not suspended. |
+| [404][] | [JSON API error object][] | User not found, or client is not an administrator. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ "https://app.terraform.io/api/v2/admin/users/user-ZL4MsEKnd6iTigTb/actions/unsuspend"
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "user-ZL4MsEKnd6iTigTb",
+ "type": "users",
+ "attributes": {
+ "username": "myuser",
+ "email": "myuser@example.com",
+ "avatar-url": "https://www.gravatar.com/avatar/3a23b75d5aa41029b88b73f47a0d90db?s=100&d=mm",
+ "is-admin": false,
+ "is-suspended": false,
+ "is-service-account": false
+ },
+ "relationships": {
+ "organizations": {
+ "data": [
+ {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/users/myuser"
+ }
+ }
+}
+```
+
+## Grant a user administrative privileges
+
+`POST /admin/users/:id/actions/grant_admin`
+
+| Parameter | Description |
+| --------- | -------------------------------------------- |
+| `:id` | The ID of the user to make an administrator. |
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | -------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "users"`) | Successfully made the user an administrator. |
+| [400][] | [JSON API error object][] | User is already an administrator. |
+| [404][] | [JSON API error object][] | User not found, or client is not an administrator. |
+| [422][] | [JSON API error object][] | Validation errors |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ "https://app.terraform.io/api/v2/admin/users/user-ZL4MsEKnd6iTigTb/actions/grant_admin"
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "user-ZL4MsEKnd6iTigTb",
+ "type": "users",
+ "attributes": {
+ "username": "myuser",
+ "email": "myuser@example.com",
+ "avatar-url": "https://www.gravatar.com/avatar/3a23b75d5aa41029b88b73f47a0d90db?s=100&d=mm",
+ "is-admin": true,
+ "is-suspended": false,
+ "is-service-account": false
+ },
+ "relationships": {
+ "organizations": {
+ "data": [
+ {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/users/myuser"
+ }
+ }
+}
+```
+
+## Revoke an user's administrative privileges
+
+`POST /admin/users/:id/actions/revoke_admin`
+
+| Parameter | Description |
+| --------- | -------------------------------------- |
+| `:id` | The ID of the administrator to demote. |
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | -------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "users"`) | Successfully made the user an administrator. |
+| [400][] | [JSON API error object][] | User is not an administrator. |
+| [404][] | [JSON API error object][] | User not found, or client is not an administrator. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ "https://app.terraform.io/api/v2/admin/users/user-ZL4MsEKnd6iTigTb/actions/revoke_admin"
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "user-ZL4MsEKnd6iTigTb",
+ "type": "users",
+ "attributes": {
+ "username": "myuser",
+ "email": "myuser@example.com",
+ "avatar-url": "https://www.gravatar.com/avatar/3a23b75d5aa41029b88b73f47a0d90db?s=100&d=mm",
+ "is-admin": false,
+ "is-suspended": false,
+ "is-service-account": false
+ },
+ "relationships": {
+ "organizations": {
+ "data": [
+ {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/users/myuser"
+ }
+ }
+}
+```
+
+## Disable a user's two-factor authentication
+
+`POST /admin/users/:id/actions/disable_two_factor`
+
+| Parameter | Description |
+| --------- | -------------------------------------- |
+| `:id` | The ID of the user to disable 2FA for. |
+
+This endpoint disables a user's two-factor authentication in the situation where they have lost access to their device and recovery codes. Before disabling a user's two-factor authentication, completing a security verification process is recommended to ensure the request is legitimate.
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | ----------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "users"`) | Successfully disabled the user's two-factor authentication. |
+| [400][] | [JSON API error object][] | User does not have two-factor authentication enabled. |
+| [404][] | [JSON API error object][] | User not found, or client is not an administrator. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ "https://app.terraform.io/api/v2/admin/users/user-ZL4MsEKnd6iTigTb/actions/disable_two_factor"
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "user-ZL4MsEKnd6iTigTb",
+ "type": "users",
+ "attributes": {
+ "username": "myuser",
+ "email": "myuser@example.com",
+ "avatar-url": "https://www.gravatar.com/avatar/3a23b75d5aa41029b88b73f47a0d90db?s=100&d=mm",
+ "is-admin": false,
+ "is-suspended": false,
+ "is-service-account": false
+ },
+ "relationships": {
+ "organizations": {
+ "data": [
+ {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/users/myuser"
+ }
+ }
+}
+```
+
+## Impersonate another user
+
+`POST /admin/users/:id/actions/impersonate`
+
+| Parameter | Description |
+| --------- | ---------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the user to impersonate. It is not possible to impersonate service accounts or your own account. |
+
+[impersonate-ui]: /terraform/enterprise/application-administration/resources#impersonating-a-user
+
+Impersonation allows an admin to begin a new session as another user in the system; for more information, see [Impersonating a User][impersonate-ui] in the Terraform Enterprise administration section.
+
+-> **Note:** Impersonation is [intended as a UI feature][impersonate-ui], and this endpoint exists to support that UI.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------- |
+| [204][] | Empty body | Successfully impersonated the user. |
+| [400][] | [JSON API error object][] | A reason for impersonation is required. |
+| [403][] | [JSON API error object][] | Client is already impersonating another user. |
+| [403][] | [JSON API error object][] | User cannot be impersonated. |
+| [404][] | [JSON API error object][] | User not found, or client is not an administrator. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| -------- | ------ | ------- | -------------------------------------------------------------------- |
+| `reason` | string | | A reason for impersonation, which will be recorded in the Audit Log. |
+
+### Sample Payload
+
+```json
+{
+ "reason": "Reason for impersonation"
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Cookie: $COOKIE" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/admin/users/user-ZL4MsEKnd6iTigTb/actions/impersonate
+```
+
+## End an impersonation session
+
+`POST /admin/users/actions/unimpersonate`
+
+When an admin has used the above endpoint to begin an impersonation session, they can make a request to this endpoint, using the cookie provided originally, in order to end that session and log out as the impersonated user.
+
+This endpoint does not respond with a body, but the response does include a `Set-Cookie` header to persist a new session as the original admin user. As such, this endpoint will have no effect unless the client is able to persist and use cookies.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | --------------------------------------------- |
+| [204][] | Empty body | Successfully ended the impersonation session. |
+| [400][] | [JSON API error object][] | Client is not in an impersonation session. |
+| [404][] | [JSON API error object][] | Client is not an administrator. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Cookie: $COOKIE" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/admin/users/actions/unimpersonate
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/workspaces.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/workspaces.mdx
new file mode 100644
index 0000000000..d93bd702c0
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/admin/workspaces.mdx
@@ -0,0 +1,252 @@
+---
+page_title: /admin/workspaces API reference for Terraform Enterprise
+description: >-
+ Use the `/admin/workspaces` endpoint to manage workspaces. Learn how to list, show, and destroy workspaces using the HTTP API.
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Admin Workspaces API
+
+The `admin/workspaces` API contains endpoints to help site administrators manage workspaces.
+
+-> **Terraform Enterprise Only:** The admin API is exclusive to Terraform Enterprise, and can only be used by the admins and operators who install and maintain their organization's Terraform Enterprise instance.
+
+## List all workspaces
+
+`GET /api/v2/admin/workspaces`
+
+This endpoint lists all workspaces in the Terraform Enterprise installation.
+
+| Status | Response | Reason |
+| ------- | -------------------------------------------- | ------------------------------- |
+| [200][] | [JSON API document][] (`type: "workspaces"`) | Successfully listed workspaces |
+| [404][] | [JSON API error object][] | Client is not an administrator. |
+
+### Query Parameters
+
+[These are standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `q` | **Optional.** A search query string. Workspaces are searchable by name and organization name. |
+| `filter[current_run][status]` | **Optional.** A comma-separated list of Run statuses to restrict results to, which can include any of the following: `"pending"`, `"plan_queued"`, `"planning"`, `"planned"`, `"confirmed"`, `"apply_queued"`, `"applying"`, `"applied"`, `"discarded"`, `"errored"`, `"canceled"`, `"cost_estimating"`, `"cost_estimated"`, `"policy_checking"`, `"policy_override"`, `"policy_soft_failed"`, `"policy_checked"`, and `"planned_and_finished"`. |
+| `sort` | **Optional.** Allows sorting the organization's workspaces by a provided value. You can sort by `"name"`, `"current-run.created-at"` (the time of the current run), and `"latest-change-at"` (the creation time of the latest state version or the workspace itself if no state version exists). Prepending a hyphen to the sort parameter reverses the order. For example, `"-name"` sorts by name in reverse alphabetical order. If omitted, the default sort order is arbitrary but stable.|
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 workspaces per page. |
+
+### Available Related Resources
+
+This GET endpoint can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource Name | Description |
+| --------------------- | -------------------------------------------------------------- |
+| `organization` | The organization for each returned workspace. |
+| `organization.owners` | A list of owners for each workspace's associated organization. |
+| `current_run` | The current run for each returned workspace. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ "https://app.terraform.io/api/v2/admin/workspaces"
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "ws-2HRvNs49EWPjDqT1",
+ "type": "workspaces",
+ "attributes": {
+ "name": "my-workspace",
+ "locked": false,
+ "vcs-repo": {
+ "identifier": "my-organization/my-repository"
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ },
+ "current-run": {
+ "data": {
+ "id": "run-jm8ekSaW3F52FACN",
+ "type": "runs"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/workspaces/my-workspace"
+ }
+ }
+ ],
+ "links": {
+ "self": "http://localhost:3000/api/v2/admin/workspaces?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "http://localhost:3000/api/v2/admin/workspaces?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "http://localhost:3000/api/v2/admin/workspaces?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 0,
+ "total-count": 1
+ },
+ "status-counts": {
+ "pending": 1,
+ "planning": 0,
+ "planned": 0,
+ "confirmed": 0,
+ "applying": 0,
+ "applied": 0,
+ "discarded": 0,
+ "errored": 0,
+ "canceled": 0,
+ "policy-checking": 0,
+ "policy-override": 0,
+ "policy-checked": 0,
+ "none": 0,
+ "total": 1,
+ }
+ }
+}
+```
+
+## Show a workspace
+
+`GET /api/v2/admin/workspaces/:id`
+
+This endpoint returns the workspace with the specified `workspace_id`.
+
+| Status | Response | Reason |
+| ------- | -------------------------------------------- | ------------------------------- |
+| [200][] | [JSON API document][] (`type: "workspaces"`) | Successfully listed workspaces |
+| [404][] | [JSON API error object][] | Client is not an administrator. |
+
+### Query Parameters
+
+| Parameter | Description |
+| --------------- | ---------------- |
+| `:workspace_id` | The workspace ID |
+
+### Available Related Resources
+
+This GET endpoint can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource Name | Description |
+| --------------------- | -------------------------------------------------------------- |
+| `organization` | The organization for each returned workspace. |
+| `organization.owners` | A list of owners for each workspace's associated organization. |
+| `current_run` | The current run for each returned workspace. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ "https://app.terraform.io/api/v2/admin/workspaces/ws-2HRvNs49EWPjDqT1"
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "ws-2HRvNs49EWPjDqT1",
+ "type": "workspaces",
+ "attributes": {
+ "name": "my-workspace",
+ "locked": false,
+ "vcs-repo": {
+ "identifier": "my-organization/my-repository"
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ },
+ "current-run": {
+ "data": {
+ "id": "run-jm8ekSaW3F52FACN",
+ "type": "runs"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/workspaces/my-workspace"
+ }
+ }
+}
+```
+
+## Destroy a workspace
+
+`DELETE /admin/workspaces/:id`
+
+| Parameter | Description |
+| --------------- | ---------------- |
+| `:workspace_id` | The workspace ID |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ---------------------------------------------------------- |
+| [204][] | | The workspace was successfully destroyed |
+| [404][] | [JSON API error object][] | Workspace not found or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/admin/workspaces/ws-2HRvNs49EWPjDqT1
+```
+
+### Sample Response
+
+The response body will be empty if successful.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/agent-tokens.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/agent-tokens.mdx
new file mode 100644
index 0000000000..e1d27c1395
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/agent-tokens.mdx
@@ -0,0 +1,272 @@
+---
+page_title: /authentication-tokens API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/authentication-tokens` endpoint to manage
+ agent tokens. Learn how to read, create, and destroy agent tokens.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Agent token API reference
+
+
+
+@include 'tfc-package-callouts/agents.mdx'
+
+
+
+## List Agent Tokens
+
+`GET /agent-pools/:agent_pool_id/authentication-tokens`
+
+| Parameter | Description |
+| ---------------- | ------------------------- |
+| `:agent_pool_id` | The ID of the Agent Pool. |
+
+The objects returned by this endpoint only contain metadata, and do not include the secret text of any authentication tokens. A token is only shown upon creation, and cannot be recovered later.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------- | ------------------------------------------------------------ |
+| [200][] | [JSON API document][] (`type: "authentication-tokens"`) | Success |
+| [404][] | [JSON API error object][] | Agent Pool not found, or user unauthorized to perform action |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | ---------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 tokens per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/agent-pools/apool-MCf6kkxu5FyHbqhd/authentication-tokens
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "at-bonpPzYqv2bGD7vr",
+ "type": "authentication-tokens",
+ "attributes": {
+ "created-at": "2020-08-07T19:38:20.868Z",
+ "last-used-at": "2020-08-07T19:40:55.139Z",
+ "description": "asdfsdf",
+ "token": null
+ },
+ "relationships": {
+ "created-by": {
+ "data": {
+ "id": "user-Nxv6svuhVrTW7eb1",
+ "type": "users"
+ }
+ }
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/agent-pools/apool-MCf6kkxu5FyHbqhd/authentication-tokens?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/agent-pools/apool-MCf6kkxu5FyHbqhd/authentication-tokens?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/agent-pools/apool-MCf6kkxu5FyHbqhd/authentication-tokens?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 1
+ }
+ }
+}
+```
+
+## Show an Agent Token
+
+`GET /authentication-tokens/:id`
+
+| Parameter | Description |
+| --------- | --------------------------------- |
+| `:id` | The ID of the Agent Token to show |
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------- | ------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "authentication-tokens"`) | Success |
+| [404][] | [JSON API error object][] | Agent Token not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/authentication-tokens/at-bonpPzYqv2bGD7vr
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "at-bonpPzYqv2bGD7vr",
+ "type": "authentication-tokens",
+ "attributes": {
+ "created-at": "2020-08-07T19:38:20.868Z",
+ "last-used-at": "2020-08-07T19:40:55.139Z",
+ "description": "test token",
+ "token": null
+ },
+ "relationships": {
+ "created-by": {
+ "data": {
+ "id": "user-Nxv6svuhVrTW7eb1",
+ "type": "users"
+ }
+ }
+ }
+ }
+}
+```
+
+## Create an Agent Token
+
+`POST /agent-pools/:agent_pool_id/authentication-tokens`
+
+| Parameter | Description |
+| ---------------- | ------------------------ |
+| `:agent_pool_id` | The ID of the Agent Pool |
+
+This endpoint returns the secret text of the created authentication token. A token is only shown upon creation, and cannot be recovered later.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------- | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "authentication-tokens"`) | The request was successful |
+| [404][] | [JSON API error object][] | Agent Pool not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [500][] | [JSON API error object][] | Failure during Agent Token creation |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------- | ------ | ------- | ------------------------------------ |
+| `data.type` | string | | Must be `"authentication-tokens"`. |
+| `data.attributes.description` | string | | The description for the Agent Token. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "authentication-tokens",
+ "attributes": {
+ "description":"api"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/agent-pools/apool-xkuMi7x4LsEnBUdY/authentication-tokens
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "at-2rG2oYU9JEvfaqji",
+ "type": "authentication-tokens",
+ "attributes": {
+ "created-at": "2020-08-10T22:29:21.907Z",
+ "last-used-at": null,
+ "description": "api",
+ "token": "eHub7TsW7fz7LQ.atlasv1.cHGFcvf2VxVfUH4PZ7UNdaGB6SjyKWs5phdZ371zkI2KniZs2qKgrAcazhlsiy02awk"
+ },
+ "relationships": {
+ "created-by": {
+ "data": {
+ "id": "user-Nxv6svuhVrTW7eb1",
+ "type": "users"
+ }
+ }
+ }
+ }
+}
+```
+
+## Destroy an Agent Token
+
+`DELETE /api/v2/authentication-tokens/:id`
+
+| Parameter | Description |
+| --------- | ------------------------------------- |
+| `:id` | The ID of the Agent Token to destroy. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------- |
+| [204][] | Empty response | The Agent Token was successfully destroyed |
+| [404][] | [JSON API error object][] | Agent Token not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/authentication-tokens/at-6yEmxNAhaoQLH1Da
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/agents.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/agents.mdx
new file mode 100644
index 0000000000..58acfa2aad
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/agents.mdx
@@ -0,0 +1,637 @@
+---
+page_title: /agents and /agent-pools API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/agents` endpoint to read and delete
+ agents. Use the `/agent-pools` endpoint to read, create, update, and delete
+ agent pools.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Agents and agent pools API reference
+
+An Agent Pool represents a group of Agents, often related to one another by sharing a common network segment or purpose.
+A workspace may be configured to use one of the organization's agent pools to run remote operations with isolated,
+private, or on-premises infrastructure.
+
+
+
+@include 'tfc-package-callouts/agents.mdx'
+
+
+
+## List Agent Pools
+
+`GET /organizations/:organization_name/agent-pools`
+
+| Parameter | Description |
+| -------------------- | ----------------------------- |
+| `:organization_name` | The name of the organization. |
+
+This endpoint allows you to list agent pools, their agents, and their tokens for an organization.
+
+| Status | Response | Reason |
+| ------- | --------------------------------------------- | ---------------------- |
+| [200][] | [JSON API document][] (`type: "agent-pools"`) | Success |
+| [404][] | [JSON API error object][] | Organization not found |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description | |
+| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - |
+| `q` | **Optional.** A search query string. Agent pools are searchable by name. | |
+| `sort` | **Optional.** Allows sorting the returned agents pools. Valid values are `"name"` and `"created-at"`. Prepending a hyphen to the sort parameter will reverse the order (e.g. `"-name"`). | |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. | |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 agent pools per page. | |
+| `filter[allowed_workspaces][name]` | **Optional.** Filters agent pools to those associated with the given workspace. The workspace must have permission to use the agent pool. Refer to [Scoping Agent Pools to Specific Workspaces](/terraform/cloud-docs/agents#scope-an-agent-pool-to-specific-workspaces). | |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/organizations/my-organization/agent-pools
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "apool-yoGUFz5zcRMMz53i",
+ "type": "agent-pools",
+ "attributes": {
+ "name": "example-pool",
+ "created-at": "2020-08-05T18:10:26.964Z",
+ "organization-scoped": false,
+ "agent-count": 3
+ },
+ "relationships": {
+ "agents": {
+ "links": {
+ "related": "/api/v2/agent-pools/apool-yoGUFz5zcRMMz53i/agents"
+ }
+ },
+ "authentication-tokens": {
+ "links": {
+ "related": "/api/v2/agent-pools/apool-yoGUFz5zcRMMz53i/authentication-tokens"
+ }
+ },
+ "workspaces": {
+ "data": [
+ {
+ "id": "ws-9EEkcEQSA3XgWyGe",
+ "type": "workspaces"
+ }
+ ]
+ },
+ "allowed-workspaces": {
+ "data": [
+ {
+ "id": "ws-x9taqV23mxrGcDrn",
+ "type": "workspaces"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/agent-pools/apool-yoGUFz5zcRMMz53i"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/organizations/my-organization/agent-pools?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/organizations/my-organization/agent-pools?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/organizations/my-organization/agent-pools?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 1
+ },
+ "status-counts": {
+ "total": 1,
+ "matching": 1
+ }
+ }
+}
+```
+
+## List Agents
+
+`GET /agent-pools/:agent_pool_id/agents`
+
+| Parameter | Description |
+| ---------------- | --------------------------------- |
+| `:agent_pool_id` | The ID of the Agent Pool to list. |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------- | ------------------------------------------------------------ |
+| [200][] | [JSON API document][] (`type: "agents"`) | Success |
+| [404][] | [JSON API error object][] | Agent Pool not found, or user unauthorized to perform action |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| ------------------------- | ---------------------------------------------------------------------------- |
+| `filter[last-ping-since]` | **Optional.** Accepts a date in ISO8601 format (ex. `2020-08-11T10:41:23Z`). |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 agents per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/agent-pools/apool-xkuMi7x4LsEnBUdY/agents
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "agent-A726QeosTCpCumAs",
+ "type": "agents",
+ "attributes": {
+ "name": "my-cool-agent",
+ "status": "idle",
+ "ip-address": "123.123.123.123",
+ "last-ping-at": "2020-10-09T18:52:25.246Z"
+ },
+ "links": {
+ "self": "/api/v2/agents/agent-A726QeosTCpCumAs"
+ }
+ },
+ {
+ "id": "agent-4cQzjbr1cnM6Pcxr",
+ "type": "agents",
+ "attributes": {
+ "name": "my-other-cool-agent",
+ "status": "exited",
+ "ip-address": "123.123.123.123",
+ "last-ping-at": "2020-08-12T15:25:09.726Z"
+ },
+ "links": {
+ "self": "/api/v2/agents/agent-4cQzjbr1cnM6Pcxr"
+ }
+ },
+ {
+ "id": "agent-yEJjXQCucpNxtxd2",
+ "type": "agents",
+ "attributes": {
+ "name": null,
+ "status": "errored",
+ "ip-address": "123.123.123.123",
+ "last-ping-at": "2020-08-11T06:22:20.300Z"
+ },
+ "links": {
+ "self": "/api/v2/agents/agent-yEJjXQCucpNxtxd2"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/agent-pools/apool-yoGUFz5zcRMMz53i/agents?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/agent-pools/apool-yoGUFz5zcRMMz53i/agents?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/agent-pools/apool-yoGUFz5zcRMMz53i/agents?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 3
+ }
+ }
+}
+```
+
+## Show an Agent Pool
+
+`GET /agent-pools/:id`
+
+| Parameter | Description |
+| --------- | -------------------------------- |
+| `:id` | The ID of the Agent Pool to show |
+
+| Status | Response | Reason |
+| ------- | --------------------------------------------- | ------------------------------------------------------------ |
+| [200][] | [JSON API document][] (`type: "agent-pools"`) | Success |
+| [404][] | [JSON API error object][] | Agent Pool not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/agent-pools/apool-MCf6kkxu5FyHbqhd
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "apool-yoGUFz5zcRMMz53i",
+ "type": "agent-pools",
+ "attributes": {
+ "name": "example-pool",
+ "created-at": "2020-08-05T18:10:26.964Z",
+ "organization-scoped": false
+ },
+ "relationships": {
+ "agents": {
+ "links": {
+ "related": "/api/v2/agent-pools/apool-yoGUFz5zcRMMz53i/agents"
+ }
+ },
+ "authentication-tokens": {
+ "links": {
+ "related": "/api/v2/agent-pools/apool-yoGUFz5zcRMMz53i/authentication-tokens"
+ }
+ },
+ "workspaces": {
+ "data": [
+ {
+ "id": "ws-9EEkcEQSA3XgWyGe",
+ "type": "workspaces"
+ }
+ ]
+ },
+ "allowed-workspaces": {
+ "data": [
+ {
+ "id": "ws-x9taqV23mxrGcDrn",
+ "type": "workspaces"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/agent-pools/apool-yoGUFz5zcRMMz53i"
+ }
+ }
+}
+```
+
+## Show an Agent
+
+`GET /agents/:id`
+
+| Parameter | Description |
+| --------- | --------------------------- |
+| `:id` | The ID of the agent to show |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------- | ------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "agents"`) | Success |
+| [404][] | [JSON API error object][] | Agent not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/agents/agent-73PJNzbZB5idR7AQ
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "agent-Zz9PTEcUgBtYzht8",
+ "type": "agents",
+ "attributes": {
+ "name": "my-agent",
+ "status": "busy",
+ "ip-address": "123.123.123.123",
+ "last-ping-at": "2020-09-08T18:47:35.361Z"
+ },
+ "links": {
+ "self": "/api/v2/agents/agent-Zz9PTEcUgBtYzht8"
+ }
+ }
+}
+```
+
+This endpoint lists details about an agent along with that agent's status. [Learn more about agents statuses](/terraform/cloud-docs/agents/agent-pools#view-agent-statuses).
+
+## Delete an Agent
+
+`DELETE /agents/:id`
+
+| Parameter | Description |
+| --------- | ----------------------------- |
+| `:id` | The ID of the agent to delete |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------------------------------------------------------ |
+| [204][] | No Content | Success |
+| [412][] | [JSON API error object][] | Agent is not deletable. Agents must have a status of `unknown`, `errored`, or `exited` before being deleted. |
+| [404][] | [JSON API error object][] | Agent not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/agents/agent-73PJNzbZB5idR7AQ
+```
+
+## Create an Agent Pool
+
+`POST /organizations/:organization_name/agent-pools`
+
+| Parameter | Description |
+| -------------------- | ----------------------------- |
+| `:organization_name` | The name of the organization. |
+
+This endpoint allows you to create an Agent Pool for an organization. Only one Agent Pool may exist for an organization.
+
+| Status | Response | Reason |
+| ------- | --------------------------------------------- | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "agent-pools"`) | Agent Pool successfully created |
+| [404][] | [JSON API error object][] | Organization not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------------------------- | ------ | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"agent-pools"`. |
+| `data.attributes.name` | string | | The name of the agent pool, which can only include letters, numbers, `-`, and `_`. This will be used as an identifier and must be unique in the organization. |
+| `data.attributes.organization-scoped` | bool | true | The scope of the agent pool. If true, all workspaces in the organization can use the agent pool. |
+| `data.relationships.allowed-workspaces.data.type` | string | | Must be `"workspaces"`. |
+| `data.relationships.allowed-workspaces.data.id` | string | | The ID of the workspace that has permission to use the agent pool. Refer to [Scoping Agent Pools to Specific Workspaces](/terraform/cloud-docs/agents#scope-an-agent-pool-to-specific-workspaces). |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "agent-pools",
+ "attributes": {
+ "name": "my-pool",
+ "organization-scoped": false
+ },
+ "relationships": {
+ "allowed-workspaces": {
+ "data": [
+ {
+ "id": "ws-x9taqV23mxrGcDrn",
+ "type": "workspaces"
+ }
+ ]
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/agent-pools
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "apool-55jZekR57npjHHYQ",
+ "type": "agent-pools",
+ "attributes": {
+ "name": "my-pool",
+ "created-at": "2020-10-13T16:32:45.165Z",
+ "organization-scoped": false,
+
+ },
+ "relationships": {
+ "agents": {
+ "links": {
+ "related": "/api/v2/agent-pools/apool-55jZekR57npjHHYQ/agents"
+ }
+ },
+ "authentication-tokens": {
+ "links": {
+ "related": "/api/v2/agent-pools/apool-55jZekR57npjHHYQ/authentication-tokens"
+ }
+ },
+ "workspaces": {
+ "data": []
+ },
+ "allowed-workspaces": {
+ "data": [
+ {
+ "id": "ws-x9taqV23mxrGcDrn",
+ "type": "workspaces"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/agent-pools/apool-55jZekR57npjHHYQ"
+ }
+ }
+}
+```
+
+## Update an Agent Pool
+
+`PATCH /agent-pools/:id`
+
+| Parameter | Description |
+| --------- | ---------------------------------- |
+| `:id` | The ID of the Agent Pool to update |
+
+| Status | Response | Reason |
+| ------- | --------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "agent-pools"`) | Success |
+| [404][] | [JSON API error object][] | Agent Pool not found, or user unauthorized to perform action |
+| [422][] | JSON error document | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------------------------- | ------ | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"agent-pools"`. |
+| `data.attributes.name` | string | (previous value) | The name of the agent pool, which can only include letters, numbers, `-`, and `_`. This will be used as an identifier and must be unique in the organization. |
+| `data.attributes.organization-scoped` | bool | true | The scope of the agent pool. If true, all workspaces in the organization can use the agent pool. |
+| `data.relationships.allowed-workspaces.data.type` | string | | Must be `"workspaces"`. |
+| `data.relationships.allowed-workspaces.data.id` | string | | The ID of the workspace that has permission to use the agent pool. Refer to [Scoping Agent Pools to Specific Workspaces](/terraform/cloud-docs/agents#scope-an-agent-pool-to-specific-workspaces). |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "agent-pools",
+ "attributes": {
+ "name": "example-pool",
+ "organization-scoped": false
+ },
+ "relationships": {
+ "allowed-workspaces": {
+ "data": [
+ {
+ "id": "ws-x9taqV23mxrGcDrn",
+ "type": "workspaces"
+ }
+ ]
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/agent-pools/apool-MCf6kkxu5FyHbqhd
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "apool-yoGUFz5zcRMMz53i",
+ "type": "agent-pools",
+ "attributes": {
+ "name": "example-pool",
+ "created-at": "2020-08-05T18:10:26.964Z"
+ },
+ "relationships": {
+ "agents": {
+ "links": {
+ "related": "/api/v2/agent-pools/apool-yoGUFz5zcRMMz53i/agents"
+ }
+ },
+ "authentication-tokens": {
+ "links": {
+ "related": "/api/v2/agent-pools/apool-yoGUFz5zcRMMz53i/authentication-tokens"
+ }
+ },
+ "workspaces": {
+ "data": [
+ {
+ "id": "ws-9EEkcEQSA3XgWyGe",
+ "type": "workspaces"
+ }
+ ]
+ },
+ "allowed-workspaces": {
+ "data": [
+ {
+ "id": "ws-x9taqV23mxrGcDrn",
+ "type": "workspaces"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/agent-pools/apool-yoGUFz5zcRMMz53i"
+ }
+ }
+}
+```
+
+## Delete an Agent Pool
+
+`DELETE /agent-pools/:agent_pool_id`
+
+| Parameter | Description |
+| ---------------- | ------------------------------------- |
+| `:agent_pool_id` | The ID of the agent pool ID to delete |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/agent-pools/apool-MCf6kkxu5FyHbqhd
+```
+
+### Available Related Resources
+
+The GET endpoints above can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource Name | Description |
+| ------------- | ------------------------------------------- |
+| `workspaces` | The workspaces attached to this agent pool. |
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/applies.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/applies.mdx
new file mode 100644
index 0000000000..a124bf588c
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/applies.mdx
@@ -0,0 +1,201 @@
+---
+page_title: /applies API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/applies` endpoint to read the results of
+ a Terraform apply and to recover any failed state uploads after applying.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[307]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/307
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Applies API reference
+
+An apply represents the results of applying a Terraform Run's execution plan.
+
+## Attributes
+
+### Apply States
+
+You'll find the apply state in `data.attributes.status`, as one of the following values.
+
+| State | Description |
+| ------------------------- | ------------------------------------------------------------------------------ |
+| `pending` | The initial status of a apply once it has been created. |
+| `managed_queued`/`queued` | The apply has been queued, awaiting backend service capacity to run terraform. |
+| `running` | The apply is running. |
+| `errored` | The apply has errored. This is a final state. |
+| `canceled` | The apply has been canceled. This is a final state. |
+| `finished` | The apply has completed successfully. This is a final state. |
+| `unreachable` | The apply will not run. This is a final state. |
+
+## Show an apply
+
+`GET /applies/:id`
+
+| Parameter | Description |
+| --------- | ---------------------------- |
+| `id` | The ID of the apply to show. |
+
+There is no endpoint to list applies. You can find the ID for an apply in the
+`relationships.apply` property of a run object.
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------- | ------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "applies"`) | The request was successful |
+| [404][] | [JSON API error object][] | Apply not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/applies/apply-47MBvjwzBG8YKc2v
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "apply-47MBvjwzBG8YKc2v",
+ "type": "applies",
+ "attributes": {
+ "execution-details": {
+ "mode": "remote",
+ },
+ "status": "finished",
+ "status-timestamps": {
+ "queued-at": "2018-10-17T18:58:27+00:00",
+ "started-at": "2018-10-17T18:58:29+00:00",
+ "finished-at": "2018-10-17T18:58:37+00:00"
+ },
+ "log-read-url": "https://archivist.terraform.io/v1/object/dmF1bHQ6djE6OFA1eEdlSFVHRSs4YUcwaW83a1dRRDA0U2E3T3FiWk1HM2NyQlNtcS9JS1hHN3dmTXJmaFhEYTlHdTF1ZlgxZ2wzVC9kVTlNcjRPOEJkK050VFI3U3dvS2ZuaUhFSGpVenJVUFYzSFVZQ1VZYno3T3UyYjdDRVRPRE5pbWJDVTIrNllQTENyTndYd1Y0ak1DL1dPVlN1VlNxKzYzbWlIcnJPa2dRRkJZZGtFeTNiaU84YlZ4QWs2QzlLY3VJb3lmWlIrajF4a1hYZTlsWnFYemRkL2pNOG9Zc0ZDakdVMCtURUE3dDNMODRsRnY4cWl1dUN5dUVuUzdnZzFwL3BNeHlwbXNXZWRrUDhXdzhGNnF4c3dqaXlZS29oL3FKakI5dm9uYU5ZKzAybnloREdnQ3J2Rk5WMlBJemZQTg",
+ "resource-additions": 1,
+ "resource-changes": 0,
+ "resource-destructions": 0,
+ "resource-imports": 0
+ },
+ "relationships": {
+ "state-versions": {
+ "data": [
+ {
+ "id": "sv-TpnsuD3iewwsfeRD",
+ "type": "state-versions"
+ },
+ {
+ "id": "sv-Fu1n6a3TgJ1Typq9",
+ "type": "state-versions"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/applies/apply-47MBvjwzBG8YKc2v"
+ }
+ }
+}
+```
+
+_Using HCP Terraform agents_
+
+[HCP Terraform agents](/terraform/enterprise/api-docs/agents) allow HCP Terraform to communicate with isolated, private, or on-premises infrastructure. When a workspace is set to use the agent execution mode, the apply response will include additional details about the agent pool and agent used.
+
+```json
+{
+ "data": {
+ "id": "apply-47MBvjwzBG8YKc2v",
+ "type": "applies",
+ "attributes": {
+ "execution-details": {
+ "agent-id": "agent-S1Y7tcKxXPJDQAvq",
+ "agent-name": "agent_01",
+ "agent-pool-id": "apool-Zigq2VGreKq7nwph",
+ "agent-pool-name": "first-pool",
+ "mode": "agent",
+ },
+ "status": "finished",
+ "status-timestamps": {
+ "queued-at": "2018-10-17T18:58:27+00:00",
+ "started-at": "2018-10-17T18:58:29+00:00",
+ "finished-at": "2018-10-17T18:58:37+00:00"
+ },
+ "log-read-url": "https://archivist.terraform.io/v1/object/dmF1bHQ6djE6OFA1eEdlSFVHRSs4YUcwaW83a1dRRDA0U2E3T3FiWk1HM2NyQlNtcS9JS1hHN3dmTXJmaFhEYTlHdTF1ZlgxZ2wzVC9kVTlNcjRPOEJkK050VFI3U3dvS2ZuaUhFSGpVenJVUFYzSFVZQ1VZYno3T3UyYjdDRVRPRE5pbWJDVTIrNllQTENyTndYd1Y0ak1DL1dPVlN1VlNxKzYzbWlIcnJPa2dRRkJZZGtFeTNiaU84YlZ4QWs2QzlLY3VJb3lmWlIrajF4a1hYZTlsWnFYemRkL2pNOG9Zc0ZDakdVMCtURUE3dDNMODRsRnY4cWl1dUN5dUVuUzdnZzFwL3BNeHlwbXNXZWRrUDhXdzhGNnF4c3dqaXlZS29oL3FKakI5dm9uYU5ZKzAybnloREdnQ3J2Rk5WMlBJemZQTg",
+ "resource-additions": 1,
+ "resource-changes": 0,
+ "resource-destructions": 0,
+ "resource-imports": 0
+ },
+ "relationships": {
+ "state-versions": {
+ "data": [
+ {
+ "id": "sv-TpnsuD3iewwsfeRD",
+ "type": "state-versions"
+ },
+ {
+ "id": "sv-Fu1n6a3TgJ1Typq9",
+ "type": "state-versions"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/applies/apply-47MBvjwzBG8YKc2v"
+ }
+ }
+}
+```
+
+## Recover a failed state upload after applying
+
+`GET /applies/:id/errored-state`
+
+| Parameter | Description |
+| --------- | ----------------------------------------- |
+| `id` | The ID of the apply to recover state for. |
+
+It is possible that during the course of a Run, Terraform may fail to upload a
+state file. This can happen for a variety of reasons, but should be an
+exceptionally rare occurrence. HCP Terraform agent versions greater than 1.12.0
+include a fallback mechanism which attempts to upload the state directly to
+HCP Terraform's backend storage system in these cases. This endpoint then
+makes the raw data from these failed uploads available to users who are
+authorized to read the state contents.
+
+| Status | Response | Reason |
+| ------- | -------------------------------------------- | ----------------------------------------------------------------------------------- |
+| [307][] | HTTP temporary redirect to state storage URL | Errored state available and user is authorized to read it |
+| [404][] | [JSON API error object][] | Apply not found, errored state not uploaded, or user unauthorized to perform action |
+
+When a 307 redirect is returned, the storage URL to the raw state file will be
+present in the `Location` header of the response. The URL in the `Location`
+header will expire after one minute. It is recommended for the API client to
+follow the redirect immediately. Each successful request to the errored-state
+endpoint will generate a new, unique storage URL with the same one minute
+expiration window.
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/v2/applies/apply-47MBvjwzBG8YKc2v/errored-state
+```
+
+### Sample Response
+
+ HTTP/1.1 307 Temporary Redirect
+ Content-Length: 22
+ Content-Type: text/plain
+ Location: https://archivist.terraform.io/v1/object/dmF1bHQ6djE6OFA1eEdlSFVHRSs4YUcwaW83a1dRRDA0U2E3T3FiWk1HM2NyQlNtcS9JS1hHN3dmTXJmaFhEYTlHdTF1ZlgxZ2wzVC9kVTlNcjRPOEJkK050VFI3U3dvS2ZuaUhFSGpVenJVUFYzSFVZQ1VZYno3T3UyYjdDRVRPRE5pbWJDVTIrNllQTENyTndYd1Y0ak1DL1dPVlN1VlNxKzYzbWlIcnJPa2dRRkJZZGtFeTNiaU84YlZ4QWs2QzlLY3VJb3lmWlIrajF4a1hYZTlsWnFYemRkL2pNOG9Zc0ZDakdVMCtURUE3dDNMODRsRnY4cWl1dUN5dUVuUzdnZzFwL3BNeHlwbXNXZWRrUDhXdzhGNnF4c3dqaXlZS29oL3FKakI5dm9uYU5ZKzAybnloREdnQ3J2Rk5WMlBJemZQTg
+
+ 307 Temporary Redirect
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/assessment-results.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/assessment-results.mdx
new file mode 100644
index 0000000000..6ce07a2eda
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/assessment-results.mdx
@@ -0,0 +1,129 @@
+---
+page_title: /assessment-results API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/assessment-results` endpoint to read a
+ health assessment's results, including details on continuous validation and
+ drift detection.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+# Health assessment results API reference
+
+An Assessment Result is the summary record of an instance of health assessment. HCP Terraform can perform automatic health assessments in a workspace to assess whether its real infrastructure matches the requirements defined in its Terraform configuration. Refer to [Health](/terraform/enterprise/workspaces/health) for more details.
+
+
+
+@include 'tfc-package-callouts/health-assessments.mdx'
+
+
+
+## Show Assessment Result
+
+Any user with read access to a workspace can retrieve assessment results for the workspace.
+
+`GET api/v2/assessment-results/:assessment_result_id`
+
+| Parameter | Description |
+| ----------------------- | ------------------------ |
+| `:assessment_result_id` | The assessment result ID |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/assessment-results/asmtres-cHh5777xm
+```
+
+### Sample Response
+
+```json
+{
+ "id": "asmtres-UG5rE9L1373hMYMA",
+ "type": "assessment-results",
+ "data": {
+ "attributes": {
+ "drifted": true,
+ "succeeded": true,
+ "error-msg": null,
+ "created-at": "2022-07-02T22:29:58+00:00",
+ },
+ "links": {
+ "self": "/api/v2/assessment-results/asmtres-UG5rE9L1373hMYMA/"
+ "json-output": "/api/v2/assessment-results/asmtres-UG5rE9L1373hMYMA/json-output"
+ "json-schema": "/api/v2/assessment-results/asmtres-UG5rE9L1373hMYMA/json-schema"
+ "log-output": "/api/v2/assessment-results/asmtres-UG5rE9L1373hMYMA/log-output"
+ }
+ }
+}
+```
+
+## Retrieve the JSON output from the assessment execution
+
+The following endpoints retrieve files documenting the plan, schema, and logged runtime associated with the specified assessment result. They provide complete context for an assessment result. The responses do not adhere to JSON API spec.
+
+You cannot access these endpoints with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access them with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens) that has admin level access to the workspace. Refer to [Permissions](/terraform/enterprise/users-teams-organizations/permissions) for details.
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+### JSON Plan
+
+The following endpoint returns the JSON plan output associated with the assessment result.
+
+`GET api/v2/assessment-results/:assessment_result_id/json-output`
+
+#### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/assessment-results/asmtres-cHh5777xm/json-output
+```
+
+### JSON Schema file
+
+The following endpoint returns the JSON [provider schema](/terraform/cli/commands/providers/schema) associated with the assessment result.
+
+`GET api/v2/assessment-results/:assessment_result_id/json-schema`
+
+#### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/assessment-results/asmtres-cHh5777xm/json-schema
+```
+
+### JSON Log Output
+
+The following endpoint returns Terraform JSON log output.
+
+`GET api/v2/assessment-results/assessment_result_id/log-output`
+
+#### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/assessment-results/asmtres-cHh5777xm/log-output
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/changelog.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/changelog.mdx
new file mode 100644
index 0000000000..3fec8bba90
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/changelog.mdx
@@ -0,0 +1,565 @@
+---
+page_title: API Changelog for Terraform Enterprise
+page_id: api-changelog
+description: >-
+ Use this log of Terraform Enterprise API changes to track new features and
+ evolving functionality over time.
+source: terraform-docs-common
+---
+
+# API Changelog
+
+Keep track of changes to the API for HCP Terraform and Terraform Enterprise.
+
+## 2025-3-10
+
+- Document unique pagination metadata given in the response of [Organization Runs Index API](/terraform/enterprise/api-docs/run##list-runs-in-an-organization).
+
+## 2025-03-10
+
+- Add new field `current_rum_count` to the [explorer API](/terraform/enterprise/api-docs/explorer) in the `workspaces` view type that lists a workspace's current resources under management.
+
+## 2024-11-19
+
+- Clarify `tag-bindings` and `effective-tag-bindings` on [workspaces](/terraform/enterprise/api-docs/workspaces) and [projects](/terraform/enterprise/api-docs/projects)
+- Adds new documentation for `PATCH`ing tag bindings on [projects](/terraform/enterprise/api-docs/projects) and [workspaces](/terraform/enterprise/api-docs/workspaces)
+
+## 2024-10-15
+
+- Add new documentation for the ability to deprecate, and revert the deprecation of, module versions. Learn more about [Managing module versions](/terraform/enterprise/api-docs/private-registry/manage-module-versions).
+
+## 2024-10-14
+
+- Update the [Organizations API](/terraform/enterprise/api-docs/organizations) to support the `speculative-plan-management-enabled` attribute, which controls [automatic cancellation of plan-only runs triggered by outdated commits](/terraform/enterprise/users-teams-organizations/organizations/vcs-speculative-plan-management).
+
+## 2024-10-11
+
+- Add documentation for new timeframe filter on List endpoints for [Runs](/terraform/enterprise/api-docs/run) API
+
+## 2024-09-02
+
+- Add warning about the deprecation and future removal of the [Policy Checks](/terraform/enterprise/api-docs/policy-checks) API.
+
+## 2024-08-16
+
+- Fixes Workspace API responses to be consistent and contain all attributes and relationships.
+
+## 2024-08-14
+
+- Add documentation for a new API endpoint that lists an [organization's team tokens](/terraform/enterprise/api-docs/team-tokens).
+
+## 2024-08-01
+
+
+This endpoint is exclusive to Terraform Enterprise, and not available in HCP Terraform.
+
+
+- Update the [admin settings API](/terraform/enterprise/api-docs/admin/settings##update-general-settings) and [admin organizations API](/terraform/enterprise/api-docs/admin/organizations#update-an-organization) to indicate that the `terraform-build-worker-plan-timeout` and `terraform-build-worker-apply-timeout` attributes are deprecated and will be replaced by `plan-timeout` and `apply-timeout`, respectively.
+
+
+
+## 2024-07-24
+
+- Remove beta tags from documentation for audit trail tokens.
+
+
+## 2024-07-15
+
+- Update the [Team API](/terraform/enterprise/api-docs/teams) to include `allow-member-token-management`.
+
+
+
+## 2024-07-12
+
+- Add beta tags to documentation for audit trail tokens.
+
+
+## 2024-06-25
+
+- Add API documentation for new [team token management setting](/terraform/enterprise/users-teams-organizations/api-tokens).
+- Update API documentation for the [manage teams permission](/terraform/enterprise/users-teams-organizations/permissions#team-management-permissions).
+
+## 2024-05-29
+
+- Add API documentation for the new [audit trails token](/terraform/enterprise/api-docs/audit-trails-tokens).
+
+## 2024-05-23
+
+- Update the [registry modules API](/terraform/enterprise/api-docs/private-registry/modules#create-a-module-version) for publishing new versions of branch based modules.
+
+## 2024-05-10
+
+- Add API documentation for new [manage agent pools permission](/terraform/enterprise/users-teams-organizations/permissions#manage-agent-pools).
+
+## 2024-04-25
+
+- Project names can now be up to 40 characters.
+
+## 2024-04-08
+
+- Add API documentation for new [team management permissions](/terraform/enterprise/users-teams-organizations/permissions#team-management-permissions).
+
+## 2024-04-04
+
+- Add a `sort` parameter to the [Projects list API](/terraform/enterprise/api-docs/projects#query-parameters) to allow sorting projects by name.
+- Add a `description` attribute to the [Projects API](/terraform/enterprise/api-docs/projects).
+- Add `project-count` and `workspace-count` attributes to sample [Projects API](/terraform/enterprise/api-docs/projects) responses.
+
+## 2024-3-27
+
+- Add `private-vcs` to [Feature Entitlements](/terraform/enterprise/api-docs#feature-entitlements).
+
+## 2024-3-26
+
+- Add API documentation for searching [variable sets](/terraform/enterprise/api-docs/variable-sets#list-variable-sets) by name.
+
+## 2024-3-14
+
+- Add documentation for creating runs with debugging mode enabled.
+
+## 2024-3-12
+
+- Update OAuth Client API endpoints to create, update, and return projects associated with an oauth client.
+- Add API endpoints to [Attach an OAuth Client](/terraform/enterprise/api-docs/oauth-clients#attach-an-oauth-client-to-projects) and [Detach an OAuth Client](/terraform/enterprise/api-docs/oauth-clients#detach-an-oauth-client-from-projects) from a project.
+- Add `organization-scoped` attribute to the [OAuth Clients API](/terraform/enterprise/api-docs/oauth-clients).
+
+## 2024-2-29
+
+- Update [run task stages](/terraform/enterprise/api-docs/run-tasks/run-task-stages-and-results) with new multi-stage payload format.
+- Update [run tasks](/terraform/enterprise/api-docs/run-tasks/run-tasks) with global run tasks request/response payloads.
+
+## 2024-2-27
+
+- Add `private-policy-agents` to [Feature Entitlements](/terraform/enterprise/api-docs#feature-entitlements).
+
+## 2024-2-20
+
+- Add documentation for configuring organization and workspace data retention policies through the API and on the different [types of data retention policies](/terraform/enterprise/api-docs/data-retention-policies).
+
+
+## 2024-2-8
+
+- Add [Explorer API documentation](/terraform/enterprise/api-docs/explorer)
+
+
+## 2024-1-30
+
+- Update the [Audit trails](/terraform/enterprise/api-docs/audit-trails) documentation to expand on the payloads for each event.
+
+## 2024-1-24
+
+- Introduce configurable data retention policies at the site-wide level and extend data retention policies at the organization and workspace levels.
+- Added and/or updated data retention policy documentation to the following topics:
+ - [Admin Settings Documentation](/terraform/enterprise/application-administration/general#data-retention-policies)
+ - [Admin API Documentation](/terraform/enterprise/api-docs/admin/settings#data-retention-policies)
+ - [Organization Documentation](/terraform/enterprise/users-teams-organizations/organizations#data-retention-policies)
+ - [Workspace Documentation](/terraform/enterprise/workspaces/settings/deletion#data-retention-policies)
+
+## 2024-1-4
+
+- Update the [Organizations API](/terraform/enterprise/api-docs/organizations) to support the `aggregated-commit-status-enabled` attribute, which controls whether [Aggregated Status Checks](/terraform/enterprise/users-teams-organizations/organizations/vcs-status-checks) are enabled.
+
+## 2023-11-17
+
+- Added the [`opa-versions` endpoint](/terraform/enterprise/api-docs/admin/opa-versions) to allow administrators to manage available Open Policy Agent (OPA) versions.
+- Added the [`sentinel-versions` endpoint](/terraform/enterprise/api-docs/admin/sentinel-versions) to allow administrators to manage available Sentinel versions.
+- Add `authenticated-resource` relationship to the [`account` API](/terraform/enterprise/api-docs/account).
+
+## 2023-11-15
+
+- Introduce configurable data retention policies at the [organization](/terraform/enterprise/users-teams-organizations/organizations#data-retention-policies) and [workspace](/terraform/enterprise/workspaces/settings/deletion#data-retention-policies) levels.
+- Added data retention policy documentation to the following topics:
+ - [`state-versions` API documentation](/terraform/enterprise/api-docs/state-versions)
+ - [`configuration-versions` API documentation](/terraform/enterprise/api-docs/configuration-versions)
+ - [Organizations documentation](/terraform/enterprise/users-teams-organizations/organizations#destruction-and-deletion)
+ - [Workspaces documentation](/terraform/enterprise/workspaces/settings/deletion#data-retention-policies)
+
+## 2023-11-07
+
+- Add `auto_destroy_activity_duration` to the [Workspaces API](/terraform/enterprise/api-docs/workspaces), which allows Terraform Cloud to schedule auto-destroy runs [based on workspace inactivity](/terraform/enterprise/workspaces/settings/deletion#automatically-destroy).
+
+## 2023-10-31
+
+- Update the [Workspaces API](/terraform/enterprise/api-docs/workspaces) to support the `auto-apply-run-trigger` attribute, which controls if run trigger runs are auto-applied.
+
+## 2023-10-30
+
+- Add `priority` attribute to the [Variable Sets API](/terraform/enterprise/api-docs/variable-sets).
+
+## 2023-10-04
+
+- Updates to [run task integration API](/terraform/enterprise/api-docs/run-tasks/run-tasks-integration)
+ - Fix invalid JSON in the example payload.
+ - Clarify the expected JSON:API payload fields.
+- Add `policy-tool-version` attribute to [Policy Set Outcomes](/terraform/enterprise/api-docs/policy-evaluations#list-policy-outcomes).
+
+## 2023-10-03
+
+- Update [Policy Sets API](/terraform/enterprise/api-docs/policy-sets) to include `agent-enabled` and `policy-tool-version`.
+- Update [Policy Evaluations API](/terraform/enterprise/api-docs/policy-evaluations) to include `policy-tool-version`.
+
+## 2023-09-29
+
+- Add support for [streamlined run task reviews](/terraform/enterprise/integrations/run-tasks), enabling run task integrations to return high fidelity results.
+ - Update the [Terraform cloud run task API](/terraform/enterprise/api-docs/run-tasks/run-tasks) to enable streamlined run task reviews.
+ - The [run task integration API](/terraform/enterprise/api-docs/run-tasks/run-tasks-integration) now guides integrations through sending rich results.
+ - Updated the run task payload [JSON Schema](https://github.com/hashicorp/terraform-docs-common/blob/main/website/public/schema/run-tasks/runtask-result.json).
+
+## 2023-09-25
+
+- Add `intermediate` boolean attribute to the [State Versions API](/terraform/enterprise/api-docs/state-versions).
+
+## 2023-09-19
+
+- Add [failed state upload recovery](/terraform/enterprise/api-docs/applies#recover-a-failed-state-upload-after-applying) endpoint.
+
+## 2023-09-15
+
+- Add `auto-destroy-at` attribute to the [Workspaces API](/terraform/enterprise/api-docs/workspaces).
+- Update the [Notification Configurations API](/terraform/enterprise/api-docs/notification-configurations) to include [automatic destroy run](/terraform/enterprise/api-docs/notification-configurations#automatic-destroy-runs) details.
+
+## 2023-09-08
+
+- Update the [Organizations API](/terraform/enterprise/api-docs/organizations) to include `default-execution-mode` and `default-agent-pool`.
+- Update the [Workspaces API](/terraform/enterprise/api-docs/workspaces) to add a `setting-overwrites` object to allow you to overwrite `default-execution-mode` and `default-agent-pool`.
+
+## 2023-09-06
+
+- Update Policy Sets API endpoints to create, update, and return excluded workspaces associated with a policy set.
+- Add API endpoints to [Attach a Policy Set](/terraform/enterprise/api-docs/policy-sets#attach-a-policy-set-to-exclusions) and [Detach a Policy Set](/terraform/enterprise/api-docs/policy-sets#detach-a-policy-set-to-exclusions) from excluded workspaces.
+
+## 2023-08-21
+
+- Add `save-plan` attribute, `planned_and_saved` status, and `save_plan` operation type to [Runs endpoints](/terraform/enterprise/api-docs/run).
+
+## 2023-08-10
+
+- Add `provisional` to `configuration-versions` endpoint.
+
+## 2023-07-26
+
+- Add support for a `custom` option to the `team_project` access level along with various customizable permissions. The `project-access` permissions apply to the project itself, and `workspace-access` permissions apply to all workspaces within the project. For more information, see [Project Team Access](/terraform/enterprise/api-docs/project-team-access).
+
+## 2023-06-09
+
+- Introduce support for [`import` blocks](/terraform/language/import/generating-configuration).
+ - [Runs](/terraform/enterprise/api-docs/run#create-a-run) have a new `allow-config-generation` option.
+ - [Plans](/terraform/enterprise/api-docs/plans#show-a-plan) have new `resource-imports` and `generated-configuration` properties.
+ - [Applies](/terraform/enterprise/api-docs/applies#show-an-apply) have a new `resource-imports` property.
+- The workspaces associated with a policy set can now be updated using the [Policy Sets PATCH endpoint](/terraform/enterprise/api-docs/policy-sets#update-a-policy-set)
+- Update the [Workspaces](/terraform/enterprise/api-docs/workspaces) API endpoints to include the associated [project](/terraform/enterprise/api-docs/projects).
+
+## 2023-05-25
+
+- Terraform Cloud sets the `configuration_version_download_url`, `configuration_version_id`, and `workspace_working_directory` properties for all stages of the [Run Task Request](/terraform/enterprise/api-docs/run-tasks/run-tasks-integration#request-body).
+- Add the new `enforcement-level` property in the request and response of [Policies endpoints](/terraform/enterprise/api-docs/policies).
+- Deprecate the old `enforce` property in the request and response of [Policies endpoints](/terraform/enterprise/api-docs/policies).
+- Add new properties to limit run tasks and policies for the Terraform Cloud free tier. We updated the [entitlement set](/terraform/enterprise/api-docs/organizations#show-the-entitlement-set), [feature set](/terraform/enterprise/api-docs/feature-sets#sample-response), and [subscription](/terraform/enterprise/api-docs/subscriptions#sample-response) endpoints with the following properties:
+ - `run-task-limit`
+ - `run-task-workspace-limit`
+ - `run-task-mandatory-enforcement-limit`
+ - `policy-set-limit`
+ - `policy-limit`
+ - `policy-mandatory-enforcement-limit`
+ - `versioned-policy-set-limit`
+
+## 2023-04-25
+
+- Add the `version-id` property to the response for the Create, List, and Update [Workspace Variables endpoints](/terraform/enterprise/api-docs/workspaces-variables).
+
+## 2023-03-30
+
+- Add the `sort` query parameter to the Workspaces API's [list workspaces endpoint](/terraform/enterprise/api-docs/workspaces#list-workspaces).
+
+## 2023-03-24
+
+- Update the [Variable Sets](/terraform/enterprise/api-docs/variable-sets) API endpoints to include assigning variable sets to projects.
+
+## 2023-03-20
+
+- Add a names filter to the [Projects list API](/terraform/enterprise/api-docs/projects#query-parameters) to allow fetching a list of projects by name.
+
+## 2023-03-13
+
+- Update [Project Team Access API](/terraform/enterprise/api-docs/project-team-access) to include additional Project roles.
+- Update [Permissions](/terraform/enterprise/users-teams-organizations/permissions) to reflect the decoupling of projects and workspaces in the Organization Permissions UI.
+
+## 2023-03-08
+
+- Introduced the [GitHub App Installation APIs](/terraform/enterprise/api-docs/github-app-installations).
+- Updated [Workspaces API](/terraform/enterprise/api-docs/workspaces) to accept `vcs-repo.github-app-installation-id` to connect a workspace to a GitHub App Installation.
+- Updated [Registry Module API](/terraform/enterprise/api-docs/private-registry/modules) to accept `vcs-repo.github-app-installation-id` to connect to a GitHub App Installation.
+- Updated [Policy Sets API](/terraform/enterprise/api-docs/policy-sets) to accept `vcs-repo.github-app-installation-id` to connect to a GitHub App Installation.
+
+## 2023-02-16
+
+- Add `manage-membership` to the organization access settings of the [Team API](/terraform/enterprise/api-docs/teams).
+
+## 2023-02-03
+
+- Updated the [List Runs API](/terraform/enterprise/api-docs/run#list-runs-in-a-workspace) to note that the filter query parameters accept comma-separated lists.
+
+## 2023-01-18
+
+- Updated the [Team API](/terraform/enterprise/api-docs/teams) to include the `read-workspaces` and `read-projects` permissions which grants teams view access to workspaces and projects.
+
+## 2023-01-17
+
+- Add [Projects API](/terraform/enterprise/api-docs/projects) for creating, updating and deleting projects.
+- Add [Project Team Access API](/terraform/enterprise/api-docs/project-team-access) for managing access for teams to individual projects.
+- Update [Workspaces API](/terraform/enterprise/api-docs/workspaces) to include examples of creating a workspace in a project and moving a workspace between projects.
+- Update [List Teams API](/terraform/enterprise/api-docs/teams#query-parameters) to accept a search parameter `q`, so that teams can be searched by name.
+
+## 2023-01-12
+
+- Added new rollback to previous state endpoint to [State Versions API](/terraform/enterprise/api-docs/state-versions)
+
+## 2022-12-22
+
+- Updated [Safe Delete a workspace](/terraform/enterprise/api-docs/workspaces#safe-delete-a-workspace) to fix HTTP verb as `POST`.
+
+## 2022-11-18
+
+- Update [Policies API](/terraform/enterprise/api-docs/policies) to fix policy enforcement level defaults. Enforcement level is a required field, so no defaults are available.
+
+## 2022-11-03
+
+- Update [Policy Checks](/terraform/enterprise/api-docs/policy-checks) to fix policy set outcome return data type.
+
+### 2022-10-17
+
+- Updated the [Organizations API](/terraform/enterprise/api-docs/organizations) with the `allow-force-delete-workspaces`, which controls whether workspace administrators can delete workspaces with resources under management.
+- Updated the [Workspaces API](/terraform/enterprise/api-docs/workspaces) with a safe delete endpoint that guards against deleting workspaces that are managing resources.
+
+### 2022-10-12
+
+- Update [Policy Checks](/terraform/enterprise/api-docs/policy-checks) with result counts and support for filtering policy set outcomes.
+- Update [Team Membership API](/terraform/enterprise/api-docs/team-members) to include adding and removing users from teams using organization membership ID.
+
+
+
+### 2022-10-06
+
+- Updated the [Policies API](/terraform/enterprise/api-docs/policies) with support for Open Policy Agent (OPA) policies.
+- Update [Policy Sets](/terraform/enterprise/api-docs/policy-sets) with support for OPA policy sets.
+- Updated [Policy Checks](/terraform/enterprise/api-docs/policy-checks) to add support for listing policy evaluations and policy set outcomes.
+- Update [Run Tasks Stage](/terraform/enterprise/api-docs/run-tasks/run-task-stages-and-results) to include the new `policy_evaluations` attribute in the output.
+
+
+### 2022-09-21
+
+- Update [State Versions](/terraform/enterprise/api-docs/state-versions#create) with optional `json-state-outputs` and `json-state` attributes, which are base-64 encoded external JSON representations of the terraform state. The read-only `hosted-json-state-download-url` attribute links to this version of the state file when available.
+- Update [State Version Outputs](/terraform/enterprise/api-docs/state-version-outputs) with a `detailed-type` attribute, which refines the output with the precise Terraform type.
+
+### 2022-07-26
+
+- Updated the [Run status list](/terraform/enterprise/api-docs/run#run-states) with `fetching`, `queuing`, `pre_plan_running` and `pre_plan_completed`
+- Update [Run Tasks](/terraform/enterprise/api-docs/run-tasks.mdx) to include the new `stages` attribute when attaching or updating workspace tasks.
+- Updated [Run Tasks Integration](/terraform/enterprise/api-docs/run-tasks/run-tasks-integration) to specify the different request payloads for different stages.
+
+### 2022-06-23
+
+
+
+- Added the [Assessments](/terraform/enterprise/api-docs/assessments).
+
+- Updated [Workspace](/terraform/enterprise/api-docs/workspaces#create-a-workspace) and
+ [Notification Configurations](/terraform/enterprise/api-docs/notification-configurations#notification-triggers) to account for assessments.
+
+
+- Added new query parameter(s) to [List Runs endpoint](/terraform/enterprise/api-docs/run#list-runs-in-a-workspace).
+
+### 2022-06-21
+
+- Updated [Admin Organizations](/terraform/enterprise/api-docs/admin/organizations) endpoints with new `workspace-limit` setting. This is available in Terraform Enterprise v202207-1 and later.
+- Updated [List Agent Pools](/terraform/enterprise/api-docs/agents#list-agent-pools) to accept a filter parameter `filter[allowed_workspaces][name]` so that agent pools can be filtered by name of an associated workspace. The given workspace must be allowed to use the agent pool. Refer to [Scoping Agent Pools to Specific Workspaces](/terraform/cloud-docs/agents#scope-an-agent-pool-to-specific-workspaces).
+- Added new `organization-scoped` attribute and `allowed-workspaces` relationship to the request/response body of the below endpoints. This is available in Terraform Enterprise v202207-1 and later.
+ - [Show an Agent Pool](/terraform/enterprise/api-docs/agents#show-an-agent-pool)
+ - [Create an Agent Pool](/terraform/enterprise/api-docs/agents#create-an-agent-pool)
+ - [Update an Agent Pool](/terraform/enterprise/api-docs/agents#update-an-agent-pool)
+
+### 2022-06-17
+
+- Updated [Creating a Run Task](/terraform/enterprise/workspaces/settings/run-tasks#creating-a-run-task) section to include the new description information for the run task to be configured.
+- Update [Run Tasks](/terraform/enterprise/api-docs/run-tasks.mdx) to include the new description attribute.
+
+### 2022-06-09
+
+- Updated [List Agent Pools](/terraform/enterprise/api-docs/agents#list-agent-pools) to accept a search parameter `q`, so that agent pools can be searched by `name`. This is available in Terraform Enterprise v202207-1 and later.
+- Fixed [List Workspaces](/terraform/enterprise/api-docs/workspaces#list-workspaces) to add missing `search[tags]` query parameter.
+- Updated [List Workspaces](/terraform/enterprise/api-docs/workspaces#list-workspaces) to add new `search[exclude_tags]` query parameter. This is available in Terraform Enterprise v202207-1 and later.
+
+### 2022-05-11
+
+- Updated Run Tasks permission to the following endpoints:
+ - [Organizations](/terraform/enterprise/api-docs/organizations#list-organizations).
+ - [Team Access](/terraform/enterprise/api-docs/team-access#list-team-access-to-a-workspace).
+ - [Teams](/terraform/enterprise/api-docs/teams#list-teams).
+
+### 2022-05-04
+
+- Updated [Feature Sets](/terraform/enterprise/api-docs/feature-sets#list-feature-sets) to add new `run-tasks` attribute.
+
+### 2022-05-03
+
+- Added Run Tasks permission to the following endpoints:
+ - [Organizations](/terraform/enterprise/api-docs/organizations#list-organizations)
+ - [Workspaces](/terraform/enterprise/api-docs/workspaces#show-workspace)
+
+### 2022-04-29
+
+- Updated [Run Tasks Integration](/terraform/enterprise/api-docs/run-tasks/run-tasks-integration) to specify the allowed `status` attribute values.
+- Updated [Organization Memberships](/terraform/enterprise/api-docs/organization-memberships#query-parameters) to add new `filter[email]` query parameter.
+- Updated [Teams](/terraform/enterprise/api-docs/teams#query-parameters) to add new `filter[names]` query parameter.
+
+### 2022-04-04
+
+- Added the [Run Tasks Integration](/terraform/enterprise/api-docs/run-tasks/run-tasks-integration) endpoint.
+
+### 2022-03-14
+
+- Added the [Download Configuration Files](/terraform/enterprise/api-docs/configuration-versions#download-configuration-files) endpoints.
+
+### 2022-03-11
+
+- Introduced [Archiving Configuration Versions](/terraform/enterprise/workspaces/configurations#archiving-configuration-versions).
+ - Updated [Configuration Versions](/terraform/enterprise/api-docs/configuration-versions#attributes) to add new `fetching` and `archived` states.
+ - Updated [Runs](/terraform/enterprise/api-docs/run#attributes) to add new `fetching` state.
+ - Added the [Archive a Configuration Version](/terraform/enterprise/api-docs/configuration-versions#archive-a-configuration-version) endpoint.
+
+### 2022-02-25
+
+- Updated [Workspace Run Tasks](/terraform/enterprise/api-docs/run-tasks/run-tasks#show-a-run-task) to add new `enabled`attribute.
+
+### 2022-02-28
+
+- Introduced the [Registry Providers](/terraform/enterprise/api-docs/private-registry/providers) endpoints to manage private providers for a private registry.
+
+### 2021-12-09
+
+- Added `variables` field for POST /runs and the run resource, enabling run-specific variable values.
+
+### 2021-12-03
+
+- OAuth API updated to handle `secret` and `rsa_public_key` fields for POST/PUT.
+
+### 2021-11-17
+
+- Added pagination support to the following endpoints:
+ - [Feature Sets](/terraform/enterprise/api-docs/feature-sets#list-feature-sets) - `GET /feature-sets`
+ - [Notification Configurations](/terraform/enterprise/api-docs/notification-configurations#list-notification-configurations) - `GET /workspaces/:workspace_id/notification-configurations`
+ - [Oauth Clients](/terraform/enterprise/api-docs/oauth-clients#list-oauth-clients) - `GET /organizations/:organization_name/oauth-clients`
+ - [Oauth Tokens](/terraform/enterprise/api-docs/oauth-tokens#list-oauth-tokens) - `GET /oauth-clients/:oauth_client_id/oauth-tokens`
+ - [Organization Feature Sets](/terraform/enterprise/api-docs/feature-sets#list-feature-sets-for-organization) - `GET /organizations/:organization_name/feature-sets`
+ - [Organizations](/terraform/enterprise/api-docs/organizations#list-organizations) - `GET /organizations`
+ - [Policy Checks](/terraform/enterprise/api-docs/policy-checks#list-policy-checks) - `GET /runs/:run_id/policy-checks`
+ - [Policy Set Parameters](/terraform/enterprise/api-docs/policy-set-params#list-parameters) - `GET /policy-sets/:policy_set_id/parameters`
+ - [SSH Keys](/terraform/enterprise/api-docs/ssh-keys#list-ssh-keys) - `GET /organizations/:organization_name/ssh-keys`
+ - [User Tokens](/terraform/enterprise/api-docs/user-tokens#list-user-tokens) - `GET /users/:user_id/authentication-tokens`
+
+### 2021-11-11
+
+- Introduced the [Variable Sets](/terraform/enterprise/api-docs/variable-sets) endpoints for viewing and administering Variable Sets
+
+### 2021-11-18
+
+- Introduced the [Registry Providers](/terraform/enterprise/api-docs/private-registry/providers) endpoint to manage public providers for a
+ private registry. These endpoints will be available in the following Terraform Enterprise Release: `v202112-1`
+
+### 2021-09-12
+
+- Added [Run Tasks Stages and Results](/terraform/enterprise/api-docs/run-tasks/run-task-stages-and-results) endpoint.
+
+### 2021-08-18
+
+- Introduced the [State Version Outputs](/terraform/enterprise/api-docs/state-versions) endpoint to retrieve the Outputs for a
+ given State Version
+
+### 2021-08-11
+
+- **BREAKING CHANGE:** Security fix to [Configuration versions](/terraform/enterprise/api-docs/configuration-versions): upload-url attribute for [uploading configuration files](/terraform/enterprise/api-docs/configuration-versions#upload-configuration-files) is now only available on the create response.
+
+### 2021-07-30
+
+- Introduced Workspace Tagging
+ - Updated [Workspaces](/terraform/enterprise/api-docs/workspaces):
+ - added `tag-names` attribute.
+ - added `POST /workspaces/:workspace_id/relationships/tags`
+ - added `DELETE /workspaces/:workspace_id/relationships/tags`
+ - Added [Organization Tags](/terraform/enterprise/api-docs/organization-tags).
+ - Added `tags` attribute to [`tfrun`](/terraform/enterprise/policy-enforcement/sentinel/import/tfrun)
+
+### 2021-07-19
+
+- [Notification configurations](/terraform/enterprise/api-docs/notification-configurations): Gave organization tokens permission to create and manage notification configurations.
+
+### 2021-07-09
+
+- [State versions](/terraform/enterprise/api-docs/state-versions): Fixed the ID format for the workspace relationship of a state version. Previously, the reported ID was unusable due to a bug.
+- [Workspaces](/terraform/enterprise/api-docs/workspaces): Added `locked_by` as an includable related resource.
+- Added [Run Tasks](/terraform/enterprise/api-docs/run-tasks/run-tasks) API endpoint.
+
+### 2021-06-8
+
+- Updated [Registry Module APIs](/terraform/enterprise/api-docs/private-registry/modules).
+ - added `registry_name` scoped APIs.
+ - added `organization_name` scoped APIs.
+ - added [Module List API](/terraform/enterprise/api-docs/private-registry/modules#list-registry-modules-for-an-organization).
+ - updated [Module Delete APIs](/terraform/enterprise/api-docs/private-registry/modules#delete-a-module) (see deprecation note below).
+ - **CLOUD**: added public registry module related APIs.
+- **DEPRECATION**: The following [Registry Module APIs](/terraform/enterprise/api-docs/private-registry/modules) have been replaced with newer apis and will be removed in the future.
+ - The following endpoints to delete modules are replaced with [Module Delete APIs](/terraform/enterprise/api-docs/private-registry/modules#delete-a-module)
+ - `POST /registry-modules/actions/delete/:organization_name/:name/:provider/:version` replaced with `DELETE /organizations/:organization_name/registry-modules/:registry_name/:namespace/:name/:provider/:version`
+ - `POST /registry-modules/actions/delete/:organization_name/:name/:provider` replaced with `DELETE /organizations/:organization_name/registry-modules/:registry_name/:namespace/:name/:provider`
+ - `POST /registry-modules/actions/delete/:organization_name/:name` replaced with `DELETE /organizations/:organization_name/registry-modules/:registry_name/:namespace/:name`
+ - `POST /registry-modules` replaced with [`POST /organizations/:organization_name/registry-modules/vcs`](/terraform/enterprise/api-docs/private-registry/modules#publish-a-private-module-from-a-vcs)
+ - `POST /registry-modules/:organization_name/:name/:provider/versions` replaced with [`POST /organizations/:organization_name/registry-modules/:registry_name/:namespace/:name/:provider/versions`](/terraform/enterprise/api-docs/private-registry/modules#create-a-module-version)
+ - `GET /registry-modules/show/:organization_name/:name/:provider` replaced with [`GET /organizations/:organization_name/registry-modules/:registry_name/:namespace/:name/:provider`](/terraform/enterprise/api-docs/private-registry/modules#get-a-module)
+
+### 2021-05-27
+
+- **CLOUD**: [Agents](/terraform/enterprise/api-docs/agents): added [delete endpoint](/terraform/enterprise/api-docs/agents#delete-an-agent).
+
+### 2021-05-19
+
+- [Runs](/terraform/enterprise/api-docs/run): added `refresh`, `refresh-only`, and `replace-addrs` attributes.
+
+### 2021-04-16
+
+- Introduced [Controlled Remote State Access](https://www.hashicorp.com/blog/announcing-controlled-remote-state-access-for-terraform-cloud-and-enterprise).
+ - [Admin Settings](/terraform/enterprise/api-docs/admin/settings): added `default-remote-state-access` attribute.
+ - [Workspaces](/terraform/enterprise/api-docs/workspaces):
+ - added `global-remote-state` attribute.
+ - added [Remote State Consumers](/terraform/enterprise/api-docs/workspaces#get-remote-state-consumers) relationship.
+
+### 2021-04-13
+
+- [Teams](/terraform/enterprise/api-docs/teams): added `manage-policy-overrides` property to the `organization-access` attribute.
+
+### 2021-03-23
+
+- **ENTERPRISE**: `v202103-1` Introduced [Share Modules Across Organizations with Terraform Enterprise](https://www.hashicorp.com/blog/share-modules-across-organizations-terraform-enterprise).
+ - [Admin Organizations](/terraform/enterprise/api-docs/admin/organizations):
+ - added new query parameters to [List all Organizations endpoint](/terraform/enterprise/api-docs/admin/organizations#query-parameters)
+ - added module-consumers link in `relationships` response
+ - added [update module consumers endpoint](/terraform/enterprise/api-docs/admin/organizations#update-an-organization-39-s-module-consumers)
+ - added [list module consumers endpoint](/terraform/enterprise/api-docs/admin/organizations#list-module-consumers-for-an-organization)
+ - [Organizations](/terraform/enterprise/api-docs/organizations): added [Module Producers](/terraform/enterprise/api-docs/organizations#show-module-producers)
+ - **DEPRECATION**: [Admin Module Sharing](/terraform/enterprise/api-docs/admin/module-sharing): is replaced with a new JSON::Api compliant [endpoint](/terraform/enterprise/api-docs/admin/organizations#update-an-organization-39-s-module-consumers)
+
+### 2021-03-18
+
+- **CLOUD**: Introduced [New Workspace Overview for Terraform Cloud](https://www.hashicorp.com/blog/new-workspace-overview-for-terraform-cloud).
+ - [Workspaces](/terraform/enterprise/api-docs/workspaces):
+ - added `resource-count` and `updated-at` attributes.
+ - added [performance attributes](/terraform/enterprise/api-docs/workspaces#workspace-performance-attributes) (`apply-duration-average`, `plan-duration-average`, `policy-check-failures`, `run-failures`, `workspaces-kpis-run-count`).
+ - added `readme` and `outputs` [related resources](/terraform/enterprise/api-docs/workspaces#available-related-resources).
+ - [Team Access](/terraform/enterprise/api-docs/team-access): updated to support pagination.
+
+### 2021-03-11
+
+- Added [VCS Events](/terraform/enterprise/api-docs/vcs-events), limited to GitLab.com connections.
+
+### 2021-03-08
+
+- [Workspaces](/terraform/enterprise/api-docs/workspaces): added `current_configuration_version` and `current_configuration_version.ingress_attributes` as includable related resources.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/comments.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/comments.mdx
new file mode 100644
index 0000000000..2e96414328
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/comments.mdx
@@ -0,0 +1,227 @@
+---
+page_title: /comments API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/comments` endpoint to create and read
+ comments on Terraform runs.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[307]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/307
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Comments API reference
+
+Comments allow users to leave feedback or record decisions about a run.
+
+## List Comments for a Run
+
+`GET /runs/:id/comments`
+
+| Parameter | Description |
+| --------- | ------------------ |
+| `id` | The ID of the run. |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/runs/run-KTuq99JSzgmDSvYj/comments
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "wsc-JdFX3u8o114F4CWf",
+ "type": "comments",
+ "attributes": {
+ "body": "A comment body"
+ },
+ "relationships": {
+ "run-event": {
+ "data": {
+ "id": "re-fo1YXZ8W5bp5GBKM",
+ "type": "run-events"
+ },
+ "links": {
+ "related": "/api/v2/run-events/re-fo1YXZ8W5bp5GBKM"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/comments/wsc-JdFX3u8o114F4CWf"
+ }
+ },
+ {
+ "id": "wsc-QdhSPFTNoCTpfafp",
+ "type": "comments",
+ "attributes": {
+ "body": "Another comment body"
+ },
+ "relationships": {
+ "run-event": {
+ "data": {
+ "id": "re-fo1YXZ8W5bp5GBKM",
+ "type": "run-events"
+ },
+ "links": {
+ "related": "/api/v2/run-events/re-fo1YXZ8W5bp5GBKM"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/comments/wsc-QdhSPFTNoCTpfafp"
+ }
+ }
+ ]
+}
+```
+
+## Show a Comment
+
+`GET /comments/:id`
+
+| Parameter | Description |
+| --------- | ---------------------- |
+| `id` | The ID of the comment. |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/comments/wsc-gTFq83JSzjmAvYj
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "wsc-gTFq83JSzjmAvYj",
+ "type": "comments",
+ "attributes": {
+ "body": "Another comment"
+ },
+ "relationships": {
+ "run-event": {
+ "data": {
+ "id": "re-8RB5ZaFrDanG2hGY",
+ "type": "run-events"
+ },
+ "links": {
+ "related": "/api/v2/run-events/re-8RB5ZaFrDanG2hGY"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/comments/wsc-gTFq83JSzjmAvYj"
+ }
+ }
+}
+```
+
+## Create Comment
+
+`POST /runs/:id/comments`
+
+| Parameter | Description |
+| --------- | ------------------ |
+| `id` | The ID of the run. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as the request payload.
+
+| Key Path | Type | Default | Description |
+| ---------------------- | ------ | ------- | ------------------------ |
+| `data.type` | string | | Must be `"comments"`. |
+| `data.attributes.body` | string | | The body of the comment. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "body": "A comment about the run",
+ },
+ "type": "comments"
+ }
+}
+```
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/runs/run-KTuq99JSzgmDSvYj/comments
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "wsc-oRiShushpgLU4JD2",
+ "type": "comments",
+ "attributes": {
+ "body": "A comment about the run"
+ },
+ "relationships": {
+ "run-event": {
+ "data": {
+ "id": "re-E3xsBX11F1fbm2zV",
+ "type": "run-events"
+ },
+ "links": {
+ "related": "/api/v2/run-events/re-E3xsBX11F1fbm2zV"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/comments/wsc-oRiShushpgLU4JD2"
+ }
+ }
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/configuration-versions.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/configuration-versions.mdx
new file mode 100644
index 0000000000..8b5f077525
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/configuration-versions.mdx
@@ -0,0 +1,561 @@
+---
+page_title: /configuration-versions API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/configuration-versions` endpoint to list,
+ show, and create a configuration version and its files within a workspace.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[302]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/302
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Configuration versions API reference
+
+-> **Note:** Before working with the runs or configuration versions APIs, read the [API-driven run workflow](/terraform/enterprise/run/api) page, which includes both a full overview of this workflow and a walkthrough of a simple implementation of it.
+
+A configuration version (`configuration-version`) is a resource used to reference the uploaded configuration files. It is associated with the run to use the uploaded configuration files for performing the plan and apply.
+
+You need read runs permission to list and view configuration versions for a workspace, and you need queue plans permission to create new configuration versions. Refer to the [permissions](/terraform/enterprise/users-teams-organizations/permissions#general-workspace-permissions) documentation for more details.
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+## Attributes
+
+### Configuration Version States
+
+The configuration version state is found in `data.attributes.status`, and you can reference the following list of possible states.
+
+A configuration version created through the API or CLI can only be used in runs if it is in an `uploaded` state. A configuration version created through a linked VCS repository may also be used in runs if it is in an `archived` state.
+
+| State | Description | |
+| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - |
+| `pending` | The initial status of a configuration version after it has been created. Pending configuration versions cannot be used to create new runs. | |
+| `fetching` | For configuration versions created from a commit to a connected VCS repository, HCP Terraform is currently fetching the associated files from VCS. | |
+| `uploaded` | The configuration version is fully processed and can be used in runs. | |
+| `archived` | All immediate runs are complete and HCP Terraform has discarded the files associated with this configuration version. If the configuration version was created through a connected VCS repository, it can still be used in new runs. In those cases, HCP Terraform will re-fetch the files from VCS. | |
+| `errored` | HCP Terraform could not process this configuration version, and it cannot be used to create new runs. You can try again by pushing a new commit to your linked VCS repository or creating a new configuration version with the API or CLI. | |
+| `backing_data_soft_deleted` | Indicates that the configuration version's backing data is marked for garbage collection. If no action is taken, the backing data associated with this configuration version is permanently deleted after a set number of days. You can restore the backing data associated with the configuration version before it is permanently deleted. | |
+| `backing_data_permanently_deleted` | The configuration version's backing data has been permanently deleted and can no longer be restored. | |
+
+## List Configuration Versions
+
+`GET /workspaces/:workspace_id/configuration-versions`
+
+| Parameter | Description |
+| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The ID of the workspace to list configurations from. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](/terraform/enterprise/api-docs/workspaces#show-workspace) endpoint. |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | -------------------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 configuration versions per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/workspaces/ws-2Qhk7LHgbMrm3grF/configuration-versions
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "cv-ntv3HbhJqvFzamy7",
+ "type": "configuration-versions",
+ "attributes": {
+ "error": null,
+ "error-message": null,
+ "source": "gitlab",
+ "speculative":false,
+ "status": "uploaded",
+ "status-timestamps": {},
+ "provisional": false
+ },
+ "relationships": {
+ "ingress-attributes": {
+ "data": {
+ "id": "ia-i4MrTxmQXYxH2nYD",
+ "type": "ingress-attributes"
+ },
+ "links": {
+ "related":
+ "/api/v2/configuration-versions/cv-ntv3HbhJqvFzamy7/ingress-attributes"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/configuration-versions/cv-ntv3HbhJqvFzamy7",
+ "download": "/api/v2/configuration-versions/cv-ntv3HbhJqvFzamy7/download"
+ }
+ }
+ ]
+}
+```
+
+## Show a Configuration Version
+
+`GET /configuration-versions/:configuration-id`
+
+| Parameter | Description |
+| ------------------- | ------------------------------------ |
+| `:configuration-id` | The id of the configuration to show. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/configuration-versions/cv-ntv3HbhJqvFzamy7
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "cv-ntv3HbhJqvFzamy7",
+ "type": "configuration-versions",
+ "attributes": {
+ "error": null,
+ "error-message": null,
+ "source": "gitlab",
+ "speculative":false,
+ "status": "uploaded",
+ "status-timestamps": {},
+ "provisional": false
+ },
+ "relationships": {
+ "ingress-attributes": {
+ "data": {
+ "id": "ia-i4MrTxmQXYxH2nYD",
+ "type": "ingress-attributes"
+ },
+ "links": {
+ "related":
+ "/api/v2/configuration-versions/cv-ntv3HbhJqvFzamy7/ingress-attributes"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/configuration-versions/cv-ntv3HbhJqvFzamy7",
+ "download": "/api/v2/configuration-versions/cv-ntv3HbhJqvFzamy7/download"
+ }
+ }
+}
+```
+
+## Show a Configuration Version's Commit Information
+
+An ingress attributes resource (`ingress-attributes`) is used to reference commit information for configuration versions created in a workspace with a VCS repository.
+
+`GET /configuration-versions/:configuration-id/ingress-attributes`
+
+| Parameter | Description |
+| ------------------- | ------------------------------------ |
+| `:configuration-id` | The id of the configuration to show. |
+
+Ingress attributes can also be fetched as part of a query to a particular configuration version via `include`:
+
+`GET /configuration-versions/:configuration-id?include=ingress-attributes`
+
+| Parameter | Description |
+| ------------------- | ------------------------------------ |
+| `:configuration-id` | The id of the configuration to show. |
+
+
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/configuration-versions/cv-TrHjxIzad9Ae9i8x/ingress-attributes
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "ia-zqHjxJzaB9Ae6i9t",
+ "type": "ingress-attributes",
+ "attributes": {
+ "branch": "add-cool-stuff",
+ "clone-url": "https://github.com/hashicorp/foobar.git",
+ "commit-message": "Adding really cool infrastructure",
+ "commit-sha": "1e1c1018d1bbc0b8517d072718e0d87c1a0eda95",
+ "commit-url": "https://github.com/hashicorp/foobar/commit/1e1c1018d1bbc0b8517d072718e0d87c1a0eda95",
+ "compare-url": "https://github.com/hashicorp/foobar/pull/163",
+ "identifier": "hashicorp/foobar",
+ "is-pull-request": true,
+ "on-default-branch": false,
+ "pull-request-number": 163,
+ "pull-request-url": "https://github.com/hashicorp/foobar/pull/163",
+ "pull-request-title": "Adding really cool infrastructure",
+ "pull-request-body": "These are changes to add really cool stuff. We should absolutely merge this.",
+ "tag": null,
+ "sender-username": "chrisarcand",
+ "sender-avatar-url": "https://avatars.githubusercontent.com/u/2430490?v=4",
+ "sender-html-url": "https://github.com/chrisarcand"
+ },
+ "relationships": {
+ "created-by": {
+ "data": {
+ "id": "user-PQk2Z3dfXAax18P6s",
+ "type": "users"
+ },
+ "links": {
+ "related": "/api/v2/ingress-attributes/ia-zqHjxJzaB9Ae6i9t/created-by"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/ingress-attributes/ia-zqHjxJzaB9Ae6i9t"
+ }
+ }
+}
+```
+
+## Create a Configuration Version
+
+`POST /workspaces/:workspace_id/configuration-versions`
+
+| Parameter | Description |
+| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The ID of the workspace to create the new configuration version in. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](/terraform/enterprise/api-docs/workspaces#show-workspace) endpoint. |
+
+-> **Note:** This endpoint cannot be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| --------------------------------- | ------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.attributes.auto-queue-runs` | boolean | true | When true, runs are queued automatically when the configuration version is uploaded. |
+| `data.attributes.speculative` | boolean | false | When true, this configuration version may only be used to create runs which are speculative, that is, can neither be confirmed nor applied. |
+| `data.attributes.provisional` | boolean | false | When true, this configuration version does not immediately become the workspace current configuration version. If the associated run is applied, it then becomes the current configuration version unless a newer one exists. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "configuration-versions",
+ "attributes": {
+ "auto-queue-runs": true
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-2Qhk7LHgbMrm3grF/configuration-versions
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "cv-UYwHEakurukz85nW",
+ "type": "configuration-versions",
+ "attributes": {
+ "auto-queue-runs": true,
+ "error": null,
+ "error-message": null,
+ "source": "tfe-api",
+ "speculative":false,
+ "status": "pending",
+ "status-timestamps": {},
+ "upload-url":
+ "https://archivist.terraform.io/v1/object/9224c6b3-2e14-4cd7-adff-ed484d7294c2",
+ "provisional": false
+ },
+ "relationships": {
+ "ingress-attributes": {
+ "data": null,
+ "links": {
+ "related":
+ "/api/v2/configuration-versions/cv-UYwHEakurukz85nW/ingress-attributes"
+ }
+ }
+ },
+ "links": { "self": "/api/v2/configuration-versions/cv-UYwHEakurukz85nW" }
+ }
+}
+```
+
+### Configuration Files Upload URL
+
+Once a configuration version is created, use the `upload-url` attribute to [upload configuration files](#upload-configuration-files) associated with that version. The `upload-url` attribute is only provided in the response when creating configuration versions.
+
+## Upload Configuration Files
+
+-> **Note**: If `auto-queue-runs` was either not provided or set to `true` during creation of the configuration version, a run using this configuration version will be automatically queued on the workspace. If `auto-queue-runs` was set to `false` explicitly, then it is necessary to [create a run on the workspace](/terraform/enterprise/api-docs/run#create-a-run) manually after the configuration version is uploaded.
+
+`PUT https://archivist.terraform.io/v1/object/`
+
+**The URL is provided in the `upload-url` attribute when creating a `configuration-versions` resource. After creation, the URL is hidden on the resource and no longer available.**
+
+### Sample Request
+
+**@filename is the name of configuration file you wish to upload.**
+
+```shell
+curl \
+ --header "Content-Type: application/octet-stream" \
+ --request PUT \
+ --data-binary @filename \
+ https://archivist.terraform.io/v1/object/4c44d964-eba7-4dd5-ad29-1ece7b99e8da
+```
+
+## Archive a Configuration Version
+
+`POST /configuration-versions/:configuration_version_id/actions/archive`
+
+| Parameter | Description |
+| -------------------------- | ----------------------------------------------- |
+| `configuration_version_id` | The ID of the configuration version to archive. |
+
+This endpoint notifies HCP Terraform to discard the uploaded `.tar.gz` file associated with this configuration version. This endpoint can only archive configuration versions that were created with the API or CLI, are in an `uploaded` [state](#configuration-version-states), have no runs in progress, and are not the current configuration version for any workspace. Otherwise, calling this endpoint will result in an error.
+
+HCP Terraform automatically archives configuration versions created through VCS when associated runs are complete and then re-fetches the files for subsequent runs.
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
+| [202][] | none | Successfully initiated the archive process. |
+| [409][] | [JSON API error object][] | Configuration version was in a non-archivable state or the configuration version was created with VCS and cannot be archived through the API. |
+| [404][] | [JSON API error object][] | Configuration version was not found or user not authorized. |
+
+### Request Body
+
+This POST endpoint does not take a request body.
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/configuration-versions/cv-ntv3HbhJqvFzamy7/actions/archive
+```
+
+## Download Configuration Files
+
+`GET /configuration-versions/:configuration_version_id/download`
+
+| Parameter | Description |
+| -------------------------- | ------------------------------------------------ |
+| `configuration_version_id` | The ID of the configuration version to download. |
+
+`GET /runs/:run_id/configuration-version/download`
+
+| Parameter | Description |
+| --------- | ------------------------------------------------------------------- |
+| `run_id` | The ID of the run whose configuration version should be downloaded. |
+
+These endpoints generate a temporary URL to the location of the configuration version in a `.tar.gz` archive, and then redirect to that link. If using a client that can follow redirects, you can use these endpoints to save the `.tar.gz` archive locally without needing to save the temporary URL. These endpoints will return an error if attempting to download a configuration version that is not in an `uploaded` [state](#configuration-version-states).
+
+| Status | Response | Reason |
+| ------- | ------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
+| [302][] | HTTP Redirect | Configuration version found and temporary download URL generated |
+| [404][] | [JSON API error object][] | Configuration version not found, or specified configuration version is not uploaded, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --location \
+ https://app.terraform.io/api/v2/configuration-versions/cv-C6Py6WQ1cUXQX2x2/download \
+ > export.tar.gz
+```
+
+## Mark a Configuration Version for Garbage Collection
+
+
+This endpoint is exclusive to Terraform Enterprise, and not available in HCP Terraform. Learn more about Terraform Enterprise.
+
+
+`POST /api/v2/configuration-versions/:configuration-id/actions/soft_delete_backing_data`
+
+| Parameter | Description |
+| ------------------- | --------------------------------------------------- |
+| `:configuration-id` | The ID of the configuration version to soft delete. |
+
+This endpoint directs Terraform Enterprise to _soft delete_ the backing files associated with the configuration version. Soft deletion refers to marking the configuration version for garbage collection. Terraform permanently deletes configuration versions marked for soft deletion after a set number of days unless the configuration version is restored. Once a configuration version is soft deleted, any attempts to read the configuration version will fail. Refer to [Configuration Version States](#configuration-version-states) for information about all data states.
+
+This endpoint can only soft delete configuration versions that meet the following criteria:
+
+- Were created using the API or CLI,
+- are in an [`uploaded` state](#configuration-version-states),
+- and are not the current configuration version.
+
+Otherwise, the endpoint returns an error.
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
+| [200][] | none | Terraform successfully marked the data for garbage collection. |
+| [400][] | [JSON API error object][] | Terraform failed to transition the state to `backing_data_soft_deleted`. |
+| [404][] | [JSON API error object][] | Terraform did not find the configuration version or the user is not authorized to modify the configuration version state. |
+
+### Request Body
+
+This POST endpoint does not take a request body.
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/configuration-versions/cv-ntv3HbhJqvFzamy7/actions/soft_delete_backing_data
+ --data {"data": {"attributes": {"delete-older-than-n-days": 23}}}
+```
+
+## Restore Configuration Versions Marked for Garbage Collection
+
+
+This endpoint is exclusive to Terraform Enterprise, and not available in HCP Terraform. Learn more about Terraform Enterprise.
+
+
+`POST /api/v2/configuration-versions/:configuration-id/actions/restore_backing_data`
+
+| Parameter | Description |
+| ------------------- | ---------------------------------------------------------------------------------------- |
+| `:configuration-id` | The ID of the configuration version to restore back to its uploaded state if applicable. |
+
+This endpoint directs Terraform Enterprise to restore backing files associated with this configuration version. This endpoint can only restore delete configuration versions that meet the following criteria:
+
+- are not in a [`backing_data_permanently_deleted` state](#configuration-version-states).
+
+Otherwise, the endpoint returns an error. Terraform restores applicable configuration versions back to their `uploaded` state.
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
+| [200][] | none | Terraform successfully initiated the restore process. |
+| [400][] | [JSON API error object][] | Terraform failed to transition the state to `uploaded`. |
+| [404][] | [JSON API error object][] | Terraform did not find the configuration version or the user is not authorized to modify the configuration version state. |
+
+### Request Body
+
+This POST endpoint does not take a request body.
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/configuration-versions/cv-ntv3HbhJqvFzamy7/actions/restore_backing_data
+```
+
+## Permanently Delete a Configuration Version
+
+
+This endpoint is exclusive to Terraform Enterprise, and not available in HCP Terraform. Learn more about Terraform Enterprise.
+
+
+`POST /api/v2/configuration-versions/:configuration-id/actions/permanently_delete_backing_data`
+
+| Parameter | Description |
+| ------------------- | ---------------------------------------------------------- |
+| `:configuration-id` | The ID of the configuration version to permanently delete. |
+
+This endpoint directs Terraform Enterprise to permanently delete backing files associated with this configuration version. This endpoint can only permanently delete configuration versions that meet the following criteria:
+
+- Were created using the API or CLI,
+- are in a [`backing_data_soft_deleted` state](#configuration-version-states),
+- and are not the current configuration version.
+
+Otherwise, the endpoint returns an error.
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
+| [200][] | none | Terraform successfully deleted the data permanently. |
+| [400][] | [JSON API error object][] | Terraform failed to transition the state to `backing_data_permanently_deleted`. |
+| [404][] | [JSON API error object][] | Terraform did not find the configuration version or the user is not authorized to modify the configuration version state. |
+
+### Request Body
+
+This POST endpoint does not take a request body.
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/configuration-versions/cv-ntv3HbhJqvFzamy7/actions/permanently_delete_backing_data
+```
+
+## Available Related Resources
+
+The GET endpoints above can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource Name | Description |
+| -------------------- | ------------------------------------------------- |
+| `ingress_attributes` | The commit information used in the configuration. |
+| `run` | The run created by the configuration. |
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/cost-estimates.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/cost-estimates.mdx
new file mode 100644
index 0000000000..a58a2b8481
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/cost-estimates.mdx
@@ -0,0 +1,98 @@
+---
+page_title: /cost-estimates API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/cost-estimates` endpoint to read a cost
+ estimate using its ID.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Cost estimates API reference
+
+## Show a cost estimate
+
+-> **Note**: The hash in the `resources` attribute structure represents low-level Cost Estimation details. The keys or structure may change over time. Use the data in this hash at your own risk.
+
+`GET /cost-estimates/:id`
+
+| Parameter | Description |
+| --------- | ------------------------------------ |
+| `id` | The ID of the cost estimate to show. |
+
+There is no endpoint to list cost estimates. You can find the ID for a cost estimate in the
+`relationships.cost-estimate` property of a run object.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------ | --------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "cost-estimates"`) | The request was successful |
+| [404][] | [JSON API error object][] | Cost estimate not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/v2/cost-estimates/ce-BPvFFrYCqRV6qVBK
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "ce-BPvFFrYCqRV6qVBK",
+ "type": "cost-estimates",
+ "attributes": {
+ "error-message": null,
+ "status": "finished",
+ "status-timestamps": {
+ "queued-at": "2017-11-29T20:02:17+00:00",
+ "finished-at": "2017-11-29T20:02:20+00:00"
+ },
+ "resources": {...},
+ "resources-count": 4,
+ "matched-resources-count": 3,
+ "unmatched-resources-count": 1,
+ "prior-monthly-cost": "0.0",
+ "proposed-monthly-cost": "25.488",
+ "delta-monthly-cost": "25.488",
+ },
+ "links": {
+ "self": "/api/v2/cost-estimate/ce-9VYRc9bpfJEsnwum"
+ }
+ }
+ ]
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/data-retention-policies.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/data-retention-policies.mdx
new file mode 100644
index 0000000000..2678528ba8
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/data-retention-policies.mdx
@@ -0,0 +1,291 @@
+---
+page_title: /data-retention-policy API endpoint reference
+description: >-
+ Use the `/data-retention-policy` endpoint to configure data storage policy. Learn how to call the data retention policy endpoint to delete data after a specific number of days.
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+
+# Data retention policy API
+
+Data retention policies allow administrators to control storage usage by specifying how long backing data is retained for different resources.
+
+A data retention policy determines when Terraform Enterprise automatically marks _backing data_ for garbage collection. Backing data refers to [configuration version](/terraform/enterprise/api-docs/configuration-versions) or [state version](/terraform/enterprise/api-docs/state-versions) files.
+
+You can set data retention policies per workspace, organization, and Terraform Enterprise installation.
+## Default policy settings
+
+When the data retention policy is unspecified for a workspace, the workspace inherits the data retention policy defined for the organization. Refer to [Data Retention Policies](/terraform/enterprise/workspaces/settings/deletion#data-retention-policies) in the workspace settings documentation for additional information.
+
+When the data retention policy is unspecified for an organization, the organization inherits the [global data retention policy](/terraform/enterprise/application-administration/general#data-retention-policies). Refer to [Data Retention Policies](/terraform/enterprise/users-teams-organizations/organizations#destruction-and-deletion) in the organization settings documentation for additional information.
+
+
+## Show data retention policy
+
+This endpoint shows the data retention policy set on the target resource.
+
+| Resource | API Endpoint |
+| --------------| ----------------------------------------------- |
+| [Workspaces](/terraform/enterprise/api-docs/workspaces#show-data-retention-policy) | `GET /workspaces/:workspace_id/relationships/data-retention-policy` |
+| [Organizations](/terraform/enterprise/api-docs/organizations#show-data-retention-policy) | `GET /organizations/:organization_name/relationships/data-retention-policy` |
+| [Site-wide](/terraform/enterprise/api-docs/admin/settings#show-data-retention-policy) | `GET /admin/data-retention-policy-settings` |
+
+For more information on the types of data retention policies, and the keys returned for each, refer to [Data Retention Policy Types](#data-retention-policy-types)
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | ------------------------------------------------------------- |
+| [200][] | [JSON API document][] with `type` set to `"data-retention-policy-delete-olders"` or `"data-retention-policy-dont-deletes"` | Successful request. Refer to [Data Retention Policy Types](#data-retention-policy-types). |
+| [404][] | [JSON API error object][] | Target resource not found, data retention policy does not exist, or user unauthorized to perform action. |
+
+### Request body
+
+No request body.
+
+### Sample request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/hashicorp/relationships/data-retention-policy
+```
+
+### Sample response
+
+```json
+{
+ "data": {
+ "id": "drp-Kh74zpKVGNWbpugQ",
+ "type": "data-retention-policy-delete-olders",
+ "attributes": {
+ "delete-older-than-n-days": 60
+ },
+ "relationships": {
+ "target": {
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations"
+ }
+ }
+ }
+ }
+}
+```
+
+## Create or update data retention policy
+
+This endpoint creates a data retention policy attached to a target resource or updates the existing policy.
+
+| Resource | API Endpoint |
+| --------------| ----------------------------------------------- |
+| [Workspaces](/terraform/enterprise/api-docs/workspaces#create-or-update-data-retention-policy) | `POST /workspaces/:workspace_id/relationships/data-retention-policy` |
+| [Organizations](/terraform/enterprise/api-docs/organizations#create-or-update-data-retention-policy) | `POST /organizations/:organization_name/relationships/data-retention-policy` |
+| [Site-wide](/terraform/enterprise/api-docs/admin/settings#create-or-update-data-retention-policy) | `POST /admin/data-retention-policy-settings` |
+
+You can also call the endpoint to change the type of the data retention policy. Sending a `POST` or `PATCH` request and specifying a different type of policy in the payload automatically creates the new data retention policy for the target resource to replace the existing policy.
+For more information on the types of data retention policies, refer to [Data Retention Policy Types](#data-retention-policy-types).
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | ----------------------------------------------------------- |
+| [204][] | No content | Successfully updated the target resource's data retention policy. |
+| [404][] | [JSON API error object][] | Target resource not found or user is not authorized to perform action. |
+
+### Request body
+
+This `POST` endpoint requires a JSON object with the following properties as a request payload:
+
+| Key path | Type | Description |
+| ----------------- | ------ | ------------------------------ |
+| `data.type` | string | A [data retention policy type](#data-retention-policy-types) |
+| `data.attributes` | object | The attributes for the specified [policy type](#data-retention-policy-types) |
+
+### Sample payload
+
+```json
+{
+ "data": {
+ "type": "data-retention-policy-delete-olders",
+ "attributes": {
+ "deleteOlderThanNDays": 33
+ }
+ }
+}
+```
+
+### Sample request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-UYv6RYM8fVhzeGG5/relationships/data-retention-policy
+```
+
+### Sample response
+
+```json
+{
+ "data": {
+ "id": "drp-Kh74zpKVGNWbpugQ",
+ "type": "data-retention-policy-delete-olders",
+ "attributes": {
+ "delete-older-than-n-days": 33
+ },
+ "relationships": {
+ "target": {
+ "data": {
+ "id": "ws-7aiqKYf6ejMFdtWS",
+ "type": "workspaces"
+ }
+ }
+ }
+ }
+}
+```
+
+## Remove data retention policy
+
+This endpoint removes the data retention policy explicitly set on a target resource.
+
+| Resource | API Endpoint |
+| --------------| ----------------------------------------------- |
+| [Workspaces](/terraform/enterprise/api-docs/workspaces#remove-data-retention-policy) | `DELETE /workspaces/:workspace_id/relationships/data-retention-policy` |
+| [Organizations](/terraform/enterprise/api-docs/organizations#remove-data-retention-policy) | `DELETE /organizations/:organization_name/relationships/data-retention-policy` |
+| [Site-wide](/terraform/enterprise/api-docs/admin/settings#remove-data-retention-policy) | `DELETE /admin/data-retention-policy-settings` |
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------- |
+| [204][] | No Content | Successfully removed the target resource's data retention policy. |
+| [404][] | [JSON API error object][] | Target resource not found, or user unauthorized to perform action. |
+
+### Request body
+
+No request body.
+
+### Sample request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/organizations/hashicorp/relationships/data-retention-policy
+```
+
+### Response
+
+No response body.
+
+Status code `204`.
+
+## Data retention policy types
+
+You can send a `POST` or `PATCH` request to `/data-retention-policy` and `/data-retention-policy-settings` endpoints to set the policy or change the existing policy. The schema for each type has a set of attributes that are specific to the type.
+
+Specify one of the following data retention policy types in the `data.type` parameter in the request payload:
+
+- `data-retention-policy-delete-olders`: Directs Terraform Enterprise to delete backing data older than a set number of days. Refer to [`data-retention-policy-delete-olders`](#data-retention-policy-delete-olders) for additional information.
+- `data-retention-policy-dont-deletes`: Directs Terraform Enterprise to preserve backing data for the related resource. Refer to [`data-retention-policy-dont-deletes`](#data-retention-policy-dont-deletes) for additional information.
+
+To view the existing policy, send a `GET` request to the endpoint. Endpoints are polymorphic and may return different policy types depending on how Terraform Enterprise has been configured.
+
+### `data-retention-policy-delete-olders`
+
+This policy directs Terraform Enterprise to delete backing data older than a set number of days.
+
+### Properties
+
+| Key path | Type | Description |
+| -------------------------------------- | ------- | ---------------------------------------------- |
+| `data.type` | string | Must be `data-retention-policy-delete-olders`. |
+| `data.attributes.deleteOlderThanNDays` | integer | The number of days to retain backing data for. |
+| `data.relationships.target` | object | The resource the policy is attached to. An organization, workspace, or `null` for the site-wide policy. Cannot be updated directly. |
+
+### Sample payload
+
+```json
+{
+ "data": {
+ "type": "data-retention-policy-delete-olders",
+ "attributes": {
+ "deleteOlderThanNDays": 33
+ }
+ }
+}
+```
+
+### Sample response body
+
+```json
+{
+ "data": {
+ "id": "drp-Kh74zpKVGNWbpugQ",
+ "type": "data-retention-policy-delete-olders",
+ "attributes": {
+ "delete-older-than-n-days": 33
+ },
+ "relationships": {
+ "target": {
+ "data": {
+ "id": "ws-7aiqKYf6ejMFdtWS",
+ "type": "workspaces"
+ }
+ }
+ }
+ }
+}
+```
+
+### `data-retention-policy-dont-deletes`
+
+This policy directs Terraform Enterprise to preserve backing data for the related resource.
+
+### Properties
+
+| Key path | Type | Description |
+| -------------------------------------- | ------- | ---------------------------------------------- |
+| `data.type` | string | Must be `data-retention-policy-dont-deletes`. |
+| `data.attributes` | object | Not applicable. This policy type does not have attributes. |
+| `data.relationships.target` | object | The resource the policy is attached to. An organization, workspace. Cannot be updated directly. |
+
+### Sample payload
+
+```json
+{
+ "data": {
+ "type": "data-retention-policy-dont-deletes",
+ "attributes": {}
+ }
+}
+```
+
+### Sample response body
+
+```json
+{
+ "data": {
+ "id": "drp-Kh74zpKVGNWbpugQ",
+ "type": "data-retention-policy-dont-deletes",
+ "attributes": {},
+ "relationships": {
+ "target": {
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations"
+ }
+ }
+ }
+ }
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/github-app-installations.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/github-app-installations.mdx
new file mode 100644
index 0000000000..8573467c08
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/github-app-installations.mdx
@@ -0,0 +1,127 @@
+---
+page_title: /github-app/installations API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/github-app/installations` endpoint to
+ view details about where you have installed the Terraform Enterprise GitHub
+ App.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# GitHub App installations API reference
+
+You can create a GitHub App installation using the HCP Terraform UI. Learn how to [create a GitHub App installation](/terraform/enterprise/vcs/github-app).
+
+~> **Note:** To use this resource in Terraform Enterprise installations, you must configure the GitHub App in the site admin area.
+
+~> **Note:** You can only use this API if you have already authorized the Terraform Cloud GitHub App. Manage your [GitHub App token](/terraform/enterprise/users-teams-organizations/users#github-app-oauth-token) from **Account Settings** > **Tokens**.
+
+## List Installations
+
+This endpoint lists GitHub App installations available to the current user.
+
+`GET /github-app/installations`
+
+### Query Parameters
+
+Queries only return GitHub App Installations that the current user has access to within GitHub.
+
+| Parameter | Description |
+| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `filter[name]` | **Optional.** If present, returns a list of available GitHub App installations that match the GitHub organization or login. |
+| `filter[installation_id]` | **Optional.** If present, returns a list of available GitHub App installations that match the installation ID within GitHub. (**Not HCP Terraform**) |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/github-app/installations
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "ghain-BYrbNeGQ8nAzKouu",
+ "type": "github-app-installations",
+ "attributes": {
+ "name": "octouser",
+ "installation-id": 54810170,
+ "icon-url": "https://avatars.githubusercontent.com/u/29916665?v=4",
+ "installation-type": "User",
+ "installation-url": "https://github.com/settings/installations/54810170"
+ }
+ }
+ ]
+}
+```
+
+## Show Installation
+
+`GET /github-app/installation/:gh_app_installation_id`
+
+| Parameter | Description |
+| ------------------------- | ------------------------------ |
+| `:gh_app_installation_id` | The Github App Installation ID |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/github-app/installation/ghain-R4xmKTaxnhLFioUq
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "ghain-R4xmKTaxnhLFioUq",
+ "type": "github-app-installations",
+ "attributes": {
+ "name": "octouser",
+ "installation-id": 54810170,
+ "icon-url": "https://avatars.githubusercontent.com/u/29916665?v=4",
+ "installation-type": "User",
+ "installation-url": "https://github.com/settings/installations/54810170"
+ }
+ }
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/index.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/index.mdx
new file mode 100644
index 0000000000..9615d628e4
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/index.mdx
@@ -0,0 +1,374 @@
+---
+page_title: API documentation for Terraform Enterprise
+description: >-
+ Learn about API authentication, response codes, versioning, formatting, rate
+ limiting, and clients.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# HCP Terraform API documentation
+
+HCP Terraform provides an API for a subset of its features. If you need assistance or want to submit a feature request, visit the [HashiCorp support center](https://support.hashicorp.com/hc/en-us) and open a ticket.
+
+-> **Note:** Before planning an API integration, consider whether [the `tfe` Terraform provider](https://registry.terraform.io/providers/hashicorp/tfe/latest/docs) meets your needs. It can't create or approve runs in response to arbitrary events, but it's a useful tool for managing your organizations, teams, and workspaces as code.
+
+HashiCorp provides a [stability policy](/terraform/enterprise/api-docs/stability-policy) for the HCP Terraform API, ensuring backwards compatibility for stable endpoints. The [changelog](/terraform/enterprise/api-docs/changelog) tracks changes to the API for HCP Terraform and Terraform Enterprise.
+
+## Authentication
+
+All requests must be authenticated with a bearer token. Use the HTTP header `Authorization` with the value `Bearer `. If the token is absent or invalid, HCP Terraform responds with [HTTP status 401][401] and a [JSON API error object][]. The 401 status code is reserved for problems with the authentication token; forbidden requests with a valid token result in a 404.
+
+You can use the following types of tokens to authenticate:
+
+- [User tokens](/terraform/enterprise/users-teams-organizations/users#api-tokens) — each HCP Terraform user can have any number of API tokens, which can make requests on their behalf.
+- [Team tokens](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens) — each team can have one API token at a time. This is intended for performing plans and applies via a CI/CD pipeline.
+- [Organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens) — each organization can have one API token at a time. This is intended for automating the management of teams, team membership, and workspaces. The organization token cannot perform plans and applies.
+
+- [Audit trails token](/terraform/enterprise/users-teams-organizations/api-tokens#audit-trails-tokens) - each organization can have a single token that can read that organization's audit trails. Use this token type to authenticate integrations pulling audit trail data, for example, using the [HCP Terraform for Splunk](/terraform/enterprise/integrations/splunk) app.
+
+
+### Blob Storage Authentication
+
+HCP Terraform relies on a HashiCorp-developed blob storage service for storing statefiles and multiple other pieces of customer data, all of which are documented on our [data security page](/terraform/enterprise/architectural-details/data-security).
+
+Unlike the HCP Terraform API, this service does not require that a bearer token be submitted with each request. Instead, each URL includes a securely generated secret and is only valid for 25 hours.
+
+For example, the [state versions api](/terraform/enterprise/api-docs/state-versions) returns a field named `hosted-state-download`, which is a URL of this form:
+`https://archivist.terraform.io/v1/object/`
+
+This is a broadly accepted pattern for secure access. It is important to treat these URLs themselves as secrets. They should not be logged, nor shared with untrusted parties.
+
+## Feature Entitlements
+
+HCP Terraform is available at multiple pricing tiers (including free), which offer different feature sets.
+
+Each organization has a set of _entitlements_ that corresponds to its pricing tier. These entitlements determine which HCP Terraform features the organization can use.
+
+If an organization doesn't have the necessary entitlement to use a given feature, HCP Terraform returns a 404 error for API requests to any endpoints devoted to that feature.
+
+The [show entitlement set](/terraform/enterprise/api-docs/organizations#show-the-entitlement-set) endpoint can return information about an organization's current entitlements, which is useful if your client needs to change its interface when a given feature isn't available.
+
+The following entitlements are available:
+
+- `agents` — Allows isolated, private or on-premises infrastructure to communicate with an organization in HCP Terraform. Affects the [agent pools][], [agents][], and [agent tokens][] endpoints.
+
+- `audit-logging` — Allows an organization to access [audit trails][].
+
+- `configuration-designer` — Allows an organization to use the [Configuration Designer][].
+- `cost-estimation` — Allows an organization to access [cost estimation][].
+- `global-run-tasks` — Allows an organization to apply [run tasks](/terraform/enterprise/workspaces/settings/run-tasks) to every workspace. Affects the [run tasks][] endpoints. This feature is currently in beta.
+- `module-tests-generation` - Allows an organization to generate tests for private registry modules. This feature is currently in beta.
+- `operations` — Allows an organization to perform runs within HCP Terraform. Affects the [runs][], [plans][], and [applies][] endpoints.
+- `policy-enforcement` — Allows an organization to use [Sentinel][]. Affects the [policies][], [policy sets][], and [policy checks][] endpoints.
+- `private-module-registry` — Allows an organization to publish and use modules with the [private module registry][]. Affects the [registry modules][] endpoints.
+- `private-policy-agents` - Allows an organization to ensure that HTTP enabled [Sentinel][] and OPA [policies][] can communicate with isolated, private, or on-premises infrastructure.
+- `run-tasks` — Allows an organization to use [run tasks](/terraform/enterprise/workspaces/settings/run-tasks). Affects the [run tasks][] endpoints.
+- `self-serve-billing` — Allows an organization to pay via credit card using the in-app billing UI.
+- `sentinel` - **DEPRECATED** Use `policy-enforcement` instead.
+- `state-storage` — Allows an organization to store state versions in its workspaces, which enables local Terraform runs with HCP Terraform. Affects the [state versions][] endpoints.
+- `sso` — Allows an organization to manage and authenticate users with single sign on.
+- `teams` — Allows an organization to manage access to its workspaces with [teams](/terraform/enterprise/users-teams-organizations/teams). Without this entitlement, an organization only has an owners team. Affects the [teams][], [team members][], [team access][], and [team tokens][] endpoints.
+- `user-limit` — An integer value representing the maximum number of users allowed for the organization. If blank, there is no limit.
+- `vcs-integrations` — Allows an organization to [connect with a VCS provider][vcs integrations] and link VCS repositories to workspaces. Affects the [OAuth Clients][o-clients], and [OAuth Tokens][o-tokens] endpoints, and determines whether the `data.attributes.vcs-repo` property can be set for [workspaces][].
+
+[agents]: /terraform/enterprise/api-docs/agents
+
+[agent pools]: /terraform/enterprise/api-docs/agents
+
+[agent tokens]: /terraform/enterprise/api-docs/agent-tokens
+
+[applies]: /terraform/enterprise/api-docs/applies
+
+
+
+[audit trails]: /terraform/enterprise/api-docs/audit-trails
+
+
+
+[Configuration Designer]: /terraform/enterprise/registry/design
+
+[cost estimation]: /terraform/enterprise/cost-estimation
+
+[o-clients]: /terraform/enterprise/api-docs/oauth-clients
+
+[o-tokens]: /terraform/enterprise/api-docs/oauth-tokens
+
+[plans]: /terraform/enterprise/api-docs/plans
+
+[policies]: /terraform/enterprise/api-docs/policies
+
+[policy checks]: /terraform/enterprise/api-docs/policy-checks
+
+[policy sets]: /terraform/enterprise/api-docs/policy-sets
+
+[private module registry]: /terraform/enterprise/registry
+
+[registry modules]: /terraform/enterprise/api-docs/private-registry/modules
+
+[registry providers]: /terraform/enterprise/api-docs/private-registry/providers
+
+[runs]: /terraform/enterprise/api-docs/run
+
+[run tasks]: /terraform/enterprise/api-docs/run-tasks/run-tasks
+
+[Sentinel]: /terraform/enterprise/policy-enforcement/sentinel
+
+[single sign on]: /terraform/enterprise/users-teams-organizations/single-sign-on
+
+[state versions]: /terraform/enterprise/api-docs/state-versions
+
+[teams]: /terraform/enterprise/api-docs/teams
+
+[team access]: /terraform/enterprise/api-docs/team-access
+
+[team members]: /terraform/enterprise/api-docs/team-members
+
+[team tokens]: /terraform/enterprise/api-docs/team-tokens
+
+[vcs integrations]: /terraform/enterprise/vcs
+
+[workspaces]: /terraform/enterprise/api-docs/workspaces
+
+## Response Codes
+
+This API returns standard HTTP response codes.
+
+We return 404 Not Found codes for resources that a user doesn't have access to, as well as for resources that don't exist. This is to avoid telling a potential attacker that a given resource exists.
+
+## Versioning
+
+The API documented in these pages is the second version of HCP Terraform's API, and resides under the `/v2` prefix.
+
+Future APIs will increment this version, leaving the `/v1` API intact, though in the future we might deprecate certain features. In that case, we'll provide ample notice to migrate to the new API.
+
+## Paths
+
+All V2 API endpoints use `/api/v2` as a prefix unless otherwise specified.
+
+For example, if the API endpoint documentation defines the path `/runs` then the full path is `/api/v2/runs`.
+
+## JSON API Formatting
+
+The HCP Terraform endpoints use the [JSON API specification](https://jsonapi.org/), which specifies key aspects of the API. Most notably:
+
+- [HTTP error codes](https://jsonapi.org/examples/#error-objects-error-codes)
+- [Error objects](https://jsonapi.org/examples/#error-objects-basics)
+- [Document structure][document]
+- [HTTP request/response headers](https://jsonapi.org/format/#content-negotiation)
+
+[document]: https://jsonapi.org/format/#document-structure
+
+### JSON API Documents
+
+Since our API endpoints use the JSON API spec, most of them return [JSON API documents][document].
+
+Endpoints that use the POST method also require a JSON API document as the request payload. A request object usually looks something like this:
+
+```json
+{
+ "data": {
+ "type":"vars",
+ "attributes": {
+ "key":"some_key",
+ "value":"some_value",
+ "category":"terraform",
+ "hcl":false,
+ "sensitive":false
+ },
+ "relationships": {
+ "workspace": {
+ "data": {
+ "id":"ws-4j8p6jX1w33MiDC7",
+ "type":"workspaces"
+ }
+ }
+ }
+ }
+}
+```
+
+These objects always include a top-level `data` property, which:
+
+- Must have a `type` property to indicate what type of API object you're interacting with.
+- Often has an `attributes` property to specify attributes of the object you're creating or modifying.
+- Sometimes has a `relationships` property to specify other objects that are linked to what you're working with.
+
+In the documentation for each API method, we use dot notation to explain the structure of nested objects in the request. For example, the properties of the request object above are listed as follows:
+
+| Key path | Type | Default | Description |
+| ---------------------------------------- | ------ | ------- | --------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"vars"`. |
+| `data.attributes.key` | string | | The name of the variable. |
+| `data.attributes.value` | string | | The value of the variable. |
+| `data.attributes.category` | string | | Whether this is a Terraform or environment variable. Valid values are `"terraform"` or `"env"`. |
+| `data.attributes.hcl` | bool | `false` | Whether to evaluate the value of the variable as a string of HCL code. Has no effect for environment variables. |
+| `data.attributes.sensitive` | bool | `false` | Whether the value is sensitive. If true then the variable is written once and not visible thereafter. |
+| `data.relationships.workspace.data.type` | string | | Must be `"workspaces"`. |
+| `data.relationships.workspace.data.id` | string | | The ID of the workspace that owns the variable. |
+
+We also always include a sample payload object, to show the document structure more visually.
+
+### Query Parameters
+
+Although most of our API endpoints use the POST method and receive their parameters as a JSON object in the request payload, some of them use the GET method. These GET endpoints sometimes require URL query parameters, in the standard `...path?key1=value1&key2=value2` format.
+
+Since these parameters were originally designed as part of a JSON object, they sometimes have characters that must be [percent-encoded](https://en.wikipedia.org/wiki/Percent-encoding) in a query parameter. For example, `[` becomes `%5B` and `]` becomes `%5D`.
+
+For more about URI structure and query strings, see [the specification (RFC 3986)](https://tools.ietf.org/html/rfc3986) or [the Wikipedia page on URIs](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier).
+
+### Pagination
+
+Most of the endpoints that return lists of objects support pagination. A client may pass the following query parameters to control pagination on supported endpoints:
+
+| Parameter | Description |
+| -------------- | --------------------------------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 items per page. The maximum page size is 100. |
+
+Additional data is returned in the `links` and `meta` top level attributes of the response.
+
+```json
+{
+ "data": [...],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/organizations/hashicorp/workspaces?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/organizations/hashicorp/workspaces?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": "https://app.terraform.io/api/v2/organizations/hashicorp/workspaces?page%5Bnumber%5D=2&page%5Bsize%5D=20",
+ "last": "https://app.terraform.io/api/v2/organizations/hashicorp/workspaces?page%5Bnumber%5D=2&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": 2,
+ "total-pages": 2,
+ "total-count": 21
+ }
+ }
+}
+```
+
+### Inclusion of Related Resources
+
+Some of the API's GET endpoints can return additional information about nested resources by adding an `include` query parameter, whose value is a comma-separated list of resource types.
+
+The related resource options are listed in each endpoint's documentation where available.
+
+The related resources will appear in an `included` section of the response.
+
+Example:
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/teams/team-n8UQ6wfhyym25sMe?include=users
+```
+
+```json
+{
+ "data": {
+ "id": "team-n8UQ6wfhyym25sMe",
+ "type": "teams",
+ "attributes": {
+ "name": "owners",
+ "users-count": 1
+ ...
+ },
+ "relationships": {
+ "users": {
+ "data": [
+ {
+ "id": "user-62goNpx1ThQf689e",
+ "type": "users"
+ }
+ ]
+ } ...
+ }
+ ...
+ },
+ "included": [
+ {
+ "id": "user-62goNpx1ThQf689e",
+ "type": "users",
+ "attributes": {
+ "username": "hashibot"
+ ...
+ } ...
+ }
+ ]
+}
+```
+
+## Rate Limiting
+
+You can make up to 30 requests per second to the API as an authenticated or unauthenticated request. If you reach the rate limit then your access will be throttled and an error response will be returned. Some endpoints have lower rate limits to prevent abuse, including endpoints that poll Terraform for a list of runs and endpoints related to user authentication. The adjusted limits are unnoticeable under normal use. If you receive a rate-limited response, the limit is reflected in the `x-ratelimit-limit` header once triggered.
+
+Authenticated requests are allocated to the user associated with the authentication token. This means that a user with multiple tokens will still be limited to 30 requests per second, additional tokens will not allow you to increase the requests per second permitted.
+
+Unauthenticated requests are associated with the requesting IP address.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ---------------------------- |
+| [429][] | [JSON API error object][] | Rate limit has been reached. |
+
+```json
+{
+ "errors": [
+ {
+ "detail": "You have exceeded the API's rate limit.",
+ "status": 429,
+ "title": "Too many requests"
+ }
+ ]
+}
+```
+
+## Client libraries and tools
+
+HashiCorp maintains [go-tfe](https://github.com/hashicorp/go-tfe), a Go client for HCP Terraform's API.
+
+Additionally, the community of HCP Terraform users and vendors have built client libraries in other languages. These client libraries and tools are not tested nor officially maintained by HashiCorp, but are listed below in order to help users find them easily.
+
+If you have built a client library and would like to add it to this community list, please [contribute](https://github.com/hashicorp/terraform-website#contributions-welcome) to [this page](https://github.com/hashicorp/terraform-docs-common/blob/main/website/docs/cloud-docs/api-docs/index.mdx#client-libraries-and-tools).
+
+- [tfh](https://github.com/hashicorp-community/tf-helper): UNIX shell console app
+- [tf_api_gateway](https://github.com/PlethoraOfHate/tf_api_gateway): Python API library and console app
+- [terrasnek](https://github.com/dahlke/terrasnek): Python API library
+- [terraform-enterprise-client](https://github.com/skierkowski/terraform-enterprise-client): Ruby API library and console app
+- [pyterprise](https://github.com/JFryy/terraform-enterprise-api-python-client): A simple Python API client library.
+- [Tfe.NetClient](https://github.com/everis-technology/Tfe.NetClient): .NET Client Library
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/no-code-provisioning.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/no-code-provisioning.mdx
new file mode 100644
index 0000000000..c8c0bfd9f9
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/no-code-provisioning.mdx
@@ -0,0 +1,924 @@
+---
+page_title: /no-code-modules API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/no-code-modules` endpoint to designate
+ and configure no-code modules. You can also use this endpoint to deploy and
+ upgrade no-code workspaces.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: http://jsonapi.org/format/#error-objects
+
+# No-code provisioning API reference
+
+The no-code provisioning API allows you to create, configure, and deploy Terraform modules in the no-code provisioning workflows within HCP Terraform. For more information on no-code modules, refer to [Designing No-Code Ready Modules](/terraform/enterprise/no-code-provisioning/module-design).
+
+## Enable no-code provisioning for a module
+
+`POST /organizations/:organization_name/no-code-modules`
+
+| Parameter | Description |
+| -------------------- | --------------------------------------------------- |
+| `:organization_name` | The name of the organization the module belongs to. |
+
+To deploy a module using the no-code provisioning workflow, the module must meet the following requirement:
+
+1. The module must exist in your organization's private registry.
+2. The module must meet the [design requirements](/terraform/enterprise/no-code-provisioning/module-design#requirements) for a no-code module.
+3. You must enable no-code provisioning for the module.
+
+You can send a `POST` request to the `/no-code-modules` endpoint to enable no-code provisioning for a specific module. You can also call this endpoint to set options for the allowed values of a variable for a no-code module in your organization.
+
+-> **Note**: This endpoint can not be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------- | --------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "no-code-modules"`) | Successfully enabled a module for no-code provisioning. |
+| [404][] | [JSON API error object][] | Not found, or the user is unauthorized to perform this action. |
+| [422][] | [JSON API error object][] | Malformed request body (e.g., missing attributes, wrong types, etc.). |
+| [500][] | [JSON API error object][] | Internal system failure. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| --------------------------------------------------------------------- | ------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"no-code-modules"`. |
+| `data.attributes.version-pin` | string | Latest version of the module | The module version to use in no-code provisioning workflows. |
+| `data.attributes.enabled` | boolean | `false` | Set to `true` to enable no-code provisioning workflows. |
+| `data.relationships.registry-module.data.id` | string | | The ID of a module in the organization's private registry. |
+| `data.relationships.registry-module.data.type` | string | | Must be `"registry-module"`. |
+| `data.relationships.variable-options.data[].type` | string | | Must be `"variable-options"`. |
+| `data.relationships.variable-options.data[].attributes.variable-name` | string | | The name of a variable within the module. |
+| `data.relationships.variable-options.data[].attributes.variable-type` | string | | The data type for the variable. Can be [any type supported by Terraform](/terraform/language/expressions/types#types). |
+| `data.relationships.variable-options.data[].attributes.options` | Any\[] | | A list of allowed values for the variable. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "no-code-modules",
+ "attributes": {
+ "version-pin": "1.0.1",
+ "enabled": true
+ },
+ "relationships": {
+ "registry-module": {
+ "data": {
+ "id": "mod-2aaFrmRPZs2N9epr",
+ "type": "registry-module"
+ }
+ },
+ "variable-options": {
+ "data": [
+ {
+ "type": "variable-options",
+ "attributes": {
+ "variable-name": "amis",
+ "variable-type": "string",
+ "options": [
+ "ami-1",
+ "ami-2",
+ "ami-3"
+ ]
+ }
+ },
+ {
+ "type": "variable-options",
+ "attributes": {
+ "variable-name": "region",
+ "variable-type": "string",
+ "options": [
+ "eu-north-1",
+ "us-east-2",
+ "us-west-1"
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+}
+
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/no-code-modules
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "nocode-9HE91XDNY3faePn2",
+ "type": "no-code-modules",
+ "attributes": {
+ "enabled": true,
+ "version-pin": "1.0.1"
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization"
+ }
+ },
+ "registry-module": {
+ "data": {
+ "id": "mod-2aaFrmRPZs2N9epr",
+ "type": "registry-modules"
+ },
+ "links": {
+ "related": "/api/v2/registry-modules/mod-2aaFrmRPZs2N9epr"
+ }
+ },
+ "variable-options": {
+ "data": [
+ {
+ "id": "ncvaropt-fcHDfnZ1EGdRzFNC",
+ "type": "variable-options"
+ },
+ {
+ "id": "ncvaropt-dZMfdh9KBcwFjyv2",
+ "type": "variable-options"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/no-code-modules/nocode-9HE91XDNY3faePn2"
+ }
+ }
+}
+```
+
+## Update no-code provisioning settings
+
+`PATCH /no-code-modules/:id`
+
+| Parameter | Description |
+| --------- | -------------------------------------------- |
+| `:id` | The unique identifier of the no-code module. |
+
+Send a `PATCH` request to the `/no-code-modules/:id` endpoint to update the settings for the no-code provisioning of a module. You can update the following settings:
+
+- Enable or disable no-code provisioning.
+- Adjust the set of options for allowed variable values.
+- Change the module version being provisioned.
+- Change the module being provisioned.
+
+The [API call that enables no-code provisioning for a module](#allow-no-code-provisioning-of-a-module-within-an-organization) returns that module's unique identifier.
+
+-> **Note:** This endpoint cannot be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------- | --------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "no-code-modules"`) | Successfully updated a no-code module. |
+| [404][] | [JSON API error object][] | Not found, or the user is unauthorized to perform this action. |
+| [422][] | [JSON API error object][] | Malformed request body (e.g., missing attributes, wrong types, etc.). |
+| [500][] | [JSON API error object][] | Internal system failure. |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| --------------------------------------------------------------------- | ------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"no-code-modules"`. |
+| `data.attributes.version-pin` | string | Existing value | The module version to use in no-code provisioning workflows. |
+| `data.attributes.enabled` | boolean | Existing value | Set to `true` to enable no-code provisioning workflows, or `false` to disable them. |
+| `data.relationships.registry-module.data.id` | string | Existing value | The ID of a module in the organization's Private Registry. |
+| `data.relationships.registry-module.data.type` | string | Existing value | Must be `"registry-module"`. |
+| `data.relationships.variable-options.data[].id` | string | | The ID of an existing variable-options set. If provided, a new variable-options set replaces the set with this ID. If not provided, this creates a new variable-option set. |
+| `data.relationships.variable-options.data[].type` | string | | Must be `"variable-options"`. |
+| `data.relationships.variable-options.data[].attributes.variable-name` | string | | The name of a variable within the module. |
+| `data.relationships.variable-options.data[].attributes.variable-type` | string | | The data type for the variable. Can be [any type supported by Terraform](/terraform/language/expressions/types#types). |
+| `data.relationships.variable-options.data[].attributes.options` | Any\[] | | A list of allowed values for the variable. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "no-code-modules",
+ "attributes": {
+ "enabled": false
+ },
+ "relationships": {
+ "registry-module": {
+ "data": {
+ "id": "mod-zyai9dwH4VPPaVuC",
+ "type": "registry-module"
+ }
+ },
+ "variable-options": {
+ "data": [
+ {
+ "id": "ncvaropt-fcHDfnZ1EGdRzFNC",
+ "type": "variable-options",
+ "attributes": {
+ "variable-name": "Linux AMIs",
+ "variable-type": "array",
+ "options": [
+ "Xenial Xerus",
+ "Trusty Tahr"
+ ]
+ }
+ },
+ {
+ "id": "ncvaropt-dZMfdh9KBcwFjyv2",
+ "type": "variable-options",
+ "attributes": {
+ "variable-name": "region",
+ "variable-type": "array",
+ "options": [
+ "eu-north-1",
+ "us-east-2",
+ "us-west-1"
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/no-code-modules/nocode-9HE91XDNY3faePn2
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "nocode-9HE91XDNY3faePn2",
+ "type": "no-code-modules",
+ "attributes": {
+ "enabled": true,
+ "version-pin": "1.0.1"
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization"
+ }
+ },
+ "registry-module": {
+ "data": {
+ "id": "mod-2aaFrmRPZs2N9epr",
+ "type": "registry-modules"
+ },
+ "links": {
+ "related": "/api/v2/registry-modules/mod-2aaFrmRPZs2N9epr"
+ }
+ },
+ "variable-options": {
+ "data": [
+ {
+ "id": "ncvaropt-fcHDfnZ1EGdRzFNC",
+ "type": "variable-options"
+ },
+ {
+ "id": "ncvaropt-dZMfdh9KBcwFjyv2",
+ "type": "variable-options"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/no-code-modules/nocode-9HE91XDNY3faePn2"
+ }
+ }
+}
+```
+
+## Read a no-code module's properties
+
+`GET /no-code-modules/:id`
+
+| Parameter | Description |
+| --------- | -------------------------------------------- |
+| `:id` | The unique identifier of the no-code module. |
+
+Use this API to read the details of an existing no-code module.
+
+The [API call that enables no-code provisioning for a module](#allow-no-code-provisioning-of-a-module-within-an-organization) returns that module's unique identifier.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------- | --------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "no-code-modules"`) | Successfully read the no-code module. |
+| [400][] | [JSON API error object][] | Invalid `include` parameter. |
+| [404][] | [JSON API error object][] | Not found, or the user is unauthorized to perform this action. |
+| [422][] | [JSON API error object][] | Malformed request body (e.g., missing attributes, wrong types, etc.). |
+| [500][] | [JSON API error object][] | Internal system failure. |
+
+### Query Parameters
+
+This endpoint uses our [standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Use HTML URL encoding syntax, such as `%5B` to represent `[` and `%5D` to represent `]`, if your tooling does not automatically encode URLs.
+
+Terraform returns related resources when you add the [`include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources) to the request.
+
+| Parameter | Description |
+| --------- | ------------------------------------------------- |
+| `include` | List related resource to include in the response. |
+
+The following resource types are available:
+
+| Resource Name | Description |
+| ------------------ | --------------------------------------------------------- |
+| `variable_options` | Module variables with a configured set of allowed values. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/no-code-modules/nocode-9HE91XDNY3faePn2?include=variable_options
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "nocode-9HE91XDNY3faePn2",
+ "type": "no-code-modules",
+ "attributes": {
+ "enabled": true,
+ "version-pin": "1.0.1"
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization"
+ }
+ },
+ "registry-module": {
+ "data": {
+ "id": "mod-2aaFrmRPZs2N9epr",
+ "type": "registry-modules"
+ },
+ "links": {
+ "related": "/api/v2/registry-modules/mod-2aaFrmRPZs2N9epr"
+ }
+ },
+ "variable-options": {
+ "data": [
+ {
+ "id": "ncvaropt-fcHDfnZ1EGdRzFNC",
+ "type": "variable-options"
+ },
+ {
+ "id": "ncvaropt-dZMfdh9KBcwFjyv2",
+ "type": "variable-options"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/no-code-modules/nocode-9HE91XDNY3faePn2"
+ }
+ },
+ "included": [
+ {
+ "id": "ncvaropt-fcHDfnZ1EGdRzFNC",
+ "type": "variable-options",
+ "attributes": {
+ "variable-name": "Linux AMIs",
+ "variable-type": "array",
+ "options": [
+ "Xenial Xerus",
+ "Trusty Tahr"
+ ]
+ },
+ "relationships": {
+ "no-code-allowed-module": {
+ "data": {
+ "id": "nocode-9HE91XDNY3faePn2",
+ "type": "no-code-allowed-modules"
+ }
+ }
+ }
+ },
+ {
+ "id": "ncvaropt-dZMfdh9KBcwFjyv2",
+ "type": "variable-options",
+ "attributes": {
+ "variable-name": "region",
+ "variable-type": "array",
+ "options": [
+ "eu-north-1",
+ "us-east-2",
+ "us-west-1"
+ ]
+ },
+ "relationships": {
+ "no-code-allowed-module": {
+ "data": {
+ "id": "nocode-9HE91XDNY3faePn2",
+ "type": "no-code-allowed-modules"
+ }
+ }
+ }
+ }
+ ]
+}
+```
+
+## Create a no-code module workspace
+
+This endpoint creates a workspace from a no-code module.
+
+`POST /no-code-modules/:id/workspaces`
+
+| Parameter | Description |
+| --------- | ------------------------------------------ |
+| `:id` | The ID of the no-code module to provision. |
+
+Each HCP Terraform organization has a list of which modules you can use to create workspaces using no-code provisioning. You can use this API to create a workspace by selecting a no-code module to enable a no-code provisioning workflow.
+
+-> **Note**: This endpoint can not be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+| Status | Response | Reason |
+| ------- | -------------------------------------------- | -------------------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "workspaces"`) | Successfully created a workspace from a no-code module for no-code provisioning. |
+| [404][] | [JSON API error object][] | Not found, or the user is unauthorized to perform this action. |
+| [422][] | [JSON API error object][] | Malformed request body (e.g., missing attributes, wrong types, etc.). |
+| [500][] | [JSON API error object][] | Internal system failure. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description | |
+| ------------------------------------------------------- | ------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - |
+| `data.type` | string | none | Must be `"workspaces"`. | |
+| `data.attributes.agent-pool-id` | string | none | Required when `execution-mode` is set to `agent`. The ID of the agent pool belonging to the workspace's organization. This value must not be specified if `execution-mode` is set to `remote`. | |
+| `data.attributes.auto_apply` | boolean | `false` | If `true`, Terraform automatically applies changes when a Terraform `plan` is successful. | |
+| `data.attributes.description` | string | `""` | A description for the workspace. | |
+| `data.attributes.execution-mode` | string | none | Which [execution mode](/terraform/enterprise/workspaces/settings#execution-mode) to use. Valid values are `remote`, and `agent`. When not provided, defaults to `remote`. | |
+| `data.attributes.name` | string | none | The name of the workspace. You can only include letters, numbers, `-`, and `_`. Terraform uses this value to identify the workspace and must be unique in the organization. | |
+| `data.attributes.source-name` | string | none | A friendly name for the application or client creating this workspace. If set, this will be displayed on the workspace as "Created via ``". | |
+| `data.attributes.source-url` | string | (nothing) | A URL for the application or client creating this workspace. This can be the URL of a related resource in another app, or a link to documentation or other info about the client. | |
+| `data.attributes.terraform-version` | string | latest release | Specifies the version of Terraform to use for this workspace. You can specify an exact version or a [version constraint](/terraform/language/expressions/version-constraints) such as `~> 1.0.0`. If you specify a constraint, the workspace always uses the newest release that meets that constraint. If omitted when creating a workspace, this defaults to the latest released version. | |
+| `data.relationships.project.data.id` | string | | The ID of the project to create the workspace in. You must have permission to create workspaces in the project, either by organization-level permissions or team admin access to a specific project. | |
+| `data.relationships.project.data.type` | string | | Must be `"project"`. | |
+| `data.relationships.vars.data[].type` | string | | Must be `"vars"`. | |
+| `data.relationships.vars.data[].attributes.key` | string | | The name of the variable. | |
+| `data.relationships.vars.data[].attributes.value` | string | `""` | The value of the variable. | |
+| `data.relationships.vars.data[].attributes.description` | string | | The description of the variable. | |
+| `data.relationships.vars.data[].attributes.category` | string | | Whether this is a Terraform or environment variable. Valid values are `"terraform"` or `"env"`. | |
+| `data.relationships.vars.data[].attributes.hcl` | boolean | `false` | Whether to evaluate the value of the variable as a string of HCL code. Has no effect for environment variables. | |
+| `data.relationships.vars.data[].attributes.sensitive` | boolean | `false` | Whether the value is sensitive. If `true` then the variable is written once and not visible thereafter. | |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "workspaces",
+ "attributes": {
+ "name": "no-code-workspace",
+ "description": "A workspace to enable the no-code provisioning workflow."
+ },
+ "relationships": {
+ "project": {
+ "data": {
+ "id": "prj-yuEN6sJVra5t6XVy",
+ "type": "project"
+ }
+ },
+ "vars": {
+ "data": [
+ {
+ "type": "vars",
+ "attributes": {
+ "key": "region",
+ "value": "eu-central-1",
+ "category": "terraform",
+ "hcl": true,
+ "sensitive": false,
+ }
+ },
+ {
+ "type": "vars",
+ "attributes": {
+ "key": "ami",
+ "value": "ami‑077062",
+ "category": "terraform",
+ "hcl": true,
+ "sensitive": false,
+ }
+ }
+ ]
+ }
+ }
+ }
+}
+
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/no-code-modules/nocode-WGckovT2RQxupyt1/workspaces
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "ws-qACTToFUM5BvDKhC",
+ "type": "workspaces",
+ "attributes": {
+ "allow-destroy-plan": true,
+ "auto-apply": false,
+ "auto-destroy-at": null,
+ "auto-destroy-status": null,
+ "created-at": "2023-09-08T10:36:04.391Z",
+ "environment": "default",
+ "locked": false,
+ "name": "no-code-workspace",
+ "queue-all-runs": false,
+ "speculative-enabled": true,
+ "structured-run-output-enabled": true,
+ "terraform-version": "1.5.6",
+ "working-directory": null,
+ "global-remote-state": true,
+ "updated-at": "2023-09-08T10:36:04.427Z",
+ "resource-count": 0,
+ "apply-duration-average": null,
+ "plan-duration-average": null,
+ "policy-check-failures": null,
+ "run-failures": null,
+ "workspace-kpis-runs-count": null,
+ "latest-change-at": "2023-09-08T10:36:04.391Z",
+ "operations": true,
+ "execution-mode": "remote",
+ "vcs-repo": null,
+ "vcs-repo-identifier": null,
+ "permissions": {
+ "can-update": true,
+ "can-destroy": true,
+ "can-queue-run": true,
+ "can-read-variable": true,
+ "can-update-variable": true,
+ "can-read-state-versions": true,
+ "can-read-state-outputs": true,
+ "can-create-state-versions": true,
+ "can-queue-apply": true,
+ "can-lock": true,
+ "can-unlock": true,
+ "can-force-unlock": true,
+ "can-read-settings": true,
+ "can-manage-tags": true,
+ "can-manage-run-tasks": true,
+ "can-force-delete": true,
+ "can-manage-assessments": true,
+ "can-manage-ephemeral-workspaces": true,
+ "can-read-assessment-results": true,
+ "can-queue-destroy": true
+ },
+ "actions": {
+ "is-destroyable": true
+ },
+ "description": null,
+ "file-triggers-enabled": true,
+ "trigger-prefixes": [],
+ "trigger-patterns": [],
+ "assessments-enabled": false,
+ "last-assessment-result-at": null,
+ "source": "tfe-module",
+ "source-name": null,
+ "source-url": null,
+ "source-module-id": "private/my-organization/lambda/aws/1.0.9",
+ "no-code-upgrade-available": false,
+ "tag-names": [],
+ "setting-overwrites": {
+ "execution-mode": false,
+ "agent-pool": false
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ },
+ "current-run": {
+ "data": null
+ },
+ "latest-run": {
+ "data": null
+ },
+ "outputs": {
+ "data": []
+ },
+ "remote-state-consumers": {
+ "links": {
+ "related": "/api/v2/workspaces/ws-qACTToFUM5BvDKhC/relationships/remote-state-consumers"
+ }
+ },
+ "current-state-version": {
+ "data": null
+ },
+ "current-configuration-version": {
+ "data": {
+ "id": "cv-vizi2p3mnrt3utgA",
+ "type": "configuration-versions"
+ },
+ "links": {
+ "related": "/api/v2/configuration-versions/cv-vizi2p3mnrt3utgA"
+ }
+ },
+ "agent-pool": {
+ "data": null
+ },
+ "readme": {
+ "data": null
+ },
+ "project": {
+ "data": {
+ "id": "prj-yuEN6sJVra5t6XVy",
+ "type": "projects"
+ }
+ },
+ "current-assessment-result": {
+ "data": null
+ },
+ "no-code-module-version": {
+ "data": {
+ "id": "nocodever-vFcQjZLs3ZHTe4TU",
+ "type": "no-code-module-versions"
+ }
+ },
+ "vars": {
+ "data": []
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/workspaces/no-code-workspace",
+ "self-html": "/app/my-organization/workspaces/no-code-workspace"
+ }
+ }
+}
+```
+
+## Initiate a no-code workspace update
+
+Upgrading a workspace's no-code provisioning settings is a multi-step process.
+
+1. Use this API to initiate the update. HCP Terraform starts a new plan, which describes the resources to add, update, or remove from the workspace.
+2. Poll the [read workspace upgrade plan status API](#read-workspace-upgrade-plan-status) to wait for HCP Terraform to complete the plan.
+3. Use the [confirm and apply a workspace upgrade plan API](#confirm-and-apply-a-workspace-upgrade-plan) to complete the workspace upgrade.
+
+`POST /no-code-modules/:no_code_module_id/workspaces/:id/upgrade`
+
+| Parameter | Description |
+| -------------------- | ----------------------------- |
+| `:no_code_module_id` | The ID of the no-code module. |
+| `:id` | The ID of the workspace. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------------------------------- | ------- | ------- | --------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"workspaces"`. |
+| `data.relationships.vars.data[].type` | string | | Must be `"vars"`. |
+| `data.relationships.vars.data[].attributes.key` | string | | The name of the variable. |
+| `data.relationships.vars.data[].attributes.value` | string | `""` | The value of the variable. |
+| `data.relationships.vars.data[].attributes.description` | string | | The description of the variable. |
+| `data.relationships.vars.data[].attributes.category` | string | | Whether this is a Terraform or environment variable. Valid values are `"terraform"` or `"env"`. |
+| `data.relationships.vars.data[].attributes.hcl` | boolean | `false` | Whether to evaluate the value of the variable as a string of HCL code. Has no effect for environment variables. |
+| `data.relationships.vars.data[].attributes.sensitive` | boolean | `false` | Whether the value is sensitive. If `true` then the variable is written once and not visible thereafter. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "workspaces",
+ "relationships": {
+ "vars": {
+ "data": [
+ {
+ "type": "vars",
+ "attributes": {
+ "key": "region",
+ "value": "eu-central-1",
+ "category": "terraform",
+ "hcl": true,
+ "sensitive": false,
+ }
+ },
+ {
+ "type": "vars",
+ "attributes": {
+ "key": "ami",
+ "value": "ami‑077062",
+ "category": "terraform",
+ "hcl": true,
+ "sensitive": false,
+ }
+ }
+ ]
+ }
+ }
+ }
+}
+
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/no-code-modules/nocode-WGckovT2RQxupyt1/workspaces/ws-qACTToFUM5BvDKhC/upgrade
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "run-Cyij8ctBHM1g5xdX",
+ "type": "workspace-upgrade",
+ "attributes": {
+ "status": "planned",
+ "plan-url": "https://app.terraform.io/app/my-organization/no-code-workspace/runs/run-Cyij8ctBHM1g5xdX"
+ },
+ "relationships": {
+ "workspace": {
+ "data": {
+ "id": "ws-VvKtcfueHNkR6GqP",
+ "type": "workspaces"
+ }
+ }
+ }
+ }
+}
+```
+
+## Read workspace upgrade plan status
+
+This endpoint returns the plan details and status for updating a workspace to new no-code provisioning settings.
+
+`GET /no-code-modules/:no_code_module_id/workspaces/:workspace_id/upgrade/:id`
+
+| Parameter | Description |
+| -------------------- | ----------------------------- |
+| `:no_code_module_id` | The ID of the no-code module. |
+| `:workspace_id` | The ID of workspace. |
+| `:id` | The ID of update. |
+
+Returns the details of a no-code workspace update run, including the run's current state, such as `pending`, `fetching`, `planning`, `planned`, or `cost_estimated`. Refer to [Run States and Stages](/terraform/enterprise/run/states) for more information on the states a run can return.
+
+| Status | Response | Reason |
+| ------- | --------------------------------------------------- | ------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "workspace-upgrade"`) | Success |
+| [404][] | [JSON API error object][] | Workspace upgrade not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/no-code-modules/nocode-WGckovT2RQxupyt1/workspaces/ws-qACTToFUM5BvDKhC/upgrade/run-Cyij8ctBHM1g5xdX
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "run-Cyij8ctBHM1g5xdX",
+ "type": "workspace-upgrade",
+ "attributes": {
+ "status": "planned_and_finished",
+ "plan-url": "https://app.terraform.io/app/my-organization/no-code-workspace/runs/run-Cyij8ctBHM1g5xdX"
+ },
+ "relationships": {
+ "workspace": {
+ "data": {
+ "id": "ws-VvKtcfueHNkR6GqP",
+ "type": "workspaces"
+ }
+ }
+ }
+ }
+}
+```
+
+## Confirm and apply a workspace upgrade plan
+
+Use this endpoint to confirm an update and finalize the update for a workspace to use new no-code provisioning settings.
+
+`POST /no-code-modules/:no_code_module_id/workspaces/:workspace_id/upgrade/:id`
+
+| Parameter | Description |
+| -------------------- | ----------------------------- |
+| `:no_code_module_id` | The ID of the no-code module. |
+| `:workspace_id` | The ID of workspace. |
+| `:id` | The ID of update. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/no-code-modules/nocode-WGckovT2RQxupyt1/workspaces/ws-qACTToFUM5BvDKhC/upgrade/run-Cyij8ctBHM1g5xdX
+```
+
+### Sample Response
+
+```json
+{ "Workspace update completed" }
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/notification-configurations.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/notification-configurations.mdx
new file mode 100644
index 0000000000..2fa78f811f
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/notification-configurations.mdx
@@ -0,0 +1,1437 @@
+---
+page_title: /notification-configurations API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/notification-configurations` endpoint to
+ read, create, update, verify, and delete workspace configurations and create
+ team configurations.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Notification configurations API reference
+
+HCP Terraform can send notifications for run state transitions and workspace events. You can specify a destination URL, request type, and what events will trigger the notification. Each workspace can have up to 20 notification configurations, and they apply to all runs for that workspace.
+
+Interacting with notification configurations requires admin access to the relevant workspace. ([More about permissions](/terraform/enterprise/users-teams-organizations/permissions).)
+
+-> **Note:** [Speculative plans](/terraform/enterprise/run/modes-and-options#plan-only-speculative-plan) and workspaces configured with `Local` [execution mode](/terraform/enterprise/workspaces/settings#execution-mode) do not support notifications.
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+## Notification triggers
+
+Notifications are sent in response to triggers related to workspace events, and can be defined at workspace and team levels. You can specify workspace events in the `triggers` array attribute.
+
+### Workspace notification triggers
+
+The following triggers are available for workspace notifications.
+
+| Display Name | Value | Description |
+| ------------------------ | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Created | `"run:created"` | A run is created and enters the [Pending stage](/terraform/enterprise/run/states#the-pending-stage) |
+| Planning | `"run:planning"` | A run acquires the lock and starts to execute. |
+| Needs Attention | `"run:needs_attention"` | A plan has changes and Terraform requires user input to continue. This input may include approving the plan or a [policy override](/terraform/enterprise/run/states#the-policy-check-stage). |
+| Applying | `"run:applying"` | A run enters the [Apply stage](/terraform/enterprise/run/states#the-apply-stage), where Terraform makes the infrastructure changes described in the plan. |
+| Completed | `"run:completed"` | A run completes successfully. |
+| Errored | `"run:errored"` | A run terminates early due to error or cancellation. |
+| Drifted | `"assessment:drifted"` | HCP Terraform detected configuration drift. This option is only available if you enabled drift detection for the workspace. |
+| Checks Failed | `"assessment:check_failure"` | One or more continuous validation checks did not pass. This option is only available if you enabled drift detection for the workspace. |
+| Health Assessment Failed | `"assessment:failed"` | A health assessment failed. This option is only available if you enable health assessments for the workspace. |
+| Auto Destroy Reminder | `"workspace:auto_destro_reminder"` | An automated workspace destroy run is imminent. |
+| Auto Destroy Results | `"workspace:auto_destroy_run_results"` | HCP Terraform attempted an automated workspace destroy run. |
+
+### Team notification triggers
+
+The following triggers are available for [team notifications](#team-notification-configuration).
+
+| Display Name | Value | Description |
+| -------------- | ----------------------- | -------------------------------------------------------------------------------------------------- |
+| Change Request | `"team:change_request"` | HCP Terraform sent a change request to a workspace that the specified team has explicit access to. |
+
+## Notification payload
+
+The notification is an HTTP POST request with a detailed payload. The content depends on the type of notification.
+
+For Slack and Microsoft Teams notifications, the payload conforms to the respective webhook API and results in a notification message with informational attachments. Refer to [Slack Notification Payloads](/terraform/enterprise/workspaces/settings/notifications#slack) and [Microsoft Teams Notification Payloads](/terraform/enterprise/workspaces/settings/notifications#microsoft-teams) for examples. For generic notifications, the payload varies based on whether the notification contains information about run events or workspace events.
+
+### Run notification payload
+
+Run events include detailed information about a specific run, including the time it began and the associated workspace and organization. Generic notifications for run events contain the following information:
+
+| Name | Type | Description |
+| -------------------------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `payload_version` | number | Always "1". |
+| `notification_configuration_id` | string | The ID of the configuration associated with this notification. |
+| `run_url` | string | URL used to access the run UI page. |
+| `run_id` | string | ID of the run which triggered this notification. |
+| `run_message` | string | The reason the run was queued. |
+| `run_created_at` | string | Timestamp of the run's creation. |
+| `run_created_by` | string | Username of the user who created the run. |
+| `workspace_id` | string | ID of the run's workspace. |
+| `workspace_name` | string | Human-readable name of the run's workspace. |
+| `organization_name` | string | Human-readable name of the run's organization. |
+| `notifications` | array | List of events which caused this notification to be sent, with each event represented by an object. At present, this is always one event, but in the future HCP Terraform may roll up several notifications for a run into a single request. |
+| `notifications[].message` | string | Human-readable reason for the notification. |
+| `notifications[].trigger` | string | Value of the trigger which caused the notification to be sent. |
+| `notifications[].run_status` | string | Status of the run at the time of notification. |
+| `notifications[].run_updated_at` | string | Timestamp of the run's update. |
+| `notifications[].run_updated_by` | string | Username of the user who caused the run to update. |
+
+#### Sample payload
+
+```json
+{
+ "payload_version": 1,
+ "notification_configuration_id": "nc-AeUQ2zfKZzW9TiGZ",
+ "run_url": "https://app.terraform.io/app/acme-org/my-workspace/runs/run-FwnENkvDnrpyFC7M",
+ "run_id": "run-FwnENkvDnrpyFC7M",
+ "run_message": "Add five new queue workers",
+ "run_created_at": "2019-01-25T18:34:00.000Z",
+ "run_created_by": "sample-user",
+ "workspace_id": "ws-XdeUVMWShTesDMME",
+ "workspace_name": "my-workspace",
+ "organization_name": "acme-org",
+ "notifications": [
+ {
+ "message": "Run Canceled",
+ "trigger": "run:errored",
+ "run_status": "canceled",
+ "run_updated_at": "2019-01-25T18:37:04.000Z",
+ "run_updated_by": "sample-user"
+ }
+ ]
+}
+```
+
+### Change request notification payload
+
+Change request events contain the following fields in their payloads.
+
+| Name | Type | Description |
+| ------------------------------- | ------ | -------------------------------------------------------------- |
+| `payload_version` | number | Always "1". |
+| `notification_configuration_id` | string | The ID of the configuration associated with this notification. |
+| `change_request_url` | string | URL used to access the change request UI page. |
+| `change_request_subject` | string | title of the change request which triggered this notification. |
+| `change_request_message` | string | The contents of the change request. |
+| `change_request_created_at` | string | Timestamp of the change request's creation. |
+| `change_request_created_by` | string | Username of the user who created the change_request. |
+| `workspace_id` | string | ID of the run's workspace. |
+| `workspace_name` | string | Human-readable name of the run's workspace. |
+| `organization_name` | string | Human-readable name of the run's organization. |
+
+##### `Send a test` payload
+
+This is a sample payload you can send to test if notifications are working. The payload does not have a `run` or `workspace` context, resulting in null values.
+
+You can trigger a test notification from the workspace notification settings page. You can read more about verifying a [notification configuration](/terraform/enterprise/workspaces/settings/notifications#enabling-and-verifying-a-configuration).
+
+```json
+{
+ "payload_version": 1,
+ "notification_configuration_id": "nc-jWvVsmp5VxsaCeXm",
+ "run_url": null,
+ "run_id": null,
+ "run_message": null,
+ "run_created_at": null,
+ "run_created_by": null,
+ "workspace_id": null,
+ "workspace_name": null,
+ "organization_name": null,
+ "notifications": [
+ {
+ "message": "Verification of test",
+ "trigger": "verification",
+ "run_status": null,
+ "run_updated_at": null,
+ "run_updated_by": null,
+ }
+ ]
+}
+```
+
+### Workspace notification payload
+
+Workspace events include detailed information about workspace-level validation events like [health assessments](/terraform/enterprise/workspaces/health) if you enable them for the workspace. Much of the information provides details about the associated [assessment result](/terraform/enterprise/api-docs/assessment-results), which HCP Terraform uses to track instances of continuous validation.
+
+HCP Terraform returns different types of attributes returned in the payload details, depending on the type of `trigger_scope`. There are two main values for `trigger_scope`: `assessment` and `workspace`, examples of which you can see below.
+
+#### Health assessments
+
+Health assessment notifications for workspace events contain the following information:
+
+
+
+@include 'tfc-package-callouts/health-assessments.mdx'
+
+
+
+| Name | Type | Description |
+| ------------------------------------------------------ | ------ | ------------------------------------------------------------------------------------------- |
+| `payload_version` | number | Always "2". |
+| `notification_configuration_id` | string | The ID of the configuration associated with this notification. |
+| `notification_configuration_url` | string | URL to get the notification configuration from the HCP Terraform API. |
+| `trigger_scope` | string | Always "assessment" for workspace assessment notifications. |
+| `trigger` | string | Value of the trigger that caused the notification to be sent. |
+| `message` | string | Human-readable reason for the notification. |
+| `details` | object | Object containing details specific to the notification. |
+| `details.new_assessment_result` | object | The most recent assessment result. This result triggered the notification. |
+| `details.new_assessment_result.id` | string | ID of the assessment result. |
+| `details.new_assessment_result.url` | string | URL to get the assessment result from the HCP Terraform API. |
+| `details.new_assessment_result.succeeded` | bool | Whether assessment succeeded. |
+| `details.new_assessment_result.all_checks_succeeded` | bool | Whether all conditions passed. |
+| `details.new_assessment_result.checks_passed` | number | The number of resources, data sources, and outputs passing their conditions. |
+| `details.new_assessment_result.checks_failed` | number | The number of resources, data sources, and outputs with one or more failing conditions. |
+| `details.new_assessment_result.checks_errored` | number | The number of resources, data sources, and outputs that had a condition error. |
+| `details.new_assessment_result.checks_unknown` | number | The number of resources, data sources, and outputs that had conditions left unevaluated. |
+| `details.new_assessment_result.drifted` | bool | Whether assessment detected drift. |
+| `details.new_assessment_result.resources_drifted` | number | The number of resources whose configuration does not match from the workspace's state file. |
+| `details.new_assessment_result.resources_undrifted` | number | The number of real resources whose configuration matches the workspace's state file. |
+| `details.new_assessment_result.created_at` | string | Timestamp for when HCP Terraform created the assessment result. |
+| `details.prior_assessment_result` | object | The assessment result immediately prior to the one that triggered the notification. |
+| `details.prior_assessment_result.id` | string | ID of the assessment result. |
+| `details.prior_assessment_result.url` | string | URL to get the assessment result from the HCP Terraform API. |
+| `details.prior_assessment_result.succeeded` | bool | Whether assessment succeeded. |
+| `details.prior_assessment_result.all_checks_succeeded` | bool | Whether all conditions passed. |
+| `details.prior_assessment_result.checks_passed` | number | The number of resources, data sources, and outputs passing their conditions. |
+| `details.prior_assessment_result.checks_failed` | number | The number of resources, data sources, and outputs with one or more failing conditions. |
+| `details.prior_assessment_result.checks_errored` | number | The number of resources, data sources, and outputs that had a condition error. |
+| `details.prior_assessment_result.checks_unknown` | number | The number of resources, data sources, and outputs that had conditions left unevaluated. |
+| `details.prior_assessment_result.drifted` | bool | Whether assessment detected drift. |
+| `details.prior_assessment_result.resources_drifted` | number | The number of resources whose configuration does not match the workspace's state file. |
+| `details.prior_assessment_result.resources_undrifted` | number | The number of resources whose configuration matches the workspace's state file. |
+| `details.prior_assessment_result.created_at` | string | Timestamp of the assessment result. |
+| `details.workspace_id` | string | ID of the workspace that generated the notification. |
+| `details.workspace_name` | string | Human-readable name of the workspace. |
+| `details.organization_name` | string | Human-readable name of the organization. |
+
+##### Sample payload
+
+Health assessment payloads have information about resource drift and continuous validation checks.
+
+```json
+{
+ "payload_version": "2",
+ "notification_configuration_id": "nc-SZ3V3cLFxK6sqLKn",
+ "notification_configuration_url": "https://app.terraform.io/api/v2/notification-configurations/nc-SZ3V3cLFxK6sqLKn",
+ "trigger_scope": "assessment",
+ "trigger": "assessment:drifted",
+ "message": "Drift Detected",
+ "details": {
+ "new_assessment_result": {
+ "id": "asmtres-vRVQxpqq64EA9V5a",
+ "url": "https://app.terraform.io/api/v2/assessment-results/asmtres-vRVQxpqq64EA9V5a",
+ "succeeded": true,
+ "drifted": true,
+ "all_checks_succeeded": true,
+ "resources_drifted": 4,
+ "resources_undrifted": 55,
+ "checks_passed": 33,
+ "checks_failed": 0,
+ "checks_errored": 0,
+ "checks_unknown": 0,
+ "created_at": "2022-06-09T05:23:10Z"
+ },
+ "prior_assessment_result": {
+ "id": "asmtres-A6zEbpGArqP74fdL",
+ "url": "https://app.terraform.io/api/v2/assessment-results/asmtres-A6zEbpGArqP74fdL",
+ "succeeded": true,
+ "drifted": true,
+ "all_checks_succeeded": true,
+ "resources_drifted": 4,
+ "resources_undrifted": 55,
+ "checks_passed": 33,
+ "checks_failed": 0,
+ "checks_errored": 0,
+ "checks_unknown": 0,
+ "created_at": "2022-06-09T05:22:51Z"
+ },
+ "workspace_id": "ws-XdeUVMWShTesDMME",
+ "workspace_name": "my-workspace",
+ "organization_name": "acme-org"
+ }
+}
+```
+
+#### Automatic destroy runs
+
+
+
+@include 'tfc-package-callouts/ephemeral-workspaces.mdx'
+
+
+
+Automatic destroy run notifications for workspace events contain the following information:
+
+| Name | Type | Description |
+| ---------------------------------- | ------ | ---------------------------------------------------------------------------------------------------------- |
+| `payload_version` | string | Always 2. |
+| `notification_configuration_id` | string | The ID of the notification's configuration. |
+| `notification_configuration_url` | string | The URL to get the notification's configuration from the HCP Terraform API. |
+| `trigger_scope` | string | Always "workspace" for ephemeral workspace notifications |
+| `trigger` | string | Value of the trigger that caused HCP Terraform to send the notification. |
+| `message` | string | Human-readable reason for the notification. |
+| `details` | object | Object containing details specific to the notification. |
+| `details.auto_destroy_at` | string | Timestamp when HCP Terraform will schedule the next destroy run. Only applies to reminder notifications. |
+| `details.run_created_at` | string | Timestamp of when HCP Terraform successfully created a destroy run. Only applies to results notifications. |
+| `details.run_status` | string | Status of the scheduled destroy run. Only applies to results notifications. |
+| `details.run_external_id` | string | The ID of the scheduled destroy run. Only applies to results notifications. |
+| `details.run_create_error_message` | string | Message detailing why the run was unable to be queued. Only applies to results notifications. |
+| `details.trigger_type` | string | The type of notification, and the value is either "reminder" or "results". |
+| `details.workspace_name` | string | Human-readable name of the workspace. |
+| `details.organization_name` | string | Human-readable name of the organization. |
+
+##### Sample payload
+
+The shape of data in auto destroy notification payloads may differ depending on the success of the run HCP Terraform created. Refer to the specific examples below.
+
+###### Reminder
+
+Reminders that HCP Terraform will trigger a destroy run at some point in the future.
+
+```json
+{
+ "payload_version": "2",
+ "notification_configuration_id": "nc-SZ3V3cLFxK6sqLKn",
+ "notification_configuration_url": "https://app.terraform.io/api/v2/notification-configurations/nc-SZ3V3cLFxK6sqLKn",
+ "trigger_scope": "workspace",
+ "trigger": "workspace:auto_destroy_reminder",
+ "message": "Auto Destroy Reminder",
+ "details": {
+ "auto_destroy_at": "2025-01-01T00:00:00Z",
+ "run_created_at": null,
+ "run_status": null,
+ "run_external_id": null,
+ "run_create_error_message": null,
+ "trigger_type": "reminder",
+ "workspace_name": "learned-english-dog",
+ "organization_name": "acme-org"
+ }
+}
+```
+
+###### Results
+
+The final result of the scheduled auto destroy run includes additional metadata about the run.
+
+```json
+{
+ "payload_version": "2",
+ "notification_configuration_id": "nc-SZ3V3cLFxK6sqLKn",
+ "notification_configuration_url": "https://app.terraform.io/api/v2/notification-configurations/nc-SZ3V3cLFxK6sqLKn",
+ "trigger_scope": "workspace",
+ "trigger": "workspace:auto_destroy_results",
+ "message": "Auto Destroy Results",
+ "details": {
+ "auto_destroy_at": null,
+ "run_created_at": "2022-06-09T05:22:51Z",
+ "run_status": "applied",
+ "run_external_id": "run-vRVQxpqq64EA9V5a",
+ "run_create_error_message": null,
+ "trigger_type": "results",
+ "workspace_name": "learned-english-dog",
+ "organization_name": "acme-org"
+ }
+}
+```
+
+###### Failed run creation
+
+Run-specific values are empty when HCP Terraform was unable to create an auto destroy run.
+
+```json
+{
+ "payload_version": "2",
+ "notification_configuration_id": "nc-SZ3V3cLFxK6sqLKn",
+ "notification_configuration_url": "https://app.terraform.io/api/v2/notification-configurations/nc-SZ3V3cLFxK6sqLKn",
+ "trigger_scope": "workspace",
+ "trigger": "workspace:auto_destroy_results",
+ "message": "Auto Destroy Results",
+ "details": {
+ "auto_destroy_at": null,
+ "run_created_at": null,
+ "run_status": null,
+ "run_external_id": null,
+ "run_create_error_message": "Configuration version is missing",
+ "trigger_type": "results",
+ "workspace_name": "learned-english-dog",
+ "organization_name": "acme-org"
+ }
+}
+```
+
+## Notification authenticity
+
+If a `token` is configured, HCP Terraform provides an HMAC signature on all `"generic"` notification requests, using the `token` as the key. This is sent in the `X-TFE-Notification-Signature` header. The digest algorithm used is SHA-512. Notification target servers should verify the source of the HTTP request by computing the HMAC of the request body using the same shared secret, and dropping any requests with invalid signatures.
+
+Sample Ruby code for verifying the HMAC:
+
+```ruby
+token = SecureRandom.hex
+hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha512"), token, @request.body)
+fail "Invalid HMAC" if hmac != @request.headers["X-TFE-Notification-Signature"]
+```
+
+## Notification verification and delivery responses
+
+When saving a configuration with `enabled` set to `true`, or when using the [verify API][], HCP Terraform sends a verification request to the configured URL. The response to this request is stored and available in the `delivery-responses` array of the `notification-configuration` resource.
+
+Configurations cannot be enabled if the verification request fails. Success is defined as an HTTP response with status code of `2xx`.
+Configurations with `destination_type` `email` can only be verified manually, they do not require an HTTP response.
+
+The most recent response is stored in the `delivery-responses` array.
+
+Each delivery response has several fields:
+
+| Name | Type | Description |
+| ------------ | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `body` | string | Response body (may be truncated). |
+| `code` | string | HTTP status code, e.g. `400`. |
+| `headers` | object | All HTTP headers received, represented as an object with keys for each header name (lowercased) and an array of string values (most arrays will be size one). |
+| `sent-at` | date | The UTC timestamp when the notification was sent. |
+| `successful` | bool | Whether HCP Terraform considers this response to be successful. |
+| `url` | string | The URL to which the request was sent. |
+
+[verify API]: #verify-a-notification-configuration
+
+## Create a notification configuration
+
+`POST /workspaces/:workspace_id/notification-configurations`
+
+| Parameter | Description |
+| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:workspace_id` | The ID of the workspace to list configurations for. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](/terraform/enterprise/api-docs/workspaces#show-workspace) endpoint. |
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------------- | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "notification-configurations"`) | Successfully created a notification configuration |
+| [400][] | [JSON API error object][] | Unable to complete verification request to destination URL |
+| [404][] | [JSON API error object][] | Workspace not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+If `enabled` is set to `true`, a verification request will be sent before saving the configuration. If this request receives no response or the response is not successful (HTTP 2xx), the configuration will not save.
+
+| Key path | Type | Default | Description |
+| ---------------------------------- | -------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"notification-configuration"`. |
+| `data.attributes.destination-type` | string | | Type of notification payload to send. Valid values are `"generic"`, `"email"`, `"slack"` or `"microsoft-teams"`. |
+| `data.attributes.enabled` | bool | `false` | Disabled configurations will not send any notifications. |
+| `data.attributes.name` | string | | Human-readable name for the configuration. |
+| `data.attributes.token` | string or null | `null` | Optional write-only secure token, which can be used at the receiving server to verify request authenticity. See [Notification Authenticity][notification-authenticity] for more details. |
+| `data.attributes.triggers` | array | `[]` | Array of triggers for which this configuration will send notifications. See [Notification Triggers][notification-triggers] for more details and a list of allowed values. |
+| `data.attributes.url` | string | | HTTP or HTTPS URL to which notification requests will be made, only for configurations with `"destination_type:"` `"slack"`, `"microsoft-teams"` or `"generic"` |
+| `data.relationships.users` | array | | Array of users part of the organization, only for configurations with `"destination_type:"` `"email"` |
+
+[notification-authenticity]: #notification-authenticity
+
+[notification-triggers]: #notification-triggers
+
+### Sample payload for generic notification configurations
+
+```json
+{
+ "data": {
+ "type": "notification-configuration",
+ "attributes": {
+ "destination-type": "generic",
+ "enabled": true,
+ "name": "Webhook server test",
+ "url": "https://httpstat.us/200",
+ "triggers": [
+ "run:applying",
+ "run:completed",
+ "run:created",
+ "run:errored",
+ "run:needs_attention",
+ "run:planning"
+ ]
+ }
+ }
+}
+```
+
+### Sample payload for email notification configurations
+
+```json
+{
+ "data": {
+ "type": "notification-configurations",
+ "attributes": {
+ "destination-type": "email",
+ "enabled": true,
+ "name": "Notify organization users about run",
+ "triggers": [
+ "run:applying",
+ "run:completed",
+ "run:created",
+ "run:errored",
+ "run:needs_attention",
+ "run:planning"
+ ]
+ },
+ "relationships": {
+ "users": {
+ "data": [ { "id": "organization-user-id", "type": "users" } ]
+ }
+ }
+ }
+}
+```
+
+### Sample request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-XdeUVMWShTesDMME/notification-configurations
+```
+
+### Sample response
+
+```json
+{
+ "data": {
+ "id": "nc-AeUQ2zfKZzW9TiGZ",
+ "type": "notification-configurations",
+ "attributes": {
+ "enabled": true,
+ "name": "Webhook server test",
+ "url": "https://httpstat.us/200",
+ "destination-type": "generic",
+ "token": null,
+ "triggers": [
+ "run:applying",
+ "run:completed",
+ "run:created",
+ "run:errored",
+ "run:needs_attention",
+ "run:planning"
+ ],
+ "delivery-responses": [
+ {
+ "url": "https://httpstat.us/200",
+ "body": "\"200 OK\"",
+ "code": "200",
+ "headers": {
+ "cache-control": [
+ "private"
+ ],
+ "content-length": [
+ "129"
+ ],
+ "content-type": [
+ "application/json; charset=utf-8"
+ ],
+ "content-encoding": [
+ "gzip"
+ ],
+ "vary": [
+ "Accept-Encoding"
+ ],
+ "server": [
+ "Microsoft-IIS/10.0"
+ ],
+ "x-aspnetmvc-version": [
+ "5.1"
+ ],
+ "access-control-allow-origin": [
+ "*"
+ ],
+ "x-aspnet-version": [
+ "4.0.30319"
+ ],
+ "x-powered-by": [
+ "ASP.NET"
+ ],
+ "set-cookie": [
+ "ARRAffinity=77c477e3e649643e5771873e1a13179fb00983bc73c71e196bf25967fd453df9;Path=/;HttpOnly;Domain=httpstat.us"
+ ],
+ "date": [
+ "Tue, 08 Jan 2019 21:34:37 GMT"
+ ]
+ },
+ "sent-at": "2019-01-08 21:34:37 UTC",
+ "successful": "true"
+ }
+ ],
+ "created-at": "2019-01-08T21:32:14.125Z",
+ "updated-at": "2019-01-08T21:34:37.274Z"
+ },
+ "relationships": {
+ "subscribable": {
+ "data": {
+ "id": "ws-XdeUVMWShTesDMME",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/notification-configurations/nc-AeUQ2zfKZzW9TiGZ"
+ }
+ }
+}
+```
+
+## List notification configurations
+
+Use the following endpoint to list all notification configurations for a workspace.
+
+`GET /workspaces/:workspace_id/notification-configurations`
+
+| Parameter | Description |
+| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The ID of the workspace to list configurations from. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](/terraform/enterprise/api-docs/workspaces#show-workspace) endpoint. If neither pagination query parameters are provided, the endpoint will not be paginated and will return all results. |
+
+### Query parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | ------------------------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 notification configurations per page. |
+
+### Sample request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/workspaces/ws-XdeUVMWShTesDMME/notification-configurations
+```
+
+### Sample response
+
+```json
+{
+ "data": [
+ {
+ "id": "nc-W6VGEi8A7Cfoaf4K",
+ "type": "notification-configurations",
+ "attributes": {
+ "enabled": false,
+ "name": "Slack: #devops",
+ "url": "https://hooks.slack.com/services/T00000000/BC012345/0PWCpQmYyD4bTTRYZ53q4w",
+ "destination-type": "slack",
+ "token": null,
+ "triggers": [
+ "run:errored",
+ "run:needs_attention"
+ ],
+ "delivery-responses": [],
+ "created-at": "2019-01-08T21:34:28.367Z",
+ "updated-at": "2019-01-08T21:34:28.367Z"
+ },
+ "relationships": {
+ "subscribable": {
+ "data": {
+ "id": "ws-XdeUVMWShTesDMME",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/notification-configurations/nc-W6VGEi8A7Cfoaf4K"
+ }
+ },
+ {
+ "id": "nc-AeUQ2zfKZzW9TiGZ",
+ "type": "notification-configurations",
+ "attributes": {
+ "enabled": true,
+ "name": "Webhook server test",
+ "url": "https://httpstat.us/200",
+ "destination-type": "generic",
+ "token": null,
+ "triggers": [
+ "run:applying",
+ "run:completed",
+ "run:created",
+ "run:errored",
+ "run:needs_attention",
+ "run:planning"
+ ],
+ "delivery-responses": [
+ {
+ "url": "https://httpstat.us/200",
+ "body": "\"200 OK\"",
+ "code": "200",
+ "headers": {
+ "cache-control": [
+ "private"
+ ],
+ "content-length": [
+ "129"
+ ],
+ "content-type": [
+ "application/json; charset=utf-8"
+ ],
+ "content-encoding": [
+ "gzip"
+ ],
+ "vary": [
+ "Accept-Encoding"
+ ],
+ "server": [
+ "Microsoft-IIS/10.0"
+ ],
+ "x-aspnetmvc-version": [
+ "5.1"
+ ],
+ "access-control-allow-origin": [
+ "*"
+ ],
+ "x-aspnet-version": [
+ "4.0.30319"
+ ],
+ "x-powered-by": [
+ "ASP.NET"
+ ],
+ "set-cookie": [
+ "ARRAffinity=77c477e3e649643e5771873e1a13179fb00983bc73c71e196bf25967fd453df9;Path=/;HttpOnly;Domain=httpstat.us"
+ ],
+ "date": [
+ "Tue, 08 Jan 2019 21:34:37 GMT"
+ ]
+ },
+ "sent-at": "2019-01-08 21:34:37 UTC",
+ "successful": "true"
+ }
+ ],
+ "created-at": "2019-01-08T21:32:14.125Z",
+ "updated-at": "2019-01-08T21:34:37.274Z"
+ },
+ "relationships": {
+ "subscribable": {
+ "data": {
+ "id": "ws-XdeUVMWShTesDMME",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/notification-configurations/nc-AeUQ2zfKZzW9TiGZ"
+ }
+ }
+ ]
+}
+
+```
+
+## Show a notification configuration
+
+`GET /notification-configurations/:notification-configuration-id`
+
+| Parameter | Description |
+| -------------------------------- | ------------------------------------------------- |
+| `:notification-configuration-id` | The id of the notification configuration to show. |
+
+### Sample request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/notification-configurations/nc-AeUQ2zfKZzW9TiGZ
+```
+
+### Sample response
+
+The `type` and `id` attributes in `relationships.subscribable` may also reference a `"teams"` and team ID, respectively.
+
+```json
+{
+ "data": {
+ "id": "nc-AeUQ2zfKZzW9TiGZ",
+ "type": "notification-configurations",
+ "attributes": {
+ "enabled": true,
+ "name": "Webhook server test",
+ "url": "https://httpstat.us/200",
+ "destination-type": "generic",
+ "token": null,
+ "triggers": [
+ "run:applying",
+ "run:completed",
+ "run:created",
+ "run:errored",
+ "run:needs_attention",
+ "run:planning"
+ ],
+ "delivery-responses": [
+ {
+ "url": "https://httpstat.us/200",
+ "body": "\"200 OK\"",
+ "code": "200",
+ "headers": {
+ "cache-control": [
+ "private"
+ ],
+ "content-length": [
+ "129"
+ ],
+ "content-type": [
+ "application/json; charset=utf-8"
+ ],
+ "content-encoding": [
+ "gzip"
+ ],
+ "vary": [
+ "Accept-Encoding"
+ ],
+ "server": [
+ "Microsoft-IIS/10.0"
+ ],
+ "x-aspnetmvc-version": [
+ "5.1"
+ ],
+ "access-control-allow-origin": [
+ "*"
+ ],
+ "x-aspnet-version": [
+ "4.0.30319"
+ ],
+ "x-powered-by": [
+ "ASP.NET"
+ ],
+ "set-cookie": [
+ "ARRAffinity=77c477e3e649643e5771873e1a13179fb00983bc73c71e196bf25967fd453df9;Path=/;HttpOnly;Domain=httpstat.us"
+ ],
+ "date": [
+ "Tue, 08 Jan 2019 21:34:37 GMT"
+ ]
+ },
+ "sent-at": "2019-01-08 21:34:37 UTC",
+ "successful": "true"
+ }
+ ],
+ "created-at": "2019-01-08T21:32:14.125Z",
+ "updated-at": "2019-01-08T21:34:37.274Z"
+ },
+ "relationships": {
+ "subscribable": {
+ "data": {
+ "id": "ws-XdeUVMWShTesDMME",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/notification-configurations/nc-AeUQ2zfKZzW9TiGZ"
+ }
+ }
+}
+```
+
+## Update a notification configuration
+
+`PATCH /notification-configurations/:notification-configuration-id`
+
+| Parameter | Description |
+| -------------------------------- | --------------------------------------------------- |
+| `:notification-configuration-id` | The id of the notification configuration to update. |
+
+If the `enabled` attribute is true, updating the configuration will cause HCP Terraform to send a verification request. If a response is received, it will be stored and returned in the `delivery-responses` attribute. More details in the [Notification Verification and Delivery Responses][] section above.
+
+[Notification Verification and Delivery Responses]: #notification-verification-and-delivery-responses
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------------- | ---------------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "notification-configurations"`) | Successfully updated the notification configuration |
+| [400][] | [JSON API error object][] | Unable to complete verification request to destination URL |
+| [404][] | [JSON API error object][] | Notification configuration not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+If `enabled` is set to `true`, a verification request will be sent before saving the configuration. If this request fails to send, or the response is not successful (HTTP 2xx), the configuration will not save.
+
+| Key path | Type | Default | Description |
+| -------------------------- | ------ | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | (previous value) | Must be `"notification-configuration"`. |
+| `data.attributes.enabled` | bool | (previous value) | Disabled configurations will not send any notifications. |
+| `data.attributes.name` | string | (previous value) | User-readable name for the configuration. |
+| `data.attributes.token` | string | (previous value) | Optional write-only secure token, which can be used at the receiving server to verify request authenticity. See [Notification Authenticity][notification-authenticity] for more details. |
+| `data.attributes.triggers` | array | (previous value) | Array of triggers for sending notifications. See [Notification Triggers][notification-triggers] for more details. |
+| `data.attributes.url` | string | (previous value) | HTTP or HTTPS URL to which notification requests will be made, only for configurations with `"destination_type:"` `"slack"`, `"microsoft-teams"` or `"generic"` |
+| `data.relationships.users` | array | | Array of users part of the organization, only for configurations with `"destination_type:"` `"email"` |
+
+[notification-authenticity]: #notification-authenticity
+
+[notification-triggers]: #notification-triggers
+
+### Sample payload
+
+```json
+{
+ "data": {
+ "id": "nc-W6VGEi8A7Cfoaf4K",
+ "type": "notification-configurations",
+ "attributes": {
+ "enabled": false,
+ "name": "Slack: #devops",
+ "url": "https://hooks.slack.com/services/T00000001/BC012345/0PWCpQmYyD4bTTRYZ53q4w",
+ "destination-type": "slack",
+ "token": null,
+ "triggers": [
+ "run:created",
+ "run:errored",
+ "run:needs_attention"
+ ],
+ }
+ }
+}
+```
+
+### Sample request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/notification-configurations/nc-W6VGEi8A7Cfoaf4K
+```
+
+### Sample response
+
+```json
+{
+ "data": {
+ "id": "nc-W6VGEi8A7Cfoaf4K",
+ "type": "notification-configurations",
+ "attributes": {
+ "enabled": false,
+ "name": "Slack: #devops",
+ "url": "https://hooks.slack.com/services/T00000001/BC012345/0PWCpQmYyD4bTTRYZ53q4w",
+ "destination-type": "slack",
+ "token": null,
+ "triggers": [
+ "run:created",
+ "run:errored",
+ "run:needs_attention"
+ ],
+ "delivery-responses": [],
+ "created-at": "2019-01-08T21:34:28.367Z",
+ "updated-at": "2019-01-08T21:49:02.103Z"
+ },
+ "relationships": {
+ "subscribable": {
+ "data": {
+ "id": "ws-XdeUVMWShTesDMME",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/notification-configurations/nc-W6VGEi8A7Cfoaf4K"
+ }
+ },
+}
+```
+
+## Verify a notification configuration
+
+`POST /notification-configurations/:notification-configuration-id/actions/verify`
+
+| Parameter | Description |
+| -------------------------------- | --------------------------------------------------- |
+| `:notification-configuration-id` | The id of the notification configuration to verify. |
+
+This will cause HCP Terraform to send a verification request for the specified configuration. If a response is received, it will be stored and returned in the `delivery-responses` attribute. More details in the [Notification Verification and Delivery Responses][] section above.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------------- | ---------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "notification-configurations"`) | Successfully verified the notification configuration |
+| [400][] | [JSON API error object][] | Unable to complete verification request to destination URL |
+
+### Sample request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/notification-configurations/nc-AeUQ2zfKZzW9TiGZ/actions/verify
+```
+
+### Sample response
+
+```json
+{
+ "data": {
+ "id": "nc-AeUQ2zfKZzW9TiGZ",
+ "type": "notification-configurations",
+ "attributes": {
+ "enabled": true,
+ "name": "Webhook server test",
+ "url": "https://httpstat.us/200",
+ "destination-type": "generic",
+ "token": null,
+ "triggers": [
+ "run:applying",
+ "run:completed",
+ "run:created",
+ "run:errored",
+ "run:needs_attention",
+ "run:planning"
+ ],
+ "delivery-responses": [
+ {
+ "url": "https://httpstat.us/200",
+ "body": "\"200 OK\"",
+ "code": "200",
+ "headers": {
+ "cache-control": [
+ "private"
+ ],
+ "content-length": [
+ "129"
+ ],
+ "content-type": [
+ "application/json; charset=utf-8"
+ ],
+ "content-encoding": [
+ "gzip"
+ ],
+ "vary": [
+ "Accept-Encoding"
+ ],
+ "server": [
+ "Microsoft-IIS/10.0"
+ ],
+ "x-aspnetmvc-version": [
+ "5.1"
+ ],
+ "access-control-allow-origin": [
+ "*"
+ ],
+ "x-aspnet-version": [
+ "4.0.30319"
+ ],
+ "x-powered-by": [
+ "ASP.NET"
+ ],
+ "set-cookie": [
+ "ARRAffinity=77c477e3e649643e5771873e1a13179fb00983bc73c71e196bf25967fd453df9;Path=/;HttpOnly;Domain=httpstat.us"
+ ],
+ "date": [
+ "Tue, 08 Jan 2019 21:34:37 GMT"
+ ]
+ },
+ "sent-at": "2019-01-08 21:34:37 UTC",
+ "successful": "true"
+ }
+ ],
+ "created-at": "2019-01-08T21:32:14.125Z",
+ "updated-at": "2019-01-08T21:34:37.274Z"
+ },
+ "relationships": {
+ "subscribable": {
+ "data": {
+ "id": "ws-XdeUVMWShTesDMME",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/notification-configurations/nc-AeUQ2zfKZzW9TiGZ"
+ }
+ }
+}
+```
+
+## Delete a notification configuration
+
+This endpoint deletes a notification configuration.
+
+`DELETE /notification-configurations/:notification-configuration-id`
+
+| Parameter | Description |
+| -------------------------------- | --------------------------------------------------- |
+| `:notification-configuration-id` | The id of the notification configuration to delete. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ---------------------------------------------------------------------------- |
+| [204][] | None | Successfully deleted the notification configuration |
+| [404][] | [JSON API error object][] | Notification configuration not found, or user unauthorized to perform action |
+
+### Sample request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/notification-configurations/nc-AeUQ2zfKZzW9TiGZ
+```
+
+## Team notification configuration
+
+Team notifications allow you to configure relevant alerts that notify teams you specify whenever a certain event occurs.
+
+
+
+@include 'tfc-package-callouts/notifications.mdx'
+
+
+
+### Create a team notification configuration
+
+By default, every team has a default email notification configuration with no users assigned. If a notification configuration has no users assigned, HCP Terraform sends email notifications to all team members.
+
+Use this endpoint to create a notification configuration to notify a team.
+
+`POST /teams/:team_id/notification-configurations`
+
+| Parameter | Description |
+| ---------- | ------------------------------------------------- |
+| `:team_id` | The ID of the team to create a configuration for. |
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------------- | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "notification-configurations"`) | Successfully created a notification configuration |
+| [400][] | [JSON API error object][] | Unable to complete verification request to destination URL |
+| [404][] | [JSON API error object][] | Team not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+#### Request body
+
+This `POST` endpoint requires a JSON object with the following properties as a request payload. Properties without a default value are required.
+
+If `enabled` is set to `true`, HCP Terraform sends a verification request before saving the configuration. If this request does not receive a response or the response is not successful (HTTP 2xx), the configuration will not be saved.
+
+| Key path | Type | Default | Description |
+| ----------------------------------- | -------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"notification-configuration"`. |
+| `data.attributes.destination-type` | string | | Type of notification payload to send. Valid values are `"generic"`, `"email"`, `"slack"` or `"microsoft-teams"`. |
+| `data.attributes.enabled` | bool | `false` | Disabled configurations will not send any notifications. |
+| `data.attributes.name` | string | | Human-readable name for the configuration. |
+| `data.attributes.token` | string or null | `null` | Optional write-only secure token, which can be used at the receiving server to verify request authenticity. See [Notification Authenticity][notification-authenticity] for more details. |
+| `data.attributes.triggers` | array | `[]` | Array of triggers for which this configuration will send notifications. See [Notification Triggers][notification-triggers] for more details and a list of allowed values. |
+| `data.attributes.url` | string | | HTTP or HTTPS URL to which notification requests will be made, only for configurations with `"destination_type:"` `"slack"`, `"microsoft-teams"` or `"generic"` |
+| `data.attributes.email_all_members` | bool | | Email all team members, only for configurations with `"destination_type:" "email"`. |
+| `data.relationships.users` | array | | Array of users part of the organization, only for configurations with `"destination_type:"` `"email"` |
+
+[notification-authenticity]: #notification-authenticity
+
+[notification-triggers]: #notification-triggers
+
+#### Sample payload for generic notification configurations
+
+```json
+{
+ "data": {
+ "type": "notification-configuration",
+ "attributes": {
+ "destination-type": "generic",
+ "enabled": true,
+ "name": "Webhook server test",
+ "url": "https://httpstat.us/200",
+ "triggers": [
+ "change_request:created"
+ ]
+ }
+ }
+}
+```
+
+#### Sample payload for email notification configurations
+
+```json
+{
+ "data": {
+ "type": "notification-configurations",
+ "attributes": {
+ "destination-type": "email",
+ "enabled": true,
+ "name": "Email teams about change requests",
+ "triggers": [
+ "change_request:created"
+ ]
+ },
+ "relationships": {
+ "users": {
+ "data": [ { "id": "organization-user-id", "type": "users" } ]
+ }
+ }
+ }
+}
+```
+
+#### Sample request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/teams/team-6p5jTwJQXwqZBncC/notification-configurations
+```
+
+#### Sample response
+
+```json
+{
+ "data": {
+ "id": "nc-AeUQ2zfKZzW9TiGZ",
+ "type": "notification-configurations",
+ "attributes": {
+ "enabled": true,
+ "name": "Webhook server test",
+ "url": "https://httpstat.us/200",
+ "destination-type": "generic",
+ "token": null,
+ "triggers": [
+ "change_request:created"
+ ],
+ "delivery-responses": [
+ {
+ "url": "https://httpstat.us/200",
+ "body": "\"200 OK\"",
+ "code": "200",
+ "headers": {
+ "cache-control": [
+ "private"
+ ],
+ "content-length": [
+ "129"
+ ],
+ "content-type": [
+ "application/json; charset=utf-8"
+ ],
+ "content-encoding": [
+ "gzip"
+ ],
+ "vary": [
+ "Accept-Encoding"
+ ],
+ "server": [
+ "Microsoft-IIS/10.0"
+ ],
+ "x-aspnetmvc-version": [
+ "5.1"
+ ],
+ "access-control-allow-origin": [
+ "*"
+ ],
+ "x-aspnet-version": [
+ "4.0.30319"
+ ],
+ "x-powered-by": [
+ "ASP.NET"
+ ],
+ "set-cookie": [
+ "ARRAffinity=77c477e3e649643e5771873e1a13179fb00983bc73c71e196bf25967fd453df9;Path=/;HttpOnly;Domain=httpstat.us"
+ ],
+ "date": [
+ "Tue, 08 Jan 2024 21:34:37 GMT"
+ ]
+ },
+ "sent-at": "2024-01-08 21:34:37 UTC",
+ "successful": "true"
+ }
+ ],
+ "created-at": "2024-01-08T21:32:14.125Z",
+ "updated-at": "2024-01-08T21:34:37.274Z"
+ },
+ "relationships": {
+ "subscribable": {
+ "data": {
+ "id": "team-6p5jTwJQXwqZBncC",
+ "type": "teams"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/notification-configurations/nc-AeUQ2zfKZzW9TiGZ"
+ }
+ }
+}
+```
+
+### List team notification configurations
+
+Use this endpoint to list notification configurations for a team.
+
+`GET /teams/:team_id/notification-configurations`
+
+| Parameter | Description |
+| ---------- | ------------------------------------------------ |
+| `:team_id` | The ID of the teams to list configurations from. |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | ------------------------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 notification configurations per page. |
+
+#### Sample request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/teams/team-6p5jTwJQXwqZBncC/notification-configurations
+```
+
+#### Sample response
+
+```json
+{
+ "data": [
+ {
+ "id": "nc-W6VGEi8A7Cfoaf4K",
+ "type": "notification-configurations",
+ "attributes": {
+ "enabled": false,
+ "name": "Slack: #devops",
+ "url": "https://hooks.slack.com/services/T00000000/BC012345/0PWCpQmYyD4bTTRYZ53q4w",
+ "destination-type": "slack",
+ "token": null,
+ "triggers": [
+ "change_request:created"
+ ],
+ "delivery-responses": [],
+ "created-at": "2019-01-08T21:34:28.367Z",
+ "updated-at": "2019-01-08T21:34:28.367Z"
+ },
+ "relationships": {
+ "subscribable": {
+ "data": {
+ "id": "team-TdeUVMWShTesDMME",
+ "type": "teams"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/notification-configurations/nc-W6VGEi8A7Cfoaf4K"
+ }
+ },
+ {
+ "id": "nc-AeUQ2zfKZzW9TiGZ",
+ "type": "notification-configurations",
+ "attributes": {
+ "enabled": true,
+ "name": "Webhook server test",
+ "url": "https://httpstat.us/200",
+ "destination-type": "generic",
+ "token": null,
+ "triggers": [
+ "change_request:created"
+ ],
+ "delivery-responses": [
+ {
+ "url": "https://httpstat.us/200",
+ "body": "\"200 OK\"",
+ "code": "200",
+ "headers": {
+ "cache-control": [
+ "private"
+ ],
+ "content-length": [
+ "129"
+ ],
+ "content-type": [
+ "application/json; charset=utf-8"
+ ],
+ "content-encoding": [
+ "gzip"
+ ],
+ "vary": [
+ "Accept-Encoding"
+ ],
+ "server": [
+ "Microsoft-IIS/10.0"
+ ],
+ "x-aspnetmvc-version": [
+ "5.1"
+ ],
+ "access-control-allow-origin": [
+ "*"
+ ],
+ "x-aspnet-version": [
+ "4.0.30319"
+ ],
+ "x-powered-by": [
+ "ASP.NET"
+ ],
+ "set-cookie": [
+ "ARRAffinity=77c477e3e649643e5771873e1a13179fb00983bc73c71e196bf25967fd453df9;Path=/;HttpOnly;Domain=httpstat.us"
+ ],
+ "date": [
+ "Tue, 08 Jan 2019 21:34:37 GMT"
+ ]
+ },
+ "sent-at": "2019-01-08 21:34:37 UTC",
+ "successful": "true"
+ }
+ ],
+ "created-at": "2019-01-08T21:32:14.125Z",
+ "updated-at": "2019-01-08T21:34:37.274Z"
+ },
+ "relationships": {
+ "subscribable": {
+ "data": {
+ "id": "team-XdeUVMWShTesDMME",
+ "type": "teams"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/notification-configurations/nc-AeUQ2zfKZzW9TiGZ"
+ }
+ }
+ ]
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/oauth-clients.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/oauth-clients.mdx
new file mode 100644
index 0000000000..c16d5161c7
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/oauth-clients.mdx
@@ -0,0 +1,603 @@
+---
+page_title: /oauth-clients API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/oauth-clients` endpoint to manage
+ connections between VCS providers and organizations and projects. Learn how to
+ read, create, update, and destroy clients.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# OAuth client API reference
+
+An OAuth client represents the connection between an organization and a VCS provider. By default, you can globally access an OAuth client throughout the organization, or you can have scope access to one or more [projects](/terraform/enterprise/projects/manage).
+
+## List OAuth Clients
+
+`GET /organizations/:organization_name/oauth-clients`
+
+| Parameter | Description |
+| -------------------- | ----------------------------- |
+| `:organization_name` | The name of the organization. |
+
+This endpoint allows you to list VCS connections between an organization and a VCS provider (GitHub, Bitbucket, or GitLab) for use when creating or setting up workspaces.
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | ---------------------- |
+| [200][] | [JSON API document][] (`type: "oauth-clients"`) | Success |
+| [404][] | [JSON API error object][] | Organization not found |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs. If neither pagination query parameters are provided, the endpoint will not be paginated and will return all results.
+
+| Parameter | Description |
+| -------------- | ----------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 oauth clients per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/organizations/my-organization/oauth-clients
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "oc-XKFwG6ggfA9n7t1K",
+ "type": "oauth-clients",
+ "attributes": {
+ "created-at": "2018-04-16T20:42:53.771Z",
+ "callback-url": "https://app.terraform.io/auth/35936d44-842c-4ddd-b4d4-7c741383dc3a/callback",
+ "connect-path": "/auth/35936d44-842c-4ddd-b4d4-7c741383dc3a?organization_id=1",
+ "service-provider": "github",
+ "service-provider-display-name": "GitHub",
+ "name": null,
+ "http-url": "https://github.com",
+ "api-url": "https://api.github.com",
+ "key": null,
+ "rsa-public-key": null,
+ "organization-scoped": false
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization"
+ }
+ },
+ "projects": {
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }
+ ]
+ },
+ "oauth-tokens": {
+ "data": [],
+ "links": {
+ "related": "/api/v2/oauth-tokens/ot-KaeqH4cy72VPXFQT"
+ }
+ },
+ "agent-pool": {
+ "data": {
+ "id": "apool-VsmjEMcYkShrckpK",
+ "type": "agent-pools"
+ },
+ "links": {
+ "related": "/api/v2/agent-pools/apool-VsmjEMcYkShrckpK"
+ }
+ }
+ }
+ }
+ ]
+}
+```
+
+## Show an OAuth Client
+
+`GET /oauth-clients/:id`
+
+| Parameter | Description |
+| --------- | ---------------------------------- |
+| `:id` | The ID of the OAuth Client to show |
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "oauth-clients"`) | Success |
+| [404][] | [JSON API error object][] | OAuth Client not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/oauth-clients/oc-XKFwG6ggfA9n7t1K
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "oc-XKFwG6ggfA9n7t1K",
+ "type": "oauth-clients",
+ "attributes": {
+ "created-at": "2018-04-16T20:42:53.771Z",
+ "callback-url": "https://app.terraform.io/auth/35936d44-842c-4ddd-b4d4-7c741383dc3a/callback",
+ "connect-path": "/auth/35936d44-842c-4ddd-b4d4-7c741383dc3a?organization_id=1",
+ "service-provider": "github",
+ "service-provider-display-name": "GitHub",
+ "name": null,
+ "http-url": "https://github.com",
+ "api-url": "https://api.github.com",
+ "key": null,
+ "rsa-public-key": null,
+ "organization-scoped": false
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization"
+ }
+ },
+ "projects": {
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }
+ ]
+ },
+ "oauth-tokens": {
+ "data": [],
+ "links": {
+ "related": "/api/v2/oauth-tokens/ot-KaeqH4cy72VPXFQT"
+ }
+ },
+ "agent-pool": {
+ "data": {
+ "id": "apool-VsmjEMcYkShrckpK",
+ "type": "agent-pools"
+ },
+ "links": {
+ "related": "/api/v2/agent-pools/apool-VsmjEMcYkShrckpK"
+ }
+ }
+ }
+ }
+}
+```
+
+## Create an OAuth Client
+
+`POST /organizations/:organization_name/oauth-clients`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:organization_name` | The name of the organization that will be connected to the VCS provider. The organization must already exist in the system, and the user must have permission to manage VCS settings. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions)) |
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+This endpoint allows you to create a VCS connection between an organization and a VCS provider (GitHub or GitLab) for use when creating or setting up workspaces. By using this API endpoint, you can provide a pre-generated OAuth token string instead of going through the process of creating a GitHub or GitLab OAuth Application.
+
+To learn how to generate one of these token strings for your VCS provider, you can read the following documentation:
+
+- [GitHub and GitHub Enterprise](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)
+- [GitLab, GitLab Community Edition, and GitLab Enterprise Edition](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token)
+- [Azure DevOps Server](https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops-2019&tabs=preview-page)
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "oauth-clients"`) | OAuth Client successfully created |
+| [404][] | [JSON API error object][] | Organization not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------------- | -------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"oauth-clients"`. |
+| `data.attributes.service-provider` | string | | The VCS provider being connected with. Valid options are `"github"`, `"github_enterprise"`, `"gitlab_hosted"`, `"gitlab_community_edition"`, `"gitlab_enterprise_edition"`, or `"ado_server"`. |
+| `data.attributes.name` | string | `null` | An optional display name for the OAuth Client. If left `null`, the UI will default to the display name of the VCS provider. |
+| `data.attributes.key` | string | | The OAuth Client key. It can refer to a Consumer Key, Application Key, or another type of client key for the VCS provider. |
+| `data.attributes.http-url` | string | | The homepage of your VCS provider (e.g. `"https://github.com"` or `"https://ghe.example.com"` or `"https://gitlab.com"`). |
+| `data.attributes.api-url` | string | | The base URL as per your VCS provider's API documentation (e.g. `"https://api.github.com"`, `"https://ghe.example.com/api/v3"` or `"https://gitlab.com/api/v4"`). |
+| `data.attributes.oauth-token-string` | string | | The token string you were given by your VCS provider |
+| `data.attributes.private-key` | string | | **Required for Azure DevOps Server. Not used for any other providers.** The text of the SSH private key associated with your Azure DevOps Server account. |
+| `data.attributes.secret` | string | | The OAuth client secret. For Bitbucket Data Center, the secret is the text of the SSH private key associated with your Bitbucket Data Center application link. |
+| `data.attributes.rsa-public-key` | string | | **Required for Bitbucket Data Center in conjunction with the `secret`. Not used for any other providers.** The text of the SSH public key associated with your Bitbucket Data Center application link. |
+| `data.attributes.organization-scoped` | boolean | | Whether or not the OAuth client is scoped to all projects and workspaces in the organization. Defaults to `true`. |
+| `data.relationships.projects.data[]` | array\[object] | `[]` | A list of resource identifier objects that defines which projects are associated with the OAuth client. If `data.attributes.organization-scoped` is set to `false`, the OAuth client is only available to this list of projects. Each object in this list must contain a project `id` and use the `"projects"` type. For example, `{ "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }`. |
+| `data.relationships.agent-pool.data` | object | `{}` | The Agent Pool associated to the VCS connection. This pool will be responsible for forwarding VCS Provider API calls and cloning VCS repositories. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "oauth-clients",
+ "attributes": {
+ "service-provider": "github",
+ "http-url": "https://github.com",
+ "api-url": "https://api.github.com",
+ "oauth-token-string": "4306823352f0009d0ed81f1b654ac17a",
+ "organization-scoped": false
+ },
+ "relationships": {
+ "projects": {
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }
+ ]
+ },
+ "agent-pool": {
+ "data": {
+ "id": "apool-VsmjEMcYkShrckzzz",
+ "type": "agent-pools"
+ }
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/oauth-clients
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "oc-XKFwG6ggfA9n7t1K",
+ "type": "oauth-clients",
+ "attributes": {
+ "created-at": "2018-04-16T20:42:53.771Z",
+ "callback-url": "https://app.terraform.io/auth/35936d44-842c-4ddd-b4d4-7c741383dc3a/callback",
+ "connect-path": "/auth/35936d44-842c-4ddd-b4d4-7c741383dc3a?organization_id=1",
+ "service-provider": "github",
+ "service-provider-display-name": "GitHub",
+ "name": null,
+ "http-url": "https://github.com",
+ "api-url": "https://api.github.com",
+ "key": null,
+ "rsa-public-key": null,
+ "organization-scoped": false
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization"
+ }
+ },
+ "projects": {
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }
+ ]
+ },
+ "oauth-tokens": {
+ "data": [],
+ "links": {
+ "related": "/api/v2/oauth-tokens/ot-KaeqH4cy72VPXFQT"
+ }
+ },
+ "agent-pool": {
+ "data": {
+ "id": "apool-VsmjEMcYkShrckzzz",
+ "type": "agent-pools"
+ }
+ }
+ }
+ }
+}
+```
+
+## Update an OAuth Client
+
+`PATCH /oauth-clients/:id`
+
+| Parameter | Description |
+| --------- | ------------------------------------- |
+| `:id` | The ID of the OAuth Client to update. |
+
+Use caution when changing attributes with this endpoint; editing an OAuth client that workspaces are currently using can have unexpected effects.
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "oauth-clients"`) | The request was successful |
+| [404][] | [JSON API error object][] | OAuth Client not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| ------------------------------------- | -------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `data.type` | string | | Must be `"oauth-clients"`. |
+| `data.attributes.name` | string | (previous value) | An optional display name for the OAuth Client. If set to `null`, the UI will default to the display name of the VCS provider. |
+| `data.attributes.key` | string | (previous value) | The OAuth Client key. It can refer to a Consumer Key, Application Key, or another type of client key for the VCS provider. |
+| `data.attributes.secret` | string | (previous value) | The OAuth client secret. For Bitbucket Data Center, this secret is the text of the SSH private key associated with your Bitbucket Data Center application link. |
+| `data.attributes.rsa-public-key` | string | (previous value) | **Required for Bitbucket Data Center in conjunction with the `secret`. Not used for any other providers.** The text of the SSH public key associated with your Bitbucket Data Center application link. |
+| `data.attributes.organization-scoped` | boolean | (previous value) | Whether or not the OAuth client is available to all projects and workspaces in the organization. |
+| `data.relationships.projects` | array\[object] | (previous value) | A list of resource identifier objects that defines which projects are associated with the OAuth client. If `data.attributes.organization-scoped` is set to `false`, the OAuth client is only available to this list of projects. Each object in this list must contain a project `id` and use the `"projects"` type. For example, `{ "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }`. Sending an empty array clears all project assignments. |
+| `data.relationships.agent-pool.data` | object | `{}` | The Agent Pool associated to the VCS connection. This pool will be responsible for forwarding VCS Provider API calls and cloning VCS repositories. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "id": "oc-XKFwG6ggfA9n7t1K",
+ "type": "oauth-clients",
+ "attributes": {
+ "key": "key",
+ "secret": "secret",
+ "organization-scoped": false
+ },
+ "relationships": {
+ "projects": {
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }
+ ]
+ },
+ "agent-pool": {
+ "data": {
+ "id": "apool-VsmjEMcYkShrckzzz",
+ "type": "agent-pools"
+ }
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/oauth-clients/oc-XKFwG6ggfA9n7t1K
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "oc-XKFwG6ggfA9n7t1K",
+ "type": "oauth-clients",
+ "attributes": {
+ "created-at": "2018-04-16T20:42:53.771Z",
+ "callback-url": "https://app.terraform.io/auth/35936d44-842c-4ddd-b4d4-7c741383dc3a/callback",
+ "connect-path": "/auth/35936d44-842c-4ddd-b4d4-7c741383dc3a?organization_id=1",
+ "service-provider": "github",
+ "service-provider-display-name": "GitHub",
+ "name": null,
+ "http-url": "https://github.com",
+ "api-url": "https://api.github.com",
+ "key": null,
+ "rsa-public-key": null,
+ "organization-scoped": false
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization"
+ }
+ },
+ "projects": {
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }
+ ]
+ },
+ "oauth-tokens": {
+ "data": [],
+ "links": {
+ "related": "/api/v2/oauth-tokens/ot-KaeqH4cy72VPXFQT"
+ }
+ },
+ "agent-pool": {
+ "data": {
+ "id": "apool-VsmjEMcYkShrckzzz",
+ "type": "agent-pools"
+ }
+ }
+ }
+ }
+}
+```
+
+## Destroy an OAuth Client
+
+`DELETE /oauth-clients/:id`
+
+| Parameter | Description |
+| --------- | ------------------------------------- |
+| `:id` | The ID of the OAuth Client to destroy |
+
+This endpoint allows you to remove an existing connection between an organization and a VCS provider (GitHub, Bitbucket, or GitLab).
+
+**Note:** Removing the OAuth Client will unlink workspaces that use this connection from their repositories, and these workspaces will need to be manually linked to another repository.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------------------------ |
+| [204][] | Empty response | The OAuth Client was successfully destroyed |
+| [404][] | [JSON API error object][] | Organization or OAuth Client not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/oauth-clients/oc-XKFwG6ggfA9n7t1K
+```
+
+## Attach to a project
+
+`POST /oauth-clients/:id/relationships/projects`
+
+| Parameter | Description |
+| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the OAuth client to attach to a project. Use the [List OAuth Clients](#list-oauth-clients) endpoint to reference your OAuth client IDs. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------------------------- |
+| [204][] | Nothing | The request was successful |
+| [404][] | [JSON API error object][] | OAuth Client not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (one or more projects not found, wrong types, etc.) |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------- | -------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data[]` | array\[object] | `[]` | A list of resource identifier objects that defines which projects to attach the OAuth client to. These objects must contain `id` and `type` properties, and the `type` property must be `projects` (e.g. `{ "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }`). |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" },
+ { "id": "prj-2HRvNs49EWPjDqT1", "type": "projects" }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/oauth-clients/oc-XKFwG6ggfA9n7t1K/relationships/projects
+```
+
+## Detach an OAuth Client from projects
+
+`DELETE /oauth-clients/:id/relationships/projects`
+
+| Parameter | Description |
+| --------- | ----------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the oauth client you want to detach from the specified projects. Use the "List OAuth Clients" endpoint to find IDs. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------------------------- |
+| [204][] | Nothing | The request was successful |
+| [404][] | [JSON API error object][] | OAuth Client not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (one or more projects not found, wrong types, etc.) |
+
+### Request Body
+
+This DELETE endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------- | -------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data[]` | array\[object] | `[]` | A list of resource identifier objects that defines which projects are associated with the OAuth client. If `data.attributes.organization-scoped` is set to `false`, the OAuth client is only available to this list of projects. Each object in this list must contain a project `id` and use the `"projects"` type. For example, `{ "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }`. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" },
+ { "id": "prj-2HRvNs49EWPjDqT1", "type": "projects" }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/oauth-clients/oc-XKFwG6ggfA9n7t1K/relationships/projects
+```
+
+### Available Related Resources
+
+The GET endpoints above can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource Name | Description |
+| -------------- | --------------------------------------- |
+| `oauth_tokens` | The OAuth tokens managed by this client |
+| `projects` | The projects scoped to this client |
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/oauth-tokens.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/oauth-tokens.mdx
new file mode 100644
index 0000000000..83cdaaae1b
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/oauth-tokens.mdx
@@ -0,0 +1,264 @@
+---
+page_title: /oauth-tokens API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/oauth-tokens` endpoint to manage the
+ OAuth tokens that connect workspaces to VCS providers. Learn how to read,
+ update, and destroy tokens.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# OAuth token API reference
+
+The `oauth-token` object represents a VCS configuration which includes the OAuth connection and the associated OAuth token. This object is used when creating a workspace to identify which VCS connection to use.
+
+## List OAuth Tokens
+
+List all the OAuth Tokens for a given OAuth Client
+
+`GET /oauth-clients/:oauth_client_id/oauth-tokens`
+
+| Parameter | Description |
+| ------------------ | -------------------------- |
+| `:oauth_client_id` | The ID of the OAuth Client |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "oauth-tokens"`) | Success |
+| [404][] | [JSON API error object][] | OAuth Client not found, or user unauthorized to perform action |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs. If neither pagination query parameters are provided, the endpoint will not be paginated and will return all results.
+
+| Parameter | Description |
+| -------------- | ---------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 oauth tokens per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/v2/oauth-clients/oc-GhHqb5rkeK19mLB8/oauth-tokens
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "ot-hmAyP66qk2AMVdbJ",
+ "type": "oauth-tokens",
+ "attributes": {
+ "created-at":"2017-11-02T06:37:49.284Z",
+ "service-provider-user":"skierkowski",
+ "has-ssh-key": false
+ },
+ "relationships": {
+ "oauth-client": {
+ "data": {
+ "id": "oc-GhHqb5rkeK19mLB8",
+ "type": "oauth-clients"
+ },
+ "links": {
+ "related": "/api/v2/oauth-clients/oc-GhHqb5rkeK19mLB8"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/oauth-tokens/ot-hmAyP66qk2AMVdbJ"
+ }
+ }
+ ]
+}
+```
+
+## Show an OAuth Token
+
+`GET /oauth-tokens/:id`
+
+| Parameter | Description |
+| --------- | --------------------------------- |
+| `:id` | The ID of the OAuth token to show |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------- | ------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "oauth-tokens"`) | Success |
+| [404][] | [JSON API error object][] | OAuth Token not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/oauth-tokens/ot-29t7xkUKiNC2XasL
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "ot-29t7xkUKiNC2XasL",
+ "type": "oauth-tokens",
+ "attributes": {
+ "created-at": "2018-08-29T14:07:22.144Z",
+ "service-provider-user": "EM26Jj0ikRsIFFh3fE5C",
+ "has-ssh-key": false
+ },
+ "relationships": {
+ "oauth-client": {
+ "data": {
+ "id": "oc-WMipGbuW8q7xCRmJ",
+ "type": "oauth-clients"
+ },
+ "links": {
+ "related": "/api/v2/oauth-clients/oc-WMipGbuW8q7xCRmJ"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/oauth-tokens/ot-29t7xkUKiNC2XasL"
+ }
+ }
+}
+```
+
+## Update an OAuth Token
+
+`PATCH /oauth-tokens/:id`
+
+| Parameter | Description |
+| --------- | ----------------------------------- |
+| `:id` | The ID of the OAuth token to update |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "oauth-tokens"`) | OAuth Token successfully updated |
+| [404][] | [JSON API error object][] | OAuth Token not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------- | ------ | ------- | ------------------------- |
+| `data.type` | string | | Must be `"oauth-tokens"`. |
+| `data.attributes.ssh-key` | string | | **Optional.** The SSH key |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "id": "ot-29t7xkUKiNC2XasL",
+ "type": "oauth-tokens",
+ "attributes": {
+ "ssh-key": "..."
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/oauth-tokens/ot-29t7xkUKiNC2XasL
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "ot-29t7xkUKiNC2XasL",
+ "type": "oauth-tokens",
+ "attributes": {
+ "created-at": "2018-08-29T14:07:22.144Z",
+ "service-provider-user": "EM26Jj0ikRsIFFh3fE5C",
+ "has-ssh-key": false
+ },
+ "relationships": {
+ "oauth-client": {
+ "data": {
+ "id": "oc-WMipGbuW8q7xCRmJ",
+ "type": "oauth-clients"
+ },
+ "links": {
+ "related": "/api/v2/oauth-clients/oc-WMipGbuW8q7xCRmJ"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/oauth-tokens/ot-29t7xkUKiNC2XasL"
+ }
+ }
+}
+```
+
+## Destroy an OAuth Token
+
+`DELETE /oauth-tokens/:id`
+
+| Parameter | Description |
+| --------- | ------------------------------------ |
+| `:id` | The ID of the OAuth Token to destroy |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------- |
+| [204][] | Empty response | The OAuth Token was successfully destroyed |
+| [404][] | [JSON API error object][] | OAuth Token not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/oauth-tokens/ot-29t7xkUKiNC2XasL
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/organization-memberships.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/organization-memberships.mdx
new file mode 100644
index 0000000000..dec59d2968
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/organization-memberships.mdx
@@ -0,0 +1,497 @@
+---
+page_title: /organization-memberships API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/organization-memberships` endpoint to
+ manage membership in an organization. Invite, list, and remove members from
+ organizations.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Organization memberships API reference
+
+Users are added to organizations by inviting them to join. Once accepted, they become members of the organization. The Organization Membership resource represents this membership.
+
+You can invite users who already have an account, as well as new users. If the user has an existing account with the same email address used to invite them, they can reuse the same login.
+
+-> **Note:** Once a user is a member of the organization, you can manage their team memberships using [the Team Membership API](/terraform/enterprise/api-docs/team-members).
+
+## Invite a User to an Organization
+
+`POST /organizations/:organization_name/organization-memberships`
+
+| Parameter | Description |
+| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization the user will be invited to join. The inviting user must have permission to manage organization memberships. |
+
+-> **Note:** Organization membership management is restricted to members of the owners team, the owners [team API token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens), the [organization API token](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens), and users or teams with one of the [Team Management](/terraform/enterprise/users-teams-organizations/permissions#team-management-permissions) permissions.
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] | Successfully invited the user |
+| [400][] | [JSON API error object][] | Unable to invite user due to organization limits |
+| [404][] | [JSON API error object][] | Organization not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Unable to invite user due to validation errors |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| --------------------------------- | -------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"organization-memberships"`. |
+| `data.attributes.email` | string | | The email address of the user to be invited. |
+| `data.relationships.teams.data[]` | array\[object] | | A list of resource identifier objects that defines which teams the invited user will be a member of. These objects must contain `id` and `type` properties, and the `type` property must be `teams` (e.g. `{ "id": "team-GeLZkdnK6xAVjA5H", "type": "teams" }`). Obtain team IDs from the [List Teams](/terraform/enterprise/api-docs/teams#list-teams) endpoint. All users must be added to at least one team. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "email": "test@example.com"
+ },
+ "relationships": {
+ "teams": {
+ "data": [
+ {
+ "type": "teams",
+ "id": "team-GeLZkdnK6xAVjA5H"
+ }
+ ]
+ }
+ },
+ "type": "organization-memberships"
+ }
+}
+```
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/organization-memberships
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "ou-nX7inDHhmC3quYgy",
+ "type": "organization-memberships",
+ "attributes": {
+ "status": "invited"
+ },
+ "relationships": {
+ "teams": {
+ "data": [
+ {
+ "id": "team-GeLZkdnK6xAVjA5H",
+ "type": "teams"
+ }
+ ]
+ },
+ "user": {
+ "data": {
+ "id": "user-J8oxGmRk5eC2WLfX",
+ "type": "users"
+ }
+ },
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ }
+ },
+ "included": [
+ {
+ "id": "user-J8oxGmRk5eC2WLfX",
+ "type": "users",
+ "attributes": {
+ "username": null,
+ "is-service-account": false,
+ "auth-method": "hcp_sso",
+ "avatar-url": "https://www.gravatar.com/avatar/55502f40dc8b7c769880b10874abc9d0?s=100&d=mm",
+ "two-factor": {
+ "enabled": false,
+ "verified": false
+ },
+ "email": "test@example.com",
+ "permissions": {
+ "can-create-organizations": true,
+ "can-change-email": true,
+ "can-change-username": true,
+ "can-manage-user-tokens": false
+ }
+ },
+ "relationships": {
+ "authentication-tokens": {
+ "links": {
+ "related": "/api/v2/users/user-J8oxGmRk5eC2WLfX/authentication-tokens"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/users/user-J8oxGmRk5eC2WLfX"
+ }
+ }
+ ]
+}
+```
+
+## List Memberships for an Organization
+
+`GET /organizations/:organization_name/organization-memberships`
+
+| Parameter | Description |
+| -------------------- | -------------------------------------------------------- |
+| `:organization_name` | The name of the organization to list the memberships of. |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `q` | **Optional.** A search query string. Organization memberships are searchable by user name and email. |
+| `filter[status]` | **Optional.** If specified, restricts results to those with the matching status value. Valid values are `invited` and `active`. |
+| `filter[email]` | **Optional.** If specified, restricts results to those with a matching user email address. If multiple comma separated values are specified, results matching any of the values are returned. |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 users per page. |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/my-organization/organization-memberships
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "ou-tTJph1AQVK5ZmdND",
+ "type": "organization-memberships",
+ "attributes": {
+ "status": "active"
+ },
+ "relationships": {
+ "teams": {
+ "data": [
+ {
+ "id": "team-yUrEehvfG4pdmSjc",
+ "type": "teams"
+ }
+ ]
+ },
+ "user": {
+ "data": {
+ "id": "user-vaQqszES9JnuK4eB",
+ "type": "users"
+ }
+ },
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ }
+ },
+ {
+ "id": "ou-D6HPYFt4GzeBt3gB",
+ "type": "organization-memberships",
+ "attributes": {
+ "status": "active"
+ },
+ "relationships": {
+ "teams": {
+ "data": [
+ {
+ "id": "team-yUrEehvfG4pdmSjc",
+ "type": "teams"
+ }
+ ]
+ },
+ "user": {
+ "data": {
+ "id": "user-oqCgH7NgTn95jTGc",
+ "type": "users"
+ }
+ },
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ }
+ },
+ {
+ "id": "ou-x1E2eBwYwusLDC7h",
+ "type": "organization-memberships",
+ "attributes": {
+ "status": "invited"
+ },
+ "relationships": {
+ "teams": {
+ "data": [
+ {
+ "id": "team-yUrEehvfG4pdmSjc",
+ "type": "teams"
+ }
+ ]
+ },
+ "user": {
+ "data": {
+ "id": "user-UntUdBTHsVRQMzC8",
+ "type": "users"
+ }
+ },
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/organizations/my-organization/organization-memberships?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/organizations/my-organization/organization-memberships?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/organizations/my-organization/organization-memberships?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "status-counts": {
+ "total": 3,
+ "active": 2,
+ "invited": 1
+ },
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 3
+ }
+ }
+}
+```
+
+## List User's Own Memberships
+
+`GET /organization-memberships`
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organization-memberships
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "ou-VgJgfbDVN3APUm2F",
+ "type": "organization-memberships",
+ "attributes": {
+ "status": "invited"
+ },
+ "relationships": {
+ "teams": {
+ "data": [
+ {
+ "id": "team-4QrJKzxB3J5N4cJc",
+ "type": "teams"
+ }
+ ]
+ },
+ "user": {
+ "data": {
+ "id": "user-vaQqszES9JnuK4eB",
+ "type": "users"
+ }
+ },
+ "organization": {
+ "data": {
+ "id": "acme-corp",
+ "type": "organizations"
+ }
+ }
+ }
+ },
+ {
+ "id": "ou-tTJph1AQVK5ZmdND",
+ "type": "organization-memberships",
+ "attributes": {
+ "status": "active"
+ },
+ "relationships": {
+ "teams": {
+ "data": [
+ {
+ "id": "team-yUrEehvfG4pdmSjc",
+ "type": "teams"
+ }
+ ]
+ },
+ "user": {
+ "data": {
+ "id": "user-vaQqszES9JnuK4eB",
+ "type": "users"
+ }
+ },
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ }
+ }
+ ]
+}
+```
+
+## Show a Membership
+
+`GET /organization-memberships/:organization_membership_id`
+
+| Parameter | Description |
+| ----------------------------- | --------------------------- |
+| `:organization_membership_id` | The organization membership |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------------- | ------------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "organization-memberships"`) | The request was successful |
+| [404][] | [JSON API error object][] | Organization membership not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organization-memberships/ou-kit6GaMo3zPGCzWb
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "ou-kit6GaMo3zPGCzWb",
+ "type": "organization-memberships",
+ "attributes": {
+ "status": "active"
+ },
+ "relationships": {
+ "teams": {
+ "data": [
+ {
+ "id": "team-97LkM7QciNkwb2nh",
+ "type": "teams"
+ }
+ ]
+ },
+ "user": {
+ "data": {
+ "id": "user-hn6v2WK1naDpGadd",
+ "type": "users"
+ }
+ },
+ "organization": {
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations"
+ }
+ }
+ }
+ }
+}
+```
+
+## Remove User from Organization
+
+`DELETE /organization-memberships/:organization_membership_id`
+
+| Parameter | Description |
+| ----------------------------- | --------------------------- |
+| `:organization_membership_id` | The organization membership |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------------------------------------- |
+| [204][] | Empty body | Successfully removed the user from the organization |
+| [403][] | [JSON API error object][] | Unable to remove the user: you cannot remove yourself from organizations which you own |
+| [404][] | [JSON API error object][] | Organization membership not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/organization-memberships/ou-tTJph1AQVK5ZmdND
+```
+
+## Available Related Resources
+
+The GET endpoints above can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+- `user` - The user associated with the membership.
+- `teams` - Teams the user is a member of.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/organization-tags.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/organization-tags.mdx
new file mode 100644
index 0000000000..bcebf92fbc
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/organization-tags.mdx
@@ -0,0 +1,230 @@
+---
+page_title: /tags API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's organization `/tags` endpoint to assign,
+ list, and delete tags for an organization.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Organization tags API reference
+
+This API returns the list of tags used in workspaces across the organization. Tags can be added to this pool via workspaces. Tags deleted here will be removed from all other workspaces. Tags can be added, applied, removed and deleted in bulk.
+
+Tags are subject to the following rules:
+
+- Workspace tags or tags must be one or more characters, have a 255 character limit, and can include letters, numbers, colons, hyphens, and underscores.
+- You can create tags for a workspace using the user interface or the API. After you create a tag, you can assign it to other workspaces in the same organization.
+- You cannot create tags for a workspace using the CLI.
+- You cannot set tags at the project level, so there is no tag inheritance from projects to workspaces.
+
+## List Tags
+
+`GET /organizations/:organization_name/tags`
+
+| Parameter | Description |
+| -------------------- | ---------------------------------------------- |
+| `:organization_name` | The name of the organization to list tags from |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters); remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| ------------------------------- | ---------------------------------------------------------------------------------------- |
+| `q` | **Optional.** A search query string. Organization tags are searchable by name likeness. |
+| `filter[exclude][taggable][id]` | **Optional.** If specified, omits organization's related workspace's tags. |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 organization tags per page. |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/hashicorp/tags
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "tag-1",
+ "type": "tags",
+ "attributes": {
+ "name": "tag1",
+ "created-at": "2022-03-09T06:04:39.585Z",
+ "instance-count": 1
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ }
+ },
+ {
+ "id": "tag-2",
+ "type": "tags",
+ "attributes": {
+ "name": "tag2",
+ "created-at": "2022-03-09T06:04:39.585Z",
+ "instance-count": 2
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ }
+ }
+ ]
+}
+```
+
+## Delete tags
+
+This endpoint deletes one or more tags from an organization. The organization and tags must already
+exist. Tags deleted here will be removed from all other resources.
+
+`DELETE /organizations/:organization_name/tags`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------ |
+| `:organization_name` | The name of the organization to delete tags from |
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | -------------------------------------------------------------- |
+| [204][] | No Content | Successfully removed tags from organization |
+| [404][] | [JSON API error object][] | Organization not found, or user unauthorized to perform action |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+It is important to note that `type` and `id` are required.
+
+| Key path | Type | Default | Description |
+| ------------- | ------ | ------- | ---------------------------- |
+| `data[].type` | string | | Must be `"tags"`. |
+| `data[].id` | string | | The id of the tag to remove. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "type": "tags",
+ "id": "tag-Yfha4YpPievQ8wJw"
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/hashicorp/tags
+```
+
+## Sample Response
+
+No response body.
+
+Status code `204`.
+
+## Add workspaces to a tag
+
+`POST /tags/:tag_id/relationships/workspaces`
+
+| Parameter | Description |
+| --------- | ---------------------------------------------------- |
+| `:tag_id` | The ID of the tag that workspaces should have added. |
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | ----------------------------------------------------- |
+| [204][] | No Content | Successfully added workspaces to tag |
+| [404][] | [JSON API error object][] | Tag not found, or user unauthorized to perform action |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| ------------- | ------ | ------- | ------------------------------- |
+| `data[].type` | string | | Must be `"workspaces"`. |
+| `data[].id` | string | | The id of the workspace to add. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/tags/tag-2/relationships/workspaces
+```
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "type": "workspaces",
+ "id": "ws-pmKTbUwH2VPiiTC4"
+ }
+ ]
+}
+```
+
+### Sample Response
+
+No response body.
+
+Status code `204`.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/organization-tokens.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/organization-tokens.mdx
new file mode 100644
index 0000000000..75894a177c
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/organization-tokens.mdx
@@ -0,0 +1,148 @@
+---
+page_title: /organizations/authentication-token API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/organizations/authentication-token`
+ endpoint to generate and delete organization-level API tokens.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Organization tokens API reference
+
+## Generate a new organization token
+
+`POST /organizations/:organization_name/authentication-token`
+
+| Parameter | Description |
+| -------------------- | ----------------------------------------------------- |
+| `:organization_name` | The name of the organization to generate a token for. |
+
+Generates a new [organization API token](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens), replacing any existing token.
+
+Only members of the owners team, the owners [team API token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens), and the [organization API token](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens) can access this endpoint.
+
+This endpoint returns the secret text of the new authentication token. You can only access this token when you create it and can not recover it later.
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------- | ------------------- |
+| [201][] | [JSON API document][] (`type: "authentication-tokens"`) | Success |
+| [404][] | [JSON API error object][] | User not authorized |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| ---------------------------- | ------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"authentication-token"`. |
+| `data.attributes.expired-at` | string | `null` | The UTC date and time that the Organization Token will expire, in ISO 8601 format. If omitted or set to `null` the token will never expire. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "authentication-token",
+ "attributes": {
+ "expired-at": "2023-04-06T12:00:00.000Z"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/authentication-token
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "4111756",
+ "type": "authentication-tokens",
+ "attributes": {
+ "created-at": "2017-11-29T19:11:28.075Z",
+ "last-used-at": null,
+ "description": null,
+ "token": "ZgqYdzuvlv8Iyg.atlasv1.6nV7t1OyFls341jo1xdZTP72fN0uu9VL55ozqzekfmToGFbhoFvvygIRy2mwVAXomOE",
+ "expired-at": "2023-04-06T12:00:00.000Z"
+ },
+ "relationships": {
+ "created-by": {
+ "data": {
+ "id": "user-62goNpx1ThQf689e",
+ "type": "users"
+ }
+ }
+ }
+ }
+}
+```
+
+## Delete the organization token
+
+`DELETE /organizations/:organization/authentication-token`
+
+| Parameter | Description |
+| -------------------- | --------------------------------------------- |
+| `:organization_name` | Which organization's token should be deleted. |
+
+Only members of the owners team, the owners [team API token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens), and the [organization API token](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens) can access this endpoint.
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------- |
+| [204][] | No Content | Success |
+| [404][] | [JSON API error object][] | User not authorized |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/organizations/my-organization/authentication-token
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/organizations.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/organizations.mdx
new file mode 100644
index 0000000000..186f708b53
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/organizations.mdx
@@ -0,0 +1,986 @@
+---
+page_title: /organizations API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/organizations` endpoint to create,
+ update, and destroy organizations, and read their entitlement sets, module
+ producers, and data retention policies.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Organizations API reference
+
+The Organizations API is used to list, show, create, update, and destroy organizations.
+
+## List Organizations
+
+`GET /organizations`
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | ------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "organizations"`) | The request was successful |
+| [404][] | [JSON API error object][] | Organization not found or user unauthorized to perform action |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+Currently, this endpoint returns a full, unpaginated list of organizations (without pagination metadata) if both of the pagination query parameters are omitted. To avoid inconsistent behavior, we recommend always supplying pagination parameters when building against this API.
+
+| Parameter | Description |
+| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `q` | **Optional.** A search query string. Organizations are searchable by name and notification email. This query takes precedence over the attribute specific searches `q[email]` or `q[name]`. |
+| `q[email]` | **Optional.** A search query string. This query searches organizations by notification email. If used with `q[name]`, it returns organizations that match both queries. |
+| `q[name]` | **Optional.** A search query string. This query searches organizations by name. If used with `q[email]`, it returns organizations that match both queries. |
+| `page[number]` | **Optional.** Defaults to the first page, if omitted when `page[size]` is provided. |
+| `page[size]` | **Optional.** Defaults to 20 organizations per page, if omitted when `page[number]` is provided. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/organizations\?page\[number\]\=1\&page\[size\]\=20
+```
+
+### Sample Response
+
+**Note:** Only HCP Terraform organizations return the `two-factor-conformant` and `assessments-enforced` properties.
+
+```json
+{
+ "data": [
+ {
+ "id": "hashicorp",
+ "type": "organizations",
+ "attributes": {
+ "external-id": "org-Hysjx5eUviuKVCJY",
+ "created-at": "2021-08-24T23:10:04.675Z",
+ "email": "hashicorp@example.com",
+ "session-timeout": null,
+ "session-remember": null,
+ "collaborator-auth-policy": "password",
+ "plan-expired": false,
+ "plan-expires-at": null,
+ "plan-is-trial": false,
+ "plan-is-enterprise": false,
+ "plan-identifier": "developer",
+ "cost-estimation-enabled": true,
+ "send-passing-statuses-for-untriggered-speculative-plans": true,
+ "aggregated-commit-status-enabled": false,
+ "speculative-plan-management-enabled": true,
+ "allow-force-delete-workspaces": true,
+ "name": "hashicorp",
+ "permissions": {
+ "can-update": true,
+ "can-destroy": true,
+ "can-access-via-teams": true,
+ "can-create-module": true,
+ "can-create-team": true,
+ "can-create-workspace": true,
+ "can-manage-users": true,
+ "can-manage-subscription": true,
+ "can-manage-sso": true,
+ "can-update-oauth": true,
+ "can-update-sentinel": true,
+ "can-update-ssh-keys": true,
+ "can-update-api-token": true,
+ "can-traverse": true,
+ "can-start-trial": true,
+ "can-update-agent-pools": true,
+ "can-manage-tags": true,
+ "can-manage-varsets": true,
+ "can-read-varsets": true,
+ "can-manage-public-providers": true,
+ "can-create-provider": true,
+ "can-manage-public-modules": true,
+ "can-manage-custom-providers": false,
+ "can-manage-run-tasks": false,
+ "can-read-run-tasks": false,
+ "can-create-project": true
+ },
+ "fair-run-queuing-enabled": true,
+ "saml-enabled": false,
+ "owners-team-saml-role-id": null,
+ "two-factor-conformant": false,
+ "assessments-enforced": false,
+ "default-execution-mode": "remote"
+ },
+ "relationships": {
+ "default-agent-pool": {
+ "data": null
+ },
+ "oauth-tokens": {
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/oauth-tokens"
+ }
+ },
+ "authentication-token": {
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/authentication-token"
+ }
+ },
+ "entitlement-set": {
+ "data": {
+ "id": "org-Hysjx5eUviuKVCJY",
+ "type": "entitlement-sets"
+ },
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/entitlement-set"
+ }
+ },
+ "subscription": {
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/subscription"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/hashicorp"
+ }
+ },
+ {
+ "id": "hashicorp-two",
+ "type": "organizations",
+ "attributes": {
+ "external-id": "org-iJ5tr4WgB4WpA1hD",
+ "created-at": "2022-01-04T18:57:16.036Z",
+ "email": "hashicorp@example.com",
+ "session-timeout": null,
+ "session-remember": null,
+ "collaborator-auth-policy": "password",
+ "plan-expired": false,
+ "plan-expires-at": null,
+ "plan-is-trial": false,
+ "plan-is-enterprise": false,
+ "plan-identifier": "free",
+ "cost-estimation-enabled": false,
+ "send-passing-statuses-for-untriggered-speculative-plans": false,
+ "aggregated-commit-status-enabled": true,
+ "speculative-plan-management-enabled": true,
+ "allow-force-delete-workspaces": false,
+ "name": "hashicorp-two",
+ "permissions": {
+ "can-update": true,
+ "can-destroy": true,
+ "can-access-via-teams": true,
+ "can-create-module": true,
+ "can-create-team": false,
+ "can-create-workspace": true,
+ "can-manage-users": true,
+ "can-manage-subscription": true,
+ "can-manage-sso": false,
+ "can-update-oauth": true,
+ "can-update-sentinel": false,
+ "can-update-ssh-keys": true,
+ "can-update-api-token": true,
+ "can-traverse": true,
+ "can-start-trial": true,
+ "can-update-agent-pools": false,
+ "can-manage-tags": true,
+ "can-manage-varsets": true,
+ "can-read-varsets": true,
+ "can-manage-public-providers": true,
+ "can-create-provider": true,
+ "can-manage-public-modules": true,
+ "can-manage-custom-providers": false,
+ "can-manage-run-tasks": false,
+ "can-read-run-tasks": false,
+ "can-create-project": false
+ },
+ "fair-run-queuing-enabled": true,
+ "saml-enabled": false,
+ "owners-team-saml-role-id": null,
+ "two-factor-conformant": false,
+ "assessments-enforced": false,
+ "default-execution-mode": "remote"
+ },
+ "relationships": {
+ "default-agent-pool": {
+ "data": null
+ },
+ "oauth-tokens": {
+ "links": {
+ "related": "/api/v2/organizations/hashicorp-two/oauth-tokens"
+ }
+ },
+ "authentication-token": {
+ "links": {
+ "related": "/api/v2/organizations/hashicorp-two/authentication-token"
+ }
+ },
+ "entitlement-set": {
+ "data": {
+ "id": "org-iJ5tr4WgB4WpA1hD",
+ "type": "entitlement-sets"
+ },
+ "links": {
+ "related": "/api/v2/organizations/hashicorp-two/entitlement-set"
+ }
+ },
+ "subscription": {
+ "links": {
+ "related": "/api/v2/organizations/hashicorp-two/subscription"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/hashicorp-two"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://tfe-zone-b0c8608c.ngrok.io/api/v2/organizations?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://tfe-zone-b0c8608c.ngrok.io/api/v2/organizations?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://tfe-zone-b0c8608c.ngrok.io/api/v2/organizations?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "page-size": 20,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 2
+ }
+ }
+}
+```
+
+## Show an Organization
+
+`GET /organizations/:organization_name`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------ |
+| `:organization_name` | The name of the organization to show |
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | ------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "organizations"`) | The request was successful |
+| [404][] | [JSON API error object][] | Organization not found or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/organizations/hashicorp
+```
+
+### Sample Response
+
+**Note:** Only HCP Terraform organizations return the `two-factor-conformant` and `assessments-enforced` properties.
+
+```json
+{
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations",
+ "attributes": {
+ "external-id": "org-WV6DfwfxxXvLfvfs",
+ "created-at": "2020-03-26T22:13:38.456Z",
+ "email": "user@example.com",
+ "session-timeout": null,
+ "session-remember": null,
+ "collaborator-auth-policy": "password",
+ "plan-expired": false,
+ "plan-expires-at": null,
+ "plan-is-trial": false,
+ "plan-is-enterprise": false,
+ "cost-estimation-enabled": false,
+ "send-passing-statuses-for-untriggered-speculative-plans": false,
+ "aggregated-commit-status-enabled": true,
+ "speculative-plan-management-enabled": true,
+ "allow-force-delete-workspaces": false,
+ "name": "hashicorp",
+ "permissions": {
+ "can-update": true,
+ "can-destroy": true,
+ "can-access-via-teams": true,
+ "can-create-module": true,
+ "can-create-team": false,
+ "can-create-workspace": true,
+ "can-manage-users": true,
+ "can-manage-subscription": true,
+ "can-manage-sso": false,
+ "can-update-oauth": true,
+ "can-update-sentinel": false,
+ "can-update-ssh-keys": true,
+ "can-update-api-token": true,
+ "can-traverse": true,
+ "can-start-trial": true,
+ "can-update-agent-pools": false,
+ "can-manage-tags": true,
+ "can-manage-public-modules": true,
+ "can-manage-public-providers": false,
+ "can-manage-run-tasks": false,
+ "can-read-run-tasks": false,
+ "can-create-provider": false,
+ "can-create-project": true
+ },
+ "fair-run-queuing-enabled": true,
+ "saml-enabled": false,
+ "owners-team-saml-role-id": null,
+ "two-factor-conformant": false,
+ "assessments-enforced": false,
+ "default-execution-mode": "remote"
+ },
+ "relationships": {
+ "default-agent-pool": {
+ "data": null
+ },
+ "oauth-tokens": {
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/oauth-tokens"
+ }
+ },
+ "authentication-token": {
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/authentication-token"
+ }
+ },
+ "entitlement-set": {
+ "data": {
+ "id": "org-WV6DfwfxxXvLfvfs",
+ "type": "entitlement-sets"
+ },
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/entitlement-set"
+ }
+ },
+ "subscription": {
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/subscription"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/hashicorp"
+ }
+ }
+}
+```
+
+## Create an Organization
+
+`POST /organizations`
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "organizations"`) | The organization was successfully created |
+| [404][] | [JSON API error object][] | Organization not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------------------------------------------------- | ------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"organizations"` |
+| `data.attributes.name` | string | | Name of the organization |
+| `data.attributes.email` | string | | Admin email address |
+| `data.attributes.session-timeout` | integer | 20160 | Session timeout after inactivity (minutes) |
+| `data.attributes.session-remember` | integer | 20160 | Session expiration (minutes) |
+| `data.attributes.collaborator-auth-policy` | string | password | Authentication policy (`password` or `two_factor_mandatory`) |
+| `data.attributes.cost-estimation-enabled` | boolean | false | Whether or not the cost estimation feature is enabled for all workspaces in the organization. Defaults to false. In Terraform Enterprise, you must also enable cost estimation in [Site Administration](/terraform/enterprise/admin/application/integration#cost-estimation-integration). |
+| `data.attributes.send-passing-statuses-for-untriggered-speculative-plans` | boolean | false | Whether or not to send VCS status updates for untriggered speculative plans. This can be useful if large numbers of untriggered workspaces are exhausting request limits for connected version control service providers like GitHub. Defaults to false. In Terraform Enterprise, this setting is always false and cannot be changed but is also available in Site Administration. |
+| `data.attributes.aggregated-commit-status-enabled` | boolean | true | Whether or not to aggregate VCS status updates for triggered workspaces. This is useful for monorepo projects with configuration spanning many workspaces. Defaults to `true`. You cannot use this option if `send-passing-statuses-for-untriggered-speculative-plans` is set to `true`. |
+| `data.attributes.speculative-plan-management-enabled` | boolean | true | Whether or not to enable [Automatically cancel plan-only runs](/terraform/enterprise/users-teams-organizations/organizations/vcs-speculative-plan-management). Defaults to `true`. |
+| `data.attributes.owners-team-saml-role-id` | string | (nothing) | **Optional.** **SAML only** The name of the ["owners" team](/terraform/enterprise/saml/team-membership#managing-membership-of-the-owners-team) |
+| `data.attributes.assessments-enforced` | boolean | (false) | Whether or not to compel health assessments for all eligible workspaces. When true, health assessments occur on all compatible workspaces, regardless of the value of the workspace setting `assessments-enabled`. When false, health assessments only occur for workspaces that opt in by setting `assessments-enabled: true`. |
+| `data.attributes.allow-force-delete-workspaces` | boolean | (false) | Whether workspace administrators can [delete workspaces with resources under management](/terraform/enterprise/users-teams-organizations/organizations#general). If false, only organization owners may delete these workspaces. |
+| `data.attributes.default-execution-mode` | boolean | `remote` | Which [execution mode](/terraform/enterprise/workspaces/settings#execution-mode) to use by default. Valid values are `remote`, `local`, and `agent`. |
+| `data.attributes.default-agent-pool-id` | string | (previous value) | Required when `default-execution-mode` is set to `agent`. The ID of the agent pool belonging to the organization. Do _not_ specify this value if you set `execution-mode` to `remote` or `local`. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "organizations",
+ "attributes": {
+ "name": "hashicorp",
+ "email": "user@example.com"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations
+```
+
+### Sample Response
+
+**Note:** Only HCP Terraform organizations return the `two-factor-conformant` and `assessments-enforced` properties.
+
+```json
+{
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations",
+ "attributes": {
+ "external-id": "org-Bzyc2JuegvVLAibn",
+ "created-at": "2021-08-30T18:09:57.561Z",
+ "email": "user@example.com",
+ "session-timeout": null,
+ "session-remember": null,
+ "collaborator-auth-policy": "password",
+ "plan-expired": false,
+ "plan-expires-at": null,
+ "plan-is-trial": false,
+ "plan-is-enterprise": false,
+ "cost-estimation-enabled": false,
+ "send-passing-statuses-for-untriggered-speculative-plans": false,
+ "aggregated-commit-status-enabled": true,
+ "speculative-plan-management-enabled": true,
+ "allow-force-delete-workspaces": false,
+ "name": "hashicorp",
+ "permissions": {
+ "can-update": true,
+ "can-destroy": true,
+ "can-access-via-teams": true,
+ "can-create-module": true,
+ "can-create-team": false,
+ "can-create-workspace": true,
+ "can-manage-users": true,
+ "can-manage-subscription": true,
+ "can-manage-sso": false,
+ "can-update-oauth": true,
+ "can-update-sentinel": false,
+ "can-update-ssh-keys": true,
+ "can-update-api-token": true,
+ "can-traverse": true,
+ "can-start-trial": true,
+ "can-update-agent-pools": false,
+ "can-manage-tags": true,
+ "can-manage-public-modules": true,
+ "can-manage-public-providers": false,
+ "can-manage-run-tasks": false,
+ "can-read-run-tasks": false,
+ "can-create-provider": false,
+ "can-create-project": true
+ },
+ "fair-run-queuing-enabled": true,
+ "saml-enabled": false,
+ "owners-team-saml-role-id": null,
+ "two-factor-conformant": false,
+ "assessments-enforced": false,
+ "default-execution-mode": "remote"
+ },
+ "relationships": {
+ "default-agent-pool": {
+ "data": null
+ },
+ "oauth-tokens": {
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/oauth-tokens"
+ }
+ },
+ "authentication-token": {
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/authentication-token"
+ }
+ },
+ "entitlement-set": {
+ "data": {
+ "id": "org-Bzyc2JuegvVLAibn",
+ "type": "entitlement-sets"
+ },
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/entitlement-set"
+ }
+ },
+ "subscription": {
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/subscription"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/hashicorp"
+ }
+ },
+ "included": [
+ {
+ "id": "org-Bzyc2JuegvVLAibn",
+ "type": "entitlement-sets",
+ "attributes": {
+ "agents": false,
+ "audit-logging": false,
+ "configuration-designer": true,
+ "cost-estimation": false,
+ "global-run-tasks": false,
+ "module-tests-generation": false,
+ "operations": true,
+ "policy-enforcement": false,
+ "policy-limit": null,
+ "policy-mandatory-enforcement-limit": null,
+ "policy-set-limit": null,
+ "private-module-registry": true,
+ "run-task-limit": null,
+ "run-task-mandatory-enforcement-limit": null,
+ "run-task-workspace-limit": null,
+ "run-tasks": false,
+ "self-serve-billing": true,
+ "sentinel": false,
+ "sso": false,
+ "state-storage": true,
+ "teams": false,
+ "usage-reporting": false,
+ "user-limit": 5,
+ "vcs-integrations": true,
+ "versioned-policy-set-limit": null
+ },
+ "links": {
+ "self": "/api/v2/entitlement-sets/org-Bzyc2JuegvVLAibn"
+ }
+ }
+ ]
+}
+```
+
+## Update an Organization
+
+`PATCH /organizations/:organization_name`
+
+| Parameter | Description |
+| -------------------- | -------------------------------------- |
+| `:organization_name` | The name of the organization to update |
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "organizations"`) | The organization was successfully updated |
+| [404][] | [JSON API error object][] | Organization not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| ------------------------------------------------------------------------- | ------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"organizations"` |
+| `data.attributes.name` | string | | Name of the organization |
+| `data.attributes.email` | string | | Admin email address |
+| `data.attributes.session-timeout` | integer | 20160 | Session timeout after inactivity (minutes) |
+| `data.attributes.session-remember` | integer | 20160 | Session expiration (minutes) |
+| `data.attributes.collaborator-auth-policy` | string | password | Authentication policy (`password` or `two_factor_mandatory`) |
+| `data.attributes.cost-estimation-enabled` | boolean | false | Whether or not the cost estimation feature is enabled for all workspaces in the organization. Defaults to false. In Terraform Enterprise, you must also enable cost estimation in [Site Administration](/terraform/enterprise/admin/application/integration#cost-estimation-integration). |
+| `data.attributes.send-passing-statuses-for-untriggered-speculative-plans` | boolean | false | Whether or not to send VCS status updates for untriggered speculative plans. This can be useful if large numbers of untriggered workspaces are exhausting request limits for connected version control service providers like GitHub. Defaults to false. In Terraform Enterprise, this setting is always false and cannot be changed but is also available in Site Administration. |
+| `data.attributes.aggregated-commit-status-enabled` | boolean | true | Whether or not to aggregate VCS status updates for triggered workspaces. This is useful for monorepo projects with configuration spanning many workspaces. Defaults to `true`. You cannot use this option if `send-passing-statuses-for-untriggered-speculative-plans` is set to `true`. |
+| `data.attributes.speculative-plan-management-enabled` | boolean | true | Whether or not to enable [Automatically cancel plan-only runs](/terraform/enterprise/users-teams-organizations/organizations/vcs-speculative-plan-management). Defaults to `true`. |
+| `data.attributes.owners-team-saml-role-id` | string | (nothing) | **Optional.** **SAML only** The name of the ["owners" team](/terraform/enterprise/saml/team-membership#managing-membership-of-the-owners-team) |
+| `data.attributes.assessments-enforced` | boolean | false | Whether or not to compel health assessments for all eligible workspaces. When true, health assessments occur on all compatible workspaces, regardless of the value of the workspace setting `assessments-enabled`. When false, health assessments only occur for workspaces that opt in by setting `assessments-enabled: true`. |
+| `data.attributes.allow-force-delete-workspaces` | boolean | false | Whether workspace administrators can [delete workspaces with resources under management](/terraform/enterprise/users-teams-organizations/organizations#general). If false, only organization owners may delete these workspaces. |
+| `data.attributes.default-execution-mode` | boolean | `remote` | Which [execution mode](/terraform/enterprise/workspaces/settings#execution-mode) to use by default. Valid values are `remote`, `local`, and `agent`. |
+| `data.attributes.default-agent-pool-id` | string | (previous value) | Required when `default-execution-mode` is set to `agent`. The ID of the agent pool belonging to the organization. Do _not_ specify this value if you set `execution-mode` to `remote` or `local`. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "organizations",
+ "attributes": {
+ "email": "admin@example.com"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/hashicorp
+```
+
+### Sample Response
+
+**Note:** The `two-factor-conformant` and `assessments-enforced` properties are only returned from HCP Terraform organizations.
+
+```json
+{
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations",
+ "attributes": {
+ "external-id": "org-Bzyc2JuegvVLAibn",
+ "created-at": "2021-08-30T18:09:57.561Z",
+ "email": "admin@example.com",
+ "session-timeout": null,
+ "session-remember": null,
+ "collaborator-auth-policy": "password",
+ "plan-expired": false,
+ "plan-expires-at": null,
+ "plan-is-trial": false,
+ "plan-is-enterprise": false,
+ "cost-estimation-enabled": false,
+ "send-passing-statuses-for-untriggered-speculative-plans": false,
+ "aggregated-commit-status-enabled": true,
+ "speculative-plan-management-enabled": true,
+ "name": "hashicorp",
+ "permissions": {
+ "can-update": true,
+ "can-destroy": true,
+ "can-access-via-teams": true,
+ "can-create-module": true,
+ "can-create-team": false,
+ "can-create-workspace": true,
+ "can-manage-users": true,
+ "can-manage-subscription": true,
+ "can-manage-sso": false,
+ "can-update-oauth": true,
+ "can-update-sentinel": false,
+ "can-update-ssh-keys": true,
+ "can-update-api-token": true,
+ "can-traverse": true,
+ "can-start-trial": true,
+ "can-update-agent-pools": false,
+ "can-manage-tags": true,
+ "can-manage-public-modules": true,
+ "can-manage-public-providers": false,
+ "can-manage-run-tasks": false,
+ "can-read-run-tasks": false,
+ "can-create-provider": false,
+ "can-create-project": true
+ },
+ "fair-run-queuing-enabled": true,
+ "saml-enabled": false,
+ "owners-team-saml-role-id": null,
+ "two-factor-conformant": false,
+ "assessments-enforced": false,
+ "default-execution-mode": "remote"
+ },
+ "relationships": {
+ "default-agent-pool": {
+ "data": null
+ },
+ "oauth-tokens": {
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/oauth-tokens"
+ }
+ },
+ "authentication-token": {
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/authentication-token"
+ }
+ },
+ "entitlement-set": {
+ "data": {
+ "id": "org-Bzyc2JuegvVLAibn",
+ "type": "entitlement-sets"
+ },
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/entitlement-set"
+ }
+ },
+ "subscription": {
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/subscription"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/hashicorp"
+ }
+ }
+}
+```
+
+## Destroy an Organization
+
+`DELETE /organizations/:organization_name`
+
+| Parameter | Description |
+| -------------------- | --------------------------------------- |
+| `:organization_name` | The name of the organization to destroy |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------- |
+| [204][] | | The organization was successfully destroyed |
+| [404][] | [JSON API error object][] | Organization not found or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/organizations/hashicorp
+```
+
+### Sample Response
+
+The response body will be empty if successful.
+
+## Show the Entitlement Set
+
+This endpoint shows the [entitlements](/terraform/enterprise/api-docs#feature-entitlements) for an organization.
+
+`GET /organizations/:organization_name/entitlement-set`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------ |
+| `:organization_name` | The name of the organization's entitlement set to view |
+
+| Status | Response | Reason |
+| ------- | -------------------------------------------------- | ------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "entitlement-sets"`) | The request was successful |
+| [404][] | [JSON API error object][] | Organization not found or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/hashicorp/entitlement-set
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "org-Bzyc2JuegvVLAibn",
+ "type": "entitlement-sets",
+ "attributes": {
+ "agents": false,
+ "audit-logging": false,
+ "configuration-designer": true,
+ "cost-estimation": false,
+ "global-run-tasks": false,
+ "module-tests-generation": false,
+ "operations": true,
+ "policy-enforcement": false,
+ "policy-limit": 5,
+ "policy-mandatory-enforcement-limit": null,
+ "policy-set-limit": 1,
+ "private-module-registry": true,
+ "private-policy-agents": false,
+ "private-vcs": false,
+ "run-task-limit": 1,
+ "run-task-mandatory-enforcement-limit": 1,
+ "run-task-workspace-limit": 10,
+ "run-tasks": false,
+ "self-serve-billing": true,
+ "sentinel": false,
+ "sso": false,
+ "state-storage": true,
+ "teams": false,
+ "usage-reporting": false,
+ "user-limit": 5,
+ "vcs-integrations": true,
+ "versioned-policy-set-limit": null
+ },
+ "links": {
+ "self": "/api/v2/entitlement-sets/org-Bzyc2JuegvVLAibn"
+ }
+ }
+}
+```
+
+## Show Module Producers
+
+
+This endpoint is exclusive to Terraform Enterprise, and not available in HCP Terraform.
+
+
+This endpoint shows organizations that are configured to share modules with an organization through [Module Sharing](/terraform/enterprise/admin/application/module-sharing).
+
+`GET /organizations/:organization_name/relationships/module-producers`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------- |
+| `:organization_name` | The name of the organization's module producers to view |
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | ------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "organizations"`) | The request was successful |
+| [404][] | [JSON API error object][] | Organization not found or user unauthorized to perform action |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | -------------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 module producers per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://tfe.example.com/api/v2/organizations/hashicorp/relationships/module-producers
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "hc-nomad",
+ "type": "organizations",
+ "attributes": {
+ "name": "hc-nomad",
+ "external-id": "org-ArQSQMAkFQsSUZjB"
+ },
+ "links": {
+ "self": "/api/v2/organizations/hc-nomad"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://tfe.example.com/api/v2/organizations/hashicorp/relationships/module-producers?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://tfe.example.com/api/v2/organizations/hashicorp/relationships/module-producers?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://tfe.example.com/api/v2/organizations/hashicorp/relationships/module-producers?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 1
+ }
+ }
+}
+```
+
+## Show data retention policy
+
+
+This endpoint is exclusive to Terraform Enterprise and is not available in HCP Terraform.
+
+
+`GET /organizations/:organization_name/relationships/data-retention-policy`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to show the data retention policy for. |
+
+This endpoint shows the data retention policy set explicitly on the organization.
+
+When no data retention policy is set for the organization, the endpoint returns the default policy configured for the Terraform Enterprise installation. Read more about [organization data retention policies](/terraform/enterprise/users-teams-organizations/organizations#data-retention-policies).
+
+For additional information, refer to [Data Retention Policy Types](/terraform/enterprise/api-docs/data-retention-policies#data-retention-policy-types) in the Terraform Enterprise documentation.
+
+## Create or update data retention policy
+
+
+This endpoint is exclusive to Terraform Enterprise and is not available in HCP Terraform.
+
+
+`POST /organizations/:organization_name/relationships/data-retention-policy`
+
+| Parameter | Description |
+| -------------------- | --------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to update the data retention policy for. |
+
+This endpoint creates a data retention policy for an organization or updates the existing policy.
+
+Read more about [organization data retention policies](/terraform/enterprise/users-teams-organizations/organizations#data-retention-policies).
+
+Refer to [Data Retention Policy API](/terraform/enterprise/api-docs/data-retention-policies#create-or-update-data-retention-policy) in the Terraform Enterprise documentation for details.
+
+## Remove data retention policy
+
+
+This endpoint is exclusive to Terraform Enterprise and is not available in HCP Terraform.
+
+
+`DELETE /organizations/:organization_name/relationships/data-retention-policy`
+
+| Parameter | Description |
+| -------------------- | --------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to remove the data retention policy for. |
+
+This endpoint removes the data retention policy explicitly set on an organization.
+When the data retention policy is deleted, the organization inherits the default policy configured for the Terraform Enterprise installation. Refer to [Data Retention Policies](/terraform/enterprise/application-administration/general#data-retention-policies) for additional information.
+
+Refer to [Data Retention Policies](/terraform/enterprise/users-teams-organizations/organizations#data-retention-policies) for information about configuring data retention policies for an organization.
+
+Refer to [Data Retention Policy API](/terraform/enterprise/api-docs/data-retention-policies#remove-data-retention-policy) in the Terraform Enterprise documentation for details.
+
+## Available Related Resources
+
+The GET endpoints above can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource Name | Description |
+| ----------------- | ------------------------------------------------------------------------------------------ |
+| `entitlement_set` | The entitlement set that determines which HCP Terraform features the organization can use. |
+
+## Relationships
+
+The following relationships may be present in various responses.
+
+| Resource Name | Description |
+| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `module-producers` | Other organizations configured to share modules with the organization. |
+| `oauth-tokens` | OAuth tokens associated with VCS configurations for the organization. |
+| `authentication-token` | The API token for an organization. |
+| `entitlement-set` | The entitlement set that determines which HCP Terraform features the organization can use. |
+| `subscription` | The current subscription for an organization. |
+| `default-agent-pool` | An organization's default agent pool. Set this value if your `default-execution-mode` is `agent`. |
+| `data-retention-policy` | Specifies an organization's data retention policy. Refer to [Data Retention Policy APIs](/terraform/enterprise/api-docs/data-retention-policies) in the Terraform Enterprise documentation for more details. |
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/plan-exports.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/plan-exports.mdx
new file mode 100644
index 0000000000..dabfc4fd47
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/plan-exports.mdx
@@ -0,0 +1,226 @@
+---
+page_title: /plan-exports API reference for Terraform Enterprise
+description: >-
+ Use the `/plan-exports` endpoint to manage plan exports for a Terraform run.
+ Create and show plan exports, or download and delete exported plan data.
+source: terraform-docs-common
+---
+
+# Plan exports API reference
+
+Plan exports allow users to download data exported from the plan of a Run in a Terraform workspace. Currently, the only supported format for exporting plan data is to generate mock data for Sentinel.
+
+## Create a plan export
+
+`POST /plan-exports`
+
+This endpoint exports data from a plan in the specified format. The export process is asynchronous, and the resulting data becomes downloadable when its status is `"finished"`. The data is then available for one hour before expiring. After the hour is up, a new export can be created.
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "plan-exports"`) | Successfully created a plan export |
+| [404][] | [JSON API error object][] | Plan not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.), or a plan export of the provided `data-type` is already pending or downloadable for this plan |
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------ | ------ | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"plan-exports"`. |
+| `data.attributes.data-type` | string | | The format for the export. Currently, the only supported format is `"sentinel-mock-bundle-v0"`. |
+| `data.relationships.plan.data` | object | | A JSON API relationship object that represents the plan being exported. This object must have a `type` of `plans`, and the `id` of a finished Terraform plan that does not already have a downloadable export of the specified `data-type` (e.g: `{"type": "plans", "id": "plan-8F5JFydVYAmtTjET"}`) |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "plan-exports",
+ "attributes": {
+ "data-type": "sentinel-mock-bundle-v0"
+ },
+ "relationships": {
+ "plan": {
+ "data": {
+ "id": "plan-8F5JFydVYAmtTjET",
+ "type": "plans"
+ }
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/plan-exports
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "pe-3yVQZvHzf5j3WRJ1",
+ "type": "plan-exports",
+ "attributes": {
+ "data-type": "sentinel-mock-bundle-v0",
+ "status": "queued",
+ "status-timestamps": {
+ "queued-at": "2019-03-04T22:29:53+00:00",
+ },
+ },
+ "relationships": {
+ "plan": {
+ "data": {
+ "id": "plan-8F5JFydVYAmtTjET",
+ "type": "plans"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/plan-exports/pe-3yVQZvHzf5j3WRJ1",
+ }
+ }
+}
+```
+
+## Show a plan export
+
+`GET /plan-exports/:id`
+
+| Parameter | Description |
+| --------- | ---------------------------------- |
+| `id` | The ID of the plan export to show. |
+
+There is no endpoint to list plan exports. You can find IDs for plan exports in the
+`relationships.exports` property of a plan object.
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------- | ------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "plan-exports"`) | The request was successful |
+| [404][] | [JSON API error object][] | Plan export not found, or user unauthorized to perform action |
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/plan-exports/pe-3yVQZvHzf5j3WRJ1
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "pe-3yVQZvHzf5j3WRJ1",
+ "type": "plan-exports",
+ "attributes": {
+ "data-type": "sentinel-mock-bundle-v0",
+ "status": "finished",
+ "status-timestamps": {
+ "queued-at": "2019-03-04T22:29:53+00:00",
+ "finished-at": "2019-03-04T22:29:58+00:00",
+ "expired-at": "2019-03-04T23:29:58+00:00"
+ },
+ },
+ "relationships": {
+ "plan": {
+ "data": {
+ "id": "plan-8F5JFydVYAmtTjET",
+ "type": "plans"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/plan-exports/pe-3yVQZvHzf5j3WRJ1",
+ "download": "/api/v2/plan-exports/pe-3yVQZvHzf5j3WRJ1/download"
+ }
+ }
+}
+```
+
+## Download exported plan data
+
+`GET /plan-exports/:id/download`
+
+This endpoint generates a temporary URL to the location of the exported plan data in a `.tar.gz` archive, and then redirects to that link. If using a client that can follow redirects, you can use this endpoint to save the `.tar.gz` archive locally without needing to save the temporary URL.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------- |
+| [302][] | HTTP Redirect | Plan export found and temporary download URL generated |
+| [404][] | [JSON API error object][] | Plan export not found, or user unauthorized to perform action |
+
+[302]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/302
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --location \
+ https://app.terraform.io/api/v2/plan-exports/pe-3yVQZvHzf5j3WRJ1/download \
+ > export.tar.gz
+```
+
+## Delete exported plan data
+
+`DELETE /plan-exports/:id`
+
+Plan exports expire after being available for one hour, but they can be deleted manually as well.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------- |
+| [204][] | No content | Plan export deleted successfully |
+| [404][] | [JSON API error object][] | Plan export not found, or user unauthorized to perform action |
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ -X DELETE \
+ https://app.terraform.io/api/v2/plan-exports/pe-3yVQZvHzf5j3WRJ1
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/plans.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/plans.mdx
new file mode 100644
index 0000000000..aee7e4eaef
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/plans.mdx
@@ -0,0 +1,203 @@
+---
+page_title: /plans API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/plans` endpoint to read a Terraform run
+ plan or generate JSON-formatted execution plans.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[307]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/307
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Plans API reference
+
+A plan represents the execution plan of a Run in a Terraform workspace.
+
+## Attributes
+
+### Plan States
+
+The plan state is found in `data.attributes.status`, and you can reference the following list of possible states.
+
+| State | Description |
+| ------------------------- | ----------------------------------------------------------------------------- |
+| `pending` | The initial status of a plan once it has been created. |
+| `managed_queued`/`queued` | The plan has been queued, awaiting backend service capacity to run terraform. |
+| `running` | The plan is running. |
+| `errored` | The plan has errored. This is a final state. |
+| `canceled` | The plan has been canceled. This is a final state. |
+| `finished` | The plan has completed successfully. This is a final state. |
+| `unreachable` | The plan will not run. This is a final state. |
+
+## Show a plan
+
+`GET /plans/:id`
+
+| Parameter | Description |
+| --------- | --------------------------- |
+| `id` | The ID of the plan to show. |
+
+There is no endpoint to list plans. You can find the ID for a plan in the
+`relationships.plan` property of a run object.
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | ------------------------------------------------------ |
+| [200][] | [JSON API document][] (`type: "plans"`) | The request was successful |
+| [404][] | [JSON API error object][] | Plan not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/plans/plan-8F5JFydVYAmtTjET
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "plan-8F5JFydVYAmtTjET",
+ "type": "plans",
+ "attributes": {
+ "execution-details": {
+ "mode": "remote",
+ },
+ "generated-configuration": false,
+ "has-changes": true,
+ "resource-additions": 0,
+ "resource-changes": 1,
+ "resource-destructions": 0,
+ "resource-imports": 0,
+ "status": "finished",
+ "status-timestamps": {
+ "queued-at": "2018-07-02T22:29:53+00:00",
+ "pending-at": "2018-07-02T22:29:53+00:00",
+ "started-at": "2018-07-02T22:29:54+00:00",
+ "finished-at": "2018-07-02T22:29:58+00:00"
+ },
+ "log-read-url": "https://archivist.terraform.io/v1/object/dmF1bHQ6djE6OFA1eEdlSFVHRSs4YUcwaW83a1dRRDA0U2E3T3FiWk1HM2NyQlNtcS9JS1hHN3dmTXJmaFhEYTlHdTF1ZlgxZ2wzVC9kVTlNcjRPOEJkK050VFI3U3dvS2ZuaUhFSGpVenJVUFYzSFVZQ1VZYno3T3UyYjdDRVRPRE5pbWJDVTIrNllQTENyTndYd1Y0ak1DL1dPVlN1VlNxKzYzbWlIcnJPa2dRRkJZZGtFeTNiaU84YlZ4QWs2QzlLY3VJb3lmWlIrajF4a1hYZTlsWnFYemRkL2pNOG9Zc0ZDakdVMCtURUE3dDNMODRsRnY4cWl1dUN5dUVuUzdnZzFwL3BNeHlwbXNXZWRrUDhXdzhGNnF4c3dqaXlZS29oL3FKakI5dm9uYU5ZKzAybnloREdnQ3J2Rk5WMlBJemZQTg"
+ },
+ "relationships": {
+ "state-versions": {
+ "data": []
+ }
+ },
+ "links": {
+ "self": "/api/v2/plans/plan-8F5JFydVYAmtTjET",
+ "json-output": "/api/v2/plans/plan-8F5JFydVYAmtTjET/json-output"
+ }
+ }
+}
+```
+
+_Using HCP Terraform agents_
+
+[HCP Terraform agents](/terraform/enterprise/api-docs/agents) allow HCP Terraform to communicate with isolated, private, or on-premises infrastructure. When a workspace is set to use the agent execution mode, the plan response will include additional details about the agent pool and agent used.
+
+```json
+{
+ "data": {
+ "id": "plan-8F5JFydVYAmtTjET",
+ "type": "plans",
+ "attributes": {
+ "execution-details": {
+ "agent-id": "agent-S1Y7tcKxXPJDQAvq",
+ "agent-name": "agent_01",
+ "agent-pool-id": "apool-Zigq2VGreKq7nwph",
+ "agent-pool-name": "first-pool",
+ "mode": "agent",
+ },
+ "generated-configuration": false,
+ "has-changes": true,
+ "resource-additions": 0,
+ "resource-changes": 1,
+ "resource-destructions": 0,
+ "resource-imports": 0,
+ "status": "finished",
+ "status-timestamps": {
+ "queued-at": "2018-07-02T22:29:53+00:00",
+ "pending-at": "2018-07-02T22:29:53+00:00",
+ "started-at": "2018-07-02T22:29:54+00:00",
+ "finished-at": "2018-07-02T22:29:58+00:00"
+ },
+ "log-read-url": "https://archivist.terraform.io/v1/object/dmF1bHQ6djE6OFA1eEdlSFVHRSs4YUcwaW83a1dRRDA0U2E3T3FiWk1HM2NyQlNtcS9JS1hHN3dmTXJmaFhEYTlHdTF1ZlgxZ2wzVC9kVTlNcjRPOEJkK050VFI3U3dvS2ZuaUhFSGpVenJVUFYzSFVZQ1VZYno3T3UyYjdDRVRPRE5pbWJDVTIrNllQTENyTndYd1Y0ak1DL1dPVlN1VlNxKzYzbWlIcnJPa2dRRkJZZGtFeTNiaU84YlZ4QWs2QzlLY3VJb3lmWlIrajF4a1hYZTlsWnFYemRkL2pNOG9Zc0ZDakdVMCtURUE3dDNMODRsRnY4cWl1dUN5dUVuUzdnZzFwL3BNeHlwbXNXZWRrUDhXdzhGNnF4c3dqaXlZS29oL3FKakI5dm9uYU5ZKzAybnloREdnQ3J2Rk5WMlBJemZQTg"
+ },
+ "relationships": {
+ "state-versions": {
+ "data": []
+ }
+ },
+ "links": {
+ "self": "/api/v2/plans/plan-8F5JFydVYAmtTjET",
+ "json-output": "/api/v2/plans/plan-8F5JFydVYAmtTjET/json-output"
+ }
+ }
+}
+```
+
+## Retrieve the JSON execution plan
+
+`GET /plans/:id/json-output`
+
+`GET /runs/:id/plan/json-output`
+
+These endpoints generate a temporary authenticated URL to the location of the [JSON formatted execution plan](/terraform/internals/json-format#format-summary). When successful, this endpoint responds with a temporary redirect that should be followed. If using a client that can follow redirects, you can use this endpoint to save the `.json` file locally without needing to save the temporary URL.
+
+This temporary URL provided by the redirect has a life of **1 minute**, and should not be relied upon beyond the initial request. If you need repeat access, you should use this endpoint to generate a new URL each time.
+
+-> **Note:** This endpoint is available for plans using Terraform 0.12 and later. For Terraform Enterprise, this endpoint is available from v202005-1, and its stability was improved in v202007-1.
+
+-> **Note:** This endpoint cannot be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens) that has admin level access to the workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ---------------------------------------------------------------- |
+| [204][] | No Content | Plan JSON supported, but plan has not yet completed. |
+| [307][] | Temporary Redirect | Plan JSON found and temporary download URL generated |
+| [422][] | [JSON API error object][] | Plan does not use a supported version of terraform (< 0.12.X) |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --location \
+ https://app.terraform.io/api/v2/plans/plan-8F5JFydVYAmtTjET/json-output |
+ > json-output.json
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/policies.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/policies.mdx
new file mode 100644
index 0000000000..64118b2364
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/policies.mdx
@@ -0,0 +1,564 @@
+---
+page_title: /policies API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/policies` endpoint to list, show, create,
+ upload, update, and delete Sentinel and OPA policies.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Policies API reference
+
+Policies are rules that HCP Terraform enforces on Terraform runs. You can use policies to validate that the Terraform plan complies with security rules and best practices. HCP Terraform policy enforcement lets you use the policy-as-code frameworks Sentinel and Open Policy Agent (OPA) to apply policy checks to HCP Terraform workspaces. Refer to [Policy Enforcement](/terraform/enterprise/policy-enforcement) for more details.
+
+[Policy sets](/terraform/enterprise/policy-enforcement/manage-policy-sets) are collections of policies that you can apply globally or to specific [projects](/terraform/enterprise/projects/manage) and workspaces, in your organization. For each run in the selected workspaces, HCP Terraform checks the Terraform plan against the policy set and displays the results in the UI.
+
+
+
+@include 'tfc-package-callouts/policies.mdx'
+
+
+
+This page documents the API endpoints to create, read, update, and delete policies in an organization. To manage policy sets, use the [Policy Sets API](/terraform/enterprise/api-docs/policy-sets). To manage the policy results, use the [Runs API](/terraform/enterprise/api-docs/run).
+
+## Create a Policy
+
+`POST /organizations/:organization_name/policies`
+
+| Parameter | Description |
+| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The organization to create the policy in. The organization must already exist in the system, and the token authenticating the API request must have permission to manage policies. (([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions)) |
+
+\[permissions-citation]: #intentionally-unused---keep-for-maintainers)
+
+This creates a new policy object for the organization, but does not upload the actual policy code. After creation, you must use the [Upload a Policy endpoint (below)](#upload-a-policy) with the new policy's upload path. (This endpoint's response body includes the upload path in its `links.upload` property.)
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------ | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "policies"`) | Successfully created a policy |
+| [404][] | [JSON API error object][] | Organization not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| --------------------------------------- | -------------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"policies"`. |
+| `data.attributes.name` | string | | The name of the policy, which can include letters, numbers, `-`, and `_`. You cannot modify this name after creation. |
+| `data.attributes.description` | string | `null` | Text describing the policy's purpose. This field supports Markdown and appears in the HCP Terraform UI. |
+| `data.attributes.kind` | string | `sentinel` | The policy-as-code framework for the policy. Valid values are `"sentinel"` and `"opa"`. |
+| `data.attributes.query` | string | | The OPA query to run. Only valid for OPA policies. |
+| `data.attributes.enforcement-level` | string | | The enforcement level of the policy. For Sentinel, valid values are `"hard-mandatory"`, `"soft-mandatory"`, and `"advisory"`. For OPA, Valid values are `"mandatory"`and `"advisory"`. Refer to [Managing Policies](/terraform/enterprise/policy-enforcement/manage-policy-sets) for details. |
+| `data.attributes.enforce` | array\[object] | | **DEPRECATED** Use `enforcement-level` instead. An array of enforcement configurations that map policy file paths to their enforcement modes. Policies support a single file, so this array should consist of a single element. For Sentinel, if the path in the enforcement map does not match the Sentinel policy (`.sentinel`), then HCP Terraform uses the default `hard-mandatory` enforcement level. For OPA, the default enforcement level is `advisory`. |
+| `data.attributes.enforce[].path` | string | | **DEPRECATED** For Sentinel, must be `.sentinel`, where `` has the same value as `data.attributes.name`. For OPA, must be `.rego`. |
+| `data.attributes.enforce[].mode` | string | | **DEPRECATED** Use `enforcement-level` instead. The enforcement level of the policy. For Sentinel, valid values are `"hard-mandatory"`, `"soft-mandatory"`, and `"advisory"`. For OPA, Valid values are `"mandatory"`and `"advisory"`. Refer to [Managing Policies](/terraform/enterprise/policy-enforcement/manage-policy-sets) for details. |
+| `data.relationships.policy-sets.data[]` | array\[object] | `[]` | A list of resource identifier objects to define which policy sets include the new policy. These objects must contain `id` and `type` properties, and the `type` property must be `policy-sets`. For example,`{ "id": "polset-3yVQZvHzf5j3WRJ1","type": "policy-sets" }`. |
+
+### Sample Payload (Sentinel)
+
+```json
+{
+ "data": {
+ "attributes": {
+ "enforcement-level": "hard-mandatory",
+ "name": "my-example-policy",
+ "description": "An example policy.",
+ "kind": "sentinel"
+ },
+ "relationships": {
+ "policy-sets": {
+ "data": [
+ { "id": "polset-3yVQZvHzf5j3WRJ1", "type": "policy-sets" }
+ ]
+ }
+ },
+ "type": "policies"
+ }
+}
+```
+
+### Sample Payload (OPA)
+
+-> **Note**: We have deprecated the `enforce` property in requests and responses but continue to provide it for backward compatibility. The below sample uses the deprecated `enforce` property.
+
+```json
+{
+ "data": {
+ "attributes": {
+ "enforce": [
+ {
+ "path": "my-example-policy.rego",
+ "mode": "advisory"
+ }
+ ],
+ "name": "my-example-policy",
+ "description": "An example policy.",
+ "kind": "opa",
+ "query": "terraform.main"
+ },
+ "relationships": {
+ "policy-sets": {
+ "data": [
+ { "id": "polset-3yVQZvHzf5j3WRJ1", "type": "policy-sets" }
+ ]
+ }
+ },
+ "type": "policies"
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/policies
+```
+
+### Sample Response (Sentinel)
+
+```json
+{
+ "data": {
+ "id":"pol-u3S5p2Uwk21keu1s",
+ "type":"policies",
+ "attributes": {
+ "name":"my-example-policy",
+ "description":"An example policy.",
+ "enforcement-level":"advisory",
+ "enforce": [
+ {
+ "path":"my-example-policy.sentinel",
+ "mode":"advisory"
+ }
+ ],
+ "policy-set-count": 1,
+ "updated-at": null
+ },
+ "relationships": {
+ "organization": {
+ "data": { "id": "my-organization", "type": "organizations" }
+ },
+ "policy-sets": {
+ "data": [
+ { "id": "polset-3yVQZvHzf5j3WRJ1", "type": "policy-sets" }
+ ]
+ }
+ },
+ "links": {
+ "self":"/api/v2/policies/pol-u3S5p2Uwk21keu1s",
+ "upload":"/api/v2/policies/pol-u3S5p2Uwk21keu1s/upload"
+ }
+ }
+}
+```
+
+### Sample Response (OPA)
+
+```json
+{
+ "data": {
+ "id":"pol-u3S5p2Uwk21keu1s",
+ "type":"policies",
+ "attributes": {
+ "name":"my-example-policy",
+ "description":"An example policy.",
+ "kind": "opa",
+ "query": "terraform.main",
+ "enforcement-level": "advisory",
+ "enforce": [
+ {
+ "path":"my-example-policy.rego",
+ "mode":"advisory"
+ }
+ ],
+ "policy-set-count": 1,
+ "updated-at": null
+ },
+ "relationships": {
+ "organization": {
+ "data": { "id": "my-organization", "type": "organizations" }
+ },
+ "policy-sets": {
+ "data": [
+ { "id": "polset-3yVQZvHzf5j3WRJ1", "type": "policy-sets" }
+ ]
+ }
+ },
+ "links": {
+ "self":"/api/v2/policies/pol-u3S5p2Uwk21keu1s",
+ "upload":"/api/v2/policies/pol-u3S5p2Uwk21keu1s/upload"
+ }
+ }
+}
+```
+
+## Show a Policy
+
+`GET /policies/:policy_id`
+
+| Parameter | Description |
+| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:policy_id` | The ID of the policy to show. Refer to [List Policies](/terraform/enterprise/api-docs/policies#list-policies) for reference information about finding IDs. |
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------ | ------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "policies"`) | The request was successful |
+| [404][] | [JSON API error object][] | Policy not found or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl --request GET \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/policies/pol-oXUppaX2ximkqp8w
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "pol-oXUppaX2ximkqp8w",
+ "type": "policies",
+ "attributes": {
+ "name": "my-example-policy",
+ "description":"An example policy.",
+ "kind": "sentinel",
+ "enforcement-level": "soft-mandatory",
+ "enforce": [
+ {
+ "path": "my-example-policy.sentinel",
+ "mode": "soft-mandatory"
+ }
+ ],
+ "policy-set-count": 1,
+ "updated-at": "2018-09-11T18:21:21.784Z"
+ },
+ "relationships": {
+ "organization": {
+ "data": { "id": "my-organization", "type": "organizations" }
+ },
+ "policy-sets": {
+ "data": [
+ { "id": "polset-3yVQZvHzf5j3WRJ1", "type": "policy-sets" }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/policies/pol-oXUppaX2ximkqp8w",
+ "upload": "/api/v2/policies/pol-oXUppaX2ximkqp8w/upload",
+ "download": "/api/v2/policies/pol-oXUppaX2ximkqp8w/download"
+ }
+ }
+}
+```
+
+## Upload a Policy
+
+`PUT /policies/:policy_id/upload`
+
+| Parameter | Description |
+| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:policy_id` | The ID of the policy to upload code to. Refer to [List Policies](/terraform/enterprise/api-docs/policies#list-policies) for reference information about finding the policy ID. The ID also appears in the response when you create a policy. |
+
+This endpoint uploads code to an existing Sentinel or OPA policy.
+
+-> **Note**: This endpoint does not use JSON-API's conventions for HTTP headers and body serialization.
+
+-> **Note**: This endpoint limits the size of uploaded policies to 10MB. If a larger payload is uploaded, an HTTP 413 error will be returned, and the policy will not be saved. Consider refactoring policies into multiple smaller, more concise documents if you reach this limit.
+
+### Request Body
+
+This PUT endpoint requires the text of a valid Sentinel or OPA policy with a `Content-Type` of `application/octet-stream`.
+
+- Refer to [Defining Sentinel Policies](/terraform/enterprise/policy-enforcement/sentinel) for details about writing Sentinel code.
+- Refer to [Defining OPA Policies](/terraform/enterprise/policy-enforcement/opa) for details about writing OPA code.
+
+### Sample Payload
+
+```plain
+main = rule { true }
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/octet-stream" \
+ --request PUT \
+ --data-binary @payload.file \
+ https://app.terraform.io/api/v2/policies/pol-u3S5p2Uwk21keu1s/upload
+```
+
+## Update a Policy
+
+`PATCH /policies/:policy_id`
+
+| Parameter | Description |
+| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:policy_id` | The ID of the policy to update. Refer to [List Policies](/terraform/enterprise/api-docs/policies#list-policies) for reference information about finding IDs. |
+
+This endpoint can update the enforcement mode of an existing policy. To update the policy code itself, use the upload endpoint.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------ | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "policies"`) | Successfully updated the policy |
+| [404][] | [JSON API error object][] | Policy not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------------- | -------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"policies"`. |
+| `data.attributes.description` | string | `null` | Text describing the policy's purpose. This field supports Markdown and appears in the HCP Terraform UI. |
+| `data.attributes.query` | string | | The OPA query to run. This is only valid for OPA policies. |
+| `data.attributes.enforcement-level` | string | | The enforcement level of the policy. For Sentinel, valid values are `"hard-mandatory"`, `"soft-mandatory"`, and `"advisory"`. For OPA, Valid values are `"mandatory"`and `"advisory"`. Refer to [Managing Policies](/terraform/enterprise/policy-enforcement/manage-policy-sets) for details. |
+| `data.attributes.enforce` | array\[object] | | **DEPRECATED** Use `enforcement-level` instead. An array of enforcement configurations that map policy file paths to their enforcement modes. Policies support a single file, so this array should consist of a single element. For Sentinel, if the path in the enforcement map does not match the Sentinel policy (`.sentinel`), then HCP Terraform uses the default `hard-mandatory` enforcement level. For OPA, the default enforcement level is `advisory`. |
+| `data.attributes.enforce[].path` | string | | **DEPRECATED** For Sentinel, must be `.sentinel`, where `` has the same value as `data.attributes.name`. For OPA, must be `.rego`. |
+| `data.attributes.enforce[].mode` | string | | **DEPRECATED** Use `enforcement-level` instead. The enforcement level of the policy. For Sentinel, valid values are `"hard-mandatory"`, `"soft-mandatory"`, and `"advisory"`. For OPA, Valid values are `"mandatory"`and `"advisory"`. Refer to [Managing Policies](/terraform/enterprise/policy-enforcement/manage-policy-sets) for details. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "enforcement-level": "soft-mandatory"
+ },
+ "type":"policies"
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/policies/pol-u3S5p2Uwk21keu1s
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id":"pol-u3S5p2Uwk21keu1s",
+ "type":"policies",
+ "attributes": {
+ "name":"my-example-policy",
+ "description":"An example policy.",
+ "kind": "sentinel",
+ "enforcement-level": "soft-mandatory",
+ "enforce": [
+ {
+ "path":"my-example-policy.sentinel",
+ "mode":"soft-mandatory"
+ }
+ ],
+ "policy-set-count": 0,
+ "updated-at":"2017-10-10T20:58:04.621Z"
+ },
+ "relationships": {
+ "organization": {
+ "data": { "id": "my-organization", "type": "organizations" }
+ },
+ },
+ "links": {
+ "self":"/api/v2/policies/pol-u3S5p2Uwk21keu1s",
+ "upload":"/api/v2/policies/pol-u3S5p2Uwk21keu1s/upload",
+ "download":"/api/v2/policies/pol-u3S5p2Uwk21keu1s/download"
+ }
+ }
+}
+```
+
+## List Policies
+
+`GET /organizations/:organization_name/policies`
+
+| Parameter | Description |
+| -------------------- | -------------------------------------- |
+| `:organization_name` | The organization to list policies for. |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | Array of [JSON API document][]s (`type: "policies"`) | Success |
+| [404][] | [JSON API error object][] | Organization not found, or user unauthorized to perform action |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters); remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description | |
+| -------------- | --------------------------------------------------------------------------------------------------------------------------------- | - |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. | |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 policies per page. | |
+| `search[name]` | **Optional.** Allows searching the organization's policies by name. | |
+| `filter[kind]` | **Optional.** If specified, restricts results to those with the matching policy kind value. Valid values are `sentinel` and `opa` | |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/v2/organizations/my-organization/policies
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "attributes": {
+ "enforcement-level": "advisory",
+ "enforce": [
+ {
+ "mode": "advisory",
+ "path": "my-example-policy.sentinel"
+ }
+ ],
+ "name": "my-example-policy",
+ "description": "An example policy.",
+ "policy-set-count": 0,
+ "updated-at": "2017-10-10T20:52:13.898Z",
+ "kind": "sentinel"
+ },
+ "id": "pol-u3S5p2Uwk21keu1s",
+ "relationships": {
+ "organization": {
+ "data": { "id": "my-organization", "type": "organizations" }
+ },
+ },
+ "links": {
+ "download": "/api/v2/policies/pol-u3S5p2Uwk21keu1s/download",
+ "self": "/api/v2/policies/pol-u3S5p2Uwk21keu1s",
+ "upload": "/api/v2/policies/pol-u3S5p2Uwk21keu1s/upload"
+ },
+ "type": "policies"
+ },
+ {
+ "id":"pol-vM2rBfj7V2Faq8By",
+ "type":"policies",
+ "attributes":{
+ "name":"policy1",
+ "description":null,
+ "enforcement-level": "advisory",
+ "enforce":[
+ {
+ "path":"policy1.rego",
+ "mode":"advisory"
+ }
+ ],
+ "policy-set-count":1,
+ "updated-at":"2022-09-13T04:57:43.516Z",
+ "kind":"opa",
+ "query":"data.terraform.rules.policy1.rule"
+ },
+ "relationships":{
+ "organization":{
+ "data":{
+ "id":"hashicorp",
+ "type":"organizations"
+ }
+ },
+ "policy-sets":{
+ "data":[
+ {
+ "id":"polset-FYu3k5WY5eecwwdt",
+ "type":"policy-sets"
+ }
+ ]
+ }
+ },
+ "links":{
+ "self":"/api/v2/policies/pol-vM2rBfj7V2Faq8By",
+ "upload":"/api/v2/policies/pol-vM2rBfj7V2Faq8By/upload",
+ "download":"/api/v2/policies/pol-vM2rBfj7V2Faq8By/download"
+ }
+ }
+ ]
+}
+```
+
+## Delete a Policy
+
+`DELETE /policies/:policy_id`
+
+| Parameter | Description |
+| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:policy_id` | The ID of the policy to delete. Refer to [List Policies](/terraform/enterprise/api-docs/policies#list-policies) for reference information about finding IDs. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------- |
+| [204][] | No Content | Successfully deleted the policy |
+| [404][] | [JSON API error object][] | Policy not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/policies/pl-u3S5p2Uwk21keu1s
+```
+
+## Available Related Resources
+
+The GET endpoints above can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource Name | Description |
+| ------------- | ------------------------------------------------------ |
+| `policy_sets` | Policy sets that any returned policies are members of. |
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/policy-checks.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/policy-checks.mdx
new file mode 100644
index 0000000000..621f40d368
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/policy-checks.mdx
@@ -0,0 +1,265 @@
+---
+page_title: /policy-checks API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/policy-checks` endpoint to manage and
+ override the Sentinel policy checks that HCP Terraform performs during a run.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Policy checks API reference
+
+
+
+@include 'tfc-package-callouts/policies.mdx'
+
+
+
+Policy checks are the default workflow for Sentinel. Policy checks use the latest version of the Sentinel runtime and have access to cost estimation data.
+This set of APIs provides endpoints to get, list, and override policy checks.
+
+~> **Warning:** Policy checks are deprecated and will be permanently removed in August 2025. We recommend that you start using policy evaluations to avoid disruptions.
+
+## List Policy Checks
+
+This endpoint lists the policy checks in a run.
+
+-> **Note**: The `sentinel` hash in the `result` attribute structure represents low-level Sentinel details generated by the policy engine. The keys or structure may change over time. Use the data in this hash at your own risk.
+
+`GET /runs/:run_id/policy-checks`
+
+| Parameter | Description |
+| --------- | -------------------------------------------- |
+| `run_id` | The ID of the run to list policy checks for. |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs. If neither pagination query parameters are provided, the endpoint will not be paginated and will return all results.
+
+| Parameter | Description |
+| -------------- | ----------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 policy checks per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/v2/runs/run-CZcmD7eagjhyXavN/policy-checks
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "polchk-9VYRc9bpfJEsnwum",
+ "type": "policy-checks",
+ "attributes": {
+ "result": {
+ "result": false,
+ "passed": 0,
+ "total-failed": 1,
+ "hard-failed": 0,
+ "soft-failed": 1,
+ "advisory-failed": 0,
+ "duration-ms": 0,
+ "sentinel": {...}
+ },
+ "scope": "organization",
+ "status": "soft_failed",
+ "status-timestamps": {
+ "queued-at": "2017-11-29T20:02:17+00:00",
+ "soft-failed-at": "2017-11-29T20:02:20+00:00"
+ },
+ "actions": {
+ "is-overridable": true
+ },
+ "permissions": {
+ "can-override": false
+ }
+ },
+ "relationships": {
+ "run": {
+ "data": {
+ "id": "run-veDoQbv6xh6TbnJD",
+ "type": "runs"
+ }
+ }
+ },
+ "links": {
+ "output": "/api/v2/policy-checks/polchk-9VYRc9bpfJEsnwum/output"
+ }
+ }
+ ]
+}
+```
+
+## Show Policy Check
+
+This endpoint gets information about a specific policy check ID. Policy check IDs can appear in audit logs.
+
+-> **Note**: The `sentinel` hash in the `result` attribute structure represents low-level Sentinel details generated by the policy engine. The keys or structure may change over time. Use the data in this hash at your own risk.
+
+`GET /policy-checks/:id`
+
+| Parameter | Description |
+| --------- | ----------------------------------- |
+| `id` | The ID of the policy check to show. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/v2/policy-checks/polchk-9VYRc9bpfJEsnwum
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "polchk-9VYRc9bpfJEsnwum",
+ "type": "policy-checks",
+ "attributes": {
+ "result": {
+ "result": false,
+ "passed": 0,
+ "total-failed": 1,
+ "hard-failed": 0,
+ "soft-failed": 1,
+ "advisory-failed": 0,
+ "duration-ms": 0,
+ "sentinel": {...}
+ },
+ "scope": "organization",
+ "status": "soft_failed",
+ "status-timestamps": {
+ "queued-at": "2017-11-29T20:02:17+00:00",
+ "soft-failed-at": "2017-11-29T20:02:20+00:00"
+ },
+ "actions": {
+ "is-overridable": true
+ },
+ "permissions": {
+ "can-override": false
+ }
+ },
+ "relationships": {
+ "run": {
+ "data": {
+ "id": "run-veDoQbv6xh6TbnJD",
+ "type": "runs"
+ }
+ }
+ },
+ "links": {
+ "output": "/api/v2/policy-checks/polchk-9VYRc9bpfJEsnwum/output"
+ }
+ }
+}
+```
+
+## Override Policy
+
+This endpoint overrides a soft-mandatory or warning policy.
+
+-> **Note**: The `sentinel` hash in the `result` attribute structure represents low-level Sentinel details generated by the policy engine. The keys or structure may change over time. Use the data in this hash at your own risk.
+
+`POST /policy-checks/:id/actions/override`
+
+| Parameter | Description |
+| --------- | --------------------------------------- |
+| `id` | The ID of the policy check to override. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/policy-checks/polchk-EasPB4Srx5NAiWAU/actions/override
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "polchk-EasPB4Srx5NAiWAU",
+ "type": "policy-checks",
+ "attributes": {
+ "result": {
+ "result": false,
+ "passed": 0,
+ "total-failed": 1,
+ "hard-failed": 0,
+ "soft-failed": 1,
+ "advisory-failed": 0,
+ "duration-ms": 0,
+ "sentinel": {...}
+ },
+ "scope": "organization",
+ "status": "overridden",
+ "status-timestamps": {
+ "queued-at": "2017-11-29T20:13:37+00:00",
+ "soft-failed-at": "2017-11-29T20:13:40+00:00",
+ "overridden-at": "2017-11-29T20:14:11+00:00"
+ },
+ "actions": {
+ "is-overridable": true
+ },
+ "permissions": {
+ "can-override": false
+ }
+ },
+ "links": {
+ "output": "/api/v2/policy-checks/polchk-EasPB4Srx5NAiWAU/output"
+ }
+ }
+}
+```
+
+### Available Related Resources
+
+The GET endpoints above can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource Name | Description |
+| --------------- | ------------------------------------- |
+| `run` | The run this policy check belongs to. |
+| `run.workspace` | The associated workspace of the run. |
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/policy-evaluations.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/policy-evaluations.mdx
new file mode 100644
index 0000000000..9733bfbed1
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/policy-evaluations.mdx
@@ -0,0 +1,288 @@
+---
+page_title: /policy-evaluations API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/policy-evaluations` endpoint to read
+ policy outcomes and evaluations from Sentinel and OPA policies that HCP
+ Terraform performs during a Terraform run.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Policy evaluations API reference
+
+Policy evaluations are run within the [HCP Terraform agents](/terraform/enterprise/api-docs/agents) in HCP Terraform's infrastructure. Policy evaluations do not have access to cost estimation data.
+This set of APIs provides endpoints to list and get policy evaluations and policy outcomes.
+
+## List Policy Evaluations in the Task Stage
+
+Each run passes through several stages of action (pending, plan, policy check, apply, and completion), and shows the progress through those stages as [run states](/terraform/enterprise/run/states).
+This endpoint allows you to list policy evaluations that are part of the task stage.
+
+`GET /task-stages/:task_stage_id/policy-evaluations`
+
+| Parameter | Description |
+| ---------------- | ------------------------- |
+| `:task_stage_id` | The task stage ID to get. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------- |
+| [200][] | [JSON API document][] | Success |
+| [404][] | [JSON API error object][] | Task stage not found |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling does not automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | ----------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint returns the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint returns 20 agent pools per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/task-stages/ts-rL5ZsuwfjqfPJcdi/policy-evaluations
+```
+
+### Sample Response
+
+```json
+{
+ "data":[
+ {
+ "id":"poleval-8Jj9Hfoz892D9WMX",
+ "type":"policy-evaluations",
+ "attributes":{
+ "status":"passed",
+ "policy-kind":"opa",
+ "policy-tool-version": "0.44.0",
+ "result-count": {
+ "advisory-failed":0,
+ "errored":0,
+ "mandatory-failed":0,
+ "passed":1
+ }
+ "status-timestamps":{
+ "passed-at":"2022-09-16T01:40:30+00:00",
+ "queued-at":"2022-09-16T01:40:04+00:00",
+ "running-at":"2022-09-16T01:40:08+00:00"
+ },
+ "created-at":"2022-09-16T01:39:07.782Z",
+ "updated-at":"2022-09-16T01:40:30.010Z"
+ },
+ "relationships":{
+ "policy-attachable":{
+ "data":{
+ "id":"ts-yxskot8Gz5yHa38W",
+ "type":"task-stages"
+ }
+ },
+ "policy-set-outcomes":{
+ "links":{
+ "related":"/api/v2/policy-evaluations/poleval-8Jj9Hfoz892D9WMX/policy-set-outcomes"
+ }
+ }
+ },
+ "links":{
+ "self":"/api/v2/policy-evaluations/poleval-8Jj9Hfoz892D9WMX"
+ }
+ }
+ ]
+}
+```
+
+## List Policy Outcomes
+
+`GET /policy-evaluations/:policy_evaluation_id/policy-set-outcomes`
+
+| Parameter | Description |
+| ----------------------- | ---------------------------------------------------------- |
+| `:policy_evaluation_id` | The ID of the policy evaluation the outcome belongs to get |
+
+This endpoint allows you to list policy set outcomes that are part of the policy evaluation.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | --------------------------- |
+| [200][] | [JSON API document][] | Success |
+| [404][] | [JSON API error object][] | Policy evaluation not found |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling does not automatically encode URLs.
+
+| Parameter | Description |
+| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint returns the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint returns 20 policy sets per page. |
+| `filter[n][status]` | **Optional.** If omitted, the endpoint returns all policies regardless of status. Must be either "passed", "failed", or "errored". |
+| `filter[n][enforcementLevel]` | **Optional.** Only used if paired with a non-errored status filter. Must be either "advisory" or "mandatory." |
+
+-> **Note**: You can use `filter[n]` to combine combinations of statuses and enforcement levels. Policy outcomes with an errored status do not have an enforcement level.
+
+### Sample Request
+
+The following example requests demonstrate how to call the `policy-set-outcomes` endpoint using cuRL.
+
+#### All Policy Outcomes
+
+The following example call returns all policy set outcomes.
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/policy-evaluations/poleval-8Jj9Hfoz892D9WMX/policy-set-outcomes
+```
+
+#### Failed and Errored Policy Outcomes
+
+The following example call filters the response so that it only contains failed outcomes and errors.
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/policy-evaluations/poleval-8Jj9Hfoz892D9WMX/policy-set-outcomes?filter[0][status]=errored&filter[1][status]=failed&filter[1][enforcementLevel]=mandatory
+```
+
+### Sample Response
+
+The following example response shows that the `policyVCS` policy failed.
+
+```json
+{
+ "data":[
+ {
+ "id":"psout-cu8E9a97LBepZZXd",
+ "type":"policy-set-outcomes",
+ "attributes":{
+ "outcomes":[
+ {
+ "enforcement_level":"advisory",
+ "query":"data.terraform.main.main",
+ "status":"failed",
+ "policy_name":"policyVCS",
+ "description":""
+ }
+ ],
+ "error":"",
+ "overridable":true,
+ "policy-set-name":"opa-policies-vcs",
+ "policy-set-description":null,
+ "result-count":{
+ "advisory-failed":1,
+ "errored":0,
+ "mandatory-failed":0,
+ "passed":0
+ },
+ "policy-tool-version": "0.54.0"
+ },
+ "relationships":{
+ "policy-evaluation":{
+ "data":{
+ "id":"poleval-8Jj9Hfoz892D9WMX",
+ "type":"policy-evaluations"
+ }
+ }
+ }
+ }
+ ],
+ "links":{
+ "self":"/api/v2/policy-evaluations/poleval-8Jj9Hfoz892D9WMX/policy-set-outcomes?page%5Bnumber%5D=1\u0026page%5Bsize%5D=20",
+ "first":"/api/v2/policy-evaluations/poleval-8Jj9Hfoz892D9WMX/policy-set-outcomes?page%5Bnumber%5D=1\u0026page%5Bsize%5D=20",
+ "prev":null,
+ "next":null,
+ "last":"/api/v2/policy-evaluations/poleval-8Jj9Hfoz892D9WMX/policy-set-outcomes?page%5Bnumber%5D=1\u0026page%5Bsize%5D=20"
+ },
+ "meta":{
+ "pagination":{
+ "current-page":1,
+ "page-size":20,
+ "prev-page":null,
+ "next-page":null,
+ "total-pages":1,
+ "total-count":1
+ }
+ }
+}
+```
+
+## Show a Policy Outcome
+
+`GET /policy-set-outcomes/:policy_set_outcome_id`
+
+| Parameter | Description |
+| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:policy_set_outcome_id` | The ID of the policy outcome to show. Refer to [List the Policy Outcomes](#list-policy-outcomes) for reference information about finding IDs. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------------- |
+| [200][] | [JSON API document][] | The request was successful |
+| [404][] | [JSON API error object][] | Policy set outcome not found or user unauthorized to perform action |
+
+### Sample Request
+
+The following example request gets the outcomes for the `psout-cu8E9a97LBepZZXd` policy set.
+
+```shell
+curl --request GET \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/policy-set-outcomes/psout-cu8E9a97LBepZZXd
+```
+
+### Sample Response
+
+The following example response shows that the `policyVCS` policy failed.
+
+```json
+{
+ "data":{
+ "id":"psout-cu8E9a97LBepZZXd",
+ "type":"policy-set-outcomes",
+ "attributes":{
+ "outcomes":[
+ {
+ "enforcement_level":"advisory",
+ "query":"data.terraform.main.main",
+ "status":"failed",
+ "policy_name":"policyVCS",
+ "description":""
+ }
+ ],
+ "error":"",
+ "overridable":true,
+ "policy-set-name":"opa-policies-vcs",
+ "policy-set-description":null,
+ "result-count":{
+ "advisory-failed":1,
+ "errored":0,
+ "mandatory-failed":0,
+ "passed":0
+ },
+ "policy-tool-version": "0.54.0"
+ },
+ "relationships":{
+ "policy-evaluation":{
+ "data":{
+ "id":"poleval-8Jj9Hfoz892D9WMX",
+ "type":"policy-evaluations"
+ }
+ }
+ }
+ }
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/policy-set-params.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/policy-set-params.mdx
new file mode 100644
index 0000000000..4065a72ca9
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/policy-set-params.mdx
@@ -0,0 +1,290 @@
+---
+page_title: /parameters API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/parameters` endpoint to manage the
+ key/value pairs that Sentinel uses for policy checks. Read, create, update,
+ and delete parameters.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Policy set parameters API references
+
+[Sentinel parameters](/sentinel/docs/language/parameters) are a list of key/value pairs that HCP Terraform sends to the Sentinel runtime when performing policy checks on workspaces. They can help you avoid hardcoding sensitive parameters into a policy.
+
+
+
+@include 'tfc-package-callouts/policies.mdx'
+
+
+
+Parameters are only available for Sentinel policies. This set of APIs provides endpoints to create, update, list and delete parameters.
+
+## Create a Parameter
+
+`POST /policy-sets/:policy_set_id/parameters`
+
+| Parameter | Description |
+| ---------------- | ---------------------------------------------------- |
+| `:policy_set_id` | The ID of the policy set to create the parameter in. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| --------------------------- | ------ | ------- | ------------------------------------------------------------------------------------------------------ |
+| `data.type` | string | | Must be `"vars"`. |
+| `data.attributes.key` | string | | The name of the parameter. |
+| `data.attributes.value` | string | `""` | The value of the parameter. |
+| `data.attributes.category` | string | | The category of the parameters. Must be `"policy-set"`. |
+| `data.attributes.sensitive` | bool | `false` | Whether the value is sensitive. If true then the parameter is written once and not visible thereafter. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type":"vars",
+ "attributes": {
+ "key":"some_key",
+ "value":"some_value",
+ "category":"policy-set",
+ "sensitive":false
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/policy-sets/polset-u3S5p2Uwk21keu1s/parameters
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id":"var-EavQ1LztoRTQHSNT",
+ "type":"vars",
+ "attributes": {
+ "key":"some_key",
+ "value":"some_value",
+ "sensitive":false,
+ "category":"policy-set"
+ },
+ "relationships": {
+ "configurable": {
+ "data": {
+ "id":"pol-u3S5p2Uwk21keu1s",
+ "type":"policy-sets"
+ },
+ "links": {
+ "related":"/api/v2/policy-sets/polset-u3S5p2Uwk21keu1s"
+ }
+ }
+ },
+ "links": {
+ "self":"/api/v2/policy-sets/polset-u3S5p2Uwk21keu1s/parameters/var-EavQ1LztoRTQHSNT"
+ }
+ }
+}
+```
+
+## List Parameters
+
+`GET /policy-sets/:policy_set_id/parameters`
+
+| Parameter | Description |
+| ---------------- | ------------------------------------------------ |
+| `:policy_set_id` | The ID of the policy set to list parameters for. |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs. If neither pagination query parameters are provided, the endpoint will not be paginated and will return all results.
+
+| Parameter | Description |
+| -------------- | -------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 parameters per page. |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+"https://app.terraform.io/api/v2/policy-sets/polset-u3S5p2Uwk21keu1s/parameters"
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id":"var-AD4pibb9nxo1468E",
+ "type":"vars",
+ "attributes": {
+ "key":"name",
+ "value":"hello",
+ "sensitive":false,
+ "category":"policy-set",
+ },
+ "relationships": {
+ "configurable": {
+ "data": {
+ "id":"pol-u3S5p2Uwk21keu1s",
+ "type":"policy-sets"
+ },
+ "links": {
+ "related":"/api/v2/policy-sets/polset-u3S5p2Uwk21keu1s"
+ }
+ }
+ },
+ "links": {
+ "self":"/api/v2/policy-sets/polset-u3S5p2Uwk21keu1s/parameters/var-AD4pibb9nxo1468E"
+ }
+ }
+ ]
+}
+```
+
+## Update Parameters
+
+`PATCH /policy-sets/:policy_set_id/parameters/:parameter_id`
+
+| Parameter | Description |
+| ---------------- | ------------------------------------------------- |
+| `:policy_set_id` | The ID of the policy set that owns the parameter. |
+| `:parameter_id` | The ID of the parameter to be updated. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------- | ------ | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"vars"`. |
+| `data.id` | string | | The ID of the parameter to update. |
+| `data.attributes` | object | | New attributes for the parameter. This object can include `key`, `value`, `category` and `sensitive` properties, which are described above under [create a parameter](#create-a-parameter). All of these properties are optional; if omitted, a property will be left unchanged. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "id":"var-yRmifb4PJj7cLkMG",
+ "attributes": {
+ "key":"name",
+ "value":"mars",
+ "category":"policy-set",
+ "sensitive": false
+ },
+ "type":"vars"
+ }
+}
+```
+
+### Sample Request
+
+```bash
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/policy-sets/polset-u3S5p2Uwk21keu1s/parameters/var-yRmifb4PJj7cLkMG
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id":"var-yRmifb4PJj7cLkMG",
+ "type":"vars",
+ "attributes": {
+ "key":"name",
+ "value":"mars",
+ "sensitive":false,
+ "category":"policy-set",
+ },
+ "relationships": {
+ "configurable": {
+ "data": {
+ "id":"pol-u3S5p2Uwk21keu1s",
+ "type":"policy-sets"
+ },
+ "links": {
+ "related":"/api/v2/policy-sets/polset-u3S5p2Uwk21keu1s"
+ }
+ }
+ },
+ "links": {
+ "self":"/api/v2/policy-sets/polset-u3S5p2Uwk21keu1s/parameters/var-yRmifb4PJj7cLkMG"
+ }
+ }
+}
+```
+
+## Delete Parameters
+
+`DELETE /policy-sets/:policy_set_id/parameters/:parameter_id`
+
+| Parameter | Description |
+| ---------------- | ------------------------------------------------- |
+| `:policy_set_id` | The ID of the policy set that owns the parameter. |
+| `:parameter_id` | The ID of the parameter to be deleted. |
+
+### Sample Request
+
+```bash
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/policy-sets/polset-u3S5p2Uwk21keu1s/parameters/var-yRmifb4PJj7cLkMG
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/policy-sets.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/policy-sets.mdx
new file mode 100644
index 0000000000..a0e73b0a9e
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/policy-sets.mdx
@@ -0,0 +1,1298 @@
+---
+page_title: /policy-sets API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/policy-sets` endpoint to read, create,
+ delete, update and version Sentinel and OPA policy sets. Also, attach,
+ exclude, and detach policy sets to workspaces and projects.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Policy sets API reference
+
+[Policy Enforcement](/terraform/enterprise/policy-enforcement) lets you use the policy-as-code frameworks Sentinel and Open Policy Agent (OPA) to apply policy checks to HCP Terraform workspaces.
+
+[Policy sets](/terraform/enterprise/policy-enforcement/manage-policy-sets) are collections of policies that you can apply globally or to specific [projects](/terraform/enterprise/projects/manage) and workspaces. For each run in the selected workspaces, HCP Terraform checks the Terraform plan against the policy set.
+
+
+
+@include 'tfc-package-callouts/policies.mdx'
+
+
+
+This API provides endpoints to create, read, update, and delete policy sets in an HCP Terraform organization. To view and manage individual policies, use the [Policies API](/terraform/enterprise/api-docs/policies).
+
+Many of these endpoints let you create policy sets from a designated repository in a Version Control System (VCS). For more information about how to configure a policy set VCS repository, refer to [Sentinel Policy Set VCS Repositories](/terraform/enterprise/policy-enforcement/sentinel/vcs) and [OPA Policy Set VCS Repositories](/terraform/enterprise/policy-enforcement/opa/vcs).
+
+Instead of connecting HCP Terraform to a VCS repository, you can use the the [Policy Set Versions endpoint](#create-a-policy-set-version) to create an entire policy set from a `tar.gz` file.
+
+Interacting with policy sets requires permission to manage policies. ([More about permissions](/terraform/enterprise/users-teams-organizations/permissions).)
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+## Create a policy set
+
+`POST /organizations/:organization_name/policy-sets`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The organization to create the policy set in. The organization must already exist in the system, and the token authenticating the API request must have permission to manage policies. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions)) |
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Status | Response | Reason |
+| ------- | --------------------------------------------- | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "policy-sets"`) | Successfully created a policy set |
+| [404][] | [JSON API error object][] | Organization not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------------------------------- | -------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"policy-sets"`. |
+| `data.attributes.name` | string | | The name of the policy set. Can include letters, numbers, `-`, and `_`. |
+| `data.attributes.description` | string | `null` | Text describing the policy set's purpose. This field supports Markdown and appears in the HCP Terraform UI. |
+| `data.attributes.global` | boolean | `false` | Whether HCP Terraform should automatically apply this policy set to all of an organization's workspaces. |
+| `data.attributes.kind` | string | `sentinel` | The policy-as-code framework associated with the policy. Valid values are `sentinel` and `opa`. |
+| `data.attributes.overridable` | boolean | `false` | Whether or not users can override this policy when it fails during a run. Valid for sentinel policies only if `agent-enabled` is set to `true`. |
+| `data.attributes.vcs-repo` | object | `null` | VCS repository information. When present, HCP Terraform sources the policies and configuration from the specified VCS repository. This attribute and `policies` relationships are mutually exclusive, and you cannot use them simultaneously. |
+| `data.attributes.vcs-repo.branch` | string | `null` | The branch of the VCS repository where HCP Terraform should retrieve the policy set. If empty, HCP Terraform uses the default branch. |
+| `data.attributes.vcs-repo.identifier` | string | | The VCS repository identifier in the format `/`. For example, `hashicorp/my-policy-set`. The format for Azure DevOps is `//_git/`. |
+| `data.attributes.vcs-repo.oauth-token-id` | string | | The OAuth Token ID HCP Terraform should use to connect to the VCS host. This value must not be specified if `github-app-installation-id` is specified. |
+| `data.attributes.vcs-repo.github-app-installation-id` | string | | The VCS Connection GitHub App Installation to use. Find this ID on the account settings page. Requires previously authorizing the GitHub App and generating a user-to-server token. Manage the token from **Account Settings** within HCP Terraform. You can not specify this value if `oauth-token-id` is specified. |
+| `data.attributes.vcs-repo.ingress-submodules` | boolean | `false` | Whether HCP Terraform should instantiate repository submodules when retrieving the policy set. |
+| `data.attributes.policies-path` | string | `null` | The VCS repository subdirectory that contains the policies for this policy set. HCP Terraform ignores files and directories outside of this sub-path and does not update the policy set when those files change. This attribute is only valid when you specify a VCS repository for the policy set. |
+| `data.relationships.projects.data[]` | array\[object] | `[]` | A list of resource identifier objects that defines which projects are associated with the policy set. These objects must contain `id` and `type` properties, and the `type` property must be `projects`. For example, `{ "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }`. You can only specify this attribute when `data.attributes.global` is `false`. |
+| `data.relationships.workspaces.data[]` | array\[object] | `[]` | A list of resource identifier objects that defines which workspaces are associated with the policy set. These objects must contain `id` and `type` properties, and the `type` property must be `workspaces`. For example, `{ "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }`. Obtain workspace IDs from the [workspace's settings page](/terraform/enterprise/workspaces/settings) or the [Show Workspace endpoint](/terraform/enterprise/api-docs/workspaces#show-workspace). You can only specify this attribute when `data.attributes.global` is `false`. |
+| `data.relationships.workspace-exclusions.data[]` | array\[object] | `[]` | A list of resource identifier objects specifying which workspaces HCP Terraform excludes from a policy set's enforcement. These objects must contain `id` and `type` properties, and the `type` property must be `workspaces`. For example, `{ "id": "ws-FVVvzCDaykN1oHiw", "type": "workspaces" }`. |
+| `data.relationships.policies.data[]` | array\[object] | `[]` | A list of resource identifier objects that defines which policies are members of the policy set. These objects must contain `id` and `type` properties, and the `type` property must be `policies`. For example, `{ "id": "pol-u3S5p2Uwk21keu1s", "type": "policies" }`. |
+| `data.attributes.agent-enabled` | boolean | `false` | Only valid for `sentinel` policy sets. Whether this policy set should run as a policy evaluation in the HCP Terraform agent. |
+| `data.attributes.policy-tool-version` | string | `latest` | The version of the tool that HCP Terraform uses to evaluate policies. You can only set a policy tool version for 'sentinel' policy sets if `agent-enabled` is `true`. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "policy-sets",
+ "attributes": {
+ "name": "production",
+ "description": "This set contains policies that should be checked on all production infrastructure workspaces.",
+ "global": false,
+ "kind": "sentinel",
+ "agent-enabled": true,
+ "policy-tool-version": "0.23.0",
+ "overridable": true,
+ "policies-path": "/policy-sets/foo",
+ "vcs-repo": {
+ "branch": "main",
+ "identifier": "hashicorp/my-policy-sets",
+ "ingress-submodules": false,
+ "oauth-token-id": "ot-7Fr9d83jWsi8u23A"
+ }
+ },
+ "relationships": {
+ "projects": {
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }
+ ]
+ },
+ "workspaces": {
+ "data": [
+ { "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }
+ ]
+ },
+ "workspace-exclusions": {
+ "data": [
+ { "id": "ws-FVVvzCDaykN1oHiw", "type": "workspaces" }
+ ]
+ }
+ }
+ }
+}
+```
+
+### Sample payload with individual policy relationships
+
+```json
+{
+ "data": {
+ "type": "policy-sets",
+ "attributes": {
+ "name": "production",
+ "description": "This set contains policies that should be checked on all production infrastructure workspaces.",
+ "kind": "sentinel",
+ "global": false,
+ "agent-enabled": true,
+ "policy-tool-version": "0.23.0",
+ "overridable": true
+ },
+ "relationships": {
+ "policies": {
+ "data": [
+ { "id": "pol-u3S5p2Uwk21keu1s", "type": "policies" }
+ ]
+ },
+ "workspaces": {
+ "data": [
+ { "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }
+ ]
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/policy-sets
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id":"polset-3yVQZvHzf5j3WRJ1",
+ "type":"policy-sets",
+ "attributes": {
+ "name": "production",
+ "description": "This set contains policies that should be checked on all production infrastructure workspaces.",
+ "kind": "sentinel",
+ "global": false,
+ "agent-enabled": true,
+ "policy-tool-version": "0.23.0",
+ "overridable": true,
+ "workspace-count": 1,
+ "policies-path": "/policy-sets/foo",
+ "versioned": true,
+ "vcs-repo": {
+ "branch": "main",
+ "identifier": "hashicorp/my-policy-sets",
+ "ingress-submodules": false,
+ "oauth-token-id": "ot-7Fr9d83jWsi8u23A"
+ },
+ "created-at": "2018-09-11T18:21:21.784Z",
+ "updated-at": "2018-09-11T18:21:21.784Z"
+ },
+ "relationships": {
+ "organization": {
+ "data": { "id": "my-organization", "type": "organizations" }
+ },
+ "projects": {
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }
+ ]
+ },
+ "workspaces": {
+ "data": [
+ { "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }
+ ]
+ },
+ "workspace-exclusions": {
+ "data": [
+ { "id": "ws-FVVvzCDaykN1oHiw", "type": "workspaces" }
+ ]
+ },
+ },
+ "links": {
+ "self":"/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1"
+ }
+ }
+}
+```
+
+### Sample response with individual policy relationships
+
+```json
+{
+ "data": {
+ "id":"polset-3yVQZvHzf5j3WRJ1",
+ "type":"policy-sets",
+ "attributes": {
+ "name": "production",
+ "description": "This set contains policies that should be checked on all production infrastructure workspaces.",
+ "kind": "sentinel",
+ "global": false,
+ "agent-enabled": true,
+ "policy-tool-version": "0.23.0",
+ "overridable": true,
+ "policy-count": 1,
+ "workspace-count": 1,
+ "versioned": false,
+ "created-at": "2018-09-11T18:21:21.784Z",
+ "updated-at": "2018-09-11T18:21:21.784Z"
+ },
+ "relationships": {
+ "organization": {
+ "data": { "id": "my-organization", "type": "organizations" }
+ },
+ "policies": {
+ "data": [
+ { "id": "pol-u3S5p2Uwk21keu1s", "type": "policies" }
+ ]
+ },
+ "workspaces": {
+ "data": [
+ { "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }
+ ]
+ }
+ },
+ "links": {
+ "self":"/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1"
+ }
+ }
+}
+```
+
+## List policy sets
+
+`GET /organizations/:organization_name/policy-sets`
+
+| Parameter | Description |
+| -------------------- | ----------------------------------------- |
+| `:organization_name` | The organization to list policy sets for. |
+
+| Status | Response | Reason |
+| ------- | --------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "policy-sets"`) | Request was successful |
+| [404][] | [JSON API error object][] | Organization not found, or user unauthorized to perform action |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters); remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `filter[versioned]` | **Optional.** Allows filtering policy sets based on whether they are versioned (VCS-managed or API-managed), or use individual policy relationships. Accepts a boolean true/false value. A `true` value returns versioned sets, and a `false` value returns sets with individual policy relationships. If omitted, all policy sets are returned. |
+| `filter[kind]` | **Optional.** If specified, restricts results to those with the matching policy kind value. Valid values are `sentinel` and `opa`. |
+| `include` | **Optional.** Enables you to include related resource data. Value must be a comma-separated list containing one or more of `projects`, `workspaces`, `workspace-exclusions`, `policies`, `newest_version`, or `current_version`. See the [relationships section](#relationships) for details. |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 policy sets per page. |
+| `search[name]` | **Optional.** Allows searching the organization's policy sets by name. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/v2/organizations/my-organization/policy-sets
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id":"polset-3yVQZvHzf5j3WRJ1",
+ "type":"policy-sets",
+ "attributes": {
+ "name": "production",
+ "description": "This set contains policies that should be checked on all production infrastructure workspaces.",
+ "kind": "sentinel",
+ "global": false,
+ "agent-enabled": true,
+ "policy-tool-version": "0.23.0",
+ "overridable": true,
+ "workspace-count": 1,
+ "policies-path": "/policy-sets/foo",
+ "versioned": true,
+ "vcs-repo": {
+ "branch": "main",
+ "identifier": "hashicorp/my-policy-sets",
+ "ingress-submodules": false,
+ "oauth-token-id": "ot-7Fr9d83jWsi8u23A"
+ },
+ "created-at": "2018-09-11T18:21:21.784Z",
+ "updated-at": "2018-09-11T18:21:21.784Z"
+ },
+ "relationships": {
+ "organization": {
+ "data": { "id": "my-organization", "type": "organizations" }
+ },
+ "projects": {
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }
+ ]
+ },
+ "workspaces": {
+ "data": [
+ { "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }
+ ]
+ },
+ "workspace-exclusions": {
+ "data": [
+ { "id": "ws-FVVvzCDaykN1oHiw", "type": "workspaces" }
+ ]
+ },
+ },
+ "links": {
+ "self":"/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1"
+ }
+ }
+ ]
+}
+```
+
+### Sample response with individual policy relationships
+
+```json
+{
+ "data": [
+ {
+ "id":"polset-3yVQZvHzf5j3WRJ1",
+ "type":"policy-sets",
+ "attributes": {
+ "name": "production",
+ "description": "This set contains policies that should be checked on all production infrastructure workspaces.",
+ "kind": "sentinel",
+ "global": false,
+ "agent-enabled": true,
+ "policy-tool-version": "0.23.0",
+ "overridable": true,
+ "policy-count": 1,
+ "workspace-count": 1,
+ "versioned": false,
+ "created-at": "2018-09-11T18:21:21.784Z",
+ "updated-at": "2018-09-11T18:21:21.784Z"
+ },
+ "relationships": {
+ "organization": {
+ "data": { "id": "my-organization", "type": "organizations" }
+ },
+ "policies": {
+ "data": [
+ { "id": "pol-u3S5p2Uwk21keu1s", "type": "policies" }
+ ]
+ },
+ "workspaces": {
+ "data": [
+ { "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }
+ ]
+ }
+ },
+ "links": {
+ "self":"/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1"
+ }
+ },
+ ]
+}
+```
+
+## Show a policy set
+
+`GET /policy-sets/:id`
+
+| Parameter | Description |
+| --------- | ----------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the policy set to show. Refer to [List Policy Sets](#list-policy-sets) for reference information about finding IDs. |
+
+| Status | Response | Reason |
+| ------- | --------------------------------------------- | ----------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "policy-sets"`) | The request was successful |
+| [404][] | [JSON API error object][] | Policy set not found or user unauthorized to perform action |
+
+| Parameter | Description |
+| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `include` | **Optional.** Enables you to include related resource data. Value must be a comma-separated list containing one or more of `projects`, `workspaces`, `workspace-exclusions`, `policies`, `newest_version`, or `current_version`. See the [relationships section](#relationships) for details. |
+
+### Sample Request
+
+```shell
+curl --request GET \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1?include=current_version
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id":"polset-3yVQZvHzf5j3WRJ1",
+ "type":"policy-sets",
+ "attributes": {
+ "name": "production",
+ "description": "This set contains policies that should be checked on all production infrastructure workspaces.",
+ "kind": "sentinel",
+ "global": false,
+ "agent-enabled": true,
+ "policy-tool-version": "0.23.0",
+ "overridable": true,
+ "policy-count": 0,
+ "workspace-count": 1,
+ "policies-path": "/policy-sets/foo",
+ "versioned": true,
+ "vcs-repo": {
+ "branch": "main",
+ "identifier": "hashicorp/my-policy-sets",
+ "ingress-submodules": false,
+ "oauth-token-id": "ot-7Fr9d83jWsi8u23A"
+ },
+ "created-at": "2018-09-11T18:21:21.784Z",
+ "updated-at": "2018-09-11T18:21:21.784Z"
+ },
+ "relationships": {
+ "organization": {
+ "data": { "id": "my-organization", "type": "organizations" }
+ },
+ "current-version": {
+ "data": {
+ "id": "polsetver-m4yhbUBCgyDVpDL4",
+ "type": "policy-set-versions"
+ }
+ },
+ "projects": {
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }
+ ]
+ },
+ "workspaces": {
+ "data": [
+ { "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }
+ ]
+ },
+ "workspace-exclusions": {
+ "data": [
+ { "id": "ws-FVVvzCDaykN1oHiw", "type": "workspaces" }
+ ]
+ },
+ },
+ "links": {
+ "self":"/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1"
+ }
+ },
+ "included": [
+ {
+ "id": "polsetver-m4yhbUBCgyDVpDL4",
+ "type": "policy-set-versions",
+ "attributes": {
+ "source": "github",
+ "status": "ready",
+ "status-timestamps": {
+ "ready-at": "2019-06-21T21:29:48+00:00",
+ "ingressing-at": "2019-06-21T21:29:47+00:00"
+ },
+ "error": null,
+ "ingress-attributes": {
+ "commit-sha": "8766a423cb902887deb0f7da4d9beaed432984bb",
+ "commit-url": "https://github.com/hashicorp/my-policy-sets/commit/8766a423cb902887deb0f7da4d9beaed432984bb",
+ "identifier": "hashicorp/my-policy-sets"
+ },
+ "created-at": "2019-06-21T21:29:47.792Z",
+ "updated-at": "2019-06-21T21:29:48.887Z"
+ },
+ "relationships": {
+ "policy-set": {
+ "data": {
+ "id": "polset-a2mJwtmKygrA11dh",
+ "type": "policy-sets"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/policy-set-versions/polsetver-E4S7jz8HMjBienLS"
+ }
+ }
+ ]
+}
+```
+
+### Sample response with individual policy relationships
+
+```json
+{
+ "data": {
+ "id":"polset-3yVQZvHzf5j3WRJ1",
+ "type":"policy-sets",
+ "attributes": {
+ "name": "production",
+ "description": "This set contains policies that should be checked on all production infrastructure workspaces.",
+ "kind": "sentinel",
+ "global": false,
+ "agent-enabled": true,
+ "policy-tool-version": "0.23.0",
+ "overridable": true,
+ "policy-count": 1,
+ "workspace-count": 1,
+ "versioned": false,
+ "created-at": "2018-09-11T18:21:21.784Z",
+ "updated-at": "2018-09-11T18:21:21.784Z",
+ },
+ "relationships": {
+ "organization": {
+ "data": { "id": "my-organization", "type": "organizations" }
+ },
+ "policies": {
+ "data": [
+ { "id": "pol-u3S5p2Uwk21keu1s", "type": "policies" }
+ ]
+ },
+ "workspaces": {
+ "data": [
+ { "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }
+ ]
+ }
+ },
+ "links": {
+ "self":"/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1"
+ }
+ }
+}
+```
+
+-> **Note:** The `data.relationships.projects` and `data.relationships.workspaces` refer to the projects and workspaces attached to the policy set. HCP Terraform omits these keys for policy sets marked as global, which are implicitly related to all of the organization's workspaces.
+
+## Update a policy set
+
+`PATCH /policy-sets/:id`
+
+| Parameter | Description |
+| --------- | ------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the policy set to update. Refer to [List Policy Sets](#list-policy-sets) for reference information about finding IDs. |
+
+| Status | Response | Reason |
+| ------- | --------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "policy-sets"`) | The request was successful |
+| [404][] | [JSON API error object][] | Policy set not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| --------------------------------------------- | -------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"policy-sets"`. |
+| `data.attributes.name` | string | (previous value) | The name of the policy set. Can include letters, numbers, `-`, and `_`. |
+| `data.attributes.description` | string | (previous value) | A description of the set's purpose. This field supports markdown and appears in the HCP Terraform UI. |
+| `data.attributes.global` | boolean | (previous value) | Whether or not the policies in this set should be checked in all of the organization's workspaces or only in workspaces directly attached to the set. |
+| `data.attributes.vcs-repo` | object | (previous value) | VCS repository information. When present, HCP Terraform sources the policies and configuration from the specified VCS repository instead of using definitions from HCP Terraform. Note that this option and `policies` relationships are mutually exclusive and may not be used simultaneously. |
+| `data.attributes.vcs-repo.branch` | string | (previous value) | The branch of the VCS repo. When empty, HCP Terraform uses the VCS provider's default branch value. |
+| `data.attributes.vcs-repo.identifier` | string | (previous value) | The VCS repository identifier in the the following format: `/`. An example identifier in GitHub is `hashicorp/my-policy-set`. The format for Azure DevOps is `//_git/`. |
+| `data.attributes.vcs-repo.oauth-token-id` | string | (previous value) | The OAuth token ID to use to connect to the VCS host. |
+| `data.attributes.vcs-repo.ingress-submodules` | boolean | (previous value) | Determines whether HCP Terraform instantiates repository submodules during the clone operation. |
+| `data.attributes.policies-path` | boolean | (previous value) | The subdirectory of the attached VCS repository that contains the policies for this policy set. HCP Terraform ignores files and directories outside of the sub-path. Changes to the unrelated files do not update the policy set. You can only enable this option when a VCS repository is present. |
+| `data.relationships.projects` | array\[object] | (previous value) | An array of references to projects that the policy set should be assigned to. Sending an empty array clears all project assignments. You can only specify this attribute when `data.attributes.global` is `false`. |
+| `data.relationships.workspaces` | array\[object] | (previous value) | An array of references to workspaces that the policy set should be assigned to. Sending an empty array clears all workspace assignments. You can only specify this attribute when `data.attributes.global` is `false`. |
+| `data.relationships.workspace-exclusions` | array\[object] | (previous value) | An array of references to excluded workspaces that HCP Terraform will not enforce this policy set upon. Sending an empty array clears all exclusions assignments. |
+| `data.attributes.agent-enabled` | boolean | `false` | Only valid for `sentinel` policy sets. Whether this policy set should run as a policy evaluation in the HCP Terraform agent. |
+| `data.attributes.policy-tool-version` | string | `latest` | The version of the tool that HCP Terraform uses to evaluate policies. You can only set a policy tool version for 'sentinel' policy sets if `agent-enabled` is `true`. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "policy-sets",
+ "attributes": {
+ "name": "workspace-scoped-policy-set",
+ "description": "Policies added to this policy set will be enforced on specified workspaces",
+ "global": false,
+ "agent-enabled": true,
+ "policy-tool-version": "0.23.0"
+ },
+ "relationships": {
+ "projects": {
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }
+ ]
+ },
+ "workspaces": {
+ "data": [
+ { "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }
+ ]
+ },
+ "workspace-exclusions": {
+ "data": [
+ { "id": "ws-FVVvzCDaykN1oHiw", "type": "workspaces" }
+ ]
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id":"polset-3yVQZvHzf5j3WRJ1",
+ "type":"policy-sets",
+ "attributes": {
+ "name": "workspace-scoped-policy-set",
+ "description": "Policies added to this policy set will be enforced on specified workspaces",
+ "global": false,
+ "kind": "sentinel",
+ "agent-enabled": true,
+ "policy-tool-version": "0.23.0",
+ "overridable": true,
+ "policy-count": 1,
+ "workspace-count": 1,
+ "versioned": false,
+ "created-at": "2018-09-11T18:21:21.784Z",
+ "updated-at": "2018-09-11T18:21:21.784Z"
+ },
+ "relationships": {
+ "organization": {
+ "data": { "id": "my-organization", "type": "organizations" }
+ },
+ "policies": {
+ "data": [
+ { "id": "pol-u3S5p2Uwk21keu1s", "type": "policies" }
+ ]
+ },
+ "projects": {
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }
+ ]
+ },
+ "workspaces": {
+ "data": [
+ { "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }
+ ]
+ },
+ "workspace-exclusions": {
+ "data": [
+ { "id": "ws-FVVvzCDaykN1oHiw", "type": "workspaces" }
+ ]
+ }
+ },
+ "links": {
+ "self":"/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1"
+ }
+ }
+}
+```
+
+## Add policies to the policy set
+
+`POST /policy-sets/:id/relationships/policies`
+
+| Parameter | Description |
+| --------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the policy set to add policies to. Refer to [List Policy Sets](#list-policy-sets) for reference information about finding IDs. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------------------------- |
+| [204][] | No Content | The request was successful |
+| [404][] | [JSON API error object][] | Policy set not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (one or more policies not found, wrong types, etc.) |
+
+~> **Note:** This endpoint may only be used when there is no VCS repository associated with the policy set.
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------- | -------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `data[]` | array\[object] | | A list of resource identifier objects that defines which policies will be added to the set. These objects must contain `id` and `type` properties, and the `type` property must be `policies` (e.g. `{ "id": "pol-u3S5p2Uwk21keu1s", "type": "policies" }`). |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ { "id": "pol-u3S5p2Uwk21keu1s", "type": "policies" },
+ { "id": "pol-2HRvNs49EWPjDqT1", "type": "policies" }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1/relationships/policies
+```
+
+## Attach a policy set to projects
+
+`POST /policy-sets/:id/relationships/projects`
+
+| Parameter | Description |
+| --------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the policy set to attach to projects. Refer to [List Policy Sets](#list-policy-sets) for reference information about finding IDs. |
+
+-> **Note:** You can not attach global policy sets to individual projects.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------------------------- |
+| [204][] | Nothing | The request was successful |
+| [404][] | [JSON API error object][] | Policy set not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (one or more projects not found, wrong types, etc.) |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------- | -------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data[]` | array\[object] | | A list of resource identifier objects that defines which projects to attach the policy set to. These objects must contain `id` and `type` properties, and the `type` property must be `projects` (e.g. `{ "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }`). |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" },
+ { "id": "prj-2HRvNs49EWPjDqT1", "type": "projects" }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1/relationships/projects
+```
+
+## Attach a policy set to workspaces
+
+`POST /policy-sets/:id/relationships/workspaces`
+
+| Parameter | Description |
+| --------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the policy set to attach to workspaces. Refer to [List Policy Sets](#list-policy-sets) for reference information about finding IDs. |
+
+-> **Note:** Policy sets marked as global cannot be attached to individual workspaces.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ---------------------------------------------------------------------------- |
+| [204][] | No Content | The request was successful |
+| [404][] | [JSON API error object][] | Policy set not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (one or more workspaces not found, wrong types, etc.) |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------- | -------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data[]` | array\[object] | | A list of resource identifier objects that defines the workspaces the policy set will be attached to. These objects must contain `id` and `type` properties, and the `type` property must be `workspaces` (e.g. `{ "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }`). |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ { "id": "ws-u3S5p2Uwk21keu1s", "type": "workspaces" },
+ { "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1/relationships/workspaces
+```
+
+## Exclude a workspace from a policy set
+
+`POST /policy-sets/:id/relationships/workspace-exclusions`
+
+| Parameter | Description |
+| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:id` | The ID of a policy set that you want HCP Terraform to exclude from the workspaces you specify. Refer to [List Policy Sets](#list-policy-sets) for reference information about finding IDs. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------------------------------- |
+| [204][] | No Content | The request was successful |
+| [404][] | [JSON API error object][] | Policy set not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (one or more excluded workspaces not found, wrong types, etc.) |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------- | -------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data[]` | array\[object] | | A list of resource identifier objects that defines the excluded workspaces the policy set will be attached to. These objects must contain `id` and `type` properties, and the `type` property must be `workspaces` (e.g. `{ "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }`). |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ { "id": "ws-u3S5p2Uwk21keu1s", "type": "workspaces" },
+ { "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1/relationships/workspace-exclusions
+```
+
+## Remove policies from the policy set
+
+`DELETE /policy-sets/:id/relationships/policies`
+
+| Parameter | Description |
+| --------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the policy set to remove policies from. Refer to [List Policy Sets](#list-policy-sets) for reference information about finding IDs. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ----------------------------------------------------------- |
+| [204][] | No Content | The request was successful |
+| [404][] | [JSON API error object][] | Policy set not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (wrong types, etc.) |
+
+~> **Note:** This endpoint may only be used when there is no VCS repository associated with the policy set.
+
+### Request Body
+
+This DELETE endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------- | -------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data[]` | array\[object] | | A list of resource identifier objects that defines which policies will be removed from the set. These objects must contain `id` and `type` properties, and the `type` property must be `policies` (e.g. `{ "id": "pol-u3S5p2Uwk21keu1s", "type": "policies" }`). |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ { "id": "pol-u3S5p2Uwk21keu1s", "type": "policies" },
+ { "id": "pol-2HRvNs49EWPjDqT1", "type": "policies" }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1/relationships/policies
+```
+
+## Detach a policy set from projects
+
+`DELETE /policy-sets/:id/relationships/projects`
+
+| Parameter | Description |
+| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the policy set you want to detach from the specified projects. Refer to [List Policy Sets](#list-policy-sets) for reference information about finding IDs. |
+
+-> **Note:** You can not attach global policy sets to individual projects.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------------------------- |
+| [204][] | Nothing | The request was successful |
+| [404][] | [JSON API error object][] | Policy set not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (one or more projects not found, wrong types, etc.) |
+
+### Request Body
+
+This DELETE endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------- | -------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data[]` | array\[object] | | A list of resource identifier objects that defines the projects the policy set will be detached from. These objects must contain `id` and `type` properties, and the `type` property must be `projects`. For example, `{ "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" }`. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ { "id": "prj-AwfuCJTkdai4xj9w", "type": "projects" },
+ { "id": "prj-2HRvNs49EWPjDqT1", "type": "projects" }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1/relationships/projects
+```
+
+## Detach the policy set from workspaces
+
+`DELETE /policy-sets/:id/relationships/workspaces`
+
+| Parameter | Description |
+| --------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the policy set to detach from workspaces. Refer to [List Policy Sets](#list-policy-sets) for reference information about finding IDs. |
+
+-> **Note:** Policy sets marked as global cannot be detached from individual workspaces.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ----------------------------------------------------------- |
+| [204][] | No Content | The request was successful |
+| [404][] | [JSON API error object][] | Policy set not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (wrong types, etc.) |
+
+### Request Body
+
+This DELETE endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------- | -------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data[]` | array\[object] | | A list of resource identifier objects that defines which workspaces the policy set will be detached from. These objects must contain `id` and `type` properties, and the `type` property must be `workspaces` (e.g. `{ "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }`). Obtain workspace IDs from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](/terraform/enterprise/api-docs/workspaces#show-workspace) endpoint. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ { "id": "ws-u3S5p2Uwk21keu1s", "type": "workspaces" },
+ { "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1/relationships/workspaces
+```
+
+## Reinclude a workspace to a policy set
+
+`DELETE /policy-sets/:id/relationships/workspace-exclusions`
+
+| Parameter | Description |
+| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:id` | The ID of the policy set HCP Terraform should reinclude (enforce) on the specified workspaces. Refer to [List Policy Sets](#list-policy-sets) for reference information about finding IDs. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ----------------------------------------------------------- |
+| [204][] | No Content | The request was successful |
+| [404][] | [JSON API error object][] | Policy set not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (wrong types, etc.) |
+
+### Request Body
+
+This DELETE endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------- | -------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data[]` | array\[object] | | A list of resource identifier objects that defines which workspaces HCP Terraform should reinclude (enforce) this policy set on. These objects must contain `id` and `type` properties, and the `type` property must be `workspaces` (e.g. `{ "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }`). Obtain workspace IDs from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](/terraform/enterprise/api-docs/workspaces#show-workspace) endpoint. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ { "id": "ws-u3S5p2Uwk21keu1s", "type": "workspaces" },
+ { "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1/relationships/workspace-exclusions
+```
+
+## Delete a policy set
+
+`DELETE /policy-sets/:id`
+
+| Parameter | Description |
+| --------- | ------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the policy set to delete. Refer to [List Policy Sets](#list-policy-sets) for reference information about finding IDs. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------ |
+| [204][] | No Content | Successfully deleted the policy set |
+| [404][] | [JSON API error object][] | Policy set not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1
+```
+
+## Create a policy set version
+
+For versioned policy sets which have no VCS repository attached, versions of policy code may be uploaded directly to the API by creating a new policy set version and, in a subsequent request, uploading a tarball (tar.gz) of data to it.
+
+`POST /policy-sets/:id/versions`
+
+| Parameter | Description |
+| --------- | ----------------------------------------------------- |
+| `:id` | The ID of the policy set to create a new version for. |
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------------- | ----------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "policy-set-versions"`) | The request was successful. |
+| [404][] | [JSON API error object][] | Policy set not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | The policy set does not support uploading versions. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/policy-sets/polset-3yVQZvHzf5j3WRJ1/versions
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "polsetver-cXciu9nQwmk9Cfrn",
+ "type": "policy-set-versions",
+ "attributes": {
+ "source": "tfe-api",
+ "status": "pending",
+ "status-timestamps": {},
+ "error": null,
+ "created-at": "2019-06-28T23:53:15.875Z",
+ "updated-at": "2019-06-28T23:53:15.875Z"
+ },
+ "relationships": {
+ "policy-set": {
+ "data": {
+ "id": "polset-ws1CZBzm2h5K6ZT5",
+ "type": "policy-sets"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/policy-set-versions/polsetver-cXciu9nQwmk9Cfrn",
+ "upload": "https://archivist.terraform.io/v1/object/dmF1bHQ6djE6NWJPbHQ4QjV4R1ox..."
+ }
+ }
+}
+```
+
+The `upload` link URL in the above response is valid for one hour after creation. Make a `PUT` request to this URL directly, sending the policy set contents in `tar.gz` format as the request body. Once uploaded successfully, you can request the [Show Policy Set](#show-a-policy-set) endpoint again to verify that the status has changed from `pending` to `ready`.
+
+## Upload policy set versions
+
+`PUT https://archivist.terraform.io/v1/object/`
+
+The URL is provided in the `upload` attribute in the `policy-set-versions` resource.
+
+### Sample Request
+
+In the example below, `policy-set.tar.gz` is the local filename of the policy set version file to upload.
+
+```shell
+curl \
+ --header "Content-Type: application/octet-stream" \
+ --request PUT \
+ --data-binary @policy-set.tar.gz \
+ https://archivist.terraform.io/v1/object/dmF1bHQ6djE6NWJPbHQ4QjV4R1ox...
+```
+
+## Show a policy set version
+
+`GET /policy-set-versions/:id`
+
+| Parameter | Description |
+| --------- | ----------------------------------------- |
+| `:id` | The ID of the policy set version to show. |
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------------- | ------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "policy-set-versions"`) | The request was successful. |
+| [404][] | [JSON API error object][] | Policy set version not found or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --request GET \
+ https://app.terraform.io/api/v2/policy-set-versions/polsetver-cXciu9nQwmk9Cfrn
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "polsetver-cXciu9nQwmk9Cfrn",
+ "type": "policy-set-versions",
+ "attributes": {
+ "source": "tfe-api",
+ "status": "pending",
+ "status-timestamps": {},
+ "error": null,
+ "created-at": "2019-06-28T23:53:15.875Z",
+ "updated-at": "2019-06-28T23:53:15.875Z"
+ },
+ "relationships": {
+ "policy-set": {
+ "data": {
+ "id": "polset-ws1CZBzm2h5K6ZT5",
+ "type": "policy-sets"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/policy-set-versions/polsetver-cXciu9nQwmk9Cfrn",
+ "upload": "https://archivist.terraform.io/v1/object/dmF1bHQ6djE6NWJPbHQ4QjV4R1ox..."
+ }
+ }
+}
+```
+
+The `upload` link URL in the above response is valid for one hour after the `created_at` timestamp of the policy set version. Make a `PUT` request to this URL directly, sending the policy set contents in `tar.gz` format as the request body. Once uploaded successfully, you can request the [Show Policy Set Version](#show-a-policy-set-version) endpoint again to verify that the status has changed from `pending` to `ready`.
+
+## Available related resources
+
+The GET endpoints above can optionally return related resources for policy sets, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource Name | Description |
+| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `current_version` | The most recent **successful** policy set version. |
+| `newest_version` | The most recently created policy set version, regardless of status. Note that this relationship may include an errored and unusable version, and is intended to allow checking for VCS errors. |
+| `policies` | Individually managed policies which are associated with the policy set. |
+| `projects` | The projects this policy set applies to. |
+| `workspaces` | The workspaces this policy set applies to. |
+| `workspace-exclusions` | The workspaces excluded from this policy set's enforcement. |
+
+The following resource types may be included for policy set versions:
+
+| Resource Name | Description |
+| ------------- | ---------------------------------------------------------------- |
+| `policy_set` | The policy set associated with the specified policy set version. |
+
+## Relationships
+
+The following relationships may be present in various responses for policy sets:
+
+| Resource Name | Description |
+| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `current-version` | The most recent **successful** policy set version. |
+| `newest-version` | The most recently created policy set version, regardless of status. Note that this relationship may include an errored and unusable version, and is intended to allow checking for VCS errors. |
+| `organization` | The organization associated with the specified policy set. |
+| `policies` | Individually managed policies which are associated with the policy set. |
+| `projects` | The projects this policy set applies to. |
+| `workspaces` | The workspaces this policy set applies to. |
+| `workspace-exclusions` | The workspaces excluded from this policy set's enforcement. |
+
+The following relationships may be present in various responses for policy set versions:
+
+| Resource Name | Description |
+| ------------- | ---------------------------------------------------------------- |
+| `policy-set` | The policy set associated with the specified policy set version. |
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/gpg-keys.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/gpg-keys.mdx
new file mode 100644
index 0000000000..3386ea42c3
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/gpg-keys.mdx
@@ -0,0 +1,388 @@
+---
+page_title: /gpg-keys API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/gpg-keys` endpoint to read, add, get,
+ update, and delete the GPG keys that HCP Terraform uses to sign private
+ providers.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# GPG keys API reference
+
+These endpoints are only relevant to private providers. When you [publish a private provider](/terraform/enterprise/registry/publish-providers) to the HCP Terraform private registry, you must upload the public key of the GPG key-pair that you used to sign the release. The HCP Terraform registry supports RSA or DSA formatted GPG keys. Refer to [Preparing and adding a signing key](/terraform/registry/providers/publishing#preparing-and-adding-a-signing-key) for more details.
+
+You need [owners team](/terraform/enterprise/users-teams-organizations/permissions#organization-owners) or [Manage Private Registry](/terraform/enterprise/users-teams-organizations/permissions#manage-private-registry) permissions to add, update, or delete GPG keys in a private registry.
+
+## List GPG Keys
+
+`GET /api/registry/:registry_name/v2/gpg-keys`
+
+### Parameters
+
+| Parameter | Description |
+| ---------------- | ------------------ |
+| `:registry_name` | Must be `private`. |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling does not automatically encode URLs.
+
+| Parameter | Description |
+| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `filter[namespace]` | **Required.** A comma-separated list of one or more namespaces. The namespaces must be an authorized HCP Terraform or Terraform Enterprise organization name. |
+| `page[number]` | **Optional.** If omitted, the endpoint returns the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint returns 20 GPG keys per page. |
+
+Gets a list of GPG keys belonging to the specified namespaces.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------ | --------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "gpg-keys"`) | Successfully fetched GPG keys |
+| [400][] | [JSON API error object][] | Error - missing namespaces in request |
+| [403][] | [JSON API error object][] | Forbidden - no authorized namespaces specified in request |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ "https://app.terraform.io/api/registry/private/v2/gpg-keys?filter%5Bnamespace%5D=my-organization,my-other-organization"
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "type": "gpg-keys",
+ "id": "1",
+ "attributes": {
+ "ascii-armor": "-----BEGIN PGP PUBLIC KEY BLOCK-----...",
+ "created-at": "2022-02-08T19:15:47Z",
+ "key-id": "C4E5E6C66C79C778",
+ "namespace": "my-other-organization",
+ "source": "",
+ "source-url": null,
+ "trust-signature": "",
+ "updated-at": "2022-02-08T19:15:47Z"
+ },
+ "links": {
+ "self": "/v2/gpg-keys/1"
+ }
+ },
+ {
+ "type": "gpg-keys",
+ "id": "140",
+ "attributes": {
+ "ascii-armor": "-----BEGIN PGP PUBLIC KEY BLOCK-----...",
+ "created-at": "2022-04-28T21:32:11Z",
+ "key-id": "C4E5E6C66C79C778",
+ "namespace": "my-organization",
+ "source": "",
+ "source-url": null,
+ "trust-signature": "",
+ "updated-at": "2022-04-28T21:32:11Z"
+ },
+ "links": {
+ "self": "/v2/gpg-keys/140"
+ }
+ }
+ ],
+ "links": {
+ "first": "/v2/gpg-keys?filter%5Bnamespace%5D=my-organization%2Cmy-other-organization&page%5Bnumber%5D=1&page%5Bsize%5D=15",
+ "last": "/v2/gpg-keys?filter%5Bnamespace%5D=my-organization%2Cmy-other-organization&page%5Bnumber%5D=1&page%5Bsize%5D=15",
+ "next": null,
+ "prev": null
+ },
+ "meta": {
+ "pagination": {
+ "page-size": 15,
+ "current-page": 1,
+ "next-page": null,
+ "prev-page": null,
+ "total-pages": 1,
+ "total-count": 2
+ }
+ }
+}
+```
+
+## Add a GPG Key
+
+`POST /api/registry/:registry_name/v2/gpg-keys`
+
+### Parameters
+
+| Parameter | Description |
+| ---------------- | ------------------ |
+| `:registry_name` | Must be `private`. |
+
+Uploads a GPG Key to a private registry scoped with a namespace. The response will provide a "key-id", which is required to [Create a Provider Version](/terraform/enterprise/api-docs/private-registry/provider-versions-platforms#create-a-provider-version).
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------ | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "gpg-keys"`) | Successfully uploads a GPG key to a private provider |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [403][] | [JSON API error object][] | Forbidden - not available for public providers |
+| [404][] | [JSON API error object][] | User not authorized |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------- | ------ | ------- | -------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"gpg-keys"`. |
+| `data.attributes.namespace` | string | | The namespace of the provider. Must be the same as the `organization_name` for the provider. |
+| `data.attributes.ascii-armor` | string | | A valid gpg-key string. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "gpg-keys",
+ "attributes": {
+ "namespace": "hashicorp",
+ "ascii-armor": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINB...=txfz\n-----END PGP PUBLIC KEY BLOCK-----\n"
+ } }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/registry/private/v2/gpg-keys
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "type": "gpg-keys",
+ "id": "23",
+ "attributes": {
+ "ascii-armor": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINB...=txfz\n-----END PGP PUBLIC KEY BLOCK-----\n",
+ "created-at": "2022-02-11T19:16:59Z",
+ "key-id": "32966F3FB5AC1129",
+ "namespace": "hashicorp",
+ "source": "",
+ "source-url": null,
+ "trust-signature": "",
+ "updated-at": "2022-02-11T19:16:59Z"
+ },
+ "links": {
+ "self": "/v2/gpg-keys/23"
+ }
+ }
+}
+```
+
+## Get GPG Key
+
+`GET /api/registry/:registry_name/v2/gpg-keys/:namespace/:key_id`
+
+### Parameters
+
+| Parameter | Description |
+| ---------------- | ---------------------------------------------------- |
+| `:registry_name` | Must be `private`. |
+| `:namespace` | The namespace of the provider scoped to the GPG key. |
+| `:key_id` | The id of the GPG key. |
+
+Gets the content of a GPG key.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------ | ---------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "gpg-keys"`) | Successfully fetched GPG key |
+| [403][] | [JSON API error object][] | Forbidden - not available for public providers |
+| [404][] | [JSON API error object][] | GPG key not found or user not authorized |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/registry/private/v2/gpg-keys/hashicorp/32966F3FB5AC1129
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "type": "gpg-keys",
+ "id": "2",
+ "attributes": {
+ "ascii-armor": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINB...=txfz\n-----END PGP PUBLIC KEY BLOCK-----\n",
+ "created-at": "2022-02-24T17:07:25Z",
+ "key-id": "32966F3FB5AC1129",
+ "namespace": "hashicorp",
+ "source": "",
+ "source-url": null,
+ "trust-signature": "",
+ "updated-at": "2022-02-24T17:07:25Z"
+ },
+ "links": {
+ "self": "/v2/gpg-keys/2"
+ }
+ }
+}
+```
+
+## Update a GPG Key
+
+`PATCH /api/registry/:registry_name/v2/gpg-keys/:namespace/:key_id`
+
+### Parameters
+
+| Parameter | Description |
+| ---------------- | ---------------------------------------------------- |
+| `:registry_name` | Must be `private`. |
+| `:namespace` | The namespace of the provider scoped to the GPG key. |
+| `:key_id` | The id of the GPG key. |
+
+Updates the specified GPG key. Only the `namespace` attribute can be updated, and `namespace` has to match an `organization` the user has permission to access.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------ | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "gpg-keys"`) | Successfully updates a GPG key |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [403][] | [JSON API error object][] | Forbidden - not available for public providers |
+| [404][] | [JSON API error object][] | GPG key not found or user not authorized |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| --------------------------- | ------ | ------- | -------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"gpg-keys"`. |
+| `data.attributes.namespace` | string | | The namespace of the provider. Must be the same as the `organization_name` for the provider. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "gpg-keys",
+ "attributes": {
+ "namespace": "new-namespace",
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/registry/private/v2/gpg-keys/hashicorp/32966F3FB5AC1129
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "type": "gpg-keys",
+ "id": "2",
+ "attributes": {
+ "ascii-armor": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINB...=txfz\n-----END PGP PUBLIC KEY BLOCK-----\n",
+ "created-at": "2022-02-24T17:07:25Z",
+ "key-id": "32966F3FB5AC1129",
+ "namespace": "new-name",
+ "source": "",
+ "source-url": null,
+ "trust-signature": "",
+ "updated-at": "2022-02-24T17:12:10Z"
+ },
+ "links": {
+ "self": "/v2/gpg-keys/2"
+ }
+ }
+}
+```
+
+## Delete a GPG Key
+
+`DELETE /api/registry/:registry_name/v2/gpg-keys/:namespace/:key_id`
+
+### Parameters
+
+| Parameter | Description |
+| ---------------- | ---------------------------------------------------- |
+| `:registry_name` | Must be `private`. |
+| `:namespace` | The namespace of the provider scoped to the GPG key. |
+| `:key_id` | The id of the GPG key. |
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------ | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "gpg-keys"`) | Successfully deletes a GPG key |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [403][] | [JSON API error object][] | Forbidden - not available for public providers |
+| [404][] | [JSON API error object][] | GPG key not found or user not authorized |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ --data @payload.json \
+ https://app.terraform.io/api/registry/private/v2/gpg-keys/hashicorp/32966F3FB5AC1129
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/manage-module-versions.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/manage-module-versions.mdx
new file mode 100644
index 0000000000..0b7f06da40
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/manage-module-versions.mdx
@@ -0,0 +1,272 @@
+---
+page_title: Manage module versions API reference for Terraform Enterprise
+description: >-
+ Use the module management endpoints to deprecate and revert the deprecation of
+ module versions you published to an organization's private registry.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[503]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/503
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Manage module versions API reference
+
+This topic provides reference information about API endpoints that let your deprecate module versions in your organization’s private registry.
+
+## Introduction
+
+When you deprecate a module version, HCP Terraform adds warnings to the module's registry page and to run outputs when anyone uses the deprecated version.
+
+
+
+@include "tfc-package-callouts/manage-module-versions.mdx"
+
+
+
+After deprecating a module version, you can revert that deprecated status to remove the warnings from that version in the registry and outputs. For more details on module deprecation, refer to [Deprecate module versions](/terraform/enterprise/registry/manage-module-versions).
+
+## Deprecate a module version
+
+Use this endpoint to deprecate a module version.
+
+`PATCH /api/v2/organizations/:organization_name/registry-modules/private/:organization_name/:module_name/:module_provider/:module_version`
+
+| Parameter | Description |
+| :------------------- | :------------------------------------------------------------- |
+| `:organization_name` | The name of the organization the module belongs to. |
+| `:module_name` | The name of the module whose version you want to deprecate. |
+| `:module_provider` | Specifies the Terraform provider that this module is used for. |
+| `:module_version` | The module version you want to deprecate. |
+
+This endpoint allows you to deprecate a specific module version. Deprecating a module version adds warnings to the run output of any consumers using this module.
+
+| Status | Response | Reason |
+| :----------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------- |
+| [200](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200) | [JSON API document](http://terraform/cloud-docs/api-docs#json-api-documents) | Successfully deprecated a module version. |
+| [404](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404) | [JSON API error object](http://jsonapi.org/format/#error-objects) | This organization is not authorized to deprecate this module version, or the module version does not exist. |
+| [422](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422) | [JSON API error object](http://jsonapi.org/format/#error-objects) | Malformed request body, for example the request is missing attributes or uses the wrong types. |
+| [500](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) or [503](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/503) | [JSON API error object](http://jsonapi.org/format/#error-objects) | Failure occurred while deprecating a module version. |
+
+### Sample payload
+
+```json
+{
+ "data": {
+ "type": "module-versions",
+ "attributes": {
+ "deprecation": {
+ "deprecated-status": "Deprecated",
+ "reason": "Deprecated due to a security vulnerability issue.",
+ "link": "https://www.hashicorp.com/"
+ }
+ }
+ }
+}
+```
+
+### Sample request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+https://app.terraform.io/api/v2/organizations/hashicorp/registry-modules/private/hashicorp/lb-http/google/11.0.0
+```
+
+### Sample response
+
+```json
+{
+ "data": {
+ "type": "module-versions",
+ "id": "1",
+ "relationships": {
+ "deprecation": {
+ "data": {
+ "id": "2",
+ "type": "deprecations"
+ }
+ }
+ }
+ },
+ "included": [
+ {
+ "type": "deprecations",
+ "id": "2",
+ "attributes": {
+ "link": "https://www.hashicorp.com/",
+ "reason": "Deprecated due to a security vulnerability issue. Applies will be blocked in 15 days."
+ }
+ }
+ ]
+}
+```
+
+## Revert the deprecation status for a module version
+
+Use this endpoint to revert the deprecation of a module version.
+
+`PATCH /api/v2/organizations/:organization_name/registry-modules/private/:organization_name/:module_name/:module_provider/:module_version`
+
+| Parameter | Description |
+| :------------------- | :------------------------------------------------------------- |
+| `:organization_name` | The name of the organization the module belongs to. |
+| `:module_name` | The name of the module you want to revert the deprecation of. |
+| `:module_provider` | Specifies the Terraform provider that this module is used for. |
+| `:module_version` | The module version you want to revert the deprecation of. |
+
+Deprecating a module version adds warnings to the run output of any consumers using this module. Reverting the deprecation status removes warnings from the output of consumers and fully reinstates the module version.
+
+| Status | Response | Reason |
+| :--------------------------------------------------------------------------- | :---------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------- |
+| [200](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200) | [JSON API document](http:///terraform/cloud-docs/api-docs#json-api-documents) | Successfully reverted a module version’s deprecation status and reinstated that version. |
+| [404](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404) | [JSON API error object](http://jsonapi.org/format/#error-objects) | This organization is not authorized to revert the depreciation of this module version, or the module version does not exist. |
+| [422](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422) | [JSON API error object](http://jsonapi.org/format/#error-objects) | Malformed request body, for example the request is missing attributes or uses the wrong types. |
+| [500](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) or [503] | [JSON API error object](http://jsonapi.org/format/#error-objects) | Failure occurred while reverting the deprecation of a module version. |
+
+### Sample request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+https://app.terraform.io/api/v2/organizations/hashicorp/registry-modules/private/hashicorp/lb-http/google/11.0.0
+```
+
+### Sample payload
+
+```json
+{
+ "data": {
+ "type": "module-versions",
+ "attributes": {
+ "deprecation": {
+ "deprecated-status": "Undeprecated"
+ }
+ }
+ }
+}
+```
+
+### Sample response
+
+```json
+{
+ "data": {
+ "type": "module-versions",
+ "id": "1"
+ }
+}
+```
+
+## Fetch a module version’s deprecation data
+
+Send a `GET` request to the `/modules/:GitHub-organization/:module/:provider/versions` endpoint to retrieve data about private registry modules, including the module's deprecation status. Refer to the [private registry module API example](/terraform/enterprise/api-docs/private-registry/modules#sample-registry-request-private-module) for additional information.
+
+For example, if you want to know the deprecation status of v0.0.1 of the `aws` provider’s `consul` module in your `my-cloud-org` organization, you could perform the following API call:
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/registry/v1/modules/my-cloud-org/consul/aws/0.0.1
+```
+
+If the module is deprecated, your response includes a `deprecation` key with the details of that module version’s deprecation.
+
+```json
+{
+ "id": "hashicorp/consul/aws/0.0.1",
+ "owner": "gruntwork-team",
+ "namespace": "hashicorp",
+ "name": "consul",
+ "version": "0.0.1",
+ "provider": "aws",
+ "description": "A Terraform Module for how to run Consul on AWS using Terraform and Packer"
+ // ... //
+ "deprecation": {
+ "reason": "This version was deprecated due to a vulnerability issue. Please upgrade to 0.0.2.",
+ "link": "https://hashicorp.com"
+ }
+}
+```
+
+To check the deprecation status of all of the `consul` module’s versions, you could perform the following API call:
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/registry/v1/modules/my-cloud-org/consul/aws/versions
+```
+
+The response includes multiple versions, and each version has a `deprecation` key listing the details of that module’s deprecation. If a module version has not been deprecated, the `deprecation` field returns `null`.
+
+```json
+{
+ "modules": [
+ {
+ "source": "hashicorp/consul/aws",
+ "versions": [
+ {
+ "version": "0.0.1",
+ // ... //
+ "deprecation": {
+ "reason": "security vulnerability",
+ "link": "www.hashicorp.com"
+ }
+ },
+ {
+ "version": "0.0.2",
+ "submodules": [],
+ "root": {
+ "dependencies": [],
+ "providers": [
+ {
+ "name": "template",
+ "version": ""
+ },
+ {
+ "name": "aws",
+ "version": ""
+ }
+ ]
+ },
+ "deprecation": null
+ }
+ ]
+ }
+ ]
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/modules.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/modules.mdx
new file mode 100644
index 0000000000..d5df734ece
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/modules.mdx
@@ -0,0 +1,942 @@
+---
+page_title: /registry-modules API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/registry-modules` endpoint to read,
+ publish, update, delete, and add versions to modules in your organization's
+ private registry.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Registry modules API reference
+
+-> **Note:** Public Module Curation is only available in HCP Terraform. Where applicable, the `registry_name` parameter must be `private` for Terraform Enterprise.
+
+## HCP Terraform Registry Implementation
+
+The HCP Terraform Module Registry implements the [Registry standard API](/terraform/registry/api-docs) for consuming/exposing private modules. Refer to the [Module Registry HTTP API](/terraform/registry/api-docs) to perform the following:
+
+- Browse available modules
+- Search modules by keyword
+- List available versions for a specific module
+- Download source code for a specific module version
+- List latest version of a module for all providers
+- Get the latest version for a specific module provider
+- Get a specific module
+- Download the latest version of a module
+
+For publicly curated modules, the HCP Terraform Module Registry acts as a proxy to the [Terraform Registry](https://registry.terraform.io) for the following:
+
+- List available versions for a specific module
+- Get a specific module
+- Get the latest version for a specific module provider
+
+The HCP Terraform Module Registry endpoints differs from the Module Registry endpoints in the following ways:
+
+- The `:namespace` parameter should be replaced with the organization name for private modules.
+- The private module registry discovery endpoints have the path prefix provided in the [discovery document](/terraform/registry/api-docs#service-discovery) which is currently `/api/registry/v1`.
+- The public module registry discovery endpoints have the path prefix provided in the [discovery document](/terraform/registry/api-docs#service-discovery) which is currently `/api/registry/public/v1`.
+- [Authentication](/terraform/enterprise/api-docs#authentication) is handled the same as all other HCP Terraform endpoints.
+
+### Sample Registry Request (private module)
+
+List available versions for the `consul` module for the `aws` provider on the module registry published from the Github organization `my-gh-repo-org`:
+
+```shell
+$ curl https://registry.terraform.io/v1/modules/my-gh-repo-org/consul/aws/versions
+```
+
+The same request for the same module and provider on the HCP Terraform module registry for the `my-cloud-org` organization:
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/registry/v1/modules/my-cloud-org/consul/aws/versions
+```
+
+### Sample Proxy Request (public module)
+
+List available versions for the `consul` module for the `aws` provider on the module registry published from the Github organization `my-gh-repo-org`:
+
+```shell
+$ curl https://registry.terraform.io/v1/modules/my-gh-repo-org/consul/aws/versions
+```
+
+The same request for the same module and provider on the HCP Terraform module registry:
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/registry/public/v1/modules/my-gh-repo-org/consul/aws/versions
+```
+
+## List Registry Modules for an Organization
+
+`GET /organizations/:organization_name/registry-modules`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------ |
+| `:organization_name` | The name of the organization to list available modules from. |
+
+Lists the modules that are available to a given organization. This includes the full list of publicly curated and private modules and is filterable.
+
+| Status | Response | Reason |
+| ------- | -------------------------------------------------- | -------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "registry-modules"`) | The request was successful |
+| [404][] | [JSON API error object][] | Modules not found or user unauthorized to perform action |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `q` | **Optional.** A search query string. Modules are searchable by name, namespace, provider fields. |
+| `filter[field name]` | **Optional.** If specified, restricts results to those with the matching field name value. Valid values are `registry_name`, `provider`, and `organization_name`. |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 registry modules per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --request GET \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/v2/organizations/my-organization/registry-modules
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "mod-kwt1cBiX2SdDz38w",
+ "type": "registry-modules",
+ "attributes": {
+ "name": "api-gateway",
+ "namespace": "my-organization",
+ "provider": "alicloud",
+ "status": "setup_complete",
+ "version-statuses": [
+ {
+ "version": "1.1.0",
+ "status": "ok"
+ }
+ ],
+ "created-at": "2021-04-07T19:01:18.528Z",
+ "updated-at": "2021-04-07T19:01:19.863Z",
+ "registry-name": "private",
+ "permissions": {
+ "can-delete": true,
+ "can-resync": true,
+ "can-retry": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/registry-modules/private/my-organization/api-gateway/alicloud"
+ }
+ },
+ {
+ "id": "mod-PopQnMtYDCcd3PRX",
+ "type": "registry-modules",
+ "attributes": {
+ "name": "aurora",
+ "namespace": "my-organization",
+ "provider": "aws",
+ "status": "setup_complete",
+ "version-statuses": [
+ {
+ "version": "4.1.0",
+ "status": "ok"
+ }
+ ],
+ "created-at": "2021-04-07T19:04:41.375Z",
+ "updated-at": "2021-04-07T19:04:42.828Z",
+ "registry-name": "private",
+ "permissions": {
+ "can-delete": true,
+ "can-resync": true,
+ "can-retry": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/registry-modules/private/my-organization/aurora/aws"
+ }
+ },
+ ...,
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/organizations/my-organization/registry-modules?page%5Bnumber%5D=1&page%5Bsize%5D=6",
+ "first": "https://app.terraform.io/api/v2/organizations/my-organization/registry-modules?page%5Bnumber%5D=1&page%5Bsize%5D=6",
+ "prev": null,
+ "next": "https://app.terraform.io/api/v2/organizations/my-organization/registry-modules?page%5Bnumber%5D=2&page%5Bsize%5D=6",
+ "last": "https://app.terraform.io/api/v2/organizations/my-organization/registry-modules?page%5Bnumber%5D=29&page%5Bsize%5D=6"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "page-size": 6,
+ "prev-page": null,
+ "next-page": 2,
+ "total-pages": 29,
+ "total-count": 169
+ }
+ }
+}
+```
+
+## Publish a Private Module from a VCS
+
+~> **Deprecation warning**: the following endpoint `POST /registry-modules` is replaced by the below endpoint and will be removed from future versions of the API!
+
+`POST /organizations/:organization_name/registry-modules/vcs`
+
+| Parameter | Description |
+| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to create a module in. The organization must already exist, and the token authenticating the API request must belong to a team or team member with the **Manage modules** permission enabled. |
+
+Publishes a new registry private module from a VCS repository, with module versions managed automatically by the repository's tags. The publishing process will fetch all tags in the source repository that look like [SemVer](https://semver.org/) versions with optional 'v' prefix. For each version, the tag is cloned and the config parsed to populate module details (input and output variables, readme, submodules, etc.). The [Module Registry Requirements](/terraform/registry/modules/publish#requirements) define additional requirements on naming, standard module structure and tags for releases.
+
+| Status | Response | Reason |
+| ------- | -------------------------------------------------- | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "registry-modules"`) | Successfully published module |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [404][] | [JSON API error object][] | User not authorized |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------------------------------- | ------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"registry-modules"`. |
+| `data.attributes.vcs-repo.identifier` | string | | The repository from which to ingress the configuration. |
+| `data.attributes.vcs-repo.oauth-token-id` | string | | The VCS Connection (OAuth Connection + Token) to use as identified. Get this ID from the [oauth-tokens](/terraform/enterprise/api-docs/oauth-tokens) endpoint. You can not specify this value if `github-app-installation-id` is specified. |
+| `data.attributes.vcs-repo.github-app-installation-id` | string | | The VCS Connection GitHub App Installation to use. Find this ID on the account settings page. Requires previously authorizing the GitHub App and generating a user-to-server token. Manage the token from **Account Settings** within HCP Terraform. You can not specify this value if `oauth-token-id` is specified. |
+| `data.attributes.vcs-repo.display_identifier` | string | | The display identifier for the repository. For most VCS providers outside of Bitbucket Cloud, this identifier matches the `data.attributes.vcs-repo.identifier` string. |
+| `data.attributes.no-code` | boolean | | Allows you to enable or disable the no-code publishing workflow for a module. |
+| `data.attributes.vcs-repo.branch` | string | | The repository branch to publish the module from if you are using the branch-based publishing workflow. If omitted, the module will be published using the tag-based publishing workflow. |
+
+A VCS repository identifier is a reference to a VCS repository in the format `:org/:repo`, where `:org` and `:repo` refer to the organization, or project key for Bitbucket Data Center, and repository in your VCS provider. The format for Azure DevOps is `:org/:project/_git/:repo`.
+
+The OAuth Token ID identifies the VCS connection, and therefore the organization, that the module will be created in.
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "vcs-repo": {
+ "identifier":"lafentres/terraform-aws-my-module",
+ "oauth-token-id":"ot-hmAyP66qk2AMVdbJ",
+ "display_identifier":"lafentres/terraform-aws-my-module",
+ "branch": "main"
+ },
+ "no-code": true
+ },
+ "type":"registry-modules"
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/registry-modules/vcs
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "mod-fZn7uHu99ZCpAKZJ",
+ "type": "registry-modules",
+ "attributes": {
+ "name": "my-module",
+ "namespace": "my-organization",
+ "registry-name": "private",
+ "provider": "aws",
+ "status": "pending",
+ "version-statuses": [],
+ "created-at": "2020-07-09T19:36:56.288Z",
+ "updated-at": "2020-07-09T19:36:56.288Z",
+ "vcs-repo": {
+ "branch": "",
+ "ingress-submodules": true,
+ "identifier": "lafentres/terraform-aws-my-module",
+ "display-identifier": "lafentres/terraform-aws-my-module",
+ "oauth-token-id": "ot-hmAyP66qk2AMVdbJ",
+ "webhook-url": "https://app.terraform.io/webhooks/vcs/a12b3456..."
+ },
+ "permissions": {
+ "can-delete": true,
+ "can-resync": true,
+ "can-retry": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/registry-modules/private/my-organization/my-module/aws"
+ }
+ }
+}
+```
+
+## Create a Module (with no VCS connection)
+
+`POST /organizations/:organization_name/registry-modules`
+
+| Parameter | Description |
+| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to create a module in. The organization must already exist, and the token authenticating the API request must belong to a team or team member with the **Manage modules** permission enabled. |
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+Creates a new registry module without a backing VCS repository.
+
+#### Private modules
+
+After creating a module, a version must be created and uploaded in order to be usable. Modules created this way do not automatically update with new versions; instead, you must explicitly create and upload each new version with the [Create a Module Version](#create-a-module-version) endpoint.
+
+#### Public modules
+
+When created, the public module record will be available in the organization's registry module list. You cannot create versions for public modules as they are maintained in the public registry.
+
+| Status | Response | Reason |
+| ------- | -------------------------------------------------- | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "registry-modules"`) | Successfully published module |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [403][] | [JSON API error object][] | Forbidden - public module curation disabled |
+| [404][] | [JSON API error object][] | User not authorized |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------- | ------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"registry-modules"`. |
+| `data.attributes.name` | string | | The name of this module. May contain alphanumeric characters, with dashes and underscores allowed in non-leading or trailing positions. Maximum length is 64 characters. |
+| `data.attributes.provider` | string | | Specifies the Terraform provider that this module is used for. May contain lowercase alphanumeric characters. Maximum length is 64 characters. |
+| `data.attributes.namespace` | string | | The namespace of this module. Cannot be set for private modules. May contain alphanumeric characters, with dashes and underscores allowed in non-leading or trailing positions. Maximum length is 64 characters. |
+| `data.attributes.registry-name` | string | | Indicates whether this is a publicly maintained module or private. Must be either `public` or `private`. |
+| `data.attributes.no-code` | boolean | | Allows you to enable or disable the no-code publishing workflow for a module. |
+
+### Sample Payload (private module)
+
+```json
+{
+ "data": {
+ "type": "registry-modules",
+ "attributes": {
+ "name": "my-module",
+ "provider": "aws",
+ "registry-name": "private",
+ "no-code": true
+ }
+ }
+}
+```
+
+### Sample Payload (public module)
+
+```json
+{
+ "data": {
+ "type": "registry-modules",
+ "attributes": {
+ "name": "vpc",
+ "namespace": "terraform-aws-modules",
+ "provider": "aws",
+ "registry-name": "public",
+ "no-code": true
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/registry-modules
+```
+
+### Sample Response (private module)
+
+```json
+{
+ "data": {
+ "id": "mod-fZn7uHu99ZCpAKZJ",
+ "type": "registry-modules",
+ "attributes": {
+ "name": "my-module",
+ "namespace": "my-organization",
+ "registry-name": "private",
+ "provider": "aws",
+ "status": "pending",
+ "version-statuses": [],
+ "created-at": "2020-07-09T19:36:56.288Z",
+ "updated-at": "2020-07-09T19:36:56.288Z",
+ "permissions": {
+ "can-delete": true,
+ "can-resync": true,
+ "can-retry": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/registry-modules/private/my-organization/my-module/aws"
+ }
+ }
+}
+```
+
+### Sample Response (public module)
+
+```json
+{
+ "data": {
+ "id": "mod-fZn7uHu99ZCpAKZJ",
+ "type": "registry-modules",
+ "attributes": {
+ "name": "vpc",
+ "namespace": "terraform-aws-modules",
+ "registry-name": "public",
+ "provider": "aws",
+ "status": "pending",
+ "version-statuses": [],
+ "created-at": "2020-07-09T19:36:56.288Z",
+ "updated-at": "2020-07-09T19:36:56.288Z",
+ "permissions": {
+ "can-delete": true,
+ "can-resync": true,
+ "can-retry": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/registry-modules/public/terraform-aws-modules/vpc/aws"
+ }
+ }
+}
+```
+
+## Create a Module Version
+
+~> **Deprecation warning**: the following endpoint `POST /registry-modules/:organization_name/:name/:provider/versions` is replaced by the below endpoint and will be removed from future versions of the API!
+
+`POST /organizations/:organization_name/registry-modules/:registry_name/:namespace/:name/:provider/versions`
+
+| Parameter | Description |
+| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to create a module in. The organization must already exist, and the token authenticating the API request must belong to a team or team member with the **Manage modules** permission enabled. |
+| `:namespace` | The namespace of the module for which the version is being created. For private modules this is the same as the `:organization_name` parameter |
+| `:name` | The name of the module for which the version is being created. |
+| `:provider` | The name of the provider for which the version is being created. |
+| `:registry-name` | Must be `private`. |
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+Creates a new registry module version. This endpoint only applies to private modules without a VCS repository and VCS-linked branch based modules. VCS-linked tag-based modules automatically create new versions for new tags. After creating the version for a non-VCS backed module, you should upload the module to the link that HCP Terraform returns.
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------------- | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "registry-module-versions"`) | Successfully published module version |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [403][] | [JSON API error object][] | Forbidden - not available for public modules |
+| [404][] | [JSON API error object][] | User not authorized |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ---------------------------- | ------ | ------- | --------------------------------------------------- |
+| `data.type` | string | | Must be `"registry-module-versions"`. |
+| `data.attributes.version` | string | | A valid semver version string. |
+| `data.attributes.commit-sha` | string | | The commit SHA to use to create the module version. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "registry-module-versions",
+ "attributes": {
+ "version": "1.2.3",
+ "commit-sha": "abcdef12345"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/registry-modules/private/my-organization/my-module/aws/versions
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "modver-qjjF7ArLXJSWU3WU",
+ "type": "registry-module-versions",
+ "attributes": {
+ "source": "tfe-api",
+ "status": "pending",
+ "version": "1.2.3",
+ "created-at": "2018-09-24T20:47:20.931Z",
+ "updated-at": "2018-09-24T20:47:20.931Z"
+ },
+ "relationships": {
+ "registry-module": {
+ "data": {
+ "id": "1881",
+ "type": "registry-modules"
+ }
+ }
+ },
+ "links": {
+ "upload": "https://archivist.terraform.io/v1/object/dmF1bHQ6djE6NWJPbHQ4QjV4R1ox..."
+ }
+ }
+}
+```
+
+## Add a Module Version (Private Module)
+
+`PUT https://archivist.terraform.io/v1/object/`
+
+**The URL is provided in the `upload` links attribute in the `registry-module-versions` resource.**
+
+### Expected Archive Format
+
+HCP Terraform expects the module version uploaded to be a gzip tarball with the module in the root (not in a subdirectory).
+
+Given the following folder structure:
+
+ terraform-null-test
+ ├── README.md
+ ├── examples
+ │ └── default
+ │ ├── README.md
+ │ └── main.tf
+ └── main.tf
+
+Package the files in an archive format by running `tar zcvf module.tar.gz *` in the module's directory.
+
+ ~$ cd terraform-null-test
+ terraform-null-test$ tar zcvf module.tar.gz *
+ a README.md
+ a examples
+ a examples/default
+ a examples/default/main.tf
+ a examples/default/README.md
+ a main.tf
+
+### Sample Request
+
+```shell
+curl \
+ --header "Content-Type: application/octet-stream" \
+ --request PUT \
+ --data-binary @module.tar.gz \
+ https://archivist.terraform.io/v1/object/dmF1bHQ6djE6NWJPbHQ4QjV4R1ox...
+```
+
+After the registry module version is successfully parsed, its status will become `"ok"`.
+
+## Get a Module
+
+~> **Deprecation warning**: the following endpoint `GET /registry-modules/show/:organization_name/:name/:provider` is replaced by the below endpoint and will be removed from future versions of the API!
+
+`GET /organizations/:organization_name/registry-modules/:registry_name/:namespace/:name/:provider`
+
+### Parameters
+
+| Parameter | Description |
+| -------------------- | ----------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization the module belongs to. |
+| `:namespace` | The namespace of the module. For private modules this is the name of the organization that owns the module. |
+| `:name` | The module name. |
+| `:provider` | The module provider. Must be lowercase alphanumeric. |
+| `:registry-name` | Either `public` or `private`. |
+
+| Status | Response | Reason |
+| ------- | -------------------------------------------------- | ------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "registry-modules"`) | The request was successful |
+| [403][] | [JSON API error object][] | Forbidden - public module curation disabled |
+| [404][] | [JSON API error object][] | Module not found or user unauthorized to perform action |
+
+### Sample Request (private module)
+
+```shell
+curl \
+ --request GET \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/my-organization/registry-modules/private/my-organization/my-module/aws
+```
+
+### Sample Request (public module)
+
+```shell
+curl \
+ --request GET \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/my-organization/registry-modules/public/terraform-aws-modules/vpc/aws
+```
+
+### Sample Response (private module)
+
+```json
+{
+ "data": {
+ "id": "mod-fZn7uHu99ZCpAKZJ",
+ "type": "registry-modules",
+ "attributes": {
+ "name": "my-module",
+ "provider": "aws",
+ "namespace": "my-organization",
+ "registry-name": "private",
+ "status": "setup_complete",
+ "version-statuses": [
+ {
+ "version": "1.0.0",
+ "status": "ok"
+ }
+ ],
+ "created-at": "2020-07-09T19:36:56.288Z",
+ "updated-at": "2020-07-09T20:16:20.538Z",
+ "vcs-repo": {
+ "branch": "",
+ "ingress-submodules": true,
+ "identifier": "lafentres/terraform-aws-my-module",
+ "display-identifier": "lafentres/terraform-aws-my-module",
+ "oauth-token-id": "ot-hmAyP66qk2AMVdbJ",
+ "webhook-url": "https://app.terraform.io/webhooks/vcs/a12b3456..."
+ },
+ "permissions": {
+ "can-delete": true,
+ "can-resync": true,
+ "can-retry": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/registry-modules/private/my-organization/my-module/aws"
+ }
+ }
+}
+```
+
+### Sample Response (public module)
+
+```json
+{
+ "data": {
+ "id": "mod-fZn7uHu99ZCpAKZJ",
+ "type": "registry-modules",
+ "attributes": {
+ "name": "vpc",
+ "provider": "aws",
+ "namespace": "terraform-aws-modules",
+ "registry-name": "public",
+ "status": "setup_complete",
+ "version-statuses": [],
+ "created-at": "2020-07-09T19:36:56.288Z",
+ "updated-at": "2020-07-09T20:16:20.538Z",
+ "permissions": {
+ "can-delete": true,
+ "can-resync": true,
+ "can-retry": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/registry-modules/public/terraform-aws-modules/vpc/aws"
+ }
+ }
+}
+```
+
+## Update a Private Registry Module
+
+`PATCH /organizations/:organization_name/registry-modules/private/:namespace/:name/:provider/`
+
+### Parameters
+
+| Parameter | Description |
+| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to update a module from. The organization must already exist, and the token authenticating the API request must belong to the `owners` team or a member of the `owners` team. |
+| `:namespace` | The module namespace that the update affects. For private modules this is the name of the organization that owns the module. |
+| `:name` | The module name that the update affects. |
+| `:provider` | The name of the provider of the module that is being updated. |
+
+### Request Body
+
+These PATCH endpoints require a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------------------- | ------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `data.type` | string | | Must be `"registry-modules"`. |
+| `data.attributes.vcs-repo.branch` | string | (previous value) | The repository branch that Terraform executes tests and publishes new versions from. This cannot be used with the `data.attributes.vcs-repo.tags` key. |
+| `data.attributes.vcs-repo.tags` | boolean | (previous value) | Whether the registry module should be tag-based. This cannot be used with the `data.attributes.vcs-repo.branch` key. |
+| `data.attributes.test-config.tests-enabled` | boolean | (previous value) | Allows you to enable or disable tests for the module. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "vcs-repo": {
+ "branch": "main",
+ "tags": false
+ },
+ "test-config": {
+ "tests-enabled": true
+ }
+ },
+ "type": "registry-modules"
+ }
+}
+```
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/registry-modules/private/my-organization/registry-name/registry-provider/
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "mod-fZn7uHu99ZCpAKZJ",
+ "type": "registry-modules",
+ "attributes": {
+ "name": "my-module",
+ "namespace": "my-organization",
+ "registry-name": "private",
+ "provider": "aws",
+ "status": "pending",
+ "version-statuses": [],
+ "created-at": "2020-07-09T19:36:56.288Z",
+ "updated-at": "2020-07-09T19:36:56.288Z",
+ "vcs-repo": {
+ "branch": "main",
+ "ingress-submodules": true,
+ "identifier": "lafentres/terraform-aws-my-module",
+ "display-identifier": "lafentres/terraform-aws-my-module",
+ "oauth-token-id": "ot-hmAyP66qk2AMVdbJ",
+ "webhook-url": "https://app.terraform.io/webhooks/vcs/a12b3456..."
+ },
+ "permissions": {
+ "can-delete": true,
+ "can-resync": true,
+ "can-retry": true
+ },
+ "test-config": {
+ "id": "tc-tcR6bxV5zE75Zb3B",
+ "tests-enabled": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/registry-modules/private/my-organization/my-module/aws"
+ }
+ }
+}
+```
+
+## Delete a Module
+
+
+ **Deprecation warning**: the following endpoints:
+
+- `POST /registry-modules/actions/delete/:organization_name/:name/:provider/:version`
+- `POST /registry-modules/actions/delete/:organization_name/:name/:provider`
+- `POST /registry-modules/actions/delete/:organization_name/:name`
+
+are replaced by the below endpoints and will be removed from future versions of the API!
+
+
+
+- `DELETE /organizations/:organization_name/registry-modules/:registry_name/:namespace/:name/:provider/:version`
+- `DELETE /organizations/:organization_name/registry-modules/:registry_name/:namespace/:name/:provider`
+- `DELETE /organizations/:organization_name/registry-modules/:registry_name/:namespace/:name`
+
+### Parameters
+
+| Parameter | Description |
+| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to delete a module from. The organization must already exist, and the token authenticating the API request must belong to the "owners" team or a member of the "owners" team. |
+| `:namespace` | The module namespace that the deletion will affect. For private modules this is the name of the organization that owns the module. |
+| `:name` | The module name that the deletion will affect. |
+| `:provider` | If specified, the provider for the module that the deletion will affect. |
+| `:version` | If specified, the version for the module and provider that will be deleted. |
+| `:registry_name` | Either `public` or `private` |
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+When removing modules, there are three versions of the endpoint, depending on how many parameters are specified.
+
+- If all parameters (module namespace, name, provider, and version) are specified, the specified version for the given provider of the module is deleted.
+- If module namespace, name, and provider are specified, the specified provider for the given module is deleted along with all its versions.
+- If only module namespace and name are specified, the entire module is deleted.
+
+For public modules, only the the endpoint specifying the module namespace and name is valid. The other DELETE endpoints will 404.
+For public modules, this only removes the record from the organization's HCP Terraform Registry and does not remove the public module from registry.terraform.io.
+
+If a version deletion would leave a provider with no versions, the provider will be deleted. If a provider deletion would leave a module with no providers, the module will be deleted.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------- |
+| [204][] | No Content | Success |
+| [403][] | [JSON API error object][] | Forbidden - public module curation disabled |
+| [404][] | [JSON API error object][] | Module, provider, or version not found or user not authorized |
+
+### Sample Request (private module)
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/organizations/my-organization/registry-modules/private/my-organization/my-module/aws/2.0.0
+```
+
+### Sample Request (public module)
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/organizations/my-organization/registry-modules/public/terraform-aws-modules/vpc/aws
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/provider-versions-platforms.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/provider-versions-platforms.mdx
new file mode 100644
index 0000000000..029dda55df
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/provider-versions-platforms.mdx
@@ -0,0 +1,707 @@
+---
+page_title: /registry-providers API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/registry-providers` endpoint to read,
+ create, and delete private providers versions and platforms in your private
+ registry.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Private provider versions and platforms API reference
+
+These endpoints are only relevant to private providers. When you [publish a private provider](/terraform/enterprise/registry/publish-providers) to the HCP Terraform private registry, you must also create at least one version and at least one platform for that version before consumers can use the provider in configurations. Unlike the public Terraform Registry, the private registry does not automatically upload new releases. You must manually add new provider versions and the associated release files.
+
+All members of an organization can view and use both public and private providers, but you need [owners team](/terraform/enterprise/users-teams-organizations/permissions#organization-owners) or [Manage Private Registry](/terraform/enterprise/users-teams-organizations/permissions#manage-private-registry) permissions to add, update, or delete provider versions and platforms in private registry.
+
+## Create a Provider Version
+
+`POST /organizations/:organization_name/registry-providers/:registry_name/:namespace/:name/versions`
+
+The private registry does not automatically update private providers when you release new versions. You must use this endpoint to add each new version. Consumers cannot use new versions until you upload all [required release files](/terraform/enterprise/registry/publish-providers#release-files) and [Create a Provider Platform](#create-a-provider-platform).
+
+### Parameters
+
+| Parameter | Description |
+| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to create a provider in. The organization must already exist, and the token authenticating the API request must belong to the "owners" team or a member of the "owners" team. |
+| `:registry_name` | Must be `private`. |
+| `:namespace` | The namespace of the provider for which the version is being created. For private providers this is the same as the `:organization_name` parameter. |
+| `:name` | The name of the provider for which the version is being created. |
+
+Creates a new registry provider version. This endpoint only applies to private providers.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------------ | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "registry-provider-versions"`) | Success |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [403][] | [JSON API error object][] | Forbidden - not available for public providers |
+| [404][] | [JSON API error object][] | User not authorized |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| --------------------------- | ------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"registry-provider-versions"`. |
+| `data.attributes.version` | string | | A valid semver version string. |
+| `data.attributes.key-id` | string | | A valid gpg-key string. |
+| `data.attributes.protocols` | array | | An array of Terraform provider API versions that this version supports. Must be one or all of the following values `["4.0","5.0","6.0"]`. |
+
+-> **Note:** Only Terraform 0.13 and later support third-party provider registries, and that Terraform version requires provider API version 5.0 or later. So you do not need to list major versions 4.0 or earlier in the `protocols` attribute.
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "registry-provider-versions",
+ "attributes": {
+ "version": "3.1.1",
+ "key-id": "32966F3FB5AC1129",
+ "protocols": ["5.0"]
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "provver-y5KZUsSBRLV9zCtL",
+ "type": "registry-provider-versions",
+ "attributes": {
+ "version": "3.1.1",
+ "created-at": "2022-02-11T19:16:59.876Z",
+ "updated-at": "2022-02-11T19:16:59.876Z",
+ "key-id": "32966F3FB5AC1129",
+ "protocols": ["5.0"],
+ "permissions": {
+ "can-delete": true,
+ "can-upload-asset": true
+ },
+ "shasums-uploaded": false,
+ "shasums-sig-uploaded": false
+ },
+ "relationships": {
+ "registry-provider": {
+ "data": {
+ "id": "prov-cmEmLstBfjNNA9F3",
+ "type": "registry-providers"
+ }
+ },
+ "platforms": {
+ "data": [],
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions/3.1.1/platforms"
+ }
+ }
+ },
+ "links": {
+ "shasums-upload": "https://archivist.terraform.io/v1/object/dmF1b...",
+ "shasums-sig-upload": "https://archivist.terraform.io/v1/object/dmF1b..."
+ }
+ }
+}
+
+```
+
+## Get All Versions for a Single Provider
+
+`GET /organizations/:organization_name/registry-providers/:registry_name/:namespace/:name/versions/`
+
+### Parameters
+
+| Parameter | Description |
+| -------------------- | -------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization the provider belongs to. |
+| `:registry_name` | Must be `private`. |
+| `:namespace` | The namespace of the provider. Must be the same as the `organization_name` for the provider. |
+| `:name` | The provider name. |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | --------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "registry-providers"`) | Success |
+| [403][] | [JSON API error object][] | Forbidden - public provider curation disabled |
+| [404][] | [JSON API error object][] | Provider not found or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --request GET \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "provver-y5KZUsSBRLV9zCtL",
+ "type": "registry-provider-versions",
+ "attributes": {
+ "version": "3.1.1",
+ "created-at": "2022-02-11T19:16:59.876Z",
+ "updated-at": "2022-02-11T19:16:59.876Z",
+ "key-id": "32966F3FB5AC1129",
+ "protocols": ["5.0"],
+ "permissions": {
+ "can-delete": true,
+ "can-upload-asset": true
+ },
+ "shasums-uploaded": true,
+ "shasums-sig-uploaded": true
+ },
+ "relationships": {
+ "registry-provider": {
+ "data": {
+ "id": "prov-cmEmLstBfjNNA9F3",
+ "type": "registry-providers"
+ }
+ },
+ "platforms": {
+ "data": [
+ {
+ "id": "provpltfrm-GSHhNzptr9s3WoLD",
+ "type": "registry-provider-platforms"
+ },
+ {
+ "id": "provpltfrm-A1PHitiM2KkKpVoM",
+ "type": "registry-provider-platforms"
+ },
+ {
+ "id": "provpltfrm-BLJWvWyJ2QMs525k",
+ "type": "registry-provider-platforms"
+ },
+ {
+ "id": "provpltfrm-qQYosUguetYtXGzJ",
+ "type": "registry-provider-platforms"
+ },
+ {
+ "id": "provpltfrm-pjDHFN46y193bS7t",
+ "type": "registry-provider-platforms"
+ }
+ ],
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions/3.1.1/platforms"
+ }
+ }
+ },
+ "links": {
+ "shasums-download": "https://archivist.terraform.io/v1/object/dmF1b...",
+ "shasums-sig-download": "https://archivist.terraform.io/v1/object/dmF1b..."
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "page-size": 20,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 1
+ }
+ }
+}
+```
+
+**Note:** The `shasums-uploaded` and `shasums-sig-uploaded` properties will be false if those files have not been uploaded to Archivist. In this case, instead of including links to `shasums-download` and `shasums-sig-download`, the response will include upload links (`shasums-upload` and `shasums-sig-upload`).
+
+## Get a Version
+
+`GET /organizations/:organization_name/registry-providers/:registry_name/:namespace/:name/versions/:version`
+
+### Parameters
+
+| Parameter | Description |
+| -------------------- | -------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization the provider belongs to. |
+| `:registry_name` | Must be `private`. |
+| `:namespace` | The namespace of the provider. Must be the same as the `organization_name` for the provider. |
+| `:name` | The provider name. |
+| `:version` | The version of the provider being created to which different platforms can be added. |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | --------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "registry-providers"`) | Success |
+| [403][] | [JSON API error object][] | Forbidden - public provider curation disabled |
+| [404][] | [JSON API error object][] | Provider not found or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --request GET \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions/3.1.1
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "provver-y5KZUsSBRLV9zCtL",
+ "type": "registry-provider-versions",
+ "attributes": {
+ "version": "3.1.1",
+ "created-at": "2022-02-11T19:16:59.876Z",
+ "updated-at": "2022-02-11T19:16:59.876Z",
+ "key-id": "32966F3FB5AC1129",
+ "protocols": ["5.0"],
+ "permissions": {
+ "can-delete": true,
+ "can-upload-asset": true
+ },
+ "shasums-uploaded": true,
+ "shasums-sig-uploaded": true
+ },
+ "relationships": {
+ "registry-provider": {
+ "data": {
+ "id": "prov-cmEmLstBfjNNA9F3",
+ "type": "registry-providers"
+ }
+ },
+ "platforms": {
+ "data": [
+ {
+ "id": "provpltfrm-GSHhNzptr9s3WoLD",
+ "type": "registry-provider-platforms"
+ },
+ {
+ "id": "provpltfrm-A1PHitiM2KkKpVoM",
+ "type": "registry-provider-platforms"
+ },
+ {
+ "id": "provpltfrm-BLJWvWyJ2QMs525k",
+ "type": "registry-provider-platforms"
+ },
+ {
+ "id": "provpltfrm-qQYosUguetYtXGzJ",
+ "type": "registry-provider-platforms"
+ },
+ {
+ "id": "provpltfrm-pjDHFN46y193bS7t",
+ "type": "registry-provider-platforms"
+ }
+ ],
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions/3.1.1/platforms"
+ }
+ }
+ },
+ "links": {
+ "shasums-download": "https://archivist.terraform.io/v1/object/dmF1b...",
+ "shasums-sig-download": "https://archivist.terraform.io/v1/object/dmF1b..."
+ }
+ }
+}
+```
+
+**Note:** `shasums-uploaded` and `shasums-sig-uploaded` will be false if those files haven't been uploaded to Archivist yet. In this case, instead of including links to `shasums-download` and `shasums-sig-download`, the response will include upload links (`shasums-upload` and `shasums-sig-upload`).
+
+## Delete a Version
+
+`DELETE /organizations/:organization_name/registry-providers/:registry_name/:namespace/:name/versions/:provider_version`
+
+### Parameters
+
+| Parameter | Description |
+| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to delete a provider version from. The organization must already exist, and the token authenticating the API request must belong to the "owners" team or a member of the "owners" team. |
+| `:registry_name` | Must be `private`. |
+| `:namespace` | The namespace of the provider for which the version is being deleted. For private providers this is the same as the `:organization_name` parameter. |
+| `:name` | The name of the provider for which the version is being deleted. |
+| `:version` | The version for the provider that will be deleted along with its corresponding platforms. |
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ----------------------------------------------------------- |
+| [204][] | No Content | Success |
+| [403][] | [JSON API error object][] | Forbidden - public provider curation disabled |
+| [404][] | [JSON API error object][] | Provider not found or user not authorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/public/hashicorp/aws/versions/3.1.1
+```
+
+## Create a Provider Platform
+
+`POST /organizations/:organization_name/registry-providers/:registry_name/:namespace/:name/versions/:version/platforms`
+
+Platforms are binaries that allow the provider to run on a particular operating system and architecture combination (e.g., Linux and AMD64). GoReleaser creates binaries automatically when you [create a release on GitHub](/terraform/registry/providers/publishing#creating-a-github-release) or [create a release locally](/terraform/registry/providers/publishing#using-goreleaser-locally).
+
+You must upload one or more platforms for each version of a private provider. After you create a platform, you must upload the platform binary file to the `provider-binary-upload` URL.
+
+### Parameters
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to create a provider platform in. The organization must already exist, and the token authenticating the API request must belong to the "owners" team or a member of the "owners" team. |
+| `:registry_name` | Must be `private`. |
+| `:namespace` | The namespace of the provider for which the platform is being created. For private providers this is the same as the `:organization_name` parameter. |
+| `:name` | The name of the provider for which the platform is being created. |
+| `:version` | The provider version of the provider for which the platform is being created. |
+
+Creates a new registry provider platform. This endpoint only applies to private providers.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------------- | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "registry-provider-platforms"`) | Success |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [403][] | [JSON API error object][] | Forbidden - not available for public providers |
+| [404][] | [JSON API error object][] | User not authorized |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------------------------- | ------ | ------- | ---------------------------------------- |
+| `data.type` | string | | Must be `"registry-provider-platforms"`. |
+| `data.attributes.os` | string | | A valid operating system string. |
+| `data.attributes.arch` | string | | A valid architecture string. |
+| `data.attributes.shasum` | string | | A valid shasum string. |
+| `data.attributes.filename` | string | | A valid filename string. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "registry-provider-version-platforms",
+ "attributes": {
+ "os": "linux",
+ "arch": "amd64",
+ "shasum": "8f69533bc8afc227b40d15116358f91505bb638ce5919712fbb38a2dec1bba38",
+ "filename": "terraform-provider-aws_3.1.1_linux_amd64.zip"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions/3.1.1/platforms
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "provpltfrm-BLJWvWyJ2QMs525k",
+ "type": "registry-provider-platforms",
+ "attributes": {
+ "os": "linux",
+ "arch": "amd64",
+ "filename": "terraform-provider-aws_3.1.1_linux_amd64.zip",
+ "shasum": "8f69533bc8afc227b40d15116358f91505bb638ce5919712fbb38a2dec1bba38",
+ "permissions": {
+ "can-delete": true,
+ "can-upload-asset": true
+ },
+ "provider-binary-uploaded": false
+ },
+ "relationships": {
+ "registry-provider-version": {
+ "data": {
+ "id": "provver-y5KZUsSBRLV9zCtL",
+ "type": "registry-provider-versions"
+ }
+ }
+ },
+ "links": {
+ "provider-binary-upload": "https://archivist.terraform.io/v1/object/dmF1b..."
+ }
+ }
+}
+
+```
+
+## Get All Platforms for a Single Version
+
+`GET /organizations/:organization_name/registry-providers/:registry_name/:namespace/:name/versions/:version/platforms`
+
+### Parameters
+
+| Parameter | Description |
+| -------------------- | -------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization the provider belongs to. |
+| `:registry_name` | Must be `private`. |
+| `:namespace` | The namespace of the provider. Must be the same as the `organization_name` for the provider. |
+| `:name` | The provider name. |
+| `:version` | The version of the provider. |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | --------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "registry-providers"`) | Success |
+| [403][] | [JSON API error object][] | Forbidden - public provider curation disabled |
+| [404][] | [JSON API error object][] | Provider not found or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --request GET \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions/3.1.1/platforms
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "provpltfrm-GSHhNzptr9s3WoLD",
+ "type": "registry-provider-platforms",
+ "attributes": {
+ "os": "darwin",
+ "arch": "amd64",
+ "filename": "terraform-provider-aws_3.1.1_darwin_amd64.zip",
+ "shasum": "fd580e71bd76d76913e1925f2641be9330c536464af9a08a5b8994da65a26cbc",
+ "permissions": {
+ "can-delete": true,
+ "can-upload-asset": true
+ },
+ "provider-binary-uploaded": true
+ },
+ "relationships": {
+ "registry-provider-version": {
+ "data": {
+ "id": "provver-y5KZUsSBRLV9zCtL",
+ "type": "registry-provider-versions"
+ }
+ }
+ },
+ "links": {
+ "provider-binary-download": "https://archivist.terraform.io/v1/object/dmF1b..."
+ }
+ },
+ {
+ "id": "provpltfrm-A1PHitiM2KkKpVoM",
+ "type": "registry-provider-platforms",
+ "attributes": {
+ "os": "darwin",
+ "arch": "arm64",
+ "filename": "terraform-provider-aws_3.1.1_darwin_arm64.zip",
+ "shasum": "de3c351d7f35a3c8c583c0da5c1c4d558b8cea3731a49b15f63de5bbbafc0165",
+ "permissions": {
+ "can-delete": true,
+ "can-upload-asset": true
+ },
+ "provider-binary-uploaded": true
+ },
+ "relationships": {
+ "registry-provider-version": {
+ "data": {
+ "id": "provver-y5KZUsSBRLV9zCtL",
+ "type": "registry-provider-versions"
+ }
+ }
+ },
+ "links": {
+ "provider-binary-download": "https://archivist.terraform.io/v1/object/dmF1b..."
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions/3.1.1/platforms?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions/3.1.1/platforms?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions/3.1.1/platforms?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "page-size": 20,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 2
+ }
+ }
+}
+```
+
+**Note:** The `provider-binary-uploaded` property will be `false` if that file has not been uploaded to Archivist. In this case, instead of including a link to `provider-binary-download`, the response will include an upload link `provider-binary-upload`.
+
+## Get a Platform
+
+`GET /organizations/:organization_name/registry-providers/:registry_name/:namespace/:name/versions/:version/platforms/:os/:arch`
+
+### Parameters
+
+| Parameter | Description |
+| -------------------- | -------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization the provider belongs to. |
+| `:registry_name` | Must be `private`. |
+| `:namespace` | The namespace of the provider. Must be the same as the `organization_name` for the provider. |
+| `:name` | The provider name. |
+| `:version` | The version of the provider. |
+| `:os` | The operating system of the provider platform. |
+| `:arch` | The architecture of the provider platform. |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | --------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "registry-providers"`) | Success |
+| [403][] | [JSON API error object][] | Forbidden - public provider curation disabled |
+| [404][] | [JSON API error object][] | Provider not found or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --request GET \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions/3.1.1/platforms/linux/amd64
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "provpltfrm-BLJWvWyJ2QMs525k",
+ "type": "registry-provider-platforms",
+ "attributes": {
+ "os": "linux",
+ "arch": "amd64",
+ "filename": "terraform-provider-aws_3.1.1_linux_amd64.zip",
+ "shasum": "8f69533bc8afc227b40d15116358f91505bb638ce5919712fbb38a2dec1bba38",
+ "permissions": {
+ "can-delete": true,
+ "can-upload-asset": true
+ },
+ "provider-binary-uploaded": true
+ },
+ "relationships": {
+ "registry-provider-version": {
+ "data": {
+ "id": "provver-y5KZUsSBRLV9zCtL",
+ "type": "registry-provider-versions"
+ }
+ }
+ },
+ "links": {
+ "provider-binary-download": "https://archivist.terraform.io/v1/object/dmF1b..."
+ }
+ }
+}
+```
+
+**Note:** The `provider-binary-uploaded` property will be `false` if that file has not been uploaded to Archivist. In this case, instead of including a link to `provider-binary-download`, the response will include an upload link `provider-binary-upload`.
+
+## Delete a Platform
+
+`DELETE /organizations/:organization_name/registry-providers/:registry_name/:namespace/:name/versions/:version/platforms/:os/:arch`
+
+### Parameters
+
+| Parameter | Description |
+| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to delete a provider platform from. The organization must already exist, and the token authenticating the API request must belong to the "owners" team or a member of the "owners" team. |
+| `:registry_name` | Must be `private`. |
+| `:namespace` | The namespace of the provider for which the platform is being deleted. For private providers this is the same as the `:organization_name` parameter. |
+| `:name` | The name of the provider for which the platform is being deleted. |
+| `:version` | The version for which the platform is being deleted. |
+| `:os` | The operating system of the provider platform that is being deleted. |
+| `:arch` | The architecture of the provider platform that is being deleted. |
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ----------------------------------------------------------- |
+| [204][] | No Content | Success |
+| [403][] | [JSON API error object][] | Forbidden - public provider curation disabled |
+| [404][] | [JSON API error object][] | Provider not found or user not authorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws/versions/3.1.1/platforms/linux/amd64
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/providers.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/providers.mdx
new file mode 100644
index 0000000000..44719c2f16
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/providers.mdx
@@ -0,0 +1,471 @@
+---
+page_title: /registry-providers API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's organization `/registry-providers` endpoint
+ to list, create, get, and delete providers in your private registry.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Registry providers API reference
+
+You can add publicly curated providers from the [Terraform Registry](https://registry.terraform.io/) and custom, private providers to your HCP Terraform private registry. The private registry stores a pointer to public providers so that you can view their data from within HCP Terraform. This lets you clearly designate all of the providers that are recommended for the organization and makes them centrally accessible.
+
+All members of an organization can view and use both public and private providers, but you need [owners team](/terraform/enterprise/users-teams-organizations/permissions#organization-owners) or [Manage Private Registry](/terraform/enterprise/users-teams-organizations/permissions#manage-private-registry) permissions to add, update, or delete them them in private registry.
+
+## HCP Terraform Registry Implementation
+
+For publicly curated providers, the HCP Terraform Registry acts as a proxy to the [Terraform Registry](https://registry.terraform.io) for the following:
+
+- The public registry discovery endpoints have the path prefix provided in the [discovery document](/terraform/registry/api-docs#service-discovery) which is currently `/api/registry/public/v1`.
+- [Authentication](/terraform/enterprise/api-docs#authentication) is handled the same as all other HCP Terraform endpoints.
+
+## List Terraform Registry Providers for an Organization
+
+`GET /organizations/:organization_name/registry-providers`
+
+### Parameters
+
+| Parameter | Description |
+| -------------------- | -------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to list available providers from. |
+
+Lists the providers included in the private registry for the specified organization.
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | ---------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "registry-providers"`) | Success |
+| [404][] | [JSON API error object][] | Providers not found or user unauthorized to perform action |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `q` | **Optional.** A search query string. Providers are searchable by both their name and their namespace fields. |
+| `filter[field name]` | **Optional.** If specified, restricts results to those with the matching field name value. Valid values are `registry_name`, and `organization_name`. |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 registry providers per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --request GET \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/v2/organizations/my-organization/registry-providers
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "prov-kwt1cBiX2SdDz38w",
+ "type": "registry-providers",
+ "attributes": {
+ "name": "aws",
+ "namespace": "my-organization",
+ "created-at": "2021-04-07T19:01:18.528Z",
+ "updated-at": "2021-04-07T19:01:19.863Z",
+ "registry-name": "public",
+ "permissions": {
+ "can-delete": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/registry-providers/public/my-organization/aws"
+ }
+ },
+ {
+ "id": "prov-PopQnMtYDCcd3PRX",
+ "type": "registry-providers",
+ "attributes": {
+ "name": "aurora",
+ "namespace": "my-organization",
+ "created-at": "2021-04-07T19:04:41.375Z",
+ "updated-at": "2021-04-07T19:04:42.828Z",
+ "registry-name": "public",
+ "permissions": {
+ "can-delete": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/registry-providers/public/my-organization/aurora"
+ }
+ },
+ ...,
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/organizations/my-organization/registry-providers?page%5Bnumber%5D=1&page%5Bsize%5D=6",
+ "first": "https://app.terraform.io/api/v2/organizations/my-organization/registry-providers?page%5Bnumber%5D=1&page%5Bsize%5D=6",
+ "prev": null,
+ "next": "https://app.terraform.io/api/v2/organizations/my-organization/registry-providers?page%5Bnumber%5D=2&page%5Bsize%5D=6",
+ "last": "https://app.terraform.io/api/v2/organizations/my-organization/registry-providers?page%5Bnumber%5D=29&page%5Bsize%5D=6"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "page-size": 6,
+ "prev-page": null,
+ "next-page": 2,
+ "total-pages": 29,
+ "total-count": 169
+ }
+ }
+}
+```
+
+## Create a Provider
+
+`POST /organizations/:organization_name/registry-providers`
+
+Use this endpoint to create both public and private providers:
+
+- **Public providers:** The public provider record will be available in the organization's registry provider list immediately after creation. You cannot create versions for public providers; you must use the versions available on the Terraform Registry.
+- **Private providers:** The private provider record will be available in the organization's registry provider list immediately after creation, but you must [create a version and upload release assets](/terraform/enterprise/registry/publish-providers#publishing-a-provider-and-creating-a-version) before consumers can use it. The private registry does not automatically update private providers when you release new versions. You must add each new version with the [Create a Provider Version](/terraform/enterprise/api-docs/private-registry/provider-versions-platforms#create-a-provider-version) endpoint.
+
+### Parameters
+
+| Parameter | Description |
+| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to create a provider in. The organization must already exist, and the token authenticating the API request must belong to the "owners" team or a member of the "owners" team. |
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "registry-providers"`) | Successfully published provider |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [403][] | [JSON API error object][] | Forbidden - public provider curation disabled |
+| [404][] | [JSON API error object][] | User not authorized |
+
+### Request Body
+
+~> **Important:** For private providers, you must also create a version, a platform, and upload release assets before consumers can use the provider. Refer to [Publishing a Private Provider](/terraform/enterprise/registry/publish-providers) for more details.
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------- | ------ | ------- | ------------------------------------------------------------------------------------------------------------ |
+| `data.type` | string | | Must be `"registry-providers"`. |
+| `data.attributes.name` | string | | The name of the provider. |
+| `data.attributes.namespace` | string | | The namespace of the provider. For private providers this is the same as the `:organization_name` parameter. |
+| `data.attributes.registry-name` | string | | Whether this is a publicly maintained provider or private. Must be either `public` or `private`. |
+
+### Sample Payload (Private Provider)
+
+```json
+{
+ "data": {
+ "type": "registry-providers",
+ "attributes": {
+ "name": "aws",
+ "namespace": "hashicorp",
+ "registry-name": "private"
+ }
+ }
+}
+```
+
+### Sample Payload (Public Provider)
+
+```json
+{
+ "data": {
+ "type": "registry-providers",
+ "attributes": {
+ "name": "aws",
+ "namespace": "hashicorp",
+ "registry-name": "public"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/registry-providers
+```
+
+### Sample Response (Private Provider)
+
+```json
+{
+ "data": {
+ "id": "prov-cmEmLstBfjNNA9F3",
+ "type": "registry-providers",
+ "attributes": {
+ "name": "aws",
+ "namespace": "hashicorp",
+ "registry-name": "private",
+ "created-at": "2022-02-11T19:16:59.533Z",
+ "updated-at": "2022-02-11T19:16:59.533Z",
+ "permissions": {
+ "can-delete": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations"
+ }
+ },
+ "versions": {
+ "data": [],
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws"
+ }
+ }
+}
+```
+
+### Sample Response (Public Provider)
+
+```json
+{
+ "data": {
+ "id": "prov-fZn7uHu99ZCpAKZJ",
+ "type": "registry-providers",
+ "attributes": {
+ "name": "aws",
+ "namespace": "hashicorp",
+ "registry-name": "public",
+ "created-at": "2020-07-09T19:36:56.288Z",
+ "updated-at": "2020-07-09T19:36:56.288Z",
+ "permissions": {
+ "can-delete": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/registry-providers/public/hashicorp/aws"
+ }
+ }
+}
+```
+
+## Get a Provider
+
+`GET /organizations/:organization_name/registry-providers/:registry_name/:namespace/:name`
+
+### Parameters
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------ |
+| `:organization_name` | The name of the organization the provider belongs to. |
+| `:registry_name` | Whether this is a publicly maintained provider or private. Must be either `public` or `private`. |
+| `:namespace` | The namespace of the provider. For private providers this is the same as the `:organization_name` parameter. |
+| `:name` | The provider name. |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | --------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "registry-providers"`) | Success |
+| [403][] | [JSON API error object][] | Forbidden - public provider curation disabled |
+| [404][] | [JSON API error object][] | Provider not found or user unauthorized to perform action |
+
+### Sample Request (Private Provider)
+
+```shell
+curl \
+ --request GET \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws
+```
+
+### Sample Request (Public Provider)
+
+```shell
+curl \
+ --request GET \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/my-organization/registry-providers/public/hashicorp/aws
+```
+
+### Sample Response (Private Provider)
+
+```json
+{
+ "data": {
+ "id": "prov-cmEmLstBfjNNA9F3",
+ "type": "registry-providers",
+ "attributes": {
+ "name": "aws",
+ "namespace": "hashicorp",
+ "created-at": "2022-02-11T19:16:59.533Z",
+ "updated-at": "2022-02-11T19:16:59.533Z",
+ "registry-name": "private",
+ "permissions": {
+ "can-delete": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations"
+ }
+ },
+ "versions": {
+ "data": [
+ {
+ "id": "provver-y5KZUsSBRLV9zCtL",
+ "type": "registry-provider-versions"
+ }
+ ],
+ "links": {
+ "related": "/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws"
+ }
+ }
+}
+```
+
+### Sample Response (Public Provider)
+
+```json
+{
+ "data": {
+ "id": "prov-fZn7uHu99ZCpAKZJ",
+ "type": "registry-providers",
+ "attributes": {
+ "name": "aws",
+ "namespace": "hashicorp",
+ "registry-name": "public",
+ "created-at": "2020-07-09T19:36:56.288Z",
+ "updated-at": "2020-07-09T20:16:20.538Z",
+ "permissions": {
+ "can-delete": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/registry-providers/public/hashicorp/aws"
+ }
+ }
+}
+```
+
+## Delete a Provider
+
+`DELETE /organizations/:organization_name/registry-providers/:registry_name/:namespace/:name`
+
+### Parameters
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:organization_name` | The name of the organization to delete a provider from. The organization must already exist, and the token authenticating the API request must belong to the "owners" team or a member of the "owners" team. |
+| `:registry_name` | Whether this is a publicly maintained provider or private. Must be either `public` or `private`. |
+| `:namespace` | The namespace of the provider that will be deleted. |
+| `:name` | The name of the provider that will be deleted. |
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ----------------------------------------------------------- |
+| [204][] | No Content | Success |
+| [403][] | [JSON API error object][] | Forbidden - public provider curation disabled |
+| [404][] | [JSON API error object][] | Provider not found or user not authorized to perform action |
+
+### Sample Request (Private Provider)
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/organizations/hashicorp/registry-providers/private/hashicorp/aws
+```
+
+### Sample Request (Public Provider)
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/organizations/my-organization/registry-providers/public/hashicorp/aws
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/tests.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/tests.mdx
new file mode 100644
index 0000000000..ea1b7f4b60
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/private-registry/tests.mdx
@@ -0,0 +1,755 @@
+---
+page_title: /tests API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/tests` endpoint to list, get, create, and
+ cancel Terraform test runs.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Tests API reference
+
+Tests are terraform operations(runs) and are referred to as Test Runs within the HCP Terraform API.
+
+Performing a test on a new configuration is a multi-step process.
+
+1. [Create a configuration version on the registry module](#create-a-configuration-version-for-a-test).
+2. [Upload configuration files to the configuration version](#upload-configuration-files-for-a-test).
+3. [Create a test on the module](#create-a-test-run); HCP Terraform completes this step automatically when you upload a configuration file.
+
+Alternatively, you can create a test with a pre-existing configuration version, even one from another module. This is useful for promoting known good code from one module to another.
+
+## Attributes
+
+The `tests` API endpoint has the following attributes.
+
+### Test Run States
+
+The state of the test operation is found in `data.attributes.status`, and you can reference the following list of possible states.
+
+| State | Description |
+| ---------- | ----------------------------------------------------- |
+| `pending` | The initial status of a run after creation. |
+| `queued` | HCP Terraform has queued the test operation to start. |
+| `running` | HCP Terraform is executing the test. |
+| `errored` | The test has errored. This is a final state. |
+| `canceled` | The test has been canceled. This is a final state. |
+| `finished` | The test has completed. This is a final state. |
+
+### Test run status
+
+The final test status is found in `data.attributes.test-status`, and you can reference the following list of possible states.
+
+| Status | Description |
+| ------ | ---------------------------- |
+| `pass` | The given tests have passed. |
+| `fail` | The given tests have failed. |
+
+### Detailed test status
+
+The test results can be found via the following attributes
+
+| Status | Description | |
+| ------------------------------- | ------------------------------------------- | - |
+| `data.attributes.tests-passed` | The number of tests that have passed. | |
+| `data.attributes.tests-failed` | The number of tests that have failed. | |
+| `data.attributes.tests-errored` | The number of tests that have errored out. | |
+| `data.attributes.tests-skipped` | The number of tests that have been skipped. | |
+
+### Test Sources
+
+List tests for a module. You can use the following sources as [tests list](/terraform/enterprise/api-docs/private-registry/tests#list-tests-for-a-module) query parameters.
+
+| Source | Description |
+| --------------------------- | ---------------------------------------------------------------------------------------- |
+| `terraform` | Indicates a test was queued from HCP Terraform CLI. |
+| `tfe-api` | Indicates a test was queued from HCP Terraform API. |
+| `tfe-configuration-version` | Indicates a test was queued from a Configuration Version, triggered from a VCS provider. |
+
+## Create a Test
+
+`POST /organizations/:organization_name/tests/registry-modules/private/:namespace/:name/:provider/test-runs`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization for the module. The organization must already exist, and the token authenticating the API request must belong to the "owners" team or a member of the "owners" team. |
+| `:namespace` | The namespace of the module for which the test is being created. For private modules this is the same as the `:organization_name` parameter. |
+| `:name` | The name of the module for which the test is being created. |
+| `:provider` | The name of the provider for which the test is being created. |
+
+A test run executes tests against a registry module, using a configuration version and the modules’s current environment variables.
+
+Creating a test run requires permission to access the specified module. Refer to [Permissions](/terraform/enterprise/users-teams-organizations/permissions) for more information.
+
+When creating a test run, you may optionally provide a list of variable objects containing key and value attributes. These values apply to that test run specifically and take precedence over variables with the same key that are created within the module. All values must be expressed as an HCL literal in the same syntax you would use when writing Terraform code.
+
+**Sample Test Variables:**
+
+```json
+"attributes": {
+ "variables": [
+ { "key": "replicas", "value": "2" },
+ { "key": "access_key", "value": "\"ABCDE12345\"" }
+ ]
+}
+```
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------------------------------------------------- | -------------------- | ------------- | -------------------------------------------------------------------------------------------------- |
+| `data.attributes.verbose` | bool | `false` | Specifies whether Terraform should print the plan or state for each test run block as it executes. |
+| `data.attributes.test-directory` | string | `"tests"` | Sets the directory where HCP Terraform executes the tests. |
+| `data.attributes.filters` | array\[string] | (empty array) | When specified, HCP Terraform only executes the test files contained within this array. |
+| `data.attributes.variables` | array\[{key, value}] | (empty array) | Specifies an optional list of test-specific environment variable values. |
+| `data.relationships.configuration-version.data.id` | string | none | Specifies the configuration version that HCP Terraform executes the test against. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "verbose": true,
+ "filters": ["tests/test.tftest.hcl"],
+ "test-directory": "tests",
+ "variables": [
+ { "key" : "number", "value": 4}
+ ]
+ },
+ "type":"test-runs"
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/tests/registry-modules/private/my-organization/private/registry-provider/test-runs
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "trun-KFg8DSiRz4E37mdJ",
+ "type": "test-runs",
+ "attributes": {
+ "status": "queued",
+ "status-timestamps": {
+ "queued-at": "2023-10-03T18:27:39+00:00"
+ },
+ "created-at": "2023-10-03T18:27:39.239Z",
+ "updated-at": "2023-10-03T18:27:39.264Z",
+ "test-configurable-type": "RegistryModule",
+ "test-configurable-id": "mod-9rjVHLCUE9QD3k6L",
+ "variables": [
+ {
+ "key": "number",
+ "value": "4"
+ }
+ ],
+ "filters": [
+ "tests/test.tftest.hcl"
+ ],
+ "test-directory": "tests",
+ "verbose": true,
+ "test-status": null,
+ "tests-passed": null,
+ "tests-failed": null,
+ "tests-errored": null,
+ "tests-skipped": null,
+ "source": "tfe-api",
+ "message": "Queued manually via the Terraform Enterprise API"
+ },
+ "relationships": {
+ "configuration-version": {
+ "data": {
+ "id": "cv-d3zBGFf5DfWY4GY9",
+ "type": "configuration-versions"
+ },
+ "links": {
+ "related": "/api/v2/configuration-versions/cv-d3zBGFf5DfWY4GY9"
+ }
+ },
+ "created-by": {
+ "data": {
+ "id": "user-zsRFs3AGaAHzbEfs",
+ "type": "users"
+ },
+ "links": {
+ "related": "/api/v2/users/user-zsRFs3AGaAHzbEfs"
+ }
+ }
+ }
+ }
+}
+```
+
+## Create a Configuration Version for a Test
+
+`POST /organizations/:organization_name/tests/registry-modules/private/:namespace/:name/:provider/test-runs/configuration-versions`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization for the module. The organization must already exist, and the token authenticating the API request must belong to the "owners" team or a member of the "owners" team. |
+| `:namespace` | The namespace of the module for which the configuration version is being created. For private modules this is the same as the `:organization_name` parameter. |
+| `:name` | The name of the module for which the configuration version is being created. |
+| `:provider` | The name of the provider for which the configuration version is being created. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/organizations/my-organization/tests/registry-modules/private/my-organization/registry-name/registry-provider/test-runs/configuration-versions
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "cv-aaady7niJMY1wAvx",
+ "type": "configuration-versions",
+ "attributes": {
+ "auto-queue-runs": true,
+ "error": null,
+ "error-message": null,
+ "source": "tfe-api",
+ "speculative": false,
+ "status": "pending",
+ "status-timestamps": {},
+ "changed-files": [],
+ "provisional": false,
+ "upload-url": "https://archivist.terraform.io/v1/object/dmF1bHQ6djM6eFliQ0l1ZEhNUDRMZmdWeExoYWZ1WnFwaCtYQUFSQjFaWVcySkEyT0tyZTZXQ0hjN3ZYQkFvbkJHWkg2Y0U2MDRHRXFvQVl6cUJqQzJ0VkppVHBXTlJNWmpVc1ZTekg5Q1hMZ0hNaUpNdUhib1hGS1RpT3czRGdRaWtPZFZ3VWpDQ1U0S2dhK2xLTUQ2ZFZDaUZ3SktiNytrMlpoVHd0cXdGVHIway8zRkFmejdzMSt0Rm9TNFBTV3dWYjZUTzJVNE1jaW9UZ2VKVFJNRnUvbjBudUp4U0l6VzFDYkNzVVFsb2VFbC9DRFlCTWFsbXBMNzZLUGQxeTJHb09ZTkxHL1d2K1NtcmlEQXptZTh1Q1BwR1dhbVBXQTRiREdlTkI3Qyt1YTRRamFkRzBWYUg3NE52TGpqT1NKbzFrZ3J3QmxnMGhHT3VaTHNhSmo0eXpv"
+ },
+ "relationships": {
+ "ingress-attributes": {
+ "data": null,
+ "links": {
+ "related": "/api/v2/configuration-versions/cv-aaady7niJMY1wAvx/ingress-attributes"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/configuration-versions/cv-aaady7niJMY1wAvx"
+ }
+ }
+}
+```
+
+## Upload Configuration Files for a Test
+
+`PUT https://archivist.terraform.io/v1/object/`
+
+**The URL is provided in the `upload-url` attribute when creating a `configuration-versions` resource. After creation, the URL is hidden on the resource and no longer available.**
+
+### Sample Request
+
+**@filename is the name of the configuration file you wish to upload.**
+
+```shell
+curl \
+ --header "Content-Type: application/octet-stream" \
+ --request PUT \
+ --data-binary @filename \
+ https://archivist.terraform.io/v1/object/4c44d964-eba7-4dd5-ad29-1ece7b99e8da
+```
+
+## List Tests for a Module
+
+`GET /organizations/:organization_name/tests/registry-modules/private/:namespace/:name/:provider/test-runs/`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization for the module. The organization must already exist, and the token authenticating the API request must belong to the "owners" team or a member of the "owners" team. |
+| `:namespace` | The namespace of the module which the tests have executed against. For private modules this is the same as the `:organization_name` parameter. |
+| `:name` | The name of the module which the tests have executed against. |
+| `:provider` | The name of the provider which the tests have executed against. |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters); remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling does not automatically encode URLs.
+
+| Parameter | Description | Required |
+| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
+| `page[number]` | If omitted, the endpoint returns the first page. | Optional |
+| `page[size]` | If omitted, the endpoint returns 20 runs per page. | Optional |
+| `filter[source]` | **Optional.** A comma-separated list of test sources; the result will only include tests that came from one of these sources. Options are listed in [Test Sources](/terraform/enterprise/api-docs/private-registry/tests#test-sources). | |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/my-organization/tests/registry-modules/private/my-organization/registry-name/registry-provider/test-runs
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "trun-KFg8DSiRz4E37mdJ",
+ "type": "test-runs",
+ "attributes": {
+ "status": "finished",
+ "status-timestamps": {
+ "queued-at": "2023-10-03T18:27:39+00:00",
+ "started-at": "2023-10-03T18:27:41+00:00",
+ "finished-at": "2023-10-03T18:27:53+00:00"
+ },
+ "log-read-url": "https://archivist.terraform.io/v1/object/dmF1bHQ6djM6eFliQ0l1ZEhNUDRMZmdWeExoYWZ1WnFwaCtYQUFSQjFaWVcySkEyT0tyZTZXQ0hjN3ZYQkFvbkJHWkg2Y0U2MDRHRXFvQVl6cUJqQzJ0VkppVHBXTlJNWmpVc1ZTekg5Q1hMZ0hNaUpNdUhib1hGS1RpT3czRGdRaWtPZFZ3VWpDQ1U0S2dhK2xLTUQ2ZFZDaUZ3SktiNytrMlpoVHd0cXdGVHIway8zRkFmejdzMSt0Rm9TNFBTV3dWYjZUTzJVNE1jaW9UZ2VKVFJNRnUvbjBudUp4U0l6VzFDYkNzVVFsb2VFbC9DRFlCTWFsbXBMNzZLUGQxeTJHb09ZTkxHL1d2K1NtcmlEQXptZTh1Q1BwR1dhbVBXQTRiREdlTkI3Qyt1YTRRamFkRzBWYUg3NE52TGpqT1NKbzFrZ3J3QmxnMGhHT3VaTHNhSmo0eXpv",
+ "created-at": "2023-10-03T18:27:39.239Z",
+ "updated-at": "2023-10-03T18:27:53.574Z",
+ "test-configurable-type": "RegistryModule",
+ "test-configurable-id": "mod-9rjVHLCUE9QD3k6L",
+ "variables": [
+ {
+ "key": "number",
+ "value": "4"
+ }
+ ],
+ "filters": [
+ "tests/test.tftest.hcl"
+ ],
+ "test-directory": "tests",
+ "verbose": true,
+ "test-status": "pass",
+ "tests-passed": 1,
+ "tests-failed": 0,
+ "tests-errored": 0,
+ "tests-skipped": 0,
+ "source": "tfe-api",
+ "message": "Queued manually via the Terraform Enterprise API"
+ },
+ "relationships": {
+ "configuration-version": {
+ "data": {
+ "id": "cv-d3zBGFf5DfWY4GY9",
+ "type": "configuration-versions"
+ },
+ "links": {
+ "related": "/api/v2/configuration-versions/cv-d3zBGFf5DfWY4GY9"
+ }
+ },
+ "created-by": {
+ "data": {
+ "id": "user-zsRFs3AGaAHzbEfs",
+ "type": "users"
+ },
+ "links": {
+ "related": "/api/v2/users/user-zsRFs3AGaAHzbEfs"
+ }
+ }
+ }
+ },
+ {...}
+ ]
+}
+```
+
+## Get Test Details
+
+`GET /organizations/:organization_name/tests/registry-modules/private/:namespace/:name/:provider/test-runs/:test_run_id`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization for the module. The organization must already exist, and the token authenticating the API request must belong to the "owners" team or a member of the "owners" team. |
+| `:namespace` | The namespace of the module which the test was executed against. For private modules this is the same as the `:organization_name` parameter. |
+| `:name` | The name of the module which the test was executed against. |
+| `:provider` | The name of the provider which the test was executed against. |
+| `:test_run_id` | The test ID to get. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/my-organization/tests/registry-modules/private/my-organization/registry-name/registry-provider/test-runs/trun-xFMAHM3FhkFBL6Z7
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "trun-KFg8DSiRz4E37mdJ",
+ "type": "test-runs",
+ "attributes": {
+ "status": "finished",
+ "status-timestamps": {
+ "queued-at": "2023-10-03T18:27:39+00:00",
+ "started-at": "2023-10-03T18:27:41+00:00",
+ "finished-at": "2023-10-03T18:27:53+00:00"
+ },
+ "log-read-url": "https://archivist.terraform.io/v1/object/dmF1bHQ6djM6eFliQ0l1ZEhNUDRMZmdWeExoYWZ1WnFwaCtYQUFSQjFaWVcySkEyT0tyZTZXQ0hjN3ZYQkFvbkJHWkg2Y0U2MDRHRXFvQVl6cUJqQzJ0VkppVHBXTlJNWmpVc1ZTekg5Q1hMZ0hNaUpNdUhib1hGS1RpT3czRGdRaWtPZFZ3VWpDQ1U0S2dhK2xLTUQ2ZFZDaUZ3SktiNytrMlpoVHd0cXdGVHIway8zRkFmejdzMSt0Rm9TNFBTV3dWYjZUTzJVNE1jaW9UZ2VKVFJNRnUvbjBudUp4U0l6VzFDYkNzVVFsb2VFbC9DRFlCTWFsbXBMNzZLUGQxeTJHb09ZTkxHL1d2K1NtcmlEQXptZTh1Q1BwR1dhbVBXQTRiREdlTkI3Qyt1YTRRamFkRzBWYUg3NE52TGpqT1NKbzFrZ3J3QmxnMGhHT3VaTHNhSmo0eXpv",
+ "created-at": "2023-10-03T18:27:39.239Z",
+ "updated-at": "2023-10-03T18:27:53.574Z",
+ "test-configurable-type": "RegistryModule",
+ "test-configurable-id": "mod-9rjVHLCUE9QD3k6L",
+ "variables": [
+ {
+ "key": "number",
+ "value": "4"
+ }
+ ],
+ "filters": [
+ "tests/test.tftest.hcl"
+ ],
+ "test-directory": "tests",
+ "verbose": true,
+ "test-status": "pass",
+ "tests-passed": 1,
+ "tests-failed": 0,
+ "tests-errored": 0,
+ "tests-skipped": 0,
+ "source": "tfe-api",
+ "message": "Queued manually via the Terraform Enterprise API"
+ },
+ "relationships": {
+ "configuration-version": {
+ "data": {
+ "id": "cv-d3zBGFf5DfWY4GY9",
+ "type": "configuration-versions"
+ },
+ "links": {
+ "related": "/api/v2/configuration-versions/cv-d3zBGFf5DfWY4GY9"
+ }
+ },
+ "created-by": {
+ "data": {
+ "id": "user-zsRFs3AGaAHzbEfs",
+ "type": "users"
+ },
+ "links": {
+ "related": "/api/v2/users/user-zsRFs3AGaAHzbEfs"
+ }
+ }
+ }
+ }
+}
+```
+
+## Cancel a Test
+
+`POST /organizations/:organization_name/tests/registry-modules/private/:namespace/:name/:provider/test-runs/:test_run_id/cancel`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:organization_name` | The name of the organization to create a test in. The organization must already exist, and the token authenticating the API request must belong to the "owners" team or a member of the "owners" team. |
+| `:namespace` | The namespace of the module for which the test is being canceled. For private modules this is the same as the `:organization_name` parameter. |
+| `:name` | The name of the module for which the test is being canceled. |
+| `:provider` | The name of the provider for which the test is being canceled. |
+| `:test_run_id` | The test ID to cancel. |
+
+Use the `cancel` action to interrupt a test that is currently running. The action sends an `INT` signal to the running Terraform process, which instructs Terraform to safely end the tests and attempt to teardown any infrastructure that your tests create.
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | ------------------------------------------ |
+| [202][] | none | Successfully queued a cancel request. |
+| [409][] | [JSON API error object][] | Test was not running; cancel not allowed. |
+| [404][] | [JSON API error object][] | Test was not found or user not authorized. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/organizations/my-organization/tests/registry-modules/private/my-organization/registry-name/registry-provider/test-runs/trun-xFMAHM3FhkFBL6Z7/cancel
+```
+
+## Forcefully cancel a Test
+
+`POST /organizations/:organization_name/tests/registry-modules/private/:namespace/:name/:provider/test-runs/:test_run_id/force-cancel`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization for the module. The organization must already exist, and the token authenticating the API request must belong to the `owners` team or a member of the `owners` team. |
+| `:namespace` | The namespace of the module for which the test is being force-canceled. For private modules this is the same as the `:organization_name` parameter. |
+| `:name` | The name of the module for which the test is being force-canceled. |
+| `:provider` | The name of the provider for which the test is being force-canceled. |
+| `:test_run_id` | The test ID to cancel. |
+
+The `force-cancel` action ends the test immediately. Once invoked, Terraform places the test into a `canceled` state and terminates the running Terraform process.
+
+~> **Warning:** This endpoint has potentially dangerous side-effects, including loss of any in-flight state in the running Terraform process. Use this operation with extreme caution.
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | -------------------------------------------------------------- |
+| [202][] | none | Successfully queued a cancel request. |
+| [409][] | [JSON API error object][] | Test was not running, or has not been canceled non-forcefully. |
+| [404][] | [JSON API error object][] | Test was not found or user not authorized. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/organizations/my-organization/tests/registry-modules/private/my-organization/registry-name/registry-provider/test-runs/trun-xFMAHM3FhkFBL6Z7/force-cancel
+```
+
+## Create an Environment Variable for Module Tests
+
+`POST /organizations/:organization_name/tests/registry-modules/private/:namespace/:name/:provider/vars`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:organization_name` | The name of the organization of the module. The organization must already exist, and the token authenticating the API request must belong to the "owners" team or a member of the "owners" team. |
+| `:namespace` | The namespace of the module for which the testing environment variable is being created. For private modules this is the same as the `:organization_name` parameter. |
+| `:name` | The name of the module for which the testing environment variable is being created. |
+| `:provider` | The name of the provider for which the testing environment variable is being created. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------- | ------ | ------- | -------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | none | Must be `"vars"`. |
+| `data.attributes.key` | string | none | The variable's name. Test variable keys must begin with a letter or underscore and can only contain letters, numbers, and underscores. |
+| `data.attributes.value` | string | `""` | The value of the variable. |
+| `data.attributes.description` | string | none | The description of the variable. |
+| `data.attributes.category` | string | none | This must be `"env"`. |
+| `data.attributes.sensitive` | bool | `false` | Whether the value is sensitive. When set to `true`, Terraform writes the variable once and is not visible thereafter. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type":"vars",
+ "attributes": {
+ "key":"some_key",
+ "value":"some_value",
+ "description":"some description",
+ "category":"env",
+ "sensitive":false
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/tests/registry-modules/private/my-organization/registry-name/registry-provider/vars
+```
+
+### Sample Response
+
+ {
+ "data": {
+ "id": "var-xSCUzCxdqMs2ygcg",
+ "type": "vars",
+ "attributes": {
+ "key": "keykey",
+ "value": "some_value",
+ "sensitive": false,
+ "category": "env",
+ "hcl": false,
+ "created-at": "2023-10-03T19:47:05.393Z",
+ "description": "some description",
+ "version-id": "699b14ea5d5e5c02f6352fac6bfd0a1424c21d32be14d1d9eb79f5e1f28f663a"
+ },
+ "links": {
+ "self": "/api/v2/vars/var-xSCUzCxdqMs2ygcg"
+ }
+ }
+ }
+
+## List Test Variables for a Module
+
+`GET /organizations/:organization_name/tests/registry-modules/private/:namespace/:name/:provider/vars`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization for the module. The organization must already exist, and the token authenticating the API request must belong to the `owners` team or a member of the `owners` team. |
+| `:namespace` | The namespace of the module which the test environment variables were created for. For private modules this is the same as the `:organization_name` parameter. |
+| `:name` | The name of the module which the test environment variables were created for. |
+| `:provider` | The name of the provider which the test environment variables were created for. |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/my-organization/tests/registry-modules/private/my-organization/registry-name/registry-provider/vars
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "var-xSCUzCxdqMs2ygcg",
+ "type": "vars",
+ "attributes": {
+ "key": "keykey",
+ "value": "some_value",
+ "sensitive": false,
+ "category": "env",
+ "hcl": false,
+ "created-at": "2023-10-03T19:47:05.393Z",
+ "description": "some description",
+ "version-id": "699b14ea5d5e5c02f6352fac6bfd0a1424c21d32be14d1d9eb79f5e1f28f663a"
+ },
+ "links": {
+ "self": "/api/v2/vars/var-xSCUzCxdqMs2ygcg"
+ }
+ }
+ ]
+}
+```
+
+## Update Test Variables for a Module
+
+`PATCH /organizations/:organization_name/tests/registry-modules/private/:namespace/:name/:provider/vars/variable_id`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization for the module. The organization must already exist, and the token authenticating the API request must belong to the "owners" team or a member of the "owners" team. |
+| `:namespace` | The namespace of the module for which the test environment variable is being updated. For private modules this is the same as the `:organization_name` parameter. |
+| `:name` | The name of the module for which the test environment variable is being updated. |
+| `:provider` | The name of the provider for which the test environment variable is being updated. |
+| `:variable_id` | The ID of the variable to update. |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------- | ------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"vars"`. |
+| `data.attributes` | object | none | New attributes for the variable. This object can include `key`, `value`, `description`, `category`, and `sensitive` properties. Refer to [Create an Environment Variable for Module Tests](#create-an-environment-variable-for-module-tests) for additional information. All properties are optional. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "key":"name",
+ "value":"mars",
+ "description": "new description",
+ "category":"env",
+ "sensitive": false
+ },
+ "type":"vars"
+ }
+}
+```
+
+### Sample Request
+
+```bash
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/tests/registry-modules/private/my-organization/registry-name/registry-provider/vars/var-yRmifb4PJj7cLkMG
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id":"var-yRmifb4PJj7cLkMG",
+ "type":"vars",
+ "attributes": {
+ "key":"name",
+ "value":"mars",
+ "description":"new description",
+ "sensitive":false,
+ "category":"env",
+ "hcl":false
+ }
+ }
+}
+```
+
+## Delete Test Variable for a Module
+
+`DELETE /organizations/:organization_name/tests/registry-modules/private/:namespace/:name/:provider/vars/variable_id`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization for the module. The organization must already exist, and the token authenticating the API request must belong to the `owners` team or a member of the `owners` team. |
+| `:namespace` | The namespace of the module for which the test environment variable is being deleted. For private modules this is the same as the `:organization_name` parameter. |
+| `:name` | The name of the module for which the test environment variable is being deleted. |
+| `:provider` | The name of the provider for which the test environment variable is being deleted. |
+| `:variable_id` | The ID of the variable to delete. |
+
+### Sample Request
+
+```bash
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/organizations/my-organization/tests/registry-modules/private/my-organization/registry-name/registry-provider/vars/var-yRmifb4PJj7cLkMG
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/project-team-access.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/project-team-access.mdx
new file mode 100644
index 0000000000..e77d497747
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/project-team-access.mdx
@@ -0,0 +1,523 @@
+---
+page_title: /team-projects API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/team-projects` endpoint to read, add,
+ update, and remove team access from a project.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Project team access API reference
+
+
+
+-> **Note:** Team management is available in HCP Terraform **Standard** Edition. [Learn more about HCP Terraform pricing](https://www.hashicorp.com/products/terraform/pricing).
+
+
+
+The team access APIs are used to associate a team to permissions on a project. A single `team-project` resource contains the relationship between the Team and Project, including the privileges the team has on the project.
+
+## Resource permissions
+
+A `team-project` resource represents a team's local permissions on a specific project. Teams can also have organization-level permissions that grant access to projects. HCP Terraform uses the more restrictive access level. For example, a team with the **Manage projects** permission enabled has admin access on all projects, even if their `team-project` on a particular project only grants read access. For more information, refer to [Managing Project Access](/terraform/enterprise/users-teams-organizations/teams/manage#managing-project-access).
+
+Any member of an organization can view team access relative to their own team memberships, including secret teams of which they are a member. Organization owners and project admins can modify team access or view the full set of secret team accesses. The organization token and the owners team token can act as an owner on these endpoints. Refer to [Permissions](/terraform/enterprise/users-teams-organizations/permissions) for additional information.
+
+## Project Team Access Levels
+
+| Access Level | Description |
+| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `read` | Read project and Read workspace access role on project workspaces |
+| `write` | Read project and Write workspace access role on project workspaces |
+| `maintain` | Read project and Admin workspace access role on project workspaces |
+| `admin` | Admin project, Admin workspace access role on project workspaces, create workspaces within project, move workspaces between projects, manage project team access |
+| `custom` | Custom access permissions on project and project's workspaces |
+
+## List Team Access to a Project
+
+`GET /team-projects`
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | -------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "team-projects"`) | The request was successful |
+| [404][] | [JSON API error object][] | Project not found or user unauthorized to perform action |
+
+### Query Parameters
+
+[These are standard URL query parameters](/terraform/enterprise/api-docs#query-parameters); remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters).
+
+| Parameter | Description |
+| --------------------- | ----------------------------------------------------- |
+| `filter[project][id]` | **Required.** The project ID to list team access for. |
+| `page[number]` | **Optional.** |
+| `page[size]` | **Optional.** |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ "https://app.terraform.io/api/v2/team-projects?filter%5Bproject%5D%5Bid%5D=prj-ckZoJwdERaWcFHwi"
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "tprj-TLznAnYdcsD2Dcmm",
+ "type": "team-projects",
+ "attributes": {
+ "access": "read",
+ "project-access": {
+ "settings": "read",
+ "teams": "none"
+ },
+ "workspace-access": {
+ "create": false,
+ "move": false,
+ "locking": false,
+ "delete": false,
+ "runs": "read",
+ "variables": "read",
+ "state-versions": "read",
+ "sentinel-mocks": "none",
+ "run-tasks": false
+ }
+ },
+ "relationships": {
+ "team": {
+ "data": {
+ "id": "team-KpibQGL5GqRAWBwT",
+ "type": "teams"
+ },
+ "links": {
+ "related": "/api/v2/teams/team-KpibQGL5GqRAWBwT"
+ }
+ },
+ "project": {
+ "data": {
+ "id": "prj-ckZoJwdERaWcFHwi",
+ "type": "projects"
+ },
+ "links": {
+ "related": "/api/v2/projects/prj-ckZoJwdERaWcFHwi"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/team-projects/tprj-TLznAnYdcsD2Dcmm"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/team-projects?filter%5Bproject%5D%5Bid%5D=prj-ckZoJwdERaWcFHwi&page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/team-projects?filter%5Bproject%5D%5Bid%5D=prj-ckZoJwdERaWcFHwi&page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/team-projects?filter%5Bproject%5D%5Bid%5D=prj-ckZoJwdERaWcFHwi&page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "page-size": 20,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 1
+ }
+ }
+}
+```
+
+## Show a Team Access relationship
+
+`GET /team-projects/:id`
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | ------------------------------------------------------------ |
+| [200][] | [JSON API document][] (`type: "team-projects"`) | The request was successful |
+| [404][] | [JSON API error object][] | Team access not found or user unauthorized to perform action |
+
+| Parameter | Description |
+| --------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the team/project relationship. Obtain this from the [list team access action](#list-team-access-to-a-project) described above. |
+
+As mentioned in [Add Team Access to a Project](#add-team-access-to-a-project) and [Update to a Project](#update-team-access-to-a-project), several permission attributes are not editable unless you set `access` to `custom`. If you set `access` to `read`, `plan`, `write`, or `admin`, certain attributes are read-only and reflect the _implicit permissions_ granted to the current access level.
+
+For example, if you set `access` to `read`, the implicit permission level for project settings and workspace run is "read". Conversely, if you set the access level to `admin`, the implicit permission level for the project settings is "delete", while the workspace runs permission is "apply".
+
+Several permission attributes are not editable unless `access` is set to `custom`. When access is `read`, `plan`, `write`, or `admin`, these attributes are read-only and reflect the implicit permissions granted to the current access level.
+
+For example, when access is `read`, the implicit level for the project settings and workspace runs permissions are "read". Conversely, when the access level is `admin`, the implicit level for the project settings is "delete" and the workspace runs permission is "apply". To see all of the implied permissions at different access levels, see [Implied Custom Permission Levels](#implied-custom-permission-levels).
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/team-projects/tprj-s68jV4FWCDwWvQq8
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "tprj-TLznAnYdcsD2Dcmm",
+ "type": "team-projects",
+ "attributes": {
+ "access": "read",
+ "project-access": {
+ "settings": "read",
+ "teams": "none"
+ },
+ "workspace-access": {
+ "create": false,
+ "move": false,
+ "locking": false,
+ "delete": false,
+ "runs": "read",
+ "variables": "read",
+ "state-versions": "read",
+ "sentinel-mocks": "none",
+ "run-tasks": false
+ }
+ },
+ "relationships": {
+ "team": {
+ "data": {
+ "id": "team-KpibQGL5GqRAWBwT",
+ "type": "teams"
+ },
+ "links": {
+ "related": "/api/v2/teams/team-KpibQGL5GqRAWBwT"
+ }
+ },
+ "project": {
+ "data": {
+ "id": "prj-ckZoJwdERaWcFHwi",
+ "type": "projects"
+ },
+ "links": {
+ "related": "/api/v2/projects/prj-ckZoJwdERaWcFHwi"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/team-projects/tprj-TLznAnYdcsD2Dcmm"
+ }
+ }
+}
+```
+
+## Add Team Access to a Project
+
+`POST /team-projects`
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | ---------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "team-projects"`) | The request was successful |
+| [404][] | [JSON API error object][] | Project or Team not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------------------------- | ------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"team-projects"`. |
+| `data.attributes.access` | string | | The type of access to grant. Valid values are `read`, `write`, `maintain`, `admin`, or `custom`. |
+| `data.relationships.project.data.type` | string | | Must be `projects`. |
+| `data.relationships.project.data.id` | string | | The project ID to which the team is to be added. |
+| `data.relationships.team.data.type` | string | | Must be `teams`. |
+| `data.relationships.team.data.id` | string | | The ID of the team to add to the project. |
+| `data.attributes.project-access.settings` | string | "read" | If `access` is `custom`, the permission to grant for the project's settings. Can only be used when `access` is `custom`. Valid values include `read`, `update`, or `delete`. |
+| `data.attributes.project-access.teams` | string | "none" | If `access` is `custom`, the permission to grant for the project's teams. Can only be used when `access` is `custom`. Valid values include `none`, `read`, or `manage`. |
+| `data.attributes.workspace-access.runs` | string | "read" | If `access` is `custom`, the permission to grant for the project's workspaces' runs. Can only be used when `access` is `custom`. Valid values include `read`, `plan`, or `apply`. |
+| `data.attributes.workspace-access.sentinel-mocks` | string | "none" | If `access` is `custom`, the permission to grant for the project's workspaces' Sentinel mocks. Can only be used when `access` is `custom`. Valid values include `none`, or `read`. |
+| `data.attributes.workspace-access.state-versions` | string | "none" | If `access` is `custom`, the permission to grant for the project's workspaces state versions. Can only be used when `access` is `custom`. Valid values include `none`, `read-outputs`, `read`, or `write`. |
+| `data.attributes.workspace-access.variables` | string | "none" | If `access` is `custom`, the permission to grant for the project's workspaces' variables. Can only be used when `access` is `custom`. Valid values include `none`, `read`, or `write`. |
+| `data.attributes.workspace-access.create` | boolean | false | If `access` is `custom`, this permission allows the team to create workspaces in the project. |
+| `data.attributes.workspace-access.locking` | boolean | false | If `access` is `custom`, the permission granting the ability to manually lock or unlock the project's workspaces. Can only be used when `access` is `custom`. |
+| `data.attributes.workspace-access.delete` | boolean | false | If `access` is `custom`, the permission granting the ability to delete the project's workspaces. Can only be used when `access` is `custom`. |
+| `data.attributes.workspace-access.move` | boolean | false | If `access` is `move`, this permission allows the team to move workspaces into and out of the project. The team must also have permissions to the project(s) receiving the the workspace(s). |
+| `data.attributes.workspace-access.run-tasks` | boolean | false | If `access` is `custom`, this permission allows the team to manage run tasks within the project's workspaces. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "access": "read"
+ },
+ "relationships": {
+ "project": {
+ "data": {
+ "type": "projects",
+ "id": "prj-ckZoJwdERaWcFHwi"
+ }
+ },
+ "team": {
+ "data": {
+ "type": "teams",
+ "id": "team-xMGyoUhKmTkTzmAy"
+ }
+ }
+ },
+ "type": "team-projects"
+ }
+}
+```
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/team-projects
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "tprj-WbG7p5KnT7S7HZqw",
+ "type": "team-projects",
+ "attributes": {
+ "access": "read",
+ "project-access": {
+ "settings": "read",
+ "teams": "none"
+ },
+ "workspace-access": {
+ "create": false,
+ "move": false,
+ "locking": false,
+ "runs": "read",
+ "variables": "read",
+ "state-versions": "read",
+ "sentinel-mocks": "none",
+ "run-tasks": false
+ }
+ },
+ "relationships": {
+ "team": {
+ "data": {
+ "id": "team-xMGyoUhKmTkTzmAy",
+ "type": "teams"
+ },
+ "links": {
+ "related": "/api/v2/teams/team-xMGyoUhKmTkTzmAy"
+ }
+ },
+ "project": {
+ "data": {
+ "id": "prj-ckZoJwdERaWcFHwi",
+ "type": "projects"
+ },
+ "links": {
+ "related": "/api/v2/projects/prj-ckZoJwdERaWcFHwi"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/team-projects/tprj-WbG7p5KnT7S7HZqw"
+ }
+ }
+}
+```
+
+## Update Team Access to a Project
+
+`PATCH /team-projects/:id`
+
+| Status | Response | Reason |
+| ------- | ----------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "team-projects"`) | The request was successful |
+| [404][] | [JSON API error object][] | Team Access not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+| Parameter | | | Description |
+| ------------------------ | ------ | - | ---------------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | | | The ID of the team/project relationship. Obtain this from the [list team access action](#list-team-access-to-a-project) described above. |
+| `data.attributes.access` | string | | The type of access to grant. Valid values are `read`, `write`, `maintain`, `admin`, or `custom`. |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/team-projects/tprj-WbG7p5KnT7S7HZqw
+```
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "id": "tprj-WbG7p5KnT7S7HZqw",
+ "attributes": {
+ "access": "custom",
+ "project-access": {
+ "settings": "delete"
+ "teams": "manage",
+ },
+ "workspace-access" : {
+ "runs": "apply",
+ "sentinel-mocks": "read",
+ "state-versions": "write",
+ "variables": "write",
+ "create": true,
+ "locking": true,
+ "delete": true,
+ "move": true,
+ "run-tasks": true
+ }
+ }
+ }
+}
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "tprj-WbG7p5KnT7S7HZqw",
+ "type": "team-projects",
+ "attributes": {
+ "access": "custom",
+ "project-access": {
+ "settings": "delete"
+ "teams": "manage",
+ },
+ "workspace-access" : {
+ "runs": "apply",
+ "sentinel-mocks": "read",
+ "state-versions": "write",
+ "variables": "write",
+ "create": true,
+ "locking": true,
+ "delete": true,
+ "move": true,
+ "run-tasks": true
+ }
+ },
+ "relationships": {
+ "team": {
+ "data": {
+ "id": "team-xMGyoUhKmTkTzmAy",
+ "type": "teams"
+ },
+ "links": {
+ "related": "/api/v2/teams/team-xMGyoUhKmTkTzmAy"
+ }
+ },
+ "project": {
+ "data": {
+ "id": "prj-ckZoJwdERaWcFHwi",
+ "type": "projects"
+ },
+ "links": {
+ "related": "/api/v2/projects/prj-ckZoJwdERaWcFHwi"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/team-projects/tprj-WbG7p5KnT7S7HZqw"
+ }
+ }
+}
+```
+
+## Remove Team Access from a Project
+
+`DELETE /team-projects/:id`
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------ |
+| [204][] | | The Team Access was successfully destroyed |
+| [404][] | [JSON API error object][] | Team Access not found or user unauthorized to perform action |
+
+| Parameter | Description |
+| --------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the team/project relationship. Obtain this from the [list team access action](#list-team-access-to-a-project) described above. |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/team-projects/tprj-WbG7p5KnT7S7HZqw
+```
+
+## Implied Custom Permission Levels
+
+As mentioned above, when setting team access levels (`read`, `write`, `maintain`, or `admin`), you can individually set the following permissions if you use the `custom` access level.
+The below table lists each access level alongside its implicit custom permission level. If you use the `custom` access level and do not specify a certain permission's level, that permission uses the default value listed below.
+
+| Permissions | `read` | `write` | `maintain` | `admin ` | `custom` default |
+| ------------------------------- | ------ | ------- | ---------- | -------- | ---------------- |
+| project-access.settings | "read" | "read" | "read" | "delete" | "read" |
+| project-access.teams | "none" | "none" | "none" | "manage" | "none" |
+| workspace-access.runs | "read" | "apply" | "apply" | "apply" | "read" |
+| workspace-access.sentinel-mocks | "none" | "read" | "read" | "read" | "none" |
+| workspace-access.state-versions | "read" | "write" | "write" | "write" | "none" |
+| workspace-access.variables | "read" | "write" | "write" | "write" | "none" |
+| workspace-access.create | false | false | true | true | false |
+| workspace-access.locking | false | true | true | true | false |
+| workspace-access.delete | false | false | true | true | false |
+| workspace-access.move | false | false | false | true | false |
+| workspace-access.run-tasks | false | false | true | true | false |
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/projects.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/projects.mdx
new file mode 100644
index 0000000000..211c0b3ee0
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/projects.mdx
@@ -0,0 +1,719 @@
+---
+page_title: /projects API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/projects` endpoint to list, show, create,
+ update, and delete an organization's projects.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+[speculative plans]: /terraform/enterprise/run/remote-operations#speculative-plans
+
+# Projects API reference
+
+This topic provides reference information about the projects API.
+
+The scope of the API includes the following endpoints:
+
+| Method | Path | Action |
+| -------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `POST` | `/organizations/:organization_name/projects` | Call this endpoint to [create a project](#create-a-project). |
+| `PATCH` | `/projects/:project_id` | Call this endpoint to [update an existing project](#update-a-project). |
+| `GET` | `/organizations/:organization_name/projects` | Call this endpoint to [list existing projects](#list-projects). |
+| `GET` | `/projects/:project_id` | Call this endpoint to [show project details](#show-project). |
+| `DELETE` | `/projects/:project_id` | Call this endpoint to [delete a project](#delete-a-project). |
+| `GET` | `/projects/:project_id/tag-bindings` | Call this endpoint to [list project tag bindings](#list-project-tag-bindings). (For projects, this returns the same result set as the `effective-tag-bindings` endpoint.) |
+| `GET` | `/projects/:project_id/effective-tag-bindings` | Call this endpoint to [list project effective tag bindings](#list-project-tag-bindings). (For projects, this returns the same result set as the `tag-bindings` endpoint.) |
+
+## Requirements
+
+You must be on a team with one of the **Owners** or **Manage projects** permissions settings enabled to create and manage projects. Refer to [Permissions](/terraform/enterprise/users-teams-organizations/permissions) for additional information.
+
+You can also provide an organization API token to call project API endpoints. Refer to [Organization API Tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens) for additional information.
+
+## Create a Project
+
+`POST /organizations/:organization_name/projects`
+
+| Parameter | Description |
+| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to create the project in. The organization must already exist in the system, and the user must have permissions to create new projects. |
+
+-> **Note:** Project creation is restricted to the owners team, teams with the "Manage Projects" permission, and the [organization API token](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens).
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------------------------------- | --------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | none | Must be `"projects"`. |
+| `data.attributes.name` | string | | The name of the project. The name can contain letters, numbers, spaces, `-`, and `_`, but cannot start or end with spaces. It must be at least three characters long and no more than 40 characters long. |
+| `data.attributes.description` | string | none | Optional. The description of the project. It must be no more than 256 characters long. |
+| `data.attributes.auto-destroy-activity-duration` | string | none | Specifies the default for how long each workspace in the project should wait before automatically destroying its infrastructure. You can specify a duration up to four digits that is greater than `0` followed by either a `d` for days or `h` hours. For example, to queue destroy runs after fourteen days of inactivity set `auto-destroy-activity-duration: "14d"`. All future workspaces in this project inherit this default value. Refer to [Automatically destroy inactive workspaces](/terraform/enterprise/projects/managing#automatically-destroy-inactive-workspaces) for additional information. |
+| `data.relationships.tag-bindings.data` | list of objects | none | Specifies a list of tags to bind to the project. Workspaces inherit the tags bound to their project. |
+| `data.relationships.tag-bindings.data.type` | string | none | Must be `tag-bindings` for each object in the list. |
+| `data.relationships.tag-bindings.data.attributes.key` | string | none | Specifies the tag key for each object in the list. |
+| `data.relationships.tag-bindings.data.attributes.value` | string | none | Specifies the tag value for each object in the list. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name": "Test Project",
+ "description": "An example project for documentation.",
+ },
+ "type": "projects",
+ "relationships": {
+ "tag-bindings": {
+ "data": [
+ {
+ "type": "tag-bindings",
+ "attributes": {
+ "key": "environment",
+ "value": "development"
+ }
+ },
+ ]
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/projects
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "prj-WsVcWRr7SfxRci1v",
+ "type": "projects",
+ "attributes": {
+ "name": "Test Project",
+ "description": "An example project for documentation.",
+ "permissions": {
+ "can-update": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization"
+ }
+ },
+ "tag-bindings": {
+ "links": {
+ "related": "/api/v2/projects/prj-WsVcWRr7SfxRci1v/tag-bindings"
+ }
+ },
+ "effective-tag-bindings": {
+ "links": {
+ "related": "/api/v2/projects/prj-WsVcWRr7SfxRci1v/effective-tag-bindings"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/projects/prj-WsVcWRr7SfxRci1v"
+ }
+ }
+}
+```
+
+## Update a Project
+
+Call the following endpoint to update a project:
+
+`PATCH /projects/:project_id`
+
+| Parameter | Description |
+| ------------- | ------------------------------- |
+| `:project_id` | The ID of the project to update |
+
+### Request Body
+
+These PATCH endpoints require a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------------------------------- | --------------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | none | Must be `"projects"`. |
+| `data.attributes.name` | string | existing value | A new name for the project. The name can contain letters, numbers, spaces, `-`, and `_`, but cannot start or end with spaces. It must be at least 3 characters long and no more than 40 characters long. |
+| `data.attributes.description` | string | existing value | The new description for the project. It must be no more than 256 characters long. |
+| `data.attributes.auto-destroy-activity-duration` | string | none | Specifies how long each workspace in the project should wait before automatically destroying its infrastructure by default. You can specify a duration up to four digits that is greater than `0` followed by either a `d` for days or `h` hours. For example, to queue destroy runs after fourteen days of inactivity set `auto-destroy-activity-duration: "14d"`. When you update this value, all workspaces in the project receive the new value unless you previously configured an override. Refer to [Automatically destroy inactive workspaces](/terraform/enterprise/projects/managing#automatically-destroy-inactive-workspaces) for additional information. |
+| `data.relationships.tag-bindings.data` | list of objects | none | Specifies a list of tags to bind to the project. Workspaces inherit the tags bound to their project. |
+| `data.relationships.tag-bindings.data.type` | string | none | Must be `tag-bindings` for each object in the list. |
+| `data.relationships.tag-bindings.data.attributes.key` | string | none | Specifies the tag key for each object in the list. |
+| `data.relationships.tag-bindings.data.attributes.value` | string | none | Specifies the tag value for each object in the list. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name": "Infrastructure Project"
+ },
+ "type": "projects",
+ "relationships": {
+ "tag-bindings": {
+ "data": [
+ {
+ "type": "tag-bindings",
+ "attributes": {
+ "key": "environment",
+ "value": "staging"
+ }
+ }
+ ]
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/projects/prj-WsVcWRr7SfxRci1v
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "prj-WsVcWRr7SfxRci1v",
+ "type": "projects",
+ "attributes": {
+ "name": "Infrastructure Project",
+ "description": null,
+ "workspace-count": 4,
+ "team-count": 2,
+ "permissions": {
+ "can-update": true,
+ "can-destroy": true,
+ "can-create-workspace": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization"
+ }
+ },
+ "tag-bindings": {
+ "links": {
+ "related": "/api/v2/projects/prj-WsVcWRr7SfxRci1v/tag-bindings"
+ }
+ },
+ "effective-tag-bindings": {
+ "links": {
+ "related": "/api/v2/projects/prj-WsVcWRr7SfxRci1v/effective-tag-bindings"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/projects/prj-WsVcWRr7SfxRci1v"
+ }
+ }
+}
+```
+
+## List projects
+
+This endpoint lists projects in the organization.
+
+`GET /organizations/:organization_name/projects`
+
+| Parameter | Description |
+| -------------------- | ----------------------------------------------------- |
+| `:organization_name` | The name of the organization to list the projects of. |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 projects per page. |
+| `q` | **Optional.** A search query string. This query searches projects by name. This search is case-insensitive. If both `q` and `filter[names]` are specified, `filter[names]` will be used. |
+| `filter[names]` | **Optional.** If specified, returns the project with the matching name. This filter is case-insensitive. If multiple comma separated values are specified, projects matching any of the names are returned. |
+| `filter[permissions][create-workspace]` | **Optional.** If present, returns a list of projects that the authenticated user can create workspaces in. |
+| `filter[permissions][update]` | **Optional.** If present, returns a list of projects that the authenticated user can update. |
+| `sort` | **Optional.** Allows sorting the organization's projects by `"name"`. Prepending a hyphen to the sort parameter reverses the order. For example, `"-name"` sorts by name in reverse alphabetical order. If omitted, the default sort order is arbitrary but stable. |
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/my-organization/projects
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "prj-W6k9K23oSXRHGpj3",
+ "type": "projects",
+ "attributes": {
+ "name": "Default Project",
+ "description": null,
+ "workspace-count": 2,
+ "team-count": 1,
+ "permissions": {
+ "can-update": true,
+ "can-destroy": true,
+ "can-create-workspace": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization"
+ }
+ },
+ "tag-bindings": {
+ "links": {
+ "related": "/api/v2/projects/prj-W6k9K23oSXRHGpj3/tag-bindings"
+ }
+ },
+ "effective-tag-bindings": {
+ "links": {
+ "related": "/api/v2/projects/prj-W6k9K23oSXRHGpj3/effective-tag-bindings"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/projects/prj-W6k9K23oSXRHGpj3"
+ }
+ },
+ {
+ "id": "prj-YoriCxAawTMDLswn",
+ "type": "projects",
+ "attributes": {
+ "name": "Infrastructure Project",
+ "description": null,
+ "workspace-count": 4,
+ "team-count": 2,
+ "permissions": {
+ "can-update": true,
+ "can-destroy": true,
+ "can-create-workspace": true
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization"
+ }
+ },
+ "tag-bindings": {
+ "links": {
+ "related": "/api/v2/projects/prj-YoriCxAawTMDLswn/tag-bindings"
+ }
+ },
+ "effective-tag-bindings": {
+ "links": {
+ "related": "/api/v2/projects/prj-YoriCxAawTMDLswn/effective-tag-bindings"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/projects/prj-YoriCxAawTMDLswn"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/organizations/my-organization/projects?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/organizations/my-organization/projects?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/organizations/my-organization/projects?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "status-counts": {
+ "total": 2,
+ "matching": 2
+ },
+ "pagination": {
+ "current-page": 1,
+ "page-size": 20,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 2
+ }
+ }
+}
+```
+
+## Show project
+
+`GET /projects/:project_id`
+
+| Parameter | Description |
+| ------------- | -------------- |
+| `:project_id` | The project ID |
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/projects/prj-WsVcWRr7SfxRci1v
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "prj-WsVcWRr7SfxRci1v",
+ "type": "projects",
+ "attributes": {
+ "name": "Infrastructure Project",
+ "description": null,
+ "workspace-count": 4,
+ "team-count": 2,
+ "permissions": {
+ "can-update": true,
+ "can-destroy": true,
+ "can-create-workspace": true
+ },
+ "auto-destroy-activity-duration": "2d"
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization"
+ }
+ },
+ "tag-bindings": {
+ "links": {
+ "related": "/api/v2/projects/prj-WsVcWRr7SfxRci1v/tag-bindings"
+ }
+ },
+ "effective-tag-bindings": {
+ "links": {
+ "related": "/api/v2/projects/prj-WsVcWRr7SfxRci1v/effective-tag-bindings"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/projects/prj-WsVcWRr7SfxRci1v"
+ }
+ }
+}
+```
+
+## Delete a project
+
+A project cannot be deleted if it contains stacks or workspaces.
+
+`DELETE /projects/:project_id`
+
+| Parameter | Description |
+| ------------- | ------------------------------- |
+| `:project_id` | The ID of the project to delete |
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | ----------------------------------------------------------------- |
+| [204][] | No Content | Successfully deleted the project |
+| [403][] | [JSON API error object][] | Not authorized to perform a force delete on the project |
+| [404][] | [JSON API error object][] | Project not found, or user unauthorized to perform project delete |
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/projects/prj-WsVcWRr7SfxRci1v
+```
+
+## List project tag bindings
+
+Call the following endpoints to list the tags bound to a project.
+
+- `GET /projects/:project_id/tag-bindings`: Lists the set of tags associated with the project. Tags set on the project are inherited by its workspaces.
+
+| Parameter | Description |
+| ------------- | ---------------------- |
+| `:project_id` | The ID of the project. |
+
+### Sample request
+
+The following request returns all tags bound to a project with the ID
+`prj-WsVcWRr7SfxRci1v`.
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/projects/prj-WsVcWRr7SfxRci1v/tag-bindings
+```
+
+### Sample response
+
+```json
+{
+ "data": [
+ {
+ "type": "tag-bindings",
+ "attributes": {
+ "key": "added",
+ "value": "new",
+ "created-at": "2024-11-20T00:04:47.948Z"
+ }
+ },
+ {
+ "type": "tag-bindings",
+ "attributes": {
+ "key": "aww",
+ "value": "aww",
+ "created-at": "2024-11-20T00:04:47.948Z"
+ }
+ }
+ ]
+}
+```
+
+## Add or update tag bindings on a project
+
+This endpoint can be used to add key-value Tag Bindings to an existing resource, or to update
+existing Tag Binding values on the resource. It cannot be used to remove any tag bindings from the resource.
+This endpoint is useful when you want to ensure a modification is additive.
+
+Tag Bindings have special constraints:
+
+- Up to 10 tags can be applied to a project
+- All workspaces belonging to the project will inherit the Tag Bindings applied to this project.
+- Keys must be no more than 128 characters, allowing all alphanumeric characters plus the symbols `_`, `.`, `=`, `+`, `-`, `@`, `:`.
+- Values allow the same characters, but can be up to 256 characters.
+- Certain key prefixes, including `hc:` and `hcp:` are not allowed.
+
+`PATCH /projects/:project_id/tag-bindings`
+
+| Parameter | Description |
+| ------------- | ------------------------------- |
+| `:project_id` | The ID of the project to update |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+It is important to note that for each data item, `type`, as well as `attributes.key` is required.
+
+| Key path | Type | Default | Description |
+| ------------------------- | ------ | ------- | ------------------------------------- |
+| `data[].type` | string | | Must be `"tag-bindings"`. |
+| `data[].attributes.key` | string | | The key of the tag to add or update. |
+| `data[].attributes.value` | string | | The name of the tag to add or update. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "type": "tag-bindings",
+ "attributes": {
+ "key": "costcenter",
+ "value": "123"
+ }
+ },
+ {
+ "type": "tag-bindings",
+ "attributes": {
+ "key": "bar",
+ "value": "baz"
+ }
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/projects/prj-82d2281aa259ba09/tag-bindings
+```
+
+### Sample Response
+
+Example status code 200 response after updating tag bindings:
+
+
+
+```json
+{
+ "data": [
+ {
+ "id": "tb-e4a5847b2cf06559",
+ "type": "tag-bindings",
+ "attributes": {
+ "key": "costcenter",
+ "value": "123"
+ }
+ },
+ {
+ "id": "tb-97ce954636f93a6c",
+ "type": "tag-bindings",
+ "attributes": {
+ "key": "bar",
+ "value": "baz"
+ }
+ }
+ ]
+}
+```
+
+
+
+## Move workspaces into a project
+
+This endpoint allows you to move one or more workspaces into a project. You must have permission to move workspaces on
+the destination project as well as any source project(s). If you are not authorized to move any of the workspaces in the
+request, or if any workspaces in the request are not found, then no workspaces will be moved.
+
+`POST /projects/:project_id/relationships/workspaces`
+
+| Parameter | Description |
+| ------------- | --------------------------------- |
+| `:project_id` | The ID of the destination project |
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| ------------- | ------ | ------- | ---------------------------------------------------------- |
+| `data[].type` | string | | Must be `"workspaces"` |
+| `data[].id` | string | | The ids of workspaces to move into the destination project |
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | -------------------------------------------------------------------------------------------------------- |
+| [204][] | No Content | Successfully moved workspace(s) |
+| [403][] | [JSON API error object][] | Workspace(s) not found, or user is not authorized to move all workspaces out of their current project(s) |
+| [404][] | [JSON API error object][] | Project not found, or user unauthorized to move workspaces into project |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "type": "workspaces",
+ "id": "ws-AQEct2XFuH4HBsmS"
+ }
+ ]
+}
+
+```
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/projects/prj-zXm4y2BjeGPgHtkp/relationships/workspaces
+```
+
+### Sample Error Response
+
+```json
+{
+ "errors": [
+ {
+ "status": "403",
+ "title": "forbidden",
+ "detail": "Workspace(s) not found, or you are not authorized to move them: ws-AQEct2XFuH4HBmS"
+ }
+ ]
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/reserved-tag-keys.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/reserved-tag-keys.mdx
new file mode 100644
index 0000000000..51655fd031
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/reserved-tag-keys.mdx
@@ -0,0 +1,271 @@
+---
+page_title: /reserved-tag-keys API reference for Terraform Enterprise
+description: >-
+ Use the `/reserved-tag-keys` API endpoints to reserve tag keys that have
+ special meaning for your organization.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+[speculative plans]: /terraform/enterprise/run/remote-operations#speculative-plans
+
+# Reserved tag keys API reference
+
+Use the `/reserved-tag-keys` API endpoints to define and manage tag keys that
+have special meaning for your organization. Reserving tag keys enable project
+and workspace managers to follow a consistent tagging strategy across the
+organization. You can also use them to provide project managers with a means of
+disabling overrides for inherited tags.
+
+The following table describes the available endpoints:
+
+| Method | Path | Description |
+| -------- | ----------------------------------------------------- | --------------------------------------------------------------------------------- |
+| `GET` | `/organizations/:organization_name/reserved-tag-keys` | [List reserved tag keys](#list-reserved-tag-keys) for the specified organization. |
+| `POST` | `/organizations/:organization_name/reserved-tag-keys` | [Add a reserved tag key](#add-a-reserved-tag-key) to the specified organization. |
+| `PATCH` | `/reserved-tags/:reserved_tag_key_id` | [Update a reserved tag key](#add-a-reserved-tag-value) with the specified ID. |
+| `DELETE` | `/reserved-tags/:reserved_tag_key_id` | [Delete a reserved tag key](#delete-a-reserved-tag-key) with the specified ID. |
+
+## Path parameters
+
+The `/reserved-tag-keys/` API endpoints require the following path parameters:
+
+| Parameter | Description |
+| ---------------------- | ---------------------------------------------------------- |
+| `:reserved_tag_key_id` | The external ID of the reserved tag key. |
+| `:organization_name` | The name of the organization containing the reserved tags. |
+
+## List reserved tag keys
+
+`GET /organizations/:organization_name/reserved-tag-keys`
+
+### Sample payload
+
+This endpoint does not require a payload.
+
+### Sample request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/organizations/my-organization/reserved-tag-keys
+```
+
+### Sample response
+
+```json
+{
+ "data": [
+ {
+ "id": "rtk-jjnTseo8NN1jACbk",
+ "type": "reserved-tag-keys",
+ "attributes": {
+ "key": "environment",
+ "disable-overrides": false,
+ "created-at": "2024-08-13T23:06:42.523Z",
+ "updated-at": "2024-08-13T23:06:42.523Z"
+ }
+ },
+ {
+ "id": "rtk-F1s7kKUShAQxhA1b",
+ "type": "reserved-tag-keys",
+ "attributes": {
+ "key": "cost-center",
+ "disable-overrides": false,
+ "created-at": "2024-08-13T23:06:51.445Z",
+ "updated-at": "2024-08-13T23:06:51.445Z"
+ }
+ },
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/organizations/my-organization/reserved-tag-keys?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/organizations/my-organization/reserved-tag-keys?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/organizations/my-organization/reserved-tag-keys?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "page-size": 20,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 2
+ }
+ }
+}
+
+```
+
+## Create a reserved tag key
+
+`POST /organizations/:organization_name/reserved-tag-keys`
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------------------------------------------------ | ------- | ------- | --------------------------------- |
+| `data.type` | string | none | Must be `reserved-tag-keys`. |
+| `data.attributes.key` | string | none | The key targeted by this reserved |
+| tag key. | | | |
+| `data.attributes.disable-overrides` | boolean | none | If `true`, disables |
+| overriding inherited tags with the specified key at the workspace level. | | | |
+
+### Sample payload
+
+```json
+{
+ "data": {
+ "type": "reserved-tag-keys",
+ "attributes": {
+ "key": "environment",
+ "disable-overrides": false
+ }
+ }
+}
+```
+
+### Sample request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/organizations/${ORGANIZATION_NAME}/reserved-tag-keys
+```
+
+### Sample response
+
+```json
+{
+ "data": {
+ "id": "rtk-Tj86UdGahKGDiYXY",
+ "type": "reserved-tag-keys",
+ "attributes": {
+ "key": "environment",
+ "disable-overrides": false,
+ "created-at": "2024-09-04T05:02:06.794Z",
+ "updated-at": "2024-09-04T05:02:06.794Z"
+ }
+ }
+}
+```
+
+## Update a reserved tag key
+
+`PATCH /reserved-tags/:reserved_tag_key_id`
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------------------------------------------------ | ------- | ------- | --------------------------------- |
+| `data.type` | string | none | Must be `reserved-tag-keys`. |
+| `data.attributes.key` | string | none | The key targeted by this reserved |
+| tag key. | | | |
+| `data.attributes.disable-overrides` | boolean | none | If `true`, disables |
+| overriding inherited tags with the specified key at the workspace level. | | | |
+
+### Sample payload
+
+```json
+{
+ "data": {
+ "id": "rtk-Tj86UdGahKGDiYXY",
+ "type": "reserved-tag-keys",
+ "attributes": {
+ "key": "env",
+ "disable-overrides": true,
+ "created-at": "2024-09-04T05:02:06.794Z",
+ "updated-at": "2024-09-04T05:02:06.794Z"
+ }
+ }
+}
+```
+
+### Sample request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ https://app.terraform.io/api/v2/reserved-tags/${RESERVED_TAG_ID}
+```
+
+### Sample response
+
+```json
+{
+ "data": {
+ "id": "rtk-zMtWLDftAjY3b5pA",
+ "type": "reserved-tag-keys",
+ "attributes": {
+ "key": "env",
+ "disable-overrides": true,
+ "created-at": "2024-09-04T05:05:10.449Z",
+ "updated-at": "2024-09-04T05:05:13.486Z"
+ }
+ }
+}
+```
+
+## Delete a reserved tag key
+
+`DELETE /reserved-tags/:reserved_tag_key_id`
+
+### Sample payload
+
+This endpoint does not require a payload.
+
+### Sample request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/reserved-tags/rtk-zMtWLDftAjY3b5pA
+```
+
+### Sample response
+
+This endpoint does not return a response body.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/run-tasks/run-task-stages-and-results.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/run-tasks/run-task-stages-and-results.mdx
new file mode 100644
index 0000000000..40c8a1f250
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/run-tasks/run-task-stages-and-results.mdx
@@ -0,0 +1,366 @@
+---
+page_title: /task-stages API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/task-stages` endpoint to read run tasks
+ and their results, and override run task stages.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API documents]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+[run]: /terraform/enterprise/run/states
+
+# Run task stages and results API reference
+
+HCP Terraform uses run task stages and run task results to track [run task](/terraform/enterprise/workspaces/settings/run-tasks) execution.
+
+
+
+@include 'tfc-package-callouts/run-tasks.mdx'
+
+
+
+When HCP Terraform creates a [run][], it reads the run tasks associated to the workspace. Each run task in the workspace is configured to begin during a specific [run stage](/terraform/enterprise/run/states). HCP Terraform creates a run task stage object for each run stage that triggers run tasks. You can configure run tasks during the [Pre-Plan Stage](/terraform/enterprise/run/states#the-pre-plan-stage), [Post-Plan Stage](/terraform/enterprise/run/states#the-post-plan-stage), [Pre-Apply Stage](/terraform/enterprise/run/states#the-pre-apply-stage) and [Post-Apply Stage](/terraform/enterprise/run/states#the-post-apply-stage).
+
+Run task stages then create a run task result for each run task. For example, a workspace has two run tasks called `alpha` and `beta`. For each run, HCP Terraform creates one run task stage called `post-plan`. That run task stage has two run task results: one for the `alpha` run task and one for the `beta` run task.
+
+This page lists the endpoints to retrieve run task stages and run task results. Refer to the [Run Tasks API](/terraform/enterprise/api-docs/run-tasks/run-tasks) for endpoints to create and manage run tasks within HCP Terraform. Refer to the [Run Tasks Integration API](/terraform/enterprise/api-docs/run-tasks/run-tasks-integration) for endpoints to build custom run tasks for the HCP Terraform ecosystem.
+
+## Attributes
+
+### Run Task Stage Status
+
+The run task stage status is found in `data.attributes.status`, and you can reference the following list of possible values.
+
+| Status | Description |
+| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
+| `pending` | The initial status of a run task stage after creation. |
+| `running` | The run task stage is executing one or more tasks, which have not yet completed. |
+| `passed` | All of the run task results in the stage passed. |
+| `failed` | One more results in the run task stage failed. |
+| `awaiting_override` | The task stage is waiting for user input. Once a user manually overrides the failed run tasks, the run returns to the `running` state. |
+| `errored` | The run task stage has errored. |
+| `canceled` | The run task stage has been canceled. |
+| `unreachable` | The run task stage could not be executed. |
+
+### Run Task Result Status
+
+The run task result status is found in `data.attributes.status`, and you can reference the following list of possible values.
+
+| Status | Description |
+| ------------- | --------------------------------------------------------------------- |
+| `pending` | The initial status of a run task result after creation. |
+| `running` | The associated run task is begun execution and has not yet completed. |
+| `passed` | The associated run task executed and returned a passing result. |
+| `failed` | The associated run task executed and returned a failed result. |
+| `errored` | The associated run task has errored during execution. |
+| `canceled` | The associated run task execution has been canceled. |
+| `unreachable` | The associated run task could not be executed. |
+
+## List the Run Task Stages in a Run
+
+`GET /runs/:run_id/task-stages`
+
+| Parameter | Description |
+| --------- | ----------------------------------- |
+| `run_id` | The run ID to list task stages for. |
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------- | ------------------------------- |
+| [200][] | Array of [JSON API documents][] (`type: "task-stages"`) | Successfully listed task-stages |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters); remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | -------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 runs per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/runs/run-XdgtChJuuUwLoSmw/task-stages
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "ts-rL5ZsuwfjqfPJcdi",
+ "type": "task-stages",
+ "attributes": {
+ "status": "passed",
+ "stage": "post_plan",
+ "status-timestamps": {
+ "passed-at": "2022-06-08T20:32:12+08:00",
+ "running-at": "2022-06-08T20:32:11+08:00"
+ },
+ "created-at": "2022-06-08T12:31:56.94Z",
+ "updated-at": "2022-06-08T12:32:12.315Z"
+ },
+ "relationships": {
+ "run": {
+ "data": {
+ "id": "run-XdgtChJuuUwLoSmw",
+ "type": "runs"
+ }
+ },
+ "task-results": {
+ "data": [
+ {
+ "id": "taskrs-EmnmsEDL1jgd1GTP",
+ "type": "task-results"
+ }
+ ]
+ },
+ "policy-evaluations":{
+ "data":[
+ {
+ "id":"poleval-iouaha9KLgGWkBRQ",
+ "type":"policy-evaluations"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/task-stages/ts-rL5ZsuwfjqfPJcdi"
+ }
+ }
+ ]
+}
+```
+
+## Show a Run Task Stage
+
+`GET /task-stages/:task_stage_id`
+
+| Parameter | Description |
+| ---------------- | ----------------------------- |
+| `:task_stage_id` | The run task stage ID to get. |
+
+This endpoint shows details of a specific task stage.
+
+| Status | Response | Reason |
+| ------- | --------------------------------------------- | ------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "task-stages"`) | Success |
+| [404][] | [JSON API error object][] | Task stage not found or user not authorized |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/task-stages/ts-rL5ZsuwfjqfPJcdi
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "ts-rL5ZsuwfjqfPJcdi",
+ "type": "task-stages",
+ "attributes": {
+ "status": "passed",
+ "stage": "post_plan",
+ "status-timestamps": {
+ "passed-at": "2022-06-08T20:32:12+08:00",
+ "running-at": "2022-06-08T20:32:11+08:00"
+ },
+ "created-at": "2022-06-08T12:31:56.94Z",
+ "updated-at": "2022-06-08T12:32:12.315Z"
+ },
+ "relationships": {
+ "run": {
+ "data": {
+ "id": "run-XdgtChJuuUwLoSmw",
+ "type": "runs"
+ }
+ },
+ "task-results": {
+ "data": [
+ {
+ "id": "taskrs-EmnmsEDL1jgd1GTP",
+ "type": "task-results"
+ }
+ ]
+ },
+ "policy-evaluations":{
+ "data":[
+ {
+ "id":"poleval-iouaha9KLgGWkBRQ",
+ "type":"policy-evaluations"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/task-stages/ts-rL5ZsuwfjqfPJcdi"
+ }
+ }
+}
+```
+
+## Show a Run Task Result
+
+`GET /task-results/:task_result_id`
+
+| Parameter | Description |
+| ----------------- | ------------------------------ |
+| `:task_result_id` | The run task result ID to get. |
+
+This endpoint shows the details for a specific run task result.
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------- | -------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "task-results"`) | Success |
+| [404][] | [JSON API error object][] | Task result not found or user not authorized |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/task-results/taskrs-EmnmsEDL1jgd1GZz
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "taskrs-EmnmsEDL1jgd1GZz",
+ "type": "task-results",
+ "attributes": {
+ "message": "No issues found.\nSeverity threshold is set to low.",
+ "status": "passed",
+ "status-timestamps": {
+ "passed-at": "2022-06-08T20:32:12+08:00",
+ "running-at": "2022-06-08T20:32:11+08:00"
+ },
+ "url": "https://external.service/project/task-123abc",
+ "created-at": "2022-06-08T12:31:56.954Z",
+ "updated-at": "2022-06-08T12:32:12.27Z",
+ "task-id": "task-b6MaHZmGopHDtqhn",
+ "task-name": "example-task",
+ "task-url": "https://external.service/task-123abc",
+ "stage": "post_plan",
+ "is-speculative": false,
+ "workspace-task-id": "wstask-258juqenQeWb3DZz",
+ "workspace-task-enforcement-level": "mandatory"
+ },
+ "relationships": {
+ "task-stage": {
+ "data": {
+ "id": "ts-rL5ZsuwfjqfPJczZ",
+ "type": "task-stages"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/task-results/taskrs-EmnmsEDL1jgd1GZz"
+ }
+ }
+}
+```
+
+## Available Related Resources
+
+### Task Stage
+
+The GET endpoints above can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource | Description |
+| -------------------- | ---------------------------------------------------------- |
+| `run` | Information about the associated run. |
+| `run.workspace` | Information about the associated workspace. |
+| `task-results` | Information about the results for a task-stage. |
+| `policy-evaluations` | Information about the policy evaluations for a task-stage. |
+
+## Override a Task Stage
+
+`POST /task-stages/:task_stage_id/actions/override`
+
+| Parameter | Description |
+| ---------------- | ------------------------------------- |
+| `:task_stage_id` | The ID of the task stage to override. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/task-stages/ts-rL5ZsuwfjqfPJcdi/actions/override
+```
+
+### Sample Response
+
+```json
+{
+ "data":{
+ "id":"ts-F7MumZQcJzVh1ZZk",
+ "type":"task-stages",
+ "attributes":{
+ "status":"running",
+ "stage":"post_plan",
+ "status-timestamps":{
+ "running-at":"2022-09-21T06:36:54+00:00",
+ "awaiting-override-at":"2022-09-21T06:31:50+00:00"
+ },
+ "created-at":"2022-09-21T06:29:44.632Z",
+ "updated-at":"2022-09-21T06:36:54.952Z",
+ "permissions":{
+ "can-override-policy":true,
+ "can-override-tasks":false,
+ "can-override":true
+ },
+ "actions":{
+ "is-overridable":false
+ }
+ },
+ "relationships":{
+ "run":{
+ "data":{
+ "id":"run-K6N4BAz8NfUyR2QB",
+ "type":"runs"
+ }
+ },
+ "task-results":{
+ "data":[
+
+ ]
+ },
+ "policy-evaluations":{
+ "data":[
+ {
+ "id":"poleval-atNKxwvjYy4Gwk3k",
+ "type":"policy-evaluations"
+ }
+ ]
+ }
+ },
+ "links":{
+ "self":"/api/v2/task-stages/ts-F7MumZQcJzVh1ZZk"
+ }
+ }
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/run-tasks/run-tasks-integration.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/run-tasks/run-tasks-integration.mdx
new file mode 100644
index 0000000000..4a285f56e3
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/run-tasks/run-tasks-integration.mdx
@@ -0,0 +1,296 @@
+---
+page_title: Run tasks integration API for Terraform Enterprise
+description: >-
+ Use Terraform Enterprise API's run task integration API to trigger run tasks
+ at specific run phases and learn how to read run task responses.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Run tasks integration API
+
+[Run tasks](/terraform/enterprise/workspaces/settings/run-tasks) allow HCP Terraform to interact with external systems at specific points in the HCP Terraform run lifecycle.
+This page lists the API endpoints used to trigger a run task and the expected response from the integration.
+
+
+
+@include 'tfc-package-callouts/run-tasks.mdx'
+
+
+
+Refer to [run tasks](/terraform/enterprise/api-docs/run-tasks/run-tasks) for the API endpoints to create and manage run tasks within HCP Terraform. You can also access a complete list of all run tasks in the [Terraform Registry](https://registry.terraform.io/browse/run-tasks).
+
+## Run Task Request
+
+When a run reaches the appropriate phase and a run task is triggered, HCP Terraform will send a request to the run task's URL.
+The service receiving the run task request should respond with `200 OK`, or HCP Terraform will retry to trigger the run task.
+
+`POST :url`
+
+| Parameter | Description |
+| --------- | ------------------------------------------------------- |
+| `:url` | The URL configured in the run task to send requests to. |
+
+| Status | Response | Reason |
+| ------- | ---------- | --------------------------------- |
+| [200][] | No Content | Successfully submitted a run task |
+
+### Request Body
+
+The POST request submits a JSON object with the following properties as a request payload.
+
+#### Common Properties
+
+All request payloads contain the following properties.
+
+| Key path | Type | Values | Description |
+| ------------------------------------ | ------- | -------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `payload_version` | integer | `1` | Schema version of the payload. Only `1` is supported. |
+| `stage` | string | `pre_plan`, `post_plan`, `pre_apply`, `post_apply` | The [run stage](/terraform/enterprise/run/states) when HCP Terraform triggers the run task. |
+| `access_token` | string | | Bearer token to use when calling back to HCP Terraform. |
+| `capabilities` | object | | A map of the capabilities that the caller supports. |
+| `capabilities.outcomes` | bool | | A flag indicating the caller accepts detailed run task outcomes. |
+| `configuration_version_download_url` | string | | The URL to [download the configuration version](/terraform/enterprise/api-docs/configuration-versions#download-configuration-files). This is `null` if the configuration version is not available to download. |
+| `configuration_version_id` | string | | The ID of the [configuration version](/terraform/enterprise/api-docs/configuration-versions) for the run. |
+| `is_speculative` | bool | | Whether the task is part of a [speculative run](/terraform/enterprise/run/remote-operations#speculative-plans). |
+| `organization_name` | string | | Name of the organization the task is configured within. |
+| `run_app_url` | string | | URL within HCP Terraform to the run. |
+| `run_created_at` | string | | When the run was started. |
+| `run_created_by` | string | | Who created the run. |
+| `run_id` | string | | Id of the run this task is part of. |
+| `run_message` | string | | Message that was associated with the run. |
+| `task_result_callback_url` | string | | URL that should called back with the result of this task. |
+| `task_result_enforcement_level` | string | `mandatory`, `advisory` | Enforcement level for this task. |
+| `task_result_id` | string | | ID of task result within HCP Terraform. |
+| `vcs_branch` | string | | Repository branch that the workspace executes from. This is `null` if the workspace does not have a VCS repository. |
+| `vcs_commit_url` | string | | URL to the commit that triggered this run. This is `null` if the workspace does not a VCS repository. |
+| `vcs_pull_request_url` | string | | URL to the Pull Request/Merge Request that triggered this run. This is `null` if the run was not triggered. |
+| `vcs_repo_url` | string | | URL to the workspace's VCS repository. This is `null` if the workspace does not have a VCS repository. |
+| `workspace_app_url` | string | | URL within HCP Terraform to the workspace. |
+| `workspace_id` | string | | Id of the workspace the task is associated with. |
+| `workspace_name` | string | | Name of the workspace. |
+| `workspace_working_directory` | string | | The working directory specified in the run's [workspace settings](/terraform/enterprise/workspaces/settings#terraform-working-directory). |
+
+#### Post-Plan, Pre-Apply, and Post-Apply Properties
+
+Requests with `stage` set to `post_plan`, `pre_apply` or `post_apply` contain the following additional properties.
+
+| Key path | Type | Values | Description |
+| ------------------- | ------ | ------ | --------------------------------------------------------- |
+| `plan_json_api_url` | string | | The URL to retrieve the JSON Terraform plan for this run. |
+
+### Sample Payload
+
+```json
+{
+ "payload_version": 1,
+ "stage": "post_plan",
+ "access_token": "4QEuyyxug1f2rw.atlasv1.iDyxqhXGVZ0ykes53YdQyHyYtFOrdAWNBxcVUgWvzb64NFHjcquu8gJMEdUwoSLRu4Q",
+ "capabilities": {
+ "outcomes": true
+ },
+ "configuration_version_download_url": "https://app.terraform.io/api/v2/configuration-versions/cv-ntv3HbhJqvFzamy7/download",
+ "configuration_version_id": "cv-ntv3HbhJqvFzamy7",
+ "is_speculative": false,
+ "organization_name": "hashicorp",
+ "plan_json_api_url": "https://app.terraform.io/api/v2/plans/plan-6AFmRJW1PFJ7qbAh/json-output",
+ "run_app_url": "https://app.terraform.io/app/hashicorp/my-workspace/runs/run-i3Df5to9ELvibKpQ",
+ "run_created_at": "2021-09-02T14:47:13.036Z",
+ "run_created_by": "username",
+ "run_id": "run-i3Df5to9ELvibKpQ",
+ "run_message": "Triggered via UI",
+ "task_result_callback_url": "https://app.terraform.io/api/v2/task-results/5ea8d46c-2ceb-42cd-83f2-82e54697bddd/callback",
+ "task_result_enforcement_level": "mandatory",
+ "task_result_id": "taskrs-2nH5dncYoXaMVQmJ",
+ "vcs_branch": "main",
+ "vcs_commit_url": "https://github.com/hashicorp/terraform-random/commit/7d8fb2a2d601edebdb7a59ad2088a96673637d22",
+ "vcs_pull_request_url": null,
+ "vcs_repo_url": "https://github.com/hashicorp/terraform-random",
+ "workspace_app_url": "https://app.terraform.io/app/hashicorp/my-workspace",
+ "workspace_id": "ws-ck4G5bb1Yei5szRh",
+ "workspace_name": "tfr_github_0",
+ "workspace_working_directory": "/terraform"
+}
+```
+
+### Request Headers
+
+The POST request submits the following properties as the request headers.
+
+| Name | Value | Description |
+| ---------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `Content-Type` | `application/json` | Specifies the type of data in the request body |
+| `User-Agent` | `TFC/1.0 (+https://app.terraform.io; TFC)` | Identifies the request is coming from HCP Terraform |
+| `X-TFC-Task-Signature` | string | If the run task is configured with an [HMAC Key](/terraform/enterprise/integrations/run-tasks#securing-your-run-task), this header contains the signed SHA512 sum of the request payload using the configured HMAC key. Otherwise, this is an empty string. |
+
+## Run Task Callback
+
+While a run task runs, it may send progressive updates to HCP Terraform with a `running` status. Once an integrator determines that Terraform supports detailed run task outcomes, they can send these outcomes by appending to the run task's callback payload.
+
+Once the external integration fulfills the request, that integration must call back into HCP Terraform with the overall result of either `passed` or `failed`. Terraform expects this callback within 10 minutes, or the request is considered errored.
+
+You can send outcomes with a status of `running`, `passed`, or `failed`, but it is a good practice only to send outcomes when a run task is `running`.
+
+`PATCH :callback_url`
+
+| Parameter | Description |
+| --------------- | ----------------------------------------------------------------------------------------------------------- |
+| `:callback_url` | The `task_result_callback_url` specified in the run task request. Typically `/task-results/:guid/callback`. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | --------------------------------------------------------------------------------------------------------------- |
+| [200][] | No Content | Successfully submitted a run task result |
+| [401][] | [JSON API error object][] | Not authorized to perform action |
+| [422][] | [JSON API error object][] | Invalid response payload. This could be caused by invalid attributes, or sending a status that is not accepted. |
+
+### Request Body
+
+The PATCH request submits a JSON object with the following properties as a request payload. This payload is also described in the [JSON API schema for run task results](https://github.com/hashicorp/terraform-docs-common/blob/main/website/public/schema/run-tasks/runtask-result.json).
+
+| Key path | Type | Description |
+| ----------------------------- | ------ | --------------------------------------------------------------------------------- |
+| `data.type` | string | Must be `"task-results"`. |
+| `data.attributes.status` | string | The current status of the task. Only `passed`, `failed` or `running` are allowed. |
+| `data.attributes.message` | string | (Recommended, but optional) A short message describing the status of the task. |
+| `data.attributes.url` | string | (Optional) A URL where users can obtain more information about the task. |
+| `relationships.outcomes.data` | array | (Recommended, but optional) A collection of detailed run task outcomes. |
+
+Status values other than passed, failed, or running return an error. Both the passed and failed statuses represent a final state for a run task. The running status allows one or more partial updates until the task has reached a final state.
+
+```json
+{
+ "data": {
+ "type": "task-results",
+ "attributes": {
+ "status": "passed",
+ "message": "4 passed, 0 skipped, 0 failed",
+ "url": "https://external.service.dev/terraform-plan-checker/run-i3Df5to9ELvibKpQ"
+ },
+ "relationships": {
+ "outcomes": {
+ "data": [...]
+ }
+ }
+ }
+}
+```
+
+#### Outcomes Payload Body
+
+A run task result may optionally contain one or more detailed outcomes, which improves result visibility and content in the HCP Terraform user interface. The following attributes define the outcome.
+
+| Key path | Type | Description |
+| ------------------ | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `outcome-id` | string | A partner supplied identifier for this outcome. |
+| `description` | string | A one-line description of the result. |
+| `body` | string | (Optional) A detailed message for the result in Markdown format. It is recommended to keep it under 1MB, with a maximum allowable limit of 5MB. |
+| `url` | string | (Optional) A URL that a user can navigate to for more information about this result. |
+| `tags` | object | (Optional) An object containing tag arrays, named by the property key. |
+| `tags.key` | string | The two or three word name of the header tag. [Special handling](#severity-and-status-tags) is given to `severity` and `status` keys. |
+| `tags.key[].label` | string | The text value of the tag. |
+| `tags.key[].level` | enum string | (Optional) The error level for the tag. Defaults to `none`, but accepts `none`, `info`, `warning`, or `error`. For levels other than `none`, labels render with a color and icon for that level. |
+
+##### Severity and Status Tags
+
+Run task outcomes with tags named "severity" or "status" are enriched within the outcomes display list in HCP Terraform, enabling an earlier response to issues with severity and status.
+
+```json
+{
+ "type": "task-result-outcomes",
+ "attributes": {
+ "outcome-id": "PRTNR-CC-TF-127",
+ "description": "ST-2942: S3 Bucket will not enforce MFA login on delete requests",
+ "tags": {
+ "Status": [
+ {
+ "label": "Denied",
+ "level": "error"
+ }
+ ],
+ "Severity": [
+ {
+ "label": "High",
+ "level": "error"
+ },
+ {
+ "label": "Recoverable",
+ "level": "info"
+ }
+ ],
+ "Cost Centre": [
+ {
+ "label": "IT-OPS"
+ }
+ ]
+ },
+ "body": "# Resolution for issue ST-2942\n\n## Impact\n\nFollow instructions in the [AWS S3 docs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/MultiFactorAuthenticationDelete.html) to manually configure the MFA setting.\n—-- Payload truncated —--",
+ "url": "https://external.service.dev/result/PRTNR-CC-TF-127"
+ }
+}
+```
+
+##### Complete Callback Payload Example
+
+The example below shows a complete payload explaining the data structure of a callback payload, including all the necessary fields.
+
+```json
+{
+ "data": {
+ "type": "task-results",
+ "attributes": {
+ "status": "failed",
+ "message": "0 passed, 0 skipped, 1 failed",
+ "url": "https://external.service.dev/terraform-plan-checker/run-i3Df5to9ELvibKpQ"
+ },
+ "relationships": {
+ "outcomes": {
+ "data": [
+ {
+ "type": "task-result-outcomes",
+ "attributes": {
+ "outcome-id": "PRTNR-CC-TF-127",
+ "description": "ST-2942: S3 Bucket will not enforce MFA login on delete requests",
+ "tags": {
+ "Status": [
+ {
+ "label": "Denied",
+ "level": "error"
+ }
+ ],
+ "Severity": [
+ {
+ "label": "High",
+ "level": "error"
+ },
+ {
+ "label": "Recoverable",
+ "level": "info"
+ }
+ ],
+ "Cost Centre": [
+ {
+ "label": "IT-OPS"
+ }
+ ]
+ },
+ "body": "# Resolution for issue ST-2942\n\n## Impact\n\nFollow instructions in the [AWS S3 docs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/MultiFactorAuthenticationDelete.html) to manually configure the MFA setting.\n—-- Payload truncated —--",
+ "url": "https://external.service.dev/result/PRTNR-CC-TF-127"
+ }
+ }
+ ]
+ }
+ }
+ }
+}
+```
+
+### Request Headers
+
+The PATCH request must use the token supplied in the originating request (`access_token`) for [authentication](/terraform/enterprise/api-docs#authentication).
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/run-tasks/run-tasks.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/run-tasks/run-tasks.mdx
new file mode 100644
index 0000000000..a2c11e17c7
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/run-tasks/run-tasks.mdx
@@ -0,0 +1,814 @@
+---
+page_title: /tasks API reference for Terraform Enterprise
+description: >-
+ Use Terraform Enterprise API's `/tasks` endpoint to read, create, update, and
+ delete run tasks, and read, update, delete and associate run tasks to
+ workspaces.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+[JSON API Schema document]: https://github.com/hashicorp/terraform-docs-common/blob/main/website/public/schema/run-tasks/runtask-results.json
+
+# Run tasks API reference
+
+[Run tasks](/terraform/enterprise/workspaces/settings/run-tasks) allow HCP Terraform to interact with external systems at specific points in the HCP Terraform run lifecycle. Run tasks are reusable configurations that you can associate to any workspace in an organization. This page lists the API endpoints for run tasks in an organization and explains how to associate run tasks to workspaces.
+
+
+
+@include 'tfc-package-callouts/run-tasks.mdx'
+
+
+
+Refer to [run tasks Integration](/terraform/enterprise/api-docs/run-tasks/run-tasks-integration) for the API endpoints related triggering run tasks and the expected integration response.
+
+## Required Permissions
+
+To interact with run tasks on an organization, you need the [Manage Run Tasks permission](/terraform/enterprise/users-teams-organizations/permissions#manage-run-tasks). To associate or dissociate run tasks in a workspace, you need the [Manage Workspace Run Tasks permission](/terraform/enterprise/users-teams-organizations/permissions#general-workspace-permissions) on that particular workspace.
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+## Create a Run Task
+
+`POST /organizations/:organization_name/tasks`
+
+| Parameter | Description |
+| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The organization to create a run task in. The organization must already exist in HCP Terraform, and the token authenticating the API request must have [owner permission](/terraform/enterprise/users-teams-organizations/permissions). |
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "tasks"`) | Successfully created a run task |
+| [404][] | [JSON API error object][] | Organization not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required unless otherwise specified.
+
+| Key path | Type | Default | Description |
+| -------------------------------------------------------- | ------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"tasks"`. |
+| `data.attributes.name` | string | | The name of the task. Can include letters, numbers, `-`, and `_`. |
+| `data.attributes.url` | string | | URL to send a run task payload. |
+| `data.attributes.description` | string | | The description of the run task. Can be up to 300 characters long including spaces, letters, numbers, and special characters. |
+| `data.attributes.category` | string | | Must be `"task"`. |
+| `data.attributes.hmac-key` | string | | (Optional) HMAC key to verify run task. |
+| `data.attributes.enabled` | bool | true | (Optional) Whether the task will be run. |
+| `data.attributes.global-configuration.enabled` | bool | false | (Optional) Whether the task will be associated on all workspaces. |
+| `data.attributes.global-configuration.stages` | array | | (Optional) An array of strings representing the stages of the run lifecycle when the run task should begin. Must be one or more of `"pre_plan"`, `"post_plan"`, `"pre_apply"`, or `"post_apply"`. |
+| `data.attributes.global-configuration.enforcement-level` | string | | (Optional) The enforcement level of the workspace task. Must be `"advisory"` or `"mandatory"`. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "tasks",
+ "attributes": {
+ "name": "example",
+ "url": "http://example.com",
+ "description": "Simple description",
+ "hmac_key": "secret",
+ "enabled": "true",
+ "category": "task",
+ "global-configuration": {
+ "enabled": true,
+ "stages": ["pre_plan"],
+ "enforcement-level": "mandatory"
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/tasks
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "task-7oD7doVTQdAFnMLV",
+ "type": "tasks",
+ "attributes": {
+ "category": "task",
+ "name": "my-run-task",
+ "url": "http://example.com",
+ "description": "Simple description",
+ "enabled": "true",
+ "hmac-key": null,
+ "global-configuration": {
+ "enabled": true,
+ "stages": ["pre_plan"],
+ "enforcement-level": "mandatory"
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations"
+ }
+ },
+ "tasks": {
+ "data": []
+ }
+ },
+ "links": {
+ "self": "/api/v2/tasks/task-7oD7doVTQdAFnMLV"
+ }
+ }
+}
+```
+
+## List Run Tasks
+
+`GET /organizations/:organization_name/tasks`
+
+| Parameter | Description |
+| -------------------- | ----------------------------------- |
+| `:organization_name` | The organization to list tasks for. |
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "tasks"`) | Request was successful |
+| [404][] | [JSON API error object][] | Organization not found, or user unauthorized to perform action |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `include` | **Optional.** Allows including related resource data. Value must be a comma-separated list containing one or more of `workspace_tasks` or `workspace_tasks.workspace`. |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 run tasks per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/v2/organizations/my-organization/tasks
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "task-7oD7doVTQdAFnMLV",
+ "type": "tasks",
+ "attributes": {
+ "category": "task",
+ "name": "my-task",
+ "url": "http://example.com",
+ "description": "Simple description",
+ "enabled": "true",
+ "hmac-key": null,
+ "global-configuration": {
+ "enabled": true,
+ "stages": ["pre_plan"],
+ "enforcement-level": "mandatory"
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations"
+ }
+ },
+ "tasks": {
+ "data": []
+ }
+ },
+ "links": {
+ "self": "/api/v2/tasks/task-7oD7doVTQdAFnMLV"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/organizations/hashicorp/tasks?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/organizations/hashicorp/tasks?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/organizations/hashicorp/tasks?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "page-size": 20,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 1
+ }
+ }
+}
+```
+
+## Show a Run Task
+
+`GET /tasks/:id`
+
+| Parameter | Description |
+| --------- | --------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the task to show. Use the ["List Run Tasks"](#list-run-tasks) endpoint to find IDs. |
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | --------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "tasks"`) | The request was successful |
+| [404][] | [JSON API error object][] | Run task not found or user unauthorized to perform action |
+
+| Parameter | Description |
+| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `include` | **Optional.** Allows including related resource data. Value must be a comma-separated list containing one or more of `workspace_tasks` or `workspace_tasks.workspace`. |
+
+### Sample Request
+
+```shell
+curl --request GET \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/tasks/task-7oD7doVTQdAFnMLV
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "task-7oD7doVTQdAFnMLV",
+ "type": "tasks",
+ "attributes": {
+ "category": "task",
+ "name": "my-task",
+ "url": "http://example.com",
+ "description": "Simple description",
+ "enabled": "true",
+ "hmac-key": null,
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations"
+ }
+ },
+ "tasks": {
+ "data": [
+ {
+ "id": "task-xjKZw9KaeXda61az",
+ "type": "tasks"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/tasks/task-7oD7doVTQdAFnMLV"
+ }
+ }
+}
+```
+
+## Update a Run Task
+
+`PATCH /tasks/:id`
+
+| Parameter | Description |
+| --------- | ----------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the task to update. Use the ["List Run Tasks"](#list-run-tasks) endpoint to find IDs. |
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "tasks"`) | The request was successful |
+| [404][] | [JSON API error object][] | Run task not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required unless otherwise specified.
+
+| Key path | Type | Default | Description |
+| -------------------------------------------------------- | ------ | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"tasks"`. |
+| `data.attributes.name` | string | (previous value) | The name of the run task. Can include letters, numbers, `-`, and `_`. |
+| `data.attributes.url` | string | (previous value) | URL to send a run task payload. |
+| `data.attributes.description` | string | | The description of the run task. Can be up to 300 characters long including spaces, letters, numbers, and special characters. |
+| `data.attributes.category` | string | (previous value) | Must be `"task"`. |
+| `data.attributes.hmac-key` | string | (previous value) | (Optional) HMAC key to verify run task. |
+| `data.attributes.enabled` | bool | (previous value) | (Optional) Whether the task will be run. |
+| `data.attributes.global-configuration.enabled` | bool | (previous value) | (Optional) Whether the task will be associated on all workspaces. |
+| `data.attributes.global-configuration.stages` | array | (previous value) | (Optional) An array of strings representing the stages of the run lifecycle when the run task should begin. Must be one or more of `"pre_plan"`, `"post_plan"`, `"pre_apply"`, or `"post_apply"`. |
+| `data.attributes.global-configuration.enforcement-level` | string | (previous value) | (Optional) The enforcement level of the workspace task. Must be `"advisory"` or `"mandatory"`. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "tasks",
+ "attributes": {
+ "name": "new-example",
+ "url": "http://new-example.com",
+ "description": "New description",
+ "hmac_key": "new-secret",
+ "enabled": "false",
+ "category": "task",
+ "global-configuration": {
+ "enabled": false
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/tasks/task-7oD7doVTQdAFnMLV
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "task-7oD7doVTQdAFnMLV",
+ "type": "tasks",
+ "attributes": {
+ "category": "task",
+ "name": "new-example",
+ "url": "http://new-example.com",
+ "description": "New description",
+ "enabled": "false",
+ "hmac-key": null,
+ "global-configuration": {
+ "enabled": false,
+ "stages": ["pre_plan"],
+ "enforcement-level": "mandatory"
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations"
+ }
+ },
+ "tasks": {
+ "data": [
+ {
+ "id": "wstask-xjKZw9KaeXda61az",
+ "type": "workspace-tasks"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/tasks/task-7oD7doVTQdAFnMLV"
+ }
+ }
+}
+```
+
+## Delete a Run Task
+
+`DELETE /tasks/:id`
+
+| Parameter | Description |
+| --------- | --------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the run task to delete. Use the ["List Run Tasks"](#list-run-tasks) endpoint to find IDs. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ---------------------------------------------------------- |
+| [204][] | No Content | Successfully deleted the run task |
+| [404][] | [JSON API error object][] | Run task not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/tasks/task-7oD7doVTQdAFnMLV
+```
+
+## Associate a Run Task to a Workspace
+
+`POST /workspaces/:workspace_id/tasks`
+
+| Parameter | Description |
+| --------------- | ------------------------ |
+| `:workspace_id` | The ID of the workspace. |
+
+This endpoint associates an existing run task to a specific workspace.
+
+This involves setting the run task enforcement level, which determines whether the run task blocks runs from completing.
+
+- Advisory run tasks can not block a run from completing. If the task fails, the run will proceed with a warning.
+
+- Mandatory run tasks block a run from completing. If the task fails (including a timeout or unexpected remote error condition), the run stops with an error.
+
+You may also configure the run task to begin during specific [run stages](/terraform/enterprise/run/states). Run tasks use the [Post-Plan Stage](/terraform/enterprise/run/states#the-post-plan-stage) by default.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ---------------------------------------------------------------------- |
+| [204][] | No Content | The request was successful |
+| [404][] | [JSON API error object][] | Workspace or run task not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------------- | ------ | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"workspace-tasks"`. |
+| `data.attributes.enforcement-level` | string | | The enforcement level of the workspace task. Must be `"advisory"` or `"mandatory"`. |
+| `data.attributes.stage` | string | `"post_plan"` | **DEPRECATED** Use `stages` instead. The stage in the run lifecycle when the run task should begin. Must be `"pre_plan"`, `"post_plan"`, `"pre_apply"`, or `"post_apply"`. |
+| `data.attributes.stages` | array | `["post_plan"]` | An array of strings representing the stages of the run lifecycle when the run task should begin. Must be one or more of `"pre_plan"`, `"post_plan"`, `"pre_apply"`, or `"post_apply"`. |
+| `data.relationships.task.data.id` | string | | The ID of the run task. |
+| `data.relationships.task.data.type` | string | | Must be `"tasks"`. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "workspace-tasks",
+ "attributes": {
+ "enforcement-level": "advisory",
+ "stages": ["post_plan"]
+ },
+ "relationships": {
+ "task": {
+ "data": {
+ "id": "task-7oD7doVTQdAFnMLV",
+ "type": "tasks"
+ }
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-PphL7ix3yGasYGrq/tasks
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "wstask-tBXYu8GVAFBpcmPm",
+ "type": "workspace-tasks",
+ "attributes": {
+ "enforcement-level": "advisory",
+ "stage": "post_plan",
+ "stages": ["post_plan"]
+ },
+ "relationships": {
+ "task": {
+ "data": {
+ "id": "task-7oD7doVTQdAFnMLV",
+ "type": "tasks"
+ }
+ },
+ "workspace": {
+ "data": {
+ "id": "ws-PphL7ix3yGasYGrq",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/workspaces/ws-PphL7ix3yGasYGrq/tasks/task-tBXYu8GVAFBpcmPm"
+ }
+ }
+}
+```
+
+## List Workspace Run Tasks
+
+`GET /workspaces/:workspace_id/tasks`
+
+| Parameter | Description |
+| --------------- | -------------------------------- |
+| `:workspace_id` | The workspace to list tasks for. |
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | ----------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "tasks"`) | Request was successful |
+| [404][] | [JSON API error object][] | Workspace not found, or user unauthorized to perform action |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | ------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 run tasks per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/v2/workspaces/ws-kRsDRPtTmtcEme4t/tasks
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "wstask-tBXYu8GVAFBpcmPm",
+ "type": "workspace-tasks",
+ "attributes": {
+ "enforcement-level": "advisory",
+ "stage": "post_plan",
+ "stages": ["post_plan"]
+ },
+ "relationships": {
+ "task": {
+ "data": {
+ "id": "task-hu74ST39g566Q4m5",
+ "type": "tasks"
+ }
+ },
+ "workspace": {
+ "data": {
+ "id": "ws-kRsDRPtTmtcEme4t",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/workspaces/ws-kRsDRPtTmtcEme4t/tasks/task-tBXYu8GVAFBpcmPm"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/workspaces/ws-kRsDRPtTmtcEme4t/tasks?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/workspaces/ws-kRsDRPtTmtcEme4t/tasks?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/workspaces/ws-kRsDRPtTmtcEme4t/tasks?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "page-size": 20,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 1
+ }
+ }
+}
+```
+
+## Show Workspace Run Task
+
+`GET /workspaces/:workspace_id/tasks/:id`
+
+| Parameter | Description |
+| --------- | --------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the workspace task to show. Use the ["List Workspace Run Tasks"](#list-workspace-run-tasks) endpoint to find IDs. |
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | ------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "tasks"`) | The request was successful |
+| [404][] | [JSON API error object][] | Workspace run task not found or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl --request GET \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/workspaces/ws-kRsDRPtTmtcEme4t/tasks/wstask-tBXYu8GVAFBpcmPm
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "wstask-tBXYu8GVAFBpcmPm",
+ "type": "workspace-tasks",
+ "attributes": {
+ "enforcement-level": "advisory",
+ "stage": "post_plan",
+ "stages": ["post_plan"]
+ },
+ "relationships": {
+ "task": {
+ "data": {
+ "id": "task-hu74ST39g566Q4m5",
+ "type": "tasks"
+ }
+ },
+ "workspace": {
+ "data": {
+ "id": "ws-kRsDRPtTmtcEme4t",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/workspaces/ws-kRsDRPtTmtcEme4t/tasks/wstask-tBXYu8GVAFBpcmPm"
+ }
+ }
+}
+```
+
+## Update Workspace Run Task
+
+`PATCH /workspaces/:workspace_id/tasks/:id`
+
+| Parameter | Description |
+| --------- | ------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the task to update. Use the ["List Workspace Run Tasks"](#list-workspace-run-tasks) endpoint to find IDs. |
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | ------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "tasks"`) | The request was successful |
+| [404][] | [JSON API error object][] | Workspace run task not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------------- | ------ | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | (previous value) | Must be `"workspace-tasks"`. |
+| `data.attributes.enforcement-level` | string | (previous value) | The enforcement level of the workspace run task. Must be `"advisory"` or `"mandatory"`. |
+| `data.attributes.stage` | string | (previous value) | **DEPRECATED** Use `stages` instead. The stage in the run lifecycle when the run task should begin. Must be `"pre_plan"` or `"post_plan"`. |
+| `data.attributes.stages` | array | (previous value) | An array of strings representing the stages of the run lifecycle when the run task should begin. Must be one or more of `"pre_plan"`, `"post_plan"`, `"pre_apply"`, or `"post_apply"`. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "workspace-tasks",
+ "attributes": {
+ "enforcement-level": "mandatory",
+ "stages": ["post_plan"]
+ }
+ }
+}
+```
+
+#### Deprecated Payload
+
+```json
+{
+ "data": {
+ "type": "workspace-tasks",
+ "attributes": {
+ "enforcement-level": "mandatory",
+ "stages": ["post_plan"]
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-kRsDRPtTmtcEme4t/tasks/wstask-tBXYu8GVAFBpcmPm
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "wstask-tBXYu8GVAFBpcmPm",
+ "type": "workspace-tasks",
+ "attributes": {
+ "enforcement-level": "mandatory",
+ "stage": "post_plan",
+ "stages": ["post_plan"]
+ },
+ "relationships": {
+ "task": {
+ "data": {
+ "id": "task-hu74ST39g566Q4m5",
+ "type": "tasks"
+ }
+ },
+ "workspace": {
+ "data": {
+ "id": "ws-kRsDRPtTmtcEme4t",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/workspaces/ws-kRsDRPtTmtcEme4t/tasks/task-tBXYu8GVAFBpcmPm"
+ }
+ }
+}
+```
+
+## Delete Workspace Run Task
+
+`DELETE /workspaces/:workspace_id/tasks/:id`
+
+| Parameter | Description |
+| --------- | --------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the Workspace run task to delete. Use the ["List Workspace Run Tasks"](#list-workspace-run-tasks) endpoint to find IDs. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------------------- |
+| [204][] | No Content | Successfully deleted the workspace run task |
+| [404][] | [JSON API error object][] | Workspace run task not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/workspaces/ws-kRsDRPtTmtcEme4t/tasks/wstask-tBXYu8GVAFBpcmPm
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/run-triggers.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/run-triggers.mdx
new file mode 100644
index 0000000000..e557a25a36
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/run-triggers.mdx
@@ -0,0 +1,349 @@
+---
+page_title: /run-triggers API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/run-triggers` endpoint to read, create,
+ and delete run triggers.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Run triggers API reference
+
+## Create a Run Trigger
+
+`POST /workspaces/:workspace_id/run-triggers`
+
+| Parameter | Description |
+| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The ID of the workspace to create the run trigger in. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](/terraform/enterprise/api-docs/workspaces#show-workspace) endpoint. |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------- | ------------------------------------------------------------------------ |
+| [201][] | [JSON API document][] (`type: "run-triggers"`) | Successfully created a run trigger |
+| [404][] | [JSON API error object][] | Workspace or sourceable not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Permissions
+
+In order to create a run trigger, the user must have admin access to the specified workspace and permission to read runs for the sourceable workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------------ | ------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.relationships.sourceable.data` | object | | A JSON API relationship object that represents the source workspace for the run trigger. This object must have `id` and `type` properties, and the `type` property must be `workspaces` (e.g. `{ "id": "ws-2HRvNs49EWPjDqT1", "type": "workspaces" }`). Obtain workspace IDs from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](/terraform/enterprise/api-docs/workspaces#show-workspace) endpoint. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "relationships": {
+ "sourceable": {
+ "data": {
+ "id": "ws-2HRvNs49EWPjDqT1",
+ "type": "workspaces"
+ }
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --request POST \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-XdeUVMWShTesDMME/run-triggers
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "rt-3yVQZvHzf5j3WRJ1",
+ "type": "run-triggers",
+ "attributes": {
+ "workspace-name": "workspace-1",
+ "sourceable-name": "workspace-2",
+ "created-at": "2018-09-11T18:21:21.784Z"
+ },
+ "relationships": {
+ "workspace": {
+ "data": {
+ "id": "ws-XdeUVMWShTesDMME",
+ "type": "workspaces"
+ }
+ },
+ "sourceable": {
+ "data": {
+ "id": "ws-2HRvNs49EWPjDqT1",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/run-triggers/rt-3yVQZvHzf5j3WRJ1"
+ }
+ }
+}
+```
+
+## List Run Triggers
+
+`GET /workspaces/:workspace_id/run-triggers`
+
+| Parameter | Description |
+| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The ID of the workspace to list run triggers for. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](/terraform/enterprise/api-docs/workspaces#show-workspace) endpoint. |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "run-triggers"`) | Request was successful |
+| [400][] | [JSON API error object][] | Required parameter `filter[run-trigger][type]` is missing or has been given an invalid value |
+| [404][] | [JSON API error object][] | Workspace not found or user unauthorized to perform action |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters); remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `filter[run-trigger][type]` | **Required** Which type of run triggers to list; valid values are `inbound` or `outbound`. `inbound` run triggers create runs in the specified workspace, and `outbound` run triggers create runs in other workspaces. |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 run triggers per page. |
+
+### Permissions
+
+In order to list run triggers, the user must have permission to read runs for the specified workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+### Sample Request
+
+```shell
+curl \
+ --request GET \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/workspaces/ws-XdeUVMWShTesDMME/run-triggers?filter%5Brun-trigger%5D%5Btype%5D=inbound
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "rt-WygcwSBuYaQWrM39",
+ "type": "run-triggers",
+ "attributes": {
+ "workspace-name": "workspace-1",
+ "sourceable-name": "workspace-2",
+ "created-at": "2018-09-11T18:21:21.784Z"
+ },
+ "relationships": {
+ "workspace": {
+ "data": {
+ "id": "ws-XdeUVMWShTesDMME",
+ "type": "workspaces"
+ }
+ },
+ "sourceable": {
+ "data": {
+ "id": "ws-2HRvNs49EWPjDqT1",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/run-triggers/rt-WygcwSBuYaQWrM39"
+ }
+ },
+ {
+ "id": "rt-8F5JFydVYAmtTjET",
+ "type": "run-triggers",
+ "attributes": {
+ "workspace-name": "workspace-1",
+ "sourceable-name": "workspace-3",
+ "created-at": "2018-09-11T18:21:21.784Z"
+ },
+ "relationships": {
+ "workspace": {
+ "data": {
+ "id": "ws-XdeUVMWShTesDMME",
+ "type": "workspaces"
+ }
+ },
+ "sourceable": {
+ "data": {
+ "id": "ws-BUHBEM97xboT8TVz",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/run-triggers/rt-8F5JFydVYAmtTjET"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/workspaces/ws-xdiJLyGpCugbFDE1/run-triggers?filter%5Brun-trigger%5D%5Btype%5D=inbound&page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/workspaces/ws-xdiJLyGpCugbFDE1/run-triggers?filter%5Brun-trigger%5D%5Btype%5D=inbound&page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/workspaces/ws-xdiJLyGpCugbFDE1/run-triggers?filter%5Brun-trigger%5D%5Btype%5D=inbound&page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 2
+ }
+ }
+}
+```
+
+## Show a Run Trigger
+
+`GET /run-triggers/:run_trigger_id`
+
+| Parameter | Description |
+| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:run_trigger_id` | The ID of the run trigger to show. Send a `GET` request to the `run-triggers` endpoint to find IDs. Refer to [List Run Triggers](#list-run-triggers) for details. |
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------- | ------------------------------------------------------------ |
+| [200][] | [JSON API document][] (`type: "run-triggers"`) | The request was successful |
+| [404][] | [JSON API error object][] | Run trigger not found or user unauthorized to perform action |
+
+### Permissions
+
+In order to show a run trigger, the user must have permission to read runs for either the workspace or sourceable workspace of the specified run trigger. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+### Sample Request
+
+```shell
+curl \
+ --request GET \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/run-triggers/rt-3yVQZvHzf5j3WRJ1
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "rt-3yVQZvHzf5j3WRJ1",
+ "type": "run-triggers",
+ "attributes": {
+ "workspace-name": "workspace-1",
+ "sourceable-name": "workspace-2",
+ "created-at": "2018-09-11T18:21:21.784Z"
+ },
+ "relationships": {
+ "workspace": {
+ "data": {
+ "id": "ws-XdeUVMWShTesDMME",
+ "type": "workspaces"
+ }
+ },
+ "sourceable": {
+ "data": {
+ "id": "ws-2HRvNs49EWPjDqT1",
+ "type": "workspaces"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/run-triggers/rt-3yVQZvHzf5j3WRJ1"
+ }
+ }
+}
+```
+
+## Delete a Run Trigger
+
+`DELETE /run-triggers/:run_trigger_id`
+
+| Parameter | Description |
+| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:run_trigger_id` | The ID of the run trigger to delete. Send a `GET` request to the `run-triggers` endpoint o find IDs. Refer to [List Run Triggers](#list-run-triggers) for details. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------ |
+| [204][] | No Content | Successfully deleted the run trigger |
+| [404][] | [JSON API error object][] | Run trigger not found or user unauthorized to perform action |
+
+### Permissions
+
+In order to delete a run trigger, the user must have admin access to the specified workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+### Sample Request
+
+```shell
+curl \
+ --request DELETE \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/run-triggers/rt-3yVQZvHzf5j3WRJ1
+```
+
+## Available Related Resources
+
+The GET endpoints above can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+These includes respect read permissions. If you do not have access to read the related resource, it will not be returned.
+
+- `workspace` - The full workspace object.
+- `sourceable` - The full source workspace object.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/run.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/run.mdx
new file mode 100644
index 0000000000..950e1d8880
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/run.mdx
@@ -0,0 +1,902 @@
+---
+page_title: /runs API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/runs` endpoint to read, get, create,
+ apply, discard, execute, and cancel Terraform runs. You can also list a
+ workspace's or organization's runs.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Runs API reference
+
+-> **Note:** Before working with the runs or configuration versions APIs, read the [API-driven run workflow](/terraform/enterprise/run/api) page, which includes both a full overview of this workflow and a walkthrough of a simple implementation of it.
+
+Performing a run on a new configuration is a multi-step process.
+
+1. [Create a configuration version on the workspace](/terraform/enterprise/api-docs/configuration-versions#create-a-configuration-version).
+2. [Upload configuration files to the configuration version](/terraform/enterprise/api-docs/configuration-versions#upload-configuration-files).
+3. [Create a run on the workspace](#create-a-run); this is done automatically when a configuration file is uploaded.
+4. [Create and queue an apply on the run](#apply-a-run); if the run can't be auto-applied.
+
+Alternatively, you can create a run with a pre-existing configuration version, even one from another workspace. This is useful for promoting known good code from one workspace to another.
+
+## Attributes
+
+### Run States
+
+The run state is found in `data.attributes.status`, and you can reference the following list of possible states.
+
+| State | Description |
+| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `pending` | The initial status of a run after creation. |
+| `fetching` | The run is waiting for HCP Terraform to fetch the configuration from VCS. |
+| `fetching_completed` | HCP Terraform has fetched the configuration from VCS and the run will continue. |
+| `pre_plan_running` | The pre-plan phase of the run is in progress. |
+| `pre_plan_completed` | The pre-plan phase of the run has completed. |
+| `queuing` | HCP Terraform is queuing the run to start the planning phase. |
+| `plan_queued` | HCP Terraform is waiting for its backend services to start the plan. |
+| `planning` | The planning phase of a run is in progress. |
+| `planned` | The planning phase of a run has completed. |
+| `cost_estimating` | The cost estimation phase of a run is in progress. |
+| `cost_estimated` | The cost estimation phase of a run has completed. |
+| `policy_checking` | The sentinel policy checking phase of a run is in progress. |
+| `policy_override` | A sentinel policy has soft failed, and a user can override it to continue the run. |
+| `policy_soft_failed` | A sentinel policy has soft failed for a plan-only run. This is a final state. |
+| `policy_checked` | The sentinel policy checking phase of a run has completed. |
+| `confirmed` | A user has confirmed the plan. |
+| `post_plan_running` | The post-plan phase of the run is in progress. |
+| `post_plan_completed` | The post-plan phase of the run has completed. |
+| `planned_and_finished` | The run is completed. This status only exists for plan-only runs and runs that produce a plan with no changes to apply. This is a final state. |
+| `planned_and_saved` | The run has finished its planning, checks, and estimates, and can be confirmed for apply. This status is only used for saved plan runs. |
+| `apply_queued` | Once the changes in the plan have been confirmed, the run will transition to `apply_queued`. This status indicates that the run should start as soon as the backend services that run terraform have available capacity. In HCP Terraform, you should seldom see this status, as our aim is to always have capacity. However, in Terraform Enterprise this status will be more common due to the self-hosted nature. |
+| `applying` | Terraform is applying the changes specified in the plan. |
+| `applied` | Terraform has applied the changes specified in the plan. |
+| `discarded` | The run has been discarded. This is a final state. |
+| `errored` | The run has errored. This is a final state. |
+| `canceled` | The run has been canceled. |
+| `force_canceled` | A workspace admin forcefully canceled the run. |
+
+### Run Operations
+
+The run operation specifies the Terraform execution mode. You can reference the following list of possible execution modes and use them as query parameters in the [workspace](/terraform/enterprise/api-docs/run#list-runs-in-a-workspace) and [organization](/terraform/enterprise/api-docs/run#list-runs-in-a-organization) runs lists.
+
+| Operation | Description |
+| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `plan_only` | The run does not have an apply phase. This is also called a [_speculative plan_](/terraform/enterprise/run/modes-and-options#plan-only-speculative-plan). |
+| `plan_and_apply` | The run includes both plan and apply phases. |
+| `save_plan` | The run is a saved plan run. It can include both plan and apply phases, but only becomes the workspace's current run if a user chooses to apply it. |
+| `refresh_only` | The run should update Terraform state, but not make changes to resources. |
+| `destroy` | The run should destroy all objects, regardless of configuration changes. |
+| `empty_apply` | The run should perform an apply with no changes to resources. This is most commonly used to [upgrade terraform state versions](/terraform/enterprise/workspaces/state#upgrading-state). |
+
+### Run Sources
+
+You can use the following sources as query parameters in [workspace](/terraform/enterprise/api-docs/run#list-runs-in-a-workspace) and [organization](/terraform/enterprise/api-docs/run#list-runs-in-a-organization) runs lists.
+
+| Source | Description |
+| --------------------------- | --------------------------------------------------------------------------------------- |
+| `tfe-ui` | Indicates a run was queued from HCP Terraform UI. |
+| `tfe-api` | Indicates a run was queued from HCP Terraform API. |
+| `tfe-configuration-version` | Indicates a run was queued from a Configuration Version, triggered from a VCS provider. |
+
+### Run Status Groups
+
+The run status group specifies a collection of run states by logical category.
+
+| Group | Description |
+| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `non_final` | Inclusive of runs that are currently running, require user confirmation, or are queued/pending. |
+| `final` | Inclusive of runs that have reached their final and terminal state. |
+| `discardable` | Inclusive of runs whose state falls under the following: `planned`, `planned_and_saved`, `cost_estimated`, `policy_checked`, `policy_override`, `post_plan_running`, `post_plan_completed` |
+
+## Create a Run
+
+`POST /runs`
+
+A run performs a plan and apply, using a configuration version and the workspace’s current variables. You can specify a configuration version when creating a run; if you don’t provide one, the run defaults to the workspace’s most recently used version. (A configuration version is “used” when it is created or used for a run in this workspace.)
+
+Creating a run requires permission to queue plans for the specified workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+When creating a run, you may optionally provide a list of variable objects containing key and value attributes. These values apply to that run specifically and take precedence over variables with the same key applied to the workspace(e.g., variable sets). Refer to [Variable Precedence](/terraform/enterprise/workspaces/variables#precedence) for more information. All values must be expressed as an HCL literal in the same syntax you would use when writing Terraform code. Refer to [Types](/terraform/language/expressions/types#types) in the Terraform documentation for more details.
+
+Setting `debugging_mode: true` enables debugging mode for the queued run only. This is equivalent to setting the `TF_LOG` environment variable to `TRACE` for this run. See [Debugging Terraform](/terraform/internals/debugging) for more information.
+
+**Sample Run Variables:**
+
+```json
+"attributes": {
+ "variables": [
+ { "key": "replicas", "value": "2" },
+ { "key": "access_key", "value": "\"ABCDE12345\"" }
+ ]
+}
+```
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+-> **Note:** This endpoint cannot be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------------------------------------------------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.attributes.allow-empty-apply` | bool | none | Specifies whether Terraform can apply the run even when the plan [contains no changes](/terraform/enterprise/run/modes-and-options#allow-empty-apply). Use this property to [upgrade state](/terraform/enterprise/workspaces/state#upgrading-state) after upgrading a workspace to a new terraform version. |
+| `data.attributes.allow-config-generation` | bool | `false` | Specifies whether Terraform can [generate resource configuration](/terraform/language/import/generating-configuration) when planning to import new resources. When set to `false`, Terraform returns an error when `import` blocks do not have a corresponding `resource` block. |
+| `data.attributes.auto-apply` | bool | Defaults to the [Auto Apply](/terraform/enterprise/workspaces/settings#auto-apply-and-manual-apply) workspace setting. | Determines if Terraform automatically applies the configuration on a successful `terraform plan`. |
+| `data.attributes.debugging-mode` | bool | `false` | When set to `true`, enables verbose logging for the queued plan. |
+| `data.attributes.is-destroy` | bool | `false` | When set to `true`, the plan destroys all provisioned resources. Mutually exclusive with `refresh-only`. |
+| `data.attributes.message` | string | `"Queued manually via the Terraform Enterprise API"` | Specifies the message associated with this run. |
+| `data.attributes.refresh` | bool | `true` | Specifies whether or not to refresh the state before a plan. |
+| `data.attributes.refresh-only` | bool | `false` | When set to `true`, this run refreshes the state without modifying any resources. Mutually exclusive with `is-destroy`. |
+| `data.attributes.replace-addrs` | array\[string] | | Specifies an optional list of resource addresses to be passed to the `-replace` flag. |
+| `data.attributes.target-addrs` | array\[string] | | Specifies an optional list of resource addresses to be passed to the `-target` flag. |
+| `data.attributes.variables` | array\[{key, value}] | (empty array) | Specifies an optional list of run-specific variable values. Refer to [Run-Specific Variables](/terraform/enterprise/workspaces/variables/managing-variables#run-specific-variables) for details. |
+| `data.attributes.plan-only` | bool | (from configuration version) | Specifies if this is a [speculative, plan-only](/terraform/enterprise/run/modes-and-options#plan-only-speculative-plan) run that Terraform cannot apply. Often used in conjunction with terraform-version in order to test whether an upgrade would succeed. |
+| `data.attributes.save-plan` | bool | `false` | When set to `true`, the run is executed as a `save plan` run. A `save plan` run plans and checks the configuration without becoming the workspace's current run. These run types only becomes the current run if you confirm that you want to apply them when prompted. When creating new [configuration versions](/terraform/enterprise/api-docs/configuration-versions) for saved plan runs, be sure to make them `provisional`. |
+| `data.attributes.terraform-version` | string | none | Specifies the Terraform version to use in this run. Only valid for plan-only runs; must be a valid Terraform version available to the organization. |
+| `data.relationships.workspace.data.id` | string | none | Specifies the workspace ID to execute the run in. |
+| `data.relationships.configuration-version.data.id` | string | none | Specifies the configuration version to use for this run. If the `configuration-version` object is omitted, Terraform uses the workspace's latest configuration version to create the run . |
+
+| Status | Response | Reason |
+| ------- | -------------------------------------- | --------------------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "runs"`) | Successfully created a run |
+| [404][] | [JSON API error object][] | Organization or workspace not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "message": "Custom message"
+ },
+ "type":"runs",
+ "relationships": {
+ "workspace": {
+ "data": {
+ "type": "workspaces",
+ "id": "ws-LLGHCr4SWy28wyGN"
+ }
+ },
+ "configuration-version": {
+ "data": {
+ "type": "configuration-versions",
+ "id": "cv-n4XQPBa2QnecZJ4G"
+ }
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/runs
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "run-CZcmD7eagjhyX0vN",
+ "type": "runs",
+ "attributes": {
+ "actions": {
+ "is-cancelable": true,
+ "is-confirmable": false,
+ "is-discardable": false,
+ "is-force-cancelable": false
+ },
+ "canceled-at": null,
+ "created-at": "2021-05-24T07:38:04.171Z",
+ "has-changes": false,
+ "auto-apply": false,
+ "allow-empty-apply": false,
+ "allow-config-generation": false,
+ "is-destroy": false,
+ "message": "Custom message",
+ "plan-only": false,
+ "source": "tfe-api",
+ "status-timestamps": {
+ "plan-queueable-at": "2021-05-24T07:38:04+00:00"
+ },
+ "status": "pending",
+ "trigger-reason": "manual",
+ "target-addrs": null,
+ "permissions": {
+ "can-apply": true,
+ "can-cancel": true,
+ "can-comment": true,
+ "can-discard": true,
+ "can-force-execute": true,
+ "can-force-cancel": true,
+ "can-override-policy-check": true
+ },
+ "refresh": false,
+ "refresh-only": false,
+ "replace-addrs": null,
+ "save-plan": false,
+ "variables": []
+ },
+ "relationships": {
+ "apply": {...},
+ "comments": {...},
+ "configuration-version": {...},
+ "cost-estimate": {...},
+ "created-by": {...},
+ "input-state-version": {...},
+ "plan": {...},
+ "run-events": {...},
+ "policy-checks": {...},
+ "workspace": {...},
+ "workspace-run-alerts": {...}
+ },
+ "links": {
+ "self": "/api/v2/runs/run-CZcmD7eagjhyX0vN"
+ }
+ }
+}
+```
+
+## Apply a Run
+
+`POST /runs/:run_id/actions/apply`
+
+| Parameter | Description |
+| --------- | ------------------- |
+| `run_id` | The run ID to apply |
+
+Applies a run that is paused waiting for confirmation after a plan. This includes runs in the "needs confirmation" and "policy checked" states. This action is only required for runs that can't be auto-applied. Plans can be auto-applied if the auto-apply setting is enabled on the workspace and the plan was queued by a new VCS commit or by a user with permission to apply runs for the workspace.
+
+-> **Note:** If the run has a soft failed sentinel policy, you will need to [override the policy check](/terraform/enterprise/api-docs/policy-checks#override-policy) before Terraform can apply the run. You can find policy check details in the `relationships` section of the [run details endpoint](#get-run-details) response.
+
+Applying a run requires permission to apply runs for the workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+This endpoint queues the request to perform an apply; the apply might not happen immediately.
+
+Since this endpoint represents an action (not a resource), it does not return any object in the response body.
+
+-> **Note:** This endpoint cannot be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | ------------------------------------------------------- |
+| [202][] | none | Successfully queued an apply request. |
+| [409][] | [JSON API error object][] | Run was not paused for confirmation; apply not allowed. |
+
+### Request Body
+
+This POST endpoint allows an optional JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| --------- | ------ | ------- | ---------------------------------- |
+| `comment` | string | `null` | An optional comment about the run. |
+
+### Sample Payload
+
+This payload is optional, so the `curl` command will work without the `--data @payload.json` option too.
+
+```json
+{
+ "comment":"Looks good to me"
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/runs/run-DQGdmrWMX8z9yWQB/actions/apply
+```
+
+## List Runs in a Workspace
+
+`GET /workspaces/:workspace_id/runs`
+
+| Parameter | Description |
+| -------------- | ---------------------------------- |
+| `workspace_id` | The workspace ID to list runs for. |
+
+By default, `plan_only` runs will be excluded from the results. To see all runs, use `filter[operation]` with all available operations included as a comma-separated list.
+This endpoint has an adjusted rate limit of 30 requests per minute. Note that most endpoints are limited to 30 requests per second.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------ | ------------------------ |
+| [200][] | Array of [JSON API document][]s (`type: "runs"`) | Successfully listed runs |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters); remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description | Required |
+| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
+| `page[number]` | If omitted, the endpoint returns the first page. | Optional |
+| `page[size]` | If omitted, the endpoint returns 20 runs per page. | Optional |
+| `filter[operation]` | A comma-separated list of run operations. The result lists runs that perform one of these operations. For details on options, refer to [Run operations](/terraform/enterprise/api-docs/run#run-operations). | Optional |
+| `filter[status]` | A comma-separated list of run statuses. The result lists runs that are in one of the statuses you specify. For details on options, refer to [Run states](/terraform/enterprise/api-docs/run#run-states). | Optional |
+| `filter[agent_pool_names]` | A comma-separated list of agent pool names. The result lists runs that use one of the agent pools you specify. | Optional |
+| `filter[source]` | A comma-separated list of run sources. The result lists runs that came from one of the sources you specify. Options are listed in [Run Sources](/terraform/enterprise/api-docs/run#run-sources). | Optional |
+| `filter[status_group]` | A single status group. The result lists runs whose status falls under this status group. For details on options, refer to [Run status groups](/terraform/enterprise/api-docs/run#run-status-groups). | Optional |
+| `filter[timeframe]` | A single year period. The result lists runs that were created within the year you specify. An integer year or the string "year" for the past year are valid values. If omitted, the endpoint returns all runs since the creation of the workspace. | Optional |
+| `search[user]` | Searches for runs that match the VCS username you supply. | Optional |
+| `search[commit]` | Searches for runs that match the commit sha you specify. | Optional |
+| `search[basic]` | Searches for runs that match the VCS username, commit sha, run_id, or run message your specify. HCP Terraform prioritizes `search[commit]` or `search[user]` and ignores `search[basic]` in favor of the higher priority parameters if you include them in your query. | Optional |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/workspaces/ws-yF7z4gyEQRhaCNG9/runs
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "run-CZcmD7eagjhyX0vN",
+ "type": "runs",
+ "attributes": {
+ "actions": {
+ "is-cancelable": true,
+ "is-confirmable": false,
+ "is-discardable": false,
+ "is-force-cancelable": false
+ },
+ "canceled-at": null,
+ "created-at": "2021-05-24T07:38:04.171Z",
+ "has-changes": false,
+ "auto-apply": false,
+ "allow-empty-apply": false,
+ "allow-config-generation": false,
+ "is-destroy": false,
+ "message": "Custom message",
+ "plan-only": false,
+ "source": "tfe-api",
+ "status-timestamps": {
+ "plan-queueable-at": "2021-05-24T07:38:04+00:00"
+ },
+ "status": "pending",
+ "trigger-reason": "manual",
+ "target-addrs": null,
+ "permissions": {
+ "can-apply": true,
+ "can-cancel": true,
+ "can-comment": true,
+ "can-discard": true,
+ "can-force-execute": true,
+ "can-force-cancel": true,
+ "can-override-policy-check": true
+ },
+ "refresh": false,
+ "refresh-only": false,
+ "replace-addrs": null,
+ "save-plan": false,
+ "variables": []
+ },
+ "relationships": {
+ "apply": {...},
+ "comments": {...},
+ "configuration-version": {...},
+ "cost-estimate": {...},
+ "created-by": {...},
+ "input-state-version": {...},
+ "plan": {...},
+ "run-events": {...},
+ "policy-checks": {...},
+ "workspace": {...},
+ "workspace-run-alerts": {...}
+ },
+ "links": {
+ "self": "/api/v2/runs/run-bWSq4YeYpfrW4mx7"
+ }
+ },
+ {...}
+ ],
+ "links": {
+ "first": "https://app.terraform.io/api/v2/workspaces/ws-yF7z4gyEQRhaCNG9/runs?page[number]=1&page[size]=20",
+ "last": "https://app.terraform.io/api/v2/workspaces/ws-yF7z4gyEQRhaCNG9/runs?page[number]=19206&page[size]=20",
+ "self": "https://app.terraform.io/api/v2/workspaces/ws-yF7z4gyEQRhaCNG9/runs?page[number]=2&page[size]=20",
+ "prev": "https://app.terraform.io/api/v2/workspaces/ws-yF7z4gyEQRhaCNG9/runs?page[number]=1&page[size]=20",
+ "next": "https://app.terraform.io/api/v2/workspaces/ws-yF7z4gyEQRhaCNG9/runs?page[number]=3&page[size]=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 2,
+ "next-page": 3,
+ "prev-page": 1,
+ "page-size": 20,
+ "total-count": 384105,
+ "total-pages": 19206
+ }
+ }
+}
+```
+
+## List Runs in an Organization
+
+`GET /organizations/:organization_name/runs`
+
+| Parameter | Description |
+| ------------------- | --------------------------------------- |
+| `organization_name` | The organization name to list runs for. |
+
+This endpoint has an adjusted rate limit of 30 requests per minute. Note that most endpoints are limited to 30 requests per second.
+
+Note that this endpoint differs from others in the pagination metadata included in the response, such as the exclusion of the typical `total-count` and `total-pages`. See the Sample Response below for more details.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------ | ------------------------ |
+| [200][] | Array of [JSON API document][]s (`type: "runs"`) | Successfully listed runs |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters); remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description | Required |
+| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
+| `page[number]` | If omitted, the endpoint returns the first page. | Optional |
+| `page[size]` | If omitted, the endpoint returns 20 runs per page. | Optional |
+| `filter[operation]` | A comma-separated list of run operations. The result lists runs that perform one of these operations. For details on options, refer to [Run operations](/terraform/enterprise/api-docs/run#run-operations). | Optional |
+| `filter[status]` | A comma-separated list of run statuses. The result lists runs that are in one of the statuses you specify. For details on options, refer to [Run states](/terraform/enterprise/api-docs/run#run-states). | Optional |
+| `filter[agent_pool_names]` | A comma-separated list of agent pool names. The result lists runs that use one of the agent pools you specify. | Optional |
+| `filter[workspace_names]` | A comma-separated list of workspace names. The result lists runs that belong to one of the workspaces your specify. | Optional |
+| `filter[source]` | A comma-separated list of run sources. The result lists runs that came from one of the sources you specify. Options are listed in [Run Sources](/terraform/enterprise/api-docs/run#run-sources). | Optional |
+| `filter[status_group]` | A single status group. The result lists runs whose status falls under this status group. For details on options, refer to [Run status groups](/terraform/enterprise/api-docs/run#run-status-groups). | Optional |
+| `filter[timeframe]` | A single year period. The result lists runs that were created within the year you specify. An integer year or the string "year" for the past year are valid values. If omitted, the endpoint returns runs created in the last year. | Optional |
+| `search[user]` | Searches for runs that match the VCS username you supply. | Optional |
+| `search[commit]` | Searches for runs that match the commit sha you specify. | Optional |
+| `search[basic]` | Searches for runs that match the VCS username, commit sha, run_id, or run message your specify. HCP Terraform prioritizes `search[commit]` or `search[user]` and ignores `search[basic]` in favor of the higher priority parameters if you include them in your query. | Optional |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/hashicorp/runs
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "run-CZcmD7eagjhyX0vN",
+ "type": "runs",
+ "attributes": {
+ "actions": {
+ "is-cancelable": true,
+ "is-confirmable": false,
+ "is-discardable": false,
+ "is-force-cancelable": false
+ },
+ "canceled-at": null,
+ "created-at": "2021-05-24T07:38:04.171Z",
+ "has-changes": false,
+ "auto-apply": false,
+ "allow-empty-apply": false,
+ "allow-config-generation": false,
+ "is-destroy": false,
+ "message": "Custom message",
+ "plan-only": false,
+ "source": "tfe-api",
+ "status-timestamps": {
+ "plan-queueable-at": "2021-05-24T07:38:04+00:00"
+ },
+ "status": "pending",
+ "trigger-reason": "manual",
+ "target-addrs": null,
+ "permissions": {
+ "can-apply": true,
+ "can-cancel": true,
+ "can-comment": true,
+ "can-discard": true,
+ "can-force-execute": true,
+ "can-force-cancel": true,
+ "can-override-policy-check": true
+ },
+ "refresh": false,
+ "refresh-only": false,
+ "replace-addrs": null,
+ "save-plan": false,
+ "variables": []
+ },
+ "relationships": {
+ "apply": {...},
+ "comments": {...},
+ "configuration-version": {...},
+ "cost-estimate": {...},
+ "created-by": {...},
+ "input-state-version": {...},
+ "plan": {...},
+ "run-events": {...},
+ "policy-checks": {...},
+ "workspace": {...},
+ "workspace-run-alerts": {...}
+ },
+ "links": {
+ "self": "/api/v2/runs/run-bWSq4YeYpfrW4mx7"
+ }
+ },
+ {...}
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/organizations/hashicorp/runs?page[number]=2&page[size]=20",
+ "prev": "https://app.terraform.io/api/v2/organizations/hashicorp/runs?page[number]=1&page[size]=20",
+ "next": "https://app.terraform.io/api/v2/organizations/hashicorp/runs?page[number]=3&page[size]=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "next-page": 2,
+ "prev-page": null,
+ "page-size": 20
+ }
+ }
+}
+```
+
+## Get run details
+
+`GET /runs/:run_id`
+
+| Parameter | Description |
+| --------- | ------------------ |
+| `:run_id` | The run ID to get. |
+
+This endpoint is used for showing details of a specific run.
+
+| Status | Response | Reason |
+| ------- | -------------------------------------- | ------------------------------------ |
+| [200][] | [JSON API document][] (`type: "runs"`) | Success |
+| [404][] | [JSON API error object][] | Run not found or user not authorized |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/v2/runs/run-bWSq4YeYpfrW4mx7
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "run-CZcmD7eagjhyX0vN",
+ "type": "runs",
+ "attributes": {
+ "actions": {
+ "is-cancelable": true,
+ "is-confirmable": false,
+ "is-discardable": false,
+ "is-force-cancelable": false
+ },
+ "canceled-at": null,
+ "created-at": "2021-05-24T07:38:04.171Z",
+ "has-changes": false,
+ "auto-apply": false,
+ "allow-empty-apply": false,
+ "allow-config-generation": false,
+ "is-destroy": false,
+ "message": "Custom message",
+ "plan-only": false,
+ "source": "tfe-api",
+ "status-timestamps": {
+ "plan-queueable-at": "2021-05-24T07:38:04+00:00"
+ },
+ "status": "pending",
+ "trigger-reason": "manual",
+ "target-addrs": null,
+ "permissions": {
+ "can-apply": true,
+ "can-cancel": true,
+ "can-comment": true,
+ "can-discard": true,
+ "can-force-execute": true,
+ "can-force-cancel": true,
+ "can-override-policy-check": true
+ },
+ "refresh": false,
+ "refresh-only": false,
+ "replace-addrs": null,
+ "save-plan": false,
+ "variables": []
+ },
+ "relationships": {
+ "apply": {...},
+ "comments": {...},
+ "configuration-version": {...},
+ "cost-estimate": {...},
+ "created-by": {...},
+ "input-state-version": {...},
+ "plan": {...},
+ "run-events": {...},
+ "policy-checks": {...},
+ "task-stages": {...},
+ "workspace": {...},
+ "workspace-run-alerts": {...}
+ },
+ "links": {
+ "self": "/api/v2/runs/run-bWSq4YeYpfrW4mx7"
+ }
+ }
+}
+```
+
+## Discard a Run
+
+`POST /runs/:run_id/actions/discard`
+
+| Parameter | Description |
+| --------- | --------------------- |
+| `run_id` | The run ID to discard |
+
+The `discard` action can be used to skip any remaining work on runs that are paused waiting for confirmation or priority. This includes runs in the "pending," "needs confirmation," "policy checked," and "policy override" states.
+
+Discarding a run requires permission to apply runs for the workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+This endpoint queues the request to perform a discard; the discard might not happen immediately. After discarding, the run is completed and later runs can proceed.
+
+This endpoint represents an action as opposed to a resource. As such, it does not return any object in the response body.
+
+-> **Note:** This endpoint cannot be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------- |
+| [202][] | none | Successfully queued a discard request. |
+| [409][] | [JSON API error object][] | Run was not paused for confirmation or priority; discard not allowed. |
+
+### Request Body
+
+This POST endpoint allows an optional JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| --------- | ------ | ------- | ------------------------------------------------------ |
+| `comment` | string | `null` | An optional explanation for why the run was discarded. |
+
+### Sample Payload
+
+This payload is optional, so the `curl` command will work without the `--data @payload.json` option too.
+
+```json
+{
+ "comment": "This run was discarded"
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/runs/run-DQGdmrWMX8z9yWQB/actions/discard
+```
+
+## Cancel a Run
+
+`POST /runs/:run_id/actions/cancel`
+
+| Parameter | Description |
+| --------- | -------------------- |
+| `run_id` | The run ID to cancel |
+
+The `cancel` action can be used to interrupt a run that is currently planning or applying. Performing a cancel is roughly equivalent to hitting ctrl+c during a Terraform plan or apply on the CLI. The running Terraform process is sent an `INT` signal, which instructs Terraform to end its work and wrap up in the safest way possible.
+
+Canceling a run requires permission to apply runs for the workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+This endpoint queues the request to perform a cancel; the cancel might not happen immediately. After canceling, the run is completed and later runs can proceed.
+
+This endpoint represents an action as opposed to a resource. As such, it does not return any object in the response body.
+
+-> **Note:** This endpoint cannot be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | ----------------------------------------------------- |
+| [202][] | none | Successfully queued a cancel request. |
+| [409][] | [JSON API error object][] | Run was not planning or applying; cancel not allowed. |
+| [404][] | [JSON API error object][] | Run was not found or user not authorized. |
+
+### Request Body
+
+This POST endpoint allows an optional JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| --------- | ------ | ------- | ----------------------------------------------------- |
+| `comment` | string | `null` | An optional explanation for why the run was canceled. |
+
+### Sample Payload
+
+This payload is optional, so the `curl` command will work without the `--data @payload.json` option too.
+
+```json
+{
+ "comment": "This run was stuck and would never finish."
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/runs/run-DQGdmrWMX8z9yWQB/actions/cancel
+```
+
+## Forcefully cancel a run
+
+`POST /runs/:run_id/actions/force-cancel`
+
+| Parameter | Description |
+| --------- | -------------------- |
+| `run_id` | The run ID to cancel |
+
+The `force-cancel` action is like [cancel](#cancel-a-run), but ends the run immediately. Once invoked, the run is placed into a `canceled` state, and the running Terraform process is terminated. The workspace is immediately unlocked, allowing further runs to be queued. The `force-cancel` operation requires admin access to the workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+This endpoint enforces a prerequisite that a [non-forceful cancel](#cancel-a-run) is performed first, and a cool-off period has elapsed. To determine if this criteria is met, it is useful to check the `data.attributes.is-force-cancelable` value of the [run details endpoint](#get-run-details). The time at which the force-cancel action will become available can be found using the [run details endpoint](#get-run-details), in the key `data.attributes.force_cancel_available_at`. Note that this key is only present in the payload after the initial cancel has been initiated.
+
+This endpoint represents an action as opposed to a resource. As such, it does not return any object in the response body.
+
+-> **Note:** This endpoint cannot be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+~> **Warning:** This endpoint has potentially dangerous side-effects, including loss of any in-flight state in the running Terraform process. Use this operation with extreme caution.
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------ |
+| [202][] | none | Successfully queued a cancel request. |
+| [409][] | [JSON API error object][] | Run was not planning or applying, has not been canceled non-forcefully, or the cool-off period has not yet passed. |
+| [404][] | [JSON API error object][] | Run was not found or user not authorized. |
+
+### Request Body
+
+This POST endpoint allows an optional JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| --------- | ------ | ------- | ----------------------------------------------------- |
+| `comment` | string | `null` | An optional explanation for why the run was canceled. |
+
+### Sample Payload
+
+This payload is optional, so the `curl` command will work without the `--data @payload.json` option too.
+
+```json
+{
+ "comment": "This run was stuck and would never finish."
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/runs/run-DQGdmrWMX8z9yWQB/actions/force-cancel
+```
+
+## Forcefully execute a run
+
+`POST /runs/:run_id/actions/force-execute`
+
+| Parameter | Description |
+| --------- | --------------------- |
+| `run_id` | The run ID to execute |
+
+The force-execute action cancels all prior runs that are not already complete, unlocking the run's workspace and allowing the run to be executed. (It initiates the same actions as the "Run this plan now" button at the top of the view of a pending run.)
+
+Force-executing a run requires permission to apply runs for the workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+This endpoint enforces the following prerequisites:
+
+- The target run is in the "pending" state.
+- The workspace is locked by another run.
+- The run locking the workspace can be discarded.
+
+This endpoint represents an action as opposed to a resource. As such, it does not return any object in the response body.
+
+-> **Note:** This endpoint cannot be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+~> **Note:** While useful at times, force-executing a run circumvents the typical workflow of applying runs using HCP Terraform. It is not intended for regular use. If you find yourself using it frequently, please reach out to HashiCorp Support for help in developing an alternative approach.
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------------------------------- |
+| [202][] | none | Successfully initiated the force-execution process. |
+| [403][] | [JSON API error object][] | Run is not pending, its workspace was not locked, or its workspace association was not found. |
+| [409][] | [JSON API error object][] | The run locking the workspace was not in a discardable state. |
+| [404][] | [JSON API error object][] | Run was not found or user not authorized. |
+
+### Request Body
+
+This POST endpoint does not take a request body.
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/runs/run-DQGdmrWMX8z9yWQB/actions/force-execute
+```
+
+## Available Related Resources
+
+The GET endpoints above can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+- `plan` - Additional information about plans.
+- `apply` - Additional information about applies.
+- `created_by` - Full user records of the users responsible for creating the runs.
+- `cost_estimate` - Additional information about cost estimates.
+- `configuration_version` - The configuration record used in the run.
+- `configuration_version.ingress_attributes` - The commit information used in the run.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/ssh-keys.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/ssh-keys.mdx
new file mode 100644
index 0000000000..70f2e54828
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/ssh-keys.mdx
@@ -0,0 +1,320 @@
+---
+page_title: /ssh-keys API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/ssh-keys` endpoint to read, get, create,
+ update, and delete an organization's SSH keys.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# SSH keys API reference
+
+The `ssh-key` object represents an SSH key which includes a name and the SSH private key. An organization can have multiple SSH keys available.
+
+SSH keys can be used in two places:
+
+- You can assign them to VCS provider integrations, which are available in the API as `oauth-tokens`. Refer to [OAuth Tokens](/terraform/enterprise/api-docs/oauth-tokens) for additional information. Azure DevOps Server and Bitbucket Data Center require an SSH key. Other providers only require an SSH key when your repositories include submodules that are only accessible using an SSH connection instead of your VCS provider's API.
+- They can be [assigned to workspaces](/terraform/enterprise/api-docs/workspaces#assign-an-ssh-key-to-a-workspace) and used when Terraform needs to clone modules from a Git server. This is only necessary when your configurations directly reference modules from a Git server; you do not need to do this if you use HCP Terraform's [private module registry](/terraform/enterprise/registry).
+
+Listing and viewing SSH keys requires either permission to manage VCS settings for the organization, or admin access to at least one workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+~> **Important:** The list and read methods on this API only provide metadata about SSH keys. The actual private key text is write-only, and HCP Terraform never provides it to users via the API or UI.
+
+## List SSH Keys
+
+`GET /organizations/:organization_name/ssh-keys`
+
+| Parameter | Description |
+| -------------------- | -------------------------------------------------- |
+| `:organization_name` | The name of the organization to list SSH keys for. |
+
+-> **Note:** This endpoint cannot be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+| Status | Response | Reason |
+| ------- | ---------------------------------------------------- | --------------------------------------------- |
+| [200][] | Array of [JSON API document][]s (`type: "ssh-keys"`) | Success |
+| [404][] | [JSON API error object][] | Organization not found or user not authorized |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs. If neither pagination query parameters are provided, the endpoint will not be paginated and will return all results.
+
+| Parameter | Description |
+| -------------- | ------------------------------------------------------------------------ |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 ssh keys per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/v2/organizations/my-organization/ssh-keys
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "attributes": {
+ "name": "SSH Key"
+ },
+ "id": "sshkey-GxrePWre1Ezug7aM",
+ "links": {
+ "self": "/api/v2/ssh-keys/sshkey-GxrePWre1Ezug7aM"
+ },
+ "type": "ssh-keys"
+ }
+ ]
+}
+```
+
+## Get an SSH Key
+
+`GET /ssh-keys/:ssh_key_id`
+
+| Parameter | Description |
+| ------------- | ---------------------- |
+| `:ssh_key_id` | The SSH key ID to get. |
+
+This endpoint is for looking up the name associated with an SSH key ID. It does not retrieve the key text.
+
+-> **Note:** This endpoint cannot be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------ | ---------------------------------------- |
+| [200][] | [JSON API document][] (`type: "ssh-keys"`) | Success |
+| [404][] | [JSON API error object][] | SSH key not found or user not authorized |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/v2/ssh-keys/sshkey-GxrePWre1Ezug7aM
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name": "SSH Key"
+ },
+ "id": "sshkey-GxrePWre1Ezug7aM",
+ "links": {
+ "self": "/api/v2/ssh-keys/sshkey-GxrePWre1Ezug7aM"
+ },
+ "type": "ssh-keys"
+ }
+}
+```
+
+## Create an SSH Key
+
+`POST /organizations/:organization_name/ssh-keys`
+
+| Parameter | Description |
+| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to create an SSH key in. The organization must already exist, and the token authenticating the API request must have permission to manage VCS settings. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions)) |
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+-> **Note:** This endpoint cannot be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------ | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "ssh-keys"`) | Success |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [404][] | [JSON API error object][] | User not authorized |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------- | ------ | ------- | -------------------------------- |
+| `data.type` | string | | Must be `"ssh-keys"`. |
+| `data.attributes.name` | string | | A name to identify the SSH key. |
+| `data.attributes.value` | string | | The text of the SSH private key. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "ssh-keys",
+ "attributes": {
+ "name": "SSH Key",
+ "value": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAm6+JVgl..."
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/ssh-keys
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name": "SSH Key"
+ },
+ "id": "sshkey-GxrePWre1Ezug7aM",
+ "links": {
+ "self": "/api/v2/ssh-keys/sshkey-GxrePWre1Ezug7aM"
+ },
+ "type": "ssh-keys"
+ }
+}
+```
+
+## Update an SSH Key
+
+`PATCH /ssh-keys/:ssh_key_id`
+
+| Parameter | Description |
+| ------------- | ------------------------- |
+| `:ssh_key_id` | The SSH key ID to update. |
+
+This endpoint replaces the name of an existing SSH key.
+
+Editing SSH keys requires permission to manage VCS settings. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+-> **Note:** This endpoint cannot be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------ | ---------------------------------------- |
+| [200][] | [JSON API document][] (`type: "ssh-keys"`) | Success |
+| [404][] | [JSON API error object][] | SSH key not found or user not authorized |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ---------------------- | ------ | --------- | --------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"ssh-keys"`. |
+| `data.attributes.name` | string | (nothing) | A name to identify the SSH key. If omitted, the existing name is preserved. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name": "SSH Key for GitHub"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/ssh-keys/sshkey-GxrePWre1Ezug7aM
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name": "SSH Key for GitHub"
+ },
+ "id": "sshkey-GxrePWre1Ezug7aM",
+ "links": {
+ "self": "/api/v2/ssh-keys/sshkey-GxrePWre1Ezug7aM"
+ },
+ "type": "ssh-keys"
+ }
+}
+```
+
+## Delete an SSH Key
+
+`DELETE /ssh-keys/:ssh_key_id`
+
+| Parameter | Description |
+| ------------- | ------------------------- |
+| `:ssh_key_id` | The SSH key ID to delete. |
+
+Deleting SSH keys requires permission to manage VCS settings. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+-> **Note:** This endpoint cannot be accessed with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ---------------------------------------- |
+| [204][] | No Content | Success |
+| [404][] | [JSON API error object][] | SSH key not found or user not authorized |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/ssh-keys/sshkey-GxrePWre1Ezug7aM
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/stability-policy.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/stability-policy.mdx
new file mode 100644
index 0000000000..1b59e2d1f2
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/stability-policy.mdx
@@ -0,0 +1,25 @@
+---
+page_title: API stability policy for Terraform Enterprise
+description: >-
+ Learn how HashiCorp plans for stability, backward compatibility, and
+ deprecation for the Terraform Enterprise APIs.
+source: terraform-docs-common
+---
+
+# API stability policy
+
+The HCP Terraform API will continue to evolve, but we consider it stable for general use, and HashiCorp will maintain all stable API endpoints in a backwards compatible manner. (Stable endpoints are any endpoints _not_ marked as beta.) If we need to make a change that we consider backwards incompatible, then we will create a new endpoint that serves the same purpose; the old endpoint will be maintained until declared [deprecated](#deprecation-policy).
+
+The following changes are considered to be backwards compatible:
+
+- Adding new API endpoints.
+- Adding new attributes, links, or relationships to existing API requests and responses.
+- Adding new optional query parameters to existing API requests.
+
+Security vulnerabilities are an exception to this stability policy; we will make backwards incompatible changes to stable endpoints if it is necessary to protect our security or the security of our users.
+
+Endpoints that are in beta are subject to change without notice.
+
+## Deprecation Policy
+
+The deprecation policy provides users the opportunity to continue to consume API endpoints for a period of time after they have been superseded. Deprecation notices for endpoints should be readily available through various channels of communication, including documentation and HTTP responses. An endpoint should be available for at least three (3) months from the date on which it has been declared deprecated. (This time is cited as a minimum; endpoint availability may be longer based on contracted agreements.)
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/state-version-outputs.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/state-version-outputs.mdx
new file mode 100644
index 0000000000..cb5ef168b0
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/state-version-outputs.mdx
@@ -0,0 +1,244 @@
+---
+page_title: /state-version-outputs API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/state-version-outputs` endpoint to read
+ the outputs from a specified Terraform state version or a workspace's current
+ outputs.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# State version outputs API reference
+
+State version outputs are the [output values](/terraform/language/values/outputs) from a Terraform state file. They include
+the name and value of the output, as well as a sensitive boolean if the value should be hidden by default in UIs.
+
+~> **Important:** The state version outputs for a state version (as well as some other information about it) might be **populated asynchronously** by HCP Terraform. These values might not be immediately available after the state version is uploaded. The `resources-processed` property on the associated [state version object](/terraform/enterprise/api-docs/state-versions) indicates whether or not HCP Terraform has finished any necessary asynchronous processing. If you need to use these values, be sure to wait for `resources-processed` to become `true` before assuming that the values are in fact empty.
+
+## List State Version Outputs
+
+`GET /state-versions/:state_version_id/outputs`
+
+Listing state version outputs requires permission to read state outputs for the workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+| Parameter | Description |
+| ------------------- | ------------------------------------ |
+| `:state_version_id` | The ID of the desired state version. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------------------- |
+| [200][] | [JSON API document][] | Successfully returned a list of outputs for the given state version. |
+| [404][] | [JSON API error object][] | State version not found, or user unauthorized to perform action. |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | ------------------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 state version outputs per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/state-versions/sv-SDboVZC8TCxXEneJ/outputs
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "wsout-xFAmCR3VkBGepcee",
+ "type": "state-version-outputs",
+ "attributes": {
+ "name": "fruits",
+ "sensitive": false,
+ "type": "array",
+ "value": [
+ "apple",
+ "strawberry",
+ "blueberry",
+ "rasberry"
+ ],
+ "detailed_type": [
+ "tuple",
+ [
+ "string",
+ "string",
+ "string",
+ "string"
+ ]
+ ]
+ },
+ "links": {
+ "self": "/api/v2/state-version-outputs/wsout-xFAmCR3VkBGepcee"
+ }
+ },
+ {
+ "id": "wsout-vspuB754AUNkfxwo",
+ "type": "state-version-outputs",
+ "attributes": {
+ "name": "vegetables",
+ "sensitive": false,
+ "type": "array",
+ "value": [
+ "carrots",
+ "potato",
+ "tomato",
+ "onions"
+ ],
+ "detailed_type": [
+ "tuple",
+ [
+ "string",
+ "string",
+ "string",
+ "string"
+ ]
+ ]
+ },
+ "links": {
+ "self": "/api/v2/state-version-outputs/wsout-vspuB754AUNkfxwo"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/state-versions/sv-SVB5wMrDL1XUgJ4G/outputs?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/state-versions/sv-SVB5wMrDL1XUgJ4G/outputs?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/state-versions/sv-SVB5wMrDL1XUgJ4G/outputs?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "page-size": 20,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 2
+ }
+ }
+}
+```
+
+## Show a State Version Output
+
+`GET /state-version-outputs/:state_version_output_id`
+
+| Parameter | Description |
+| -------------------------- | ------------------------------------------- |
+| `:state_version_output_id` | The ID of the desired state version output. |
+
+State version output IDs must be obtained from a [state version object](/terraform/enterprise/api-docs/state-versions). When requesting a state version, you can optionally add `?include=outputs` to include full details for all of that state version's outputs.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------- | ------------------------------------------------------ |
+| [200][] | [JSON API document][] (`type: "state-version-outputs"`) | Success. |
+| [404][] | [JSON API error object][] | State version output not found or user not authorized. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ https://app.terraform.io/api/v2/state-version-outputs/wsout-J2zM24JPFbfc7bE5
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "wsout-J2zM24JPFbfc7bE5",
+ "type": "state-version-outputs",
+ "attributes": {
+ "name": "flavor",
+ "sensitive": false,
+ "type": "string",
+ "value": "Peanut Butter",
+ "detailed-type": "string"
+ },
+ "links": {
+ "self": "/api/v2/state-version-outputs/wsout-J2zM24JPFbfc7bE5"
+ }
+ }
+}
+```
+
+## Show Current State Version Outputs for a Workspace
+
+This endpoint allows organization users, who do not have permissions to read state versions, to fetch the latest [output values](/terraform/language/values/outputs) for a workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+-> **Note:** Sensitive values are not revealed and will be returned as `null`. To fetch an output including sensitive values see [Show a State Version Output](/terraform/enterprise/api-docs/state-version-outputs#show-a-state-version-output).
+
+`GET /workspaces/:workspace_id/current-state-version-outputs`
+
+| Parameter | Description |
+| --------------- | --------------------------------------------- |
+| `:workspace_id` | The ID of the workspace to read outputs from. |
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------- | ------------------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "state-version-outputs"`) | Successfully returned a list of outputs for the given workspace. |
+| [404][] | [JSON API error object][] | State version outputs not found or user not authorized. |
+| [503][] | [JSON API error object][] | State version outputs are being processed and are not ready. Retry the request. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/workspaces/ws-G4zM299PFbfc10E5/current-state-version-outputs
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "wsout-J2zM24JPFbfc7bE5",
+ "type": "state-version-outputs",
+ "attributes": {
+ "name": "flavor",
+ "sensitive": false,
+ "type": "string",
+ "value": "Peanut Butter",
+ "detailed-type": "string"
+ },
+ "links": {
+ "self": "/api/v2/state-version-outputs/wsout-J2zM24JPFbfc7bE5"
+ }
+ },
+ {
+ "id": "wsout-FLzM23Gcd5f37bE5",
+ "type": "state-version-outputs",
+ "attributes": {
+ "name": "recipe",
+ "sensitive": true,
+ "type": "string",
+ "value": "Don Douglas' Peanut Butter Frenzy",
+ "detailed-type": "string"
+ },
+ "links": {
+ "self": "/api/v2/state-version-outputs/wsout-FLzM23Gcd5f37bE5"
+ }
+ }
+ ]
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/state-versions.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/state-versions.mdx
new file mode 100644
index 0000000000..9e8873612d
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/state-versions.mdx
@@ -0,0 +1,1241 @@
+---
+page_title: /state-versions API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/state-versions` endpoint to read, create,
+ upload, fetch, rollback, delete, and mark state versions for garbage
+ collection.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# State versions API reference
+
+## Attributes
+
+State version API objects represent an instance of Terraform state data, but do not directly contain the stored state. Instead, they contain information about the state, its properties, and its contents, and include one or more URLs from which the state can be downloaded.
+
+Some of the information returned in a state version API object might be **populated asynchronously** by HCP Terraform. This includes resources, modules, providers, and the [state version outputs](/terraform/enterprise/api-docs/state-version-outputs) associated with the state version. These values might not be immediately available after the state version is uploaded. The `resources-processed` property on the state version object indicates whether or not HCP Terraform has finished any necessary asynchronous processing. If you need to use these values, be sure to wait for `resources-processed` to become `true` before assuming that the values are in fact empty.
+
+| Attribute | Description |
+| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `billable-rum-count` | Count of billable Resources Under Management (RUM). Only present for organization members on HCP Terraform RUM plans with visibility of billable RUM usage. |
+| `hosted-json-state-download-url` | A URL from which you can download the state data in a [stable format](/terraform/internals/json-format) appropriate for external integrations to consume. Only available if the state was created by Terraform 1.3+. |
+| `hosted-state-download-url` | A URL from which you can download the raw state data, in the format used internally by Terraform. |
+| `hosted-json-state-upload-url` | A URL to which you can upload state data in a [stable format](/terraform/internals/json-format) appropriate for external integrations to consume. You can upload JSON state content once per state version. |
+| `hosted-state-upload-url` | A URL to which you can upload state data in the format used Terraform uses internally. You can upload state data once per state version. |
+| `modules` | Extracted information about the Terraform modules in this state data. Populated asynchronously. |
+| `providers` | Extracted information about the Terraform providers used for resources in this state data. Populated asynchronously. |
+| `intermediate` | A boolean flag that indicates the state version is a snapshot and not yet set as the current state version for a workspace. The last intermediate state version becomes the current state version when the workspace is unlocked. Not yet supported in Terraform Enterprise. |
+| `resources` | Extracted information about the resources in this state data. Populated asynchronously. |
+| `resources-processed` | A Boolean flag indicating whether HCP Terraform has finished asynchronously extracting outputs, resources, and other information about this state data. |
+| `serial` | The serial number of this state instance, which increases every time Terraform creates new state in the workspace. |
+| `state-version` | The version of the internal state format used for this state. Different Terraform versions read and write different format versions, but it only changes infrequently. |
+| `status` | Indicates a state version's content upload [status](/terraform/enterprise/api-docs/state-versions#state-version-status). This status can be `pending`, `finalized` or `discarded`. |
+| `terraform-version` | The Terraform version that created this state. Populated asynchronously. |
+| `vcs-commit-sha` | The SHA of the configuration commit used in the Terraform run that produced this state. Only present if the workspace is connected to a VCS repository. |
+| `vcs-commit-url` | A link to the configuration commit used in the Terraform run that produced this state. Only present if the workspace is connected to a VCS repository. |
+
+### State Version Status
+
+The state version status is found in `data.attributes.status`, and you can reference the following list of possible statuses.
+A state version created through the API or CLI will only be listed in the UI if it is has a `finalized` status.
+
+| State | Description |
+| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `pending` | Indicates that a state version has been created but the state data is not encoded within the request. Pending state versions do not contain state data and do not appear in the UI. You cannot unlock the workspace until the latest state version is finalized. |
+| `finalized` | Indicates that the state version has been successfully uploaded to HCP Terraform or that the state version was created with a valid `state` attribute. |
+| `discarded` | The state version was discarded because it was superseded by a newer state version before it could be uploaded. |
+| `backing_data_soft_deleted` | The backing files associated with this state version are marked for garbage collection. Terraform permanently deletes backing files associated with this state version after a set number of days, but you can restore the backing data associated with it before it is permanently deleted. |
+| `backing_data_permanently_deleted` | The backing files associated with this state version have been permanently deleted and can no longer be restored. |
+
+## Create a State Version
+
+> **Hands-on:** Try the [Version Remote State with the HCP Terraform API](/terraform/tutorials/cloud/cloud-state-api) tutorial to download a remote state file and use the Terraform API to create a new state version.
+
+`POST /workspaces/:workspace_id/state-versions`
+
+| Parameter | Description |
+| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The workspace ID to create the new state version in. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](/terraform/enterprise/api-docs/workspaces#show-workspace) endpoint. |
+
+Creates a state version and sets it as the current state version for the given workspace. The workspace must be locked by the user creating a state version. The workspace may be locked [with the API](/terraform/enterprise/api-docs/workspaces#lock-a-workspace) or [with the UI](/terraform/enterprise/workspaces/settings#locking). This is most useful for migrating existing state from Terraform Community edition into a new HCP Terraform workspace.
+
+Creating state versions requires permission to read and write state versions for the workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+!> **Warning:** Use caution when uploading state to workspaces that have already performed Terraform runs. Replacing state improperly can result in orphaned or duplicated infrastructure resources.
+
+-> **Note:** For Free Tier organizations, HCP Terraform always retains at least the last 100 states (across all workspaces) and at least the most recent state for every workspace. Additional states beyond the last 100 are retained for six months, and are then deleted.
+
+-> **Note:** You cannot access this endpoint with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ----------------------------------------------------------------- |
+| [201][] | [JSON API document][] | Successfully created a state version. |
+| [404][] | [JSON API error object][] | Workspace not found, or user unauthorized to perform action. |
+| [409][] | [JSON API error object][] | Conflict; check the error object for more information. |
+| [412][] | [JSON API error object][] | Precondition failed; check the error object for more information. |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.). |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------------ | ------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"state-versions"`. |
+| `data.attributes.serial` | integer | | The serial of the state version. Must match the serial value extracted from the raw state file. |
+| `data.attributes.md5` | string | | An MD5 hash of the raw state version. |
+| `data.attributes.state` | string | (nothing) | **Optional** Base64 encoded raw state file. If omitted, you must use the upload method below to complete the state version creation. The workspace may not be unlocked normally until the state version is uploaded. |
+| `data.attributes.lineage` | string | (nothing) | **Optional** Lineage of the state version. Should match the lineage extracted from the raw state file. Early versions of terraform did not have the concept of lineage, so this is an optional attribute. |
+| `data.attributes.json-state` | string | (nothing) | **Optional** Base64 encoded json state, as expressed by `terraform show -json`. See [JSON Output Format](/terraform/internals/json-format) for more details. |
+| `data.attributes.json-state-outputs` | string | (nothing) | **Optional** Base64 encoded output values as represented by `terraform show -json` (the contents of the values/outputs key). If provided, the workspace outputs populate immediately. If omitted, HCP Terraform populates the workspace outputs from the given state after a short time. |
+| `data.relationships.run.data.id` | string | (nothing) | **Optional** The ID of the run to associate with the state version. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type":"state-versions",
+ "attributes": {
+ "serial": 1,
+ "md5": "d41d8cd98f00b204e9800998ecf8427e",
+ "lineage": "871d1b4a-e579-fb7c-ffdb-f0c858a647a7",
+ "state": "...",
+ "json-state": "...",
+ "json-state-outputs": "..."
+ },
+ "relationships": {
+ "run": {
+ "data": {
+ "type": "runs",
+ "id": "run-bWSq4YeYpfrW4mx7"
+ }
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-6fHMCom98SDXSQUv/state-versions
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "sv-DmoXecHePnNznaA4",
+ "type": "state-versions",
+ "attributes": {
+ "vcs-commit-sha": null,
+ "vcs-commit-url": null,
+ "created-at": "2018-07-12T20:32:01.490Z",
+ "hosted-state-download-url": "https://archivist.terraform.io/v1/object/f55b739b-ff03-4716-b436-726466b96dc4",
+ "hosted-json-state-download-url": "https://archivist.terraform.io/v1/object/4fde7951-93c0-4414-9a40-f3abc4bac490",
+ "hosted-state-upload-url": null,
+ "hosted-json-state-upload-url": null,
+ "status": "finalized",
+ "intermediate": true,
+ "serial": 1
+ },
+ "links": {
+ "self": "/api/v2/state-versions/sv-DmoXecHePnNznaA4"
+ }
+ }
+}
+```
+
+## Upload State and JSON State
+
+ You can upload state version content in the same request when creating a state version. However, we _strongly_ recommend that you upload content separately.
+
+`PUT https://archivist.terraform.io/v1/object/`
+
+HCP Terraform returns a `hosted-state-upload-url` or `hosted-json-state-upload-url` returned when you create a `state-version`. Once you upload state content, this URL is hidden on the resource and _no longer available_.
+
+### Sample Request
+
+In the below example, `@filename` is the name of Terraform state file you wish to upload.
+
+```shell
+curl \
+ --header "Content-Type: application/octet-stream" \
+ --request PUT \
+ --data-binary @filename \
+ https://archivist.terraform.io/v1/object/4c44d964-eba7-4dd5-ad29-1ece7b99e8da
+```
+
+## List State Versions for a Workspace
+
+`GET /state-versions`
+
+Listing state versions requires permission to read state versions for the workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| ---------------------------- | -------------------------------------------------------------------------------------- |
+| `filter[workspace][name]` | **Required** The name of one workspace to list versions for. |
+| `filter[organization][name]` | **Required** The name of the organization that owns the desired workspace. |
+| `filter[status]` | **Optional.** Filter state versions by status: `pending`, `finalized`, or `discarded`. |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 state versions per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ "https://app.terraform.io/api/v2/state-versions?filter%5Bworkspace%5D%5Bname%5D=my-workspace&filter%5Borganization%5D%5Bname%5D=my-organization"
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "sv-g4rqST72reoHMM5a",
+ "type": "state-versions",
+ "attributes": {
+ "created-at": "2021-06-08T01:22:03.794Z",
+ "size": 940,
+ "hosted-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-state-upload-url": null,
+ "hosted-json-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-json-state-upload-url": null,
+ "status": "finalized",
+ "intermediate": false,
+ "modules": {
+ "root": {
+ "null-resource": 1,
+ "data.terraform-remote-state": 1
+ }
+ },
+ "providers": {
+ "provider[\"terraform.io/builtin/terraform\"]": {
+ "data.terraform-remote-state": 1
+ },
+ "provider[\"registry.terraform.io/hashicorp/null\"]": {
+ "null-resource": 1
+ }
+ },
+ "resources": [
+ {
+ "name": "other_username",
+ "type": "data.terraform_remote_state",
+ "count": 1,
+ "module": "root",
+ "provider": "provider[\"terraform.io/builtin/terraform\"]"
+ },
+ {
+ "name": "random",
+ "type": "null_resource",
+ "count": 1,
+ "module": "root",
+ "provider": "provider[\"registry.terraform.io/hashicorp/null\"]"
+ }
+ ],
+ "resources-processed": true,
+ "serial": 9,
+ "state-version": 4,
+ "terraform-version": "0.15.4",
+ "vcs-commit-url": "https://gitlab.com/my-organization/terraform-test/-/commit/abcdef12345",
+ "vcs-commit-sha": "abcdef12345"
+ },
+ "relationships": {
+ "run": {
+ "data": {
+ "id": "run-YfmFLWpgTv31VZsP",
+ "type": "runs"
+ }
+ },
+ "created-by": {
+ "data": {
+ "id": "user-onZs69ThPZjBK2wo",
+ "type": "users"
+ },
+ "links": {
+ "self": "/api/v2/users/user-onZs69ThPZjBK2wo",
+ "related": "/api/v2/runs/run-YfmFLWpgTv31VZsP/created-by"
+ }
+ },
+ "workspace": {
+ "data": {
+ "id": "ws-noZcaGXsac6aZSJR",
+ "type": "workspaces"
+ }
+ },
+ "outputs": {
+ "data": [
+ {
+ "id": "wsout-V22qbeM92xb5mw9n",
+ "type": "state-version-outputs"
+ },
+ {
+ "id": "wsout-ymkuRnrNFeU5wGpV",
+ "type": "state-version-outputs"
+ },
+ {
+ "id": "wsout-v82BjkZnFEcscipg",
+ "type": "state-version-outputs"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/state-versions/sv-g4rqST72reoHMM5a"
+ }
+ },
+ {
+ "id": "sv-QYKf6GvNv75ZPTBr",
+ "type": "state-versions",
+ "attributes": {
+ "created-at": "2021-06-01T21:40:25.941Z",
+ "size": 819,
+ "hosted-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-state-upload-url": null,
+ "hosted-json-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-json-state-upload-url": null,
+ "status": "finalized",
+ "intermediate": false,
+ "modules": {
+ "root": {
+ "data.terraform-remote-state": 1
+ }
+ },
+ "providers": {
+ "provider[\"terraform.io/builtin/terraform\"]": {
+ "data.terraform-remote-state": 1
+ }
+ },
+ "resources": [
+ {
+ "name": "other_username",
+ "type": "data.terraform_remote_state",
+ "count": 1,
+ "module": "root",
+ "provider": "provider[\"terraform.io/builtin/terraform\"]"
+ }
+ ],
+ "resources-processed": true,
+ "serial": 8,
+ "state-version": 4,
+ "terraform-version": "0.15.4",
+ "vcs-commit-url": "https://gitlab.com/my-organization/terraform-test/-/commit/12345abcdef",
+ "vcs-commit-sha": "12345abcdef"
+ },
+ "relationships": {
+ "run": {
+ "data": {
+ "id": "run-cVtxks6R8wsjCZMD",
+ "type": "runs"
+ }
+ },
+ "created-by": {
+ "data": {
+ "id": "user-onZs69ThPZjBK2wo",
+ "type": "users"
+ },
+ "links": {
+ "self": "/api/v2/users/user-onZs69ThPZjBK2wo",
+ "related": "/api/v2/runs/run-YfmFLWpgTv31VZsP/created-by"
+ }
+ },
+ "workspace": {
+ "data": {
+ "id": "ws-noZcaGXsac6aZSJR",
+ "type": "workspaces"
+ }
+ },
+ "outputs": {
+ "data": [
+ {
+ "id": "wsout-MmqMhmht6jFmLRvh",
+ "type": "state-version-outputs"
+ },
+ {
+ "id": "wsout-Kuo9TCHg3oDLDQqa",
+ "type": "state-version-outputs"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/state-versions/sv-QYKf6GvNv75ZPTBr"
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/state-versions?filter%5Borganization%5D%5Bname%5D=hashicorp&filter%5Bworkspace%5D%5Bname%5D=my-workspace&page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/state-versions?filter%5Borganization%5D%5Bname%5D=hashicorp&filter%5Bworkspace%5D%5Bname%5D=my-workspace&page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io.io/api/v2/state-versions?filter%5Borganization%5D%5Bname%5D=hashicorp&filter%5Bworkspace%5D%5Bname%5D=my-workspace&page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "page-size": 20,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 10
+ }
+ }
+}
+```
+
+## Fetch the Current State Version for a Workspace
+
+`GET /workspaces/:workspace_id/current-state-version`
+
+| Parameter | Description |
+| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The ID for the workspace whose current state version you want to fetch. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](/terraform/enterprise/api-docs/workspaces#show-workspace) endpoint. |
+
+Fetches the current state version for the given workspace. This state version
+will be the input state when running terraform operations.
+
+Viewing state versions requires permission to read state versions for the workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------------------------------------------------------- |
+| [200][] | [JSON API document][] | Successfully returned current state version for the given workspace. |
+| [404][] | [JSON API error object][] | Workspace not found, workspace does not have a current state version, or user unauthorized to perform action. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/workspaces/ws-6fHMCom98SDXSQUv/current-state-version
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "sv-g4rqST72reoHMM5a",
+ "type": "state-versions",
+ "attributes": {
+ "billable-rum-count": 0,
+ "created-at": "2021-06-08T01:22:03.794Z",
+ "size": 940,
+ "hosted-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-state-upload-url": null,
+ "hosted-json-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-json-state-upload-url": null,
+ "status": "finalized",
+ "intermediate": false,
+ "modules": {
+ "root": {
+ "null-resource": 1,
+ "data.terraform-remote-state": 1
+ }
+ },
+ "providers": {
+ "provider[\"terraform.io/builtin/terraform\"]": {
+ "data.terraform-remote-state": 1
+ },
+ "provider[\"registry.terraform.io/hashicorp/null\"]": {
+ "null-resource": 1
+ }
+ },
+ "resources": [
+ {
+ "name": "other_username",
+ "type": "data.terraform_remote_state",
+ "count": 1,
+ "module": "root",
+ "provider": "provider[\"terraform.io/builtin/terraform\"]"
+ },
+ {
+ "name": "random",
+ "type": "null_resource",
+ "count": 1,
+ "module": "root",
+ "provider": "provider[\"registry.terraform.io/hashicorp/null\"]"
+ }
+ ],
+ "resources-processed": true,
+ "serial": 9,
+ "state-version": 4,
+ "terraform-version": "0.15.4",
+ "vcs-commit-url": "https://gitlab.com/my-organization/terraform-test/-/commit/abcdef12345",
+ "vcs-commit-sha": "abcdef12345"
+ },
+ "relationships": {
+ "run": {
+ "data": {
+ "id": "run-YfmFLWpgTv31VZsP",
+ "type": "runs"
+ }
+ },
+ "created-by": {
+ "data": {
+ "id": "user-onZs69ThPZjBK2wo",
+ "type": "users"
+ },
+ "links": {
+ "self": "/api/v2/users/user-onZs69ThPZjBK2wo",
+ "related": "/api/v2/runs/run-YfmFLWpgTv31VZsP/created-by"
+ }
+ },
+ "workspace": {
+ "data": {
+ "id": "ws-noZcaGXsac6aZSJR",
+ "type": "workspaces"
+ }
+ },
+ "outputs": {
+ "data": [
+ {
+ "id": "wsout-V22qbeM92xb5mw9n",
+ "type": "state-version-outputs"
+ },
+ {
+ "id": "wsout-ymkuRnrNFeU5wGpV",
+ "type": "state-version-outputs"
+ },
+ {
+ "id": "wsout-v82BjkZnFEcscipg",
+ "type": "state-version-outputs"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/state-versions/sv-g4rqST72reoHMM5a"
+ }
+ }
+}
+```
+
+## Show a State Version
+
+`GET /state-versions/:state_version_id`
+
+Viewing state versions requires permission to read state versions for the workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Parameter | Description |
+| ------------------- | ------------------------------------ |
+| `:state_version_id` | The ID of the desired state version. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------------------------------------------------------- |
+| [200][] | [JSON API document][] | Successfully returned current state version for the given workspace. |
+| [404][] | [JSON API error object][] | Workspace not found, workspace does not have a current state version, or user unauthorized to perform action. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/state-versions/sv-SDboVZC8TCxXEneJ
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "sv-g4rqST72reoHMM5a",
+ "type": "state-versions",
+ "attributes": {
+ "created-at": "2021-06-08T01:22:03.794Z",
+ "size": 940,
+ "hosted-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-state-upload-url": null,
+ "hosted-json-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-json-state-upload-url": null,
+ "status": "finalized",
+ "intermediate": false,
+ "modules": {
+ "root": {
+ "null-resource": 1,
+ "data.terraform-remote-state": 1
+ }
+ },
+ "providers": {
+ "provider[\"terraform.io/builtin/terraform\"]": {
+ "data.terraform-remote-state": 1
+ },
+ "provider[\"registry.terraform.io/hashicorp/null\"]": {
+ "null-resource": 1
+ }
+ },
+ "resources": [
+ {
+ "name": "other_username",
+ "type": "data.terraform_remote_state",
+ "count": 1,
+ "module": "root",
+ "provider": "provider[\"terraform.io/builtin/terraform\"]"
+ },
+ {
+ "name": "random",
+ "type": "null_resource",
+ "count": 1,
+ "module": "root",
+ "provider": "provider[\"registry.terraform.io/hashicorp/null\"]"
+ }
+ ],
+ "resources-processed": true,
+ "serial": 9,
+ "state-version": 4,
+ "terraform-version": "0.15.4",
+ "vcs-commit-url": "https://gitlab.com/my-organization/terraform-test/-/commit/abcdef12345",
+ "vcs-commit-sha": "abcdef12345"
+ },
+ "relationships": {
+ "run": {
+ "data": {
+ "id": "run-YfmFLWpgTv31VZsP",
+ "type": "runs"
+ }
+ },
+ "created-by": {
+ "data": {
+ "id": "user-onZs69ThPZjBK2wo",
+ "type": "users"
+ },
+ "links": {
+ "self": "/api/v2/users/user-onZs69ThPZjBK2wo",
+ "related": "/api/v2/runs/run-YfmFLWpgTv31VZsP/created-by"
+ }
+ },
+ "workspace": {
+ "data": {
+ "id": "ws-noZcaGXsac6aZSJR",
+ "type": "workspaces"
+ }
+ },
+ "outputs": {
+ "data": [
+ {
+ "id": "wsout-V22qbeM92xb5mw9n",
+ "type": "state-version-outputs"
+ },
+ {
+ "id": "wsout-ymkuRnrNFeU5wGpV",
+ "type": "state-version-outputs"
+ },
+ {
+ "id": "wsout-v82BjkZnFEcscipg",
+ "type": "state-version-outputs"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/state-versions/sv-g4rqST72reoHMM5a"
+ }
+ }
+}
+```
+
+## Rollback to a Previous State Version
+
+`PATCH /workspaces/:workspace_id/state-versions`
+
+| Parameter | Description |
+| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The workspace ID to create the new state version in. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](/terraform/enterprise/api-docs/workspaces#show-workspace) endpoint. |
+
+Creates a state version by duplicating the specified state version and sets it as the current state version for the given workspace. The workspace must be locked by the user creating a state version. The workspace may be locked [with the API](/terraform/enterprise/api-docs/workspaces#lock-a-workspace) or [with the UI](/terraform/enterprise/workspaces/settings#locking). This is most useful for rolling back to a known-good state after an operation such as a Terraform upgrade didn't go as planned.
+
+Creating state versions requires permission to read and write state versions for the workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+!> **Warning:** Use caution when rolling back to a previous state. Replacing state improperly can result in orphaned or duplicated infrastructure resources.
+
+-> **Note:** You cannot access this endpoint with [organization tokens](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). You must access it with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens) or [team token](/terraform/enterprise/users-teams-organizations/api-tokens#team-api-tokens).
+
+| Status | Response | Reason |
+| ------- | ------------------------- | --------------------------------------------------------------- |
+| [201][] | [JSON API document][] | Successfully rolled back. |
+| [404][] | [JSON API error object][] | Workspace not found, or user unauthorized to perform action. |
+| [409][] | [JSON API error object][] | Conflict; check the error object for more information. |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.). |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| --------------------------------------------------- | ------ | ------- | -------------------------------------------------------------- |
+| `data.type` | string | | Must be `"state-versions"`. |
+| `data.relationships.rollback-state-version.data.id` | string | | The ID of the state version to use for the rollback operation. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type":"state-versions",
+ "relationships": {
+ "rollback-state-version": {
+ "data": {
+ "type": "state-versions",
+ "id": "sv-bWfq4Y1YpRKW4mx7"
+ }
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-6fHMCom98SDXSQUv/state-versions
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "sv-DmoXecHePnNznaA4",
+ "type": "state-versions",
+ "attributes": {
+ "created-at": "2022-11-22T01:22:03.794Z",
+ "size": 940,
+ "hosted-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-state-upload-url": null,
+ "hosted-json-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-json-state-upload-url": null,
+ "modules": {
+ "root": {
+ "null-resource": 1,
+ "data.terraform-remote-state": 1
+ }
+ },
+ "providers": {
+ "provider[\"terraform.io/builtin/terraform\"]": {
+ "data.terraform-remote-state": 1
+ },
+ "provider[\"registry.terraform.io/hashicorp/null\"]": {
+ "null-resource": 1
+ }
+ },
+ "resources": [
+ {
+ "name": "other_username",
+ "type": "data.terraform_remote_state",
+ "count": 1,
+ "module": "root",
+ "provider": "provider[\"terraform.io/builtin/terraform\"]"
+ },
+ {
+ "name": "random",
+ "type": "null_resource",
+ "count": 1,
+ "module": "root",
+ "provider": "provider[\"registry.terraform.io/hashicorp/null\"]"
+ }
+ ],
+ "resources-processed": true,
+ "serial": 9,
+ "state-version": 4,
+ "terraform-version": "1.3.5"
+ },
+ "relationships": {
+ "rollback-state-version": {
+ "data": {
+ "id": "sv-YfmFLgTv31VZsP",
+ "type": "state-versions"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/state-versions/sv-DmoXecHePnNznaA4"
+ }
+ }
+}
+```
+
+## Mark a State Version for Garbage Collection
+
+
+This endpoint is exclusive to Terraform Enterprise, and not available in HCP Terraform. Learn more about Terraform Enterprise.
+
+
+`POST /api/v2/state-versions/:state_version_id/actions/soft_delete_backing_data`
+
+This endpoint directs Terraform Enterprise to _soft delete_ the backing files associated with this state version. Soft deletion marks the state version for garbage collection. Terraform permanently deletes state versions after a set number of days unless the state version is restored. Once a state version is soft deleted, any attempts to read the state version will fail. Refer to [State Version Status](#state-version-status) for information about all data states.
+
+This endpoint can only soft delete state versions that are in an [`finalized` state](#state-version-status) and are not the current state version. Otherwise, calling this endpoint results in an error.
+
+You must have organization owner permissions to soft delete state versions. Refer to [Permissions](/terraform/enterprise/users-teams-organizations/permissions) for additional information about permissions.
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Parameter | Description |
+| ------------------- | ----------------------------------------------------------- |
+| `:state_version_id` | The ID of the state version to mark for garbage collection. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | --------------------------------------------------------------------------------------------------- |
+| [200][] | [JSON API document][] | Terraform successfully marked the data for garbage collection. |
+| [400][] | [JSON API error object][] | Terraform failed to transition the state to `backing_data_soft_deleted`. |
+| [404][] | [JSON API error object][] | Terraform did not find the state version or the user is not authorized to modify the state version. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/state-versions/sv-ntv3HbhJqvFzamy7/actions/soft_delete_backing_data
+ --data {"data": {"attributes": {"delete-older-than-n-days": 23}}}
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "sv-g4rqST72reoHMM5a",
+ "type": "state-versions",
+ "attributes": {
+ "created-at": "2021-06-08T01:22:03.794Z",
+ "size": 940,
+ "hosted-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-state-upload-url": null,
+ "hosted-json-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-json-state-upload-url": null,
+ "status": "backing_data_soft_deleted",
+ "intermediate": false,
+ "delete-older-than-n-days": 23,
+ "modules": {
+ "root": {
+ "null-resource": 1,
+ "data.terraform-remote-state": 1
+ }
+ },
+ "providers": {
+ "provider[\"terraform.io/builtin/terraform\"]": {
+ "data.terraform-remote-state": 1
+ },
+ "provider[\"registry.terraform.io/hashicorp/null\"]": {
+ "null-resource": 1
+ }
+ },
+ "resources": [
+ {
+ "name": "other_username",
+ "type": "data.terraform_remote_state",
+ "count": 1,
+ "module": "root",
+ "provider": "provider[\"terraform.io/builtin/terraform\"]"
+ },
+ {
+ "name": "random",
+ "type": "null_resource",
+ "count": 1,
+ "module": "root",
+ "provider": "provider[\"registry.terraform.io/hashicorp/null\"]"
+ }
+ ],
+ "resources-processed": true,
+ "serial": 9,
+ "state-version": 4,
+ "terraform-version": "0.15.4",
+ "vcs-commit-url": "https://gitlab.com/my-organization/terraform-test/-/commit/abcdef12345",
+ "vcs-commit-sha": "abcdef12345"
+ },
+ "relationships": {
+ "run": {
+ "data": {
+ "id": "run-YfmFLWpgTv31VZsP",
+ "type": "runs"
+ }
+ },
+ "created-by": {
+ "data": {
+ "id": "user-onZs69ThPZjBK2wo",
+ "type": "users"
+ },
+ "links": {
+ "self": "/api/v2/users/user-onZs69ThPZjBK2wo",
+ "related": "/api/v2/runs/run-YfmFLWpgTv31VZsP/created-by"
+ }
+ },
+ "workspace": {
+ "data": {
+ "id": "ws-noZcaGXsac6aZSJR",
+ "type": "workspaces"
+ }
+ },
+ "outputs": {
+ "data": [
+ {
+ "id": "wsout-V22qbeM92xb5mw9n",
+ "type": "state-version-outputs"
+ },
+ {
+ "id": "wsout-ymkuRnrNFeU5wGpV",
+ "type": "state-version-outputs"
+ },
+ {
+ "id": "wsout-v82BjkZnFEcscipg",
+ "type": "state-version-outputs"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/state-versions/sv-g4rqST72reoHMM5a"
+ }
+ }
+}
+```
+
+## Restore a State Version Marked for Garbage Collection
+
+
+This endpoint is exclusive to Terraform Enterprise, and not available in HCP Terraform. Learn more about Terraform Enterprise.
+
+
+`POST /api/v2/state-versions/:state_version_id/actions/restore_backing_data`
+
+This endpoint directs Terraform Enterprise to restore backing files associated with this state version. This endpoint can only restore state versions that are not in a [`backing_data_permanently_deleted` state](#state-version-status). Terraform restores applicable state versions back to their `finalized` state. Otherwise, calling this endpoint results in an error.
+
+You must have organization owner permissions to restore state versions. Refer to [Permissions](/terraform/enterprise/users-teams-organizations/permissions) for additional information about permissions.
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Parameter | Description |
+| ------------------- | --------------------------------------- |
+| `:state_version_id` | The ID of the state version to restore. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | --------------------------------------------------------------------------------------------------- |
+| [200][] | [JSON API document][] | Terraform successfully initiated the restore process. |
+| [400][] | [JSON API error object][] | Terraform failed to transition the state to `finalized`. |
+| [404][] | [JSON API error object][] | Terraform did not find the state version or the user is not authorized to modify the state version. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/state-versions/sv-ntv3HbhJqvFzamy7/actions/restore_backing_data
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "sv-g4rqST72reoHMM5a",
+ "type": "state-versions",
+ "attributes": {
+ "created-at": "2021-06-08T01:22:03.794Z",
+ "size": 940,
+ "hosted-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-state-upload-url": null,
+ "hosted-json-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-json-state-upload-url": null,
+ "status": "uploaded",
+ "intermediate": false,
+ "modules": {
+ "root": {
+ "null-resource": 1,
+ "data.terraform-remote-state": 1
+ }
+ },
+ "providers": {
+ "provider[\"terraform.io/builtin/terraform\"]": {
+ "data.terraform-remote-state": 1
+ },
+ "provider[\"registry.terraform.io/hashicorp/null\"]": {
+ "null-resource": 1
+ }
+ },
+ "resources": [
+ {
+ "name": "other_username",
+ "type": "data.terraform_remote_state",
+ "count": 1,
+ "module": "root",
+ "provider": "provider[\"terraform.io/builtin/terraform\"]"
+ },
+ {
+ "name": "random",
+ "type": "null_resource",
+ "count": 1,
+ "module": "root",
+ "provider": "provider[\"registry.terraform.io/hashicorp/null\"]"
+ }
+ ],
+ "resources-processed": true,
+ "serial": 9,
+ "state-version": 4,
+ "terraform-version": "0.15.4",
+ "vcs-commit-url": "https://gitlab.com/my-organization/terraform-test/-/commit/abcdef12345",
+ "vcs-commit-sha": "abcdef12345"
+ },
+ "relationships": {
+ "run": {
+ "data": {
+ "id": "run-YfmFLWpgTv31VZsP",
+ "type": "runs"
+ }
+ },
+ "created-by": {
+ "data": {
+ "id": "user-onZs69ThPZjBK2wo",
+ "type": "users"
+ },
+ "links": {
+ "self": "/api/v2/users/user-onZs69ThPZjBK2wo",
+ "related": "/api/v2/runs/run-YfmFLWpgTv31VZsP/created-by"
+ }
+ },
+ "workspace": {
+ "data": {
+ "id": "ws-noZcaGXsac6aZSJR",
+ "type": "workspaces"
+ }
+ },
+ "outputs": {
+ "data": [
+ {
+ "id": "wsout-V22qbeM92xb5mw9n",
+ "type": "state-version-outputs"
+ },
+ {
+ "id": "wsout-ymkuRnrNFeU5wGpV",
+ "type": "state-version-outputs"
+ },
+ {
+ "id": "wsout-v82BjkZnFEcscipg",
+ "type": "state-version-outputs"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/state-versions/sv-g4rqST72reoHMM5a"
+ }
+ }
+}
+```
+
+## Permanently Delete a State Version
+
+
+This endpoint is exclusive to Terraform Enterprise, and not available in HCP Terraform. Learn more about Terraform Enterprise.
+
+
+`POST /api/v2/state-versions/:state_version_id/actions/permanently_delete_backing_data`
+
+This endpoint directs Terraform Enterprise to permanently delete backing files associated with this state version. This endpoint can only permanently delete state versions that are in an [`backing_data_soft_deleted` state](#state-version-status) and are not the current state version. Otherwise, calling this endpoint results in an error.
+
+You must have organization owner permissions to permanently delete state versions. Refer to [Permissions](/terraform/enterprise/users-teams-organizations/permissions) for additional information about permissions.
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Parameter | Description |
+| ------------------- | -------------------------------------------------- |
+| `:state_version_id` | The ID of the state version to permanently delete. |
+
+| Status | Response | Reason |
+| ------- | ------------------------- | -------------------------------------------------------------------------------------------------------- |
+| [200][] | [JSON API document][] | Terraform deleted the data permanently. |
+| [400][] | [JSON API error object][] | Terraform failed to transition the state to `backing_data_permanently_deleted`. |
+| [404][] | [JSON API error object][] | Terraform did not find the state version or the user is not authorized to modify the state version data. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/state-versions/sv-ntv3HbhJqvFzamy7/actions/permanently_delete_backing_data
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "sv-g4rqST72reoHMM5a",
+ "type": "state-versions",
+ "attributes": {
+ "created-at": "2021-06-08T01:22:03.794Z",
+ "size": 940,
+ "hosted-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-state-upload-url": null,
+ "hosted-json-state-download-url": "https://archivist.terraform.io/v1/object/...",
+ "hosted-json-state-upload-url": null,
+ "status": "backing_data_permanently_deleted",
+ "intermediate": false,
+ "modules": {
+ "root": {
+ "null-resource": 1,
+ "data.terraform-remote-state": 1
+ }
+ },
+ "providers": {
+ "provider[\"terraform.io/builtin/terraform\"]": {
+ "data.terraform-remote-state": 1
+ },
+ "provider[\"registry.terraform.io/hashicorp/null\"]": {
+ "null-resource": 1
+ }
+ },
+ "resources": [
+ {
+ "name": "other_username",
+ "type": "data.terraform_remote_state",
+ "count": 1,
+ "module": "root",
+ "provider": "provider[\"terraform.io/builtin/terraform\"]"
+ },
+ {
+ "name": "random",
+ "type": "null_resource",
+ "count": 1,
+ "module": "root",
+ "provider": "provider[\"registry.terraform.io/hashicorp/null\"]"
+ }
+ ],
+ "resources-processed": true,
+ "serial": 9,
+ "state-version": 4,
+ "terraform-version": "0.15.4",
+ "vcs-commit-url": "https://gitlab.com/my-organization/terraform-test/-/commit/abcdef12345",
+ "vcs-commit-sha": "abcdef12345"
+ },
+ "relationships": {
+ "run": {
+ "data": {
+ "id": "run-YfmFLWpgTv31VZsP",
+ "type": "runs"
+ }
+ },
+ "created-by": {
+ "data": {
+ "id": "user-onZs69ThPZjBK2wo",
+ "type": "users"
+ },
+ "links": {
+ "self": "/api/v2/users/user-onZs69ThPZjBK2wo",
+ "related": "/api/v2/runs/run-YfmFLWpgTv31VZsP/created-by"
+ }
+ },
+ "workspace": {
+ "data": {
+ "id": "ws-noZcaGXsac6aZSJR",
+ "type": "workspaces"
+ }
+ },
+ "outputs": {
+ "data": [
+ {
+ "id": "wsout-V22qbeM92xb5mw9n",
+ "type": "state-version-outputs"
+ },
+ {
+ "id": "wsout-ymkuRnrNFeU5wGpV",
+ "type": "state-version-outputs"
+ },
+ {
+ "id": "wsout-v82BjkZnFEcscipg",
+ "type": "state-version-outputs"
+ }
+ ]
+ }
+ },
+ "links": {
+ "self": "/api/v2/state-versions/sv-g4rqST72reoHMM5a"
+ }
+ }
+}
+```
+
+## List State Version Outputs
+
+The output values from a state version are also available via the API. For details, see the [state version outputs documentation.](/terraform/enterprise/api-docs/state-version-outputs#list-state-version-outputs)
+
+### Available Related Resources
+
+The GET endpoints above can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+- `created_by` - The user that created the state version. For state versions created via a run executed by HCP Terraform, this is an internal user account.
+- `run` - The run that created the state version, if applicable.
+- `run.created_by` - The user that manually triggered the run, if applicable.
+- `run.configuration_version` - The configuration version used in the run.
+- `outputs` - The parsed outputs for this state version.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/team-access.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/team-access.mdx
new file mode 100644
index 0000000000..8d873b5c3f
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/team-access.mdx
@@ -0,0 +1,433 @@
+---
+page_title: /team-workspaces API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/team-workspaces` endpoint to manage team
+ access to a workspace. Read, add, update, and remove a team's access to
+ workspaces.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Team access API reference
+
+
+
+-> **Note:** Team management is available in HCP Terraform **Standard** Edition. [Learn more about HCP Terraform pricing here](https://www.hashicorp.com/products/terraform/pricing).
+
+
+
+The team access APIs are used to associate a team to permissions on a workspace. A single `team-workspace` resource contains the relationship between the Team and Workspace, including the privileges the team has on the workspace.
+
+## Resource permissions
+
+A `team-workspace` resource represents a team's local permissions on a specific workspace. Teams can also have organization-level permissions that grant access to workspaces. HCP Terraform uses the more restrictive access level. For example, a team with the **Manage workspaces** permission enabled has admin access on all workspaces, even if their `team-workspace` on a particular workspace only grants read access. For more information, refer to [Managing Workspace Access](/terraform/enterprise/users-teams-organizations/teams/manage#managing-workspace-access).
+
+Any member of an organization can view team access relative to their own team memberships, including secret teams of which they are a member. Organization owners and workspace admins can modify team access or view the full set of secret team accesses. The organization token and the owners team token can act as an owner on these endpoints. Refer to [Permissions](/terraform/enterprise/users-teams-organizations/permissions) for additional information.
+
+## List Team Access to a Workspace
+
+`GET /team-workspaces`
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------- | ---------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "team-workspaces"`) | The request was successful |
+| [404][] | [JSON API error object][] | Workspace not found or user unauthorized to perform action |
+
+### Query Parameters
+
+[These are standard URL query parameters](/terraform/enterprise/api-docs#query-parameters); remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). If neither pagination query parameters are provided, the endpoint will not be paginated and will return all results.
+
+| Parameter | Description |
+| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `filter[workspace][id]` | **Required.** The workspace ID to list team access for. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](/terraform/enterprise/api-docs/workspaces#show-workspace) endpoint. |
+| `page[number]` | **Optional.** |
+| `page[size]` | **Optional.** |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ "https://app.terraform.io/api/v2/team-workspaces?filter%5Bworkspace%5D%5Bid%5D=ws-XGA52YVykdTgryTN"
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "tws-19iugLwoNgtWZbKP",
+ "type": "team-workspaces",
+ "attributes": {
+ "access": "custom",
+ "runs": "apply",
+ "variables": "none",
+ "state-versions": "none",
+ "sentinel-mocks": "none",
+ "workspace-locking": false,
+ "run-tasks": false
+ },
+ "relationships": {
+ "team": {
+ "data": {
+ "id": "team-DBycxkdQrGFf5zEM",
+ "type": "teams"
+ },
+ "links": {
+ "related": "/api/v2/teams/team-DBycxkdQrGFf5zEM"
+ }
+ },
+ "workspace": {
+ "data": {
+ "id": "ws-XGA52YVykdTgryTN",
+ "type": "workspaces"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization/workspaces/my-workspace"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/team-workspaces/tws-19iugLwoNgtWZbKP"
+ }
+ }
+ ]
+}
+```
+
+## Show a Team Access relationship
+
+`GET /team-workspaces/:id`
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------- | ------------------------------------------------------------ |
+| [200][] | [JSON API document][] (`type: "team-workspaces"`) | The request was successful |
+| [404][] | [JSON API error object][] | Team access not found or user unauthorized to perform action |
+
+| Parameter | Description |
+| --------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the team/workspace relationship. Obtain this from the [list team access action](#list-team-access-to-a-workspace) described above. |
+
+-> **Note:** As mentioned in [Add Team Access to a Workspace](#add-team-access-to-a-workspace) and [Update Team Access
+to a Workspace](#update-team-access-to-a-workspace), several permission attributes are not editable unless `access` is
+set to `custom`. When access is `read`, `plan`, `write`, or `admin`, these attributes are read-only and reflect the
+implicit permissions granted to the current access level.
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/team-workspaces/tws-s68jV4FWCDwWvQq8
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "tws-s68jV4FWCDwWvQq8",
+ "type": "team-workspaces",
+ "attributes": {
+ "access": "write",
+ "runs": "apply",
+ "variables": "write",
+ "state-versions": "write",
+ "sentinel-mocks": "read",
+ "workspace-locking": true,
+ "run-tasks": false
+ },
+ "relationships": {
+ "team": {
+ "data": {
+ "id": "team-DBycxkdQrGFf5zEM",
+ "type": "teams"
+ },
+ "links": {
+ "related": "/api/v2/teams/team-DBycxkdQrGFf5zEM"
+ }
+ },
+ "workspace": {
+ "data": {
+ "id": "ws-XGA52YVykdTgryTN",
+ "type": "workspaces"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization/workspaces/my-workspace"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/team-workspaces/tws-s68jV4FWCDwWvQq8"
+ }
+ }
+}
+```
+
+## Add Team Access to a Workspace
+
+`POST /team-workspaces`
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------- | ------------------------------------------------------------------ |
+| [200][] | [JSON API document][] (`type: "team-workspaces"`) | The request was successful |
+| [404][] | [JSON API error object][] | Workspace or Team not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ---------------------------------------- | ------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"team-workspaces"`. |
+| `data.attributes.access` | string | | The type of access to grant. Valid values are `read`, `plan`, `write`, `admin`, or `custom`. |
+| `data.attributes.runs` | string | "read" | If `access` is `custom`, the permission to grant for the workspace's runs. Can only be used when `access` is `custom`. Valid values include `read`, `plan`, or `apply`. |
+| `data.attributes.variables` | string | "none" | If `access` is `custom`, the permission to grant for the workspace's variables. Can only be used when `access` is `custom`. Valid values include `none`, `read`, or `write`. |
+| `data.attributes.state-versions` | string | "none" | If `access` is `custom`, the permission to grant for the workspace's state versions. Can only be used when `access` is `custom`. Valid values include `none`, `read-outputs`, `read`, or `write`. |
+| `data.attributes.sentinel-mocks` | string | "none" | If `access` is `custom`, the permission to grant for the workspace's Sentinel mocks. Can only be used when `access` is `custom`. Valid values include `none`, or `read`. |
+| `data.attributes.workspace-locking` | boolean | false | If `access` is `custom`, the permission granting the ability to manually lock or unlock the workspace. Can only be used when `access` is `custom`. |
+| `data.attributes.run-tasks` | boolean | false | If `access` is `custom`, this permission allows the team to manage run tasks within the workspace. |
+| `data.relationships.workspace.data.type` | string | | Must be `workspaces`. |
+| `data.relationships.workspace.data.id` | string | | The workspace ID to which the team is to be added. |
+| `data.relationships.team.data.type` | string | | Must be `teams`. |
+| `data.relationships.team.data.id` | string | | The ID of the team to add to the workspace. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "access": "custom",
+ "runs": "apply",
+ "variables": "none",
+ "state-versions": "read-outputs",
+ "plan-outputs": "none",
+ "sentinel-mocks": "read",
+ "workspace-locking": false,
+ "run-tasks": false
+ },
+ "relationships": {
+ "workspace": {
+ "data": {
+ "type": "workspaces",
+ "id": "ws-XGA52YVykdTgryTN"
+ }
+ },
+ "team": {
+ "data": {
+ "type": "teams",
+ "id": "team-DBycxkdQrGFf5zEM"
+ }
+ }
+ },
+ "type": "team-workspaces"
+ }
+}
+```
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/team-workspaces
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "tws-sezDAcCYWLnd3xz2",
+ "type": "team-workspaces",
+ "attributes": {
+ "access": "custom",
+ "runs": "apply",
+ "variables": "none",
+ "state-versions": "read-outputs",
+ "sentinel-mocks": "read",
+ "workspace-locking": false,
+ "run-tasks": false
+ },
+ "relationships": {
+ "team": {
+ "data": {
+ "id": "team-DBycxkdQrGFf5zEM",
+ "type": "teams"
+ },
+ "links": {
+ "related": "/api/v2/teams/team-DBycxkdQrGFf5zEM"
+ }
+ },
+ "workspace": {
+ "data": {
+ "id": "ws-XGA52YVykdTgryTN",
+ "type": "workspaces"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization/workspaces/my-workspace"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/team-workspaces/tws-sezDAcCYWLnd3xz2"
+ }
+ }
+}
+```
+
+## Update Team Access to a Workspace
+
+`PATCH /team-workspaces/:id`
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "team-workspaces"`) | The request was successful |
+| [404][] | [JSON API error object][] | Team Access not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+
+| Parameter | | | Description |
+| ----------------------------------- | ------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | | | The ID of the team/workspace relationship. Obtain this from the [list team access action](#list-team-access-to-a-workspace) described above. |
+| `data.attributes.access` | string | | The type of access to grant. Valid values are `read`, `plan`, `write`, `admin`, or `custom`. |
+| `data.attributes.runs` | string | "read" | If `access` is `custom`, the permission to grant for the workspace's runs. Can only be used when `access` is `custom`. |
+| `data.attributes.variables` | string | "none" | If `access` is `custom`, the permission to grant for the workspace's variables. Can only be used when `access` is `custom`. |
+| `data.attributes.state-versions` | string | "none" | If `access` is `custom`, the permission to grant for the workspace's state versions. Can only be used when `access` is `custom`. |
+| `data.attributes.sentinel-mocks` | string | "none" | If `access` is `custom`, the permission to grant for the workspace's Sentinel mocks. Can only be used when `access` is `custom`. |
+| `data.attributes.workspace-locking` | boolean | false | If `access` is `custom`, the permission granting the ability to manually lock or unlock the workspace. Can only be used when `access` is `custom`. |
+| `data.attributes.run-tasks` | boolean | false | If `access` is `custom`, this permission allows the team to manage run tasks within the workspace. |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/team-workspaces/tws-s68jV4FWCDwWvQq8
+```
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "access": "custom",
+ "state-versions": "none"
+ }
+ }
+}
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "tws-s68jV4FWCDwWvQq8",
+ "type": "team-workspaces",
+ "attributes": {
+ "access": "custom",
+ "runs": "apply",
+ "variables": "write",
+ "state-versions": "none",
+ "sentinel-mocks": "read",
+ "workspace-locking": true,
+ "run-tasks": true
+ },
+ "relationships": {
+ "team": {
+ "data": {
+ "id": "team-DBycxkdQrGFf5zEM",
+ "type": "teams"
+ },
+ "links": {
+ "related": "/api/v2/teams/team-DBycxkdQrGFf5zEM"
+ }
+ },
+ "workspace": {
+ "data": {
+ "id": "ws-XGA52YVykdTgryTN",
+ "type": "workspaces"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization/workspaces/my-workspace"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/team-workspaces/tws-s68jV4FWCDwWvQq8"
+ }
+ }
+}
+```
+
+## Remove Team Access to a Workspace
+
+`DELETE /team-workspaces/:id`
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------ |
+| [204][] | | The Team Access was successfully destroyed |
+| [404][] | [JSON API error object][] | Team Access not found or user unauthorized to perform action |
+
+| Parameter | Description |
+| --------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:id` | The ID of the team/workspace relationship. Obtain this from the [list team access action](#list-team-access-to-a-workspace) described above. |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/team-workspaces/tws-sezDAcCYWLnd3xz2
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/team-members.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/team-members.mdx
new file mode 100644
index 0000000000..b3cf58069b
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/team-members.mdx
@@ -0,0 +1,249 @@
+---
+page_title: /relationships API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/relationships` endpoints to add and
+ remove users from teams using an account or organization membership ID.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Team membership API reference
+
+
+
+-> **Note:** Team management is available in HCP Terraform **Standard** Edition. Free organizations can also use this API, but can only manage membership of their owners team. [Learn more about HCP Terraform pricing here](https://www.hashicorp.com/products/terraform/pricing).
+
+
+
+The Team Membership API is used to add or remove users from teams. The [Team API](/terraform/enterprise/api-docs/teams) is used to create or destroy teams.
+
+## Organization Membership
+
+-> **Note:** To add users to a team, they must first receive and accept the invitation to join the organization by email. This process ensures that you do not accidentally add the wrong person by mistyping a username. Refer to [the Organization Memberships API documentation](/terraform/enterprise/api-docs/organization-memberships) for more information.
+
+## Add a User to Team (With user ID)
+
+This method adds multiple users to a team using the user ID. Both users and teams must already exist.
+
+`POST /teams/:team_id/relationships/users`
+
+| Parameter | Description |
+| ---------- | ------------------- |
+| `:team_id` | The ID of the team. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------- | ------ | ------- | ------------------------------------------------ |
+| `data[].type` | string | | Must be `"users"`. |
+| `data[].id` | string | | The ID of the user you want to add to this team. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "type": "users",
+ "id": "myuser1"
+ },
+ {
+ "type": "users",
+ "id": "myuser2"
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/teams/257525/relationships/users
+```
+
+## Add a User to Team (With organization membership ID)
+
+This method adds multiple users to a team using the organization membership ID. Unlike the user ID method, the user only needs an invitation to the organization.
+
+`POST /teams/:team_id/relationships/organization-memberships`
+
+| Parameter | Description |
+| ---------- | ------------------- |
+| `:team_id` | The ID of the team. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------- | ------ | ------- | -------------------------------------------------- |
+| `data[].type` | string | | Must be `"organization-memberships"`. |
+| `data[].id` | string | | The organization membership ID of the user to add. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "type": "organization-memberships",
+ "id": "ou-nX7inDHhmC3quYgy"
+ },
+ {
+ "type": "organization-memberships",
+ "id": "ou-tTJph1AQVK5ZmdND"
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/teams/257525/relationships/organization-memberships
+```
+
+## Delete a User from Team (With user ID)
+
+This method removes multiple users from a team using the user ID. Both users and teams must already exist. This method only removes a user from this team. It does not delete that user overall.
+
+`DELETE /teams/:team_id/relationships/users`
+
+| Parameter | Description |
+| ---------- | ------------------- |
+| `:team_id` | The ID of the team. |
+
+### Request Body
+
+This DELETE endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------- | ------ | ------- | -------------------------------------------- |
+| `data[].type` | string | | Must be `"users"`. |
+| `data[].id` | string | | The ID of the user to remove from this team. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "type": "users",
+ "id": "myuser1"
+ },
+ {
+ "type": "users",
+ "id": "myuser2"
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/teams/257525/relationships/users
+```
+
+## Delete a User from Team (With organization membership ID)
+
+This method removes multiple users from a team using the organization membership ID. This method only removes a user from this team. It does not delete that user overall.
+
+`DELETE /teams/:team_id/relationships/organization-memberships`
+
+| Parameter | Description |
+| ---------- | ------------------- |
+| `:team_id` | The ID of the team. |
+
+### Request Body
+
+This DELETE endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------- | ------ | ------- | ----------------------------------------------------- |
+| `data[].type` | string | | Must be `"organization-memberships"`. |
+| `data[].id` | string | | The organization membership ID of the user to remove. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "type": "organization-memberships",
+ "id": "ou-nX7inDHhmC3quYgy"
+ },
+ {
+ "type": "organization-memberships",
+ "id": "ou-tTJph1AQVK5ZmdND"
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/teams/257525/relationships/organization-memberships
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/team-tokens.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/team-tokens.mdx
new file mode 100644
index 0000000000..ed5921623e
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/team-tokens.mdx
@@ -0,0 +1,299 @@
+---
+page_title: /teams/authentication-token API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/teams/authentication-token` endpoint to
+ generate, delete, and list a team's API tokens.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Team tokens API reference
+
+Team API tokens grant access to a team's workspaces. Each team can have an API token that is not associated with a specific user. You can create and delete team tokens and list an organization's team tokens.
+
+## Generate a new team token
+
+Generates a new team token and overrides existing token if one exists.
+
+| Method | Path |
+| :----- | :----------------------------------- |
+| POST | /teams/:team_id/authentication-token |
+
+This endpoint returns the secret text of the new authentication token. You can only access this token when you create it and can not recover it later.
+
+### Parameters
+
+- `:team_id` (`string: `) - specifies the team ID for generating the team token
+
+### Request body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+| Key path | Type | Default | Description |
+| ---------------------------- | ------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"authentication-token"`. |
+| `data.attributes.expired-at` | string | `null` | The UTC date and time that the Team Token will expire, in ISO 8601 format. If omitted or set to `null` the token will never expire. |
+
+### Sample payload
+
+```json
+{
+ "data": {
+ "type": "authentication-token",
+ "attributes": {
+ "expired-at": "2023-04-06T12:00:00.000Z"
+ }
+ }
+}
+```
+
+### Sample request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/teams/team-BUHBEM97xboT8TVz/authentication-token
+```
+
+### Sample response
+
+```json
+{
+ "data": {
+ "id": "4111797",
+ "type": "authentication-tokens",
+ "attributes": {
+ "created-at": "2017-11-29T19:18:09.976Z",
+ "last-used-at": null,
+ "description": null,
+ "token": "QnbSxjjhVMHJgw.atlasv1.gxZnWIjI5j752DGqdwEUVLOFf0mtyaQ00H9bA1j90qWb254lEkQyOdfqqcq9zZL7Sm0",
+ "expired-at": "2023-04-06T12:00:00.000Z"
+ },
+ "relationships": {
+ "team": {
+ "data": {
+ "id": "team-Y7RyjccPVBKVEdp7",
+ "type": "teams"
+ }
+ },
+ "created-by": {
+ "data": {
+ "id": "user-62goNpx1ThQf689e",
+ "type": "users"
+ }
+ }
+ }
+ }
+}
+```
+
+## Delete the team token
+
+| Method | Path |
+| :----- | :----------------------------------- |
+| DELETE | /teams/:team_id/authentication-token |
+
+### Parameters
+
+- `:team_id` (`string: `) - specifies the team_id from which to delete the token
+
+### Sample request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/teams/team-BUHBEM97xboT8TVz/authentication-token
+```
+
+## List team tokens
+
+Lists the [team tokens](/terraform/enterprise/users-teams-organizations/teams#api-tokens) in an organization.
+
+`GET organizations/:organization_name/team-tokens`
+
+| Parameter | Description |
+| -------------------- | ---------------------------------------------------------------- |
+| `:organization_name` | The name of the organization whose team tokens you want to list. |
+
+This endpoint returns object metadata and does not include secret authentication details of tokens. You can only view a token when you create it and cannot recover it later.
+
+By default, this endpoint returns tokens by ascending expiration date.
+
+| Status | Response | Reason |
+| ------- | --------------------------------------------- | ---------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "team-tokens"`) | The request was successful. |
+| [200][] | Empty [JSON API document][] | The specified organization has no team tokens. |
+| [404][] | [JSON API error object][] | Organization not found. |
+
+### Query parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters) and searching with the `q` parameter. Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint returns the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint returns 20 tokens per page. |
+| `q` | **Optional.** A search query string. You can search for a team authentication token using the team name. |
+| `sort` | **Optional.** Allows sorting the team tokens by `"team-name"`, `"created-by"`, `"expired-at"`, and `"last-used-at"`. Prepending a hyphen to the sort parameter reverses the order. For example, `"-team-name"` sorts by name in reverse alphabetical order. If omitted, the default sort order ascending. |
+
+### Sample response
+
+```json
+{
+ "data": [
+ {
+ "id": "at-TLhN8cc6ro6qYDvp",
+ "type": "authentication-tokens",
+ "attributes": {
+ "created-at": "2024-06-19T18:28:25.267Z",
+ "last-used-at": null,
+ "description": null,
+ "token": null,
+ "expired-at": "2024-07-19T18:28:25.030Z"
+ },
+ "relationships": {
+ "team": {
+ "data": {
+ "id": "team-Y7RyjccPVBKVEdp7",
+ "type": "teams"
+ }
+ },
+ "created-by": {
+ "data": {
+ "id": "user-ccU6h629sszLJBpY",
+ "type": "users"
+ }
+ }
+ }
+ },
+ {
+ "id": "at-qfc2wqqJ1T5sCamM",
+ "type": "authentication-tokens",
+ "attributes": {
+ "created-at": "2024-06-19T18:44:44.051Z",
+ "last-used-at": null,
+ "description": null,
+ "token": null,
+ "expired-at": "2024-07-19T18:44:43.818Z"
+ },
+ "relationships": {
+ "team": {
+ "data": {
+ "id": "team-58pFiBffTLMxLphR",
+ "type": "teams"
+ }
+ },
+ "created-by": {
+ "data": {
+ "id": "user-ccU6h629hhzLJBpY",
+ "type": "users"
+ }
+ }
+ }
+ },
+ ]
+}
+```
+
+## Show a team token
+
+Use this endpoint to display a [team token](/terraform/enterprise/users-teams-organizations/teams#api-tokens) for a particular team.
+
+`GET /teams/:team-id/authentication-token`
+
+| Parameter | Description |
+| ---------- | ------------------- |
+| `:team-id` | The ID of the Team. |
+
+You can also fetch a team token directly by using the token's ID with the `authentication-tokens/` endpoint.
+
+`GET /authentication-tokens/:token-id`
+
+| Parameter | Description |
+| ----------- | ------------------------- |
+| `:token-id` | The ID of the Team Token. |
+
+The object returned by this endpoint only contains metadata, and does not include the secret text of the authentication token. A token's secret test is only shown upon creation, and cannot be recovered later.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------- | ------------------------------------------------------------ |
+| [200][] | [JSON API document][] (`type: "authentication-tokens"`) | The request was successful |
+| [404][] | [JSON API error object][] | Team Token not found, or unauthorized to view the Team Token |
+
+### Sample request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/teams/team-6yEmxNAhaoQLH1Da/authentication-token
+```
+
+### Sample response
+
+```json
+{
+ "data": {
+ "id": "at-6yEmxNAhaoQLH1Da",
+ "type": "authentication-tokens",
+ "attributes": {
+ "created-at": "2023-11-25T22:31:30.624Z",
+ "last-used-at": "2023-11-26T20:34:59.487Z",
+ "description": null,
+ "token": null,
+ "expired-at": "2024-04-06T12:00:00.000Z"
+ },
+ "relationships": {
+ "team": {
+ "data": {
+ "id": "team-LnREdjodkvZFGdXL",
+ "type": "teams"
+ }
+ },
+ "created-by": {
+ "data": {
+ "id": "user-MA4GL63FmYRpSFxa",
+ "type": "users"
+ }
+ }
+ }
+ }
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/teams.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/teams.mdx
new file mode 100644
index 0000000000..1f96792b02
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/teams.mdx
@@ -0,0 +1,466 @@
+---
+page_title: /teams API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/teams` endpoint to read, create, update,
+ and delete teams.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Teams API reference
+
+The Teams API is used to create, edit, and destroy teams as well as manage a team's organization-level permissions. The [Team Membership API](/terraform/enterprise/api-docs/team-members) is used to add or remove users from a team. Use the [Team Access API](/terraform/enterprise/api-docs/team-access) to associate a team with privileges on an individual workspace.
+
+
+
+@include 'tfc-package-callouts/team-management.mdx'
+
+
+
+Any member of an organization can view visible teams and any secret teams they are a member of. Only organization owners can modify teams or view the full set of secret teams. The organization token and the owners team token can act as an owner on these endpoints. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+## Organization Membership
+
+-> **Note:** Users must be invited to join organizations before they can be added to teams. See [the Organization Memberships API documentation](/terraform/enterprise/api-docs/organization-memberships) for more information. Invited users who have not yet accepted will not appear in Teams API responses.
+
+## List teams
+
+`GET organizations/:organization_name/teams`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------ |
+| `:organization_name` | The name of the organization to list teams from. |
+
+The response may identify HashiCorp API service accounts, for example `api-team_XXXXXX`, as a members of a team. However, API service accounts do not appear in the UI. As a result, there may be differences between the number of team members reported by the UI and the API. For example, the UI may report `0` members on a team when and the API reports `1`.
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `q` | **Optional.** Allows querying a list of teams by name. This search is case-insensitive. |
+| `filter[names]` | **Optional.** If specified, restricts results to a team with a matching name. If multiple comma separated values are specified, teams matching any of the names are returned. |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 teams per page. |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/organizations/my-organization/teams
+```
+
+### Sample Response
+
+The `sso-team-id` attribute is only returned in Terraform Enterprise 202204-1 and later, or in HCP Terraform.
+The `allow-member-token-management` attribute is set to `false` for Terraform Enterprise versions older than 202408-1.
+
+```json
+{
+ "data": [
+ {
+ "id": "team-6p5jTwJQXwqZBncC",
+ "type": "teams",
+ "attributes": {
+ "name": "team-creation-test",
+ "sso-team-id": "cb265c8e41bddf3f9926b2cf3d190f0e1627daa4",
+ "users-count": 0,
+ "visibility": "organization",
+ "allow-member-token-management": true,
+ "permissions": {
+ "can-update-membership": true,
+ "can-destroy": true,
+ "can-update-organization-access": true,
+ "can-update-api-token": true,
+ "can-update-visibility": true
+ },
+ "organization-access": {
+ "manage-policies": true,
+ "manage-policy-overrides": false,
+ "manage-run-tasks": true,
+ "manage-workspaces": false,
+ "manage-vcs-settings": false,
+ "manage-agent-pools": false,
+ "manage-projects": false,
+ "read-projects": false,
+ "read-workspaces": false
+ }
+ },
+ "relationships": {
+ "users": {
+ "data": []
+ },
+ "authentication-token": {
+ "meta": {}
+ }
+ },
+ "links": {
+ "self": "/api/v2/teams/team-6p5jTwJQXwqZBncC"
+ }
+ }
+ ]
+}
+```
+
+## Create a Team
+
+`POST /organizations/:organization_name/teams`
+
+| Parameter | Description |
+| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization to create the team in. The organization must already exist in the system, and the user must have permissions to create new teams. |
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "teams"`) | Successfully created a team |
+| [400][] | [JSON API error object][] | Invalid `include` parameter |
+| [404][] | [JSON API error object][] | Organization not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [500][] | [JSON API error object][] | Failure during team creation |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+-> **Note:** You cannot set `manage-workspaces` to `false` when setting `manage-projects` to `true`, since project permissions cascade down to workspaces. This is also the case for `read-workspaces` and `read-projects`. If `read-projects` is `true`, `read-workspaces` must be `true` as well.
+
+| Key path | Type | Default | Description |
+| ------------------------------------- | ------ | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"teams"`. |
+| `data.attributes.name` | string | | The name of the team, which can only include letters, numbers, `-`, and `_`. This will be used as an identifier and must be unique in the organization. |
+| `data.attributes.sso-team-id` | string | (nothing) | The unique identifier of the team from the SAML `MemberOf` attribute. Only available in Terraform Enterprise 202204-1 and later, or in HCP Terraform. |
+| `data.attributes.organization-access` | object | (nothing) | Settings for the team's organization access. This object can include the `manage-policies`, `manage-policy-overrides`, `manage-run-tasks`, `manage-workspaces`, `manage-vcs-settings`, `manage-agent-pools`, `manage-providers`, `manage-modules`, `manage-projects`, `read-projects`, `read-workspaces`, `manage-membership`, `manage-teams`, and `manage-organization-access` properties with boolean values. All properties default to `false`. |
+| `data.attributes.visibility` | string | `"secret"` | The team's visibility. Must be `"secret"` or `"organization"` (visible). |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "teams",
+ "attributes": {
+ "name": "team-creation-test",
+ "sso-team-id": "cb265c8e41bddf3f9926b2cf3d190f0e1627daa4",
+ "organization-access": {
+ "manage-workspaces": true
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/teams
+```
+
+### Sample Response
+
+The `sso-team-id` attribute is only returned in Terraform Enterprise 202204-1 and later, or in HCP Terraform.
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name": "team-creation-test",
+ "sso-team-id": "cb265c8e41bddf3f9926b2cf3d190f0e1627daa4",
+ "organization-access": {
+ "manage-policies": false,
+ "manage-policy-overrides": false,
+ "manage-run-tasks": false,
+ "manage-vcs-settings": false,
+ "manage-agent-pools": false,
+ "manage-workspaces": true,
+ "manage-providers": false,
+ "manage-modules": false,
+ "manage-projects": false,
+ "read-projects": false,
+ "read-workspaces": true,
+ "manage-membership": false,
+ "manage-teams": false,
+ "manage-organization-access": false
+ },
+ "permissions": {
+ "can-update-membership": true,
+ "can-destroy": true,
+ "can-update-organization-access": true,
+ "can-update-api-token": true,
+ "can-update-visibility": true
+ },
+ "users-count": 0,
+ "visibility": "secret",
+ "allow-member-token-management": true
+ },
+ "id": "team-6p5jTwJQXwqZBncC",
+ "links": {
+ "self": "/api/v2/teams/team-6p5jTwJQXwqZBncC"
+ },
+ "relationships": {
+ "authentication-token": {
+ "meta": {}
+ },
+ "users": {
+ "data": []
+ }
+ },
+ "type": "teams"
+ }
+}
+```
+
+## Show Team Information
+
+`GET /teams/:team_id`
+
+| Parameter | Description |
+| ---------- | ------------------------ |
+| `:team_id` | The team ID to be shown. |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/teams/team-6p5jTwJQXwqZBncC
+```
+
+### Sample Response
+
+The `sso-team-id` attribute is only returned in Terraform Enterprise 202204-1 and later, or in HCP Terraform.
+
+```json
+{
+ "data": {
+ "id": "team-6p5jTwJQXwqZBncC",
+ "type": "teams",
+ "attributes": {
+ "name": "team-creation-test",
+ "sso-team-id": "cb265c8e41bddf3f9926b2cf3d190f0e1627daa4",
+ "users-count": 0,
+ "visibility": "organization",
+ "allow-member-token-management": true,
+ "permissions": {
+ "can-update-membership": true,
+ "can-destroy": true,
+ "can-update-organization-access": true,
+ "can-update-api-token": true,
+ "can-update-visibility": true
+ },
+ "organization-access": {
+ "manage-policies": true,
+ "manage-policy-overrides": false,
+ "manage-run-tasks": true,
+ "manage-workspaces": false,
+ "manage-vcs-settings": false,
+ "manage-agent-pools": false,
+ "manage-providers": false,
+ "manage-modules": false,
+ "manage-projects": false,
+ "read-projects": false,
+ "read-workspaces": false,
+ "manage-membership": false,
+ "manage-teams": false,
+ "manage-organization-access": false
+ }
+ },
+ "relationships": {
+ "users": {
+ "data": []
+ },
+ "authentication-token": {
+ "meta": {}
+ }
+ },
+ "links": {
+ "self": "/api/v2/teams/team-6p5jTwJQXwqZBncC"
+ }
+ }
+}
+```
+
+## Update a Team
+
+`PATCH /teams/:team_id`
+
+| Parameter | Description |
+| ---------- | -------------------------- |
+| `:team_id` | The team ID to be updated. |
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | -------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "teams"`) | Successfully created a team |
+| [400][] | [JSON API error object][] | Invalid `include` parameter |
+| [404][] | [JSON API error object][] | Team not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [500][] | [JSON API error object][] | Failure during team creation |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+-> **Note:** You cannot set `manage-workspaces` to `false` when setting `manage-projects` to `true`, since project permissions cascade down to workspaces. This is also the case for `read-workspaces` and `read-projects`. If `read-projects` is `true`, `read-workspaces` must be `true` as well.
+
+| Key path | Type | Default | Description |
+| --------------------------------------------- | ------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"teams"`. |
+| `data.attributes.name` | string | (previous value) | The name of the team, which can only include letters, numbers, `-`, and `_`. This will be used as an identifier and must be unique in the organization. |
+| `data.attributes.sso-team-id` | string | (previous value) | The unique identifier of the team from the SAML `MemberOf` attribute. Only available in Terraform Enterprise 202204-1 and later, or in HCP Terraform. |
+| `data.attributes.organization-access` | object | (previous value) | Settings for the team's organization access. This object can include the `manage-policies`, `manage-policy-overrides`, `manage-run-tasks`, `manage-workspaces`, `manage-vcs-settings`, `manage-agent-pools`, `manage-providers`, `manage-modules`, `manage-projects`, `read-projects`, `read-workspaces`, `manage-membership`, `manage-teams`, and `manage-organization-access` properties with boolean values. All properties default to `false`. |
+| `data.attributes.visibility` | string | (previous value) | The team's visibility. Must be `"secret"` or `"organization"` (visible). |
+| `data.attributes.allow-team-token-management` | boolean | (previous value) | The ability to enable and disable team token management for a team. Defaults to true. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "teams",
+ "attributes": {
+ "visibility": "organization",
+ "allow-member-token-management": true,
+ "organization-access": {
+ "manage-vcs-settings": true
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/teams/team-6p5jTwJQXwqZBncC
+```
+
+### Sample Response
+
+The `sso-team-id` attribute is only returned in Terraform Enterprise 202204-1 and later, or in HCP Terraform.
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name": "team-creation-test",
+ "sso-team-id": "cb265c8e41bddf3f9926b2cf3d190f0e1627daa4",
+ "organization-access": {
+ "manage-policies": false,
+ "manage-policy-overrides": false,
+ "manage-run-tasks": true,
+ "manage-vcs-settings": true,
+ "manage-agent-pools": false,
+ "manage-workspaces": true,
+ "manage-providers": false,
+ "manage-modules": false,
+ "manage-projects": false,
+ "read-projects": false,
+ "read-workspaces": true,
+ "manage-membership": false,
+ "manage-teams": false,
+ "manage-organization-access": false
+ },
+ "visibility": "organization",
+ "allow-member-token-management": true,
+ "permissions": {
+ "can-update-membership": true,
+ "can-destroy": true,
+ "can-update-organization-access": true,
+ "can-update-api-token": true,
+ "can-update-visibility": true
+ },
+ "users-count": 0
+ },
+ "id": "team-6p5jTwJQXwqZBncC",
+ "links": {
+ "self": "/api/v2/teams/team-6p5jTwJQXwqZBncC"
+ },
+ "relationships": {
+ "authentication-token": {
+ "meta": {}
+ },
+ "users": {
+ "data": []
+ }
+ },
+ "type": "teams"
+ }
+}
+```
+
+## Delete a Team
+
+`DELETE /teams/:team_id`
+
+| Parameter | Description |
+| ---------- | -------------------------- |
+| `:team_id` | The team ID to be deleted. |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/teams/team-6p5jTwJQXwqZBncC
+```
+
+## Available Related Resources
+
+The GET endpoints above can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+- `users` (`string`) - Returns the full user record for every member of a team.
+- `organization-memberships` (`string`) - Returns the full organization membership record for every member of a team.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/user-tokens.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/user-tokens.mdx
new file mode 100644
index 0000000000..a26352ea06
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/user-tokens.mdx
@@ -0,0 +1,286 @@
+---
+page_title: /users/authentication-tokens API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/users/authentication-tokens` endpoint to
+ read, create, and destroy user-specific API tokens.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# User tokens API reference
+
+## List User Tokens
+
+`GET /users/:user_id/authentication-tokens`
+
+| Parameter | Description |
+| ---------- | ------------------- |
+| `:user_id` | The ID of the User. |
+
+Use the [Account API](/terraform/enterprise/api-docs/account) to find your own user ID.
+
+The objects returned by this endpoint only contain metadata, and do not include the secret text of any authentication tokens. A token is only shown upon creation, and cannot be recovered later.
+
+-> **Note:** You must access this endpoint with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens), and it will only return useful data for that token's user account.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "authentication-tokens"`) | The request was successful |
+| [200][] | Empty [JSON API document][] (no type) | User has no authentication tokens, or request was made by someone other than the user |
+| [404][] | [JSON API error object][] | User not found |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs. If neither pagination query parameters are provided, the endpoint will not be paginated and will return all results.
+
+| Parameter | Description |
+| -------------- | --------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 user tokens per page. |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/users/user-MA4GL63FmYRpSFxa/authentication-tokens
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "at-QmATJea6aWj1xR2t",
+ "type": "authentication-tokens",
+ "attributes": {
+ "created-at": "2018-11-06T22:56:10.203Z",
+ "last-used-at": null,
+ "description": null,
+ "token": null,
+ "expired-at": null
+ },
+ "relationships": {
+ "created-by": {
+ "data": null
+ }
+ }
+ },
+ {
+ "id": "at-6yEmxNAhaoQLH1Da",
+ "type": "authentication-tokens",
+ "attributes": {
+ "created-at": "2018-11-25T22:31:30.624Z",
+ "last-used-at": "2018-11-26T20:27:54.931Z",
+ "description": "api",
+ "token": null,
+ "expired-at": "2023-04-06T12:00:00.000Z"
+ },
+ "relationships": {
+ "created-by": {
+ "data": {
+ "id": "user-MA4GL63FmYRpSFxa",
+ "type": "users"
+ }
+ }
+ }
+ }
+ ]
+}
+```
+
+## Show a User Token
+
+`GET /authentication-tokens/:id`
+
+| Parameter | Description |
+| --------- | ------------------------- |
+| `:id` | The ID of the User Token. |
+
+The objects returned by this endpoint only contain metadata, and do not include the secret text of any authentication tokens. A token is only shown upon creation, and cannot be recovered later.
+
+-> **Note:** You must access this endpoint with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens), and it will only return useful data for that token's user account.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------- | ------------------------------------------------------------ |
+| [200][] | [JSON API document][] (`type: "authentication-tokens"`) | The request was successful |
+| [404][] | [JSON API error object][] | User Token not found, or unauthorized to view the User Token |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/authentication-tokens/at-6yEmxNAhaoQLH1Da
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "at-6yEmxNAhaoQLH1Da",
+ "type": "authentication-tokens",
+ "attributes": {
+ "created-at": "2018-11-25T22:31:30.624Z",
+ "last-used-at": "2018-11-26T20:34:59.487Z",
+ "description": "api",
+ "token": null,
+ "expired-at": "2023-04-06T12:00:00.000Z"
+ },
+ "relationships": {
+ "created-by": {
+ "data": {
+ "id": "user-MA4GL63FmYRpSFxa",
+ "type": "users"
+ }
+ }
+ }
+ }
+}
+```
+
+## Create a User Token
+
+`POST /users/:user_id/authentication-tokens`
+
+| Parameter | Description |
+| ---------- | ------------------- |
+| `:user_id` | The ID of the User. |
+
+Use the [Account API](/terraform/enterprise/api-docs/account) to find your own user ID.
+
+This endpoint returns the secret text of the created authentication token. A token is only shown upon creation, and cannot be recovered later.
+
+-> **Note:** You must access this endpoint with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens), and it will only create new tokens for that token's user account.
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------------------- | -------------------------------------------------------------- |
+| [201][] | [JSON API document][] (`type: "authentication-tokens"`) | The request was successful |
+| [404][] | [JSON API error object][] | User not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Malformed request body (missing attributes, wrong types, etc.) |
+| [500][] | [JSON API error object][] | Failure during User Token creation |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------- | ------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"authentication-tokens"`. |
+| `data.attributes.description` | string | | The description for the User Token. |
+| `data.attributes.expired-at` | string | `null` | The UTC date and time that the User Token will expire, in ISO 8601 format. If omitted or set to `null` the token will never expire. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "authentication-tokens",
+ "attributes": {
+ "description":"api",
+ "expired-at": "2023-04-06T12:00:00.000Z"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/users/user-MA4GL63FmYRpSFxa/authentication-tokens
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "at-MKD1X3i4HS3AuD41",
+ "type": "authentication-tokens",
+ "attributes": {
+ "created-at": "2018-11-26T20:48:35.054Z",
+ "last-used-at": null,
+ "description": "api",
+ "token": "6tL24nM38M7XWQ.atlasv1.KmWckRfzeNmUVFNvpvwUEChKaLGznCSD6fPf3VPzqMMVzmSxFU0p2Ibzpo2h5eTGwPU",
+ "expired-at": "2023-04-06T12:00:00.000Z"
+ },
+ "relationships": {
+ "created-by": {
+ "data": {
+ "id": "user-MA4GL63FmYRpSFxa",
+ "type": "users"
+ }
+ }
+ }
+ }
+}
+```
+
+## Destroy a User Token
+
+`DELETE /authentication-tokens/:id`
+
+| Parameter | Description |
+| --------- | ------------------------------------ |
+| `:id` | The ID of the User Token to destroy. |
+
+-> **Note:** You must access this endpoint with a [user token](/terraform/enterprise/users-teams-organizations/users#api-tokens), and it will only delete tokens for that token's user account.
+
+| Status | Response | Reason |
+| ------- | ------------------------- | ------------------------------------------------------------ |
+| [204][] | Empty response | The User Token was successfully destroyed |
+| [404][] | [JSON API error object][] | User Token not found, or user unauthorized to perform action |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/authentication-tokens/at-6yEmxNAhaoQLH1Da
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/users.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/users.mdx
new file mode 100644
index 0000000000..4c8625e8c7
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/users.mdx
@@ -0,0 +1,102 @@
+---
+page_title: /users API reference for Terraform Enterprise
+description: Use the Terraform Enterprise API's `/users` endpoint to read a user's details.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Users API reference
+
+HCP Terraform's user objects do not contain any identifying information about a user, other than their HCP Terraform username and avatar image; they are intended for displaying names and avatars in contexts that refer to a user by ID, like lists of team members or the details of a run. Most of these contexts can already include user objects via an `?include` parameter, so you shouldn't usually need to make a separate call to this endpoint.
+
+## Show a User
+
+Shows details for a given user.
+
+`GET /users/:user_id`
+
+| Parameter | Description |
+| ---------- | --------------------------- |
+| `:user_id` | The ID of the desired user. |
+
+To find the ID that corresponds to a given username, you can request a [team object](/terraform/enterprise/api-docs/teams) for a team that user belongs to, specify `?include=users` in the request, and look for the user's name in the included list of user objects.
+
+| Status | Response | Reason |
+| ------- | --------------------------------------- | ------------------------------------------------ |
+| [200][] | [JSON API document][] (`type: "users"`) | The request was successful |
+| [401][] | [JSON API error object][] | Unauthorized |
+| [404][] | [JSON API error object][] | User not found, or unauthorized to view the user |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/users/user-MA4GL63FmYRpSFxa
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "user-MA4GL63FmYRpSFxa",
+ "type": "users",
+ "attributes": {
+ "username": "admin",
+ "is-service-account": false,
+ "auth-method": "hcp_sso",
+ "avatar-url": "https://www.gravatar.com/avatar/fa1f0c9364253d351bf1c7f5c534cd40?s=100&d=mm",
+ "v2-only": true,
+ "permissions": {
+ "can-create-organizations": false,
+ "can-change-email": true,
+ "can-change-username": true
+ }
+ },
+ "relationships": {
+ "authentication-tokens": {
+ "links": {
+ "related": "/api/v2/users/user-MA4GL63FmYRpSFxa/authentication-tokens"
+ }
+ }
+ },
+ "links": {
+ "self": "/api/v2/users/user-MA4GL63FmYRpSFxa"
+ }
+ }
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/variable-sets.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/variable-sets.mdx
new file mode 100644
index 0000000000..8bca544f1a
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/variable-sets.mdx
@@ -0,0 +1,1018 @@
+---
+page_title: /varsets API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/varsets` endpoint to read, create,
+ update, and delete variable sets, and apply or remove variable sets from
+ workspaces and projects.
+source: terraform-docs-common
+---
+
+# Variable sets API reference
+
+A [variable set](/terraform/enterprise/workspaces/variables#scope) is a resource that allows you to reuse the same variables across multiple workspaces and projects. For example, you could define a variable set of provider credentials and automatically apply it to a selection of workspaces, all workspaces in a project, or all workspaces in an organization.
+
+Projects and organizations can both own variable sets. The owner of a variable set can determine the precedence of that set. Refer to [**Manage variable sets**](/terraform/enterprise/workspaces/variables/managing-variables#permissions) for more details on variable set permissions.
+
+To view the variables applied from a variable set on a particular workspace, you must have [**Read** variables permission](/terraform/enterprise/users-teams-organizations/permissions#general-workspace-permissions) on that workspace.
+
+## Create a Variable Set
+
+`POST organizations/:organization_name/varsets`
+
+| Parameter | Description |
+| -------------------- | --------------------------------------------------------- |
+| `:organization_name` | The name of the organization the variable set belongs to. |
+
+### Request Body
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------------- | ------- | ------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.attributes.name` | string | | The name of the variable set. |
+| `data.attributes.description` | string | `""` | Text displayed in the UI to contextualize the variable set and its purpose. |
+| `data.attributes.global` | boolean | `false` | When true, HCP Terraform automatically applies the variable set to all current and future workspaces in the organization. |
+| `data.attributes.priority` | boolean | `false` | When true, the variables in the set override any other variable values with a more specific scope, including values set on the command line. |
+| `data.relationships.workspaces` | array | `[]` | Array of references to workspaces that the variable set should be assigned to. |
+| `data.relationships.projects` | array | `[]` | Array of references to projects that the variable set should be assigned to. |
+| `data.relationships.vars` | array | `[]` | Array of complete variable definitions that comprise the variable set. |
+| `data.relationships.parent` | object | Organization that the variable set belongs to | The parent that owns this variable set. If the parent is a project, `data.attributes.global` must be `false`. |
+| `data.relationships.parent.data.type` | string | `"organizations"` | The resource type of the parent that owns this variable set. Valid values are `organizations` or `projects`. |
+| `data.relationships.parent.data.id` | string | Name of organization that the variable set belongs to. | The ID of the parent that owns the variable set. For organizations, use name instead of ID. |
+
+HCP Terraform does not allow different global variable sets to contain conflicting variables with the same name and type. You will receive a 422 response if you try to create a global variable set that contains conflicting variables.
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------- |
+| [200][] | [JSON API document][] | Successfully added variable set |
+| [404][] | [JSON API error object][] | Organization not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Problem with payload or request; details provided in the error object |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "varsets",
+ "attributes": {
+ "name": "MyVarset",
+ "description": "Full of vars and such for mass reuse",
+ "global": false,
+ "priority": false,
+ },
+ "relationships": {
+ "workspaces": {
+ "data": [
+ {
+ "id": "ws-z6YvbWEYoE168kpq",
+ "type": "workspaces"
+ }
+ ]
+ },
+ "vars": {
+ "data": [
+ {
+ "type": "vars",
+ "attributes": {
+ "key": "c2e4612d993c18e42ef30405ea7d0e9ae",
+ "value": "8676328808c5bf56ac5c8c0def3b7071",
+ "category": "terraform"
+ }
+ }
+ ]
+ },
+ "parent": {
+ "data": {
+ "id": "prj-kFjgSzcZSr5c3imE",
+ "type": "projects"
+ }
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/varsets
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "varset-kjkN545LH2Sfercv",
+ "type": "varsets",
+ "attributes": {
+ "name": "MyVarset",
+ "description": "Full of vars and such for mass reuse",
+ "global": false,
+ "priority": false,
+ },
+ "relationships": {
+ "workspaces": {
+ "data": [
+ {
+ "id": "ws-z6YvbWEYoE168kpq",
+ "type": "workspaces"
+ }
+ ]
+ },
+ "projects": {
+ "data": [
+ {
+ "id": "prj-kFjgSzcZSr5c3imE",
+ "type": "projects"
+ }
+ ]
+ },
+ "vars": {
+ "data": [
+ {
+ "id": "var-Nh0doz0hzj9hrm34qq",
+ "type": "vars",
+ "attributes": {
+ "key": "c2e4612d993c18e42ef30405ea7d0e9ae",
+ "value": "8676328808c5bf56ac5c8c0def3b7071",
+ "category": "terraform"
+ }
+ }
+ ]
+ },
+ "parent": {
+ "data": {
+ "id": "prj-kFjgSzcZSr5c3imE",
+ "type": "projects"
+ }
+ }
+ }
+ }
+}
+```
+
+## Update a Variable Set
+
+`PUT/PATCH varsets/:varset_id`
+
+| Parameter | Description |
+| ------------ | ------------------- |
+| `:varset_id` | The variable set ID |
+
+HCP Terraform does not allow global variable sets to contain conflicting variables with the same name and type. You will receive a 422 response if you try to create a global variable set that contains conflicting variables.
+
+HCP Terraform does not allow you to change the parent organization or project of a variable set. Instead, you must delete the variable set and recreate it in the desired organization or project.
+
+### Request Body
+
+| Key path | Type | Default | Description |
+| ------------------------------- | ------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.attributes.name` | string | | The name of the variable set. |
+| `data.attributes.description` | string | | Text displayed in the UI to contextualize the variable set and its purpose. |
+| `data.attributes.global` | boolean | | When true, HCP Terraform automatically applies the variable set to all current and future workspaces in the organization. |
+| `data.attributes.priority` | boolean | `false` | When true, the variables in the set override any other variable values set with a more specific scope, including values set on the command line. |
+| `data.relationships.workspaces` | array | | **Optional** Array of references to workspaces that the variable set should be assigned to. Sending an empty array clears all workspace assignments. |
+| `data.relationships.projects` | array | | **Optional** Array of references to projects that the variable set should be assigned to. Sending an empty array clears all project assignments. |
+| `data.relationships.vars` | array | | **Optional** Array of complete variable definitions to add to the variable set. |
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | ------------------------------------------------------------------------------ |
+| [200][] | [JSON API document][] | Successfully updated variable set |
+| [404][] | [JSON API error object][] | Organization or variable set not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Problem with payload or request; details provided in the error object |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "varsets",
+ "attributes": {
+ "name": "MyVarset",
+ "description": "Full of vars and such for mass reuse. Now global!",
+ "global": true,
+ "priority": true,
+ },
+ "relationships": {
+ "workspaces": {
+ "data": [
+ {
+ "id": "ws-FRFwkYoUoGn1e34b",
+ "type": "workspaces"
+ }
+ ]
+ },
+ "projects": {
+ "data": [
+ {
+ "id": "prj-kFjgSzcZSr5c3imE",
+ "type": "projects"
+ }
+ ]
+ },
+ "vars": {
+ "data": [
+ {
+ "type": "vars",
+ "attributes": {
+ "key": "c2e4612d993c18e42ef30405ea7d0e9ae",
+ "value": "8676328808c5bf56ac5c8c0def3b7071",
+ "category": "terraform"
+ }
+ }
+ ]
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/varsets/varset-kjkN545LH2Sfercv
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "varset-kjkN545LH2Sfercv",
+ "type": "varsets",
+ "attributes": {
+ "name": "MyVarset",
+ "description": "Full of vars and such for mass reuse. Now global!",
+ "global": true,
+ "priority": true
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations"
+ }
+ },
+ "workspaces": {
+ "data": [
+ {
+ "id": "ws-FRFwkYoUoGn1e34b",
+ "type": "workspaces"
+ }
+ ]
+ },
+ "projects": {
+ "data": [
+ {
+ "id": "prj-kFjgSzcZSr5c3imE",
+ "type": "projects"
+ }
+ ]
+ },
+ "vars": {
+ "data": [
+ {
+ "id": "var-Nh0doz0hzj9hrm34qq",
+ "type": "vars",
+ "attributes": {
+ "key": "c2e4612d993c18e42ef30405ea7d0e9ae",
+ "value": "8676328808c5bf56ac5c8c0def3b7071",
+ "category": "terraform"
+ }
+ }
+ ]
+ },
+ "parent": {
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations"
+ }
+ }
+ }
+ }
+}
+```
+
+## Delete a Variable Set
+
+`DELETE varsets/:varset_id`
+
+| Parameter | Description |
+| ------------ | ------------------- |
+| `:varset_id` | The variable set ID |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/varsets/varset-kjkN545LH2Sfercv
+```
+
+On success, this endpoint responds with no content.
+
+## Show Variable Set
+
+Fetch details about the specified variable set.
+
+`GET varsets/:varset_id`
+
+| Parameter | Description |
+| ------------ | ------------------- |
+| `:varset_id` | The variable set ID |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request GET \
+ https://app.terraform.io/api/v2/varsets/varset-kjkN545LH2Sfercv
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id": "varset-kjkN545LH2Sfercv",
+ "type": "varsets",
+ "attributes": {
+ "name": "MyVarset",
+ "description": "Full of vars and such for mass reuse",
+ "global": false,
+ "priority": false,
+ "updated-at": "2023-03-06T21:48:33.588Z",
+ "var-count": 5,
+ "workspace-count": 2,
+ "project-count": 2
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations"
+ }
+ },
+ "vars": {
+ "data": [
+ {
+ "id": "var-mMqadSCxZtrQJAv8",
+ "type": "vars"
+ },
+ {
+ "id": "var-hFxUUKSk35QMsRVH",
+ "type": "vars"
+ },
+ {
+ "id": "var-fkd6N48tXRmoaPxH",
+ "type": "vars"
+ },
+ {
+ "id": "var-abcbBMBMWcZw3WiV",
+ "type": "vars"
+ },
+ {
+ "id": "var-vqvRKK1ZoqQCiMwN",
+ "type": "vars"
+ }
+ ]
+ },
+ "workspaces": {
+ "data": [
+ {
+ "id": "ws-UohFdKAHUGsQ8Dtf",
+ "type": "workspaces"
+ },
+ {
+ "id": "ws-XhGhaaCrsx9ATson",
+ "type": "workspaces"
+ }
+ ]
+ },
+ "projects": {
+ "data": [
+ {
+ "id": "prj-1JMwvPHFsdpsPhnt",
+ "type": "projects"
+ },
+ {
+ "id": "prj-SLDGqbYqELXE1obp",
+ "type": "projects"
+ }
+ ]
+ },
+ "parent": {
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations"
+ }
+ }
+ }
+ }
+}
+```
+
+## List Variable Sets
+
+List all variable sets for an organization.
+
+`GET organizations/:organization_name/varsets`
+
+| Parameter | Description |
+| -------------------- | -------------------------------------------------------- |
+| `:organization_name` | The name of the organization the variable sets belong to |
+
+List all variable sets for a project. This includes global variable sets from the project's organization.
+
+`GET projects/:project_id/varsets`
+
+| Parameter | Description |
+| ------------- | -------------- |
+| `:project_id` | The project ID |
+
+List all variable sets for a workspace. This includes global variable sets from the workspace's organization and variable sets
+attached to the project this workspace is contained within.
+
+`GET workspaces/:workspace_id/varsets`
+
+| Parameter | Description |
+| --------------- | ---------------- |
+| `:workspace_id` | The workspace ID |
+
+### Query Parameters
+
+All list endpoints support pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters) and searching with the `q` parameter. Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | -------------------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint returns the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint returns 20 varsets per page. |
+| `q` | **Optional.** A search query string. You can search for a variable set using its name. |
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "varset-kjkN545LH2Sfercv",
+ "type": "varsets",
+ "attributes": {
+ "name": "MyVarset",
+ "description": "Full of vars and such for mass reuse",
+ "global": false,
+ "priority": false,
+ "updated-at": "2023-03-06T21:48:33.588Z",
+ "var-count": 5,
+ "workspace-count": 2,
+ "project-count": 2
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations"
+ }
+ },
+ "vars": {
+ "data": [
+ {
+ "id": "var-mMqadSCxZtrQJAv8",
+ "type": "vars"
+ },
+ {
+ "id": "var-hFxUUKSk35QMsRVH",
+ "type": "vars"
+ },
+ {
+ "id": "var-fkd6N48tXRmoaPxH",
+ "type": "vars"
+ },
+ {
+ "id": "var-abcbBMBMWcZw3WiV",
+ "type": "vars"
+ },
+ {
+ "id": "var-vqvRKK1ZoqQCiMwN",
+ "type": "vars"
+ }
+ ]
+ },
+ "workspaces": {
+ "data": [
+ {
+ "id": "ws-UohFdKAHUGsQ8Dtf",
+ "type": "workspaces"
+ },
+ {
+ "id": "ws-XhGhaaCrsx9ATson",
+ "type": "workspaces"
+ }
+ ]
+ },
+ "projects": {
+ "data": [
+ {
+ "id": "prj-1JMwvPHFsdpsPhnt",
+ "type": "projects"
+ },
+ {
+ "id": "prj-SLDGqbYqELXE1obp",
+ "type": "projects"
+ }
+ ]
+ },
+ "parent": {
+ "data": {
+ "id": "hashicorp",
+ "type": "organizations"
+ }
+ }
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/organizations/hashicorp/varsets?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/organizations/hashicorp/varsets?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/organizations/hashicorp/varsets?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "page-size": 20,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 1
+ }
+ }
+}
+```
+
+### Variable Relationships
+
+## Add Variable
+
+`POST varsets/:varset_external_id/relationships/vars`
+
+| Parameter | Description |
+| ------------ | ------------------- |
+| `:varset_id` | The variable set ID |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------- | ------ | ------- | --------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"vars"`. |
+| `data.attributes.key` | string | | The name of the variable. |
+| `data.attributes.value` | string | `""` | The value of the variable. |
+| `data.attributes.description` | string | | The description of the variable. |
+| `data.attributes.category` | string | | Whether this is a Terraform or environment variable. Valid values are `"terraform"` or `"env"`. |
+| `data.attributes.hcl` | bool | `false` | Whether to evaluate the value of the variable as a string of HCL code. Has no effect for environment variables. |
+| `data.attributes.sensitive` | bool | `false` | Whether the value is sensitive. If true, variable is not visible in the UI. |
+
+HCP Terraform does not allow different global variable sets to contain conflicting variables with the same name and type. You will receive a 422 response if you try to add a conflicting variable to a global variable set.
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------- |
+| [200][] | [JSON API document][] | Successfully added variable to variable set |
+| [404][] | [JSON API error object][] | Variable set not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Problem with payload or request; details provided in the error object |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "vars",
+ "attributes": {
+ "key": "g6e45ae7564a17e81ef62fd1c7fa86138",
+ "value": "61e400d5ccffb3782f215344481e6c82",
+ "description": "cheeeese",
+ "sensitive": false,
+ "category": "terraform",
+ "hcl": false
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/varsets/varset-4q8f7H0NHG733bBH/relationships/vars
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id":"var-EavQ1LztoRTQHSNT",
+ "type": "vars",
+ "attributes": {
+ "key": "g6e45ae7564a17e81ef62fd1c7fa86138",
+ "value": "61e400d5ccffb3782f215344481e6c82",
+ "description": "cheeeese",
+ "sensitive": false,
+ "category": "terraform",
+ "hcl": false
+ }
+ }
+}
+```
+
+## Update a Variable in a Variable Set
+
+`PATCH varsets/:varset_id/relationships/vars/:var_id`
+
+| Parameter | Description |
+| ------------ | -------------------------------- |
+| `:varset_id` | The variable set ID |
+| `:var_id` | The ID of the variable to delete |
+
+HCP Terraform does not allow different global variable sets to contain conflicting variables with the same name and type. You will receive a 422 response if you try to add a conflicting variable to a global variable set.
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------- |
+| [200][] | [JSON API document][] | Successfully updated variable for variable set |
+| [404][] | [JSON API error object][] | Variable set not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Problem with payload or request; details provided in the error object |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type": "vars",
+ "attributes": {
+ "key": "g6e45ae7564a17e81ef62fd1c7fa86138",
+ "value": "61e400d5ccffb3782f215344481e6c82",
+ "description": "new cheeeese",
+ "sensitive": false,
+ "category": "terraform",
+ "hcl": false
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/varsets/varset-4q8f7H0NHG733bBH/relationships/vars/var-EavQ1LztoRTQHSNT
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id":"var-EavQ1LztoRTQHSNT",
+ "type": "vars",
+ "attributes": {
+ "key": "g6e45ae7564a17e81ef62fd1c7fa86138",
+ "value": "61e400d5ccffb3782f215344481e6c82",
+ "description": "new cheeeese",
+ "sensitive": false,
+ "category": "terraform",
+ "hcl": false
+ }
+ }
+}
+```
+
+## Delete a Variable in a Variable Set
+
+`DELETE varsets/:varset_id/relationships/vars/:var_id`
+
+| Parameter | Description |
+| ------------ | -------------------------------- |
+| `:varset_id` | The variable set ID |
+| `:var_id` | The ID of the variable to delete |
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/varsets/varset-4q8f7H0NHG733bBH/relationships/vars/var-EavQ1LztoRTQHSNT
+```
+
+On success, this endpoint responds with no content.
+
+## List Variables in a Variable Set
+
+`GET varsets/:varset_id/relationships/vars`
+
+| Parameter | Description |
+| ------------ | ------------------- |
+| `:varset_id` | The variable set ID |
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "var-134r1k34nj5kjn",
+ "type": "vars",
+ "attributes": {
+ "key": "F115037558b045dd82da40b089e5db745",
+ "value": "1754288480dfd3060e2c37890422905f",
+ "sensitive": false,
+ "category": "terraform",
+ "hcl": false,
+ "created-at": "2021-10-29T18:54:29.379Z",
+ "description": ""
+ },
+ "relationships": {
+ "varset": {
+ "data": {
+ "id": "varset-992UMULdeDuebi1x",
+ "type": "varsets"
+ },
+ "links": { "related": "/api/v2/varsets/1" }
+ }
+ },
+ "links": { "self": "/api/v2/vars/var-BEPU9NjPVCiCfrXj" }
+ }
+ ],
+ "links": {
+ "self": "app.terraform.io/app/varsets/varset-992UMULdeDuebi1x/vars",
+ "first": "app.terraform.io/app/varsets/varset-992UMULdeDuebi1x/vars?page=1",
+ "prev": null,
+ "next": null,
+ "last": "app.terraform.io/app/varsets/varset-992UMULdeDuebi1x/vars?page=1"
+ }
+}
+```
+
+## Apply Variable Set to Workspaces
+
+Accepts a list of workspaces to add the variable set to.
+
+`POST varsets/:varset_id/relationships/workspaces`
+
+| Parameter | Description |
+| ------------ | ------------------- |
+| `:varset_id` | The variable set ID |
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------- | ------ | ------- | -------------------------------------------------- |
+| `data[].type` | string | | Must be `"workspaces"` |
+| `data[].id` | string | | The id of the workspace to add the variable set to |
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------- |
+| [204][] | | Successfully added variable set to the requested workspaces |
+| [404][] | [JSON API error object][] | Variable set not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Problem with payload or request; details provided in the error object |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "type": "workspaces",
+ "id": "ws-YwfuBJZkdai4xj9w"
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/varsets/varset-kjkN545LH2Sfercv/relationships/workspaces
+```
+
+## Remove a Variable Set from Workspaces
+
+Accepts a list of workspaces to remove the variable set from.
+
+`DELETE varsets/:varset_id/relationships/workspaces`
+
+| Parameter | Description |
+| ------------ | ------------------- |
+| `:varset_id` | The variable set ID |
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------- | ------ | ------- | ------------------------------------------------------- |
+| `data[].type` | string | | Must be `"workspaces"` |
+| `data[].id` | string | | The id of the workspace to delete the variable set from |
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------- |
+| [204][] | | Successfully removed variable set from the requested workspaces |
+| [404][] | [JSON API error object][] | Variable set not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Problem with payload or request; details provided in the error object |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "type": "workspaces",
+ "id": "ws-YwfuBJZkdai4xj9w"
+ },
+ {
+ "type": "workspaces",
+ "id": "ws-YwfuBJZkdai4xj9w"
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/varsets/varset-kjkN545LH2Sfercv/relationships/workspaces
+```
+
+## Apply Variable Set to Projects
+
+Accepts a list of projects to add the variable set to. When you apply a variable set to a project, all the workspaces in that project will have the variable set applied to them.
+
+`POST varsets/:varset_id/relationships/projects`
+
+| Parameter | Description |
+| ------------ | ------------------- |
+| `:varset_id` | The variable set ID |
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------- | ------ | ------- | ------------------------------------------------ |
+| `data[].type` | string | | Must be `"projects"` |
+| `data[].id` | string | | The id of the project to add the variable set to |
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------- |
+| [204][] | | Successfully added variable set to the requested projects |
+| [404][] | [JSON API error object][] | Variable set not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Problem with payload or request; details provided in the error object |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "type": "projects",
+ "id": "prj-YwfuBJZkdai4xj9w"
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/varsets/varset-kjkN545LH2Sfercv/relationships/projects
+```
+
+## Remove a Variable Set from Projects
+
+Accepts a list of projects to remove the variable set from.
+
+`DELETE varsets/:varset_id/relationships/projects`
+
+| Parameter | Description |
+| ------------ | ------------------- |
+| `:varset_id` | The variable set ID |
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------- | ------ | ------- | ----------------------------------------------------- |
+| `data[].type` | string | | Must be `"projects"` |
+| `data[].id` | string | | The id of the project to delete the variable set from |
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------- |
+| [204][] | | Successfully removed variable set from the requested projects |
+| [404][] | [JSON API error object][] | Variable set not found or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Problem with payload or request; details provided in the error object |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "type": "projects",
+ "id": "prj-YwfuBJZkdai4xj9w"
+ },
+ {
+ "type": "projects",
+ "id": "prj-lkjasdfiojwerlkj"
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/varsets/varset-kjkN545LH2Sfercv/relationships/projects
+```
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[json api document]: /terraform/enterprise/api-docs#json-api-documents
+
+[json api error object]: https://jsonapi.org/format/#error-objects
+
+## Available Related Resources
+
+The GET endpoints above can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+| Resource Name | Description |
+| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `vars` | Show each variable in a variable set and all of their attributes including `id`, `key`, `value`, `sensitive`, `category`, `hcl`, `created_at`, and `description`. |
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/variables.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/variables.mdx
new file mode 100644
index 0000000000..987dca3556
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/variables.mdx
@@ -0,0 +1,307 @@
+---
+page_title: /vars API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/vars` endpoint to manage
+ organization-level variables. Learn how to read, create, update, and delete
+ variables using the API.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Variables API reference
+
+~> **Important**: The Variables API is **deprecated** and will be removed in a future release. All existing integrations with this API should transition to the [Workspace Variables API](/terraform/enterprise/api-docs/workspace-variables).
+
+This set of APIs covers create, update, list and delete operations on variables.
+
+## Create a Variable
+
+`POST /vars`
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ---------------------------------------- | ------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"vars"`. |
+| `data.attributes.key` | string | | The name of the variable. |
+| `data.attributes.value` | string | `""` | The value of the variable. |
+| `data.attributes.description` | string | | The description of the variable. |
+| `data.attributes.category` | string | | Whether this is a Terraform or environment variable. Valid values are `"terraform"` or `"env"`. |
+| `data.attributes.hcl` | bool | `false` | Whether to evaluate the value of the variable as a string of HCL code. Has no effect for environment variables. |
+| `data.attributes.sensitive` | bool | `false` | Whether the value is sensitive. If true then the variable is written once and not visible thereafter. |
+| `data.relationships.workspace.data.type` | string | | Must be `"workspaces"`. |
+| `data.relationships.workspace.data.id` | string | | The ID of the workspace that owns the variable. Obtain workspace IDs from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](/terraform/enterprise/api-docs/workspaces#show-workspace) endpoint. |
+
+**Deprecation warning**: The custom `filter` properties are replaced by JSON API `relationships` and will be removed from future versions of the API!
+
+| Key path | Type | Default | Description |
+| -------------------------- | ------ | ------- | ----------------------------------------------------- |
+| `filter.workspace.name` | string | | The name of the workspace that owns the variable. |
+| `filter.organization.name` | string | | The name of the organization that owns the workspace. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type":"vars",
+ "attributes": {
+ "key":"some_key",
+ "value":"some_value",
+ "description":"some description",
+ "category":"terraform",
+ "hcl":false,
+ "sensitive":false
+ },
+ "relationships": {
+ "workspace": {
+ "data": {
+ "id":"ws-4j8p6jX1w33MiDC7",
+ "type":"workspaces"
+ }
+ }
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/vars
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id":"var-EavQ1LztoRTQHSNT",
+ "type":"vars",
+ "attributes": {
+ "key":"some_key",
+ "value":"some_value",
+ "description":"some description",
+ "sensitive":false,
+ "category":"terraform",
+ "hcl":false
+ },
+ "relationships": {
+ "configurable": {
+ "data": {
+ "id":"ws-4j8p6jX1w33MiDC7",
+ "type":"workspaces"
+ },
+ "links": {
+ "related":"/api/v2/organizations/my-organization/workspaces/my-workspace"
+ }
+ }
+ },
+ "links": {
+ "self":"/api/v2/vars/var-EavQ1LztoRTQHSNT"
+ }
+ }
+}
+```
+
+## List Variables
+
+`GET /vars`
+
+### Query Parameters
+
+[These are standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| ---------------------------- | -------------------------------------------------------------------------- |
+| `filter[workspace][name]` | **Required** The name of one workspace to list variables for. |
+| `filter[organization][name]` | **Required** The name of the organization that owns the desired workspace. |
+
+These two parameters are optional but linked; if you include one, you must include both. Without a filter, this method lists variables for all workspaces where you have permission to read variables. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+"https://app.terraform.io/api/v2/vars?filter%5Borganization%5D%5Bname%5D=my-organization&filter%5Bworkspace%5D%5Bname%5D=my-workspace"
+# ?filter[organization][name]=my-organization&filter[workspace][name]=demo01
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id":"var-AD4pibb9nxo1468E",
+ "type":"vars","attributes": {
+ "key":"name",
+ "value":"hello",
+ "description":"some description",
+ "sensitive":false,
+ "category":"terraform",
+ "hcl":false
+ },
+ "relationships": {
+ "configurable": {
+ "data": {
+ "id":"ws-cZE9LERN3rGPRAmH",
+ "type":"workspaces"
+ },
+ "links": {
+ "related":"/api/v2/organizations/my-organization/workspaces/my-workspace"
+ }
+ }
+ },
+ "links": {
+ "self":"/api/v2/vars/var-AD4pibb9nxo1468E"
+ }
+ }
+ ]
+}
+```
+
+## Update Variables
+
+`PATCH /vars/:variable_id`
+
+| Parameter | Description |
+| -------------- | ------------------------------------- |
+| `:variable_id` | The ID of the variable to be updated. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------- | ------ | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"vars"`. |
+| `data.id` | string | | The ID of the variable to update. |
+| `data.attributes` | object | | New attributes for the variable. This object can include `key`, `value`, `description`, `category`, `hcl`, and `sensitive` properties, which are described above under [create a variable](#create-a-variable). All of these properties are optional; if omitted, a property will be left unchanged. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "id":"var-yRmifb4PJj7cLkMG",
+ "attributes": {
+ "key":"name",
+ "value":"mars",
+ "description": "new description",
+ "category":"terraform",
+ "hcl": false,
+ "sensitive": false
+ },
+ "type":"vars"
+ }
+}
+```
+
+### Sample Request
+
+```bash
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/vars/var-yRmifb4PJj7cLkMG
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id":"var-yRmifb4PJj7cLkMG",
+ "type":"vars",
+ "attributes": {
+ "key":"name",
+ "value":"mars",
+ "description":"new description",
+ "sensitive":false,
+ "category":"terraform",
+ "hcl":false
+ },
+ "relationships": {
+ "configurable": {
+ "data": {
+ "id":"ws-4j8p6jX1w33MiDC7",
+ "type":"workspaces"
+ },
+ "links": {
+ "related":"/api/v2/organizations/workspace-v2-06/workspaces/workspace-v2-06"
+ }
+ }
+ },
+ "links": {
+ "self":"/api/v2/vars/var-yRmifb4PJj7cLkMG"
+ }
+ }
+}
+```
+
+## Delete Variables
+
+`DELETE /vars/:variable_id`
+
+| Parameter | Description |
+| -------------- | ------------------------------------- |
+| `:variable_id` | The ID of the variable to be deleted. |
+
+### Sample Request
+
+```bash
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/vars/var-yRmifb4PJj7cLkMG
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/vcs-events.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/vcs-events.mdx
new file mode 100644
index 0000000000..7c97d1181d
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/vcs-events.mdx
@@ -0,0 +1,132 @@
+---
+page_title: /vcs-events API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/vcs-events` endpoint to list VCS-related
+ events within your organization.
+source: terraform-docs-common
+---
+
+# VCS events API reference
+
+-> **Note**: The VCS Events API is still in beta as support is being added for additional VCS providers. Currently only GitLab.com connections established after December 2020 are supported.
+
+VCS (version control system) events describe changes within your organization for VCS-related actions. Events are only stored for 10 days. If information about the [OAuth Client](/terraform/enterprise/api-docs/oauth-clients) or [OAuth Token](/terraform/enterprise/api-docs/oauth-tokens) are available at the time of the event, it will be logged with the event.
+
+## List VCS events
+
+This endpoint lists VCS events for an organization
+
+`GET /organizations/:organization_name/vcs-events`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:organization_name` | The name of the organization to list VCS events from. The organization must already exist in the system and the user must have permissions to manage VCS settings. |
+
+-> **Note:** Viewing VCS events is restricted to the owners team, teams with the "Manage VCS Settings", and the [organization API token](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens). ([More about permissions](/terraform/enterprise/users-teams-organizations/permissions).)
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 workspaces per page. |
+| `filter[from]` | **Optional.** Must be RFC3339 formatted and in UTC. If omitted, the endpoint will default to 10 days ago. |
+| `filter[to]` | **Optional.** Must be RFC3339 formatted and in UTC. If omitted, the endpoint will default to now. |
+| `filter[oauth_client_external_ids]` | **Optional.** Format as a comma-separated string. If omitted, the endpoint will return all events. |
+| `filter[levels]` | **Optional.** `info` and `error` are the only accepted values. If omitted, the endpoint will return both info and error events. |
+| `include` | **Optional.** Allows including related resource data. This endpoint only supports `oauth_client` as a value. Only the `name`, `service-provider`, and `id` will be returned on the OAuth Client object in the `included` block. |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/my-organization/vcs-events?filter%5Bfrom%5D=2021-02-02T14%3A09%3A00Z&filter%5Bto%5D=2021-02-12T14%3A09%3A59Z&filter%5Boauth_client_external_ids%5D=oc-hhTM7WNUUgbXJpkW&filter%5Blevels%5D=info&include=oauth_client
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "ve-DJpbEwZc98ZedHZG",
+ "type": "vcs-events",
+ "attributes": {
+ "created-at": "2021-02-09 20:07:49.686182 +0000 UTC",
+ "level": "info",
+ "message": "Loaded 11 repositories",
+ "organization-id": "org-SBVreZxVessAmCZG"
+ },
+ "relationships": {
+ "oauth-client": {
+ "data": {
+ "id": "oc-LePsVhHXhCM6jWf3",
+ "type": "oauth-clients"
+ },
+ "links": {
+ "related": "/api/v2/oauth-clients/oc-LePsVhHXhCM6jWf3"
+ }
+ },
+ "oauth-token": {
+ "data": {
+ "id": "ot-Ma2cs8tzjv3LYZHw",
+ "type": "oauth-tokens"
+ },
+ "links": {
+ "related": "/api/v2/oauth-tokens/ot-Ma2cs8tzjv3LYZHw"
+ }
+ }
+ }
+ }
+ ],
+ "included": [
+ {
+ "id": "oc-LePsVhHXhCM6jWf3",
+ "type": "oauth-clients",
+ "attributes": {
+ "name": "working",
+ "service-provider": "gitlab_hosted"
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ },
+ "links": {
+ "related": "/api/v2/organizations/my-organization"
+ }
+ },
+ "oauth-tokens": {
+ "data": [
+ {
+ "id": "ot-Ma2cs8tzjv3LYZHw",
+ "type": "oauth-tokens"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/organizations/my-organization/vcs-events?filter%5Bfrom%5D=2021-02-02T14%3A09%3A00Z\u0026filter%5Blevels%5D=info\u0026filter%5Boauth_client_external_ids%5D=oc-LePsVhHXhCM6jWf3\u0026filter%5Bto%5D=2021-02-12T14%3A09%3A59Z\u0026include=oauth_client\u0026organization_name=my-organization\u0026page%5Bnumber%5D=1\u0026page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/organizations/my-organization/vcs-events?filter%5Bfrom%5D=2021-02-02T14%3A09%3A00Z\u0026filter%5Blevels%5D=info\u0026filter%5Boauth_client_external_ids%5D=oc-LePsVhHXhCM6jWf3\u0026filter%5Bto%5D=2021-02-12T14%3A09%3A59Z\u0026include=oauth_client\u0026organization_name=my-organization\u0026page%5Bnumber%5D=1\u0026page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/organizations/my-organization/vcs-events?filter%5Bfrom%5D=2021-02-02T14%3A09%3A00Z\u0026filter%5Blevels%5D=info\u0026filter%5Boauth_client_external_ids%5D=oc-LePsVhHXhCM6jWf3\u0026filter%5Bto%5D=2021-02-12T14%3A09%3A59Z\u0026include=oauth_client\u0026organization_name=my-organization\u0026page%5Bnumber%5D=1\u0026page%5Bsize%5D=20"
+ },
+ "meta": {
+ "pagination": {
+ "current-page": 1,
+ "prev-page": null,
+ "next-page": null,
+ "total-pages": 1,
+ "total-count": 8
+ }
+ }
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/workspace-resources.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/workspace-resources.mdx
new file mode 100644
index 0000000000..9f53485fc2
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/workspace-resources.mdx
@@ -0,0 +1,126 @@
+---
+page_title: /workspaces/resources API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/workspaces/resources` endpoint to list
+ all of a workspace's resources.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Workspace resources API reference
+
+## List Workspace Resources
+
+`GET /workspaces/:workspace_id/resources`
+
+| Parameter | Description |
+| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:workspace_id` | The ID of the workspace to retrieve resources from. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [show workspace](/terraform/enterprise/api-docs/workspaces#show-workspace) endpoint. |
+
+| Status | Response | Reason |
+| ------- | ------------------------------------------- | ----------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "resources"`) | Request was successful. |
+| [404][] | [JSON API error object][] | Workspace not found or user unauthorized to perform action. |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | ----------------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 workspace resources per page. |
+
+### Permissions
+
+To list resources the user must have permission to read resources for the specified workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+### Sample Request
+
+```shell
+curl \
+ --request GET \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/workspaces/ws-DiTzUDRpjrArAfSS/resources
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id": "wsr-KNYb3Jj3JTBgoBFs",
+ "type": "resources",
+ "attributes": {
+ "address": "random_pet.animal",
+ "name": "animal",
+ "created-at": "2021-10-27",
+ "updated-at": "2021-10-27",
+ "module": "root",
+ "provider": "hashicorp/random",
+ "provider-type": "random_pet",
+ "modified-by-state-version-id": "sv-y4pjfGHkGUBAa9AX",
+ "name-index": null
+ }
+ },
+ {
+ "id": "wsr-kYsf5A3hQ1y9zFWq",
+ "type": "resources",
+ "attributes": {
+ "address": "random_pet.animal2",
+ "name": "animal2",
+ "created-at": "2021-10-27",
+ "updated-at": "2021-10-27",
+ "module": "root",
+ "provider": "hashicorp/random",
+ "provider-type": "random_pet",
+ "modified-by-state-version-id": "sv-y4pjfGHkGUBAa9AX",
+ "name-index": null
+ }
+ }
+ ],
+ "links": {
+ "self": "https://app.terraform.io/api/v2/workspaces/ws-DiTzUDRpjrArAfSS/resources?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "first": "https://app.terraform.io/api/v2/workspaces/ws-DiTzUDRpjrArAfSS/resources?page%5Bnumber%5D=1&page%5Bsize%5D=20",
+ "prev": null,
+ "next": null,
+ "last": "https://app.terraform.io/api/v2/workspaces/ws-DiTzUDRpjrArAfSS/resources?page%5Bnumber%5D=1&page%5Bsize%5D=20"
+ },
+ ...
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/workspace-variables.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/workspace-variables.mdx
new file mode 100644
index 0000000000..d3a92c657e
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/workspace-variables.mdx
@@ -0,0 +1,298 @@
+---
+page_title: /workspaces/vars API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's workspace `/workspaces/vars` endpoint to
+ manage workspace-specific variables. Read, create, update, and delete
+ workspace variables.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+# Workspace variables API reference
+
+This set of APIs covers create, update, list and delete operations on workspace variables.
+
+Viewing variables requires permission to read variables for their workspace. Creating, updating, and deleting variables requires permission to read and write variables for their workspace. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions))
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+## Create a Variable
+
+`POST /workspaces/:workspace_id/vars`
+
+| Parameter | Description |
+| --------------- | -------------------------------------------------- |
+| `:workspace_id` | The ID of the workspace to create the variable in. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------------------- | ------ | ------- | --------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"vars"`. |
+| `data.attributes.key` | string | | The name of the variable. |
+| `data.attributes.value` | string | `""` | The value of the variable. |
+| `data.attributes.description` | string | | The description of the variable. |
+| `data.attributes.category` | string | | Whether this is a Terraform or environment variable. Valid values are `"terraform"` or `"env"`. |
+| `data.attributes.hcl` | bool | `false` | Whether to evaluate the value of the variable as a string of HCL code. Has no effect for environment variables. |
+| `data.attributes.sensitive` | bool | `false` | Whether the value is sensitive. If true then the variable is written once and not visible thereafter. |
+
+**Deprecation warning**: The custom `filter` properties are replaced by JSON API `relationships` and will be removed from future versions of the API!
+
+| Key path | Type | Default | Description |
+| -------------------------- | ------ | ------- | ----------------------------------------------------- |
+| `filter.workspace.name` | string | | The name of the workspace that owns the variable. |
+| `filter.organization.name` | string | | The name of the organization that owns the workspace. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "type":"vars",
+ "attributes": {
+ "key":"some_key",
+ "value":"some_value",
+ "description":"some description",
+ "category":"terraform",
+ "hcl":false,
+ "sensitive":false
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell
+curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-4j8p6jX1w33MiDC7/vars
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id":"var-EavQ1LztoRTQHSNT",
+ "type":"vars",
+ "attributes": {
+ "key":"some_key",
+ "value":"some_value",
+ "description":"some description",
+ "sensitive":false,
+ "category":"terraform",
+ "hcl":false,
+ "version-id":"1aa07d63ea8ff4df941c94ca9ddfd5d2bd04"
+ },
+ "relationships": {
+ "configurable": {
+ "data": {
+ "id":"ws-4j8p6jX1w33MiDC7",
+ "type":"workspaces"
+ },
+ "links": {
+ "related":"/api/v2/organizations/my-organization/workspaces/my-workspace"
+ }
+ }
+ },
+ "links": {
+ "self":"/api/v2/workspaces/ws-4j8p6jX1w33MiDC7/vars/var-EavQ1LztoRTQHSNT"
+ }
+ }
+}
+```
+
+## List Variables
+
+`GET /workspaces/:workspace_id/vars`
+
+| Parameter | Description |
+| --------------- | ---------------------------------------------- |
+| `:workspace_id` | The ID of the workspace to list variables for. |
+
+### Sample Request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+"https://app.terraform.io/api/v2/workspaces/ws-cZE9LERN3rGPRAmH/vars"
+```
+
+### Sample Response
+
+```json
+{
+ "data": [
+ {
+ "id":"var-AD4pibb9nxo1468E",
+ "type":"vars","attributes": {
+ "key":"name",
+ "value":"hello",
+ "description":"some description",
+ "sensitive":false,
+ "category":"terraform",
+ "hcl":false,
+ "version-id":"1aa07d63ea8ff4df941c94ca9ddfd5d2bd04"
+ },
+ "relationships": {
+ "configurable": {
+ "data": {
+ "id":"ws-cZE9LERN3rGPRAmH",
+ "type":"workspaces"
+ },
+ "links": {
+ "related":"/api/v2/organizations/my-organization/workspaces/my-workspace"
+ }
+ }
+ },
+ "links": {
+ "self":"/api/v2/workspaces/ws-cZE9LERN3rGPRAmH/vars/var-AD4pibb9nxo1468E"
+ }
+ }
+ ]
+}
+```
+
+## Update Variables
+
+`PATCH /workspaces/:workspace_id/vars/:variable_id`
+
+| Parameter | Description |
+| --------------- | ----------------------------------------------- |
+| `:workspace_id` | The ID of the workspace that owns the variable. |
+| `:variable_id` | The ID of the variable to be updated. |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ----------------- | ------ | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"vars"`. |
+| `data.id` | string | | The ID of the variable to update. |
+| `data.attributes` | object | | New attributes for the variable. This object can include `key`, `value`, `description`, `category`, `hcl`, and `sensitive` properties, which are described above under [create a variable](#create-a-variable). All of these properties are optional; if omitted, a property will be left unchanged. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "id":"var-yRmifb4PJj7cLkMG",
+ "attributes": {
+ "key":"name",
+ "value":"mars",
+ "description":"some description",
+ "category":"terraform",
+ "hcl": false,
+ "sensitive": false
+ },
+ "type":"vars"
+ }
+}
+```
+
+### Sample Request
+
+```bash
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-4j8p6jX1w33MiDC7/vars/var-yRmifb4PJj7cLkMG
+```
+
+### Sample Response
+
+```json
+{
+ "data": {
+ "id":"var-yRmifb4PJj7cLkMG",
+ "type":"vars",
+ "attributes": {
+ "key":"name",
+ "value":"mars",
+ "description":"some description",
+ "sensitive":false,
+ "category":"terraform",
+ "hcl":false,
+ "version-id":"1aa07d63ea8ff4df941c94ca9ddfd5d2bd04"
+ },
+ "relationships": {
+ "configurable": {
+ "data": {
+ "id":"ws-4j8p6jX1w33MiDC7",
+ "type":"workspaces"
+ },
+ "links": {
+ "related":"/api/v2/organizations/workspace-v2-06/workspaces/workspace-v2-06"
+ }
+ }
+ },
+ "links": {
+ "self":"/api/v2/workspaces/ws-4j8p6jX1w33MiDC7/vars/var-yRmifb4PJj7cLkMG"
+ }
+ }
+}
+```
+
+## Delete Variables
+
+`DELETE /workspaces/:workspace_id/vars/:variable_id`
+
+| Parameter | Description |
+| --------------- | ----------------------------------------------- |
+| `:workspace_id` | The ID of the workspace that owns the variable. |
+| `:variable_id` | The ID of the variable to be deleted. |
+
+### Sample Request
+
+```bash
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/workspaces/ws-4j8p6jX1w33MiDC7/vars/var-yRmifb4PJj7cLkMG
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/workspaces.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/workspaces.mdx
new file mode 100644
index 0000000000..57e82778fd
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/api-docs/workspaces.mdx
@@ -0,0 +1,1686 @@
+---
+page_title: /workspaces API reference for Terraform Enterprise
+description: >-
+ Use the Terraform Enterprise API's `/workspaces` endpoint to read, create,
+ update, lock, unlock, and delete workspaces and manage SSH keys, tags, and
+ remote state consumers.
+source: terraform-docs-common
+---
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+[JSON API document]: /terraform/enterprise/api-docs#json-api-documents
+
+[JSON API error object]: https://jsonapi.org/format/#error-objects
+
+[speculative plans]: /terraform/enterprise/run/remote-operations#speculative-plans
+
+# Workspaces API reference
+
+This topic provides reference information about the workspaces AP. Workspaces represent running infrastructure managed by Terraform.
+
+## Overview
+
+The scope of the API includes the following endpoints:
+
+| Method | Path | Action |
+| -------- | ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `POST` | `/organizations/:organization_name/workspaces` | Call this endpoint to [create a workspace](#create-a-workspace). You can apply tags stored as key-value pairs when creating the workspace. |
+| `POST` | `/organizations/:organization_name/workspaces/:name/actions/safe-delete` | Call this endpoint to [safely delete a workspace](#safe-delete-a-workspace) by querying the organization and workspace names. |
+| `POST` | `/workspaces/:workspace_id/actions/safe-delete` | Call this endpoint [safely delete a workspace](#safe-delete-a-workspace) by querying the workspace ID. |
+| `POST` | `/workspaces/:workspace_id/actions/lock` | Call this endpoint to [lock a workspace](#lock-a-workspace). |
+| `POST` | `/workspaces/:workspace_id/actions/unlock` | Call this endpoint to [unlock a workspace](#unlock-a-workspace). |
+| `POST` | `/workspaces/:workspace_id/actions/force-unlock` | Call this endpoint to [force a workspace to unlock](#force-unlock-a-workspace). |
+| `POST` | `/workspaces/:workspace_id/relationships/remote-state-consumers` | Call this endpoint to [add remote state consumers](#get-remote-state-consumers). |
+| `POST` | `/workspaces/:workspace_id/relationships/tags` | Call this endpoint to [bind flat string tags to an existing workspace](#add-tags-to-a-workspace). |
+| `POST` | `/workspaces/:workspace_id/relationships/data-retention-policy` | Call this endpoint to [show the workspace data retention policy](#show-data-retention-policy). |
+| `GET` | `/organizations/:organization_name/workspaces` | Call this endpoint to [list existing workspaces](#list-workspaces). Each project in the response contains a link to `effective-tag-bindings` and `tag-bindings` collections. You can filter the response by tag keys and values using a query string parameter. |
+| `GET` | `/organizations/:organization_name/workspaces/:name` | Call this endpoint to [show workspace details](#show-workspace) by querying the organization and workspace names. |
+| `GET` | `/workspaces/:workspace_id` | Call this endpoint to [show workspace details](#show-workspace). |
+| `GET` | `/workspaces/:workspace_id/relationships/remote-state-consumers` | Call this endpoint to [list remote state consumers](#get-remote-state-consumers). |
+| `GET` | `/workspaces/:workspace_id/relationships/tags` | Call this endpoint to [list flat string workspace tags](#get-tags). |
+| `GET` | `/workspaces/:workspace_id/tag-bindings` | Call this endpoint to [list workspace key-value tags](#get-tags) bound directly to this workspace. |
+| `GET` | `/workspaces/:workspace_id/effective-tag-bindings` | Call this endpoint to [list all workspace key-value tags](#get-tags), including both those bound directly to the workspace as well as those inherited from the parent project. |
+| `GET` | `/workspaces/:workspace_id/relationships/data-retention-policy` | Call this endpoint to [show the workspace data retention policy](#show-data-retention-policy). |
+| `PATCH` | `/workspaces/:workspace_id/relationships/ssh-key` | Call this endpoint to manage SSH key assignments for workspaces. Refer to [Assign an SSH key to a workspace](#assign-an-ssh-key-to-a-workspace) and [Unassign an SSH key from a workspace](#unassign-an-ssh-key-from-a-workspace) for instructions. |
+| `PATCH` | `/workspaces/:workspace_id` | Call this endpoint to [update a workspace](#update-a-workspace). You can apply tags stored as key-value pairs when updating the workspace. |
+| `PATCH` | `/organizations/:organization_name/workspaces/:name` | Call this endpoint to [update a workspace](#update-a-workspace) by querying the organization and workspace names. |
+| `PATCH` | `/workspaces/:workspace_id/relationships/remote-state-consumers` | Call this endpoint to [replace remote state consumers](#replace-remote-state-consumers). |
+| `DELETE` | `/workspaces/:workspace_id/relationships/remote-state-consumers` | Call this endpoint to [delete remote state consumers](#delete-remote-state-consumers). |
+| `DELETE` | `/workspaces/:workspace_id/relationships/tags` | Call this endpoint to [delete flat string workspace tags](#remove-tags-from-workspace) from the workspace. |
+| `DELETE` | `/workspaces/:workspace_id/relationships/data-retention-policy` | Call this endpoint to [remove a workspace data retention policy](#remove-data-retention-policy). |
+| `DELETE` | `/workspaces/:workspace_id` | Call this endpoint to [force delete a workspace](#force-delete-a-workspace), which deletes the workspace without first checking for managed resources. |
+| `DELETE` | `/organizations/:organization_name/workspaces/:name` | Call this endpoint to [force delete a workspace](#force-delete-a-workspace), which deletes the workspace without first checking for managed resources, by querying the organization and workspace names. |
+
+## Requirements
+
+- You must be a member of a team with the **Read** permission enabled for Terraform runs to view workspaces.
+- You must be a member of a team with the **Admin** permissions enabled on the workspace to change settings and force-unlock it.
+- You must be a member of a team with the **Lock/unlock** permission enabled to lock and unlock the workspace.
+- You must meet one of the following requirements to create a workspace:
+ - Be the team owner
+ - Be on a team with the **Manage all workspaces** permission enabled
+ - Present an [organization API token](/terraform/enterprise/users-teams-organizations/api-tokens#organization-api-tokens) when calling the API.
+
+Refer to [Workspace Permissions](/terraform/enterprise/users-teams-organizations/permissions#workspace-permissions) for additional information.
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+## Create a Workspace
+
+Use the following endpoint to create a new workspace:
+
+`POST /organizations/:organization_name/workspaces`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:organization_name` | The name of the organization to create the workspace in. The organization must already exist in the system, and the user must have permissions to create new workspaces. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+By supplying the necessary attributes under a `vcs-repository` object, you can create a workspace that is configured against a VCS Repository.
+
+| Key path | Type | Default | Description |
+| ------------------------------------------------------- | --------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | none | Must be `"workspaces"`. |
+| `data.attributes.name` | string | none | The name of the workspace. Workspace names can only include letters, numbers, `-`, and `_`. The name a unique identifier n the organization. |
+| `data.attributes.agent-pool-id` | string | none | Required when `execution-mode` is set to `agent`. The ID of the agent pool belonging to the workspace's organization. This value must not be specified if `execution-mode` is set to `remote` or `local` or if `operations` is set to `true`. |
+| `data.attributes.allow-destroy-plan` | boolean | `true` | Whether destroy plans can be queued on the workspace. |
+| `data.attributes.assessments-enabled` | boolean | `false` | (previously `drift-detection`) Whether or not HCP Terraform performs health assessments for the workspace. May be overridden by the organization setting `assessments-enforced`. Only available for Plus tier organizations, in workspaces running Terraform version 0.15.4+ and operating in [Remote execution mode](/terraform/enterprise/workspaces/settings#execution-mode). |
+| `data.attributes.auto-apply` | boolean | `false` | Whether to automatically apply changes when a Terraform plan is successful in runs initiated by VCS, UI or CLI, [with some exceptions](/terraform/enterprise/workspaces/settings#auto-apply-and-manual-apply). |
+| `data.attributes.auto-apply-run-trigger` | boolean | `false` | Whether to automatically apply changes when a Terraform plan is successful in runs initiated by run triggers. |
+| `data.attributes.auto-destroy-at` | string | (nothing) | Timestamp when the next scheduled destroy run will occur, refer to [Scheduled Destroy](/terraform/enterprise/workspaces/settings/deletion#automatically-destroy). |
+| `data.attributes.auto-destroy-activity-duration` | string | (nothing) | Value and units for [automatically scheduled destroy runs based on workspace activity](/terraform/enterprise/workspaces/settings/deletion#automatically-destroy). Valid values are greater than 0 and four digits or less. Valid units are `d` and `h`. For example, to queue destroy runs after fourteen days of inactivity set `auto-destroy-activity-duration: "14d"`. |
+| `data.attributes.description` | string | (nothing) | A description for the workspace. |
+| `data.attributes.execution-mode` | string | (nothing) | Which [execution mode](/terraform/enterprise/workspaces/settings#execution-mode) to use. Valid values are `remote`, `local`, and `agent`. When set to `local`, the workspace will be used for state storage only. This value _must not_ be specified if `operations` is specified, and _must_ be specified if `setting-overwrites.execution-mode` is set to `true`. |
+| `data.attributes.file-triggers-enabled` | boolean | `true` | Whether to filter runs based on the changed files in a VCS push. If enabled, it uses either `trigger-prefixes` in conjunction with `working_directory` or `trigger-patterns` to describe the set of changed files that will start a run. If disabled, any push triggers a run. |
+| `data.attributes.global-remote-state` | boolean | `false` | Whether the workspace should allow all workspaces in the organization to [access its state data](/terraform/enterprise/workspaces/state) during runs. If `false`, then only specifically approved workspaces can access its state. Manage allowed workspaces using the [Remote State Consumers](/terraform/enterprise/api-docs/workspaces#get-remote-state-consumers) endpoints, documented later on this page. Terraform Enterprise admins can choose the default value for new workspaces if this attribute is omitted. |
+| `data.attributes.operations` | boolean | `true` | **DEPRECATED** Use `execution-mode` instead. Whether to use remote execution mode. When set to `false`, the workspace will be used for state storage only. This value must not be specified if `execution-mode` is specified. |
+| `data.attributes.queue-all-runs` | boolean | `false` | Whether runs should be queued immediately after workspace creation. When set to false, runs triggered by a VCS change will not be queued until at least one run is manually queued. |
+| `data.attributes.source-name` | string | none | A friendly name for the application or client creating this workspace. If set, this will be displayed on the workspace as "Created via ``". |
+| `data.attributes.source-url` | string | none | A URL for the application or client creating this workspace. This can be the URL of a related resource in another app, or a link to documentation or other info about the client. |
+| `data.attributes.speculative-enabled` | boolean | `true` | Whether this workspace allows automatic [speculative plans][]. Setting this to `false` prevents HCP Terraform from running plans on pull requests, which can improve security if the VCS repository is public or includes untrusted contributors. It doesn't prevent manual speculative plans via the CLI or the runs API. |
+| `data.attributes.terraform-version` | string | latest release | Specifies the version of Terraform to use for this workspace. You can specify an exact version or a [version constraint](/terraform/language/expressions/version-constraints) such as `~> 1.0.0`. If you specify a constraint, the workspace always uses the newest release that meets that constraint. If omitted when creating a workspace, this defaults to the latest released version. |
+| `data.attributes.trigger-patterns` | array | `[]` | List of glob patterns that describe the files HCP Terraform monitors for changes. Trigger patterns are always appended to the root directory of the repository. |
+| `data.attributes.trigger-prefixes` | array | `[]` | List of trigger prefixes that describe the paths HCP Terraform monitors for changes, in addition to the working directory. Trigger prefixes are always appended to the root directory of the repository. HCP Terraform starts a run when files are changed in any directory path matching the provided set of prefixes. |
+| `data.attributes.vcs-repo.branch` | string | repository's default branch | The repository branch that Terraform executes from. If omitted or submitted as an empty string, this defaults to the repository's default branch. |
+| `data.attributes.vcs-repo.identifier` | string | none | A reference to your VCS repository in the format :org/:repo where :org and :repo refer to the organization and repository in your VCS provider. The format for Azure DevOps is `:org/:project/_git/:repo`. |
+| `data.attributes.vcs-repo.ingress-submodules` | boolean | `false` | Whether submodules should be fetched when cloning the VCS repository. |
+| `data.attributes.vcs-repo.oauth-token-id` | string | none | Specifies the VCS OAuth connection and token. Call the [`oauth-tokens`](/terraform/enterprise/api-docs/oauth-tokens) endpoint to retrieve the OAuth ID. |
+| `data.attributes.vcs-repo.tags-regex` | string | none | A regular expression used to match Git tags. HCP Terraform triggers a run when this value is present and a VCS event occurs that contains a matching Git tag for the regular expression. |
+| `data.attributes.vcs-repo` | object | none | Settings for the workspace's VCS repository. If omitted, the workspace is created without a VCS repo. If included, you must specify at least the `oauth-token-id` and `identifier` keys. |
+| `data.attributes.working-directory` | string | (nothing) | A relative path that Terraform will execute within. This defaults to the root of your repository and is typically set to a subdirectory matching the environment when multiple environments exist within the same repository. |
+| `data.attributes.setting-overwrites` | object | none | The keys in this object are attributes that have organization-level defaults. Each attribute key stores a boolean value which is `true` by default. To overwrite the default inherited value, set an attribute's value to `false`. For example, to set `execution-mode` as the organization default, set `setting-overwrites.execution-mode` to `false`. |
+| `data.relationships` | object | none | Specifies a group of workspace associations. |
+| `data.relationships.project.data.id` | string | default project | The ID of the project to create the workspace in. If left blank, Terraform creates the workspace in the organization's default project. You must have permission to create workspaces in the project, either by organization-level permissions or team admin access to a specific project. |
+| `data.relationships.tag-bindings.data` | list of objects | none | Specifies a list of tags to attach to the workspace. |
+| `data.relationships.tag-bindings.data.type` | string | none | Must be `tag-bindings` for each object in the list. |
+| `data.relationships.tag-bindings.data.attributes.key` | string | none | Specifies the tag key for each object in the list. |
+| `data.relationships.tag-bindings.data.attributes.value` | string | none | Specifies the tag value for each object in the list. |
+
+### Sample Payload
+
+_Without a VCS repository_
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name": "workspace-1"
+ },
+ "type": "workspaces"
+ }
+}
+```
+
+_With Key/Value Tags_
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name": "workspace-1"
+ },
+ "type": "workspaces",
+ "relationships": {
+ "tag-bindings": {
+ {
+ "data": [{
+ "type": "tag-bindings",
+ "attributes": { "key": "env", "value": "test"}
+ }]
+ }
+ }
+ }
+ }
+}
+```
+
+_With a VCS repository_
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name": "workspace-2",
+ "terraform_version": "0.11.1",
+ "working-directory": "",
+ "vcs-repo": {
+ "identifier": "example/terraform-test-proj",
+ "oauth-token-id": "ot-hmAyP66qk2AMVdbJ",
+ "branch": "",
+ "tags-regex": null
+ }
+ },
+ "type": "workspaces"
+ }
+}
+```
+
+_Using Git Tags_
+
+HCP Terraform triggers a run when you push a Git tag that matches the regular expression (SemVer): `1.2.3`, `22.33.44`, etc.
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name": "workspace-3",
+ "terraform_version": "0.12.1",
+ "file-triggers-enabled": false,
+ "working-directory": "/networking",
+ "vcs-repo": {
+ "identifier": "example/terraform-test-proj-monorepo",
+ "oauth-token-id": "ot-hmAyP66qk2AMVdbJ",
+ "branch": "",
+ "tags-regex": "\d+.\d+.\d+"
+ }
+ },
+ "type": "workspaces"
+ }
+}
+```
+
+_For a monorepo using trigger prefixes_
+
+A run will be triggered in this workspace when changes are detected in any of the specified directories: `/networking`, `/modules`, or `/vendor`.
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name": "workspace-3",
+ "terraform_version": "0.12.1",
+ "file-triggers-enabled": true,
+ "trigger-prefixes": ["/modules", "/vendor"],
+ "working-directory": "/networking",
+ "vcs-repo": {
+ "identifier": "example/terraform-test-proj-monorepo",
+ "oauth-token-id": "ot-hmAyP66qk2AMVdbJ",
+ "branch": ""
+ },
+ "updated-at": "2017-11-29T19:18:09.976Z"
+ },
+ "type": "workspaces"
+ }
+}
+```
+
+_For a monorepo using trigger patterns_
+
+A run will be triggered in this workspace when HCP Terraform detects any of the following changes:
+
+- A file with the extension `tf` in any directory structure in which the last folder is named `networking` (e.g., `root/networking` and `root/module/networking`)
+- Any file changed in the folder `/base`, no subfolders are included
+- Any file changed in the folder `/submodule` and all of its subfolders
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name": "workspace-4",
+ "terraform_version": "1.2.2",
+ "file-triggers-enabled": true,
+ "trigger-patterns": ["/**/networking/*.tf", "/base/*", "/submodule/**/*"],
+ "vcs-repo": {
+ "identifier": "example/terraform-test-proj-monorepo",
+ "oauth-token-id": "ot-hmAyP66qk2AMVdbJ",
+ "branch": ""
+ },
+ "updated-at": "2022-06-09T19:18:09.976Z"
+ },
+ "type": "workspaces"
+ }
+}
+```
+
+_Using HCP Terraform agents_
+
+[HCP Terraform agents](/terraform/enterprise/api-docs/agents) allow HCP Terraform to communicate with isolated, private, or on-premises infrastructure.
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name":"workspace-1",
+ "execution-mode": "agent",
+ "agent-pool-id": "apool-ZjT6A7mVFm5WHT5a"
+ }
+ },
+ "type": "workspaces"
+}
+```
+
+_Using an organization default execution mode_
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name":"workspace-with-default",
+ "setting-overwrites": {
+ "execution-mode": false
+ }
+ }
+ },
+ "type": "workspaces"
+}
+
+```
+
+_With a project_
+
+```json
+{
+ "data": {
+ "type": "workspaces",
+ "attributes": {
+ "name": "workspace-in-project"
+ },
+ "relationships": {
+ "project": {
+ "data": {
+ "type": "projects",
+ "id": "prj-jT92VLSFpv8FwKtc"
+ }
+ }
+ }
+ }
+}
+```
+
+_With key-value tags_
+
+```json
+{
+ "data": {
+ "type": "workspaces",
+ "attributes": {
+ "name": "workspace-in-project"
+ }
+ }
+}
+```
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/workspaces
+```
+
+### Sample Response
+
+_Without a VCS repository_
+
+**Note:** The `assessments-enabled` property is only accepted by or returned from HCP Terraform.
+
+@include 'api-code-blocks/workspace.mdx'
+
+_With a VCS repository_
+
+@include 'api-code-blocks/workspace-with-vcs.mdx'
+
+_With a project_
+
+```json
+{
+ "data": {
+ "id": "ws-HRkJLSYWF97jucqQ",
+ "type": "workspaces",
+ "attributes": {
+ "allow-destroy-plan": true,
+ "auto-apply": false,
+ "auto-apply-run-trigger": false,
+ "auto-destroy-at": null,
+ "auto-destroy-activity-duration": null,
+ "created-at": "2022-12-05T20:57:13.829Z",
+ "environment": "default",
+ "locked": false,
+ "locked-reason": "",
+ "name": "workspace-in-project",
+ "queue-all-runs": false,
+ "speculative-enabled": true,
+ "structured-run-output-enabled": true,
+ "terraform-version": "1.3.5",
+ "working-directory": null,
+ "global-remote-state": true,
+ "updated-at": "2022-12-05T20:57:13.829Z",
+ "resource-count": 0,
+ "apply-duration-average": null,
+ "plan-duration-average": null,
+ "policy-check-failures": null,
+ "run-failures": null,
+ "workspace-kpis-runs-count": null,
+ "latest-change-at": "2022-12-05T20:57:13.829Z",
+ "operations": true,
+ "execution-mode": "remote",
+ "vcs-repo": null,
+ "vcs-repo-identifier": null,
+ "permissions": {
+ "can-update": true,
+ "can-destroy": true,
+ "can-queue-run": true,
+ "can-read-variable": true,
+ "can-update-variable": true,
+ "can-read-state-versions": true,
+ "can-read-state-outputs": true,
+ "can-create-state-versions": true,
+ "can-queue-apply": true,
+ "can-lock": true,
+ "can-unlock": true,
+ "can-force-unlock": true,
+ "can-read-settings": true,
+ "can-manage-tags": true,
+ "can-manage-run-tasks": false,
+ "can-force-delete": true,
+ "can-manage-assessments": true,
+ "can-read-assessment-results": true,
+ "can-queue-destroy": true
+ },
+ "actions": {
+ "is-destroyable": true
+ },
+ "description": null,
+ "file-triggers-enabled": true,
+ "trigger-prefixes": [],
+ "trigger-patterns": [],
+ "assessments-enabled": false,
+ "last-assessment-result-at": null,
+ "source": "tfe-api",
+ "source-name": null,
+ "source-url": null,
+ "tag-names": [],
+ "setting-overwrites": {
+ "execution-mode": false,
+ "agent-pool": false
+ }
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ },
+ "current-run": {
+ "data": null
+ },
+ "effective-tag-bindings": {
+ "links": {
+ "related": "/api/v2/workspaces/ws-HRkJLSYWF97jucqQ/effective-tag-bindings"
+ }
+ },
+ "latest-run": {
+ "data": null
+ },
+ "outputs": {
+ "data": []
+ },
+ "remote-state-consumers": {
+ "links": {
+ "related": "/api/v2/workspaces/ws-HRkJLSYWF97jucqQ/relationships/remote-state-consumers"
+ }
+ },
+ "current-state-version": {
+ "data": null
+ },
+ "current-configuration-version": {
+ "data": null
+ },
+ "agent-pool": {
+ "data": null
+ },
+ "readme": {
+ "data": null
+ },
+ "project": {
+ "data": {
+ "id": "prj-jT92VLSFpv8FwKtc",
+ "type": "projects"
+ }
+ },
+ "current-assessment-result": {
+ "data": null
+ },
+ "tag-bindings": {
+ "links": {
+ "related": "/api/v2/workspaces/ws-HRkJLSYWF97jucqQ/tag-bindings"
+ }
+ },
+ "vars": {
+ "data": []
+ },
+ },
+ "links": {
+ "self": "/api/v2/organizations/my-organization/workspaces/workspace-in-project"
+ }
+ }
+}
+```
+
+## Update a Workspace
+
+Use one of the following endpoint to update a workspace:
+
+- `PATCH /organizations/:organization_name/workspaces/:name`
+- `PATCH /workspaces/:workspace_id`
+
+| Parameter | Description |
+| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The ID of the workspace to update |
+| `:organization_name` | The name of the organization the workspace belongs to. |
+| `:name` | The name of the workspace to update. Workspace names are unique identifiers in the organization and can only include letters, numbers, `-`, and `_`. |
+
+### Request Body
+
+These PATCH endpoints require a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------------------------------------------------- | --------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data.type` | string | | Must be `"workspaces"`. |
+| `data.attributes.name` | string | (previous value) | A new name for the workspace, which can only include letters, numbers, `-`, and `_`. This will be used as an identifier and must be unique in the organization. **Warning:** Changing a workspace's name changes its URL in the API and UI. |
+| `data.attributes.agent-pool-id` | string | (previous value) | Required when `execution-mode` is set to `agent`. The ID of the agent pool belonging to the workspace's organization. This value must not be specified if `execution-mode` is set to `remote` or `local` or if `operations` is set to `true`. |
+| `data.attributes.allow-destroy-plan` | boolean | (previous value) | Whether destroy plans can be queued on the workspace. |
+| `data.attributes.assessments-enabled` | boolean | `false` | (previously `drift-detection`) Whether or not HCP Terraform performs health assessments for the workspace. May be overridden by the organization setting `assessments-enforced`. Only available for Plus tier organizations, in workspaces running Terraform version 0.15.4+ and operating in [Remote execution mode](/terraform/enterprise/workspaces/settings#execution-mode). |
+| `data.attributes.auto-apply` | boolean | (previous value) | Whether to automatically apply changes when a Terraform plan is successful in runs initiated by VCS, UI or CLI, [with some exceptions](/terraform/enterprise/workspaces/settings#auto-apply-and-manual-apply). |
+| `data.attributes.auto-apply-run-trigger` | boolean | (previous value) | Whether to automatically apply changes when a Terraform plan is successful in runs initiated by run triggers. |
+| `data.attributes.auto-destroy-at` | string | (previous value) | Timestamp when the next scheduled destroy run will occur, refer to [Scheduled Destroy](/terraform/enterprise/workspaces/settings/deletion#automatically-destroy). |
+| `data.attributes.auto-destroy-activity-duration` | string | (previous value) | Value and units for [automatically scheduled destroy runs based on workspace activity](/terraform/enterprise/workspaces/settings/deletion#automatically-destroy). Valid values are greater than 0 and four digits or less. Valid units are `d` and `h`. For example, to queue destroy runs after fourteen days of inactivity set `auto-destroy-activity-duration: "14d"`. |
+| `data.attributes.description` | string | (previous value) | A description for the workspace. |
+| `data.attributes.execution-mode` | string | (previous value) | Which [execution mode](/terraform/enterprise/workspaces/settings#execution-mode) to use. Valid values are `remote`, `local`, and `agent`. When set to `local`, the workspace will be used for state storage only. This value _must not_ be specified if `operations` is specified, and _must_ be specified if `setting-overwrites.execution-mode` is set to `true`. |
+| `data.attributes.file-triggers-enabled` | boolean | (previous value) | Whether to filter runs based on the changed files in a VCS push. If enabled, it uses either `trigger-prefixes` in conjunction with `working_directory` or `trigger-patterns` to describe the set of changed files that will start a run. If disabled, any push will trigger a run. |
+| `data.attributes.global-remote-state` | boolean | (previous value) | Whether the workspace should allow all workspaces in the organization to [access its state data](/terraform/enterprise/workspaces/state) during runs. If `false`, then only specifically approved workspaces can access its state. Manage allowed workspaces using the [Remote State Consumers](/terraform/enterprise/api-docs/workspaces#get-remote-state-consumers) endpoints, documented later on this page. |
+| `data.attributes.operations` | boolean | (previous value) | **DEPRECATED** Use `execution-mode` instead. Whether to use remote execution mode. When set to `false`, the workspace will be used for state storage only. This value must not be specified if `execution-mode` is specified. |
+| `data.attributes.queue-all-runs` | boolean | (previous value) | Whether runs should be queued immediately after workspace creation. When set to false, runs triggered by a VCS change will not be queued until at least one run is manually queued. |
+| `data.attributes.speculative-enabled` | boolean | (previous value) | Whether this workspace allows automatic [speculative plans][]. Setting this to `false` prevents HCP Terraform from running plans on pull requests, which can improve security if the VCS repository is public or includes untrusted contributors. It doesn't prevent manual speculative plans via the CLI or the runs API. |
+| `data.attributes.terraform-version` | string | (previous value) | The version of Terraform to use for this workspace. This can be either an exact version or a [version constraint](/terraform/language/expressions/version-constraints) (like `~> 1.0.0`); if you specify a constraint, the workspace will always use the newest release that meets that constraint. |
+| `data.attributes.trigger-patterns` | array | (previous value) | List of glob patterns that describe the files HCP Terraform monitors for changes. Trigger patterns are always appended to the root directory of the repository. |
+| `data.attributes.trigger-prefixes` | array | (previous value) | List of trigger prefixes that describe the paths HCP Terraform monitors for changes, in addition to the working directory. Trigger prefixes are always appended to the root directory of the repository. HCP Terraform will start a run when files are changed in any directory path matching the provided set of prefixes. |
+| `data.attributes.vcs-repo.branch` | string | (previous value) | The repository branch that Terraform will execute from. |
+| `data.attributes.vcs-repo.identifier` | string | (previous value) | A reference to your VCS repository in the format :org/:repo where :org and :repo refer to the organization and repository in your VCS provider. The format for Azure DevOps is `:org/:project/_git/:repo`. |
+| `data.attributes.vcs-repo.ingress-submodules` | boolean | (previous value) | Whether submodules should be fetched when cloning the VCS repository. |
+| `data.attributes.vcs-repo.oauth-token-id` | string | | The VCS Connection (OAuth Connection + Token) to use as identified. Get this ID from the [oauth-tokens](/terraform/enterprise/api-docs/oauth-tokens) endpoint. You can not specify this value if `github-app-installation-id` is specified. |
+| `data.attributes.vcs-repo.github-app-installation-id` | string | | The VCS Connection GitHub App Installation to use. Find this ID on the account settings page. Requires previously authorizing the GitHub App and generating a user-to-server token. Manage the token from **Account Settings** within HCP Terraform. You can not specify this value if `oauth-token-id` is specified. |
+| `data.attributes.vcs-repo.tags-regex` | string | (previous value) | A regular expression used to match Git tags. HCP Terraform triggers a run when this value is present and a VCS event occurs that contains a matching Git tag for the regular expression. |
+| `data.attributes.vcs-repo` | object or null | (previous value) | To delete a workspace's existing VCS repo, specify `null` instead of an object. To modify a workspace's existing VCS repo, include whichever of the keys below you wish to modify. To add a new VCS repo to a workspace that didn't previously have one, include at least the `oauth-token-id` and `identifier` keys. |
+| `data.attributes.working-directory` | string | (previous value) | A relative path that Terraform will execute within. This defaults to the root of your repository and is typically set to a subdirectory matching the environment when multiple environments exist within the same repository. |
+| `data.attributes.setting-overwrites` | object | | The keys in this object are attributes that have organization-level defaults. Each attribute key stores a boolean value which is `true` by default. To overwrite the default inherited value, set an attribute's value to `false`. For example, to set `execution-mode` as the organization default, you set `setting-overwrites.execution-mode = false`. |
+| `data.relationships` | object | none | Specifies a group of workspace relationships. |
+| `data.relationships.project.data.id` | string | existing value | The ID of the project to move the workspace to. If left blank or unchanged, the workspace will not be moved. You must have admin permissions on both the source project and destination project in order to move a workspace between projects. |
+| `data.relationships.tag-bindings.data` | list of objects | none | Specifies a list of tags to attach to the workspace. |
+| `data.relationships.tag-bindings.data.type` | string | none | Must be `tag-bindings` for each object in the list. |
+| `data.relationships.tag-bindings.data.attributes.key` | string | none | Specifies the tag key for each object in the list. |
+| `data.relationships.tag-bindings.data.attributes.value` | string | none | Specifies the tag value for each object in the list. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "name": "workspace-2",
+ "resource-count": 0,
+ "terraform_version": "0.11.1",
+ "working-directory": "",
+ "vcs-repo": {
+ "identifier": "example/terraform-test-proj",
+ "branch": "",
+ "ingress-submodules": false,
+ "oauth-token-id": "ot-hmAyP66qk2AMVdbJ"
+ },
+ "updated-at": "2017-11-29T19:18:09.976Z"
+ },
+ "relationships": {
+ "project": {
+ "data": {
+ "type": "projects",
+ "id": "prj-7HWWPGY3fYxztELU"
+ }
+ },
+ "tag-bindings": {
+ "data": [
+ {
+ "type": "tag-bindings",
+ "attributes": {
+ "key": "environment",
+ "value": "development"
+ }
+ },
+ ]
+ }
+ },
+ "type": "workspaces"
+ }
+}
+```
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/organizations/my-organization/workspaces/workspace-2
+```
+
+### Sample Response
+
+@include 'api-code-blocks/workspace-with-vcs.mdx'
+
+## List workspaces
+
+This endpoint lists workspaces in the organization.
+
+`GET /organizations/:organization_name/workspaces`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------- |
+| `:organization_name` | The name of the organization to list the workspaces of. |
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 workspaces per page. |
+| `search[name]` | **Optional.** If specified, restricts results to workspaces with a name that matches the search string using a fuzzy search. |
+| `search[tags]` | **Optional.** If specified, restricts results to workspaces with that tag. If multiple comma separated values are specified, results matching all of the tags are returned. |
+| `search[exclude-tags]` | **Optional.** If specified, results exclude workspaces with that tag. If multiple comma separated values are specified, workspaces with tags matching any of the tags are excluded. |
+| `search[wildcard-name]` | **Optional.** If specified, restricts results to workspaces with partial matching, using `*` on prefix, suffix, or both. For example, `search[wildcard-name]=*-prod` returns all workspaces ending in `-prod`, `search[wildcard-name]=prod-*` returns all workspaces beginning with `prod-`, and `search[wildcard-name]=*-prod-*` returns all workspaces with substring `-prod-` regardless of prefix and/or suffix. |
+| `sort` | **Optional.** Allows sorting the organization's workspaces by a provided value. You can sort by `"name"`, `"current-run.created-at"` (the time of the current run), and `"latest-change-at"` (the creation time of the latest state version or the workspace itself if no state version exists). Prepending a hyphen to the sort parameter reverses the order. For example, `"-name"` sorts by name in reverse alphabetical order. If omitted, the default sort order is arbitrary but stable. |
+| `filter[project][id]` | **Optional.** If specified, restricts results to workspaces in the specific project. |
+| `filter[current-run][status]` | **Optional.** If specified, restricts results to workspaces that match the status of a current run. |
+| `filter[tagged][i][key]` | **Optional.** If specified, restricts results to workspaces that are tagged with the provided key. Use a value of "0" for `i` if you are only using a single filter. For multiple tag filters, use an incrementing integer value for each filter. Multiple tag filters will be combined together with a logical AND when filtering results. |
+| `filter[tagged][i][value]` | **Optional.** If specified, restricts results to workspaces that are tagged with the provided value. This is useful when combined with a `key` filter for more specificity. Use a value of "0" for `i` if you are only using a single filter. For multiple tag filters, use an incrementing integer value for each filter. Multiple tag filters will be combined together with a logical AND when filtering results. |
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/my-organization/workspaces
+```
+
+_With multiple tag filters_
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/my-organization/workspaces?filter%5B%tagged5D%5B0%5D%5Bkey%5D=environment&filter%5B%tagged5D%5B0%5D%5Bvalue%5D=development&filter%5B%tagged5D%5B1%5D%5Bkey%5D=meets-compliance
+```
+
+### Sample Response
+
+@include 'api-code-blocks/workspaces-list.mdx'
+
+## Show workspace
+
+Details on a workspace can be retrieved from two endpoints, which behave identically.
+
+One refers to a workspace by its ID:
+
+`GET /workspaces/:workspace_id`
+
+| Parameter | Description |
+| --------------- | ---------------- |
+| `:workspace_id` | The workspace ID |
+
+The other refers to a workspace by its name and organization:
+
+`GET /organizations/:organization_name/workspaces/:name`
+
+| Parameter | Description |
+| -------------------- | ----------------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization the workspace belongs to. |
+| `:name` | The name of the workspace to show details for, which can only include letters, numbers, `-`, and `_`. |
+
+### Workspace performance attributes
+
+The following attributes are helpful in determining the overall health and performance of your workspace configuration. These metrics refer to the **past 30 runs that have either resulted in an error or successfully applied**.
+
+| Parameter | Type | Description |
+| ------------------------------------------ | ------ | --------------------------------------------------------------------------------------- |
+| `data.attributes.apply-duration-average` | number | This is the average time runs spend in the **apply** phase, represented in milliseconds |
+| `data.attributes.plan-duration-average` | number | This is the average time runs spend in the **plan** phase, represented in milliseconds |
+| `data.attributes.policy-check-failures` | number | Reports the number of run failures resulting from a policy check failure |
+| `data.attributes.run-failures` | number | Reports the number of failed runs |
+| `data.attributes.workspace-kpis-run-count` | number | Total number of runs taken into account by these metrics |
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/organizations/my-organization/workspaces/workspace-1
+```
+
+### Sample Response
+
+@include 'api-code-blocks/workspace.mdx'
+
+## Safe Delete a workspace
+
+When you delete an HCP Terraform workspace with resources, Terraform can no longer track or manage that infrastructure. During a safe delete, HCP Terraform only deletes the workspace if it is not managing resources.
+
+You can safe delete a workspace using two endpoints that behave identically. The first endpoint identifies a workspace with the workspace ID, and the other identifies the workspace by its name and organization.
+
+`POST /workspaces/:workspace_id/actions/safe-delete`
+
+| Parameter | Description |
+| --------------- | ---------------------------------- |
+| `:workspace_id` | The ID of the workspace to delete. |
+
+`POST /organizations/:organization_name/workspaces/:name/actions/safe-delete`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the workspace's organization. |
+| `:name` | The name of the workspace to delete, which can only include letters, numbers, `-`, and `_`. |
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------- |
+| [204][] | No Content | Successfully deleted the workspace |
+| [404][] | [JSON API error object][] | Workspace not found, or user unauthorized to perform workspace delete |
+| [409][] | [JSON API error object][] | Workspace is not safe to delete because it is managing resources |
+
+## Force Delete a workspace
+
+During a force delete, HCP Terraform removes the specified workspace without checking whether it is managing resources. We recommend using the [safe delete endpoint](#safe-delete-a-workspace) instead, when possible.
+
+!> **Warning:** Terraform cannot track or manage the workspace's infrastructure after deletion. We recommend [destroying the workspace's infrastructure](/terraform/enterprise/run/modes-and-options#destroy-mode) before you delete it.
+
+By default, only organization owners can force delete workspaces. Organization owners can also update [organization's settings]\(/terraform/cloud-docs/users-teams organizations/organizations#general) to let workspace admins force delete their own workspaces.
+
+You can use two endpoints to force delete a workspace, which behave identically. One endpoint identifies the workspace with its workspace ID and the other endpoint identifies the workspace with its name and organization.
+
+`DELETE /workspaces/:workspace_id`
+
+| Parameter | Description |
+| --------------- | --------------------------------- |
+| `:workspace_id` | The ID of the workspace to delete |
+
+`DELETE /organizations/:organization_name/workspaces/:name`
+
+| Parameter | Description |
+| -------------------- | ------------------------------------------------------------------------------------------- |
+| `:organization_name` | The name of the organization the workspace belongs to. |
+| `:name` | The name of the workspace to delete, which can only include letters, numbers, `-`, and `_`. |
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------- |
+| [204][] | No Content | Successfully deleted the workspace |
+| [403][] | [JSON API error object][] | Not authorized to perform a force delete on the workspace |
+| [404][] | [JSON API error object][] | Workspace not found, or user unauthorized to perform workspace delete |
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ https://app.terraform.io/api/v2/organizations/my-organization/workspaces/workspace-1
+```
+
+## Lock a workspace
+
+This endpoint locks a workspace.
+
+`POST /workspaces/:workspace_id/actions/lock`
+
+| Parameter | Description |
+| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The workspace ID to lock. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](#show-workspace) endpoint. |
+
+| Status | Response | Reason(s) |
+| ------- | -------------------------------------------- | ----------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "workspaces"`) | Successfully locked the workspace |
+| [404][] | [JSON API error object][] | Workspace not found, or user unauthorized to perform action |
+| [409][] | [JSON API error object][] | Workspace already locked |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------- | ------ | ------- | ------------------------------------- |
+| `reason` | string | `""` | The reason for locking the workspace. |
+
+### Sample Payload
+
+```json
+{
+ "reason": "Locking workspace-1"
+}
+```
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-SihZTyXKfNXUWuUa/actions/lock
+```
+
+### Sample Response
+
+@include 'api-code-blocks/workspace.mdx'
+
+## Unlock a workspace
+
+This endpoint unlocks a workspace. Unlocking a workspace sets the current state version to the latest finalized intermediate state version. If intermediate state versions are available, but HCP Terraform has not yet finalized the latest intermediate state version, the unlock will fail with a 503 response. For this particular error, it's recommended to retry the unlock operation for a short period of time until the platform finalizes the state version. If you must force-unlock a workspace under these conditions, ensure that state was saved successfully by inspecting the latest state version using the [State Version List API](/terraform/enterprise/api-docs/state-versions#list-state-versions-for-a-workspace)
+
+`POST /workspaces/:workspace_id/actions/unlock`
+
+| Parameter | Description |
+| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The workspace ID to unlock. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](#show-workspace) endpoint. |
+
+| Status | Response | Reason(s) |
+| ------- | -------------------------------------------- | ----------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "workspaces"`) | Successfully unlocked the workspace |
+| [404][] | [JSON API error object][] | Workspace not found, or user unauthorized to perform action |
+| [409][] | [JSON API error object][] | Workspace already unlocked, or locked by a different user |
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/workspaces/ws-SihZTyXKfNXUWuUa/actions/unlock
+```
+
+### Sample Response
+
+@include 'api-code-blocks/workspace.mdx'
+
+## Force Unlock a workspace
+
+This endpoint force unlocks a workspace. Only users with admin access are authorized to force unlock a workspace.
+
+`POST /workspaces/:workspace_id/actions/force-unlock`
+
+| Parameter | Description |
+| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The workspace ID to force unlock. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](#show-workspace) endpoint. |
+
+| Status | Response | Reason(s) |
+| ------- | -------------------------------------------- | ----------------------------------------------------------- |
+| [200][] | [JSON API document][] (`type: "workspaces"`) | Successfully force unlocked the workspace |
+| [404][] | [JSON API error object][] | Workspace not found, or user unauthorized to perform action |
+| [409][] | [JSON API error object][] | Workspace already unlocked |
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ https://app.terraform.io/api/v2/workspaces/ws-SihZTyXKfNXUWuUa/actions/force-unlock
+```
+
+### Sample Response
+
+@include 'api-code-blocks/workspace-with-vcs.mdx'
+
+## Assign an SSH key to a workspace
+
+This endpoint assigns an SSH key to a workspace.
+
+`PATCH /workspaces/:workspace_id/relationships/ssh-key`
+
+| Parameter | Description |
+| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The workspace ID to assign the SSH key to. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](#show-workspace) endpoint. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------------------- | ------ | ------- | ------------------------------------------------------------------------------------------------------------ |
+| `data.type` | string | | Must be `"workspaces"`. |
+| `data.attributes.id` | string | | The SSH key ID to assign. Obtain this from the [ssh-keys](/terraform/enterprise/api-docs/ssh-keys) endpoint. |
+
+#### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "id": "sshkey-GxrePWre1Ezug7aM"
+ },
+ "type": "workspaces"
+ }
+}
+```
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-SihZTyXKfNXUWuUa/relationships/ssh-key
+```
+
+### Sample Response
+
+@include 'api-code-blocks/workspace-with-vcs.mdx'
+
+## Unassign an SSH key from a workspace
+
+This endpoint unassigns the currently assigned SSH key from a workspace.
+
+`PATCH /workspaces/:workspace_id/relationships/ssh-key`
+
+| Parameter | Description |
+| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The workspace ID to assign the SSH key to. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](#show-workspace) endpoint. |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| -------------------- | ------ | ------- | ----------------------- |
+| `data.type` | string | | Must be `"workspaces"`. |
+| `data.attributes.id` | string | | Must be `null`. |
+
+### Sample Payload
+
+```json
+{
+ "data": {
+ "attributes": {
+ "id": null
+ },
+ "type": "workspaces"
+ }
+}
+```
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-SihZTyXKfNXUWuUa/relationships/ssh-key
+```
+
+### Sample Response
+
+@include 'api-code-blocks/workspace-with-vcs.mdx'
+
+## Get Remote State Consumers
+
+`GET /workspaces/:workspace_id/relationships/remote-state-consumers`
+
+| Parameter | Description |
+| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The workspace ID to get remote state consumers for. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](#show-workspace) endpoint. |
+
+This endpoint retrieves the list of other workspaces that are allowed to access the given workspace's state during runs.
+
+- If `global-remote-state` is set to false for the workspace, this will return the list of other workspaces that are specifically authorized to access the workspace's state.
+- If `global-remote-state` is set to true, this will return a list of every workspace in the organization except for the subject workspace.
+
+The list returned by this endpoint is subject to the caller's normal workspace permissions; it will not include workspaces that the provided API token is unable to read.
+
+### Query Parameters
+
+This endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs.
+
+| Parameter | Description |
+| -------------- | -------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 workspaces per page. |
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/workspaces/ws-SihZTyXKfNXUWuUa/relationships/remote-state-consumers
+```
+
+### Sample Response
+
+@include 'api-code-blocks/workspaces-list.mdx'
+
+## Replace Remote State Consumers
+
+`PATCH /workspaces/:workspace_id/relationships/remote-state-consumers`
+
+| Parameter | Description |
+| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The workspace ID to replace remote state consumers for. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](#show-workspace) endpoint. |
+
+This endpoint updates the workspace's remote state consumers to be _exactly_ the list of workspaces specified in the payload. It can only be used for workspaces where `global-remote-state` is false.
+
+This endpoint can only be used by teams with permission to manage workspaces for the entire organization — only those who can _view_ the entire list of consumers can _replace_ the entire list. ([More about permissions.](/terraform/enterprise/users-teams-organizations/permissions)) Teams with admin permissions on specific workspaces can still modify remote state consumers for those workspaces, but must use the add (POST) and remove (DELETE) endpoints listed below instead of this PATCH endpoint.
+
+[permissions-citation]: #intentionally-unused---keep-for-maintainers
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------- |
+| [204][] | No Content | Successfully updated remote state consumers |
+| [404][] | [JSON API error object][] | Workspace not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Problem with payload or request; details provided in the error object |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------- | ------ | ------- | ----------------------------------------------------------- |
+| `data[].type` | string | | Must be `"workspaces"`. |
+| `data[].id` | string | | The ID of a workspace to be set as a remote state consumer. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "id": "ws-7aiqKYf6ejMFdtWS",
+ "type": "workspaces"
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-UYv6RYM8fVhzeGG5/relationships/remote-state-consumers
+```
+
+### Response
+
+No response body.
+
+Status code `204`.
+
+## Add Remote State Consumers
+
+`POST /workspaces/:workspace_id/relationships/remote-state-consumers`
+
+| Parameter | Description |
+| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The workspace ID to add remote state consumers for. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](#show-workspace) endpoint. |
+
+This endpoint adds one or more remote state consumers to the workspace. It can only be used for workspaces where `global-remote-state` is false.
+
+- The workspaces specified as consumers must be readable to the API token that makes the request.
+- A workspace cannot be added as a consumer of itself. (A workspace can always read its own state, regardless of access settings.)
+- You can safely add a consumer workspace that is already present; it will be ignored, and the rest of the consumers in the request will be processed normally.
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------- |
+| [204][] | No Content | Successfully updated remote state consumers |
+| [404][] | [JSON API error object][] | Workspace not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Problem with payload or request; details provided in the error object |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------- | ------ | ------- | ----------------------------------------------------------- |
+| `data[].type` | string | | Must be `"workspaces"`. |
+| `data[].id` | string | | The ID of a workspace to be set as a remote state consumer. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "id": "ws-7aiqKYf6ejMFdtWS",
+ "type": "workspaces"
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-UYv6RYM8fVhzeGG5/relationships/remote-state-consumers
+```
+
+### Response
+
+No response body.
+
+Status code `204`.
+
+## Delete Remote State Consumers
+
+`DELETE /workspaces/:workspace_id/relationships/remote-state-consumers`
+
+| Parameter | Description |
+| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The workspace ID to remove remote state consumers for. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](#show-workspace) endpoint. |
+
+This endpoint removes one or more remote state consumers from a workspace, according to the contents of the payload. It can only be used for workspaces where `global-remote-state` is false.
+
+- The workspaces specified as consumers must be readable to the API token that makes the request.
+- You can safely remove a consumer workspace that is already absent; it will be ignored, and the rest of the consumers in the request will be processed normally.
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | --------------------------------------------------------------------- |
+| [204][] | No Content | Successfully updated remote state consumers |
+| [404][] | [JSON API error object][] | Workspace not found, or user unauthorized to perform action |
+| [422][] | [JSON API error object][] | Problem with payload or request; details provided in the error object |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ------------- | ------ | ------- | ---------------------------------------------------------------- |
+| `data[].type` | string | | Must be `"workspaces"`. |
+| `data[].id` | string | | The ID of a workspace to remove from the remote state consumers. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "id": "ws-7aiqKYf6ejMFdtWS",
+ "type": "workspaces"
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-UYv6RYM8fVhzeGG5/relationships/remote-state-consumers
+```
+
+### Response
+
+No response body.
+
+Status code `204`.
+
+## List workspace tags
+
+Workspace tags are [organization tags](/terraform/enterprise/api-docs/organization-tags) added to a workspace. They are a flat list of keys that can only be applied to workspaces when using the `tags` attribute in the Terraform `cloud` block in Terraform v1.9 and older. To list key-value tags supported in Terraform v1.10 and newer, refer to [List workspace tag bindings](#list-workspace-tag-bindings).
+
+`GET /workspaces/:workspace_id/relationships/tags`: Paginated list of flat string tags attached to the workspace.
+
+### Path parameters
+
+| Parameter | Description |
+| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The workspace ID to fetch tags for. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](#show-workspace) endpoint. |
+
+### Query Parameters
+
+Only the flat string tags endpoint supports pagination [with standard URL query parameters](/terraform/enterprise/api-docs#query-parameters). Remember to percent-encode `[` as `%5B` and `]` as `%5D` if your tooling doesn't automatically encode URLs. Conversely, all tags are returned when using fetching tag-bindings or effective-tag-bindings endpoints.
+
+| Parameter | Description |
+| -------------- | -------------------------------------------------------------------------- |
+| `page[number]` | **Optional.** If omitted, the endpoint will return the first page. |
+| `page[size]` | **Optional.** If omitted, the endpoint will return 20 workspaces per page. |
+
+### Sample Requests
+
+
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/workspaces/ws-db61c9eb5cab5ae2/relationships/tags
+```
+
+
+
+### Sample Responses
+
+
+
+```json
+{
+ "data": [
+ {
+ "id": "tag-1",
+ "type": "tags",
+ "attributes": {
+ "name": "tag1",
+ "created-at": "2022-03-09T06:04:39.585Z",
+ "instance-count": 1
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ }
+ },
+ {
+ "id": "tag-2",
+ "type": "tags",
+ "attributes": {
+ "name": "tag2",
+ "created-at": "2022-03-09T06:04:39.585Z",
+ "instance-count": 2
+ },
+ "relationships": {
+ "organization": {
+ "data": {
+ "id": "my-organization",
+ "type": "organizations"
+ }
+ }
+ }
+ }
+ ]
+}
+```
+
+
+
+## List workspace tag bindings
+
+Call the following endpoints to list the tags attached to a workspace:
+
+- `GET /workspaces/:workspace_id/tag-bindings`: Lists key-value tags directly bound to the workspace.
+- `GET /workspaces/:workspace_id/effective-tag-bindings`: Lists all key-value tags bound to the workspace, including those inherited from the parent project.
+
+### Path parameters
+
+| Parameter | Description |
+| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The workspace ID to fetch tags for. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](#show-workspace) endpoint. |
+
+### Sample Requests
+
+
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/workspaces/ws-db61c9eb5cab5ae2/tag-bindings
+```
+
+
+
+
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ https://app.terraform.io/api/v2/workspaces/ws-db61c9eb5cab5ae2/effective-tag-bindings
+```
+
+
+
+### Sample Responses
+
+
+
+```json
+{
+ "data": [
+ {
+ "id": "tb-232e23631380f79e",
+ "type": "tag-bindings",
+ "attributes": {
+ "key": "costcenter",
+ "value": "123",
+ "created-at": "2024-11-19T23:59:24.648Z"
+ }
+ }
+ ],
+ "links": {
+ "target": "/api/v2/workspaces/ws-db61c9eb5cab5ae2"
+ }
+}
+```
+
+
+
+
+
+```json
+{
+ "data": [
+ {
+ "id": "07cc44202a430fc2",
+ "type": "effective-tag-bindings",
+ "attributes": {
+ "key": "costcenter",
+ "value": "123"
+ }
+ },
+ {
+ "id": "f8b11951f98e11f8",
+ "type": "effective-tag-bindings",
+ "attributes": {
+ "key": "dept",
+ "value": "r+d"
+ },
+ "relationships": {
+ "inherited-from": {
+ "links": {
+ "related": "/api/v2/projects/prj-af7d174fa1ea7423"
+ }
+ }
+ }
+ }
+ ]
+}
+```
+
+
+
+## Add flat string tags to a workspace
+
+`POST /workspaces/:workspace_id/relationships/tags`
+
+To add key-value tags to an existing workspace, call the `PATCH /workspaces/:workspace_id` and provide workspace tag bindings in the JSON payload. Refer to [Update a workspace](#update-a-workspace) for additional information.
+
+You can also bind key-value tags when creating a workspace. Refer to [Create a workspace](#create-a-workspace) for additional information.
+
+Refer to [Define project tags](/terraform/enterprise/projects/manage#define-project-tags) for information about supported tag values.
+
+| Parameter | Description |
+| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:workspace_id` | The workspace ID to add tags to. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](#show-workspace) endpoint. |
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | ----------------------------------------------------------- |
+| [204][] | No Content | Successfully added tags to workspace |
+| [404][] | [JSON API error object][] | Workspace not found, or user unauthorized to perform action |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+It is important to note that `type`, as well as one of `id` _or_ `attributes.name` is required.
+
+| Key path | Type | Default | Description |
+| ------------------------ | ------ | ------- | --------------------------- |
+| `data[].type` | string | | Must be `"tags"`. |
+| `data[].id` | string | | The ID of the tag to add. |
+| `data[].attributes.name` | string | | The name of the tag to add. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "type": "tags",
+ "attributes": {
+ "name": "foo"
+ }
+ },
+ {
+ "type": "tags",
+ "attributes": {
+ "name": "bar"
+ }
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request POST \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/workspace-2/relationships/tags
+```
+
+### Sample Response
+
+No response body.
+
+Status code `204`.
+
+## Remove tags from workspace
+
+This endpoint removes one or more tags from a workspace. The workspace must already exist, and tag
+element that supplies an `id` attribute must exist. If the `name` attribute is used, and no matching
+organization tag is found, no action will occur for that entry. Tags removed from all workspaces will be
+removed from the organization-wide list.
+
+To remove key-value tags to an existing workspace, call the `PATCH /workspaces/:workspace_id` and provide workspace tag bindings in the JSON payload. Refer to [Update a workspace](#update-a-workspace) for additional information.
+
+`DELETE /workspaces/:workspace_id/relationships/tags`
+
+| Parameter | Description |
+| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The workspace ID to remove tags from. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or the [Show Workspace](#show-workspace) endpoint. |
+
+| Status | Response | Reason(s) |
+| ------- | ------------------------- | ----------------------------------------------------------- |
+| [204][] | No Content | Successfully removed tags to workspace |
+| [404][] | [JSON API error object][] | Workspace not found, or user unauthorized to perform action |
+
+### Request Body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+It is important to note that `type`, as well as one of `id` _or_ `attributes.name` is required.
+
+| Key path | Type | Default | Description |
+| ------------------------ | ------ | ------- | ------------------------------ |
+| `data[].type` | string | | Must be `"tags"`. |
+| `data[].id` | string | | The ID of the tag to remove. |
+| `data[].attributes.name` | string | | The name of the tag to remove. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "type": "tags",
+ "id": "tag-Yfha4YpPievQ8wJw"
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request DELETE \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/workspace-2/relationships/tags
+```
+
+### Sample Response
+
+No response body.
+
+Status code `204`.
+
+## Add/update tag-bindings on a workspace
+
+This endpoint adds keys and values or updates values of tag-bindings on an existing resource by key.
+It does not remove any keys from the collection. This endpoint is useful when you want to ensure a
+modification is additive.
+
+Tag Bindings have special constraints:
+
+- Up to 10 tags can be applied to a workspace, but an additional 10 tags may be inherited from its project.
+- Keys must be no more than 128 characters, allowing all alphanumeric characters plus the symbols `_`, `.`, `=`, `+`, `-`, `@`, `:`.
+- Values allow the same characters, but can be up to 256 characters.
+- Certain key prefixes, including `hc:` and `hcp:` are not allowed.
+
+`PATCH /workspaces/:workspace_id/tag-bindings`
+
+| Parameter | Description |
+| --------------- | --------------------------------- |
+| `:workspace_id` | The ID of the workspace to update |
+
+### Request Body
+
+This PATCH endpoint requires a JSON object with the following properties as a request payload.
+
+It is important to note that for each data item, `type`, as well as `attributes.key` is required.
+
+| Key path | Type | Default | Description |
+| ------------------------- | ------ | ------- | ---------------------------------- |
+| `data[].type` | string | | Must be `"tag-bindings"`. |
+| `data[].attributes.key` | string | | The key of the tag to add/update. |
+| `data[].attributes.value` | string | | The name of the tag to add/update. |
+
+### Sample Payload
+
+```json
+{
+ "data": [
+ {
+ "type": "tag-bindings",
+ "attributes": {
+ "key": "costcenter",
+ "value": "123"
+ }
+ },
+ {
+ "type": "tag-bindings",
+ "attributes": {
+ "key": "bar",
+ "value": "baz"
+ }
+ }
+ ]
+}
+```
+
+### Sample Request
+
+```shell-session
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --header "Content-Type: application/vnd.api+json" \
+ --request PATCH \
+ --data @payload.json \
+ https://app.terraform.io/api/v2/workspaces/ws-82d2281aa259ba09/tag-bindings
+```
+
+### Sample Response
+
+Status Code 200
+
+
+
+```json
+{
+ "data": [
+ {
+ "id": "tb-e4a5847b2cf06559",
+ "type": "tag-bindings",
+ "attributes": {
+ "key": "costcenter",
+ "value": "123"
+ }
+ },
+ {
+ "id": "tb-97ce954636f93a6c",
+ "type": "tag-bindings",
+ "attributes": {
+ "key": "bar",
+ "value": "baz"
+ }
+ }
+ ]
+}
+```
+
+
+
+## Show data retention policy
+
+
+This endpoint is exclusive to Terraform Enterprise and is not available in HCP Terraform.
+
+
+`GET /workspaces/:workspace_id/relationships/data-retention-policy`
+
+| Parameter | Description |
+| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The ID of the workspace to show the data retention policy for. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or by sending a `GET` request to the [`/workspaces`](#show-workspace) endpoint. |
+
+This endpoint shows the data retention policy set explicitly on the workspace.
+When no data retention policy is set for the workspace, the endpoint returns the default policy configured for the organization. Refer to [Data Retention Policies](/terraform/enterprise/workspaces/settings/deletion#data-retention-policies) for instructions on configuring data retention policies for workspaces.
+
+Refer to [Data Retention Policy API](/terraform/enterprise/api-docs/data-retention-policies#show-data-retention-policy) in the Terraform Enterprise documentation for details.
+
+## Create or update data retention policy
+
+
+This endpoint is exclusive to Terraform Enterprise and is not available in HCP Terraform.
+
+
+`POST /workspaces/:workspace_id/relationships/data-retention-policy`
+
+| Parameter | Description |
+| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `:workspace_id` | The workspace ID to update the data retention policy for. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or by sending a `GET` request to the [`/workspaces`](#show-workspace) endpoint. |
+
+This endpoint creates a data retention policy for a workspace or updates the existing policy.
+Refer to [Data Retention Policies](/terraform/enterprise/workspaces/settings/deletion#data-retention-policies) for additional information.
+
+Refer to [Data Retention Policy API](/terraform/enterprise/api-docs/data-retention-policies#create-or-update-data-retention-policy) in the Terraform Enterprise documentation for details.
+
+## Remove data retention policy
+
+
+This endpoint is exclusive to Terraform Enterprise and is not available in HCP Terraform.
+
+
+`DELETE /workspaces/:workspace_id/relationships/data-retention-policy`
+
+| Parameter | Description |
+| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `:workspace_id` | The workspace ID to remove the data retenetion policy for. Obtain this from the [workspace settings](/terraform/enterprise/workspaces/settings) or by sending a `GET` request to the [`/workspaces`](#show-workspace) endpoint. |
+
+This endpoint removes the data retention policy explicitly set on a workspace.
+When no data retention policy is set for the workspace, the endpoint returns the default policy configured for the organization. Refer to [Data Retention Policies](/terraform/enterprise/users-teams-organizations/organizations#destruction-and-deletion) for instructions on configuring data retention policies for organizations.
+
+Read more about [workspace data retention policies](/terraform/enterprise/workspaces/settings/deletion#data-retention-policies).
+
+Refer to [Data Retention Policy API](/terraform/enterprise/api-docs/data-retention-policies#remove-data-retention-policy) in the Terraform Enterprise documentation for details.
+
+## Available Related Resources
+
+The GET endpoints above can optionally return related resources, if requested with [the `include` query parameter](/terraform/enterprise/api-docs#inclusion-of-related-resources). The following resource types are available:
+
+- `current_configuration_version` - The last configuration this workspace received, excluding plan-only configurations. Terraform uses this configuration for new runs, unless you provide a different one.
+- `current_configuration_version.ingress_attributes` - The commit information for the current configuration version.
+- `current_run` - Additional information about the current run.
+- `current_run.configuration_version` - The configuration used in the current run.
+- `current_run.configuration_version.ingress_attributes` - The commit information used in the current run.
+- `current_run.plan` - The plan used in the current run.
+- `locked_by` - The user, team, or run responsible for locking the workspace, if the workspace is currently locked.
+- `organization` - The full organization record.
+- `outputs` - The outputs for the most recently applied run.
+- `project` - The full project record.
+- `readme` - The most recent workspace README.md.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/admin-access.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/admin-access.mdx
new file mode 100644
index 0000000000..82283fbba8
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/admin-access.mdx
@@ -0,0 +1,29 @@
+---
+page_title: Access Terraform Enterprise administration settings
+description: >-
+ The admin interface provides access to general settings, system-wide integration settings, and accounts and resources. Learn how to access the administration settings.
+---
+
+# Access Administration Settings
+
+This topic describes how to access the Terraform Enterprise administration interface. The interface provies access to general settings, system-wide integration settings, and accounts and resources.
+
+## Introduction
+
+In Terraform Enterprise instances, the HCP Terraform application includes an admin interface for managing general settings, systemwide integration settings, and accounts and resources.
+
+Administration functions can be managed via user interface (as described by the pages in this section) or via the [Admin API](/terraform/enterprise/api-docs/admin). Only Terraform Enterprise users with the site-admin permission can access the administrative functions.
+
+The initial user account for a Terraform Enterprise instance is the first site admin. Site admins can grant admin permissions to other users in the "Users" section of the admin pages. See [Promoting a User to Administrator](/terraform/enterprise/application-administration/resources#promoting-a-user-to-administrator) for details.
+
+To navigate to the site admin section of the UI, click your user icon, then click **Admin**:
+
+The admin area defaults to showing the user management page. Use the navigation to access the other administrative functions.
+
+## Administration Tasks
+
+- [General settings](/terraform/enterprise/application-administration/general)
+- [Service Integrations](/terraform/enterprise/application-administration/integration)
+- [Managing Accounts and Resources](/terraform/enterprise/application-administration/resources)
+- [Managing OPA tool versions](/terraform/enterprise/application-administration/opa-tool-versions)
+- [Managing Sentinel tool versions](/terraform/enterprise/application-administration/sentinel-tool-versions)
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/agents-on-tfe.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/agents-on-tfe.mdx
new file mode 100644
index 0000000000..b7bf816c0f
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/agents-on-tfe.mdx
@@ -0,0 +1,53 @@
+---
+page_title: HCP Terraform agents for Terraform Enterprise
+description: HCP Terraform agents let Terraform manage isolated, private, or on-premises
+ infrastructure. Learn about HCP Terraform agent behavior for Terraform Enterprise.
+---
+
+# HCP Terraform agents for Terraform Enterprise
+
+This topic describes HCP Terraform agent behavior when connected to Terraform Enterprise.
+
+## Introduction
+
+HCP Terraform agents allow Terraform Enterprise to communicate with isolated,
+private, or on-premises infrastructure. By deploying lightweight agents within a
+specific network segment, you can establish a simple connection between your
+environment and Terraform Enterprise which allows for provisioning operations and
+management.
+
+Refer to [HCP Terraform agents](/terraform/cloud-docs/agents) for additional information about HCP Terraform agents
+
+## Requirements
+
+Terraform Enterprise v202109-1 or later is required to connect to HCP Terraform agents.
+
+## Agents on HCP Terraform and Terraform Enterprise
+
+The following list describes the differences between connecting agents to Terraform Enterprise and connecting to agents on HCP Terraform, which is the software-as-a-service edition of Terraform Enterprise:
+
+* **No restriction on Agent Count**: Terraform Enterprise does not
+ place a limitation on the number of Agents that can be registered per organization.
+
+* **Hostname Registration**: HCP Terraform agents registering with a Terraform Enterprise instance
+ must define the Terraform Enterprise hostname via the `-address` CLI flag or `TFC_ADDRESS` environment
+ variable when running `tfc-agent`. By default, `tfc-agent` will attempt to connect to
+ HCP Terraform, so this value must be explicitly defined when registering with a
+ Terraform Enterprise instance.
+
+* **Custom Bundle Support**: HCP Terraform agents on Terraform Enterprise support
+ [custom Terraform bundles](https://github.com/hashicorp/terraform/tree/main/tools/terraform-bundle).
+ Custom bundles are created and defined within the Terraform Enterprise application; Agents will
+ download the custom bundle based on the Terraform version information. See
+ [using a custom Terraform bundle](https://support.hashicorp.com/hc/en-us/articles/360016992613-Using-custom-and-community-providers-in-Terraform-Cloud-and-Enterprise)
+ for more detail on custom bundles in Terraform Enterprise.
+
+* **Network Access Requirements**: HCP Terraform agents on Terraform Enterprise must be able to
+ communicate with the Terraform Enterprise instance via HTTPS. Additionally, the agent must also be
+ able to communicate with any services required by the Terraform code it is executing.
+ This includes the Terraform releases distribution service, [releases.hashicorp.com](https://releases.hashicorp.com),
+ as well as the [Terraform provider registry](https://registry.terraform.io). Agents
+ executing in a workspace that leverage a Terraform version that provides a custom
+ Terraform bundle with pre-existing provider binaries do not need access to these resources.
+
+* **Agent Version Compatibility**: Terraform Enterprise places restrictions on what versions of HCP Terraform agents can be registered. This is to prevent an incompatible agent from registering with a Terraform Enterprise instance and attempting to execute a Terraform operation in an undefined way. Compatible versions of HCP Terraform agents on Terraform Enterprise will vary based on the specific Terraform Enterprise release sequence; any changes to compatible HCP Terraform agents versions will be noted in the [Terraform Enterprise release notes](/terraform/enterprise/releases).
\ No newline at end of file
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/customization.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/customization.mdx
new file mode 100644
index 0000000000..37cfdf34cc
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/customization.mdx
@@ -0,0 +1,54 @@
+---
+page_title: Customize the UI
+description: >-
+ Use customization settings to modify the Terraform Enterprise user interface. Learn how to change UI text, customize support email addresses, and provide instructions in the UI.
+---
+
+# Customize the UI
+
+This topic describes how to customize different parts of the user interface to accommodate the specific needs of your organization. Refer to the [Customization API](/terraform/enterprise/api-docs/admin/settings#list-customization-settings) for instructions about customizing the UI using the API.
+
+## Access Customization Settings
+
+To access the customization settings, visit the site admin area and click **Customization**. To save the settings, click **Save Customization Settings**.
+
+~> **Note:** Terraform Enterprise sanitizes customization content before displaying it, and might remove HTML elements or attributes that pose a possible security risk.
+
+## Support
+
+You can update the support content displayed in the UI.
+
+### Email Address
+
+Terraform Enterprise uses the support email address for system emails, error pages, and all other situations where users are prompted to contact support. You can specify a local email address if you want users to contact a specific person or team when they have issues.
+
+Note that this field defaults to `support@hashicorp.com`, which is not a functional email address for HashiCorp support. If you need assistance or want to submit a feature request, visit the [HashiCorp support center](https://support.hashicorp.com/hc/en-us) and open a ticket.
+
+### Error Instructions
+
+-> Supports HTML
+
+Instructions to display when users encounter unexpected errors. You can use this space to provide links to your support triage process or other ticketing systems.
+
+## Application
+
+You can customize the following UI elements.
+
+### Login Help
+
+-> Supports HTML
+
+The content provided in this field replaces the "Need an Account? Sign up here." prompt. This is an opportunity to provide system usage disclaimers, or any custom new user processes you may have.
+
+
+### New User Instructions
+
+-> Supports HTML
+
+Instructions shown to new users who aren't yet members of an organization. If you have a custom provisioning process for granting organization access, you can explain it here. (By default, new users are prompted to contact the system administrator for organization membership.)
+
+### Footer Content
+
+-> Supports HTML
+
+Content to display in the footer of every application page. Useful for disclaimers and other site-wide communication.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/general.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/general.mdx
new file mode 100644
index 0000000000..5291998d44
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/general.mdx
@@ -0,0 +1,117 @@
+---
+page_title: Configure general Terraform Enterprise settings
+description: >-
+ Use general settings to control global behavior. Learn how to enable 2FA, limit organization creation, set timeouts, connect agents, and control remote state sharing and speculative plans.
+---
+
+# Configure General Settings
+
+This topic describes how to configure general settings in Terraform Enterprise. General settings affect global behaviors, including 2FA, limits on creating organizations, service timeouts, HCP Terraform agent connections, and remote state sharing. Refer to the [Admin Settings API](/terraform/enterprise/api-docs/admin/settings) documentation for instruction on how to configure general settings using the API.
+
+## Access General Settings
+
+To access general settings, visit the site admin area and click **Settings**. To save the settings, click **Save Settings**.
+
+## Require Site Admins to Enable Two-factor Authentication
+
+This setting can make the site more secure by requiring that admins enable two-factor authentication to access site admin functionality. You can use this setting in conjunction with SAML.
+
+Admins that do not have two-factor authentication enabled may still log in, but will be unable to perform any admin-only functions until they enable and verify two-factor authentication.
+
+You can use this setting in conjunction with [SAML Single Sign On](/terraform/enterprise/saml/configuration).
+
+## Organization Creation
+
+Organization creation can be limited to site administrators or allowed for all users. Limiting organization creation to administrators means that the need for new organizations can be audited and their creation easily monitored.
+
+When new user accounts are created, if they cannot create their own organizations, they will be unable to access any HCP Terraform resources until they are added to a team.
+
+## API Rate Limiting
+
+By default, requests to the HCP Terraform API from a single user or IP address are [limited to 30 requests per second](/terraform/enterprise/api-docs#rate-limiting) to prevent abuse or hogging of resources. Since usage patterns may vary for a given instance, this can be updated to match local needs. A few endpoints have lower limits to prevent certain spam and abuse scenarios. If you receive a rate limited response, the limit will be reflected in the `x-ratelimit-limit` header once triggered.
+
+## HCP Terraform agents
+
+HCP Terraform agents allow Terraform Enterprise to communicate with isolated, private, or on-premises infrastructure.
+
+You can enable agents by clicking the **Enable agents functionality** checkbox.
+
+Agents also use HTTP polling to acquire operations from Terraform Enterprise. This interval is the minimum number of seconds an agent should wait before polling for again in the event that there are no jobs to execute.
+
+To set the minimum polling interval, enter a number in the **Minimum polling interval in seconds** field.
+
+~> **Note:** Using a value that is significantly lower than the previous value may temporarily cause agents to report as **Unknown** because the agent may already be waiting for a longer period of time.
+
+Refer to [HCP Terraform agents on Terraform Enterprise](/terraform/enterprise/admin/agents-on-tfe) for more details and requirements.
+
+## Health Assessments
+
+**Automatic Assessment Interval** sets the minimum amount of time that must pass after a run or health assessment before a new health assessment can start. Decreasing the interval increases the frequency of health assessments. A high volume of concurrent runs and assessments in your organization may result in provider API rate-limiting or performance degradation.
+
+**Maximum concurrent assessments triggered** sets the number of health assessments that can start for each polling event. HCP Terraform polls all workspaces every 5 minutes to check if they are due for an assessment. This setting prevents running assessments on all of your workspaces at once.
+
+~> **Note:** If the previous polling event's assessments are still in progress, the number of concurrent active assessments may exceed the **Maximum concurrent assessments triggered** setting.
+
+## Organization and Workspace Limits
+
+By default, you can create unlimited organizations and each organization can have unlimited workspaces. However, you can optionally limit these settings.
+
+To limit organizations, check the **Limit organizations per user** box and enter a number in the **Organizations per user limit** field.
+
+To limit workspaces, check the **Limit workspaces per organization** box and enter a number in the **Workspaces per organization limit** field.
+
+## Terraform Run Timeout Settings
+
+The default timeout setting for Terraform runs are 2h for plans, and 24h for applies.
+
+These are configurable on a global level, or in the Admin settings at an organization level.
+
+~> **Note:** The maximum supported timeout for plans or applies is **24h**.
+
+## Commit Statuses for Untriggered Speculative Plans
+
+This setting affects Terraform Enterprise's behavior with shared VCS repositories that contain multiple Terraform configurations.
+
+Workspaces that use part of a shared repository typically don't run plans for changes that don't affect their files; this includes [speculative plans](/terraform/enterprise/run/modes-and-options#plan-only-speculative-plan) on pull requests. Since "pending" status checks can block pull requests, a workspace will automatically send passing commit statuses for any PRs that don't affect its files.
+
+However, if this results in sending too many status checks to your VCS provider due to a large number of workspaces sharing one VCS repository, you can disable this behavior and ignore the pending status checks for unaffected workspaces.
+
+## Remote State Sharing
+
+The "Share state globally by default" admin setting determines the default value for the "Share state globally" setting on newly created workspaces.
+
+- When true, a newly created workspace will allow all workspaces in its organization to read its state.
+- When false, a newly created workspace will not allow any other workspaces to read its state.
+
+In all cases, a workspace's state access settings can be changed after creation by workspace admins; this admin setting only affects the initial default value. Additionally, if the `global-remote-state` attribute is provided when creating a workspace via the API, the provided value will be used instead of using the default.
+
+Refer to the following resources for more information:
+
+- [Terraform State in HCP Terraform: Accessing State from Other Workspaces](/terraform/enterprise/workspaces/state#accessing-state-from-other-workspaces)
+- [Workspace Settings: Remote State Sharing](/terraform/enterprise/workspaces/settings#remote-state-sharing)
+
+## Allow Speculative Plans on Pull Requests from Forks
+
+This setting is supported for the following VCS providers: GitHub.com, GitHub.com (OAuth), GitHub Enterprise, Bitbucket Cloud, Azure DevOps Server, Azure DevOps Services.
+
+By default, this setting is disabled because Terraform Enterprise assumes that forks of a trusted repository are not necessarily themselves trusted. Enabling this setting may allow Terraform Enterprise to execute malicious code or expose sensitive information through [speculative plans](/terraform/enterprise/run/modes-and-options#plan-only-speculative-plan) on pull requests that originated from a repository fork.
+
+## Data Retention Policies
+
+
+Data retention policies are exclusive to Terraform Enterprise and unavailable in HCP Terraform. Learn more about Terraform Enterprise.
+
+
+By default, the **Set data retention policy** option is disabled. As a result, no data retention policy is active and Terraform Enterprise retains all data associated with configuration and state versions.
+
+To set a global data retention policy, enable the **Set data retention policy** setting and choose a duration from the drop-down menu. When a duration is set, Terraform _soft deletes_ the backing data associated with configuration versions and state versions. Soft deleting refers to marking a data object for garbage collection so that Terraform deletes it after the set number of days.
+
+Once an object is soft deleted, any attempts to read the object will fail. Until the garbage collection process begins, you can restore soft deleted objects using the APIs described in the [configuration version documentation](/terraform/enterprise/api-docs/configuration-versions) and the [state version documentation](/terraform/enterprise/api-docs/state-versions). Terraform permanently deletes the archivist storage after the garbage collection grace period elapses.
+
+Organization owners can configure their organizations to inherit or override the global policy. Refer to [Organization settings](/terraform/enterprise/users-teams-organizations/organizations#data-retention-policies) for instructions.
+
+Workspace admins can also configure their workspaces to inherit the parent policy or override the global policy in the workspace settings. Refer to [Workspace settings](/terraform/enterprise/workspaces/settings/deletion#data-retention-policies) for instructions.
+
+## Automated License Utilization Reporting
+
+Automated license utilization reporting sends license utilization data to HashiCorp without requiring you to manually collect and report them. [Learn about automated license utilization reporting](/terraform/enterprise/deploy/manage/license-report).
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/github-app-integration.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/github-app-integration.mdx
new file mode 100644
index 0000000000..1d787cd017
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/github-app-integration.mdx
@@ -0,0 +1,153 @@
+---
+page_title: Integrate with a GitHub App
+description: >-
+ Learn how to integrate Terraform Enterprise with a GitHub App to let organizations access GitHub repositories.
+---
+
+# Integrate with a GitHub App
+
+This topic describes how to integrate your Terraform Enterpise deployment with a GitHub App.
+
+## Introduction
+
+Site administrators can provision a GitHub App integration that all organizations on the same Terraform Enterprise instance can use to access GitHub repositories. Integrating with a GitHub App offers advantages over connecting to GitHub repositories using GitHub OAuth. Refer to [GitHub Documentation](https://docs.github.com/en/developers/apps/getting-started-with-apps/differences-between-github-apps-and-oauth-apps) to learn more.
+
+
+## Configuring GitHub App Integration
+
+These instructions are for using repositories from GitHub.com or Self-hosted GitHub Enterprise with Terraform Enterprise.
+
+For more information on using a GitHub App and GitHub Permissions in HCP Terraform, see [GitHub Permissions in HCP Terraform](/terraform/cloud-docs/vcs/github-app#github-permissions).
+
+### Step 1: Configure GitHub App Settings in Terraform Enterprise
+
+You can integrate with either GitHub.com or a self-hosted GitHub Enterprise instance.
+
+1. Go to the admin interface and then click **VCS Integrations**. The **VCS Integrations** page appears.
+
+2. Click **Create global GitHub App**. The **Location** and **GitHub App Owner** options appear.
+
+3. For the **Location** option, choose if you want to integrate with **GitHub.com** or a **Self-hosted GitHub Enterprise** instance.
+
+ - If integrating with a **Self-hosted GitHub Enterprise** instance, fill in the **HTTP URL** and **API URL** of your GitHub Enterprise instance.
+
+ | Field | Value |
+ | -------- | ------------------------------------------- |
+ | HTTP URL | `https://` |
+ | API URL | `https:///api/v3` |
+
+4. For the **GitHub App Owner**, choose either **Personal Account** or **Organization Account**.
+
+ - If assigning ownership to a GitHub Organization, fill in the **Organization Name**.
+
+ -> **Note**: You can change this later. See the [Transferring GitHub App Ownership](#transferring-github-app-ownership) section below for more information.
+
+5. Click **Create global GitHub App**. You will be redirected to the **Create GitHub App** screen on GitHub.
+
+6. Modify the default GitHub App name if necessary. When done, click **Create GitHub App for [GitHub User Handle]**.
+
+
+-> **Note**: The GitHub App name must satisfy GitHub's requirements.
+
+### Step 2: Authorize and Install the GitHub App
+
+In order to start using your GitHub App, you must authorize and install it.
+
+1. Click **Authorize**. The GitHub Authorization dialog appears.
+
+2. Accept the authorization. Afterwards, the GitHub installation dialog will appear.
+
+ -> **Note**: If the installation dialog fails to appear, make sure your browser settings allow pop-ups for your Terraform Enterprise site.
+
+3. Select the repositories you want to grant access to.
+
+-> **Note**: This will limit which GitHub repositories your workspaces, policy sets, and registry modules have access to.
+
+### Finished
+
+Your Global GitHub App for Terraform Enterprise is fully installed and configured. You can now create Terraform workspaces based on the GitHub repositories your Global GitHub App has access to.
+
+
+
+## GitHub App Management
+
+### Currently Unsupported Features
+
+~> **Warning**: Do not modify or remove the default Client Secret, Private Key, or Webhook Secret.
+
+* GitHub App Client Secret Rotation
+* GitHub App Private Key Rotation
+* GitHub App Webhook Secret Rotation
+
+### Required Permissions and Events
+
+#### Repository permissions
+
+These permissions are set by default. Do not alter these permissions unless specified to do so in a future Terraform Enterprise release.
+
+| Permission | Access |
+| ------------------ | -------------- |
+| Commit statuses | Read and write |
+| Contents | Read-only |
+| Metadata | Read-only |
+| Pull requests | Read-only |
+
+
+#### Required Subscribe Events
+
+These events are set by default. Do not alter these events unless specified to do so in a future Terraform Enterprise release.
+
+| Event | Description |
+| ------------- | ------------------------------------------- |
+| Create | Branch or tag created. |
+| Pull Request | Pull request assigned, edited, opened, etc. |
+| Delete | Branch or tag deleted |
+| Push | Git push to a repository |
+
+
+
+### Transferring GitHub App Ownership
+
+During the setup process for your GitHub App, you can choose a default owner for the application.
+
+If you want to transfer ownership of the GitHub App to another user or organization, follow the [transferring GitHub App ownership](https://docs.github.com/en/developers/apps/managing-github-apps/transferring-ownership-of-a-github-app) instructions. No actions need to be taken within Terraform Enterprise.
+
+### Removing Global GitHub App from Terraform Enterprise
+
+~> **Warning**: Do not delete the GitHub App from GitHub until you have first removed it from Terraform Enterprise.
+
+In order to remove the GitHub App from your Terraform Enterprise instance, you must first remove all installations for the application in GitHub.
+
+#### Step 1: Remove GitHub App Installations
+
+~> **Warning**: Uninstalling the application will remove the connections it has to workspaces, policy sets, and registry modules.
+
+1. Go to the admin interface and then click **VCS Integrations**. The **VCS Integrations** page appears.
+
+2. If you previously authorized the GitHub App, accessible installations will be shown. Otherwise, you will need to authorize the GitHub App to continue with the removal.
+
+3. For each installation, click **View in GitHub**. A new tab will open showing the installation settings page within GitHub.
+
+ -> **Note**: You can also find the list of **[Installed GitHub Apps](https://github.com/settings/installations)** on the **Applications** page in GitHub **Settings**.
+
+4. Locate the **Danger zone** section.
+
+5. Click **Uninstall** to uninstall the application. Repeat this process for each installation.
+
+#### Step 2: Remove GitHub App from Terraform Enterprise
+
+
+After you have removed all GitHub App installations, remove the GitHub App from Terraform Enterprise.
+
+-> **Note**: You may need to refresh the **VCS Integrations** page to verify that all app installations have been removed.
+
+1. Click the red delete button. A confirmation modal will appear.
+
+7. In the confirmation modal, click **Delete**. A success message will appear and you will be navigated back to the admin interface home page.
+
+3. You are now free to delete the GitHub App in GitHub.
+
+### Additional Resources
+
+- [About GitHub Apps](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps)
+- [Differences between GitHub Apps and OAuth Apps](https://docs.github.com/en/developers/apps/getting-started-with-apps/differences-between-github-apps-and-oauth-apps)
\ No newline at end of file
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/index.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/index.mdx
new file mode 100644
index 0000000000..40aaaae61f
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/index.mdx
@@ -0,0 +1,21 @@
+---
+page_title: Terraform Enterprise application administration
+description: >-
+ Use application administration settings to customize your Terraform Enterprise instance.
+---
+
+# Application administration overview
+
+Terraform Enterprise is a software distribution that manages a private instance of the HCP Terraform application.
+
+## Infrastructure administration
+- Maintenance
+- Upgrades
+- Backups
+- Monitoring
+
+## Application administration
+- Integrations
+- Customize the UI
+- Connect to agents
+- Policy settings
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/integration.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/integration.mdx
new file mode 100644
index 0000000000..455cccf375
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/integration.mdx
@@ -0,0 +1,70 @@
+---
+page_title: Integrate with external services
+description: >-
+ Integrate with external services to send communications and authenticate users. Learn how to configure cost estimation, and SAML, SMTP, and Twilio integrations.
+---
+
+# Integrate with External Services
+
+This topic describes how to integrate Terraform Enterprise with external services so that Terraform Enterprise can send communications and authenticate users. Refer to the [Admin Settings API](/terraform/enterprise/api-docs/admin/settings) for instructions on configuring integrations using the API.
+
+## Introdution
+
+You can integrate with the following external services:
+
+* Cost Estimation
+* SAML Single Sign-On
+* SMTP
+* Twilio
+
+## Cost Estimation Integration
+
+Cost Estimation integration allows Terraform Enterprise to estimate costs for resources during a run. Refer to the [usage instructions](/terraform/enterprise/cost-estimation).
+
+To access the Cost Estimation settings, click **Cost Estimation**. To enable Cost Estimation, check the **Enable Cost Estimation** box on the settings page, configure the settings, and click "Save settings." At least one provider needs to be configured in order to save.
+
+* **AWS Instance Profile**: If checked this option will be used without need to input the Access Key or Secret Key in the above form (fields will be greyed out).
+* **AWS Access Key ID**: The AWS Access Key ID for a given IAM user. The role associated to these credentials must have full access to the "Price List" service and all of that service's resources. Cost Estimation makes API calls in the `us-east-1` region.
+* **AWS Secret Key**: The AWS Secret Key pair for the same Access Key ID.
+* **GCP Credentials**: The contents of the JSON that is downloaded when you create a GCP Service Account.
+* **Azure Client ID**: The Azure Client ID for a given Service Account. The role associated to these credentials must have full access to the `RateCard` service and all of that service's resources.
+* **Azure Client Secret**: The Azure Client Secret pair for the same Client ID.
+* **Azure Subscription ID**: The Azure Subscription ID for your account.
+* **Azure Tenant ID**: The Azure Subscription ID for your account.
+
+## SAML Integration
+
+The SAML integration settings allow configuration of a SAML Single Sign-On integration for Terraform Enterprise. To access the SAML settings, click **SAML**.
+
+-> **Note:** Since enabling SAML is an involved process, there is a [separate SAML section of the documentation](/terraform/enterprise/saml/configuration). Consult those pages for detailed requirements and configuration instructions for both Terraform Enterprise and your IdP.
+
+To enable SAML, click **Enable SAML single sign-on** under "SAML Settings". Configure the fields below, then click **Save SAML settings**. To update the settings, update the field values, and save.
+
+The **Enable SAML debugging** option can be used if sign-on is failing. It provides additional debugging information during login tests. It should not be left on during normal operations.
+
+## SMTP Integration
+
+SMTP integration allows Terraform Enterprise to send email-based notifications, such as new user invitations, password resets, and system errors. We strongly recommend configuring SMTP.
+
+To access the SMTP settings, click **SMTP**. To enable SMTP, check the **Enable email sending with SMTP** box on the settings page, configure the settings, and click "Save SMTP settings."
+
+* **Sender Email**: The address that system mails should come from. A plain email address; do not include a display name.
+* **Send test email to**: A sample address to send a test email to. Used to validate the settings when configuring SMTP; not stored.
+* **Host** and **Port**: The host and port details for the SMTP server that will be used.
+* **Authentication**: The type of authentication used by the server. Options are `none`, `login`, and `plain`.
+* **Username**: Username used to authenticate to the server. Not required if the authentication setting is `none`.
+* **Password**: Password to authenticate to the server. Not required if the authentication setting is `none`.
+
+-> **Note**: The SMTP server used with Terraform Enterprise must support connection via SSL with a valid certificate and `STARTTLS` secure communication; `SMTPS` is not supported in Terraform Enterprise.
+
+## Twilio Integration
+
+Twilio integration is used to send SMS messages for two-factor authentication. It is optional; application-based 2FA is also supported.
+
+To access the Twilio settings, click **Twilio**. To enable Twilio, check the **Enable SMS sending with Twilio** box on the settings page and configure the relevant settings:
+
+* **Account SID**: The unique identifier for your Twilio [application](https://www.twilio.com/docs/usage/api/applications).
+* **Auth Token**: The token that allows [authentication](https://support.twilio.com/hc/en-us/articles/223136027-Auth-Tokens-and-How-to-Change-Them) with your Account SID.
+* **From Number**: The number the message should come from. Must be registered with Twilio.
+
+You can also verify the Twilio settings by sending a test message. Enter a number in the **From Number** field and click **Send Test SMS**.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/opa-tool-versions.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/opa-tool-versions.mdx
new file mode 100644
index 0000000000..e3eb94ab2e
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/opa-tool-versions.mdx
@@ -0,0 +1,30 @@
+---
+page_title: Add an Open Policy Agent (OPA) tool version
+description: >-
+ Learn how to add and manage Open Policy Agent (OPA) versions in the UI.
+---
+
+# Manage Open Policy Agent tool versions
+
+This topic describes how to specify which version of the Open Policy Agent (OPA) framework Terraform Enterprise uses to monitor compliance.
+
+## Requirements
+
+You must have one of the following user roles to access the **OPA Versions** page:
+
+- Site admin
+- Configuration
+- Support
+- Version maintenance
+
+## Add an OPA version
+
+1. Navigate to the **OPA Versions**
+1. Click **Add OPA version**.
+1. In the **Version** text box, enter the version number you want to add, for example `0.44.0`.
+1. Enable the **Enable this version** option.
+1. In the **URL** text box, enter `https://github.com/open-policy-agent/opa/releases/download/v0.44.0/opa_linux_amd64_static`.
+1. In the **SHA256 Checksum** text box, enter `5ddb21d3fcfca130a47a42e730c05f055c68af6c1b37465879f6c59b10527eae`.
+1. Click **Add OPA version** to complete the setup.
+
+Refer to the [OPA Github repository](https://github.com/open-policy-agent/opa/releases) releases page for additional information.
\ No newline at end of file
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/registry-sharing.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/registry-sharing.mdx
new file mode 100644
index 0000000000..64f1c634bf
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/registry-sharing.mdx
@@ -0,0 +1,58 @@
+---
+page_title: Share modules and providers from a private registry
+description: >-
+ Use registry sharing to share modules and providers with other organizations in the same Terraform Enterprise instance. Learn how to manage shared registries, stop sharing, and edit registry sharing settings in the UI.
+---
+
+# Share Modules and Providers from a Private Registry
+
+This topic describes how to share modules and providers from your private Terraform Enterprise registry.
+
+## Introduction
+
+Site administrators can share modules and providers from an organization's private registry with other organizations in the same Terraform Enterprise instance. This allows other organizations to use these modules and providers in their Terraform configuration without needing to ingress or maintain the modules or providers themselves.
+
+There are two ways to share between organizations:
+
+1. [Global sharing](#global-sharing): modules and providers from an organization are available to all other organizations in that Terraform Enterprise instance
+1. [Partnership sharing](#partnership-sharing): modules and providers from an organization are available to a specific set of organizations in that Terraform Enterprise instance
+
+**Note:** The two sharing options are mutually exclusive, so turning one on will turn the other one off. This means that if you have configured a set of partnerships for an organization, they will be lost if you switch that organization to use global sharing.
+
+-> **API:** Refer to the [Admin Organizations API](/terraform/enterprise/api-docs/admin/organizations).
+
+## Managing Shared Registries
+
+To access the list of shared registries in the Terraform Enterprise instance, click **Registry**.
+
+Click on **Select organization** to choose the organization that contains the modules or providers to share. Type the name of the sharing organization or select it from the drop-down.
+
+Once you select the sharing organization, you can configure the sharing type.
+
+### Global Sharing
+
+To share the organization's modules or providers with all other organizations in the Terraform Enterprise instance, click the toggle switch next to **Share modules with all organizations** or **Share providers with all organizations**.
+
+Click **Share registry** to save the sharing settings. You will be redirected to the initial registry sharing page, which now shows the organization sharing its registry with "All organizations".
+
+### Partnership Sharing
+
+To share the organization's modules or providers with a limited group of organizations, the corresponding toggle should be turned off. Add a list of consuming organizations by clicking on the dropdown below and selecting the name(s) of the organizations who will be able to access modules or providers from the sharing organization. If you have many organizations in the dropdown, you can start typing the name to filter the list.
+
+Once you have selected a list of organizations to share with, click **Share registry** to save the sharing settings. You will be redirected to the initial registry sharing page, which now shows how many organizations the organization is sharing its registry with.
+
+## Stop Sharing a Registry
+
+~> **Important**: Removing or changing existing sharing settings can break Terraform workspaces for organizations that are using shared modules or providers. Proceed with caution!
+
+To stop sharing modules or providers from the **Registry** page, click on the three dots next to any organization that's currently sharing modules or sharing providers.
+
+Click **Stop sharing**. You will be prompted to confirm the action by typing in the name of the organization.
+
+## Edit Registry Sharing Settings
+
+If you wish to change sharing settings for an organization, from the **Registry** page, click on the three dots next to any organization that's currently sharing modules or providers. Click **Edit sharing** and you will be able to modify the sharing settings for that organization. For example, you may wish to:
+
+- Share with an additional organization (add a consumer)
+- Stop sharing with an organization (remove a consumer)
+- Change an organization from partnership sharing to global sharing
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/resources.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/resources.mdx
new file mode 100644
index 0000000000..118280895d
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/resources.mdx
@@ -0,0 +1,93 @@
+---
+page_title: Manage Terraform Enterprise accounts and resources
+description: >-
+ Learn how Terraform Enterprise administrators can manage resources, users, organizations, workspaces, runs, and Terraform versions.
+---
+
+# Manage Accounts and Resources
+
+This topic describes how Terraform Enterprise site administrators can manage accounts and resources.
+
+## Introduction
+
+Terraform Enterprise site administrators have access to all organizations, users, runs, and workspaces. This visibility is intended to provide access to management actions such as adding administrators, updating Terraform versions or adding custom Terraform bundles, suspending or deleting users, and creating or deleting organizations. It also allows for "impersonation" to aid in assisting regular users with issues in the HCP Terraform application.
+
+-> **API:** Refer to the [Admin Users API](/terraform/enterprise/api-docs/admin/users), [Admin Organizations API](/terraform/enterprise/api-docs/admin/organizations), [Admin Workspaces API](/terraform/enterprise/api-docs/admin/workspaces), [Admin Runs API](/terraform/enterprise/api-docs/admin/runs) and [Admin Terraform Versions API](/terraform/enterprise/api-docs/admin/terraform-versions).
+
+## Viewing, Searching, and Filtering Lists
+
+Terraform Enterprise presents each type of account or resource as a searchable list that you can access by clicking the name of the resource. You can search and filter by relevant attributes, and the UI offers pre-existing filters to show useful sets, such as site administrators (users) or **Needs Attention** (workspaces, runs).
+
+## Managing Users
+
+To access the list of all users in the Terraform Enterprise instance, click **Users**.
+
+Selecting a user from the list shows their detail page, which includes their status and any organizations they belong to. The detail page offers four actions: promoting to administrator, suspending, deleting, and impersonating. For users with active [two-factor authentication (2FA)](/terraform/enterprise/users-teams-organizations/2fa), it also offers an administrative option to disable their 2FA in the event that a reset is needed.
+
+### Promoting a User to Administrator
+
+This adds the user to the list of site administrators, which grants them access to this administrative area. Because admins have a very wide purview, if SMTP is configured, it will also send an email to the other site administrators notifying them that a user was added.
+
+To promote a user, click **Promote to admin** on the user detail page.
+
+### Suspending or Deleting a User
+
+Suspending a user retains their account, but does not allow them to access any HCP Terraform resources. Deleting a user removes their account completely; they would have to create a new account in order to log in again.
+
+Suspended users can be unsuspended at any time. Deleted users cannot be recovered.
+
+To suspend a user, click **Suspend user**. To delete them, click **Delete User** in the "Delete User" section.
+
+### Impersonating a User
+
+User impersonation allows Terraform Enterprise admins to access organization and workspace data and view runs. As an administrator, direct access to these resources only supports urgent interventions like deletion or force-canceling; to view and interact with resources, impersonation is required.
+
+When impersonating a user, a reason is required and will be logged to the audit log. Any actions taken while impersonating will record both the impersonating admin and the impersonated user as the actor.
+
+Impersonation can be performed from multiple places:
+
+- From a user details admin page, click **Impersonate**.
+- From an organization, workspace, or run details admin page, all of which include a drop-down list of organization owners to impersonate.
+- When a site admin encounters a 404 error for a resource that they do not have standard user access to.
+
+### Resetting Two-Factor Authentication
+
+If a user has lost access to their 2FA device, a site admin can disable the configured 2FA and allow the user to log in using only their username and password or perform a standard password reset. If the user has active 2FA, a button labeled **Disable 2FA** appears next to the admin promotion button.
+
+Be sure that the user's identity and the validity of their request have been verified according to appropriate security procedures before disabling their configured 2FA.
+
+-> **Note:** If the user belongs to an organization that requires 2FA, upon login, they will be redirected to [set it up again](/terraform/enterprise/users-teams-organizations/2fa) before they can view any other part of Terraform Enterprise.
+
+## Managing Organizations
+
+The **Organizations** page lets you configure the organizations in your Terraform Enterprise instance. If there are multiple organizations, click each one in the admin list to view its details.
+
+You can disable or delete organizations, as well as impersonate an owner to modify an organization's settings, profile, and workspaces. You can also control whether the organization can use beta Terraform versions in runs, set timeouts for plans and applies, and set a limit on the number of workspaces that an organization can contain.
+
+Typically, all organizations on a Terraform Enterprise instance are granted "Premium" plan status to ensure access to all available features. However, it's also possible to set other statuses. An organization whose trial period is expired will be unable to make use of features in the HCP Terraform application.
+
+## Managing Workspaces and Runs
+
+The administrative view of workspaces and runs provides limited detail (name, status, and IDs) to avoid exposing sensitive data when it isn't needed. Site administrators can view and investigate workspaces and runs more deeply by impersonating a user with full access to the desired resource. (See [Impersonating a User](#impersonating-a-user) above.)
+
+### Deleting Workspaces
+
+A workspace can be administratively deleted, using the **Delete this Workspace** button on its details page, if it should not have been created, or is presenting issues for the application.
+
+### Force-Canceling Runs
+
+A run can be administratively force-canceled if it becomes stuck or is presenting issues to the application. Runs can be force-canceled from the run list or the run details page. The run details page also offers the option to impersonate an organization owner for additional details on the run.
+
+We recommend impersonating a user (if necessary) to view run details prior to force-canceling a run, to ensure that graceful cancellation was attempted, and that the run is no longer progressing.
+
+## Managing Terraform Versions
+
+Terraform Enterprise ships with a default list of Terraform versions. However, the addition of new versions after installation is the responsibility of site administrators.
+
+To add a new version of Terraform, click **Terraform Versions** and then click **Add Terraform Version**. Provide the version number, Linux 64-bit download URL, and SHA256 checksum of the binary. Set the status to **Beta** to make the version available to site administrators, or Enabled to add it for everyone.
+
+~> **Important:** Terraform Enterprise ships with a default list of Terraform versions. Any modifications to these default Terraform versions will be overwritten. As such, it is recommended to create new Terraform versions instead of modifying the default Terraform versions.
+
+The versions you add may be recent standard Terraform releases from HashiCorp, or custom Terraform versions. One common use for custom versions is to add a Terraform bundle that includes [pre-installed providers](/terraform/enterprise/run/install-software#custom-and-community-providers) commonly needed by the instance.
+
+Versions of Terraform can also be modified by clicking them in the list. They can be set to disabled (unavailable for use) if no workspaces are currently using them. The list indicates how many workspaces are currently using a given version.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/sentinel-tool-versions.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/sentinel-tool-versions.mdx
new file mode 100644
index 0000000000..1ed6a10395
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/application-administration/sentinel-tool-versions.mdx
@@ -0,0 +1,30 @@
+---
+page_title: Manage Sentinel tool versions in Terraform Enterprise
+description: >-
+ Learn how to add and manage Sentinel versions in the Terraform Enterprise user interface.
+---
+
+# Manage Sentinel tool versions
+
+This topic describes how to specify which version of Sentinel Terraform Enterprise uses to monitor compliance.
+
+## Requirements
+
+You must have one of the following user roles to access the **Sentinel Versions** page:
+
+- Site admin
+- Configuration
+- Support
+- Version maintenance
+
+## Add a Sentinel version
+
+1. Navigate to the **Sentinel Versions** page.
+1. Click **Add Sentinel version**.
+1. Enter `0.24.2` for **Version**.
+1. Check the **Enable this version** box.
+1. Enter `https://releases.hashicorp.com/sentinel/0.24.2/sentinel_0.24.2_linux_amd64.zip` for the **URL**.
+1. Enter `a17aad9797e7b9b0072c887c2e761703e2bee742ff327011ccec5e6686fc5b8b` as your **SHA256 Checksum**.
+1. Click **Add Sentinel version**.
+
+For more details, refer to the [Sentinel GitHub repository releases page](https://releases.hashicorp.com/sentinel).
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/cost-estimation/aws.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/cost-estimation/aws.mdx
new file mode 100644
index 0000000000..f777c0c65e
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/cost-estimation/aws.mdx
@@ -0,0 +1,158 @@
+---
+page_title: AWS resources included in cost estimation in Terraform Enterprise
+description: Learn which AWS resources Terraform Enterprise includes in cost estimation.
+source: terraform-docs-common
+---
+
+# AWS resources included in cost estimation
+
+HCP Terraform can estimate monthly costs for many AWS Terraform resources.
+
+-> **Note:** Terraform Enterprise requires AWS credentials to support cost estimation. These credentials are configured at the instance level, not the organization level. See the [Application Administration docs](/terraform/enterprise/admin/application/integration) for more details.
+
+## Supported Resources
+
+Cost estimation supports the following resources. Not all possible values for attributes of each resource are supported, ex. newer instance types or EBS volume types.
+
+| Resource | Incurs Cost |
+| ------------------------------------------- | ----------- |
+| `aws_alb` | X |
+| `aws_autoscaling_group` | X |
+| `aws_cloudhsm_v2_hsm` | X |
+| `aws_cloudwatch_dashboard` | X |
+| `aws_cloudwatch_metric_alarm` | X |
+| `aws_db_instance` | X |
+| `aws_dynamodb_table` | X |
+| `aws_ebs_volume` | X |
+| `aws_elasticache_cluster` | X |
+| `aws_elasticsearch_domain` | X |
+| `aws_elb` | X |
+| `aws_instance` | X |
+| `aws_kms_key` | X |
+| `aws_lb` | X |
+| `aws_rds_cluster_instance` | X |
+| `aws_acm_certificate_validation` | |
+| `aws_alb_listener` | |
+| `aws_alb_listener_rule` | |
+| `aws_alb_target_group` | |
+| `aws_alb_target_group_attachment` | |
+| `aws_api_gateway_api_key` | |
+| `aws_api_gateway_deployment` | |
+| `aws_api_gateway_integration` | |
+| `aws_api_gateway_integration_response` | |
+| `aws_api_gateway_method` | |
+| `aws_api_gateway_method_response` | |
+| `aws_api_gateway_resource` | |
+| `aws_api_gateway_usage_plan_key` | |
+| `aws_appautoscaling_policy` | |
+| `aws_appautoscaling_target` | |
+| `aws_autoscaling_lifecycle_hook` | |
+| `aws_autoscaling_policy` | |
+| `aws_cloudformation_stack` | |
+| `aws_cloudfront_distribution` | |
+| `aws_cloudfront_origin_access_identity` | |
+| `aws_cloudwatch_event_rule` | |
+| `aws_cloudwatch_event_target` | |
+| `aws_cloudwatch_log_group` | |
+| `aws_cloudwatch_log_metric_filter` | |
+| `aws_cloudwatch_log_stream` | |
+| `aws_cloudwatch_log_subscription_filter` | |
+| `aws_codebuild_webhook` | |
+| `aws_codedeploy_deployment_group` | |
+| `aws_cognito_identity_provider` | |
+| `aws_cognito_user_pool` | |
+| `aws_cognito_user_pool_client` | |
+| `aws_cognito_user_pool_domain` | |
+| `aws_config_config_rule` | |
+| `aws_customer_gateway` | |
+| `aws_db_parameter_group` | |
+| `aws_db_subnet_group` | |
+| `aws_dynamodb_table_item` | |
+| `aws_ecr_lifecycle_policy` | |
+| `aws_ecr_repository_policy` | |
+| `aws_ecs_cluster` | |
+| `aws_ecs_task_definition` | |
+| `aws_efs_mount_target` | |
+| `aws_eip_association` | |
+| `aws_elastic_beanstalk_application` | |
+| `aws_elastic_beanstalk_application_version` | |
+| `aws_elastic_beanstalk_environment` | |
+| `aws_elasticache_parameter_group` | |
+| `aws_elasticache_subnet_group` | |
+| `aws_flow_log` | |
+| `aws_iam_access_key` | |
+| `aws_iam_account_alias` | |
+| `aws_iam_account_password_policy` | |
+| `aws_iam_group` | |
+| `aws_iam_group_membership` | |
+| `aws_iam_group_policy` | |
+| `aws_iam_group_policy_attachment` | |
+| `aws_iam_instance_profile` | |
+| `aws_iam_policy` | |
+| `aws_iam_policy_attachment` | |
+| `aws_iam_role` | |
+| `aws_iam_role_policy` | |
+| `aws_iam_role_policy_attachment` | |
+| `aws_iam_saml_provider` | |
+| `aws_iam_service_linked_role` | |
+| `aws_iam_user` | |
+| `aws_iam_user_group_membership` | |
+| `aws_iam_user_login_profile` | |
+| `aws_iam_user_policy` | |
+| `aws_iam_user_policy_attachment` | |
+| `aws_iam_user_ssh_key` | |
+| `aws_internet_gateway` | |
+| `aws_key_pair` | |
+| `aws_kms_alias` | |
+| `aws_lambda_alias` | |
+| `aws_lambda_event_source_mapping` | |
+| `aws_lambda_function` | |
+| `aws_lambda_layer_version` | |
+| `aws_lambda_permission` | |
+| `aws_launch_configuration` | |
+| `aws_lb_listener` | |
+| `aws_lb_listener_rule` | |
+| `aws_lb_target_group` | |
+| `aws_lb_target_group_attachment` | |
+| `aws_network_acl` | |
+| `aws_network_acl_rule` | |
+| `aws_network_interface` | |
+| `aws_placement_group` | |
+| `aws_rds_cluster_parameter_group` | |
+| `aws_route` | |
+| `aws_route53_record` | |
+| `aws_route53_zone_association` | |
+| `aws_route_table` | |
+| `aws_route_table_association` | |
+| `aws_s3_bucket` | |
+| `aws_s3_bucket_notification` | |
+| `aws_s3_bucket_object` | |
+| `aws_s3_bucket_policy` | |
+| `aws_s3_bucket_public_access_block` | |
+| `aws_security_group` | |
+| `aws_security_group_rule` | |
+| `aws_service_discovery_service` | |
+| `aws_sfn_state_machine` | |
+| `aws_sns_topic` | |
+| `aws_sns_topic_subscription` | |
+| `aws_sqs_queue` | |
+| `aws_sqs_queue_policy` | |
+| `aws_ssm_maintenance_window` | |
+| `aws_ssm_maintenance_window_target` | |
+| `aws_ssm_maintenance_window_task` | |
+| `aws_ssm_parameter` | |
+| `aws_subnet` | |
+| `aws_volume_attachment` | |
+| `aws_vpc` | |
+| `aws_vpc_dhcp_options` | |
+| `aws_vpc_dhcp_options_association` | |
+| `aws_vpc_endpoint` | |
+| `aws_vpc_endpoint_route_table_association` | |
+| `aws_vpc_endpoint_service` | |
+| `aws_vpc_ipv4_cidr_block_association` | |
+| `aws_vpc_peering_connection_accepter` | |
+| `aws_vpc_peering_connection_options` | |
+| `aws_vpn_connection_route` | |
+| `aws_waf_ipset` | |
+| `aws_waf_rule` | |
+| `aws_waf_web_acl` | |
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/cost-estimation/azure.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/cost-estimation/azure.mdx
new file mode 100644
index 0000000000..5647698512
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/cost-estimation/azure.mdx
@@ -0,0 +1,56 @@
+---
+page_title: Azure resources included in cost estimation in Terraform Enterprise
+description: Learn which Azure resources Terraform Enterprise includes in cost estimation.
+source: terraform-docs-common
+---
+
+# Azure resources included in cost estimation
+
+HCP Terraform can estimate monthly costs for many Azure Terraform resources.
+
+-> **Note:** Terraform Enterprise requires Azure credentials to support cost estimation. These credentials are configured at the instance level, not the organization level. See the [Application Administration docs](/terraform/enterprise/admin/application/integration) for more details.
+
+## Supported Resources
+
+Cost estimation supports the following resources. Not all possible values for attributes of each resource are supported, ex. newer VM sizes or managed disk types.
+
+| Resource | Incurs Cost |
+| ------------------------------------------------------ | ----------- |
+| `azurerm_app_service_custom_hostname_binding` | X |
+| `azurerm_app_service_environment` | X |
+| `azurerm_app_service_plan` | X |
+| `azurerm_app_service_virtual_network_swift_connection` | X |
+| `azurerm_cosmosdb_sql_database` | X |
+| `azurerm_databricks_workspace` | X |
+| `azurerm_firewall` | X |
+| `azurerm_hdinsight_hadoop_cluster` | X |
+| `azurerm_hdinsight_hbase_cluster` | X |
+| `azurerm_hdinsight_interactive_query_cluster` | X |
+| `azurerm_hdinsight_kafka_cluster` | X |
+| `azurerm_hdinsight_spark_cluster` | X |
+| `azurerm_integration_service_environment` | X |
+| `azurerm_linux_virtual_machine` | X |
+| `azurerm_linux_virtual_machine_scale_set` | X |
+| `azurerm_managed_disk` | X |
+| `azurerm_mariadb_server` | X |
+| `azurerm_mssql_elasticpool` | X |
+| `azurerm_mysql_server` | X |
+| `azurerm_postgresql_server` | X |
+| `azurerm_sql_database` | X |
+| `azurerm_virtual_machine` | X |
+| `azurerm_virtual_machine_scale_set` | X |
+| `azurerm_windows_virtual_machine` | X |
+| `azurerm_windows_virtual_machine_scale_set` | X |
+| `azurerm_app_service` | |
+| `azurerm_cosmosdb_account` | |
+| `azurerm_cosmosdb_sql_container` | |
+| `azurerm_cosmosdb_table` | |
+| `azurerm_mysql_database` | |
+| `azurerm_network_security_group` | |
+| `azurerm_postgresql_database` | |
+| `azurerm_resource_group` | |
+| `azurerm_sql_server` | |
+| `azurerm_sql_virtual_network_rule` | |
+| `azurerm_subnet` | |
+| `azurerm_subnet_route_table_association` | |
+| `azurerm_virtual_network` | |
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/cost-estimation/gcp.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/cost-estimation/gcp.mdx
new file mode 100644
index 0000000000..e1660de815
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/cost-estimation/gcp.mdx
@@ -0,0 +1,42 @@
+---
+page_title: GCP resources included in cost estimation in Terraform Enterprise
+description: Learn which GCP resources Terraform Enterprise includes in cost estimation.
+source: terraform-docs-common
+---
+
+# GCP resources included in cost estimation
+
+HCP Terraform can estimate monthly costs for many GCP Terraform resources.
+
+-> **Note:** Terraform Enterprise requires GCP credentials to support cost estimation. These credentials are configured at the instance level, not the organization level. See the [Application Administration docs](/terraform/enterprise/admin/application/integration) for more details.
+
+## Supported Resources
+
+Cost estimation supports the following resources. Not all possible values for attributes of each resource are supported, ex. new or custom machine types.
+
+| Resource | Incurs Cost |
+| --------------------------------------- | ----------- |
+| `google_compute_disk` | X |
+| `google_compute_instance` | X |
+| `google_sql_database_instance` | X |
+| `google_billing_account_iam_member` | |
+| `google_compute_address` | |
+| `google_compute_subnetwork_iam_member` | |
+| `google_folder_iam_member` | |
+| `google_folder_iam_policy` | |
+| `google_kms_crypto_key_iam_member` | |
+| `google_kms_key_ring_iam_member` | |
+| `google_kms_key_ring_iam_policy` | |
+| `google_organization_iam_member` | |
+| `google_project` | |
+| `google_project_iam_member` | |
+| `google_project_iam_policy` | |
+| `google_project_service` | |
+| `google_pubsub_subscription_iam_member` | |
+| `google_pubsub_subscription_iam_policy` | |
+| `google_pubsub_topic_iam_member` | |
+| `google_service_account` | |
+| `google_service_account_iam_member` | |
+| `google_service_account_key` | |
+| `google_storage_bucket_iam_member` | |
+| `google_storage_bucket_iam_policy` | |
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/cost-estimation/index.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/cost-estimation/index.mdx
new file mode 100644
index 0000000000..d81c7e6c17
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/cost-estimation/index.mdx
@@ -0,0 +1,58 @@
+---
+page_title: Cost estimation overview for Terraform Enterprise
+description: >-
+ Terraform Enterprise can estimate the total cost and delta of resources from
+ your Terraform configuration. Use cost estimation to get hourly and monthly
+ cost estimates for each resource.
+source: terraform-docs-common
+---
+
+# Cost estimation overview
+
+> **Hands-on:** Try the [Control Costs with Policies](/terraform/tutorials/cloud-get-started/cost-estimation) tutorial to practice enabling cost estimation and define a policy to check the total monthly delta.
+
+HCP Terraform provides cost estimates for many resources found in your Terraform configuration. For each resource an hourly and monthly cost is shown, along with the monthly delta. The total cost and delta of all estimable resources is also shown.
+
+## Enabling Cost Estimation
+
+HCP Terraform disables cost estimation by default. To enable cost estimation:
+
+1. Sign in to [HCP Terraform](https://app.terraform.io/) or Terraform Enterprise, then navigate to the organization where you want to enable cost estimation.
+2. Choose **Settings** from the sidebar, then **Cost Estimation**.
+3. Toggle the **Enable cost estimation for all workspaces** setting.
+4. Click **Update settings**.
+
+## Viewing a Cost Estimate
+
+When enabled, HCP Terraform performs a cost estimate for every run. Estimated costs appear in the run UI as an extra run phase, between the plan and apply.
+
+The estimate displays a total monthly cost by default; you can expand the estimate to see an itemized list of resource costs, as well as the list of unestimated resources.
+
+Note that this is just an estimate; some resources don't have cost information available or have unpredictable usage-based pricing. Supported resources are listed in this document's sub-pages.
+
+## Verifying Costs in Policies
+
+You can use a Sentinel policy to validate your configuration's cost estimates using the [`tfrun`](/terraform/enterprise/policy-enforcement/import-reference/tfrun) import. The example policy below checks that the new cost delta is no more than $100. A new `t3.nano` instance should be well below that. A `decimal` import is available for more accurate math when working with currency numbers.
+
+```python
+import "tfrun"
+import "decimal"
+
+delta_monthly_cost = decimal.new(tfrun.cost_estimate.delta_monthly_cost)
+
+if delta_monthly_cost.greater_than(100) {
+ print("This policy prevents a user from increasing their spending by more than $100 per month in a single run without a warning.")
+}
+
+main = rule {
+ delta_monthly_cost.less_than(100)
+}
+```
+
+## Supported Resources
+
+Cost estimation in HCP Terraform supports Terraform resources within three major cloud providers.
+
+- [AWS](/terraform/enterprise/cost-estimation/aws)
+- [GCP](/terraform/enterprise/cost-estimation/gcp)
+- [Azure](/terraform/enterprise/cost-estimation/azure)
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/index.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/index.mdx
new file mode 100644
index 0000000000..e471614c11
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/index.mdx
@@ -0,0 +1,18 @@
+---
+page_title: Create deployment configuration overview
+description: Learn about the deployment configuration file for your runtime environment
+---
+
+# Create deployment configuration overview
+
+This topic provides overview information about how to create the deployment configuration file for non-Replicated runtimes. If you are deploying Terraform Enterprise to Replicated, refer [Deploy to Replicated](//terraform/enterprise/deploy/replicated) for instructions.
+
+## Workflow
+
+Create a deployment configuration file for your runtime environment and specify the Terraform Enterprise configurations. For example, create a values.yaml if you are deploying to Kubernetes or a compose.yaml file if you are deploying to Docker. The runtime platform starts the Linux container for Terraform Enterprise according to the settings defined in the configuration file. Specify settings to control the following actions:
+
+1. Access the HashiCorp license: If you do not have a license, contact your HashiCorp account manager. Refer to [Configure a license](/terraform/enterprise/deploy/configuration/license) for instructions.
+1. Enable access to external services. Configure ingress and egress ports so that Terraform Enterprise can provision resources and perform other tasks. Refer to [Configure network access](/terraform/enterprise/deploy/configuration/network) for instructions.
+1. Enable the operation mode. You can operate Terraform Enterprise in different modes that determine how it manages and stores data. Refer to [Configure operational mode](/terraform/enterprise/deploy/configuration/storage/configure-mode) for instructions on how to set the mode.
+1. Store and retrieve data. You can configure how Terraform Enterprise stores and retrieves data associated with your infrastructure resources. Refer to [Data storage settings overview](/terraform/enterprise/deploy/configuration/storage/) for additional information.
+1. Customize the Terraform application. Terraform Enterprise performs Terraform runs in ephemeral containers. It is optional, but you can add custom tools and logic to your Terraform run environment. Refer to [Customize run environment](/terraform/enterprise/deploy/custom-image) for instructions.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/license.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/license.mdx
new file mode 100644
index 0000000000..925eb1d532
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/license.mdx
@@ -0,0 +1,34 @@
+---
+page_title: Configure a Terraform Enterprise license
+description: You must configure a license to deploy Terraform Enterprise to a supported runtime environment. Learn how to acquire and configure a Terraform Enterprise license.
+---
+
+# Configure a license
+
+This topic describes how to configure the license so that you can deploy Terraform Enterprise to one of the supported runtimes environments. For information about configuring a Terraform Enterprise for the Replicated platform, refer to [Deploy Terraform Enterprise to Replicated](/terraform/enterprise/deploy/replicated).
+
+
+## Acquiring a new Terraform Enterprise license
+
+To acquire a new Terraform Enterprise license from HashiCorp, contact your account manager.
+
+## Apply the Terraform Enterprise license
+
+There are two ways to apply the new license file on startup:
+
+- Provide the body of the license file as a string to an environment variable called `TFE_LICENSE`.
+- Store the license in a file and provide the file path to an environment variable called `TFE_LICENSE_PATH`.
+
+## License expiration and termination
+
+To prevent unexpected outages caused by delays in license updates, HashiCorp licenses provisioned for production use
+will not terminate on their expiry date.
+
+If your license expires, you cannot use it for authentication with the HashiCorp image registry (`images.registry.hashicorp.com`). If you configure your installation to pull directly from the HashiCorp registry and your license expires, you cannot reinstall, scale, or upgrade. You can check your license expiration date using the [`tfectl app license` command](/terraform/enterprise/deploy/reference/cli#review-hashicorp-license-status).
+
+## License updates
+
+To update an existing installation with a new license, you will need to modify the `TFE_LICENSE` or `TFE_LICENSE_PATH`
+variable and restart the application.
+
+@include "replicated-and-fdo/admin/license-example-usage-payload.mdx"
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/network.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/network.mdx
new file mode 100644
index 0000000000..7a3dfa1f46
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/network.mdx
@@ -0,0 +1,240 @@
+---
+page_title: Configure network access for Terraform Enterprise installation
+description: Linux instances running Terraform Enterprise require network access to send and receive traffic. Learn how to configure network access.
+---
+
+# Configure network access
+
+This topic describes how to configure network settings to allow Terraform to send and receive traffic. Refer to [Create deployment configuration overview](/terraform/enterprise/deploy/configuration) for an overview of the configuration process.
+
+## Overview
+
+You must configure the Linux instance that runs Terraform Enterprise to allow incoming network traffic across several ports. You must also configure Terraform Enterprise to access several external services so that Terraform can download and update resources.
+
+Configure the following parameters in your deployment configuration file to configure network access:
+
+1. Ports for ingress traffic. The Terraform binary accepts traffic from the following sources:
+ - users
+ - clients
+ - VCS
+ - metrics
+ - TFE servers
+1. Egress destination endpoints. To run Terraform Enterprise in an airgapped environment, you must also whitelist the domains that serve the Terraform Enterprise image from the registry.
+1. For Docker deployments, you can also disable access to EC2 instance metadata service.
+1. Specify any optional network settings, such cloud provider API endpoints for cost estimation.
+1. Specify any specific network settings necessary for your environment, such as allowing traffic through firewalls.
+
+Refer to [environment variables configuration reference](/terraform/enterprise/deploy/) for information about all environment variables.
+
+
+## Define ingress settings
+
+Specify the following values in your deployment configuration file to configure access into Terraform Enterprise. Refer to [Configuration reference](/terraform/enterprise/deploy/reference/configuration) for information about all configuration settings.
+
+### Hostnames
+
+Specify the following settings in your deployment configuration file to set the hostname:
+
+- [`TFE_HOSTNAME`](/terraform/enterprise/deploy/reference/configuration#tfe_hostname): This should match the hostname you created when preparing the host environment. Refer to [Assign a DNS hostname](/terraform/enterprise/deploy/prepare-host#assign-a-dns-hostname) for additional information.
+- [`TFE_HOSTNAME_SECONDARY`](/terraform/enterprise/deploy/reference/configuration#tfe_hostname): You should only configure this setting if you created a secondary hostname for external-facing endpoints when preparing the host environment. Refer to [Assign a DNS hostname](/terraform/enterprise/deploy/prepare-host#assign-a-dns-hostname) for additional information.
+
+
+### Enable access from users, clients, and VCS
+
+Specify the following settings in your deployment configuration file to enable ingress from users, clients, and the VCS:
+
+- `TFE_HTTP_PORT`: Specifies the port for accessing Terraform Enterprise over HTTP. HTTP redirects to HTTPS. The default value is `80`.
+- `TFE_HTTPS_PORT`: Specifies the port for accessing Terraform Enterprise over HTTPS. The default is `443`.
+
+#### Ports for Podman
+
+Podman does not expose privileged ports. If you are deploying to Podman, specify the variables in the `kube.yaml` pod specification file:
+
+```yaml
+- name: "TFE_HTTP_PORT"
+ value: "8080"
+- name: "TFE_HTTPS_PORT"
+ value: "8443"
+```
+
+You must also specify the port values in the `kube.yaml` pod specification file:
+
+```yaml
+"ports":
+- "containerPort": 8080
+ "hostPort": 80
+- "containerPort": 8443
+ "hostPort": 443
+- "containerPort": 9090
+ "hostPort": 9090
+```
+
+#### Integrate with SaaS version control provider
+
+To integrate with SaaS VCSs, such as GitHub.com, GitLab.com, Bitbucket Cloud, Azure DevOps Services, you must enable ingress from the public internet so that you can use inbound web hooks to reach Terraform Enterprise. Refer [Webhooks](/terraform/enterprise/vcs#webhooks) for additional information.
+
+You should also configure appropriate security controls, such as a web application firewall (WAF). Refer to your cloud provider documentation for instructions about deploying a WAF.
+
+### Enable requests for metrics
+
+Specify the following variables in your deployment configuration file to enable Terraform Enterprise to receive requests for system metrics:
+
+- `TFE_METRICS_HTTP_PORT`: TCP port on which Terraform Enterprise handles HTTP metrics requests. Default is `9090`.
+- `TFE_METRICS_HTTPS_PORT`: TCP port on which Terraform Enterprise handles HTTPS metrics requests. Default is `9091`.
+
+The metrics endpoints are optional. You can enable metrics collection by setting `TFE_METRICS_ENABLE` to `true`.
+
+### Terraform Enterprise servers
+
+If you plan to operate Terraform Enterprise in `active-active` mode, forward requests to port `8201` to enable high availability requests from Vault.
+
+## Define egress settings
+
+Add the following destination endpoints to your deployment configuration file so that Terraform can connect to external services.
+
+### HashiCorp container registry
+
+- `https://images.releases.hashicorp.com`: The endpoint hosts release container images.
+- `https://helm.releases.hashicorp.com`: The endpoint hosts the helm chart for Kubernetes installation.
+
+### Domains to whitelist for airgapped environments
+
+To run Terraform Enterprise in an airgapped environment, you must also whitelist the following domains. This because the service that provides the container image is globally routable and may come from any of the regions:
+
+- `s3-r-w.us-east-1.amazonaws.com`
+- `s3-r-w.us-west-2.amazonaws.com`
+- `s3-r-w.eu-central-1.amazonaws.com`
+- `s3-r-w.eu-west-1.amazonaws.com`
+
+Note that the domains are owned by Amazon, not HashiCorp, and may change at any time. Refer to this documentation to verify the domains each time you run the deployment configuration.
+
+### HashiCorp service APIs
+
+Terraform Enterprise calls the following hostnames unless you have supplied a custom Terraform bundle. Refer to [Custom and Community Providers](/terraform/enterprise/run/install-software#custom-and-community-providers)
+for additional information:
+
+- `registry.terraform.io`
+- `releases.hashicorp.com`
+- `https://yy0ffni7mf-dsn.algolia.net/`: Specifies the API endpoint of the Terraform Registry's [Algolia](https://www.algolia.com) application. Terraform Enterprise uses Algolia to index resources in the registry and power the public search feature.
+- `reporting.hashicorp.services`: Specifies the license entitlement reporting API endpoint. Refer to [Enable automated license reports](/terraform/enterprise/deploy/manage/license-report) for additional information.
+
+
+### Additional outbound network targets
+
+Terraform Enterprise also needs egress access to the following systems:
+
+- Any VCS servers and services you that you plan to use.
+- Login or authentication servers if you want to enable ADFS, Okta, or other SAML services.
+- Cloud API endpoints that you intend to manage with Terraform
+- Third party services that you intend to integrate or manage with the Terraform Enterprise server.
+
+### Cost estimation APIs
+
+When [Cost Estimation](/terraform/enterprise/application-administration/integration#cost-estimation-integration) is enabled, Terraform Enterprise uses the following cloud provider's APIs to get up-to-date pricing information:
+
+- `api.pricing.us-east-1.amazonaws.com`
+- `cloudbilling.googleapis.com`
+- `prices.azure.com`
+
+## Specify the Docker network container for run execution
+
+In the [`TFE_RUN_PIPELINE_DOCKER_NETWORK` configuration](/terraform/enterprise/deploy/reference/configuration#tfe_run_pipeline_docker_network), specify the network address where Docker creates the container Terraform uses to execute runs. This is an optional configuration that enables you to prevent Terraform Enterprise from accessing the EC2 instance metadata service in AWS. Refer to [Disable access to EC2 instance metadata service](#disable-access-to-ec2-instance-metadata-service) for instructions.
+
+The network must already exist and will not be created automatically. Leave blank to use the default network. Defaults to `""`.
+
+
+## Disable access to EC2 instance metadata service
+
+1. Create a Docker network. Docker uses this network to create containers that run Terraform Enterprise. We recommend using a name that matches your deployment. The following example creates a network called `tfe-workers`:
+
+ ```shell-session
+ $ docker network create tfe-workers
+ ```
+
+1. Run the `docker network inspect` command to get the subnet and gateway for the Docker network:
+
+ ```shell-session
+ $ docker network inspect tfe-workers
+ ```
+
+1. Copy the subnet address from the `docker network inspect` command output so that you can use it in the IP table. In the following example, the subnet is `172.18.0.0/16`:
+
+ ```json
+ [
+ {
+ "Name": "tfe-workers",
+ "Id": "10cd24aeba3df774ef2bf1dcb64cadbf2016160fd2cd64bb46f07595e8eb3a83",
+ "Created": "2024-07-08T13:09:52.596315311-07:00",
+ "Scope": "local",
+ "Driver": "bridge",
+ "EnableIPv6": false,
+ "IPAM": {
+ "Driver": "default",
+ "Options": {},
+ "Config": [
+ {
+ "Subnet": "172.18.0.0/16",
+ "Gateway": "172.18.0.1"
+ }
+ ]
+ },
+ "Internal": false,
+ "Attachable": false,
+ "Ingress": false,
+ "ConfigFrom": {
+ "Network": ""
+ },
+ "ConfigOnly": false,
+ "Containers": {},
+ "Options": {},
+ "Labels": {}
+ }
+ ]
+ ```
+
+1. Add a rule to the IP table that blocks Terraform Enterprise access to the EC2 instance metadata service. Specify the EC2 instance metadata service address, `169.254.169.254`, as the destination and the subnet address you copied in step 3 as the source. You can use the following command template and replace `` with your subnet address to add the rule using the `iptables` command:
+
+ ```shell-session
+ $ iptables -I DOCKER-USER -d 169.254.169.254 -s -j DROP
+ ```
+
+1. Ensure that the `TFE_RUN_PIPELINE_DOCKER_NETWORK` environment variable is set to the name of the Docker network you created in your Docker Compose file for deploying Terraform Enterprise. The following example sets the variable to a network named `tfe-workers`:
+
+ ```yaml
+ services:
+ tfe:
+ environment:
+ TFE_RUN_PIPELINE_DOCKER_NETWORK: tfe-workers
+ ```
+
+When you start Terraform Enterprise, the Terraform Enterprise container will connect to the `tfe-workers` Docker network and apply the IP table rule.
+
+## Specify integration settings
+
+You can configure Terraform Enterprise to be accessible over a primary and a secondary hostname. Configuring multiple hostnames lets you federate workloads associated with external services, such as OIDC, version control systems (VCS), and custom run tasks. Configure [`TFE_HOSTNAME_SECONDARY`](/terraform/enterprise/deploy/reference/configuration#tfe_hostname_secondary) to direct integration traffic to a secondary host name and specify `primary` or `secondary` for each integration type:
+
+- [`TFE_OIDC_HOSTNAME_CHOICE`](/terraform/enterprise/deploy/reference/configuration#tfe_oidc_hostname_choice)
+- [`TFE_VCS_HOSTNAME_CHOICE`](/terraform/enterprise/deploy/reference/configuration#tfe_vcs_hostname_choice)
+- [`TFE_RUN_TASK_HOSTNAME_CHOICE`](/terraform/enterprise/deploy/reference/configuration#tfe_run_task_hostname_choice)
+
+
+## Specify additional configuration settings
+
+1. If a firewall is configured on the instance, run one of the following commands to allow traffic to flow out of the `docker0` interface to the instance's primary address. We recommend doing this before you install Docker.
+
+ - To use UFW, run: `ufw allow in on docker0`
+ - To use firewalld, run: `firewall-cmd --permanent --zone=trusted --change-interface=docker0`
+
+1. Get a domain name for the instance. Using an IP address to access the product is not supported as many systems use TLS and need to verify that the certificate is correct, which can only be done with a hostname at present.
+
+1. **For GCP only:** Configure Docker to use an MTU (maximum transmission unit) of `1460`, as required by Google ([GCP Cloud VPN Documentation: MTU Considerations](https://cloud.google.com/network-connectivity/docs/vpn/concepts/mtu-considerations)).
+
+ To configure Docker's MTU, create an `/etc/docker/daemon.json` file with the following content:
+
+ ```json
+ {
+ "mtu": 1460
+ }
+ ```
+
+1. Ensure that the Docker bridge network address is not being used elsewhere on the network. If it is, refer to the [Docker documentation](https://docs.docker.com/network/bridge/) for information on how to change it.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/configure-mode.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/configure-mode.mdx
new file mode 100644
index 0000000000..1ad93623c7
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/configure-mode.mdx
@@ -0,0 +1,87 @@
+---
+page_title: Configure operational mode for Terraform Enterprise deployments
+description: Terraform Enterprise's operational mode determines data storage, which affects resilience and scalability. Learn how to configure the operational mode for your deployment.
+---
+
+# Configure the operational mode
+
+This topic describes how to specify the operational mode for your Terraform Enterprise deployment.
+
+## Introduction
+
+The operational mode determines where Terraform Enterprise stores and retrieves data, which can impact your backup and restore procedures, disaster recovery procedures, and scaling options. The operational mode is required to deploy Terraform Enterprise for all runtimes except Kubernetes. Refer to [Data storage settings overview](/terraform/enterprise/deploy/configuration/storage) for additional information.
+
+### Recommended modes
+
+Use the following guidelines to help you choose the appropriate mode.
+
+#### `active-active`
+
+Set `TFE_OPERATIONAL_MODE` to `active-active` under the following conditions:
+
+- Your environment has an external PostgreSQL server, S3-compatible object storage, and Redis instance.
+- You have experience managing a PostgreSQL server, such as Amazon RDS for PostgreSQL, Google Cloud SQL for PostgreSQL, or Azure Database for PostgreSQL.
+- You have experience managing an S3-compatible object storage location, such as AWS S3, Azure Blob Storage, Google Cloud Storage, or MinIO.
+- You have experience managing a Redis instance, such as AWS ElastiCache for Redis, Azure Cache for Redis, or Google Cloud Memorystore for Redis.
+- You want to use native backup and restore features provided by the external PostgreSQL server and S3-compatible object storage.
+- You want to scale beyond a single instance of Terraform Enterprise to increase reliability and performance.
+
+#### `external`
+
+Set `TFE_OPERATIONAL_MODE` to `external` under the following conditions:
+
+- Your environment has an external PostgreSQL server, S3-compatible object storage, and Redis instance.
+- You have experience managing a PostgreSQL server, such as Amazon RDS for PostgreSQL, Google Cloud SQL for PostgreSQL, or Azure Database for PostgreSQL.
+- You have experience managing an S3-compatible object storage location, such as AWS S3, Azure Blob Storage, Google Cloud Storage, or MinIO.
+- You have experience managing a Redis instance, such as AWS ElastiCache for Redis, Azure Cache for Redis, or Google Cloud Memorystore for Redis.
+- You want to use native backup and restore features provided by the external PostgreSQL server and S3-compatible object storage.
+- You want to scale beyond a single instance of Terraform Enterprise to increase reliability and performance.
+
+#### `disk`
+
+Set `TFE_OPERATIONAL_MODE` to `disk` under the following conditions:
+
+- Your environment does not have an external PostgreSQL server or S3-compatible object storage.
+- You have experience managing persistent storage, such as an AWS EBS volume, an Azure Managed Disk, a Google Cloud Persistent Disk, or an iSCSI location.
+- You are familiar with using command line tools, such as `cp`, `scp`, and `rsync`, to backup and restore data.
+
+## Requirements
+
+The requirements depend on which operational mode you choose.
+
+### `external` mode
+
+- Refer to the [PostgreSQL configuration requirements](/terraform/enterprise/deploy/configuration/storage/connect-database) for stateful application data storage requirement details.
+- Refer to the [data object storage configuration requirements](/terraform/enterprise/deploy/configuration/storage/connect-object) for requirements.
+
+### `active-active` mode
+
+- Refer to the [PostgreSQL configuration requirements](/terraform/enterprise/deploy/configuration/storage/connect-database) for stateful application data storage requirement details.
+- Refer to the [data object storage configuration requirements](/terraform/enterprise/deploy/configuration/storage/connect-object) for requirements.
+- Refer to the [Redis data store configuration requirements](/terraform/enterprise/deploy/configuration/storage/connect-redis) for requirements.
+
+### `disk` mode
+
+One of the following mounted disk types is required for the persistent storage volume:
+
+- AWS EBS
+- GCP zonal persistent disk
+- Azure disk storage
+- iSCSI
+- SAN
+- A disk physically connected to the host machine
+
+## Specify operational mode
+
+Add the `TFE_OPERATIONAL_MODE` variable to your Terraform Enterprise configuration and specify a mode. The following example sets the mode to `external` when deploying to Docker:
+
+```yaml
+name: terraform-enterprise
+services:
+ tfe:
+ image: images.releases.hashicorp.com/hashicorp/terraform-enterprise:
+ environment:
+ TFE_OPERATIONAL_MODE: "external"
+```
+
+Refer to the [`TFE_OPERATIONAL_MODE` configuration reference](/terraform/enterprise/deploy/reference/configuration) for details about operational mode settings.
\ No newline at end of file
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/aurora.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/aurora.mdx
new file mode 100644
index 0000000000..f2a71b8feb
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/aurora.mdx
@@ -0,0 +1,100 @@
+---
+page_title: Connect to a PostgreSQL cluster deployed to Aurora
+description: Learn how to connect Terraform Enterprise to a highly-available PostgreSQL database cluster deployed to AWS Aurora.
+---
+
+# Connect to a PostgreSQL cluster deployed to Aurora
+
+This topic describes how to connect Terraform Enterprise to a highly-available PostgreSQL cluster deployed to AWS Aurora.
+
+
+
+**Connecting to a database cluster is in beta**. These instructions describe an example scenario that we tested and verified for non-production use cases. You should evaluate your requirements and business needs to determine the optimal architecture and configurations for your specific environment.
+
+
+
+## Overview
+
+To connect Terraform Enterprise to a highly-available PostgreSQL cluster deployed to AWS Aurora, deploy the Aurora cluster and specify the cluster endpoint in the Terraform Enterprise configuration.
+
+It is optional, but you can create and run a test workload against Terraform Enterprise to measure the resilience of your high availability PostgreSQL cluster.
+
+### AWS Aurora
+
+AWS Aurora is a managed database service that natively supports high-availability and a writer or cluster endpoint that does not require load balancing. Aurora supports read-only endpoints, but Terraform Enterprise does not support them.
+
+Refer to the following topics in the AWS documentation for additional information about Aurora:
+
+- [What is Amazon Aurora?](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html)
+- [High availability for Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Concepts.AuroraHighAvailability.html)
+- [Cluster endpoints for Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Endpoints.Cluster.html)
+
+## Requirements
+
+During testing, the following deployment configuration resulted in seven successful failover recoveries after 10 iterations. Refer to [Measure failover resilience](#measure-failover-resilience) for additional information:
+
+- Release v202409-1
+- Operational mode to either `active-active` or `external`
+- Set the [`TFE_DATABASE_HOST` variable](/terraform/enterprise/deploy/reference/configuration#tfe_database_host) an HAProxy load balancer
+- Set the [`TFE_DATABASE_RECONNECT_ENABLED`](/terraform/enterprise/deploy/reference/configuration#tfe_database_reconnect_enabled) to ` true`
+- Terraform Enterprise nodes hosted on [Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine)
+- Terraform Enterprise deployed to three nodes
+
+Terraform Enterprise does not support RDS proxy.
+
+## Deploy an Aurora cluster
+
+Deploy an RDS cluster with Terraform. Refer to [`rds_cluster` documentation](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/rds_cluster#aurora-with-postgresql-engine) in the Terraform registry for configuration instructions.
+
+The following example configuration provisions a cluster called `experiment` and two cluster instances:
+
+```hcl
+data "aws_availability_zones" "available" {
+ state = "available"
+}
+
+resource "aws_rds_cluster" "aurora_postgresql" {
+ cluster_identifier = "experiment"
+ engine = "aurora-postgresql"
+ engine_version = "16.2"
+ availability_zones = slice(data.aws_availability_zones.available.names, 0, 3)
+ delete_automated_backups = true
+ backup_retention_period = 1
+ deletion_protection = false
+ skip_final_snapshot = true
+ storage_encrypted = true
+ ...
+}
+
+resource "aws_rds_cluster_instance" "cluster_instances_n" {
+ count = 2
+ identifier = format("%s-aurora-node-%d", "experiment", count.index + 1)
+ cluster_identifier = aws_rds_cluster.aurora_postgresql.id
+ instance_class = "db.r5.xlarge"
+ engine = aws_rds_cluster.aurora_postgresql.engine
+ engine_version = aws_rds_cluster.aurora_postgresql.engine_version
+}
+```
+
+## Measure failover resilience
+
+You can collect recovery time objective (RTO) data to assess the resilience of your HA system. Refer to the following topics for additional information:
+
+- [PostgreSQL database failover](/terraform/enterprise/deploy/manage/failover)
+- [Measure failover resilience](/terraform/enterprise/deploy/configuration/storage/connect-database/failover-resilience)
+
+In the example scenario, we executed test workloads against the instance every 15 seconds for 10 iterations. If the workload did not report success within 10 seconds, we consider the instance unhealthy. The instance is also considered non-operational if any run fails. We considered Terraform Enterprise to be fully operational when five consecutive runs finished successfully.
+
+We observed the following outcomes after triggering 10 failovers:
+
+- Seven failed over successfully within approximately one minute.
+- Two failed over and returned to partial operation. 30-50 percent of the runs executed after failover continued to fail, but Terraform Enterprise successfully completed some of those runs. Manually restarting the Terraform Enterprise nodes resolved the issues.
+- One failover never returned to operation. Manually restarting the Vault process inside the Terraform Enterprise node or fully restarting all nodes resolved the issue.
+- Recovery times ranged from a minimum RTO of less than 25 seconds to a maximum of one minute.
+- Average RTO was 51 seconds across successful failovers.
+
+## Troubleshooting
+
+You may need to manually address issues after a failover to return to functionality. For example, the Vault process may still be connected to a read-only instance if the affected instance can not process runs.
+
+Refer to [Unable to write to database after a failover](/terraform/enterprise/deploy/troubleshoot/error-messages#unable-to-write-to-database-after-a-failover) in the Terraform troubleshooting documentation for symptoms and solutions.
\ No newline at end of file
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/failover-resilience.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/failover-resilience.mdx
new file mode 100644
index 0000000000..6513ff0e08
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/failover-resilience.mdx
@@ -0,0 +1,87 @@
+---
+page_title: Measure failover resilience
+description: Learn how to measure database failover resilience for Terraform Enteprise deployments connect to an HA PostgreSQL cluster.
+---
+
+# Measure failover resilience
+
+This topic describes how to measure the failover resilience for a Terraform Enterprise deployment connected to a PostgreSQL database cluster.
+
+## Overview
+
+You can connect Terraform Enterprise to a database cluster so that the application can fail over to another database instance if there is an issue with the primary instance. Refer to the following topics for additional information:
+
+- [PostgreSQL database failover](/terraform/enterprise/deploy/manage/failover)
+- [Connect to a PostgreSQL cluster](/terraform/enterprise/deploy/configuration/storage/connect-database/postgres-cluster)
+
+You can test the resilience of your failover system by develping and running test workloads against the database cluster and measuring the recovery time objective (RTO).
+
+Note that RTO varies significantly based on organizational priorities and the complexity of the services involved.
+
+## Define test workloads
+
+You can continuously execute a workload against Terraform Enterprise and measure the time since the last successful execution of the workload. With this continuous measurement running, you can then trigger a failover on the Postgres cluster and record the outage duration.
+
+The following sequence of steps describe an example workload:
+
+1. Reset workspace to cleanup any blocking run.
+1. Create and upload a configuration version.
+1. Create a run.
+1. Wait for the plan to finish.
+1. Discard the plan.
+
+## Define a protocol
+
+Determine what success and failure means in terms of measuring RTO for your instances. The following criteria represent an example protocol:
+
+1. Execute the workloads every fifteen seconds.
+ 1. If the workload does not report success within 10 seconds, the instance is unhealthy.
+ 1. The instance is healthy whenfive consecutive runs complete successfully.
+ 1. The instance is non-operational if any run fails.
+1. [Trigger a failover](#trigger-a-failover).
+1. Wait until the system becomes operational.
+ 1. If the workload does not report success within 10 seconds, the instance is unhealthy.
+ 1. The instance is healthy whenfive consecutive runs complete successfully.
+ 1. The instance is non-operational if any run fails.
+1. Complete 10 iterations.
+
+## Trigger a failover
+
+Create a separate organization and workspace to prevent modifying the initial dataset and to enable you to repeat tests. Determine a mechanism for triggering a failover. For example, if Terraform Enterprise is connected to a database cluster hosted on AWS, you can use the relational database service (RDS) to trigger a failover in the AWS console:
+
+ ```shell-session
+ $ aws rds failover-db-cluster --db-cluster-identifier --region us-west-2`
+ ```
+
+## Compute metrics
+
+Compute the RTO by logging the duration between the first failed run and the first of five consecutively successful runs. You can measure RTO using [`go-tfe`](https://github.com/hashicorp/go-tfe) client.
+
+### Patroni example
+
+The following table contains example data collected by running test workloads against a Terraform Enterprise deployment connected to a PostgreSQL cluster running on Patroni:
+
+| Failover | RTO | First failed run | First of five consecutive successful runs |
+| --- | --- | --- | --- |
+| 1 | 0:03:42 | 17:16:06.275 | 17:19:47.832 |
+| 2 | - | - | Terraform Enterprise returned the operation within one minute, but runs continued to fail. Restarting all nodes resolved the issue. |
+| 3 | 0:04:56 | 17:34:10.940 | 17:39:07.467 |
+| 4 | 0:02:18 | 18:01:50.913 | 18:04:08.902 |
+| 5 | - | 18:07:30.912 | Terraform Enterprise returned the operation within one minute, but runs continued to fail. Restarting all nodes resolved the issue. |
+
+### Aurora example
+
+The following table contains example data collected by running test workloads against a Terraform Enterprise deployment connected to a PostgreSQL cluster running on Aurora:
+
+| Failover | RTO | Failover start | First failed run | First of five consecutive successful runs |
+| --- | --- | --- | --- | --- |
+| 1 | 53.6s | 10:13 | 10:13:37.539 | 10:14:31.186 |
+| 2 | 61.3s | 10:17 | 10:17:14.430 | 10:18:15.763 |
+| 3 | infinite | 10:21 | 10:21:30.875 | Terraform Enterprise is partially operational, but runs randomly fail. After restarting the nodes, the application is fully operational. |
+| 4 | < 25s | 11:36 | No run failed. Failover succeeded in less than the measurement interval of 25s | NA |
+| 5 | 55.5s | 11:43 | 11:43:12.188 | 11:44:07.725 |
+| 6 | 57.5s | 11:47 | 11:47:44.293 | 11:48:41.828 |
+| 7 | 42.7s | 11:51 | 11:51:43.751 | 11:52:26.485 |
+| 8 | infinite | 12:27 | 12:27:16.227 | Terraform Enterprise became unoperational. All nodes went down and all runs failed. Vault sealed on all three nodes. Either restart the nodes or restart the Vault process inside the nodes. |
+| 9 | infinite | 13:27 | 13:28:00.917 | Terraform Enterprise is operational, but all runs failed. Restarting all nodes resolved the issue. |
+| 10 | 58.6s | 13:50 | 13:50:37.778 | 13:51:36.330 |
\ No newline at end of file
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/index.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/index.mdx
new file mode 100644
index 0000000000..00f1c85ef7
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/index.mdx
@@ -0,0 +1,31 @@
+---
+page_title: Database connection overview
+description: Terraform Enterprise uses an external PostgreSQL database to store stateful application data in external or active-active mode. Learn about connecting external PostgreSQL databases.
+---
+
+# Database connection overview
+
+This topic provides overview information about configuring Terraform Enterprise to connect to an
+external PostgreSQL database.
+
+You only need to connect to an external database when operating
+Terraform Enterprise in `active-active` or `external` mode. These modes instruct
+Terraform Enterprise to store and retrieve data in an externally-managed
+database. If you prefer to allow Terraform Enterprise to manage the database,
+configure Terraform Enterprise to run in `disk` mode. Refer to
+[Configure operational mode](/terraform/enterprise/deploy/configuration/storage/configure-mode)
+for additional information.
+
+-> **Connecting to HA PostgreSQL is in beta.** Do not deploy beta features in production environments. Provision a dedicated test environment before connecting Terraform Enterprise to an HA PostgreSQL cluster. If you have questions or feedback, contact your HashiCorp account representative.
+
+## Workflows
+
+Terraform Enterprise stores stateful application data, such as, workspace
+settings, organization settings, run information, and user information in a
+PostgreSQL database.
+
+You can deploy an external database or a cluster of highly-available database nodes and configure Terraform Enterprise to connect to it.
+Refer to the following topics for instructions:
+
+- [Connect to an external PostgreSQL database](/terraform/enterprise/deploy/configuration/storage/connect-database/postgres): Describes how to connecto to a single-node database instance.
+- [Connect to a highly-available PostgreSQL cluster](/terraform/enterprise/deploy/configuration/storage/connect-database/postgres-cluster): Describes how to connecto to a cluster of database instances. This functionality is in beta.
\ No newline at end of file
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/patroni.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/patroni.mdx
new file mode 100644
index 0000000000..649d16ffc5
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/patroni.mdx
@@ -0,0 +1,196 @@
+---
+page_title: Connect to a PostgreSQL cluster deployed to Patroni
+description: Learn how to connect Terraform Enterprise to a PostgresSQL cluster deployed to Patroni in high availability mode so that you can enable HA failover workflows.
+---
+
+# Connect to a PostgreSQL cluster deployed to Patroni
+
+This topic describes how to connect Terraform Enterprise to a highly-available PostgreSQL cluster deployed to Patroni on Kubernetes.
+
+
+
+**Connecting to a database cluster is in beta**. These instructions describe an example scenario that we tested and verified for non-production use cases. You should evaluate your requirements and business needs to determine the optimal architecture and configurations for your specific environment.
+
+
+
+## Overview
+
+Install the `postgres-operator` chart, which creates a Postgres construct that manages PostgreSQL clusters on Kubernetes. Refer to the [Postgres operator documentation](https://postgres-operator.readthedocs.io/en/latest/#scope) for additional information.
+
+1. Create a custom `values.yaml` file and define the necessary Kubernetes objects, such as the HAProxy and a service that enables the proxy to discover the Patroni pods.
+1. Deploy the configurations using the Postgres operator Helm chart.
+
+It is optional, but you can create and run a test workload against Terraform Enterprise to measure the resilience of your high availability PostgreSQL cluster.
+
+## Requirements
+
+During testing, the following deployment configuration resulted in three successful failover recoveries after five iterations. Refer to [Measure failover resilience](#measure-failover-resilience) for additional information.
+
+### Load balancer
+
+You must deploy a load balancer between Terraform Enterprise and the PostgreSQL cluster on Patroni. Refer to the [requirements for connecting Terraform Enterprise to a PostgreSQL cluster](/terraform/enterprise/deploy/configuration/storage/connect-database/postgres-cluster#requirements) for additional information.
+
+The scenario described in these instructions uses an HAProxy. For a production deployment of Patroni on Kubernetes, we recommend using the Kubernetes load balancer service. You can configure the load balancer service in the Patroni cluster manifest. Refer to the [Patroni documentation](https://postgres-operator.readthedocs.io/en/latest/administrator/#load-balancers-and-allowed-ip-ranges) for details.
+
+### Terraform Enterprise
+
+We tested the scenario described in this topic against the following Terraform Enterprise deployment:
+
+- Release v202409-1
+- `active-active` operational mode
+- Deployed to [Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine)
+- Deployed on three nodes
+- The follow environment variables configured:
+ - [`TFE_DATABASE_HOST` variable](/terraform/enterprise/deploy/reference/configuration#tfe_database_host) set to an HAProxy load balancer
+ - [`TFE_DATABASE_RECONNECT_ENABLED`](/terraform/enterprise/deploy/reference/configuration#tfe_database_reconnect_enabled) set to `true`.
+
+### Patroni
+
+We tested the scenario described in this topic against the following Patroni deployment:
+
+- Deployed with three nodes
+- Served to Terraform Enterprise through an HAProxy load balancer
+
+## Configure Kubernetes objects
+
+Create a `values.yaml` file to override the default Postgres operator values.
+
+### Define cluster resource defaults
+
+The Postgres operator Helm chart contains default values for all Patroni clusters deployed using the operator. Refer to the [Zalando Postgres operator values](https://github.com/zalando/postgres-operator/blob/master/charts/postgres-operator/values.yaml) for additional information.
+
+Specify the resources that the Postgres containers should use in the `configPostgresPodResources` field. The following example configures resource requests, such as CPU and memory limits for the Postgres containers in the pods:
+
+```yaml
+configPostgresPodResources
+ # CPU limits for the postgres containers
+ default_cpu_limit: "8"
+ # CPU request value for the postgres containers
+ default_cpu_request: "4"
+ # memory limits for the postgres containers
+ default_memory_limit: 32Gi
+ # memory request value for the postgres containers
+ default_memory_request: 16Gi
+```
+
+### Define cluster behaviors
+
+Kubernetes allocates resources to the Patroni cluster according to the [values you define in the `configPostgresPodResources` field](#define-cluster-reource-defaults) and starts individual Postgres clusters according to the cluster manifest. The manifest is a custom resource definition (CRD) that defines parameters for each cluster. Refer to the following Postgres operator topics for additional information about the cluster manifest:
+
+- [Cluster manifest reference documentation](https://postgres-operator.readthedocs.io/en/latest/reference/cluster_manifest/)
+- [Zalando Postgres operator repository](https://github.com/zalando/postgres-operator/tree/master/manifests)
+
+The following example manifest specifies the cluster configuration we tested for this scenario:
+
+```yaml
+apiVersion: "acid.zalan.do/v1"
+kind: postgresql
+metadata:
+ name: patroni
+ namespace: failover
+spec:
+ teamId: "terraform-enterprise"
+ volume:
+ size: 10Gi
+ numberOfInstances: 3
+ users:
+ cluster_admin: # database owner
+ - superuser
+ - createdb
+ user: [] # role for application foo
+ databases:
+ db: user # dbname: owner
+ postgresql:
+ version: "15"
+```
+
+### Discovery service
+
+Define a service that enables the HAProxy to discover the IP addresses of the Patroni pods. The following example uses the Spilo application for discovery. It discovers all Patroni pods and then uses the HAproxy to route to the master:
+
+```yaml
+apiVersion: v1
+kind: Service
+metadata:
+ name: patroni-headless
+ namespace: failover
+spec:
+ clusterIP: None
+ selector:
+ cluster-name: patroni
+ application: spilo
+ # spilo-role = "master"
+ ports:
+ - port: 5432
+ name: postgresql
+ - port: 8008
+ name: api
+```
+
+### HAProxy
+
+Define an HAProxy that routes traffic to the primary node by setting the [`/primary` Patroni endpoint](https://patroni.readthedocs.io/en/latest/rest_api.html).
+
+The HAProxy configuration is crucial to the successful recovery of Terraform Enterprise after a failover. By default, the proxy runs a health check every two seconds, which is too long for many implementations. We recommend configuring HAProxy with an interval of maximum `1s`.
+
+Refer to [HAProxy documentation](https://www.haproxy.com/documentation/haproxy-configuration-tutorials/service-reliability/health-checks/#change-the-interval) for instructions on how to change the health check interval.
+
+The following configuration uses the Kubernetes DNS set up in `resolv.conf` and applies server-templates and service names to the HAProxy. It also uses a Kubernetes resolver to resolve the DNS name of the Patroni service. If it is unable to resolve the DNS name, it uses the last known IP address or the `libc` resolver in that order.
+
+```yaml
+ global
+ log stdout format raw local0
+ maxconn 2000
+
+ defaults
+ log global
+ mode tcp
+ option tcplog
+ timeout connect 5000ms
+ timeout client 50000ms
+ timeout server 50000ms
+
+
+ resolvers kubernetes
+ parse-resolv-conf
+ hold valid 10s
+
+ listen postgres
+ bind *:5000
+ mode tcp
+ retry-on all-retryable-errors
+
+ option httpchk
+ http-check send meth HEAD uri /primary
+ http-check expect status 200
+
+ default-server inter 1s fall 3 rise 2 on-marked-down shutdown-sessions
+
+ server-template patroni- 1-3
+
+ patroni-headless.failover.svc.cluster.local:5432 check port 8008 resolvers
+ kubernetes init-addr last,libc,none
+```
+
+## Deploy the configurations
+
+Install the Postgres operator chart and apply the configuration files to deploy Patroni and the HAProxy. Refer to the [Postgres operator documentation](https://postgres-operator.readthedocs.io/en/latest/quickstart/#deployment-options) for instructions on how to deploy.
+
+## Measure failover resilience
+
+You can collect recovery time objective (RTO) data to assess the resilience of your HA system. Refer to the following topics for additional information:
+
+- [PostgreSQL database failover](/terraform/enterprise/deploy/manage/failover)
+- [Measure failover resilience](/terraform/enterprise/deploy/configuration/storage/connect-database/failover-resilience)
+
+In the example scenario, we observed the following outcomes:
+
+- Recovery times ranging from a minimum RTO of 2m18s to a maximum of 4m56s
+- Average RTO of 3m38s across successful failovers.
+- Two out of five failovers experienced issues where Terraform Enterprise returned the operation within one minute, but node restarts were needed to resolve continued run failures.
+
+## Troubleshooting
+
+You may need to manually address issues after a failover to return to functionality. For example, the Vault process may still be connected to a read-only instance if the affected instance can not process runs.
+
+Refer to [Unable to write to database after a failover](/terraform/enterprise/deploy/troubleshoot/error-messages#unable-to-write-to-database-after-a-failover) in the Terraform troubleshooting documentation for symptoms and solutions.
\ No newline at end of file
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/postgres-cluster.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/postgres-cluster.mdx
new file mode 100644
index 0000000000..15cc2d40c1
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/postgres-cluster.mdx
@@ -0,0 +1,195 @@
+---
+page_title: Connect to a highly-available PostgreSQL cluster
+description:
+ Learn how to configure Terraform Enterprise to connect to an external
+ PostgreSQL database cluster so that your Terraform Enterprise instances can store
+ stateful application data in a highly-available database.
+---
+
+# Connect to a PostgreSQL cluster
+
+This topic describes how to configure Terraform Enterprise to connect to an
+external cluster of PostgreSQL database servers.
+You only need to complete this task under the following conditions:
+
+- You want to operate Terraform Enterprise in `active-active` or `external` mode. Refer to [Configure operational mode](/terraform/enterprise/deploy/configuration/storage/configure-mode) for additional information.
+- You want to connect Terraform Enterprise to a PostgreSQL database cluster. To connect to a single PostgreSQL node, refer to [Connect to an external PostgreSQL database](/terraform/enterprise/deploy/configuration/storage/connect-database/postgres).
+- You want to configure Terraform Enterprise to failover to a PostgreSQL database replica node. Refer to [PostgreSQL database failover](/terraform/enterprise/deploy/manage/failover) for additional information.
+
+Before you connect to a highly-available PostgreSQL cluster, review the [Known issues](#known-issues) section so that you are aware of potential issues.
+
+## Introduction
+
+Complete the following steps to configure Terraform Enterprise to store and retrieve the data in an externally-managed PostgreSQL cluster:
+
+1. Prepare the PostgreSQL server to host the data. Preparation includes creating
+ a user appropriate permissions and creating the extensions in the database.
+1. Specify the connection settings in your deployment configuration. If your
+ server requires additional connection parameters, you must also specify them
+ in the configuration.
+You may need to take additional action to resolve issues related to a failover event.
+
+## Requirements
+
+Before proceeding, verify that you meet the following requirements.
+
+### Server
+
+One of the following servers is required:
+
+- PostgreSQL server, such as Amazon RDS for PostgreSQL, version 13.x, 14.4
+ and up, 15.x or 16.x
+
+ Note that PostgreSQL v12 will reach end of life on November 12, 2024. As a
+ result, Terraform Enterprise will no longer v12 after that date.
+
+- PostgreSQL-compatible database service, such as Amazon Aurora PostgreSQL.
+- Self-managed PostgreSQL-compatible server cluster, such as Patroni PostgreSQL
+
+### User
+
+Create a PostgreSQL user with the following permissions on the database:
+
+- Permissions to create, modify, and read all tables and indices on all schemas
+ within the database. Database owners commonly have these permissions.
+- Permissions to create extensions. If you are unable to create a user with the
+ `CREATE EXTENSION` privilege, refer to [Create extensions](#create-extensions)
+ for instructions on creating the necessary extensions.
+
+### Load balancer
+
+Terraform Enterprise requires a single URL to configure the
+PostgreSQL backend. In a cluster, the URL should point to the load
+balancer, which handles the distribution of connections to the appropriate
+database nodes.
+
+### Runtime
+
+You can only connect to a database cluster when deploying Terraform Enterprise to the following runtimes:
+
+ - Nomad
+ - Kubernetes
+ - OpenShift
+ - Podman
+ - Docker
+
+For information about connecting to an external database for Replicated deployments, refer to [PostgreSQL Requirements for Terraform Enterprise on Replicated](/terraform/enterprise/deploy/replicated/requirements/data-storage/postgres-requirements).
+
+## Create extensions
+
+Create extensions for the `rails`, `vault`, `registry`, and `task_worker`
+PostgreSQL schemas. The database server automatically creates these schemas if
+they do not already exist.
+
+Run the following commands on the PostgreSQL server to create the extensions:
+
+```shell-session
+CREATE EXTENSION IF NOT EXISTS "hstore" WITH SCHEMA "rails";
+CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA "rails";
+CREATE EXTENSION IF NOT EXISTS "citext" WITH SCHEMA "registry";
+```
+
+## Specify PostgreSQL connection settings
+
+Add the following settings to your Terraform Enterprise configuration:
+
+- Set the `TFE_DATABASE_HOST` variable to the location of your PostgreSQL
+ server. Format the location as `HOST[:PORT]`, for example `db.example.com` or
+ `db.example.com:5432`. Multi host connection strings are not supported.
+- Set the `TFE_DATABASE_NAME` variable to the name of the database you want to
+ store the data in.
+- Set the `TFE_DATABASE_USER` variable to the user name you want to use to
+ access the database.
+- Set the `TFE_DATABASE_PASSWORD` variable to the password for the user.
+- Set the `TFE_DATABASE_RECONNECT_ENABLED` variable to `true`.
+
+Refer to
+[Database settings](/terraform/enterprise/deploy/reference/configuration#database-settings)
+in the configuration reference for addtional information.
+
+### Additional connection parameters
+
+Add the `TFE_DATABASE_PARAMETERS` variable to your configuration and specify any
+additional connection parameters necessary to connect to the server.
+
+#### `sslmode`
+
+When providing extra keyword parameters for the database connection, the
+`sslmode` parameter only allows the following values:
+
+- `require`
+- `verify-full`
+- `verify-ca`
+- `disable`
+
+When operating Terraform Enterprise in `external` mode, the `sslmode` parameter
+is set to `require` by default. When operating Terraform Enterprise in `disk`
+mode, the `sslmode` parameter is set to `disable` by default.
+
+Terraform Enterprise provides a certificates file at
+`/etc/ssl/private/terraform-enterprise/bundle.pem`, which is required by the
+`verify-full` and `verify-ca` modes.
+
+Refer to the
+[PostgreSQL library documentation](https://www.postgresql.org/docs/12/libpq-ssl.html)
+for additional information about using `sslmode`.
+
+#### Client certificate configuration
+
+You can configure Terraform Enterprise to use PostgreSQL client certificates to authenticate with the server. When providing client certificates, the database password is not required and the `sslmode` parameter is set to `verify-full`.
+Terraform Enterprise requires PostgreSQL server certificate to use Subject Alternative Names (SANs) rather than relying solely on the legacy Common Name field.
+
+Configure the following settings to use PostgreSQL client certificates:
+- Set the `TFE_DATABASE_USE_MTLS` variable to `true`.
+- Specify the path to the CA certificate file in the `TFE_DATABASE_CA_CERT_FILE` variable.
+- Specify the path to the client certificate file in the `TFE_DATABASE_CLIENT_CERT_FILE` variable.
+- Specify the path to the client key in the `TFE_DATABASE_CLIENT_KEY_FILE` variable.
+
+
+## Post-failover tasks
+
+In the event that Terraform Enterprise fails over to the secondary database node, you may need to perform the following actions.
+
+### Restart failed runs
+
+Runs can enter a non-terminal state, such as `pending`, and fail to progress when a failover occurs. This is because Terraform Enterprise may be connected to read-only instances of the database. You can perform one of the following tasks to resolve the non-terminal state:
+
+- Cancel the run: You can cancel `plan` operations that are unfinished. A `plan` operation in the `pending` state blocks the workspace until it is canceled. You can cancel the run on the run’s page or in the
+ organization settings. Refer to [Runs]](/terraform/cloud-docs/users-teams-organizations/organizations#runs) in the organization settings documentation for additional information.
+- Start a new run: If the operation is finished, but the runs state is still non-terminal, then you cannot cancel the run. Runs in this state do not block the workspace.
+
+### Restart Terraform Enterprise
+
+If Terraform Enterprise does not return to full operational
+capacity or fully go down after a failover, we recommend
+manually restarting the faulty Terraform Enterprise nodes. Restarting
+forces Terraform Enterprise to reconnect to the correct PostgreSQL node.
+
+### Restart the Vault process
+
+A failover may affect Vault when Terraform Enterprise is connected to a Patroni cluster with `HAProxy` configured to check server status at an interval of one second or longer.
+If a failover occurs and Vault is still connected to the read-only node, then Vault can seal.
+
+A single node can seal Vault and render it non-functional. Requests that Terraform Enterprise routes to the affected instance will fail. Some runs will also fail when Terraform Enterprise is in `active-active` mode and deployed with multiple nodes.
+
+Restart the Vault process or restart the node to resolve this issue.
+
+## Known Issues
+
+Interruptions to the database connection affect ongoing processes and lead to
+issues in Terraform Enterprise. These issues are related to network timing and do not occur reliably.
+They are also more likely to occur if a failover occurs under high
+load.
+
+Read replicas are not supported. Terraform Enterprise does not distinguish between read and write endpoints.
+You must route all database interactions, including reads and writes, through the load balancer to the primary node.
+This ensures that Terraform Enterprise always interacts with the correct node.
+
+Multi-primary topology is not supported. Terraform Enterprise is designed to
+operate with a strongly consistent data model. Therefore, we do not recommend using a multi-writer
+cluster configuration. In multi-writer setups, data written
+to one primary node may not be immediately available to others, leading to
+potential data inconsistencies. To maintain data integrity and consistency,
+all write operations should be directed to a single primary node. This
+guarantees that data is immediately consistent and available across the
+system.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/postgres.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/postgres.mdx
new file mode 100644
index 0000000000..8f6ccdbe5f
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-database/postgres.mdx
@@ -0,0 +1,132 @@
+---
+page_title: Configure external PostgreSQL connection
+description:
+ Learn how to configure Terraform Enterprise to connect to an external
+ PostgreSQL database so that your Terraform Enterprise instances can store
+ stateful application data.
+---
+
+# Connect to an external PostgreSQL database
+
+This topic describes how to configure Terraform Enterprise to connect to an
+external PostgreSQL database. You only need to complete this task under the following conditions:
+
+- You want to operate Terraform Enterprise in `active-active` or `external` mode, which instructs
+Terraform Enterprise to store and retrieve data in an externally-managed database. Refer to
+[Configure operational mode](/terraform/enterprise/deploy/configuration/storage/configure-mode)
+for additional information.
+- You want to connect to a single PostgreSQL node. To connect Terraform Enterprise to an HA PostgreSQL database cluster, refer to [Connect to a highly-available PostgreSQL cluster](/terraform/enterprise/deploy/configuration/storage/connect-database/postgres-cluster).
+
+## Overview
+
+Complete the following steps to connect Terraform Enterprise to a single PostgreSQL node:
+
+1. Create extensions for the database schemas.
+1. Specify the connection settings in your deployment configuration. If your
+ server requires additional connection parameters, you must also specify them
+ in the configuration.
+
+## Requirements
+
+Before proceeding, verify that you meet the following requirements.
+
+### Server
+
+One of the following servers is required:
+
+- PostgreSQL server, such as Amazon RDS for PostgreSQL, version 13.x, 14.4
+ and up, 15.x or 16.x
+
+
+ Note that PostgreSQL v12 will reach end of life on November 12, 2024. As a
+ result, Terraform Enterprise will no longer v12 after that date.
+
+
+- PostgreSQL-compatible server, such as Amazon Aurora PostgreSQL.
+
+### User
+
+Create a PostgreSQL user with the following permissions on the database:
+
+- Permissions to create, modify, and read all tables and indices on all schemas
+ within the database. Database owners commonly have these permissions.
+- Permissions to create extensions. If you are unable to create a user with the
+ `CREATE EXTENSION` privilege, refer to [Create extensions](#create-extensions)
+ for instructions on creating the necessary extensions.
+- The `rails`, `vault`, `registry`, `task_worker`, and `terraform_enterprise` PostgreSQL schemas are required. We recommend allowing the PostgreSQL user to create schemas so that Terraform Enterprise can create them automatically. If the PostgreSQL user does not have permissions to create schemas, they must be created prior to installation.
+
+
+ Note that if you are changing the database user, ensure the new user is the owner of all
+ enum types in the database to avoid failures for any potential migrations that
+ attempt to `ALTER TYPE`.
+
+
+## Create extensions
+
+Create extensions for the `rails`, `vault`, `registry`, and `task_worker`
+PostgreSQL schemas. The database server automatically creates these schemas if
+they do not already exist.
+
+Run the following commands on the PostgreSQL server to create the extensions:
+
+```shell-session
+CREATE EXTENSION IF NOT EXISTS "hstore" WITH SCHEMA "rails";
+CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA "rails";
+CREATE EXTENSION IF NOT EXISTS "citext" WITH SCHEMA "registry";
+```
+
+## Specify PostgreSQL connection settings
+
+Add the following settings to your Terraform Enterprise configuration:
+
+- Set the `TFE_DATABASE_HOST` variable to the location of your PostgreSQL
+ server. Format the location as `HOST[:PORT]`, for example `db.example.com` or
+ `db.example.com:5432`. Multi host connection strings are not supported.
+- Set the `TFE_DATABASE_NAME` variable to the name of the database you want to
+ store the data in.
+- Set the `TFE_DATABASE_USER` variable to the user name you want to use to
+ access the database.
+- Set the `TFE_DATABASE_PASSWORD` variable to the password for the user.
+
+Refer to
+[Database settings](/terraform/enterprise/deploy/reference/configuration#database-settings)
+in the configuration reference for additional information.
+
+### Additional connection parameters
+
+Add the `TFE_DATABASE_PARAMETERS` variable to your configuration and specify any
+additional connection parameters necessary to connect to the server.
+
+#### `sslmode`
+
+When providing extra keyword parameters for the database connection, the
+`sslmode` parameter only allows the following values:
+
+- `require`
+- `verify-full`
+- `verify-ca`
+- `disable`
+
+When operating Terraform Enterprise in `external` mode, the `sslmode` parameter
+is set to `require` by default. When operating Terraform Enterprise in `disk`
+mode, the `sslmode` parameter is set to `disable` by default.
+
+Terraform Enterprise provides a certificates file at
+`/etc/ssl/private/terraform-enterprise/bundle.pem`, which is required by the
+`verify-full` and `verify-ca` modes.
+
+Refer to the
+[PostgreSQL library documentation](https://www.postgresql.org/docs/12/libpq-ssl.html)
+for additional information about using `sslmode`.
+
+#### Client certificate configuration
+
+You can configure Terraform Enterprise to use PostgreSQL client certificates to authenticate with the server. When providing client certificates, the database password is not required and the `sslmode` parameter is set to `verify-full`.
+Terraform Enterprise requires PostgreSQL server certificate to use Subject Alternative Names (SANs) rather than relying solely on the legacy Common Name field.
+
+Configure the following settings to use PostgreSQL client certificates:
+
+- Set the `TFE_DATABASE_USE_MTLS` variable to `true`.
+- Specify the path to the CA certificate file in the `TFE_DATABASE_CA_CERT_FILE` variable.
+- Specify the path to the client certificate file in the `TFE_DATABASE_CLIENT_CERT_FILE` variable.
+- Specify the path to the client key in the `TFE_DATABASE_CLIENT_KEY_FILE` variable.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-object.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-object.mdx
new file mode 100644
index 0000000000..c847117e93
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-object.mdx
@@ -0,0 +1,92 @@
+---
+page_title: Configure data object storage
+description: Learn how to configure the Terraform Enterprise connection to an S3-compatible data storage service.
+---
+
+# Configure data object storage
+
+This topic describes how to configure Terraform Enterprise to connect to an external data object service. This step is only required when Terraform Enterprise is configured to operate in `external` or `active-active` mode. Refer to [Data storage settings overview](/terraform/enterprise/deploy/configuration/storage) for additional information.
+
+## Introduction
+
+Terraform Enterprise stores artifacts that it produces during operation, such as state files, plan files, run logs, and configuration versions, in an S3-compatible storage service. Complete the following steps to configure the connection to an externally-managed data object storage system:
+
+1. In your object storage service, create a dedicated user that has permissions to access and manage the storage resources. Refer to the documentation for your object storage service for instructions.
+1. Configure the connection settings in the Terraform Enterprise deployment configuration.
+
+## Requirements
+
+- Any S3-compatible object storage service, GCP Cloud Storage, or Azure blob storage.
+- A bucket on the object storage platform for Terraform Enterprise to use. Your infrastructure provider may require the bucket to be in the same region as the Terraform Enterprise instance.
+- Disable any lifecycle rules that would delete, archive, or transition objects in the object storage container. Terraform Enterprise expects to manage all data in the object storage service, so any lifecycle operations may result in unexpected data inconsistencies.
+
+## Configure connection settings
+
+1. Add the `TFE_OBJECT_STORAGE_TYPE` variable to the configuration and set one of the following storage types:
+
+ - `s3`: Stores objects in an AWS S3 bucket.
+ - `azure`: Stores objects in an Azure blob.
+ - `google`: Stores objects in Google's cloud platform.
+
+ Refer to the [`TFE_OBJECT_STORAGE_TYPE` reference documentation](/terraform/enterprise/deploy/reference/configuration#tfe_object_storage_type) for additional information.
+
+1. Configure the connection settings for the object type.
+
+
+
+
+
+ ```yaml
+ ...
+ env:
+ variables:
+ TFE_OBJECT_STORAGE_TYPE: s3
+ TFE_OBJECT_STORAGE_S3_BUCKET:
+ TFE_OBJECT_STORAGE_S3_REGION:
+ TFE_OBJECT_STORAGE_S3_USE_INSTANCE_PROFILE:
+ secrets:
+ TFE_OBJECT_STORAGE_S3_ACCESS_KEY_ID:
+ TFE_OBJECT_STORAGE_S3_SECRET_ACCESS_KEY: ''
+ ```
+
+ Refer to the [S3-compatible storage configuration reference](/terraform/enterprise/deploy/reference/configuration#s3-compatible-storage) for information about all available settings.
+
+
+
+
+ ```yaml
+ ...
+ env:
+ variables:
+ TFE_OBJECT_STORAGE_TYPE: azure
+ TFE_OBJECT_STORAGE_AZURE_ACCOUNT_NAME:
+ TFE_OBJECT_STORAGE_AZURE_CONTAINER:
+ TFE_OBJECT_STORAGE_AZURE_ENDPOINT:
+ secrets:
+ TFE_OBJECT_STORAGE_AZURE_ACCOUNT_KEY: ''
+ ```
+
+ Refer to the [Azure blob storage configuration reference](/terraform/enterprise/deploy/reference/configuration#azure-blob-storage-settings) for information about all available settings.
+
+
+
+
+
+ ```yaml
+ ...
+ env:
+ variables:
+ TFE_OBJECT_STORAGE_TYPE: google
+ TFE_OBJECT_STORAGE_GOOGLE_BUCKET:
+ TFE_OBJECT_STORAGE_GOOGLE_PROJECT:
+ secrets:
+ TFE_OBJECT_STORAGE_GOOGLE_CREDENTIALS:
+ ```
+
+ Refer to the [Google cloud platform storage configuration reference](/terraform/enterprise/deploy/reference/configuration#google-cloud-platform-storage) for information about all available settings.
+
+
+
+
+
+
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-redis.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-redis.mdx
new file mode 100644
index 0000000000..7399bec47a
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-redis.mdx
@@ -0,0 +1,137 @@
+---
+page_title: Configure Redis data store connection
+description: Learn how to configure the connection to an externally-managed Redis data store when operating Terraform Enterprise in `active-active` mode.
+---
+
+# Configure Redis data store connection
+
+This topic describes how to configure Terraform Enterprise connection to an externally-managed Redis data store. This step is only necessary when operating Terraform Enterprise in an `active-active` operational mode. To allow Terraform Enterprise to self-manage Redis, configure Terraform Enterprise to run in `disk` operational mode on a compatible runtime platform, such as `Docker` or `Podman`. Refer to [Configure operational mode](/terraform/enterprise/deploy/configuration/storage/configure-mode) for additional information.
+
+## Introduction
+
+Terraform Enterprise uses Redis to cache and manage the background job scheduler queue across available hosts. Redis server configuration is required for any runtime platform configured to operate in `active-active` mode. You can operate Terraform Enterprise in `active-active` mode on the following runtime platforms:
+
+- Kubernetes
+- OpenShift
+- Nomad
+
+## Requirements
+
+Before proceeding, ensure that your environment meets the following requirements:
+
+- Either a cloud-managed or self-hosted Redis server is required.
+- Terraform Enterprise supports Redis server 6 and 7. We recommend using version 7.
+- Redis Cluster is not supported.
+
+Example Redis servers:
+
+- [Amazon ElastiCache for Redis](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/WhatIs.html)
+- [Official Redis Docker container](https://hub.docker.com/_/redis)
+
+### Secure Redis servers
+
+For secure Redis servers, create a user with read and write access.
+
+### TLS requirements
+
+Verify that you meet the following requirements when TLS is required to connect to the Redis server:
+
+- A valid TLS certificate and key are configured on the Redis server.
+- The Redis server is properly configured to accept TLS connections.
+- The Terraform Enterprise client is configured to use TLS when connecting to Redis. Refer to the [TLS configuration reference](/terraform/enterprise/deploy/reference/configuration#tls-settings) for additional information.
+
+For detailed information on configuring TLS for Redis, refer to the [official Redis documentation on encryption](https://redis.io/docs/latest/operate/oss_and_stack/management/security/encryption/).
+
+## Specify Redis connection settings
+You can connect to either a Redis standalone instance, or a Redis Enterprise instance in non-clustering mode.
+The redis authentication can be configured for all Redis configurations.
+
+### Authentication
+You can configure Redis to use the default user and require a password.
+```redis.conf
+requirepass
+```
+
+In that case you would configure Terraform Enterprise
+```
+ TFE_REDIS_USE_AUTH: true
+ TFE_REDIS_PASSWORD:
+```
+
+You can also configure Redis with [ACL](https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/) since Redis 6.
+```redis.conf
+user on > ~* &* +@all
+```
+
+
+If you use a Redis user, it is crucial that they have sufficient permissions.
+In our testing, we used the following permissions `~* &* +@all`.
+
+
+In that case, you would configure Terraform Enterprise with the following environment variables:
+```
+ TFE_REDIS_USE_AUTH: true
+ TFE_REDIS_USER:
+ TFE_REDIS_PASSWORD:
+```
+
+### Redis Standalone
+
+Add the following settings to your Terraform Enterprise configuration:
+
+- Set the `TFE_REDIS_HOST` variable to the location of your Redis server. Format the location as `HOST[:PORT]`, for example `redis.example.com` or `redis.example.com:6379`.
+- Set the `TFE_REDIS_USE_TLS` variable to `true` if your Redis server requires TLS. Defaults to `false`.
+- Set the `TFE_REDIS_USE_AUTH` variable to `true` if your Redis server requires authentication.
+- Set the `TFE_REDIS_PASSWORD` variable to the password for the user.
+
+Refer to [Redis settings](/terraform/enterprise/deploy/reference/configuration#redis-settings) in the configuration reference for additional information.
+
+### Redis Enterprise
+
+Terraform Enterprise can use Redis Enterprise in non-clustering mode as it's Redis service. To do so, you must
+configure a separate Redis endpoint for `sidekiq`, an internal component. This
+requirement exists because `sidekiq` and other components that rely on Redis must be kept
+separate. In normal operation, this is accomplishing using numbered Redis databases, which
+are not supported in Redis Enterprise. By defining a separate endpoint for `sidekiq` usage,
+Terraform Enterprise will use the default database `0` while still maintaining separation between `sidekiq` and
+other components.
+
+Add the following settings to your Terraform Enterprise configuration:
+
+- Set the `TFE_REDIS_SIDEKIQ_HOST` variable to the location of your Redis server. Format the location as `HOST[:PORT]`, for example `redis.example.com` or `redis.example.com:6379`.
+- Set the `TFE_REDIS_SIDEKIQ_USE_TLS` variable to `true` if your Redis server requires TLS. Defaults to `false`.
+- Set the `TFE_REDIS_SIDEKIQ_USE_AUTH` variable to `true` if your Redis server requires authentication.
+- Set the `TFE_REDIS_SIDEKIQ_PASSWORD` variable to the password for the user.
+
+### Redis Sentinel
+
+
+Redis Sentinel is not supported for Terraform Enterprise on Replicated.
+
+
+Terraform Enterprise can use Redis Sentinel as a highly available Redis service. Read more about highly available Redis
+services with Redis Sentinel in the [Redis Sentinel documentation](https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel/).
+
+Terraform Enterprise queries Redis Sentinel instances to determine which Redis instance is active master. Terraform Enterprise performs queries while Redis replicates transaction data to other replicas.
+
+You cannot use Redis Sentinel and [Redis Enterprise](#redis-enterprise) in the same Terraform Enterprise deployment.
+
+Use the following settings in your Terraform Enterprise configuration to use Redis Sentinel. Refer to the [Configuration reference](/terraform/enterprise/deploy/reference/configuration) for information about all configuration settings:
+- Set the `TFE_REDIS_SENTINEL_ENABLED` variable to `true` in order to use Redis Sentinel.
+- Set the `TFE_REDIS_SENTINEL_HOSTS` variable to a comma separated list of the locations of Redis Sentinel hosts. Format the locations as `HOST[:PORT],HOST[:PORT],...`, for example `redis-sentinel-1.example.com,redis-sentinel-2.example.com:26379`.
+- Set the `TFE_REDIS_SENTINEL_LEADER_NAME` variable to the name of a service, such as `main`. Terraform Enterprise queries Redis Sentinel for the service to discover an active Redis host. This name should return a valid Redis service location when issuing a `SENTINEL GET-MASTER-ADDR-BY-NAME ` command to Redis Sentinel.
+- Set the `TFE_REDIS_SENTINEL_USERNAME` variable to the username for the Redis Sentinel user. This setting is optional and is used to authenticate with Redis Sentinel instances.
+- Set the `TFE_REDIS_SENTINEL_PASSWORD` variable to the password for the Redis Sentinel user. This setting is optional and is used to authenticate with Redis Sentinel instances.
+- Set the `TFE_REDIS_USER` variable to the username for the Redis user. This setting is optional and is used to authenticate with Redis instances.
+- Set the `TFE_REDIS_PASSWORD` variable to the password for the Redis Sentinel user. This setting is optional and is used to authenticate with Redis instances.
+
+### Failover benchmarks for Redis Sentinel
+
+We tested failover performance for a Terraform Enterprise deployment connected to a Redis Sentinel cluster. The cluster consisted of three Sentinel instances and three Redis instances. We observed the following outcomes:
+
+- Failover events that were manually triggered through Redis Sentinel showed no observable down time in Terraform Enterprise. This suggests a high degree of safety in planned maintenance operations.
+- The recovery time objective (RTO) during manually triggered failover events ranged from 47s to 2m10s.
+- The average RTO was 1m16s across successful failovers.
+- One out of 16 failovers experienced issues that required Terraform Enterprise node restarts to resolve continued run failures.
+
+Terraform Enterprise performance when using Redis Sentinel depends on how Redis Sentinel is configured to monitor and recover from Redis instance problems.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-vault.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-vault.mdx
new file mode 100644
index 0000000000..0c2072e405
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/connect-vault.mdx
@@ -0,0 +1,34 @@
+---
+page_title: Connect to an external Vault server
+description: Using an external Vault server can help satisfy data encryption and auditing compliance requirements. Learn how to connect external Vault servers.
+---
+
+# Connect to an external Vault server
+
+This topic describes how to configure Terraform Enterprise to connect to an external Vault server.
+
+## Introduction
+
+Using an external Vault server may be necessary if your organization is subject to specific data encryption and auditing compliance requirements. The internal Vault server shipped with Terraform Enterprise that is suitable for most cases.
+
+You should only use an external Vault server if you have experience managing Vault in production. You are responsible for all Vault server operations, including sealing, unsealing, and replication.
+
+Do not configure multiple Terraform Enterprise instances to use the same namespace on an external Vault server unless they are part of a Terraform Enterprise deployment in `active-active` mode because doing so will result in data loss. Refer to [Configure the operational mode](/terraform/enterprise/deploy/configuration/configure-mode) for additional information about operational modes.
+
+Complete the following steps to connect to Terraform Enterprise to an external Vault server:
+
+1. Configure the Vault server: You must enable settings and create policies that allow Terraform Enterprise to connect to Vault.
+1. Specify the Vault settings in the Terraform Enterprise configuration: Refer to the [deployment overview](/terraform/enterprise/deploy) for additional information about configuring Terraform Enterprise.
+
+## Requirements
+
+You must configure the settings for your external Vault connection before the initial Terraform Enterprise installation. You can only change the configuration after installing Terraform Enterprise using the [backup and restore API](/terraform/enterprise/deploy/manage/backup-restore).
+
+## Specify Vault settings
+
+Add the following settings to your Terraform Enterprise configuration:
+
+- Set `TFE_VAULT_USE_EXTERNAL` to `true`
+- Set `TFE_VAULT_ADDRESS` to the address of your Vault server.
+- Set `TFE_VAULT_ROLE_ID` to the Vault secret ID.
+- Configure any additional settings specific to your implementation. Refer to the [Vault settings reference](/terraform/enterprise/deploy/reference/configuration#vault-settings) for details.
\ No newline at end of file
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/index.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/index.mdx
new file mode 100644
index 0000000000..561d8de438
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/configuration/storage/index.mdx
@@ -0,0 +1,50 @@
+---
+page_title: Data storage settings overview
+description: Learn about Terraform Enterprise data storage and management configurations, including operational modes, PostgreSQL database connection settings, Redis connection settings, and external Vault server settings
+---
+
+# Data storage settings overview
+
+This topic provides an overview of data storage and management configurations for Terraform Enterprise.
+
+## Overview
+
+You can configure Terraform Enterprise to run as a self-contained application that manages the associated data storage or as an integrated installation that connects to externally-managed data storage systems. Complete the following steps:
+
+1. Decide on a Terraform Enterprise architecture and determine which data storage systems you must deploy and maintain externally.
+1. Determine which operational mode aligns with how you want to manage data storage for your organization.
+1. Deploy the external data storage systems and connect to them in your deployment configuration file.
+
+## Data storage systems
+
+Terraform Enterprise uses the following types of storage systems to store data associated with your deployment:
+
+- **PostgreSQL database**: Terraform Enterprise stores stateful application data, workspace settings, organization settings, run information, and user information in a PostgreSQL database.
+
+ Note that PostgreSQL v12 will reach end of life on November 12, 2024. As a
+ result, Terraform Enterprise will no longer v12 after that date.
+
+
+- **S3-compatible storage service**: Terraform Enterprise stores artifacts that it produces during operation, such as state files, plan files, run logs, and configuration versions, in an S3-compatible storage service.
+- **Vault**: Terraform Enterprise stores encryption keys in Vault that encrypt and decrypt data objects. By default, Terraform Enterprise stores the keys in the internal Vault server, but if your organization has specific data encryption and auditing requirements, you can connect to an external Vault server to manage the data instead.
+- **Redis data store**: You can configure Terraform to cache application data in a Redis data store. This system is optional but recommended to improve performance.
+
+### Operational modes
+
+You must choose an operational mode before you install and deploy Terraform Enterprise. The operation mode determines where Terraform Enterprise stores its data. Where you store Terraform Enterprise data can impact your backup and restore procedures, disaster recovery procedures, and scaling options.
+
+The following table provides an overview of how the operational mode directs Terraform Enterprise to store data. Refer to [Configure the operational mode](/terraform/enterprise/deploy/configuration/storage/configure-mode) for instructions:
+
+| Mode | PostgreSQL | Object storage | Vault | Redis |
+| --- | --- | --- | --- | --- |
+| `external` | External. You manage outside of Terraform Enterprise. | External. You manage outside of Terraform Enterprise. | PostgreSQL database unless you specify an external Vault server. | Docker volume on the instance. |
+| `active-active` | External. You manage outside of Terraform Enterprise. | External. You manage outside of Terraform Enterprise. | PostgreSQL database unless you specify an external Vault server. | External. You manage outside of Terraform Enterprise. |
+| `disk` | Internal directory on the instance. You manage persistent storage. | Internal directory on the instance. You manage persistent storage. | PostgreSQL database unless you specify an external Vault server. | Docker volume on the instance. |
+
+
+
+
+
+
+
+
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/custom-image.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/custom-image.mdx
new file mode 100644
index 0000000000..63505ab043
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/custom-image.mdx
@@ -0,0 +1,47 @@
+---
+page_title: Build and deploy a custom worker image
+description: >-
+ Terraform Enterprise requires a custom worker image to add custom tools and logic to the run enviornment. Learn how to build and run a custom worker image.
+---
+
+# Build and deploy a custom worker image
+
+This topic describes how to build and deploy a custom worker image so that you can add custom tools or logic to your Terraform run environments.
+
+## Introduction
+
+Terraform Enterprise performs Terraform runs in ephemeral containers using a built-in `tfc-agent` container image by default. To add custom tools or logic to your Terraform run environment, you must build a custom image and configure Terraform Enterprise to use it.
+
+## Requirements
+
+The base image must be `hashicorp/tfc-agent:1.6.0` or later.
+
+## Dockerfile
+
+Build your custom image using the below `Dockerfile`.
+
+```Dockerfile
+FROM hashicorp/tfc-agent:latest
+
+# Switch the to root user in order to perform privileged actions such as
+# installing software.
+USER root
+
+# Install sudo. The container runs as a non-root user, but people may rely on
+# the ability to apt-get install things.
+RUN apt-get -y install sudo
+
+# Permit tfc-agent to use sudo apt-get commands.
+RUN echo 'tfc-agent ALL=NOPASSWD: /usr/bin/apt-get , /usr/bin/apt' >> /etc/sudoers.d/50-tfc-agent
+
+# Switch back to the tfc-agent user as needed by Terraform agents.
+USER tfc-agent
+```
+
+## Agent
+
+Update the environment variable `TFE_RUN_PIPELINE_IMAGE` in your yaml file:
+
+```yaml
+TFE_RUN_PIPELINE_IMAGE: registry.example.com/example/tfc-agent:custom-tag
+```
\ No newline at end of file
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/docker/index.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/docker/index.mdx
new file mode 100644
index 0000000000..739bfabf62
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/docker/index.mdx
@@ -0,0 +1,341 @@
+---
+page_title: Deploy Terraform Enterprise to Docker overview
+description: Learn how to deploy Terraform Enterprise to Docker using Docker Compose.
+---
+
+# Deploy Terraform Enterprise to Docker
+
+This topic describes how to deploy Terraform Enterprise to Docker using Docker Compose. You can use another installation method, but we recommend Docker Compose because it simplifies managing the necessary Docker volumes and container configuration.
+
+## Overview
+
+Complete the following steps to install Terraform Enterprise:
+
+1. Complete the prerequisites
+1. Set up the installation folders and files
+1. Download and install the Docker image
+1. Apply the deployment installation
+
+Complete post installation tasks, such creating the initial admin user account and configuring service management controls.
+
+
+## Prerequisites
+
+Complete the following tasks before attempting to install Terraform Enterprise.
+
+### Prepare the deployment environment
+
+Provide a DNS hostname for Terraform Enterprise and the associated TLS certificate. Additionally, you must configure your network so that your host can receive and send traffic. Refer to [Prepare the host environment](/terraform/enterprise/deploy/prepare-host) for details about preparing the host environment.
+
+### Deploy storage systems for `active` and `external` mode
+
+If you intend to operate Terraform Enterprise in `active` or `external` mode, deploy the database and other storage devices so that Terraform can connect to them when the application starts. Refer to [Data storage settings overview](/terraform/enterprise/deploy/configuration/storage) for additional information.
+
+### Create the deployment configuration
+
+Create a deployment configuration file and specify settings for the operational mode, license, TLS certificates, and network configuration. Add any additional configurations necessary for your environment. Refer to [Configuration file overview](/terraform/enterprise/deploy/configuration/) for additional information.
+
+
+## Set up installation folders and files
+
+1. Connect to the host instance.
+1. Create a dedicated directory for the Terraform Enterprise installation files.
+1. Navigate to the installation directory.
+1. Create a `certs` directory.
+1. Place your TLS certificate (`cert.pem`), TLS private key (`key.pem`), and CA certificates bundle (`bundle.pem`) inside inside the`certs` directory. If you do not have a CA certificates bundle, place your TLS certificate (`cert.pem`) inside `bundle.pem` instead.
+1. Place your deployment configuration file into the Terraform Enterprise installation directory. Refer to [Example deployment configurations](#example-deployment-configurations) for pre-formatted configurations that you can copy and modify. Refer to the [configuration reference](/terraform/enterprise/deploy/reference/configuration) for information about all deployment configuration settings.
+
+## Download and install the image
+
+1. Log in to the Terraform Enterprise container image registry, using `terraform`
+ as the username, and your Hashicorp Terraform Enterprise license as the password:
+
+ ```shell-session
+ $ echo "" | docker login --username terraform images.releases.hashicorp.com --password-stdin
+ ```
+
+1. Pull the Terraform Enterprise image from the registry.
+
+ ```shell-session
+ $ docker pull images.releases.hashicorp.com/hashicorp/terraform-enterprise:
+ ```
+
+## Apply the deployment configuration
+
+1. Spin up your Terraform Enterprise container by running:
+
+ ```shell-session
+ $ docker compose up --detach
+ ```
+
+1. In a separate terminal session you can monitor the logs by running the following command:
+
+ ```shell-session
+ $ docker compose logs --follow
+ ```
+
+1. Monitor the health of the application until it starts reporting healthy with the following command:
+
+ ```shell-session
+ $ docker compose exec tfe tfe-health-check-status
+ ```
+
+1. If you are operating Terraform in `active-active` mode, repeat the steps for each node in the installation.
+
+
+## Post installation tasks
+
+Complete the following tasks after the initial installation.
+
+### Review startup checks
+
+When you start Terraform Enterprise, several startup checks also run to prevent errors related to invalid configurations or certificates, as well as other issues that could prevent the application from running successfully or safely. Refer to the [startup checks reference](/terraform/enterprise/deploy/reference/startup-checks) for additional information.
+
+### Create the initial admin user
+
+[Provision your first administrative user](/terraform/enterprise/deploy/initial-admin-user) and start using Terraform Enterprise.
+
+### Manage Docker containers
+
+We recommend using Docker's native lifecycle management to automatically restart Terraform Enterprise containers that fail due to transient network or infrastructure issues. You can manage Docker container lifecycles using Docker's restart policy. Refer to the [Docker documentation](https://docs.docker.com/config/containers/start-containers-automatically/#use-a-restart-policy) for details.
+
+### Manage the Docker service
+
+You can use `systemd` to automatically run `docker compose` when the system starts up. Managing the Docker Compose lifecycle is outside the scope of these instructions, but we provide the following example for managing Docker Compose on your Linux host for your convenience.
+
+Store the following configuration as `/etc/systemd/system/terraform-enterprise.service`:
+
+```ini
+[Unit]
+Description=Terraform Enterprise Service
+Requires=docker.service
+After=docker.service network.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+WorkingDirectory=/etc/terraform-enterprise
+ExecStart=/usr/local/bin/docker compose up -d
+ExecStop=/usr/local/bin/docker compose down
+TimeoutStartSec=0
+
+[Install]
+WantedBy=multi-user.target
+```
+
+Run the following command to enable the service:
+
+```shell-session
+$ systemctl enable --now terraform-enterprise
+```
+
+### Route requests to Terraform Enterprise public hostname
+
+You can direct requests sent to Terraform Enterprise's fully qualified domain name to the instance's internal IP address. This is useful for cloud environments where HTTP clients running on instances behind a load balancer cannot send requests to the public hostname of that load balancer.
+
+Add the `TFE_RUN_PIPELINE_DOCKER_EXTRA_HOSTS` variable to your deployment configuration file and specify a comma-separated list of additional hosts to send requests to. Format each item in the list as `HOST:IP`. The IP must be a routable address for the instance where Terraform Enterprise is running.
+
+The following example sends requests to the fully-qualified domain name ``:
+
+```yaml
+name: terraform-enterprise
+services:
+ tfe:
+ image: images.releases.hashicorp.com/hashicorp/terraform-enterprise:
+ environment:
+ TFE_HOSTNAME: "terraform.example.com"
+ TFE_RUN_PIPELINE_DOCKER_EXTRA_HOSTS: "terraform.example.com:"
+```
+
+This configuration injects `/etc/hosts` entries into the ephemeral Docker containers used to launch the underlying `terraform` binary. Refer to the [`TFE_RUN_PIPELINE_DOCKER_EXTRA_HOSTS` reference](/terraform/enterprise/deploy/reference/configuration#tfe_run_pipeline_docker_extra_hosts) for additional information.
+
+## Example deployment configurations
+
+You can copy one of the following example configurations and modify the values to per your environment. Refer to [Configuration Reference](/terraform/enterprise/deploy/reference/configuration)
+for a list of all configuration options.
+
+Refer to the [Docker Compose documentation](https://docs.docker.com/compose/)
+for details on installing, configuring, and running Docker Compose.
+
+### Example `disk` mode configuration
+
+The following compose configuration deploys Terraform Enterprise in `disk` mode using a bind
+mount to make the disk path used for Terraform Enterprise data storage available. The path you specify as the source of the bind mount must exist on the instance running Terraform Enterprise. This path must be backed by durable
+storage as provided by your cloud provider, such as Elastic Block Storage for AWS.
+
+```yaml
+# Caution: $ is a reserved character in docker compose files for variable interpolation and can be escaped by using $$.
+# https://docs.docker.com/compose/how-tos/environment-variables/variable-interpolation/
+---
+name: terraform-enterprise
+services:
+ tfe:
+ image: images.releases.hashicorp.com/hashicorp/terraform-enterprise:
+ environment:
+ TFE_LICENSE: ""
+ TFE_HOSTNAME: ""
+ TFE_ENCRYPTION_PASSWORD: ''
+ TFE_OPERATIONAL_MODE: "disk"
+ TFE_DISK_CACHE_VOLUME_NAME: "${COMPOSE_PROJECT_NAME}_terraform-enterprise-cache"
+ TFE_TLS_CERT_FILE: "/etc/ssl/private/terraform-enterprise/cert.pem"
+ TFE_TLS_KEY_FILE: "/etc/ssl/private/terraform-enterprise/key.pem"
+ TFE_TLS_CA_BUNDLE_FILE: "/etc/ssl/private/terraform-enterprise/bundle.pem"
+ TFE_IACT_SUBNETS: ""
+ cap_add:
+ - IPC_LOCK
+ read_only: true
+ tmpfs:
+ - /tmp:mode=01777
+ - /run
+ - /var/log/terraform-enterprise
+ ports:
+ - "80:80"
+ - "443:443"
+ volumes:
+ - type: bind
+ source: /var/run/docker.sock
+ target: /run/docker.sock
+ - type: bind
+ source: ./certs
+ target: /etc/ssl/private/terraform-enterprise
+ - type: bind
+ source:
+ target: /var/lib/terraform-enterprise
+ - type: volume
+ source: terraform-enterprise-cache
+ target: /var/cache/tfe-task-worker/terraform
+volumes:
+ terraform-enterprise-cache:
+```
+
+### Example `external` mode configuration
+
+The following compose configuration deploys Terraform Enterprise in `external` mode and expects to connect to an external PostgreSQL server and an external S3-compatible object storage server.
+
+```yaml
+# Caution: $ is a reserved character in docker compose files for variable interpolation and can be escaped by using $$.
+# https://docs.docker.com/compose/how-tos/environment-variables/variable-interpolation/
+---
+name: terraform-enterprise
+services:
+ tfe:
+ image: images.releases.hashicorp.com/hashicorp/terraform-enterprise:
+ environment:
+ TFE_LICENSE: ""
+ TFE_HOSTNAME: ""
+ TFE_ENCRYPTION_PASSWORD: ''
+ TFE_OPERATIONAL_MODE: "external"
+ TFE_DISK_CACHE_VOLUME_NAME: "${COMPOSE_PROJECT_NAME}_terraform-enterprise-cache"
+ TFE_TLS_CERT_FILE: "/etc/ssl/private/terraform-enterprise/cert.pem"
+ TFE_TLS_KEY_FILE: "/etc/ssl/private/terraform-enterprise/key.pem"
+ TFE_TLS_CA_BUNDLE_FILE: "/etc/ssl/private/terraform-enterprise/bundle.pem"
+ TFE_IACT_SUBNETS: ""
+
+ # Database settings. See the configuration reference for more settings.
+ TFE_DATABASE_USER: ""
+ TFE_DATABASE_PASSWORD: ''
+ TFE_DATABASE_HOST: ""
+ TFE_DATABASE_NAME: ""
+ TFE_DATABASE_PARAMETERS: ""
+
+ # Object storage settings. See the configuration reference for more settings.
+ TFE_OBJECT_STORAGE_TYPE: "s3"
+ TFE_OBJECT_STORAGE_S3_ACCESS_KEY_ID: ""
+ TFE_OBJECT_STORAGE_S3_SECRET_ACCESS_KEY: ''
+ TFE_OBJECT_STORAGE_S3_REGION: ""
+ TFE_OBJECT_STORAGE_S3_BUCKET: ""
+ cap_add:
+ - IPC_LOCK
+ read_only: true
+ tmpfs:
+ - /tmp:mode=01777
+ - /run
+ - /var/log/terraform-enterprise
+ ports:
+ - "80:80"
+ - "443:443"
+ volumes:
+ - type: bind
+ source: /var/run/docker.sock
+ target: /run/docker.sock
+ - type: bind
+ source: ./certs
+ target: /etc/ssl/private/terraform-enterprise
+ - type: volume
+ source: terraform-enterprise-cache
+ target: /var/cache/tfe-task-worker/terraform
+volumes:
+ terraform-enterprise-cache:
+```
+
+### Example `active-active` mode configuration
+
+The following compose configuration deploys Terraform Enterprise in `active-active` mode and expects to connect to an external PostgreSQL server, external S3-compatible object storage server, and external Redis-compatible caching server.
+
+```yaml
+# Caution: $ is a reserved character in docker compose files for variable interpolation and can be escaped by using $$.
+# https://docs.docker.com/compose/how-tos/environment-variables/variable-interpolation/
+---
+name: terraform-enterprise
+services:
+ tfe:
+ image: images.releases.hashicorp.com/hashicorp/terraform-enterprise:
+ environment:
+ TFE_LICENSE: ""
+ TFE_HOSTNAME: ""
+ TFE_ENCRYPTION_PASSWORD: ''
+ TFE_OPERATIONAL_MODE: "active-active"
+ TFE_DISK_CACHE_VOLUME_NAME: "${COMPOSE_PROJECT_NAME}_terraform-enterprise-cache"
+ TFE_TLS_CERT_FILE: "/etc/ssl/private/terraform-enterprise/cert.pem"
+ TFE_TLS_KEY_FILE: "/etc/ssl/private/terraform-enterprise/key.pem"
+ TFE_TLS_CA_BUNDLE_FILE: "/etc/ssl/private/terraform-enterprise/bundle.pem"
+ TFE_IACT_SUBNETS: ""
+
+ # Database settings. See the configuration reference for more settings.
+ TFE_DATABASE_USER: ""
+ TFE_DATABASE_PASSWORD: ''
+ TFE_DATABASE_HOST: ""
+ TFE_DATABASE_NAME: ""
+ TFE_DATABASE_PARAMETERS: ""
+
+ # Object storage settings. See the configuration reference for more settings.
+ TFE_OBJECT_STORAGE_TYPE: "s3"
+ TFE_OBJECT_STORAGE_S3_ACCESS_KEY_ID: ""
+ TFE_OBJECT_STORAGE_S3_SECRET_ACCESS_KEY: ""
+ TFE_OBJECT_STORAGE_S3_REGION: ""
+ TFE_OBJECT_STORAGE_S3_BUCKET: ""
+
+ # Redis settings. See the configuration reference for more settings.
+ TFE_REDIS_HOST: ""
+ TFE_REDIS_USER: ""
+ TFE_REDIS_PASSWORD: ""
+ TFE_REDIS_USE_TLS: ""
+ TFE_REDIS_USE_AUTH: ""
+
+ # Vault cluster settings.
+ # If you are using the default internal vault, this should be the private routable IP address of the node itself.
+ TFE_VAULT_CLUSTER_ADDRESS: "https://:8201"
+ cap_add:
+ - IPC_LOCK
+ read_only: true
+ tmpfs:
+ - /tmp:mode=01777
+ - /run
+ - /var/log/terraform-enterprise
+ ports:
+ - "80:80"
+ - "443:443"
+ - "8201:8201"
+ volumes:
+ - type: bind
+ source: /var/run/docker.sock
+ target: /run/docker.sock
+ - type: bind
+ source: ./certs
+ target: /etc/ssl/private/terraform-enterprise
+ - type: volume
+ source: terraform-enterprise-cache
+ target: /var/cache/tfe-task-worker/terraform
+volumes:
+ terraform-enterprise-cache:
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/docker/scale.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/docker/scale.mdx
new file mode 100644
index 0000000000..8a5823ebaf
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/docker/scale.mdx
@@ -0,0 +1,141 @@
+---
+page_title: Scale Terraform Enterprise instances hosted on Docker
+description: >-
+ Learn how to migrate Terraform Enterprise instances hosted on Docker to `active-active` mode so that you can scale your deployment.
+---
+
+# Scale Terraform Enterprise instances hosted on Docker
+
+This topic describes how to migrate Terraform Enterprise instances hosted on Docker to `active-active` mode so that you can scale your deployment.
+
+## Introduction
+
+When your organization requires increased reliability or performance from Terraform Enterprise that your current single application instance cannot provide, we recommend switching to `active-active` mode. In this mode, Terraform Enterprise connects to external systems that store and manage application and state data.
+
+Operating Terraform Enterprise in `active-active` mode improves application scalability, but it also increases operational complexity. Consider the following aspects of operating Terraform Enterprise in `active-active` mode:
+
+- Observability concerns when monitoring multiple instances
+- Custom automation required to manage the lifecycle of application nodes
+- [CLI-based commands](/terraform/enterprise/deploy/reference/cli) for administration
+
+-> **Note**: Contact your Customer Success Manager before attempting to follow this guide. They can walk you through the process and make it as seamless as possible.
+
+## Prerequisite
+
+The primary requirement for `active-active` is an auto-scaling group or equivalent with a single instance running Terraform Enterprise. This auto-scaling group (ASG) should be behind a load balancer, and you can expose it to the public Internet, depending on your requirements.
+
+As mentioned earlier, your Terraform Enterprise application installation should be completely automated to ensure the auto-scaling group can scale down to zero and back up to one without human intervention.
+
+-> **Note**: Operating Terraform Enterprise in `active-active` mode on VMware infrastructure requires configuring a load balancer to route traffic across Terraform Enterprise servers. This documentation does not cover that setup. While auto-scaling groups are unavailable via native vCenter options, you must still configure a fully automated deployment. You must also reduce the available servers to one for upgrades, maintenance, and support.
+
+Your Terraform Enterprise application must be configured to run in [`external` operational mode](/terraform/enterprise/deploy/reference/configuration#external) to connect to an external PostgreSQL database and object storage.
+
+## Step 1: Prepare to Externalize Redis
+
+Prior to reconfiguring Terraform Enterprise, Redis must be externalized. Redis is used for background work scheduling across multiple nodes in an `active-active` installation.
+
+### Prepare Network
+
+There are new access requirements involving ingress and egress:
+
+- **Port 6379** (or the port the external Redis uses) must be open between the nodes and the Redis service.
+- **Port 8201** must be open between the nodes to allow Vault to run in [High Availability](/vault/docs/internals/high-availability) mode.
+
+### Provision Redis
+
+Externalizing Redis allows multiple active application nodes. Terraform Enterprise installs as a standard product on VMware machines and validated to work with the native Redis services from AWS, Azure, and GCP.
+The Redis deployment must satify the [requirements](/terraform/enterprise/deploy/configuration/storage/connect-redis#requirements) of Terraform Enterprise.
+
+Refer to the [cloud-specific configuration guides for more details](#redis-server).
+
+## Step 2: Update your Configuration File Templates
+
+Before installing, you must change the templates for the configuration files mentioned in the [prerequisites](#prerequisite).
+
+### Update Application Settings
+
+Your existing Terraform Enterprise application settings are still necessary, but must be expanded. Refer to [Configuration Reference](/terraform/enterprise/deploy/reference/configuration) for a full list of configuration options.
+
+#### Enable `active-active` mode
+
+Update the Terraform Enterprise configuration to reflect the `active-active` operational mode:
+
+| **Key** | **Required Value** | **Specific Format Required** |
+| -------------------- | ------------------ | ---------------------------- |
+| `TFE_OPERATIONAL_MODE` | `active-active` | **Yes**, string. |
+
+#### Configure External Redis
+
+You must also expand your Terraform Enterprise application settings to support an external Redis instance:
+
+| **Key** | **Required Value** | **Specific Format Required** |
+| ---------------------| ------------------------------------------------------------------------- | ---------------------------- |
+| TFE_REDIS_HOST | Hostname in `host:port` format of an external Redis instance. | **Yes**, string. |
+| TFE_REDIS_USE_AUTH\* | Set to `true`, if you are using a Redis service that requires a password. | **Yes**, boolean. |
+| TFE_REDIS_USER\* | User used to authenticate to Redis. | **Yes**, string. |
+| TFE_REDIS_PASSWORD\* | User used to authenticate to Redis. | **Yes**, string. |
+| TFE_REDIS_USE_TLS\* | Set to `true` if you are using a Redis service that requires TLS. | **Yes**, boolean. |
+
+_\* Fields marked with an asterisk are only necessary if your particular external Redis instance requires them._
+
+To use in-transit encryption with GCP Memorystore for Redis, you must [download the CA certificate](https://cloud.google.com/memorystore/docs/redis/enabling-in-transit-encryption#downloading_the_certificate_authority) for your Redis instance and configure it within the `ca_certs` Terraform Enterprise application setting. Additionally, ensure to configure the `redis_port` and `redis_use_tls` settings correctly.
+
+#### Add Encryption Password
+
+Add the encryption password value to your configuration. The password must be identical between node instances for the `active-active` architecture to function:
+
+| **Key** | **Description** | **Value can change between deployments?** | **Specific Format Required** |
+| ------------ | ----------------------------------------- | --------------------------------------------------------------- | ---------------------------- |
+| `TFE_ENCRYPTION_PASSWORD` | Used to encrypt sensitive data | **No.** Changing makes decrypting existing data impossible. | No |
+
+
+## Step 3: Connect to External Redis
+
+Once you are prepared to include the modified configuration options in your configuration files, you must connect a single node to your newly provisioned Redis service by rebuilding your node instance with the new settings.
+
+### Re-provision Terraform Enterprise Instance
+
+Terminate the existing instance by scaling down to zero. Once terminated, you can scale back up to one instance using your revised configuration.
+
+### Wait for Terraform Enterprise to Install
+
+It can take up to 15 minutes for the node to provision and install the Terraform Enterprise application. You can monitor the provisioning status by watching your auto scaling group in your cloud’s web console. To confirm the successful implementation of the Terraform Enterprise application you can use the `tfectl` CLI tool in the Terraform Enterprise container to monitor the application status:
+
+```bash
+tfectl app status
+```
+
+Refer to the [CLI reference](/terraform/enterprise/deploy/reference/cli) for more status and troubleshooting commands.
+
+### Validate Application
+
+With installation complete, it is time to validate the new Redis connection. Terraform Enterprise uses Redis both as a cache for API requests and a queue for long running jobs (e.g., Terraform runs). Test the queue for long running jobs by running real Terraform operations through the system.
+
+Once you are satisfied the application is running as expected, you can move on to step 4 to scale up to two nodes.
+
+## Step 4: Scale to Two Nodes
+
+You can now safely change the number of instances in your auto scaling group (or equivalent) to two.
+
+### Scale Down to Zero Nodes
+
+Scale down to zero nodes to fully disable the admin dashboard. Wait until the the existing instance is terminated.
+
+### Scale Up to Two Nodes
+
+Now that you have tested your external Redis connection change the min and max instance count of your Auto Scaling Group to two nodes.
+
+### Wait for Terraform Enterprise to Install
+
+You need to wait up to 15 minutes for the application to respond as healthy on both nodes. Monitor the status of the install [using the same methods](#validate-application).
+
+Note that you must check each node _independently_.
+
+### Validate Application
+
+Finally, confirm the application is functioning as expected when running multiple nodes by running Terraform plans and applying them through the system (and any other tests specific to your environment).
+
+Confirm the general functionality of the Terraform Enterprise user interface to validate [the tokens you added in Step 2 are set correctly](#step-2-update-your-configuration-file-templates). Browse the `Run` interface and your organization's private registry to confirm your application functions as expected.
+
+
+@include "replicated-and-fdo/admin/active-active-scaling-partial.mdx"
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/index.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/index.mdx
new file mode 100644
index 0000000000..7ce55d96a4
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/index.mdx
@@ -0,0 +1,59 @@
+---
+page_title: Terraform Enterprise deployment overview
+description: Terraform Enterprise offers flexible deployment options for container runtime environments and data management modes. Learn about the deployment process.
+---
+
+# Terraform Enterprise deployment overview
+
+This topic provides an overview of the Terraform Enterprise deployment process. For information about deploying Terraform Enterprise using the Replicated platform, refer to [Deploy Terraform Enterprise to Replicated](/terraform/enterprise/deploy/replicated). If your existing Terraform Enterprise instances were deployed to Replicated, [refer to our migration guide](/terraform/enterprise/deploy/replicated-migration) for instructions on how to deploy the platform to one of the supported runtimes.
+
+## Introduction
+
+Terraform Enterprise runs in containerized instances that support flexible deployment options for self-hosted environments. You can deploy Terraform Enterprise to the following non-Replicated runtimes:
+
+- Docker
+- Kubernetes
+- OpenShift
+- Nomad
+- Podman
+
+You can configure Terraform Enterprise to run as a self-contained application that manages the associated data storage or as an integrated installation that connects to externally-managed data storage systems. Refer to [Data storage overview](/terraform/enterprise/deploy/configuration/storage) for additional information.
+
+## Terraform module workflow
+
+HashiCorp provides the following Terraform modules in the public Terraform registry to help you deploy Terraform Enterprise:
+
+- [Amazon Web Services EC2](https://registry.terraform.io/modules/hashicorp/terraform-enterprise-hvd/aws/latest)
+- [Amazon Web Services EKS](https://registry.terraform.io/modules/hashicorp/terraform-enterprise-eks-hvd/aws/latest)
+- [Microsoft Azure VM](https://registry.terraform.io/modules/hashicorp/terraform-enterprise-hvd/azurerm/latest)
+- [Microsoft Azure AKS](https://registry.terraform.io/modules/hashicorp/terraform-enterprise-aks-hvd/azurerm/latest)
+- [Google Cloud GCE](https://registry.terraform.io/modules/hashicorp/terraform-enterprise-hvd/google/latest)
+- [Google Cloud GKE](https://registry.terraform.io/modules/hashicorp/terraform-enterprise-gke-hvd/google/latest)
+
+Each official module above aligns with HashiCorp Validated Designs, HashiCorp's official recommendations based on extensive experience working with various organizations to deploy our solutions. To learn more about using HashiCorp Validated Designs, contact your account team.
+
+## Manual workflow
+
+Terraform Enterprise supports several container runtime environments and operating modes for managing data that provide you with flexible deployment options. To deploy Terraform Enterprise, create a configuration file that specifies your deployment settings, complete any external prerequisites associated with your deployment configuration, then use your runtime interface to run the installation.
+
+### Prepare the deployment environment
+
+Create a host instance on your cloud provider and install a runtime environment. You must also configure network access, assign a DNS hostname, and install the TLS certificate. If you intend to connect Terraform Enterprise to an external Vault server or PostgreSQL database, you must also configure and launch those systems. Refer to [Prepare the Terraform Enterprise host environment](/terraform/enterprise/deploy/prepare-host/) for details.
+
+### Create the configuration
+
+Create a deployment configuration file for your runtime environment, such as a values.yaml if you are deploying to Kubernetes or a compose.yaml file if you are deploying to Docker, and specify the Terraform Enterprise configurations. The runtime platform starts the Linux container for Terraform Enterprise according to the settings defined in the configuration file. Refer to [Create deployment configuration overview](/terraform/enterprise/deploy/configuration/) for additional information.
+
+### Install Terraform Enterprise
+
+After completing the prerequisites, deploy Terraform Enterprise to your runtime environment. Refer to the following topics for instructions:
+
+- [Deploy Terraform Enterprise to Docker](/terraform/enterprise/deploy/docker)
+- [Deploy Terraform Enterprise to Kubernetes](/terraform/enterprise/deploy/kubernetes)
+- [Deploy Terraform Enterprise to OpenShift](/terraform/enterprise/deploy/openshift)
+- [Deploy Terraform Enterprise to Podman](/terraform/enterprise/deploy/podman)
+- [Deploy Terraform Enterprise to Nomad](/terraform/enterprise/deploy/nomad)
+
+### Review startup checks
+
+When you start Terraform Enterprise, several startup checks also run to prevent errors related to invalid configurations or certificates, as well as other issues that could prevent the application from running successfully or safely. Refer to the [startup checks reference](/terraform/enterprise/deploy/reference/startup-checks) for additional information.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/initial-admin-user.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/initial-admin-user.mdx
new file mode 100644
index 0000000000..90c34c8d33
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/initial-admin-user.mdx
@@ -0,0 +1,115 @@
+---
+page_title: Create the initial admin user for Terraform Enterprise
+description: >-
+ You must create an admin user to manage Terraform Enterprise and run workloads. Learn how to create the initial admin user in Terraform Enterprise.
+---
+
+# Create initial Terraform Enterprise admin user
+
+This topic describes how to create the initial admin user for managing the Terraform Enterprise application and run workloads. Create the initial admin user after installing Terraform Enterprise. Refer to [Deploy Terraform Enterprise](/terraform/enterprise/deploy) for additional information about the deployment process.
+
+## Overview
+
+Complete the following steps to create the initial admin user:
+
+1. **Retrieve the initial admin creation token**: The initial admin creation token (IACT) is available for a limited time after starting Terraform Enterprise. You must present the token to authenticate your request to create an admin user.
+1. **Create initial admin user**: You can create the initial admin user in two ways: using the browser or directly from the container or pod.
+
+## Requirements
+
+Terraform Enteprise must not have any other users in the system when creating an admin user by presenting the IACT.
+
+## Retrieve initial admin creation token
+
+You may set the initial admin creation token in [`TFE_IACT_TOKEN` setting reference](/terraform/enterprise/deploy/reference/configuration#tfe_iact_token) if desired. If it is set, you may proceed to [Create initial admin user](#create-initial-admin-user).
+
+If this value is not set, a random token will be generated. By default, you have 60 minutes to retrieve the IACT upon start up. Refer to the [`TFE_IACT_TIME_LIMIT` setting reference](/terraform/enterprise/deploy/reference/configuration#tfe_iact_time_limit) for additional information about changing the time limit.
+
+You can retrieve the IACT from the Terraform Enterprise UI or from the Terraform Enterprise container or pod.
+
+### UI
+
+Navigate to `https://${TFE_HOSTNAME}/admin/retrieve-iact` in your browser on a workstation to retrieve your token. The host name is one of the addresses specified in the [`TFE_IACT_SUBNETS` setting](/terraform/enterprise/deploy/reference/configuration#tfe_iact_subnets).
+
+
+### Container or pod
+
+You can retrieve your IACT token directly from the Terraform Enterprise container or pod:
+
+
+
+
+Run the following command to retrieve your IACT token from a Kubernetes pod.
+```shell-session
+$ kubectl exec -it -n -- tfectl admin token
+```
+
+
+
+
+Run the following command to retrieve your IACT token from a Docker container.
+```shell-session
+$ docker exec tfectl admin token
+```
+
+
+
+
+Run the following command to retrieve your IACT token from a Podman container.
+```shell-session
+$ podman exec -it tfectl admin token
+```
+
+
+
+
+
+Run the following command to retrieve your IACT token from a Nomad allocation.
+```shell-session
+$ nomad alloc exec -namespace= -it -task tfectl admin token
+```
+
+
+
+## Create initial admin user
+
+You can create the initial admin user in the Terraform Enterprise UI or by sending a `POST` request to the `/admin/initial-admin-user` API endpoint.
+
+### UI
+
+1. Navigate to `https://${TFE_HOSTNAME}/admin/account/new?token=${IACT_TOKEN}` in your browser on a workstation. The host name is one of the addresses specified in the [`TFE_IACT_SUBNETS` setting](/terraform/enterprise/deploy/reference/configuration#tfe_iact_subnets).
+1. When prompted, complete the steps to create the admin user.
+
+### Container or pod
+
+1. Create a JSON document with the username, email address, and password for the admin user you want to create. Refer to [`initial-admin-user` reference documentation](/terraform/enterprise/api-docs/admin/initial-admin-user) for additional information.
+
+ The following example payload creates a user named `manage`:
+
+ ```json
+ {
+ "username": "manage",
+ "email": "it@mycompany.com",
+ "password": "thisisabadpassword"
+ }
+ ```
+
+1. Send a `POST` request to the `/admin/initial-admin-user` endpoint. You must present the IACT token. Refer to [Retrieve initial admin creation token](#retrieve-initial-admin-creation-token) for instructions.
+
+ The following example sends the initial admin user details in a file called `payload.json`:
+ ```shell
+ curl \
+ --header "Content-Type: application/json" \
+ --request POST \
+ --data @payload.json \
+ https://${TFE_HOSTNAME}/admin/initial-admin-user?token=${IACT_TOKEN}
+ ```
+
+The API returns a `created` status response:
+
+```json
+{
+ "status": "created",
+ "token": "aabbccdd.v1.atlas.ddeeffgghhiijjkkllmmnnooppqqrrssttuuvvxxyyzz"
+}
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/kubernetes/index.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/kubernetes/index.mdx
new file mode 100644
index 0000000000..b8817d1e4a
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/kubernetes/index.mdx
@@ -0,0 +1,342 @@
+---
+page_title: Deploy Terraform Enterprise to Kubernetes
+description: >-
+ Learn how to deploy Terraform Enterprise to Kubernetes-orchestrated containers using Helm.
+---
+
+# Deploy Terraform Enterprise to Kubernetes
+
+This topic describes how to deploy Terraform Enterprise to Kubernetes. You should have a deep understanding of Kubernetes before deploying Terraform Enterprise to a production Kubernetes environment.
+
+## Overview
+
+You should deploy external service dependencies outside the Kubernetes cluster and scale reliably to accommodate Terraform Enterprise workloads. The following diagram shows the Terraform Enterprise architecture when deployed to Kubernetes-orchestrated containers:
+
+
+
+Complete the following steps to install Terraform Enterprise:
+
+1. Complete the prerequisites.
+1. Install the Helm chart and apply your override values.
+1. Complete post installation tasks.
+
+Complete post installation tasks, such creating the initial admin user account.
+
+## Prerequisites
+
+Complete the following tasks before attempting to install Terraform Enterprise.
+
+### Prepare the deployment environment
+
+Provide a DNS hostname for Terraform Enterprise and the associated TLS certificate. Additionally, you must configure your network so that your host can receive and send traffic. Refer to [Prepare the host environment](/terraform/enterprise/deploy/prepare-host) for details about preparing the host environment.
+
+### Deploy external storage systems
+
+Deploy the database and other storage devices so that Terraform can connect to them when the application starts. Refer to [Data storage settings overview](/terraform/enterprise/deploy/configuration/storage) for additional information.
+
+### Create the deployment configuration
+
+Create a custom YAML configuration file, for example `/tmp/overrides.yaml`, to override the default values in the Terraform Enterprise Helm chart. The file contains settings for the operational mode, license, TLS certificates, and network configuration. Add any additional configurations necessary for your environment. Refer to [Configuration file overview](/terraform/enterprise/deploy/configuration/) for additional information.
+
+@include 'common-kubernetes-blocks/externalizing-secret-values.mdx'
+
+#### Automatic environment configuration
+
+There are a collection of environment variables that are predetermined or computed when using the Terraform Enterprise Helm chart. When you configure the variables as `.Values.env.variables` entries, Terraform Enterprise overwrites them with the predetermined or computed values. Refer to [the config-map.yaml template](https://github.com/hashicorp/terraform-enterprise-helm/blob/main/templates/config-map.yaml) for version of the chart that you are using.
+
+#### Running as non-root
+
+By default, Terraform Enterprise runs as the `terraform-enterprise` user. If you want to enforce Terraform Enterprise as a non-root user, you must set the Helm chart values:
+
+* `.securityContext.runAsNonRoot: true`
+* `.securityContext.runAsUser: 1000`
+* `.securityContext.fsGroup: 1012`.
+
+## Install Terraform Enterprise with Helm
+
+1. Connect to the host instance.
+
+1. Log in to the Terraform Enterprise container image registry.
+
+ ```shell-session
+ $ cat | docker login --username terraform images.releases.hashicorp.com --password-stdin
+ ```
+
+1. Pull the Terraform Enterprise image from the registry.
+
+ ```shell-session
+ $ docker pull images.releases.hashicorp.com/hashicorp/terraform-enterprise:
+ ```
+
+1. Create a custom namespace.
+
+ ```shell-session
+ $ kubectl create namespace
+ ```
+
+1. Create an image pull secret in `` to fetch the `terraform-enterprise` container from the ``. This URL can be `images.releases.hashicorp.com`, or your internal container registry. If you are using `images.releases.hashicorp.com`, use `terraform` as the `` parameter in the following command with `--docker-password=$(cat /path/to/terraform.hclic)`
+
+ ```shell-session
+ $ kubectl create secret docker-registry terraform-enterprise --docker-server= --docker-username= --docker-password= -n
+ ```
+
+1. Add the Hashicorp Helm registry:
+
+ ```shell-session
+ $ helm repo add hashicorp https://helm.releases.hashicorp.com
+ ```
+
+1. Render the `terraform-enterprise` chart with your custom [values file](https://helm.sh/docs/chart_template_guide/values_files/) ``, for example `tmp/overrides.yaml`.
+
+ ```shell-session
+ $ helm template terraform-enterprise hashicorp/terraform-enterprise –n --values
+ ```
+
+1. Install `terraform-enterprise`, this step can take several minutes.
+
+ ```shell-session
+ $ helm install terraform-enterprise hashicorp/terraform-enterprise –n --values
+ ```
+
+1. Inspect `terraform-enterprise` pods to verify their successful start.
+
+ ```shell-session
+ $ kubectl get pods -n
+ ```
+
+ If Terraform Enterprise pods fail to start, refer to [Kubernetes Troubleshooting](/terraform/enterprise/deploy/troubleshoot/error-messages#kubernetes).
+
+1. By default, Terraform Enterprise installs a load balancer service. Retrieve the external IP address of this service.
+
+ ```shell-session
+ $ kubectl get services -n
+ ```
+
+1. Set up a DNS record that points to your external IP address to enable routing to your ``. A DNS address is required to communicate with Terraform Enterprise, and it is managed outside of Kubernetes and the Terraform Enterprise helm chart or application.
+
+1. Validate the readiness of the Terraform Enterprise application by querying the health check endpoint.
+
+ ```shell-session
+ $ curl https://tfe.test.hashicorp.com/_health_check
+ ```
+
+## Post installation tasks
+
+Complete the following tasks after the initial installation.
+
+### Review startup checks
+
+When you start Terraform Enterprise, several startup checks also run to prevent errors related to invalid configurations or certificates, as well as other issues that could prevent the application from running successfully or safely. Refer to the [startup checks reference](/terraform/enterprise/deploy/reference/startup-checks) for additional information.
+
+### Create initial admin user
+
+[Provision your first administrative user](/terraform/enterprise/deploy/initial-admin-user) and start using Terraform Enterprise.
+
+### Configure the security context
+
+Modify the `.securityContext` Helm chart value to set the pod security configuration. Modify the `.container.securityContext` Helm chart value to set the container security configuration. You must also omit the `allowPrivilegeEscalation` container security context option or set it to `true`.
+
+### Create a custom Helm chart fork
+
+The [Terraform Enterprise Helm Chart](https://github.com/hashicorp/terraform-enterprise-helm) is designed to meet the needs of the majority of our users. You can fork our Helm chart and adapt it to your organization’s requirements.
+
+If you contact HashiCorp support, include your custom helm chart alongside your support bundle to ensure support has all the information they need.
+
+### Custom ingress
+You can define an optional ingress resource using the ingress controller. Refer the [Terraform Enterprise Helm Chart](https://github.com/hashicorp/terraform-enterprise-helm) documentation for additional information about the controller.
+
+Specify values for the ingress section in the deployment configuration. Refer to the example values file in the [Terraform Enterprise Helm chart repository](https://github.com/hashicorp/terraform-enterprise-helm/blob/main/docs/example/terraform-enterprise-prereqs/values.yaml#L46C9-L46C9) for a demonstration of how to enable ingress configuration.
+
+Complete the following steps to set up an custom ingress configuration with Nginx:
+1. Install the [nginx controller](https://kubernetes.github.io/ingress-nginx/deploy/) in a different namespace.
+1. Deploy Terraform Enterprise with Ingress configured in your values file.
+1. Get the address from the ingress resource like so:
+
+```shell-session
+$ kubectl get ingress
+NAME CLASS HOSTS ADDRESS PORTS AGE
+terraform-enterprise nginx 80, 443 60s
+```
+
+## Example configurations
+
+The following examples for each cloud-platform are based on cloud native hosted PostgreSQL, storage, or Redis cache services. You can copy an example configuration and modify the values to per your environment. Refer to [Configuration Reference](/terraform/enterprise/deploy/reference/configuration)
+for a list of all configuration options.
+
+The examples also depend on the following conditions:
+
+- Values under `.env.variables` are set as a `ConfigMap` and mounted as Terraform Enterprise environment variables.
+- Values under `.env.secrets` are set as Kubernetes secrets and mounted as Terraform Enterprise environment variables.
+- Extend the `env.configMapRefs[]` or `env.secretRefs[]` with your own resources to add additional `ConfigMap` or `Secret` resources within your environment configuration.
+
+- Values marked `BASE_64_ENCODED*` indicate that the value given must be base 64 encoded. If you are using this certificate configuration to host Terraform Enterprise web traffic, this value must be valid with the `env.TFE_HOSTNAME`, or match the wildcard pattern.
+
+
+### AWS Elastic Kubernetes Service (EKS)
+
+```YAML
+replicaCount:
+tls:
+ certData:
+ keyData:
+ caCertData:
+image:
+ repository: images.releases.hashicorp.com
+ name: hashicorp/terraform-enterprise
+ tag:
+env:
+ variables:
+ TFE_HOSTNAME:
+ TFE_IACT_SUBNETS:
+
+ # Database settings.
+ TFE_DATABASE_HOST:
+ TFE_DATABASE_NAME:
+ TFE_DATABASE_PARAMETERS:
+ TFE_DATABASE_USER:
+
+ # Redis settings.
+ TFE_REDIS_HOST:
+ TFE_REDIS_USE_TLS:
+ TFE_REDIS_USE_AUTH:
+ TFE_REDIS_USER:
+
+ # S3 settings. For Server Side Encryption settings, see to the configuration reference.
+ TFE_OBJECT_STORAGE_TYPE: s3
+ TFE_OBJECT_STORAGE_S3_BUCKET:
+ TFE_OBJECT_STORAGE_S3_REGION:
+ TFE_OBJECT_STORAGE_S3_USE_INSTANCE_PROFILE:
+ secrets:
+ TFE_DATABASE_PASSWORD: ''
+ TFE_OBJECT_STORAGE_S3_ACCESS_KEY_ID:
+ TFE_OBJECT_STORAGE_S3_SECRET_ACCESS_KEY: ''
+ TFE_REDIS_PASSWORD: ''
+ TFE_LICENSE:
+ TFE_ENCRYPTION_PASSWORD: ''
+```
+
+### Google Kubernetes Engine (GKE)
+
+```YAML
+replicaCount:
+tls:
+ certData:
+ keyData:
+ caCertData:
+image:
+ repository: images.releases.hashicorp.com
+ name: hashicorp/terraform-enterprise
+ tag:
+env:
+ variables:
+ TFE_HOSTNAME:
+ TFE_IACT_SUBNETS:
+
+ # Database settings.
+ TFE_DATABASE_HOST:
+ TFE_DATABASE_NAME:
+ TFE_DATABASE_PARAMETERS:
+ TFE_DATABASE_USER:
+
+ # Redis settings.
+ TFE_REDIS_HOST:
+ TFE_REDIS_USE_TLS:
+ TFE_REDIS_USE_AUTH:
+ TFE_REDIS_USER:
+
+ # Google Cloud Storage settings.
+ TFE_OBJECT_STORAGE_TYPE: google
+ TFE_OBJECT_STORAGE_GOOGLE_BUCKET:
+ TFE_OBJECT_STORAGE_GOOGLE_PROJECT:
+ secrets:
+ TFE_DATABASE_PASSWORD: ''
+ TFE_OBJECT_STORAGE_GOOGLE_CREDENTIALS:
+ TFE_REDIS_PASSWORD: ''
+ TFE_LICENSE:
+ TFE_ENCRYPTION_PASSWORD: ''
+```
+
+### Azure Kubernetes Service (AKS)
+
+
+```YAML
+replicaCount:
+tls:
+ certData:
+ keyData:
+ caCertData:
+image:
+ repository: images.releases.hashicorp.com
+ name: hashicorp/terraform-enterprise
+ tag:
+env:
+ variables:
+ TFE_HOSTNAME:
+ TFE_IACT_SUBNETS:
+
+ # Database settings.
+ TFE_DATABASE_HOST:
+ TFE_DATABASE_NAME:
+ TFE_DATABASE_PARAMETERS:
+ TFE_DATABASE_USER:
+
+ # Redis settings.
+ TFE_REDIS_HOST:
+ TFE_REDIS_USE_TLS:
+ TFE_REDIS_USE_AUTH:
+ TFE_REDIS_USER:
+
+ # Azure container storage settings.
+ TFE_OBJECT_STORAGE_TYPE: azure
+ TFE_OBJECT_STORAGE_AZURE_ACCOUNT_NAME:
+ TFE_OBJECT_STORAGE_AZURE_CONTAINER:
+ TFE_OBJECT_STORAGE_AZURE_ENDPOINT:
+ secrets:
+ TFE_DATABASE_PASSWORD: ''
+ TFE_OBJECT_STORAGE_AZURE_ACCOUNT_KEY: ''
+ TFE_REDIS_PASSWORD: ''
+ TFE_LICENSE:
+ TFE_ENCRYPTION_PASSWORD: ''
+```
+
+#### Using AKS with Workload Identity
+
+If you are using AKS with Workload Identity, the configuration is slightly different. You must set omit the `TFE_OBJECT_STORAGE_AZURE_ACCOUNT_KEY` secret, and configure
+the AKS cluster as an OIDC provider.
+
+```yaml
+serviceAccount:
+ enabled: true
+ name: ""
+ annotations:
+ azure.workload.identity/client-id: ""
+ labels:
+ azure.workload.identity/use: "true"
+pod:
+ labels:
+ azure.workload.identity/use: "true"
+agents:
+ rbac:
+ enabled: true
+```
+
+The `` is the client_id from the Azure User Assigned Identity. One can find this value in the Azure portal.
+
+This user assigned identity needs a federated identity credential with the following subject format
+`"system:serviceaccount:${KUBERNETES_NAMESPACE}:${SERVICE_ACCOUNT_NAME}"`.
+
+The issuer of the federated identity should be the cluster's issuer URL. One can retrieve this URL by running the following command:
+
+```shell-session
+$ az aks show --resource-group --name --query "oidcIssuerProfile.issuerUrl" --output tsv
+```
+
+## Terraform modules for managed-kubernetes
+
+HashiCorp provides the following Terraform modules in the public Terraform registry to help you deploy Terraform Enterprise on EKS, GKE and AKS:
+
+- [Amazon Web Services EKS](https://registry.terraform.io/modules/hashicorp/terraform-enterprise-eks-hvd/aws/latest)
+- [Google Cloud GKE](https://registry.terraform.io/modules/hashicorp/terraform-enterprise-gke-hvd/google/latest)
+- [Microsoft Azure AKS](https://registry.terraform.io/modules/hashicorp/terraform-enterprise-aks-hvd/azurerm/latest)
+
+Each official module above aligns with HashiCorp Validated Designs, HashiCorp's official recommendations based on extensive experience working with various organizations to deploy our solutions. To learn more about using HashiCorp Validated Designs, contact your account team.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/kubernetes/scale/index.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/kubernetes/scale/index.mdx
new file mode 100644
index 0000000000..f71f747dde
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/kubernetes/scale/index.mdx
@@ -0,0 +1,23 @@
+---
+page_title: Scale Terraform Enterprise instances on Kubernetes
+description: >-
+ Learn how to increase the number of replica instances of your Terraform Enterprise deployment on Kubernetes to scale up Terraform activities.
+---
+
+# Scale Terraform Enterprise instances on Kubernetes
+
+This topic provides overview information about scaling your Terraform Enterprise deployment to meet demand.
+
+## Workflows
+
+To handle increased computational workload requirements of your organization, you can scale Terraform Enterprise horizontally by increasing the number of `terraform-enterprise` pods and `terraform-enterprise agent` pods. Refer to [Increase number of replica instances](/terraform/enterprise/deploy/kubernetes/scale/replicas) for instructions.
+
+You can also increase run capacity to reduce run queue lengths and shorten wait time for runs to begin execution. Refer to [Increase run capacity](/terraform/enterprise/deploy/kubernetes/scale/run-capacity) for instructions.
+
+## Impact on external resources
+
+Scaling your deployment up to meet larger demands may impact the following external resources.
+
+- **PostgreSQL**: In our testing, CPU utilization and memory usage increased when scaling Terraform Enterprise pods with increasing capacity concurrency. We recommend closely monitoring both CPU utilization and memory usage and provide additional resources as necessary.
+- **Redis**: In our testing, Redis CPU or memory spiked in some cases. You should monitor your Redis server and provide additional resources as necessary.
+
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/kubernetes/scale/replicas.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/kubernetes/scale/replicas.mdx
new file mode 100644
index 0000000000..c6525d189a
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/kubernetes/scale/replicas.mdx
@@ -0,0 +1,96 @@
+---
+page_title: Increase number of replica instances
+description: >-
+ Learn how to increase the number of replica instances of your Terraform Enterprise deployment on Kubernetes.
+---
+
+# Increase number of replica instances
+
+This topic describes how to increase the number of replica instances of your Terraform Enterprise deployment on Kubernetes so that your deployment can scale to meet demand.
+
+## Introduction
+
+To handle increased computational workload requirements of your organization, you can scale Terraform Enterprise horizontally by increasing the number of `terraform-enterprise` pods and `terraform-enterprise agent` pods. Refer to the [Scale Terraform Enterprise instances on Kubernetes overview](/terraform/enterprise/deploy/kubernetes/scale) for additional information.
+
+## Requirements
+
+The requirements for your Kubernetes cluster depend on the specific workloads. Update CPU, RAM, storage, and network capacity according to your applications demands.
+
+### CPU requirements
+
+The following minimum requirements for a Terraform Enterprise pod are appropriate for most initial production deployments and for development and test environments:
+
+| CPU | Memory |
+| ------- | ---------|
+| 2 core | 3 GB RAM |
+
+We tested with a minimum memory of 2.5GB and 0.75 vCPU and scaled up to maximum of 7.5GB and 4 vCPU.
+
+```YAML
+resources:
+ requests:
+ memory: "2500Mi"
+ cpu: "750m"
+ limits:
+ memory: "7500Mi"
+ cpu: "4000m"
+```
+
+### Database requirements
+
+The following table describes the recommended minimum memory and CPU requirements for the PostgreSQL database. You may require additional resources depending on the anticipated demands on Terraform Enterprise within your organization:
+
+| Type | CPU | Memory | Storage |
+| ------- | -------|-----------|---------|
+| Minimum | 4 core | 16 GB RAM | 50 GB |
+| Scaling | 8 core | 32 GB RAM | 50 GB |
+
+
+### Redis cache requirements
+
+We successfully tested Terraform Enterprise with the following data store configuration:
+
+- 6GB Redis cache.
+- Multi-AZ enabled.
+- Automated failover enabled.
+
+
+## Increase `terraform-enterprise` pods
+
+Kubernetes creates a _`Deployment`_ object that manages the `terraform-enterprise` pods through a _`ReplicaSet`_. Refer to the Kubernetes documentation to learn about [`Deployment`s](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) and [`ReplicaSet`s](https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/).
+
+The [`deployment.yaml`](https://github.com/hashicorp/terraform-enterprise-helm/blob/0e1a2eb6644bdf6b710c9ce97ed1d2b8e3c558ae/templates/deployment.yaml#L13) file generated during the Terraform Enterprise deployment process includes the `replicas` field, which determines how many `terraform-enterprise` pods Kubernetes should create.
+
+```YAML
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: terraform-enterprise
+ labels:
+ app: terraform-enterprise
+spec:
+ replicas: {{ .Values.replicaCount }}
+ selector:
+ matchLabels:
+ app: terraform-enterprise
+ template:
+ metadata:
+ annotations:
+ {{- if .Values.pod.annotations }}
+ {{ toYaml .Values.pod.annotations | indent 8 }}
+ {{ end }}
+ labels:
+ app: terraform-enterprise
+```
+
+Complete the following steps to increase the number of `terraform-enterprise` pods for your deployment:
+
+1. Update the value of `replicaCount` in the [values file](https://github.com/hashicorp/terraform-enterprise-helm/blob/0e1a2eb6644bdf6b710c9ce97ed1d2b8e3c558ae/values.yaml#L8) of your Helm chart. The `replicaCount` value maps to the `spec.replicas` value in the deployment file. The maximum number of `terraform-enterprise` pods you can instruct Kuberneteds to create is `5`.
+1. Run the `helm upgrade` command to update the deployment.
+
+In the following example, the `replicaCount` is set to `3`, which sets the `spec.replicas` value to `3` after running `helm ugrade`:
+
+```YAML
+ replicaCount: 3
+ ...
+```
\ No newline at end of file
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/kubernetes/scale/run-capacity.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/kubernetes/scale/run-capacity.mdx
new file mode 100644
index 0000000000..0e37c62e2c
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/kubernetes/scale/run-capacity.mdx
@@ -0,0 +1,99 @@
+---
+page_title: Increase Terraform Enterprise run capacity on Kubernetes
+description: >-
+ Learn how to increase the run capacity when operating Terraform Enterprise on Kubernetes.
+---
+
+# Increase Terraform Enterprise run capacity
+
+This topic describes how to increase the run capacity of your Terraform Enterprise deployment on Kubernetes. For instructions on how to create the number of replicas, refer to [Increase number of replicas](/terraform/enterprise/deploy/kubernetes/scale/replicas).
+
+## Introduction
+
+Terraform Enterprise executes runs by creating agent jobs in a different namespace, which in turn creates agent pods. Each run executes in its own agent pod. When run finishes, Terraform automatically cleanse up the agent job and agent pod. You can increase the maximum number of concurrent agent pods to reduce run queue lengths and wait time for runs to begin execution.
+
+Complete the following steps to increase run capacity:
+
+- Configure the maximum number of concurrent agent jobs.
+- Configure memory and CPU limits for individual pods.
+- Adjust the Kubernetes worker timeout settings to allow Kubernetes to automatically scale the cluster.
+
+## Configure concurrency
+
+To increase the number of agent pods that Terraform Enterpise can run concurrently, update the `TFE_CAPACITY_CONCURRENCY` value on the values file on the Helm chart and run `helm upgrade` to update the deployment.
+
+The `TFE_CAPACITY_CONCURRENCY` value sets the maximum number of agent jobs each Terraform Enterprise pod can create at a given time in the `TFE_CAPACITY_CONCURRENCY` setting. The default concurrency is set to `10`. You can specify up to `50` agent jobs. The following example sets the concurrent number of agent jobs allowed to `11`:
+
+``` YAML
+ env:
+ ...
+ variables:
+ TFE_CAPACITY_CONCURRENCY: "11"
+```
+
+`TFE_CAPACITY_CONCURRENCY` applies to each `terraform-enterprise` pod. For example, if you have three `terraform-enterprise` pods, and `TFE_CAPACITY_CONCURRENCY` is `10`, the maximum number of agent pods for Terraform Enterprise is `30`. Refer to [`TFE_CAPACITY_CONCURRENCY`](/terraform/enterprise/deploy/configuration#tfe_capacity_concurrency) for additional information.
+
+## Configure limits for individual agent pods
+
+You can increase the maximum amount of memory and CPU for each agent pod in the `TFE_CAPACITY_MEMORY`and `TFE_CAPACITY_CPU` values and run `helm upgrade` to update the deployment. Refer to the [Helm chart](https://github.com/hashicorp/terraform-enterprise-helm/blob/0e1a2eb6644bdf6b710c9ce97ed1d2b8e3c558ae/values.yaml#L167-L169) for additional information.
+
+In the following example, the CPU limit is set to `0`, which enables an unlimited about of CPU. The memory limit is set to `2048`, which enables up to 2048 mebibytes.
+
+``` YAML
+ env:
+ ...
+ variables:
+ TFE_CAPACITY_CONCURRENCY: "10" # Set the maximum number of concurrent runs, eg: 10
+ TFE_CAPACITY_CPU: "0" # Set the maximum CPU utilization. "0" equals unlimited.
+ TFE_CAPACITY_MEMORY: "2048" # Set the maximum memory utilization, eg: "2048" equals 2048Mi.
+```
+
+## Use Kubernetes cluster autoscaling
+
+
+Enable the `autoscaling` setting for your Kubernetes cluster so that Kubernetes can automatically scale the node capacity when Kubernetes cannot schedule the run due to resource constraints. You must also adjust the [`TFE_RUN_PIPELINE_KUBERNETES_WORKER_TIMEOUT`](/terraform/enterprise/deploy/reference/configuration#tfe_run_pipeline_kubernetes_worker_timeout) setting so that Terraform Enterprise does not timeout before the Kubernetes environment can scale to meet resource demand for additional runs. This setting should be set to be greater than the number of seconds Kubernetes requires to scale out and initiate a new node fitting the constraints and requirements for the agent jobs that Terraform Enterprise generates.
+
+When `autoscaling` is enabled for the Kubernetes cluster, Terraform Enterprise still complies with the maximum number of jobs it can run concurrently per the `TFE_CAPACITY_CONCURRENCY` configuration. We recommend that you carefully configure your Kubernetes environment with infrastructure layer upper and lower bounds on node availability to meet your business needs outside of Terraform Enterprise.
+
+### Google Cloud Platform Kubernetes Engine with Autopilot
+
+You can use Google Cloud Platform Kubernetes Engine (GKE) pod annotations to fine tune the stability and availability of Terraform Enterprise. GKE Autopilot is a mode of operation that manages clusters. Refer to the [Autopilot documentation](https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview) for additional information.
+
+At a minimum, we recommend the following annotations and node selectors:
+
+- require that `tfc-agent` pods are not interruptable using the following annotation: `cluster-autoscaler.kubernetes.io/safe-to-evict=false`
+- select a balanced compute class for both Terraform Enterprise pods and `tfc-agent` workloads using the following node selector: `cloud.google.com/compute-class: "Balanced"`
+- set resource requests for CPU and memory for Terraform Enterprise and `tfc-agent` pods
+
+Manage these settings in the [Terraform Enterprise Helm chart values](https://github.com/hashicorp/terraform-enterprise-helm/blob/main/values.yaml).
+
+The following example shows how to configure features significant to operating Terraform Enterprise in GKE Autopilot. Note that the example is incomplete and does not include additional configurations for operating Terraform Enterprise:
+
+```yaml
+# Terraform Enterprise resource requests, annotations, and node selectors
+resources:
+ requests:
+ memory: "8000Mi"
+ cpu: "8"
+nodeSelector:
+ cloud.google.com/compute-class: "Balanced"
+pod:
+ annotations:
+ cluster-autoscaler.kubernetes.io/safe-to-evict: "false"
+
+# Agent resource requests, annotations, and node selectors, utilizing the agent pod template feature
+agentWorkerPodTemplate :
+ metadata :
+ annotations :
+ "cluster-autoscaler.kubernetes.io/safe-to-evict": "false"
+ spec :
+ nodeSelector :
+ cloud.google.com/compute-class: "Balanced"
+ containers:
+ - name: "tfc-agent"
+ image: "hashicorp/tfc-agent:1.17.5"
+ resources :
+ requests :
+ memory: 2Gi
+ cpu: 2
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/access-cli.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/access-cli.mdx
new file mode 100644
index 0000000000..f3b236ca2e
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/access-cli.mdx
@@ -0,0 +1,50 @@
+---
+page_title: Access the Terraform Enterprise CLI
+description: >-
+ The Terraform Enterprise CLI lets you reconfigure Terraform Enterprise, stop the application safely, and produce support bundles. Learn how to access the CLI.
+---
+
+# Access the Terraform Enterprise CLI
+
+Terraform Enterprise provides a command line interface that enables you to change its configuration, stop the application safely, and produce support bundles. Refer to [CLI reference](/terraform/enterprise/deploy/reference/cli) for information about the commands available.
+
+## Docker
+
+To connect to the Docker container hosting Terraform Enterprise, execute the following command from the server where Terraform Enterprise is running. If you have named your container something other than `terraform-enterprise` please replace that with your container name.
+
+```bash
+$ docker exec -it terraform-enterprise bash
+```
+
+## Kubernetes
+
+Complete the following steps to connect to the Kubernetes pod hosting Terraform Enterprise:
+
+1. Authenticate to the Kubernetes cluster by executing the relevant command.
+
+
+
+ ```bash
+ $ az aks get-credentials --resource-group --name
+ ```
+
+ ```bash
+ $ aws eks --region update-kubeconfig --name
+ ```
+
+ ```bash
+ $ gcloud container clusters get-credentials --project=
+ ```
+
+
+1. Retrieve the pod name by executing the following command.
+
+ ```bash
+ $ kubectl get pods -n
+ ```
+
+1. Execute the following command to remote into the pod.
+
+ ```bash
+ $ kubectl exec -n -it -- bash
+ ```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/backup-restore.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/backup-restore.mdx
new file mode 100644
index 0000000000..0f1e6f9773
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/backup-restore.mdx
@@ -0,0 +1,180 @@
+---
+page_title: Back up and restore Terraform Enterprise
+description: >-
+ Use Terraform Enterprise's back up and restore APIs for disaster recovery.
+---
+
+# Back up and restore Terraform Enterprise
+
+Terraform Enterprise provides an API to back up and restore all of its application data.
+
+The backup and restore API is separate from the Terraform Enterprise application-level APIs. As such, a separate authorization token is required to use the backup and restore API. See [Authentication](#authentication) below for more details.
+
+Using the backup and restore API is the only supported way to migrate between a deployment with an external Vault and one with the internal Vault service.
+
+> **Note**: We do not recommend using the backup and restore API to maintain periodic Terraform Enterprise application data backups. For best practices, refer to our recommended patterns covering the [backup](/terraform/tutorials/recommended-patterns/pattern-backups) and [restore](/terraform/tutorials/recommended-patterns/pattern-recovery) processes.
+
+## About backups and restores
+
+The backup and restore API backs up all of the data stored in a Terraform Enterprise installation, including both the blob storage and the PostgreSQL database. It does not back up the installation configuration. This backup can then be restored to a new installation of Terraform Enterprise.
+
+Please note the following when using the backup and restore API:
+
+- The version of Terraform Enterprise cannot be changed between a backup and restore. That is, a backup taken from one version of Terraform Enterprise cannot be restored to an installation running a different version of Terraform Enterprise.
+- The version of PostgreSQL being used cannot be changed between a backup and restore. That is, a backup taken from a Terraform Enterprise installation using one version of PostgreSQL cannot be restored to an installation using a different version of PostgreSQL.
+- The Terraform Enterprise installation that will be restored to must be a new, running installation with no existing application data.
+- Once a restore is completed, the Terraform Enterprise application will need to be restarted before it can use the restored data.
+
+See also:
+
+- [Data Security](/terraform/enterprise/deploy/reference/data-security) for details about the contents of Terraform Enterprise's blob storage and PostgreSQL database.
+
+### Authentication
+
+The backup and restore API uses a separate authorization token which can be found within the Terraform Enterprise Docker container.
+
+```shell-session
+$ docker exec -t terraform-enterprise-tfe-1 /bin/bash -c 'cat /var/run/terraform-enterprise/backup-restore/config.hcl | grep backup_token'
+```
+
+-> **Note:** This authorization token is specific to the Terraform Enterprise installation. As a result, the authorization token used to create a backup may be different than the authorization token used to perform a restore. Please ensure you are using the correct authorization token when performing a backup or restore operation.
+
+The backup and restore API is separate from the Terraform Enterprise application-level APIs and cannot be accessed with Terraform Enterprise user, team, or organization API tokens.
+
+To use this authorization token with the backup and restore API, pass the `Authorization: Bearer ` header in your API requests.
+
+~> **Important:** Since this authorization token can access all of the data in a Terraform Enterprise installation, protect it very carefully.
+
+### Security and encryption
+
+Terraform Enterprise uses HashiCorp Vault to encrypt and decrypt its data. The Vault encryption keys that are used to encrypt and decrypt this data are not preserved during a backup or restore. Instead, during a backup, the data is decrypted by Vault and then re-encrypted using a password provided by you, resulting in an encrypted backup blob. During a restore, the same password that you provided during the backup must be used to decrypt the data before it is re-encrypted with the new Terraform Enterprise installation's Vault encryption keys.
+
+The backup and restore API expect this password to be provided as a JSON object with a `password` property within the request payload. The value for the `password` property can be any valid string. Here's what an example JSON object looks like.
+
+```json
+{
+ "password": "befit-brakeman-footstep-unclasp"
+}
+```
+
+~> **Important:** The same password that was provided during backup must be provided during restore. This password can be used to access all of the data that was backed up. Please protect it very carefully.
+
+[200]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
+[201]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
+[202]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/202
+[204]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
+[400]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400
+[401]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
+[403]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+[404]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
+[409]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409
+[412]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412
+[422]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422
+[429]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
+[500]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500
+[504]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504
+
+## Creating a backup
+
+`POST /_backup/api/v1/backup`
+
+To initiate a backup, make a POST request to the backup endpoint on a running Terraform Enterprise installation.
+
+The response to this request will be an encrypted binary blob containing all of your Terraform Enterprise data. When using this endpoint, please:
+
+- Remember to specify an output file for the encrypted backup blob.
+- Be prepared to download and store many gigabytes of data to the filesystem of whichever machine the request is sent from. For best performance and to avoid disconnections, we recommend sending this request from a server colocated with the Terraform Enterprise installation rather than from a workstation.
+- Treat this encrypted backup blob as sensitive data and ensure it is stored securely.
+- Remember the password that was used to encrypt this backup blob.
+
+| Status | Response | Reason |
+| ------- | ------------------ | ----------------------------- |
+| [200][] | Binary backup blob | Successfully created a backup |
+| [400][] | (none) | Invalid request |
+| [500][] | (none) | Internal server error |
+
+~> **Important:** A successful backup **must** return `200`. If `200` is not returned and the call silently closes, the backup blob may be incomplete, resulting in data loss.
+
+### Request body
+
+This POST endpoint requires a JSON object with the following properties as a request payload.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| --------------------- | ------ | ------- | ---------------------------------------------------------- |
+| `password` | string | | The password used to encrypt the backup blob. |
+| `skip_object_storage` | bool | `false` | Whether or not to skip backing up the object storage data. |
+
+### Sample payload
+
+```json
+{
+ "password": "befit-brakeman-footstep-unclasp"
+}
+```
+
+### Sample request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --request POST \
+ --data @payload.json \
+ --output backup.blob \
+ https:///_backup/api/v1/backup
+```
+
+## Restoring a backup
+
+`POST /_backup/api/v1/restore`
+
+Before restoring, you must first create a new Terraform Enterprise installation.
+
+-> **Note:** The authorization token used to restore the backup is specific to the Terraform Enterprise installation. If restoring to a separate Terraform Enterprise installation, the authorization token will be different for the restore than it was for the backup. See [Authentication](#authentication) above for more details.
+
+Once the Terraform Enterprise application is up and running, you can initiate a restore by making a POST request to the restore endpoint.
+
+Be prepared to upload many gigabytes of data from the filesystem of whichever machine the request is sent from. For best performance and to avoid disconnections, we recommend sending this request from a server colocated with the Terraform Enterprise installation rather than from a workstation.
+
+| Status | Response | Reason |
+| ------- | -------- | ------------------------------ |
+| [200][] | (none) | Successfully restored a backup |
+| [400][] | (none) | Invalid request |
+| [500][] | (none) | Internal server error |
+
+### Request body
+
+This POST endpoint requires the following form fields which must be provided as `multipart/form-data`.
+
+| Form field | Description |
+| ---------- | ---------------------------------------------------------------------------------- |
+| `snapshot` | An encrypted backup blob downloaded from the Terraform Enterprise backup endpoint. |
+| `config` | A JSON file containing a JSON object. See the table below. |
+
+The JSON file used in the `config` form field above must contain a JSON object with the following properties.
+
+Properties without a default value are required.
+
+| Key path | Type | Default | Description |
+| ---------- | ------ | ------- | --------------------------------------------- |
+| `password` | string | | The password used to decrypt the backup blob. |
+
+### Sample payload
+
+```json
+{
+ "password": "befit-brakeman-footstep-unclasp"
+}
+```
+
+### Sample request
+
+```shell
+$ curl \
+ --header "Authorization: Bearer $TOKEN" \
+ --request POST \
+ --form config=@payload.json \
+ --form snapshot=@backup.blob \
+ https:///_backup/api/v1/restore
+```
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/failover.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/failover.mdx
new file mode 100644
index 0000000000..176988e5b1
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/failover.mdx
@@ -0,0 +1,85 @@
+---
+page_title: PostgreSQL database failover
+description: Learn how implementing automatic failover for your Terraform Enterprise database and a high-availability (HA) PostgreSQL database cluster improves resilience and reduces data loss in the event of a failure.
+---
+
+# PostgreSQL database failover
+
+This topic provides an overview of the PostgreSQL database failover process and associated concepts to help you understand how failover works in Terraform Enterprise. This information is only relevant when operating Terraform Enterprise in `active-active` or `external` mode and when Terraform Enterprise is connected to an external database cluster. Refer to [Database connection overview](/terraform/enterprise/deploy/configuration/storage/connect-database) for additional information.
+
+## Introduction
+
+Configuring your Terraform Enterprise deployment to connect to a PostgreSQL database replica ensures continuous database availability when Terraform Enterprise is unable to reach the primary database. To enable failover, configure Terraform Enterprise to reconnect when a failover event occurs. Additionally, you must configure your monitoring tool or PostgreSQL software to detect failures that trigger failover operations.
+
+Refer to [Connect to a PostgreSQL cluster](/terraform/enterprise/deploy/configuration/storage/connect-database/postgres-cluster) for instructions.
+
+For additional guidance, refer to the following example scenarios:
+
+- [Connect to a PostgreSQL cluster deployed to Patroni](/terraform/enterprise/deploy/configuration/storage/connect-database/patroni)
+- [Connect to a PostgreSQL cluster deployed to Aurora](/terraform/enterprise/deploy/configuration/storage/connect-database/aurora)
+
+## Failover event stages
+
+The following stages describe the lifecycle of a failover event.
+
+### Failure detection
+
+Continuous health checks monitor the primary database node for signs of failure, such as connectivity issues or system crashes. When a health check fails, the monitoring tool reports that the primary node is unavailable. This involves checking predefined health metrics and thresholds to confirm the node’s failure status.
+
+### Failover operations
+
+You should deploy an external monitoring tool that is able to promote the most up-to-date standby node to the primary node during a failover event. The tool should also enable the node to handle read and write operations.
+
+This step may involve manually updating load balancers or connection strings used by applications. Terraform Enterprise notifies applications and clients connected to the database the change either through automatic reconfiguration or by using tools that support failover transitions.
+
+### Resolution
+
+After addressing the cause of the failure, you can restore the failed primary node and then demote the standby node. Update the primary node with data it was unable to store while it was unavailable and direct it to rejoin the cluster.
+
+
+## Failover metrics
+
+Recovery point objective (RPO) and recovery time objective (RTO) are metrics that define the resilience of your system. These metrics help you understand and plan your disaster recovery and data protection strategies.
+
+### RPO
+
+RPO refers to the maximum acceptable amount of data loss measured in time. It describes how much data you can afford to lose in the event of a failure. For example, an RPO of 10 minutes means that, in the worst case, up to 10 minutes of data could be lost due to a failure.
+
+Achieving a low RPO requires frequent data replication and backups, which ensures that data is consistently synchronized across primary and replica nodes. In PostgreSQL, the [replication method](#replication) and the frequency of backups directly affect the RPO.
+
+The synchronous replication method results in lower RPO because it ensures that the database commits transactions to both the primary and replica nodes simultaneously. But using synchronous replication may impact performance. Asynchronous replication can provide better database performance but result in a higher RPO. Note that RPO is a function of the database configuration and unrelated to Terraform Enterprise performance.
+
+### RTO
+
+RTO refers to the maximum acceptable amount of time to restore normal operations after a failure. It describes how quickly you recover from a failure. An RTO of 15 minutes, for instance, indicates that the system must be fully operational within 15 minutes of a failure.
+
+In a highly-available (HA) PostgreSQL architecture, automated failover processes, efficient database recovery mechanisms, and robust monitoring tools that quickly detect and address issues can help you achieve a low RTO. The complexity of the HA topology, the effectiveness of failover mechanisms, and the speed at which data can be restored all contribute to the RTO.
+
+## High availability
+
+In order to implement a failover strategy, your Terraform Enterprise deployment must connect to a high-availability or highly-available (HA) PostgreSQL cluster. An HA PostgreSQL cluster ensures that the database remains operational and accessible during failures. For technical details, refer to the PostgreSQL [documentation](https://www.postgresql.org/docs/current/high-availability.html) on high-availability
+
+### Architecture of a PostgreSQL cluster
+
+A common HA cluster architecture has the following components:
+
+- **Primary node**: The database server where write operations occur. It handles both read and write requests but focuses primarily on write transactions.
+- **Standby nodes**: These are replicas of the primary node. They receive updates from the primary node and can serve read-only queries to balance the load.
+- **Load balancer**: This component distributes incoming connections across the primary and standby nodes. The load balancer ensures that no single node becomes a bottleneck and to manage failovers seamlessly.
+- **Failover manager**: A system or tool that monitors the health of nodes and orchestrates the failover process if the primary node fails.
+
+### Replication
+Replication refers to copying data from the primary node to standby nodes to ensure data redundancy and availability. Streaming replication refers to when the primary node sends a continuous stream of write-ahead logs (WAL) to standby nodes. The standby nodes then apply these logs to stay synchronized with the primary database. You can specify one of the following replication types in the `synchronous_commit` setting of your PostgreSQL configuration:
+
+- `asynchronous`: PostgreSQL commits transactions on the primary node without waiting for the standby nodes to acknowledge. This offers better performance but increases the risk of data loss.
+- `synchronous`: PostgreSQL does not commit transactions until at least one standby node has acknowledged receipt. This reduces the risk of data loss but can impact write performance due to the added latency.
+
+Replication lag in `asynchronous` mode refers to the delay between when PostgreSQL commits a transaction on the primary node and when the commit is replicated to the standby nodes. This lag can impact data consistency during failover. Minimizing replication lag is crucial for ensuring that standby nodes are as up-to-date as possible with the primary node’s state.
+
+## Next steps
+
+Refer to the following topics for guidance on implementing failover for your Terraform Enterprise deployment:
+
+- [Connect to a PostgreSQL cluster](/terraform/enterprise/deploy/configuration/storage/connect-database/postgres-cluster) for instructions.
+- [Connect to a PostgreSQL cluster deployed to Patroni](/terraform/enterprise/deploy/configuration/storage/connect-database/patroni)
+- [Connect to a PostgreSQL cluster deployed to Aurora](/terraform/enterprise/deploy/configuration/storage/connect-database/aurora)
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/index.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/index.mdx
new file mode 100644
index 0000000000..20abed3f03
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/index.mdx
@@ -0,0 +1,20 @@
+---
+page_title: Manage Terraform Enterprise deployment overview
+description: Learn about Terraform Enterprise deployment management procedures, including monitoring, backing up, and upgrading your Terraform Enterprise installation.
+---
+
+# Manage Terraform Enterprise deployment overview
+
+This topic provides overview information about managing Terraform Enterprise deployed to non-Replicated runtimes. For information about managing Replicated deployments, refer to [Manage Terraform Enterprise on Replicated overview](/terraform/enterprise/deploy/replicated/manage).
+
+## Deployment management tasks
+
+You can perform the following deployment management tasks:
+
+- Connect to the Terraform Enterprise admin CLI. Refer to [Access the Terraform Enterprise command line](/terraform/enterprise/deploy/manage/access-cli) for instructions.
+- Create and restore backups of the data stored by Terraform Enterprise. Refer to [Backup and restore](/terraform/enterprise/deploy/manage/backup-restore) for instructions.
+- Upgrade to a new version of Terraform Enterprise. Refer to [Upgrade Terraform Enterprise](/terraform/enterprise/deploy/manage/upgrade) for instructions.
+- Enable Terraform Enterprise observability features to ensure that your deployment operates as expected. Refer to [Monitor Terraform Enterprise](/terraform/enterprise/deploy/manage/monitor) for instructions.
+- Configure your deployment to automatically send license consumption data to HashiCorp. This streamlines your license reporting processes. Refer to [Enable automated license reports](/terraform/enterprise/deploy/manage/license-report) for instructions.
+- Configure your deployment to automatically send product usage data to HashiCorp. This streamlines your license reporting processes. Refer to [Enable automated product usage reports](/terraform/enterprise/deploy/manage/product-report) for instructions.
+
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/license-report.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/license-report.mdx
new file mode 100644
index 0000000000..af5dc805e3
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/license-report.mdx
@@ -0,0 +1,83 @@
+---
+page_title: Enable automated license utilization reports
+description: >-
+ License utilization reports provide insights about consumption to help you manage your budget. Learn how to enable automated license utilization reports.
+---
+
+# Enable automated license utilization reporting
+
+This topic describes how to enable Terraform Enterprise to automatically report license usage information to HashiCorp. Refer to [Terraform Enterprise license data reference](/terraform/enterprise/deploy/reference/license-data) for information about the license data Terraform Enterprise sends to HashiCorp.
+
+## Introduction
+
+License usage reports provide the following benefits:
+
+- Insight into how much more you can deploy under your current contract.
+- Protection against over-utilization.
+- Predictable consumption for budgeting purposes.
+
+Additionally, you can review license usage with your existing monitoring solutions, such as Splunk and Datadog. Monitoring license consumption enables you to optimize and manage your deployments. Refer to [Monitor Terraform Enterprise](/terraform/enterprise/deploy/manage/monitor) for instructions on how to enable log forwarding for non-Replicated runtimes. Refer to documentation for [enabling log forwarding for Replicated deployments](/terraform/enterprise/deploy/replicated/monitoring/logging) if Terraform is deployed to Replicated.
+
+## Requirements
+
+- Configure your network to allow outbound HTTPS traffic on port `443`.
+- Configure your network to allow HTTPS egress on port `443` from `https://reporting.hashicorp.services` by allow-listing the following IP addresses:
+
+ - `100.20.70.12`
+ - `35.166.5.22`
+ - `23.95.85.111`
+ - `44.215.244.1`
+
+- Configure your network to allow egress to `https://api.replicated.com`
+
+Refer to [Configure network access](/terraform/enterprise/deploy/configuration/network) for additional information.
+
+## Enable license reporting
+
+Terraform is configured to automatically report license usage data by default. When enabled, Terraform sends HashiCorp the minimum data required to validate license usage as defined in our contracts in order to guide you through data insights and improve product value, experience, and quality. Refer to [Opt out of license utilization reporting](#opt-out-of-license-utilization-reporting) for instructions on how to disable automatic reports.
+
+
+## Check logs
+
+Terraform Enterprise automatically begins reporting license utilization data within approximately 24 hours from start up. Refer to [Log location and format](/terraform/enterprise/deploy/manage/monitor#log-location-and-format) to verify that the data sent successfully.
+
+```json
+{
+ "@level": "debug",
+ "@message": "export finished successfully",
+ "@module": "tfe-licensing.licensingexporter",
+ "@timestamp": "2023-05-10T17:48:06.656979Z"
+}
+```
+
+If your installation is air-gapped or your network does not allow the correct egress, logs show the following error:
+
+```json
+{
+ "@level": "error",
+ "@message": "error exporting snapshot",
+ "@module": "tfe-licensing.census",
+ "@timestamp": "2023-05-11T01:50:51.662155Z",
+ "err": "export failed with error POST https://reporting.hashicorp.services giving up after 5 attempt(s): Post \"https://reporting.hashicorp.services\": dial tcp 35.166.5.222:443: i/o timeout"
+}
+```
+
+In this case, reconfigure your network to allow egress and check back in roughly 24 hours.
+
+## Opt out of license utilization reporting
+
+If your installation is air-gapped or you want to manually collect and report on the same license utilization metrics, you can opt-out of automated reporting. Note that you are still required to manually collect and send license utilization metrics to HashiCorp, even when you opt out of sending automated license usage reports.
+
+Before opting out, we strongly recommend reviewing the [license report reference](/terraform/enterprise/deploy/reference/license-data). Report any concerns related to the automatically-reported data to your account manager.
+
+1. Add the following environment variable to your deployment configuration `TFE_LICENSE_REPORTING_OPT_OUT=TRUE`.
+1. Restart the application.
+1. Check your product logs after approximately 24 hours to verify that the system is no longer attempting to send reports.
+
+### Check logs
+
+Automatic license utilization reporting will start sending data within roughly 24 hours. [Check the product logs](/terraform/enterprise/deploy/manage/monitor#enable-log-forwarding) for records that the data sent successfully.
+
+Terraform Enterprise logs report an error when your installation is air-gapped or when your network does not allow the correct egress.
+
+
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/monitor.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/monitor.mdx
new file mode 100644
index 0000000000..9507309a6e
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/monitor.mdx
@@ -0,0 +1,157 @@
+---
+page_title: Monitor Terraform Enterprise deployments
+description: Learn how to enable logs and metrics to monitor your Terraform Enterprise installation's performance.
+---
+
+# Monitor Terraform Enterprise
+
+This topic describes how to enable logs and metrics in Terraform Enterprise so that you can monitor your non-Replicated deployment. For information about monitoring Replicated deployments, refer to [Terraform Enterprise Log Forwarding](/terraform/enterprise/deploy/replicated/monitoring/logging) and [Monitoring a Terraform Enterprise Instance](/terraform/enterprise/deploy/replicated/monitoring/monitoring) in the Replicated administration section.
+
+## Overview
+
+Complete the following steps to monitor your Terraform Enterprise deployment:
+
+1. Enable log forwarding. Terraform Enterprise writes logs directly to standard output and standard error, which allows you to forward logs using native tooling for your deployment platform.
+1. Enable metrics collection. Metrics collection is disabled by default. Update your deployment configuration file to enable metrics collection
+
+## Enable log forwarding
+
+Terraform Enterprise writes logs directly to standard output and standard error. This allows you to forward logs using native tooling for your deployment platform.
+Terraform Enterprise logs directly to standard output and standard error. This
+allows you to forward logs using native tooling for your deployment platform.
+
+### Log location and format
+
+The individual service logs are located within the
+`/var/log/terraform-enterprise` directory inside the container.
+
+```sh
+/var/log/terraform-enterprise
+├── atlas.log
+├── nginx.log
+├── sidekiq.log
+└── vault.log
+```
+
+Each service log is a plain text file containing the logs for that service. Logs
+are collated and logged to the container's standard output in JSON format. Each
+log entry contains two fields:
+
+* `component`: The name of the individual service that emitted the log entry.
+* `log`: The contents of the log message.
+
+An example set of log entries emitted by a Terraform Enterprise container would appear as follows:
+
+```sh
+{"log":"2023-09-18 02:39:05 [INFO] msg=Worker start worker=AuthenticationTokenDeletionWorker","component":"sidekiq"}
+{"log":"2023-09-18T02:39:05.098Z pid=156 tid=2pos class=FailedJobWorker jid=1010d28ac591979d9decb61f INFO: start","component":"sidekiq"}
+{"log":"2023-09-18 02:39:05 [INFO] msg=Worker start worker=FailedJobWorker","component":"sidekiq"}
+{"log":"2023-09-18 02:39:05 [INFO] msg=Worker finish worker=AuthenticationTokenDeletionWorker","component":"sidekiq"}
+{"log":"2023-09-18T02:39:05.114Z pid=156 tid=2pyc class=AuthenticationTokenDeletionWorker jid=515e8a727a3e4948e9dbb04a elapsed=0.034 INFO: done","component":"sidekiq"}
+{"log":"2023-09-18 02:39:05 [INFO] agent_jobs_processed=[] agent_jobs_errored=[] msg=Worker finish worker=FailedJobWorker","component":"sidekiq"}
+{"log":"2023-09-18T02:39:05.118Z pid=156 tid=2pos class=FailedJobWorker jid=1010d28ac591979d9decb61f queue=default elapsed=0.02 INFO: done","component":"sidekiq"}
+{"log":"2023-09-18 02:39:13 [INFO] [3efaaec9-48d4-4517-9fde-127f80faacb4] [dd.service=atlas dd.trace_id=1904097642804464614 dd.span_id=0 ddsource=ruby] {\"method\":\"GET\",\"path\":\"/\",\"format\":\"html\",\"status\":301,\"allocations\":493,\"duration\":0.72,\"view\":0.0,\"db\":0.0,\"location\":\"https://tfe.example.com/session\",\"dd\":{\"trace_id\":\"1904097642804464614\",\"span_id\":\"0\",\"env\":\"\",\"service\":\"atlas\",\"version\":\"\"},\"ddsource\":[\"ruby\"],\"uuid\":\"3efaaec9-48d4-4517-9fde-127f80faacb4\",\"remote_ip\":\"1.2.3.4\",\"request_id\":\"3efaaec9-48d4-4517-9fde-127f80faacb4\",\"user_agent\":\"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36\",\"user\":null,\"auth_source\":null}","component":"atlas"}
+{"log":"2023-09-18 02:39:13 [INFO] [3cb89cfa-7d7f-4aeb-9e60-2256b016a839] [dd.service=atlas dd.trace_id=4370203755142829190 dd.span_id=0 ddsource=ruby] {\"method\":\"GET\",\"path\":\"/session\",\"format\":\"html\",\"status\":200,\"allocations\":3895,\"duration\":7.3,\"view\":5.77,\"db\":0.59,\"dd\":{\"trace_id\":\"4370203755142829190\",\"span_id\":\"0\",\"env\":\"\",\"service\":\"atlas\",\"version\":\"\"},\"ddsource\":[\"ruby\"],\"uuid\":\"3cb89cfa-7d7f-4aeb-9e60-2256b016a839\",\"remote_ip\":\"1.2.3.4\",\"request_id\":\"3cb89cfa-7d7f-4aeb-9e60-2256b016a839\",\"user_agent\":\"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36\",\"user\":null,\"auth_source\":null}","component":"atlas"}
+{"log":"1.2.3.4 - - [18/Sep/2023:02:39:13 +0000] \"GET / HTTP/1.1\" 301 117 \"-\" \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36\"","component":"nginx"}
+{"log":"1.2.3.4 - - [18/Sep/2023:02:39:13 +0000] \"GET /session HTTP/1.1\" 200 1735 \"-\" \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36\"","component":"nginx"}
+{"log":"Storing the encrypted Vault token in Redis","component":"vault"}
+```
+
+Note that the format of individual service logs is considered an internal implementation
+detail and is subject to change at any release.
+
+### External log forwarding
+
+We strongly recommend using an external log forwarding solution that aligns with
+your existing observability solutions. Depending on the deployment platform,
+native or third-party solutions (e.g., host-level monitoring agents) may be an
+appropriate solution for log aggregation and forwarding. Hashicorp does not provide
+support for third-party log forwarding solutions.
+
+#### Docker
+
+Docker supports a multitude of logging drivers. See the [Docker logging
+driver](https://docs.docker.com/config/containers/logging/configure/) list for what
+options are available.
+
+#### Kubernetes
+
+Kubernetes supports several architectures for log-forwarding. See the
+[Kubernetes logging architectures documentation](https://kubernetes.io/docs/concepts/cluster-administration/logging/#cluster-level-logging-architectures)
+for what options are available.
+
+### Native log forwarding
+
+As a convenience to aid in migrating from legacy Replicated environments
+to Flexible Deployments, Terraform Enterprise provides a mechanism to inject
+FluentBit `[OUTPUT]` configuration directives. This allows Terraform Enterprise
+to use FluentBit plugins to forward log data directly to a number of external
+destinations.
+
+FluentBit configuration must be provided the Terraform Enterprise container in
+a file mounted to the container. That is, the configuration value must point to
+a _filesystem path_ on the Docker container where the FluentBit configuration is
+located; the configuration must _not_ contain the actual configuration itself.
+This means it is the responsibility of the Terraform Enterprise operator to mount the config
+snippet to the Docker container.
+
+| **Key** | **Description** | **Specific Format Required** |
+| ------------------------------ | --------------------------------------------------------------------------------------------------- | ---------------------------- |
+| TFE_LOG_FORWARDING_CONFIG_PATH | Filesystem path on the Terraform Enterprise container containing FluentBit `[OUTPUT]` configuration | **Yes**, string. |
+
+
+Exposing FluentBit configuration to Terraform Enterprise operators is provided as a convenience to
+facilitate migration Terraform Enterprise installations. Customers are encouraged
+to migrate away from relying on injected FluentBit configuration, and provide their
+own log forwarding and aggregation solution in their infrastructure.
+
+
+#### Limitations
+
+The FluentBit solution provided in [legacy Replicated Terraform Enterprise deployments](/terraform/enterprise/deploy/replicated/monitoring/logging)
+emitted log entries that contained additional metadata keys, such as hostname and
+IP address. This allowed for additional observability value from log entries, as
+operators could identify the source of log entries. Unlike Replicated deployments,
+logs emitted by the FluentBit plugins made available in Terraform Enterprise
+Flexible Deployments do not contain additional metadata attached to each log entry.
+This is due to the isolated nature of the FluentBit process within the Terraform
+Enterprise Docker container; by definition, processes within the Docker container
+are not exposed to host-level details.
+
+Because of this, we strongly recommend using an external log forwarding solution
+that aligns with your existing observability solutions. See [external log forwarding](#external-log-forwarding)
+for further discussion.
+
+Additionally, note that built-in log forwarding is only available for Docker-deployed
+Terraform Enterprise installations. Terraform Enterprise deployed on Kubernetes
+does not support leveraging the built-in FluentBit.
+
+#### Supported external destinations
+
+You can only forward logs to one of the supported external destinations below.
+Each supported external destination contains example configuration for convenience.
+
+@include "replicated-and-fdo/monitoring/logging/supported-destinations-partial.mdx"
+
+## Enable metrics collection
+
+Metrics collection is disabled by default. Set the `TFE_METRICS_ENABLE` variable to `true` in your runtime configuration. The metrics service is not supported in Kubernetes installations. Refer to the [configuration reference](/terraform/enterprise/deploy/reference/configuration) for additional details.
+
+### Access metrics
+
+Terraform Enterprise exposes metrics on a port separate from the application. This allows operators to use network access controls to restrict access to metrics data to authorized consumers, such as a Prometheus server.
+
+By default, metrics are exposed on the following ports:
+
+- `9090` for HTTP.
+- `9091` for HTTPS.
+
+You can configure the ports by setting the `TFE_METRICS_HTTP_PORT` and `TFE_METRICS_HTTPS_PORT` environment variables. Refer to the [configuration reference](/terraform/enterprise/deploy/reference/configuration) for additional details.
+
+The HTTP and HTTPS ports serve metrics on the path `/metrics`.
+
+By default, requests to the /metrics endpoint will emit metrics in JSON format. Use the query parameter `?format=prometheus` to emit metrics in Prometheus format.
+
+When using Prometheus, we recommend using a scrape interval shorter than the expiration time of 15 seconds to ensure that Terraform Enterprise reports data points from short-lived processes.
+
+Refer to the [metrics reference](/terraform/enterprise/deploy/reference/metrics) for details about the metrics Terraform Enterprise emits.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/product-report.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/product-report.mdx
new file mode 100644
index 0000000000..9a2ad3ad64
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/product-report.mdx
@@ -0,0 +1,88 @@
+---
+page_title: Enable automated product usage reports
+description: >-
+ Learn how to enable automated license utilization reports.
+---
+
+# Enable automated product usage reports
+
+This topic describes how to enable Terraform Enterprise to automatically report product usage information to HashiCorp. Refer to [Terraform Enterprise product data reference](/terraform/enterprise/deploy/reference/product-data) for information about the product usage data Terraform Enterprise sends to HashiCorp.
+
+## Introduction
+
+Product usage reports provide the following benefits:
+
+- Insight into how much more you can deploy under your current contract.
+- Protection against over-utilization.
+- Predictable consumption for budgeting purposes.
+
+Additionally, you can review usage with your existing monitoring solutions, such as Splunk and Datadog. Monitoring product usage enables you to optimize and manage your deployments. Refer to [Monitor Terraform Enterprise](/terraform/enterprise/deploy/manage/monitor) for instructions on how to enable log forwarding for non-Replicated runtimes. Refer to documentation for [enabling log forwarding for Replicated deployments](/terraform/enterprise/deploy/replicated/monitoring/logging) if Terraform is deployed to Replicated.
+
+## Requirements
+
+- Configure your network to allow outbound HTTPS traffic on port `443`.
+- Configure your network to allow HTTPS egress on port `443` from `https://reporting.hashicorp.services` by allow-listing the following IP addresses:
+
+ - `100.20.70.12`
+ - `35.166.5.22`
+ - `23.95.85.111`
+ - `44.215.244.1`
+
+- Configure your network to allow egress to `https://api.replicated.com`
+
+Refer to [Configure network access](/terraform/enterprise/deploy/configuration/network) for additional information.
+
+## Enable product usage reporting
+
+Terraform is configured to automatically report product usage data by default. Refer to [Opt out of product usage reporting](#opt-out-of-product-usage-reporting) for instructions on how to disable automatic reports.
+
+## Check logs
+
+Terraform Enterprise automatically begins reporting data within approximately 24 hours from start up. Refer to [Log location and format](/terraform/enterprise/deploy/manage/monitor#log-location-and-format) to verify that the data sent successfully.
+
+```json
+{
+ "@level": "debug",
+ "@message": "export finished successfully",
+ "@module": "tfe-licensing.licensingexporter",
+ "@timestamp": "2023-05-10T17:48:06.656979Z"
+}
+```
+
+Terraform Enterprise logs report an error when your installation is air-gapped or when your network does not allow the correct egress:
+
+```json
+{
+ "@level": "error",
+ "@message": "error exporting snapshot",
+ "@module": "tfe-licensing.census",
+ "@timestamp": "2023-05-11T01:50:51.662155Z",
+ "err": "export failed with error POST https://reporting.hashicorp.services giving up after 5 attempt(s): Post \"https://reporting.hashicorp.services\": dial tcp 35.166.5.222:443: i/o timeout"
+}
+```
+
+In this case, reconfigure your network to allow egress and check back in roughly 24 hours.
+
+## Opt out of product usage reporting
+
+If your installation is air-gapped or you do not want to report product utilization data to HashiCorp, you can opt out of reporting.
+
+1. Add the following environment variable to your deployment configuration `TFE_USAGE_REPORTING_OPT_OUT=TRUE`.
+1. Restart your system.
+1. Check your product logs roughly 24 hours after opting out to make sure that the system does not send reports.
+
+When opting out in an internet-connected environment, the report contains fields in the JSON output set to `0`.
+
+### Manually reporting product usage in air-gapped environments
+To report product usage in air-gapped environments, you can leverage the following CLI command:
+
+```
+tfectl admin usage-report
+```
+
+When in `disk` operating mode, Terraform Enterprise generates the product usage report in the `/run/terraform-enterprise/usage-report` directory.
+
+When in `external` and `active-active` mode and on Kubernetes, Terraform Enterprise uploads the product usage report to the same object store bucket where Terraform state files are stored.
+Each specific run of the admin `usage-report` command generates the product usage report in a new JSON file.
+
+To send product usage reports to HashiCorp, visit the [**Licensing utilization reporting** page](https://portal.cloud.hashicorp.com/license-utilization/reports/create) and use the upload form.
\ No newline at end of file
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/upgrade.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/upgrade.mdx
new file mode 100644
index 0000000000..d7679d18ef
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/manage/upgrade.mdx
@@ -0,0 +1,100 @@
+---
+page_title: Upgrade Terraform Enterprise
+description: Learn how to upgrade Terraform Enterprise using Docker Compose and Helm to run new versions on Nomad, Kubernetes, OpenShift, Podman, or Docker.
+---
+
+# Upgrade Terraform Enterprise
+
+This topic describes how to upgrade Terraform Enterprise installations on non-Replicated runtimes. For information about upgrading Replicated deployments, refer to [Upgrade Terraform Enterprise on Replicated](/terraform/enterprise/deploy/replicated/administration/infrastructure/upgrades).
+
+## Introduction
+
+We recommend upgrading in a non-production environment first before upgrading the production instance of Terraform Enterprise.
+
+## Upgrade
+
+Complete the following steps to upgrade Terraform Enterprise:
+
+1. Back up your Terraform Enterprise data. Refer to [Backup and restore](/terraform/enterprise/deploy/manage/backup-restore) for instructions.
+
+1. Use the Terraform Enterprise CLI to stop any existing Terraform runs and prevent Terraform Enterprise from starting new operations. Refer to [Gracefully stop work on a node](/terraform/enterprise/deploy/reference/cli#gracefully-stop-work-on-a-node) for instructions.
+
+1. If your deployment is configured to run multiple `terraform-enterprise` nodes, scale down to a single node. You can run multiple nodes when Terraform Enterprise is in `active-active` mode. Refer to [Configure the operational mode](/terraform/enterprise/deploy/configuration/storage/configure-mode) for additional information.
+
+1. Stop the Terraform Enterprise application.
+
+
+
+
+ For installs that use Docker Compose, use the following command:
+
+ ```shell-session
+ $ docker compose down
+ ```
+
+
+
+
+ For installs that use Helm charts, update the `values.yaml` file's `replicaCount`:
+
+ ```yaml
+ replicaCount: 0
+ ```
+
+
+
+
+1. Pull the new Terraform Enterprise image for a specific [release](/terraform/enterprise/releases): `images.releases.hashicorp.com/hashicorp/terraform-enterprise:vYYYYMM-#`.
+
+
+
+
+ For installs that use Docker Compose, update the `compose.yaml` with the appropriate image tag:
+
+ ```yaml
+ name: terraform-enterprise
+ services:
+ tfe:
+ image: images.releases.hashicorp.com/hashicorp/terraform-enterprise:
+ ```
+
+
+
+
+ For installs that use Helm charts, update the `values.yaml` with the appropriate image tag and `replicaCount`:
+
+ ```yaml
+ replicaCount: 1
+ image:
+ repository: images.releases.hashicorp.com
+ name: hashicorp/terraform-enterprise
+ tag:
+ ```
+
+
+
+
+1. Start the Terraform Enterprise application with the new image.
+
+
+
+
+ For installs that use Docker Compose, use the following command:
+
+ ```shell-session
+ $ docker compose up --detach
+ ```
+
+
+
+
+ For installs that use Helm charts, upgrade the helm release with the new values:
+
+ ```shell-session
+ $ helm -n upgrade --values= terraform-enterprise hashicorp/terraform-enterprise
+ ```
+
+
+
+
+1. Repeat the process for the production instance of Terraform Enterprise.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/nomad.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/nomad.mdx
new file mode 100644
index 0000000000..80154c88a9
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/nomad.mdx
@@ -0,0 +1,606 @@
+---
+page_title: Deploy Terraform Enterprise to HashiCorp Nomad
+description: >-
+ Learn how to install Terraform Enterprise on Nomad.
+---
+
+# Deploy Terraform Enterprise to HashiCorp Nomad
+
+This topic describes how to deploy Terraform Enterprise to a HashiCorp Nomad cluster.
+
+Complete the following steps to deploy Terraform Enterprise to Nomad-orchestrated containers:
+
+1. Complete the prerequisites.
+1. Parameterize the Terraform Enterprise license, host, and TLS encryption settings by adding Nomad variables to your job specifications. This enable you to use the same job specification with different configurations. Refer to [Job Specification](/nomad/docs/job-specification) in the Nomad documentation for additional information.
+1. Add Terraform Enterprise environment variables to your Nomad job specification to configure Terraform behavior. Refer to the [Terraform Enterprise configuration reference](/terraform/enterprise/deploy/configuration) for additional information.
+1. Create a Nomad job specification for operating the Terraform Enterprise agent. Refer to [Custom Worker Image](/terraform/enterprise/deploy/custom-image) for additional information about the Terraform Enterprise agent.
+1. Run the Nomad command for pulling the Terraform Enterprise image and installing the binary.
+
+## Prerequisites
+
+You can deploy Terraform Enterprise on Nomad version v1.5.0 and newer.
+
+Complete the following prerequisites before installing Terraform Enterprise on [Nomad](/nomad).
+
+Refer to the [Nomad clusters on the cloud tutorial](/nomad/tutorials/cluster-setup/cluster-setup-overview) for instructions on how to setup a Nomad cluster.
+
+### Nomad requirements
+
+You must provide the following Nomad items.
+
+Please make sure you have the following environment variables set before running Nomad commands from CLI:
+
+```bash
+export NOMAD_ADDR=http://:4646
+export NOMAD_TOKEN=
+export NOMAD_CLIENT_CERT=
+export NOMAD_CLIENT_KEY=
+export NOMAD_CA_CERT=
+```
+
+You can read more about the Nomad environment variables [here](/nomad/docs/commands).
+
+### Prepare the host environment
+
+Provide a DNS hostname for Terraform Enterprise and the associated TLS certificate. Additionally, you must configure your network so that your host can receive and send traffic. Refer to [Prepare the host environment](/terraform/enterprise/deploy/prepare-host) for details about preparing the host environment.
+
+### Deploy external storage systems
+
+Deploy the database and other storage devices so that Terraform can connect to them when the application starts. Refer to [Data storage settings overview](/terraform/enterprise/deploy/storage) for additional information.
+
+Terraform Enterprise requires the following external services to be present and accessible from the Nomad cluster:
+
+1. A PostgreSQL database. Refer to [PostgreSQL Requirements for Terraform Enterprise](/terraform/enterprise/flexible-deployments/install/requirements/data-storage/postgres-requirements) for additional information.
+1. An S3-compatible storage service, such as AWS S3, Azure Cloud Storage, and Google Cloud Storage. Refer to [External Services Mode](/terraform/enterprise/flexible-deployments/install/requirements/data-storage/operational-mode-requirements#external-services-mode) for additional information.
+1. Redis version 6 or 7. Redis Cluster is not supported.
+
+### Create the deployment configuration
+
+Create a custom YAML configuration file, for example `/tmp/overrides.yaml`, to override the default values in the Terraform Enterprise Helm chart. The file contains settings for the operational mode, license, TLS certificates, and network configuration. Add any additional configurations necessary for your environment. Refer to [Configuration file overview](/terraform/enterprise/deploy/reference/configuration) for additional information.
+
+### Create an ACL policy
+
+Create a token that grants access to the namespace where the Terraform Enterprise agents will run. The Terraform Enterprise job must present the token to the Terraform Enterprise agent so that it can run the agent job that performs Terraform operations. Refer to the [Nomad ACL system fundamentals](https://developer.hashicorp.com/nomad/tutorials/access-control/access-control) tutorial for instructions on how to create ACL policies linked to tokens.
+
+Create a policy file named `terraform-enterprise-policy.hcl` with the following content, and apply it to the `terraform-enterprise` namespace so that Terraform Enterprise has permission to run and manage agent jobs.
+
+```hcl
+namespace "tfe-agents" {
+ capabilities = [
+ "submit-job",
+ "dispatch-job",
+ "list-jobs",
+ "read-job",
+ "read-logs"
+ ]
+}
+```
+
+The following example applies the `terraform-enterprise-policy` policy to the `tfe-job-task` task within the `tfe-job-group` of the `tfe-job` job.
+
+ ```shell-session
+ $ nomad acl policy apply \
+ -namespace terraform-enterprise -job tfe-job \
+ -group tfe-job-group -task tfe-job-task \
+ terraform-enterprise-policy ./terraform-enterprise-policy.hcl
+ ```
+Refer to the [Nomad documentation](/nomad/docs/commands/acl/policy/apply) for additional information about applying ACL policies.
+
+### Enable a workload identity
+
+Enable a workload identity on the Nomad cluster so that Nomad can inject the Nomad ACL token. The workload identity passes the token using the `NOMAD_TOKEN` environment variable. Refer to [Workload Identity](/nomad/docs/concepts/workload-identity) for additional information.
+
+Terraform Enterprise does not use workload identities on Nomad v1.4 and older. Instead, you must pass the `NOMAD_TOKEN` directly in the Terraform Enterprise job specification. Refer to [Configure Terraform Enterprise Nomad job specification](/terraform/enterprise/deploy/nomad#configure-terraform-enterprise-nomad-job-specification) for additional information.
+
+### Create namespaces
+
+Create at least two separate Nomad namespaces to provide better isolation, security, and control over Nomad workloads. One namespace is for the Terraform Enterprise job and the second is for the Terraform Enterprise agent job. Refer to the [Namespaces tutorial](/nomad/tutorials/manage-clusters/namespaces) in the Nomad documentation for instructions on how to create a namespace.
+
+## Parameterize Terraform Enterprise settings
+
+Add the following variables to your Terraform Enterprise Nomad job:
+
+- `tfe_license`: Specifies the Terraform Enterprise license key.
+- `tfe_hostname`: Specifies the hostname of the Terraform Enterprise instance.
+- `tfe_tls_cert_file`: Specifies the base64 encoded TLS certificate file.
+- `tfe_tls_key_file`: Specifies the base64 encoded TLS key file.
+- `tfe_tls_ca_bundle_file`: Specifies the base64 encoded TLS CA bundle file.
+
+Create file `var.hcl` and add the following variables:
+
+```hcl
+ path = "nomad/jobs/tfe-job/tfe-group/tfe-task"
+ namespace = "terraform-enterprise"
+
+ items {
+ # The field should contain the base64 encoded value of the cert. Mappped to the TFE_TLS_CERT_FILE environment variable.
+ tfe_tls_cert_file = ""
+
+ # The field should contain the base64 encoded value of the bundle. Mapped to the TFE_TLS_CA_BUNDLE_FILE environment variable.
+ tfe_tls_ca_bundle_file = ""
+
+ # The field should contain the base64 encoded value of the key. Mappped to the TFE_TLS_KEY_FILE environment variable.
+ tfe_tls_key_file = ""
+
+ # A valid TFE license. Mapped to the TFE_LICENSE environment variable.
+ tfe_license = ""
+
+ # The hostname of the TFE instance. Mapped to the TFE_HOSTNAME environment variable.
+ tfe_hostname = ""
+ }
+ ```
+
+`path` variable specifies the path where the Nomad variables will be stored.
+Update the `path` variable if default value of `job_name` is overridden in the `var.hcl` file.
+
+Apply the Nomad variables to the job specification by running the following command:
+ ```bash
+ $ nomad var put @var.hcl
+ ```
+
+Refer to [Nomad Variables](/nomad/docs/concepts/variables) in the Nomad documentation for additional information.
+
+Refer to the [example Nomad job specification](#nomad-job-specification) for additional guidance.
+
+## Configure Terraform Enterprise Nomad job specification
+
+This job is responsible for running the Terraform Enterprise image on Nomad.
+
+Refer to the [example Nomad job specification for TFE](/terraform/enterprise/flexible-deployments/install/nomad/install#nomad-job-specification-for-tfe) for a template that you can copy and modify.
+
+Pass the variables that you defined in the [Parameterize Terraform Enterprise settings](#parameterize-terraform-enterprise-settings) section. Refer to [Assigning Values to job Variables](/nomad/docs/job-specification/hcl2/variables#assigning-values-to-job-variables) in the Nomad documentation for instructions. The following variables are required:
+
+- `tfe_image_username`
+- `tfe_image_password`
+
+The following variables are optional:
+
+- `tfe_image`
+- `namespace`
+
+Terraform Enterprise does not use workload identities on Nomad v1.4 and older. If you are deploying to Nomad v1.4.x or older, complete the following steps:
+
+1. Manually create an ACL token. Refer to [Command: `acl token create`](/nomad/docs/commands/acl/token/create) in the Nomad documentation for instructions.
+1. Remove the `identity` stanza.
+1. Pass the ACL token to the Terraform Enterprise job. Export the token to the `NOMAD_TOKEN` environment variable and add it to the `env` stanza.
+
+Refer to the [example Nomad job specification](#nomad-job-specification) for a template that you can copy and modify. Run the `nomad job run` command and specify job configuration to submit the changes. Refer to [Command: job run](/nomad/docs/commands/job/run) in the Nomad documentation for additional information about the command.
+
+## Configure a Nomad batch job to run the Terraform Enterprise agent
+
+Terraform Enterprise creates ephemeral agent jobs to execute Terraform runs when operating in Remote execution mode. A run is an invocation of the `terraform plan` or `terraform apply` command. To enable this behavior, create a Nomad batch job specification that defines how Terraform Enterprise agents run on Nomad.
+
+You can use the [example Nomad batch job specification for TFE agent](/terraform/enterprise/flexible-deployments/install/nomad/install#nomad-batch-job-specification) as a template to copy and change. After registering the batch job in Nomad, manual execution of batch jobs is not required. When Terraform executes a plan or apply, it automatically dispatches the jobs as Nomad batch jobs and completes the run.
+
+Refer to [Batch Job](/nomad/docs/job-specification/job#batch-job) in the Nomad documentation for more information.
+
+## Run the Nomad jobs
+
+### 1. Deploy Terraform Enterprise Instance
+
+Run the `nomad job run` command to pull the Terraform Enterprise image and install the application. Pass the Terraform Enterprise job specification as the command argument. You must also provide the credentials for the registry to download the image:
+
+```shell-session
+$ nomad job run \
+ -var="tfe_image_username=$TFE_REGISTRY_USERNAME" \
+ -var="tfe_image_password=$TFE_REGISTRY_PASSWORD" \
+
+```
+
+### 2. Register Terraform Agent Job
+Run the `nomad job run` command and pass the Terraform agent job specification to register the batch job in Nomad:
+
+```shell-session
+$ nomad job run
+```
+
+Alternatively, you can pull and install the Terraform Enterprise image using the Terraform Enterprise On Nomad Pack tool. Refer to the [`terraform-enterprise-fdo-nomad-pack` repository](https://github.com/hashicorp/nomad-pack-community-registry/tree/main/packs/tfe_fdo_nomad) on GitHub for instructions.
+
+## Post installation tasks
+
+Complete the following tasks after starting Terraform Enterprise.
+
+### Review startup checks
+
+When you start Terraform Enterprise, several startup checks also run to prevent errors related to invalid configurations or certificates, as well as other issues that could prevent the application from running successfully or safely. Refer to the [startup checks reference](/terraform/enterprise/deploy/reference/startup-checks) for additional information.
+
+### Create initial admin user
+
+[Provision your first administrative user](/terraform/enterprise/deploy/initial-admin-user) and start using Terraform Enterprise.
+
+## Deploy a load balancer to the Nomad Cluster (Optional)
+
+You can deploy a load balancer to the Nomad cluster so that you can manage external traffic loads. Refer to the [load balancer tutorial](/nomad/tutorials/load-balancing) in the Nomad documentation for instructions.
+Refer to the [example NGINX configuration](/terraform/enterprise/flexible-deployments/install/nomad/install#nomad-nginx-job-for-load-balancing) for additional guidance.
+
+## Examples
+
+You can copy the following examples and modify the values to match your deployment.
+
+### Nomad job specification
+
+The following example configuration defines a Terraform Enterprise job specification. You can copy the example and modify the values to match your deployment.
+This example uses minimal configuration options. Refer to [Configuration Reference](/terraform/enterprise/flexible-deployments/install/configuration)
+for a list of all the configuration options.
+
+```hcl
+variable "tfe_image" {
+ description = "The TFE image to use"
+ type = string
+ default = "images.releases.hashicorp.com/hashicorp/terraform-enterprise:v202408-1"
+}
+
+variable "tfe_image_username" {
+ description = "Username for the registry to download TFE image"
+ type = string
+}
+
+variable "tfe_image_password" {
+ description = "Password for the registry to download TFE image"
+ type = string
+}
+
+variable "namespace" {
+ description = "The Nomad namespace to run the job"
+ type = string
+ default = ""
+}
+
+job "tfe-job" {
+ datacenters = ["dc1"]
+ namespace = var.namespace
+ type = "service"
+
+ group "tfe-group" {
+ count = 1
+
+ restart {
+ attempts = 3
+ delay = "60s"
+ interval = "10m"
+ mode = "fail"
+ }
+
+ update {
+ max_parallel = 1
+ min_healthy_time = "30s"
+ healthy_deadline = "15m"
+ progress_deadline = "20m"
+ health_check = "checks"
+ }
+
+ network {
+ port "tfe" {
+ # static port is not required if load balancer is used.
+ static = 443
+ to = 8443
+ }
+ port "tfehttp" {
+ # static port is not required if load balancer is used.
+ static = 80
+ to = 8080
+ }
+ port "vault" {
+ to = 8201
+ }
+ }
+
+ service {
+ name = "tfe-svc"
+ port = "tfe"
+ provider = "nomad"
+ check {
+ name = "tfe_probe"
+ type = "http"
+ protocol = "https"
+ port = "tfe"
+ path = "/_health_check"
+ interval = "5s"
+ timeout = "2s"
+ method = "GET"
+ }
+ }
+
+ task "tfe-task" {
+ driver = "docker"
+
+ identity {
+ # Expose Workload Identity in NOMAD_TOKEN env var
+ env = true
+ }
+
+ template {
+ data = < | docker login --username terraform images.releases.hashicorp.com --password-stdin
+ ```
+
+1. Pull the Terraform Enterprise image from the registry.
+
+ ```shell-session
+ $ docker pull images.releases.hashicorp.com/hashicorp/terraform-enterprise:
+ ```
+
+1. Create a new project.
+
+ ```shell-session
+ $ oc new-project
+ ```
+
+1. Create an image pull secret in `` to fetch the `terraform-enterprise` container from the ``. This URL can be `images.releases.hashicorp.com`, or your internal container registry. If you are using `images.releases.hashicorp.com`, use `terraform` as the `` parameter in the following command with `--docker-password=$(cat /path/to/terraform.hclic)`
+
+ ```shell-session
+ $ oc create secret docker-registry terraform-enterprise --docker-server= --docker-username= --docker-password= -n
+ ```
+
+1. Add the Hashicorp Helm registry:
+
+ ```shell-session
+ $ helm repo add hashicorp https://helm.releases.hashicorp.com
+ ```
+
+1. Render the `terraform-enterprise` chart with your custom [values file](https://helm.sh/docs/chart_template_guide/values_files/) ``, for example `tmp/overrides.yaml`.
+
+ ```shell-session
+ $ helm template terraform-enterprise hashicorp/terraform-enterprise –n --values
+ ```
+
+1. Install `terraform-enterprise`, this step can take several minutes.
+
+ ```shell-session
+ $ helm install terraform-enterprise hashicorp/terraform-enterprise –n --values
+ ```
+
+1. Inspect `terraform-enterprise` pods to verify their successful start.
+
+ ```shell-session
+ $ oc get pods -n
+ ```
+
+ If Terraform Enterprise pods fail to start, refer to [Kubernetes Troubleshooting](/terraform/enterprise/deploy/troubleshoot#kubernetes).
+
+1. By default, Terraform Enterprise installs a load balancer service. Retrieve the external IP address of this service.
+
+ ```shell-session
+ $ oc get services -n
+ ```
+
+1. Set up a DNS record that points to your external IP address to enable routing to your ``. A DNS address is required to communicate with Terraform Enterprise, and it is managed outside of OpenShift and the Terraform Enterprise helm chart or application.
+
+1. Validate the readiness of the Terraform Enterprise application by querying the health check endpoint.
+
+ ```shell-session
+ $ curl https://tfe.test.hashicorp.com/_health_check
+ ```
+
+## Post installation tasks
+
+Complete the following tasks after the initial installation.
+
+### Review startup checks
+
+When you start Terraform Enterprise, several startup checks also run to prevent errors related to invalid configurations or certificates, as well as other issues that could prevent the application from running successfully or safely. Refer to the [startup checks reference](/terraform/enterprise/deploy/reference/startup-checks) for additional information.
+
+### Configuring a route
+
+When you deploy Terraform Enterprise to OpenShift, the Helm chart does not create an [OpenShift route](https://docs.openshift.com/container-platform/latest/networking/routes/route-configuration.html) by default.
+
+Provisioning a route creates a public-facing URL at which users can access the Terraform Enterprise UI and API.
+
+```shell-session
+$ oc expose svc/terraform-enterprise --hostname terraform-enterprise.apps. --name terraform-enterprise -n
+```
+-> **Note:** Use the options on the `oc expose` command to tailor the route to the needs of your environment.
+
+The newly created route can then be retrieved from the cluster:
+
+```shell-session
+$ oc get routes
+NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
+terraform-enterprise terraform-enterprise.apps. terraform-enterprise https-port reencrypt/Redirect None
+```
+
+### Create the initial admin user
+
+[Provision your first administrative user](/terraform/enterprise/deploy/initial-admin-user) and start using Terraform Enterprise.
+
+### Extend or fork the OpenShift `terraform-enterprise` helm chart
+
+The [Terraform Enterprise Helm Chart](https://github.com/hashicorp/terraform-enterprise-helm) is intended to meet the needs of the majority of our users. Many OpenShift primitives, such as routing, are absent in the `terraform-enterprise` Helm chart. You can fork our Helm chart and adapt it to your organization’s requirements. Alternatively, you can use the `terraform-enterprise` Helm chart as a [sub-chart](https://helm.sh/docs/chart_template_guide/subcharts_and_globals/), thus relegating OpenShift primitives to the parent chart to be deployed around the `terraform-enterprise` chart contents.
+
+If you contact HashiCorp support, include your custom Helm chart alongside your support bundle to ensure support has all the information they need.
+
+## Example deployment configuration
+
+The following example configuration deploys Terraform Enterprise to OpenShift in Azure with hosted external services. The configuration is based on cloud native hosted PostgreSQL, storage, or Redis cache services. You can copy the example configuration and modify the values to per your environment. Refer to [Configuration Reference](/terraform/enterprise/deploy/reference/configuration)
+for a list of all configuration options.
+
+The example also depends on the following conditions:
+
+- Values under `.env.variables` are set as a `ConfigMap` and mounted as Terraform Enterprise environment variables.
+- Values under `.env.secrets` are set as Kubernetes secrets and mounted as Terraform Enterprise environment variables.
+- Extend the `env.configMapRefs[]` or `env.secretRefs[]` with your own resources to add additional `ConfigMap` or `Secret` resources within your environment configuration.
+
+- Values marked `BASE_64_ENCODED*` indicate that the value given must be base 64 encoded. If you are using this certificate configuration to host Terraform Enterprise web traffic, this value must be valid with the `env.TFE_HOSTNAME`, or match the wildcard pattern.
+
+```yaml
+replicaCount:
+tls:
+ certData:
+ keyData:
+ caCertData:
+image:
+ repository: images.releases.hashicorp.com
+ name: hashicorp/terraform-enterprise
+ tag:
+openshift:
+ enabled: true
+env:
+ variables:
+ TFE_HOSTNAME:
+ TFE_IACT_SUBNETS:
+
+ # Database settings.
+ TFE_DATABASE_HOST:
+ TFE_DATABASE_NAME:
+ TFE_DATABASE_PARAMETERS:
+ TFE_DATABASE_USER:
+
+ # Redis settings.
+ TFE_REDIS_HOST:
+ TFE_REDIS_USE_TLS:
+ TFE_REDIS_USE_AUTH:
+ TFE_REDIS_USER:
+
+ # Azure container storage settings.
+ TFE_OBJECT_STORAGE_TYPE: azure
+ TFE_OBJECT_STORAGE_AZURE_ACCOUNT_NAME:
+ TFE_OBJECT_STORAGE_AZURE_CONTAINER:
+ TFE_OBJECT_STORAGE_AZURE_ENDPOINT:
+
+ # Terraform Enterprise on OpenShift Required settings
+ TFE_RUN_PIPELINE_IMAGE:
+ TFE_RUN_PIPELINE_KUBERNETES_IMAGE_PULL_SECRET_NAME:
+
+ secrets:
+ TFE_DATABASE_PASSWORD: ''
+ TFE_OBJECT_STORAGE_AZURE_ACCOUNT_KEY: ''
+ TFE_REDIS_PASSWORD: ''
+ TFE_LICENSE: ''
+ TFE_ENCRYPTION_PASSWORD: ''
+```
+
+
+Refer to the following materials for additional guidance on setting up Helm chart values files:
+- [Terraform Enterprise Helm repository](https://github.com/hashicorp/terraform-enterprise-helm)
+- [Release version tags](/terraform/enterprise/releases)
+- Generic reference for [values file](https://helm.sh/docs/chart_template_guide/values_files/) to override the default values in the Helm chart.
diff --git a/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/podman.mdx b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/podman.mdx
new file mode 100644
index 0000000000..eb29ccb0ae
--- /dev/null
+++ b/content/terraform-enterprise/v000011-1/v202504-1/docs/enterprise/deploy/podman.mdx
@@ -0,0 +1,493 @@
+---
+page_title: Deploy Terraform Enterprise to Podman
+description: >-
+ Learn how to deploy Terraform Enterprise using Podman.
+---
+
+# Deploy Terraform Enterprise to Podman
+
+This topic describes how to install and run Terraform Enterprise on Podman. These installation steps set up a rootful Podman installation with a non-root user so that the Podman service runs as root while processes within the Terraform Enterprise container run as non-root.
+
+## Overview
+
+Complete the following steps to install Terraform Enterprise:
+
+1. Complete the prerequisites.
+1. Set up installation folders and files.
+1. Download and install image.
+1. Apply the deployment configuration.
+
+## Prerequisites
+
+Complete the following tasks before attempting to install Terraform Enterprise.
+
+### Prepare the deployment environment
+
+Set up a host instance and provide a DNS hostname for Terraform Enterprise and the associated TLS certificate. Additionally, you must configure your network so that your host can receive and send traffic. Refer to [Prepare the host environment](/terraform/enterprise/deploy/prepare-host) for details about preparing the host environment.
+
+### Deploy storage systems for `active` and `external` mode
+
+If you intend to operate Terraform Enterprise in `active` or `external` mode, deploy the database and other storage devices so that Terraform can connect to them when the application starts. Refer to [Data storage settings overview](/terraform/enterprise/deploy/configuration/storage) for additional information.
+
+### Create the deployment configuration
+
+Create a deployment configuration file and specify settings for the operational mode, license, TLS certificates, and network configuration. Add any additional configurations necessary for your environment. Refer to [Configuration file overview](/terraform/enterprise/deploy/configuration/) for additional information.
+
+## Set up installation folders and files
+
+1. Connect to the host instance.
+1. Create a dedicated directory for the Terraform Enterprise installation files
+1. Navigate to the installation directory.
+1. Create a `certs` directory.
+1. Place your TLS certificate (`cert.pem`), TLS private key (`key.pem`), and CA certificates bundle (`bundle.pem`) inside inside the`certs` directory. If you do not have a CA certificates bundle, place your TLS certificate (`cert.pem`) inside `bundle.pem` instead.
+1. Place your deployment configuration file into the Terraform Enterprise installation directory. Refer to [Example deployment configurations](#example-deployment-configurations) for pre-formatted configurations that you can copy and modify. Refer to the [configuration reference](/terraform/enterprise/deploy/reference/configuration) for information about all deployment configuration settings.
+
+## Download and install image
+
+ 1. Log in to the Terraform Enterprise container image registry, using `terraform`
+ as the username, and your Hashicorp Terraform Enterprise license as the password:
+
+ ```shell-session
+ # echo "" | podman login --username terraform images.releases.hashicorp.com --password-stdin
+ ```
+
+ 1. Pull the Terraform Enterprise image from the registry.
+
+ ```shell-session
+ # podman pull images.releases.hashicorp.com/hashicorp/terraform-enterprise:
+ ```
+
+## Apply the deployment configuration
+
+Refer to [Deployment configuration reference](/terraform/enterprise/deploy/reference/configuration) for a list of all the configuration options.
+
+ 1. Create a Terraform Enterprise pod by running the following command:
+
+ ```shell-session
+ # podman kube play
+ ```
+
+ 1. In a separate terminal session, you can monitor the logs by running the following command:
+
+ ```shell-session
+ # podman logs -f
+ ```
+
+ 1. Monitor the health of the application until it starts reporting healthy with the following command:
+
+ ```shell-session
+ # podman exec tfe-health-check-status
+ ```
+
+## Post installation tasks actions
+
+Complete the following tasks after the initial installation.
+
+### Review startup checks
+
+When you start Terraform Enterprise, several startup checks also run to prevent errors related to invalid configurations or certificates, as well as other issues that could prevent the application from running successfully or safely. Refer to the [startup checks reference](/terraform/enterprise/deploy/reference/startup-checks) for additional information.
+
+### Create the initial admin user
+
+[Provision your first administrative user](/terraform/enterprise/deploy/initial-admin-user) and start using Terraform Enterprise.
+
+### Service management
+
+To learn more about managing the lifecycle of Podman pods, refer to [the Podman docs for more information about pods](https://podman.io/).
+We have included possible options for managing a pod's lifecycle on a Red Hat Enterprise Linux (RHEL) host for convenience.
+
+### Manage Podman service
+
+Complete the following steps to create a `systemd` service that automatically starts your pod and its containers. We
+recommend using [Quadlet](https://www.redhat.com/sysadmin/quadlet-podman), which is an opinionated tool for running Podman
+containers, to deploy `systemd`. Quadlet generates a `systemd` service that manages the Terraform Enterprise pod and
+all containers, including the internal infrastructure container.
+
+ 1. Ensure the Terraform Enterprise pod is not running.
+
+ 1. Navigate to `/etc/containers/systemd/`. Define the service files in this directory.
+
+ 1. Create a Quadlet unit file for the Terraform Enterprise pod and container at `/etc/containers/systemd/terraform-enterprise.kube`:
+ ```ini
+ [Install]
+ WantedBy=default.target
+ [Service]
+ Restart=always
+ [Kube]
+ Yaml=tfe.yaml
+ ```
+
+ 1. Copy your Kubernetes YAML file to `/etc/containers/systemd/tfe.yaml`:
+ ```shell-session
+ # cp /etc/containers/systemd/tfe.yaml
+ ```
+
+ 1. Reload the `systemd` daemon and enable the service:
+ ```shell-session
+ # systemctl daemon-reload
+ # systemctl start terraform-enterprise.service
+ ```
+
+ 1. Check the status of your service:
+ ```shell-session
+ # systemctl status terraform-enterprise.service
+
+ ● terraform-enterprise.service
+ Loaded: loaded (/etc/containers/systemd/terraform-enterprise.kube; generated)
+ Active: active (running) since Sun 2024-02-25 21:15:55 UTC; 15min ago
+ Main PID: 35893 (conmon)
+ Tasks: 4 (limit: 404901)
+ Memory: 5.2M
+ CGroup: /system.slice/terraform-enterprise.service
+ ├─35893 /usr/bin/conmon --api-version 1 -c 74f1271d9a481711950c62b509f126c3fdf8678a9d552c5ccc692eb6ed5cf4d1 -u 74f1271d9a481711950c62b509f126c3fdf8678a9d552c5ccc692eb6ed5cf4d1 ->
+ ├─36028 /usr/sbin/dnsmasq -u root --conf-file=/run/containers/cni/dnsname/podman-default-kube-network/dnsmasq.conf
+ ├─36030 /usr/bin/conmon --api-version 1 -c 973d3ff4f7ada5880a9947be4d90b3d556c7ce841037de34c7eaa07c044a3ec0 -u 973d3ff4f7ada5880a9947be4d90b3d556c7ce841037de34c7eaa07c044a3ec0 ->
+ └─36083 /usr/bin/conmon --api-version 1 -c 435ea68e87dbef3c0965ffdfb9fe1fc36c5500a63eb00dc0fe2499aaa560a563 -u 435ea68e87dbef3c0965ffdfb9fe1fc36c5500a63eb00dc0fe2499aaa560a563 ->
+ ```
+
+## Example configurations
+
+You can copy one of the following example configurations and modify the values to per your environment. Refer to [Configuration Reference](/terraform/enterprise/deploy/reference/configuration)
+for a list of all configuration options.
+
+
+### Example `disk` mode configuration
+
+The following Kubernetes YAML deploys Terraform Enterprise in `disk` mode. In this mode, Terraform Enterprise runs as a pod composed of a Terraform Enterprise container.
+
+```yaml
+---
+apiVersion: "v1"
+kind: "Pod"
+metadata:
+ labels:
+ app: "terraform-enterprise"
+ name: "terraform-enterprise"
+spec:
+ restartPolicy: "Never"
+ containers:
+ - env:
+ - name: "TFE_OPERATIONAL_MODE"
+ value: "disk"
+ - name: "TFE_LICENSE"
+ value: ""
+ - name: "TFE_HOSTNAME"
+ value: ""
+ - name: "TFE_HTTP_PORT"
+ value: "8080"
+ - name: "TFE_HTTPS_PORT"
+ value: "8443"
+ - name: "TFE_TLS_CERT_FILE"
+ value: "/etc/ssl/private/terraform-enterprise/cert.pem"
+ - name: "TFE_TLS_KEY_FILE"
+ value: "/etc/ssl/private/terraform-enterprise/key.pem"
+ - name: "TFE_TLS_CA_BUNDLE_FILE"
+ value: "/etc/ssl/private/terraform-enterprise/bundle.pem"
+ - name: "TFE_DISK_CACHE_VOLUME_NAME"
+ value: "terraform-enterprise_terraform-enterprise-cache"
+ - name: "TFE_ENCRYPTION_PASSWORD"
+ value: ''
+ image: "images.releases.hashicorp.com/hashicorp/terraform-enterprise:"
+ name: "terraform-enterprise"
+ ports:
+ - containerPort: 8080
+ hostPort: 80
+ - containerPort: 8443
+ hostPort: 443
+ - containerPort: 9090
+ hostPort: 9090
+ securityContext:
+ capabilities:
+ add:
+ - "CAP_IPC_LOCK"
+ readOnlyRootFilesystem: true
+ seLinuxOptions:
+ type: "spc_t"
+ volumeMounts:
+ - mountPath: "/etc/ssl/private/terraform-enterprise"
+ name: "certs"
+ - mountPath: "/var/log/terraform-enterprise"
+ name: "log"
+ - mountPath: "/run"
+ name: "run"
+ - mountPath: "/tmp"
+ name: "tmp"
+ - mountPath: "/var/lib/terraform-enterprise"
+ name: "data"
+ - mountPath: "/run/docker.sock"
+ name: "docker-sock"
+ - mountPath: "/var/cache/tfe-task-worker/terraform"
+ name: "terraform-enterprise_terraform-enterprise-cache-pvc"
+ volumes:
+ - hostPath:
+ path: ""
+ type: "Directory"
+ name: "certs"
+ - emptyDir:
+ medium: "Memory"
+ name: "log"
+ - emptyDir:
+ medium: "Memory"
+ name: "run"
+ - emptyDir:
+ medium: "Memory"
+ name: "tmp"
+ - hostPath:
+ path: ""
+ type: "Directory"
+ name: "data"
+ - hostPath:
+ path: "/run/podman/podman.sock"
+ type: "File"
+ name: "docker-sock"
+ - name: "terraform-enterprise_terraform-enterprise-cache-pvc"
+ persistentVolumeClaim:
+ claimName: "terraform-enterprise_terraform-enterprise-cache"
+```
+
+### Example `external` mode configuration
+
+The following Kubernetes YAML configuration deploys Terraform Enterprise in `external` mode. In this mode, Terraform Enterprise runs as a pod composed of a Terraform Enterprise container.
+
+```yaml
+---
+apiVersion: "v1"
+kind: "Pod"
+metadata:
+ labels:
+ app: "terraform-enterprise"
+ name: "terraform-enterprise"
+spec:
+ restartPolicy: "Never"
+ containers:
+ - env:
+ - name: "TFE_LICENSE"
+ value: ""
+ - name: "TFE_HOSTNAME"
+ value: ""
+ - name: "TFE_OPERATIONAL_MODE"
+ value: "external"
+ - name: "TFE_HTTP_PORT"
+ value: "8080"
+ - name: "TFE_HTTPS_PORT"
+ value: "8443"
+ - name: "TFE_ENCRYPTION_PASSWORD"
+ value: '