Spaces method and path for this operation:
Refer to Spaces for more information.
Apply a partial update. A field you omit keeps its stored value, and that applies at every level: send {"matcher": {"tags": ["prod"]}} to change one leaf while leaving its siblings alone. Send null to clear a field, again at any level: {"matcher": {"expression": null}} clears a single leaf, while {"matcher": null} clears a whole object. Lists and variant objects are replaced as a unit rather than merged, since a partly-sent variant could never be valid. The merged result is validated as a whole, so a patch that would leave the resource invalid is rejected with a 400 and nothing is stored.
[Required authorization] Route required privileges: manage_alerting-v2-action-policies AND read_alerting-v2-rules.
Path parameters
-
The ID of the action policy. Copy it from the response when you create a policy, fetch one policy, or fetch the policy list. Chosen at creation and permanent — it cannot be changed afterwards. Re-using the id of a deleted resource is allowed but discouraged: execution history, change history, and alerts recorded under that id are retained and are attributed to the new resource. Ids appear in URLs and logs, so keep them free of sensitive data.
Minimum length is
1, maximum length is150. Format should match the following pattern:^[a-zA-Z0-9_-]+$.
Body
-
A description of the action policy. Absent when the policy has none; send
nullon PATCH to clear it.Minimum length is
1, maximum length is1024. -
The list of destinations. At least one is required.
At least
1but not more than10elements. -
How matched alerts are batched into notifications. Absent falls back to
per_alert; sendnullon PATCH to clear it. The mode decides the rest of the block, so a PATCH replaces it whole: send the complete mode variant rather than a single field. -
Selects the alerts this policy applies to. Set
tagsto match alerts from rules with those routing tags. Setexpressionto a KQL query, which will be evaluated against each alert.
If you set bothtagsandexpression, an alert must match the tags and the expression for the policy to apply. Omitmatcherto keep the stored matcher, or set it tonullfor a catch-all policy that applies to all alerts. An emptymatchernames no leaf and so changes nothing; clearing the last oftagsandexpressionclears the matcher itself, which is also a catch-all.Additional properties are NOT allowed.
-
The name of the action policy.
Minimum length is
1, maximum length is256. -
The throttle configuration for notifications. Absent when notifications are not throttled; send
nullon PATCH to clear it. The strategy decides the rest of the block, so a PATCH replaces it whole: send the complete strategy variant rather than a single field.
Responses
-
Returns the updated action policy.
-
Indicates an invalid schema or parameters.
-
Indicates the request was not authenticated.
-
Indicates the user does not have the required privileges, or the current license does not support action policies. Creating, updating, and enabling action policies requires an active Enterprise license.
-
Indicates an action policy with the given ID does not exist.
-
Indicates the action policy was concurrently updated by another caller.
-
Indicates an unexpected server-side error.
-
Indicates the alerting engine is disabled by the
alerting:v2:enabledadvanced setting.
curl \
--request PATCH 'https://<KIBANA_URL>/api/alerting/v2/action_policies/{id}' \
--header "Authorization: $API_KEY" \
--header "Content-Type: application/json" \
--header "kbn-xsrf: true" \
--data '{
"description": "Updated description.",
"matcher": {
"expression": null,
"tags": [
"production"
]
},
"name": "Notify on production alerts (updated)"
}'
{
"description": "Updated description.",
"matcher": {
"expression": null,
"tags": [
"production"
]
},
"name": "Notify on production alerts (updated)"
}
{
"created_at": "2026-01-15T12:00:00.000Z",
"created_by": {
"profile_uid": "u_elastic_0"
},
"description": "Updated description.",
"destinations": [
{
"id": "workflow-1",
"type": "workflow"
}
],
"enabled": true,
"grouping": {
"mode": "per_alert"
},
"id": "action-policy-1",
"matcher": {
"tags": [
"production"
]
},
"name": "Notify on production alerts (updated)",
"throttle": {
"strategy": "on_status_change"
},
"updated_at": "2026-01-15T12:00:00.000Z",
"updated_by": {
"profile_uid": "u_elastic_0"
}
}
{
"code": "INVALID_ACTION_POLICY_DATA",
"details": {
"context": "update",
"errors": {
"errors": [],
"properties": {
"name": {
"errors": [
"Invalid input: expected string, received undefined"
]
}
}
}
},
"error": "Bad Request",
"message": "Error validating update action policy data - name: Invalid input: expected string, received undefined"
}
{
"code": "UNAUTHORIZED",
"error": "Unauthorized",
"message": "Authentication required to access this API."
}
{
"code": "ACTION_POLICY_LICENSE_NOT_SUPPORTED",
"details": {
"current_license": "basic",
"license_status": "active",
"required_license": "enterprise"
},
"error": "Forbidden",
"message": "Action policies require an active enterprise license"
}
{
"code": "FORBIDDEN",
"error": "Forbidden",
"message": "The current user does not have the required privileges for this request."
}
{
"code": "ACTION_POLICY_NOT_FOUND",
"details": {
"action_policy_id": "action-policy-1"
},
"error": "Not Found",
"message": "Action policy with ID \"action-policy-1\" not found"
}
{
"code": "ACTION_POLICY_VERSION_CONFLICT",
"details": {
"action_policy_id": "action-policy-1"
},
"error": "Conflict",
"message": "Action policy with ID \"action-policy-1\" has already been updated by another user"
}
{
"code": "INTERNAL_SERVER_ERROR",
"error": "Internal Server Error",
"message": "An unexpected error occurred."
}
{
"code": "ALERTING_DISABLED",
"error": "Service Unavailable",
"message": "Alerting is disabled."
}