> This page is for API.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.eon.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.eon.io/_mcp/server.

# Remove Snapshot Hold

PATCH https://%7Baccount-domain%7D.console.eon.io/api/v1/projects/{projectId}/snapshots/{id}/remove-hold

Removes user hold from an Eon snapshot, allowing it to be removed once it passes its expiration time.

If the snapshot is past its expiration time, it's marked for removal as soon as the hold is removed.

Reference: https://docs.eon.io/api/api-reference/backup-management/snapshots/remove-snapshot-hold

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Path parameters

- `projectId` (string, required) — ID of the project the snapshot is in. You can get your project ID from the [API Credentials](https://console.eon.io/global-management/api-credentials) page in your global management console.
- `id` (string, required) — ID of the Eon snapshot.

### Headers

- `X-Action-Approval-Request-Id` (string, optional) — ID of an approved action request. Applicable only when the method is protected by an action approval policy and the action request has been approved.&nbsp; When used, the current API request must match the original request parameters. The approved action request can be executed only by the original requester.

## Response

### 200

User hold removed from snapshot.

### 201

Applicable only when the method is protected by an [action approval policy]. An action request was created in an initial state. The action request needs to be submitted for approval by passing its ID to [Submit Action Approval Request](https://docs.eon.io/api/api-reference/access-management/action-approvals/my-action-requests/create-action-approval-request). [action approval policy]: /api/using-the-api/action-approvals

- `actionApprovalRequest` (MPARequest, required) — Action request details.

## Errors

### 404 Not Found Error

Snapshot wasn't found.

- `any`

## Types

### MPARequest

Action request details.

- `id` (string, required) — ID of the action request.
- `operation` (enum, required) — Operation that requires action approval before it can be completed.
  - Allowed values: `MPA_OPERATION_TYPE_UNSPECIFIED`, `MPA_OPERATION_ADD_RESTORE_ACCOUNT`, `MPA_OPERATION_RESTORE_RESOURCE`, `MPA_OPERATION_UPDATE_BACKUP_POLICY`, `MPA_OPERATION_DELETE_BACKUP_POLICY`, `MPA_OPERATION_CREATE_BACKUP_POLICY`
- `requesterEmail` (string, required) — Email address of the requester.
- `status` (enum, required) — Action request status. For an explanation of statuses, see [Action Request Statuses](/data-protection/account-administration/access-management/action-approvals/action-request-statuses).
  - Allowed values: `MPA_REQUEST_STATUS_UNSPECIFIED`, `CREATED`, `PENDING_APPROVAL`, `APPROVED`, `DENIED`, `EXPIRED_PENDING_APPROVAL`, `EXPIRED_APPROVED`, `EXECUTED`, `CANCELED_PENDING_APPROVAL`, `CANCELED_APPROVED`, `DISCARDED`
- `policyDetails` (list of MPARequestPolicyDetail, required) — List of the action request's approval rules. Each item contains the rule's configuration and approval progress.
- `createdTime` (datetime, required) — Time when the approval request was created.
- `requesterName` (string, optional) — Display name of the requester at the time the request was created.
- `comment` (string, optional) — Comment from the requester explaining why they want to perform the action.
- `approvalExpirationTime` (datetime, optional, nullable) — Deadline for gathering approvals. Omitted before the request is submitted or after it's discarded.
- `executionExpirationTime` (datetime, optional, nullable) — Deadline for completing the approved action. Set when the request is approved.
- `resolvedTime` (datetime, optional, nullable) — Time when the request reached a terminal state, such as executed, expired, canceled, denied, or discarded. Omitted while the request is still active.

### MPARequestPolicyDetail

- `requiredApprovals` (integer, required) — Count of approvals the rule requires.
- `currentApprovals` (integer, required) — Count of qualifying approvals received.
- `executionWindowHours` (integer, required) — After all required approvals are received, number of hours the requester has to complete the action.
- `approvalWindowHours` (integer, required) — After submitting the action request, number of hours allowed for gathering all required approvals.
- `description` (string, optional) — Rule description.
- `approverIdpId` (string, optional, nullable) — Eon-assigned ID of the SAML identity provider the approver group belongs to. Used in combination with `approverProviderGroupId`.
- `approverProviderGroupId` (string, optional, nullable) — Identity-provider-assigned ID of the group. Used in combination with `approverIdpId`.

## Examples

### Example 1

**Response**

```json
{}
```

**SDK Code**

```python
import requests

url = "https://{account-domain}.console.eon.io/api/v1/projects/1ee34dc5-0a7c-4e56-a820-917371e05c8d/snapshots/043090df-9fe5-4f89-9859-45db589c2936/remove-hold"

headers = {"Authorization": "Bearer <token>"}

response = requests.patch(url, headers=headers)

print(response.json())
```

```javascript
const url = 'https://{account-domain}.console.eon.io/api/v1/projects/1ee34dc5-0a7c-4e56-a820-917371e05c8d/snapshots/043090df-9fe5-4f89-9859-45db589c2936/remove-hold';
const options = {method: 'PATCH', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.patch("https://{account-domain}.console.eon.io/api/v1/projects/1ee34dc5-0a7c-4e56-a820-917371e05c8d/snapshots/043090df-9fe5-4f89-9859-45db589c2936/remove-hold")
  .header("Authorization", "Bearer <token>")
  .asString();
```

### Example 2

**Response**

```json
{
  "actionApprovalRequest": {
    "approvalExpirationTime": "2026-05-05T03:00:05Z",
    "comment": "Removing a backup policy that has been replaced.",
    "createdTime": "2026-05-04T23:00:05Z",
    "executionExpirationTime": "2026-05-05T07:00:05Z",
    "id": "018f3b3f-4818-7c31-a0d7-2e02f2f83a10",
    "operation": "MPA_OPERATION_DELETE_BACKUP_POLICY",
    "policyDetails": [
      {
        "approvalWindowHours": 24,
        "approverIdpId": "018f3b3f-4818-7c31-a0d7-2e02f2f83a31",
        "approverProviderGroupId": "platform-admins",
        "currentApprovals": 1,
        "description": "Require approval before deleting backup policies.",
        "executionWindowHours": 4,
        "requiredApprovals": 2
      }
    ],
    "requesterEmail": "requester@example.com",
    "requesterName": "Riley Chen",
    "resolvedTime": "2026-05-05T02:10:12Z",
    "status": "PENDING_APPROVAL"
  }
}
```

**SDK Code**

```python
import requests

url = "https://{account-domain}.console.eon.io/api/v1/projects/1ee34dc5-0a7c-4e56-a820-917371e05c8d/snapshots/043090df-9fe5-4f89-9859-45db589c2936/remove-hold"

headers = {"Authorization": "Bearer <token>"}

response = requests.patch(url, headers=headers)

print(response.json())
```

```javascript
const url = 'https://{account-domain}.console.eon.io/api/v1/projects/1ee34dc5-0a7c-4e56-a820-917371e05c8d/snapshots/043090df-9fe5-4f89-9859-45db589c2936/remove-hold';
const options = {method: 'PATCH', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.patch("https://{account-domain}.console.eon.io/api/v1/projects/1ee34dc5-0a7c-4e56-a820-917371e05c8d/snapshots/043090df-9fe5-4f89-9859-45db589c2936/remove-hold")
  .header("Authorization", "Bearer <token>")
  .asString();
```