---
type: api
title: List action policies
description: **Spaces method and path for this operation:**
url: https://www.elastic.co/elastic/docs-builder/docs/4493/api/doc/kibana/operation/operation-get-alerting-v2-action-policies
resource: https://www.elastic.co/elastic/docs-builder/docs/4493/api/doc/kibana/operation/operation-get-alerting-v2-action-policies
products:
  - Kibana
---

# List action policies

Availability: Experimental since 9.5

- Server: `https://{kibana_url}`

## Paths

- `GET` `/api/alerting/v2/action_policies`
- `GET` `/s/{space_id}/api/alerting/v2/action_policies`

## Description

Refer to [Spaces](https://www.elastic.co/docs/deploy-manage/manage-spaces) for more information.

Get a paginated list of action policies with optional filtering and sorting.

## Required authorization

- Privileges: `read_alerting-v2-action-policies`

## Authentication

- Api key: `Authorization: <value>`
  These APIs use key-based authentication. You must create an API key and use the encoded value in the request header. For example: `Authorization: ApiKey base64AccessApiKey`
- Basic: `Authorization: Basic <credentials>`

## Query string parameters

- `page` (integer · min: 1 · max: 10000) — optional
  The page number to return. Defaults to 1.
- `per_page` (integer · min: 1 · max: 100) — optional
  The number of action policies to return per page. Defaults to 20.
- `filter` (string · max length: 4096) — optional
  A KQL filter to apply to the action policies. Supported fields: id, name, description, enabled.
- `search` (string · min length: 1 · max length: 256) — optional
  A text string to search across action policy fields.
- `sort_field` (enum) — optional
  The field to sort action policies by.
  Values: `name`, `created_at`, `updated_at`
- `sort_order` (enum) — optional
  The sort direction.
  Values: `asc`, `desc`

## Responses

#### `200`

Returns a paginated list of action policies.

`application/json`

- `items` (object[])
  The list of action policies.
  - `created_at` (string · format: date-time)
    The ISO datetime when the action policy was created.
  - `created_by` (object)
    The actor who created the action policy.
    - `profile_uid` (string) — nullable
      User profile ID of the actor, or `null` when it cannot be resolved.
  - `description` (string)
    A description of the action policy. Omitted when the policy has none.
  - `destinations` (union oneOf[])
    The list of destinations.
    - **type: workflow**
      - `id` (string · min length: 1 · max length: 150)
        The workflow identifier.
      - `type` (enum)
        The destination type.
        Values: `workflow`
  - `enabled` (boolean)
    Whether the action policy is enabled.
  - `grouping` (union oneOf)
    - **mode: per_alert** (`mode: per_alert`)
      one notification per alert lifecycle (default).
      - `mode` (enum)
        Values: `per_alert`
    - **mode: all** (`mode: all`)
      a single notification for all matching alerts.
      - `mode` (enum)
        Values: `all`
    - **mode: per_field** (`mode: per_field`)
      group by the specified `fields`.
      - `mode` (enum)
        Values: `per_field`
      - `fields` (string[] · min items: 1 · max items: 16)
        The fields alerts are grouped by. At least one is required, and no other mode accepts them.
  - `id` (string)
    The unique identifier for the action policy.
  - `matcher` (object)
    Selects the alerts this policy applies to. Set `tags` to match alerts from rules with those routing tags. Set `expression` to a KQL query, which will be evaluated against each alert. <br/><br/> If you set both `tags` and `expression`, an alert must match the tags and the expression for the policy to apply. At least one of `tags` and `expression` must be set, so an empty `matcher` is rejected. Omit `matcher` entirely for a catch-all policy that applies to all alerts.
    - `expression` (string · min length: 1 · max length: 4096)
      A KQL query that's evaluated against each alert. Supported fields are: `alert_id`, `alert_status`, `group_hash`, `last_event_timestamp`, `severity`, and your rule's query output columns under `data.*` (for example, `data.host.name`). Referencing other fields won't work. Omit `matcher.expression` to match on `tags` alone.
    - `tags` (string[] · min items: 1 · max items: 50)
      Routing tags this policy should match. The policy applies to alerts from any rule whose `metadata.routing_tags` include at least one of these tags. An empty array is not accepted. Omit `matcher.tags` to match on `matcher.expression` alone.
  - `name` (string)
    The name of the action policy.
  - `snoozed_until` (string)
    The ISO datetime until which the policy is snoozed. Omitted when the policy is not snoozed.
  - `throttle` (union oneOf)
    - **strategy: on_status_change** (`strategy: on_status_change`)
      notify only on alert status transitions (default for `per_alert`).
      - `strategy` (enum)
        Values: `on_status_change`
    - **strategy: per_status_interval** (`strategy: per_status_interval`)
      notify on transitions and at regular intervals.
      - `strategy` (enum)
        Values: `per_status_interval`
      - `interval` (string · max length: 32)
        The throttle interval duration (e.g. 5m, 1h) that sets the notification cadence.
    - **strategy: time_interval** (`strategy: time_interval`)
      notify at regular intervals regardless of status (default for `all`/`per_field`).
      - `strategy` (enum)
        Values: `time_interval`
      - `interval` (string · max length: 32)
        The throttle interval duration (e.g. 5m, 1h) that sets the notification cadence.
    - **strategy: every_time** (`strategy: every_time`)
      notify on every evaluation cycle (high volume).
      - `strategy` (enum)
        Values: `every_time`
  - `updated_at` (string · format: date-time)
    The ISO datetime when the action policy was last updated.
  - `updated_by` (object)
    The actor who last updated the action policy.
    - `profile_uid` (string) — nullable
      User profile ID of the actor, or `null` when it cannot be resolved.
- `page` (number)
  The current page number.
- `per_page` (number)
  The number of action policies per page.
- `total` (number)
  The number of action policies matching the query. This count is an estimate: results above 10,000 may be reported as 10,000.
#### `400`

Indicates an invalid schema or parameters.

`application/json`

- `code` (string)
  Stable error code you can branch on, for example `INVALID_SCHEDULE` or `RULE_ALREADY_EXISTS`.
- `details` (map string to object)
  Optional extra information about the error, for example field validation issues or the `rule_id` when that ID already exists.
- `error` (string)
  A short human-readable summary of the error category (e.g., "Not Found", "Bad Request"). Subject to change without notice. Do not parse or rely on its content.
- `message` (string)
  A readable explanation of the error. The wording can change without notice. Do not parse this field.
#### `401`

Indicates the request was not authenticated.

`application/json`

- `code` (string)
  Stable error code you can branch on, for example `INVALID_SCHEDULE` or `RULE_ALREADY_EXISTS`.
- `details` (map string to object)
  Optional extra information about the error, for example field validation issues or the `rule_id` when that ID already exists.
- `error` (string)
  A short human-readable summary of the error category (e.g., "Not Found", "Bad Request"). Subject to change without notice. Do not parse or rely on its content.
- `message` (string)
  A readable explanation of the error. The wording can change without notice. Do not parse this field.
#### `403`

Indicates the user does not have the required privileges to perform the request.

`application/json`

- `code` (string)
  Stable error code you can branch on, for example `INVALID_SCHEDULE` or `RULE_ALREADY_EXISTS`.
- `details` (map string to object)
  Optional extra information about the error, for example field validation issues or the `rule_id` when that ID already exists.
- `error` (string)
  A short human-readable summary of the error category (e.g., "Not Found", "Bad Request"). Subject to change without notice. Do not parse or rely on its content.
- `message` (string)
  A readable explanation of the error. The wording can change without notice. Do not parse this field.
#### `500`

Indicates an unexpected server-side error.

`application/json`

- `code` (string)
  Stable error code you can branch on, for example `INVALID_SCHEDULE` or `RULE_ALREADY_EXISTS`.
- `details` (map string to object)
  Optional extra information about the error, for example field validation issues or the `rule_id` when that ID already exists.
- `error` (string)
  A short human-readable summary of the error category (e.g., "Not Found", "Bad Request"). Subject to change without notice. Do not parse or rely on its content.
- `message` (string)
  A readable explanation of the error. The wording can change without notice. Do not parse this field.
#### `503`

Indicates the alerting engine is disabled by the `alerting:v2:enabled` advanced setting.

`application/json`

- `code` (string)
  Stable error code you can branch on, for example `INVALID_SCHEDULE` or `RULE_ALREADY_EXISTS`.
- `details` (map string to object)
  Optional extra information about the error, for example field validation issues or the `rule_id` when that ID already exists.
- `error` (string)
  A short human-readable summary of the error category (e.g., "Not Found", "Bad Request"). Subject to change without notice. Do not parse or rely on its content.
- `message` (string)
  A readable explanation of the error. The wording can change without notice. Do not parse this field.
## Code examples

#### Console

```console
GET kbn:/api/alerting/v2/action_policies
```

#### curl

```curl
curl -X GET "${KIBANA_URL}/api/alerting/v2/action_policies" \
  -H "Authorization: ApiKey ${API_KEY}"
```

## Response examples

#### A page of action policies

```json
{
  "items": [
    {
      "created_at": "2026-01-15T12:00:00.000Z",
      "created_by": {
        "profile_uid": "u_elastic_0"
      },
      "description": "Sends notifications for alerts generated by rules with the production tag.",
      "destinations": [
        {
          "id": "workflow-1",
          "type": "workflow"
        }
      ],
      "enabled": true,
      "grouping": {
        "mode": "per_alert"
      },
      "id": "action-policy-1",
      "matcher": {
        "tags": [
          "production"
        ]
      },
      "name": "Notify on production alerts",
      "throttle": {
        "strategy": "on_status_change"
      },
      "updated_at": "2026-01-15T12:00:00.000Z",
      "updated_by": {
        "profile_uid": "u_elastic_0"
      }
    }
  ],
  "page": 1,
  "per_page": 20,
  "total": 1
}
```

#### Indicates an invalid schema or parameters.

```json
{
  "code": "BAD_REQUEST",
  "details": {
    "errors": {
      "errors": [],
      "properties": {
        "page": {
          "errors": [
            "Too small: expected number to be \u003E=1"
          ]
        }
      }
    }
  },
  "error": "Bad Request",
  "message": "page: Too small: expected number to be \u003E=1"
}
```

#### Request was not authenticated

```json
{
  "code": "UNAUTHORIZED",
  "error": "Unauthorized",
  "message": "Authentication required to access this API."
}
```

#### Caller lacks required privileges

```json
{
  "code": "FORBIDDEN",
  "error": "Forbidden",
  "message": "The current user does not have the required privileges for this request."
}
```

#### Unexpected server-side error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "error": "Internal Server Error",
  "message": "An unexpected error occurred."
}
```

#### Alerting V2 is disabled

```json
{
  "code": "ALERTING_DISABLED",
  "error": "Service Unavailable",
  "message": "Alerting is disabled."
}
```

