> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mainwp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Updates Abilities

> 14 abilities for checking, previewing, and applying WordPress updates and managing site update holds.

MainWP Dashboard 6.3 registers 14 update management abilities into the WordPress Abilities API framework. These enable programmatic control over WordPress core, plugin, theme, and translation updates across your network.

## What You'll Learn

* Listing available updates across all sites
* Applying WordPress core, plugin, theme, and translation updates
* Managing ignored updates
* Batch update operations

***

## Confirmation and Update Holds in 6.3

`run-updates-v1`, `update-all-v1`, and the four `update-site-*` abilities require either `dry_run: true` to preview or `confirm: true` to execute. A call with neither returns `mainwp_confirmation_required` with HTTP 400. Do not set both flags to true.

Preview first, review the returned sites and update plan, then submit the same selection with `confirm: true`. A direct Abilities API request uses these flags; the separate one-time confirmation token used by MainWP MCP belongs to the MCP server's [confirmation flow](/mcp-server/safety).

Previews return `dry_run`, `would_affect`, `count`, `warnings`, and `errors`. Confirmed immediate responses include `dry_run: false`, `skipped`, and `summary.total_skipped`. Inspect both `errors` and `skipped`; a successful HTTP request does not mean every update was installed. Queued responses return a job ID for [status polling](/api-reference/abilities-api/batch-operations).

These abilities respect site-level and global update holds. Pending items blocked by a hold appear as skipped, and queued jobs recheck holds, site access, and the job owner's operation permissions when they execute. Translation updates also respect the site's translation ignore setting.

Adding an update hold remains available through the ignore abilities. Removing a site's own holds uses the new `mainwp/unignore-site-updates-v1` ability with preview or confirmation. The older `action: unignore` and `action: remove` paths return an error directing you to that ability.

***

## mainwp/list-updates-v1

List available updates across all sites.

**Method:** GET (readonly)

```bash theme={null}
curl -u 'admin:xxxx' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/list-updates-v1/run'
```

**Input Parameters:**

| Name | Type | Required | Default | Description |
| - | - | - | - | - |
| `site_ids_or_domains` | array | No | \[] | Filter to specific sites |
| `types` | array | No | \[] | Filter: `core`, `plugins`, `themes`, `translations` |
| `page` | integer | No | 1 | Page number |
| `per_page` | integer | No | 50 | Items per page (max 200) |

**Response:**

```json theme={null}
{
  "updates": [
    {
      "site_id": 1,
      "site_url": "https://site1.example.com",
      "site_name": "Site 1",
      "type": "plugin",
      "slug": "akismet/akismet.php",
      "name": "Akismet Anti-spam",
      "current_version": "5.3",
      "new_version": "5.3.1"
    }
  ],
  "summary": {
    "core": 2,
    "plugins": 15,
    "themes": 3,
    "translations": 5,
    "total": 25
  },
  "page": 1,
  "per_page": 50,
  "total": 25
}
```

***

## mainwp/run-updates-v1

Execute updates on sites. Operations affecting more than 200 sites are queued for background processing.

**Method:** POST

```bash theme={null}
# Preview a specific plugin update on selected sites
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_ids_or_domains":[1,2,3],"types":["plugins"],"specific_items":["akismet/akismet.php"],"dry_run":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/run-updates-v1/run'

# Apply the same selection after reviewing the preview
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_ids_or_domains":[1,2,3],"types":["plugins"],"specific_items":["akismet/akismet.php"],"confirm":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/run-updates-v1/run'
```

**Input Parameters:**

| Name | Type | Required | Default | Description |
| - | - | - | - | - |
| `site_ids_or_domains` | array | No | \[] | Sites to update. Empty = all with updates |
| `types` | array | No | \[] | Update types: `core`, `plugins`, `themes`, `translations` |
| `specific_items` | array | No | \[] | Specific slugs to update |
| `dry_run` | boolean | For preview | false | Set true to preview; do not combine with confirm |
| `confirm` | boolean | For execution | false | Set true to execute after reviewing a preview |

Run a preview first with `dry_run: true`. The commands above show confirmed execution unless labeled as a preview.

**Response:**

```json theme={null}
{
  "dry_run": false,
  "updated": [
    {
      "site_id": 1,
      "site_url": "https://site1.example.com",
      "site_name": "Site 1",
      "type": "plugin",
      "slug": "akismet/akismet.php",
      "name": "Akismet",
      "old_version": "5.3",
      "new_version": "5.3.1"
    }
  ],
  "errors": [],
  "summary": {
    "total_updated": 1,
    "total_errors": 0,
    "sites_updated": 1,
    "total_skipped": 0
  },
  "skipped": []
}
```

***

## mainwp/get-site-updates-v1

Get available updates for a single site.

**Method:** GET (readonly)

```bash theme={null}
curl -G -u 'admin:xxxx' \
  --data-urlencode 'input_json={"site_id_or_domain":1}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/get-site-updates-v1/run'
```

**Input Parameters:**

| Name | Type | Required | Default | Description |
| - | - | - | - | - |
| `site_id_or_domain` | integer\|string | Yes | — | Site ID or domain |
| `types` | array | No | \[] | Filter: `core`, `plugins`, `themes`, `translations` |

**Response:**

```json theme={null}
{
  "site_id": 1,
  "site_url": "https://site1.example.com",
  "site_name": "Site 1",
  "updates": [
    {
      "type": "plugin",
      "slug": "akismet/akismet.php",
      "name": "Akismet",
      "current_version": "5.3",
      "new_version": "5.3.1"
    }
  ],
  "summary": {
    "core": 0,
    "plugins": 1,
    "themes": 0,
    "translations": 0,
    "total": 1
  },
  "rollback_items": {
    "plugins": [],
    "themes": []
  }
}
```

***

## mainwp/update-site-core-v1

Update WordPress core on a single site.

**Method:** POST

```bash theme={null}
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"confirm":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/update-site-core-v1/run'
```

**Input Parameters:**

| Name | Type | Required | Default | Description |
| - | - | - | - | - |
| `site_id_or_domain` | integer\|string | Yes | — | Site ID or domain |
| `dry_run` | boolean | For preview | false | Set true to preview; do not combine with confirm |
| `confirm` | boolean | For execution | false | Set true to execute after reviewing a preview |

Run a preview first with `dry_run: true`. The commands above show confirmed execution unless labeled as a preview.

**Response:**

```json theme={null}
{
  "dry_run": false,
  "updated": {
    "site_id": 1,
    "site_url": "https://site1.example.com",
    "site_name": "Site 1",
    "type": "core",
    "slug": "wordpress",
    "name": "WordPress",
    "old_version": "6.4.1",
    "new_version": "6.4.2"
  },
  "skipped": [],
  "summary": {
    "total_skipped": 0
  }
}
```

***

## mainwp/update-site-plugins-v1

Update plugins on a single site.

**Method:** POST

```bash theme={null}
# Update specific plugins
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"slugs":["akismet/akismet.php"],"confirm":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/update-site-plugins-v1/run'

# Update all plugins
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"confirm":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/update-site-plugins-v1/run'
```

**Input Parameters:**

| Name | Type | Required | Default | Description |
| - | - | - | - | - |
| `site_id_or_domain` | integer\|string | Yes | — | Site ID or domain |
| `slugs` | array | No | \[] | Specific plugins to update. Empty = all |
| `dry_run` | boolean | For preview | false | Set true to preview; do not combine with confirm |
| `confirm` | boolean | For execution | false | Set true to execute after reviewing a preview |

Run a preview first with `dry_run: true`. The commands above show confirmed execution unless labeled as a preview.

**Response:**

```json theme={null}
{
  "dry_run": false,
  "updated": [
    {
      "site_id": 1,
      "site_url": "https://site1.example.com",
      "site_name": "Site 1",
      "type": "plugin",
      "slug": "akismet/akismet.php",
      "name": "Akismet",
      "old_version": "5.3",
      "new_version": "5.3.1"
    }
  ],
  "errors": [],
  "skipped": [],
  "summary": {
    "total_updated": 1,
    "total_errors": 0,
    "total_skipped": 0
  }
}
```

***

## mainwp/update-site-themes-v1

Update themes on a single site.

**Method:** POST

```bash theme={null}
# Update specific themes
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"slugs":["twentytwentyfour"],"confirm":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/update-site-themes-v1/run'

# Update all themes
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"confirm":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/update-site-themes-v1/run'
```

**Input Parameters:**

| Name | Type | Required | Default | Description |
| - | - | - | - | - |
| `site_id_or_domain` | integer\|string | Yes | — | Site ID or domain |
| `slugs` | array | No | \[] | Specific themes to update. Empty = all |
| `dry_run` | boolean | For preview | false | Set true to preview; do not combine with confirm |
| `confirm` | boolean | For execution | false | Set true to execute after reviewing a preview |

Run a preview first with `dry_run: true`. The commands above show confirmed execution unless labeled as a preview.

**Response:**

```json theme={null}
{
  "dry_run": false,
  "updated": [
    {
      "site_id": 1,
      "site_url": "https://site1.example.com",
      "site_name": "Site 1",
      "type": "theme",
      "slug": "twentytwentyfour",
      "name": "Twenty Twenty-Four",
      "old_version": "1.0",
      "new_version": "1.1"
    }
  ],
  "errors": [],
  "skipped": [],
  "summary": {
    "total_updated": 1,
    "total_errors": 0,
    "total_skipped": 0
  }
}
```

***

## mainwp/update-site-translations-v1

Update translations on a single site.

**Method:** POST

```bash theme={null}
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"confirm":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/update-site-translations-v1/run'
```

**Input Parameters:**

| Name | Type | Required | Default | Description |
| - | - | - | - | - |
| `site_id_or_domain` | integer\|string | Yes | — | Site ID or domain |
| `slugs` | array | No | \[] | Specific translation slugs to update. Empty = all available |
| `dry_run` | boolean | For preview | false | Set true to preview; do not combine with confirm |
| `confirm` | boolean | For execution | false | Set true to execute after reviewing a preview |

Run a preview first with `dry_run: true`. The commands above show confirmed execution unless labeled as a preview.

**Response:**

```json theme={null}
{
  "dry_run": false,
  "updated": [
    {
      "site_id": 1,
      "site_url": "https://site1.example.com",
      "site_name": "Site 1",
      "type": "translation",
      "slug": "akismet",
      "name": "Akismet",
      "old_version": "",
      "new_version": "5.3.1"
    }
  ],
  "errors": [],
  "skipped": [],
  "summary": {
    "total_updated": 1,
    "total_errors": 0,
    "total_skipped": 0
  }
}
```

***

## mainwp/list-ignored-updates-v1

List updates marked as ignored.

**Method:** GET (readonly)

```bash theme={null}
curl -u 'admin:xxxx' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/list-ignored-updates-v1/run'
```

**Input Parameters:**

| Name | Type | Required | Default | Description |
| - | - | - | - | - |
| `page` | integer | No | 1 | Page number |
| `per_page` | integer | No | 50 | Items per page |

**Response:**

```json theme={null}
{
  "ignored": [
    {
      "site_id": 1,
      "site_url": "https://site1.example.com",
      "site_name": "Site 1",
      "type": "plugin",
      "slug": "woocommerce/woocommerce.php",
      "name": "WooCommerce",
      "ignored_version": "8.5.0"
    }
  ],
  "total": 5
}
```

***

## mainwp/set-ignored-updates-v1

Add an item to a site's ignored updates list. In 6.3, use `action: ignore` here and [unignore-site-updates-v1](#mainwp-unignore-site-updates-v1) to remove a hold.

**Method:** POST

```bash theme={null}
# Ignore a plugin update
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"action":"ignore","site_id_or_domain":1,"type":"plugin","slug":"woocommerce/woocommerce.php"}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/set-ignored-updates-v1/run'

```

**Input Parameters:**

| Name | Type | Required | Default | Description |
| - | - | - | - | - |
| `action` | string | Yes | - | Use `ignore`; `unignore` is rejected in 6.3 |
| `site_id_or_domain` | integer\|string | Yes | — | Site ID or domain |
| `type` | string | Yes | — | `core`, `plugin`, or `theme` |
| `slug` | string | Yes | — | Item slug (use `wordpress` for core) |

**Response:**

```json theme={null}
{
  "success": true,
  "action": "ignore",
  "site_id": 1,
  "type": "plugin",
  "slug": "woocommerce/woocommerce.php"
}
```

***

## mainwp/ignore-site-core-v1

Add a core update hold for a site. Use `unignore-site-updates-v1` with `type: core` to remove it.

**Method:** POST

```bash theme={null}
# Ignore core updates
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"action":"add"}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/ignore-site-core-v1/run'

```

**Input Parameters:**

| Name | Type | Required | Default | Description |
| - | - | - | - | - |
| `site_id_or_domain` | integer\|string | Yes | — | Site ID or domain |
| `action` | string | Yes | - | Use `add`; `remove` is rejected in 6.3 |

**Response:**

```json theme={null}
{
  "success": true,
  "message": "Core updates ignored for this site.",
  "ignored_count": 1
}
```

***

## mainwp/ignore-site-plugins-v1

Add plugin update holds for a site. Use `unignore-site-updates-v1` with `type: plugin` to remove them.

**Method:** POST

```bash theme={null}
# Ignore plugin updates
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"action":"add","slugs":["akismet/akismet.php"]}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/ignore-site-plugins-v1/run'

```

**Input Parameters:**

| Name | Type | Required | Default | Description |
| - | - | - | - | - |
| `site_id_or_domain` | integer\|string | Yes | — | Site ID or domain |
| `action` | string | Yes | - | Use `add`; `remove` is rejected in 6.3 |
| `slugs` | array | Yes | - | Plugin slugs to ignore |

**Response:**

```json theme={null}
{
  "success": true,
  "message": "1 plugin ignored.",
  "ignored_count": 1
}
```

***

## mainwp/ignore-site-themes-v1

Add theme update holds for a site. Use `unignore-site-updates-v1` with `type: theme` to remove them.

**Method:** POST

```bash theme={null}
# Ignore theme updates
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"action":"add","slugs":["twentytwenty"]}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/ignore-site-themes-v1/run'

```

**Input Parameters:**

| Name | Type | Required | Default | Description |
| - | - | - | - | - |
| `site_id_or_domain` | integer\|string | Yes | — | Site ID or domain |
| `action` | string | Yes | - | Use `add`; `remove` is rejected in 6.3 |
| `slugs` | array | Yes | - | Theme slugs to ignore |

**Response:**

```json theme={null}
{
  "success": true,
  "message": "1 theme ignored.",
  "ignored_count": 1
}
```

***

## mainwp/unignore-site-updates-v1

Preview or remove one site's own update holds. Removing a hold can make an update eligible for later update runs, including queued runs; this ability does not install the update.

**Method:** POST

```bash theme={null}
# Preview removal of one plugin's site hold
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"type":"plugin","slugs":["akismet/akismet.php"],"dry_run":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/unignore-site-updates-v1/run'

# Remove that hold after reviewing the preview
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"type":"plugin","slugs":["akismet/akismet.php"],"confirm":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/unignore-site-updates-v1/run'
```

| Name | Type | Required | Description |
| - | - | - | - |
| `site_id_or_domain` | integer or string | Yes | Authorized site ID or domain |
| `type` | string | Yes | `core`, `plugin`, or `theme` |
| `slugs` | array of strings | For plugin and theme | Nonempty list of item slugs; ignored for core |
| `dry_run` | boolean | For preview | Set to `true` to inspect the holds without changing them |
| `confirm` | boolean | For execution | Set to `true` to remove the site's own holds |

A preview returns `would_affect.holds`, a count, warnings, and errors. A hold's `still_held_by` field identifies a global or whole-site hold that will remain in effect. Execution returns `removed`, `not_held`, and `count` with `dry_run: false`:

```json theme={null}
{
  "dry_run": false,
  "removed": [
    "akismet/akismet.php"
  ],
  "not_held": [],
  "count": 1
}
```

Global holds and whole-site ignore flags remain unchanged. Site access and **Ignore/Unignore Updates** permissions apply.

***

## mainwp/update-all-v1

Execute all available updates across sites. Use with caution on production environments.

**Method:** POST

```bash theme={null}
# Update everything on all sites
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"confirm":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/update-all-v1/run'

# Update everything on specific sites
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_ids_or_domains":[1,2,3],"confirm":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/update-all-v1/run'
```

**Input Parameters:**

| Name | Type | Required | Default | Description |
| - | - | - | - | - |
| `site_ids_or_domains` | array | No | \[] | Sites to update. Empty = all sites |
| `dry_run` | boolean | For preview | false | Set true to preview; do not combine with confirm |
| `confirm` | boolean | For execution | false | Set true to execute after reviewing a preview |

Run a preview first with `dry_run: true`. The commands above show confirmed execution unless labeled as a preview.

**Response:**

```json theme={null}
{
  "dry_run": false,
  "updated": [
    {
      "site_id": 1,
      "site_url": "https://site1.example.com",
      "site_name": "Site 1",
      "type": "plugin",
      "slug": "akismet/akismet.php",
      "name": "Akismet",
      "old_version": "5.3",
      "new_version": "5.3.1"
    }
  ],
  "errors": [],
  "summary": {
    "total_updated": 1,
    "total_errors": 0,
    "sites_updated": 1,
    "total_skipped": 0
  },
  "skipped": []
}
```

<Warning>
  This ability applies all available updates including WordPress core. Test on staging sites before running against production environments.
</Warning>

***

## Related Resources

* [Abilities API Overview](/api-reference/abilities-api/overview) - API basics and authentication
* [Sites Abilities](/api-reference/abilities-api/sites) - Site management abilities
* [REST API Updates](/api-reference/rest-api/updates) - REST API alternative for updates
* [Manage Updates](/sites/updates/manage-updates) - Update management in Dashboard


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.