---
title: "Bulk update Attack discoveries"
method: POST
path: "/api/attack_discovery/_bulk"
tags: ["Security Attack discovery API"]
---

# Bulk update Attack discoveries

`POST /api/attack_discovery/_bulk`

**Spaces method and path for this operation:**

<div><span class="operation-verb post">post</span>&nbsp;<span class="operation-path">/s/{space_id}/api/attack_discovery/_bulk</span></div>

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

Performs bulk updates on multiple Attack discoveries, including workflow status changes and visibility settings. This endpoint allows efficient batch processing of alert modifications without requiring individual API calls for each alert.

## Request body

- object
  - `update` object, required — Configuration object containing all parameters for the bulk update operation
    - `enable_field_rendering` boolean — Enables a markdown syntax used to render pivot fields, for example `{{ user.name james }}`. When disabled, the same example would be rendered as `james`. This is primarily used for Attack Discovery views within Kibana. Defaults to `false`.
    - `ids` string[], required — Array of Attack Discovery IDs to update
    - `kibana_alert_workflow_status` 'open' | 'acknowledged' | 'closed' — When provided, update the kibana.alert.workflow_status of the attack discovery alerts
    - `visibility` 'not_shared' | 'shared' — When provided, update the visibility of the alert, as determined by the kibana.alert.attack_discovery.users field
    - `with_replacements` boolean — When true, returns the updated Attack discoveries with text replacements applied to the detailsMarkdown, entitySummaryMarkdown, summaryMarkdown, and title fields. This substitutes anonymized values with human-readable equivalents. Defaults to `true`.

## Response `200`

Indicates a successful call.

- object
  - `data` SecurityAttackDiscoveryAPIAttackDiscoveryApiAlert[], required — Array of updated Attack Discovery alert objects. Each item includes the applied modifications from the bulk update request.
    - `alert_ids` string[], required — The alert IDs that the attack discovery is based on
    - `alert_rule_uuid` string — The optional kibana.alert.rule.uuid of the rule that generated this attack discovery (not applicable to ad hock runs)
    - `alert_start` string — The optional time the attack discovery alert was created
    - `alert_updated_at` string — The optional time the attack discovery alert was last updated
    - `alert_updated_by_user_id` string — The optional id of the user who last updated the attack discovery alert
    - `alert_updated_by_user_name` string — The optional username of the user who updated the attack discovery alert
    - `alert_workflow_status` string — The optional kibana.alert.workflow_status of this attack discovery
    - `alert_workflow_status_updated_at` string — The optional time the attack discovery alert workflow status was last updated
    - `assignees` string[] — The optional array of user-IDs who have been assigned the attack
    - `connector_id` string, required — The ID of the connector that generated the attack discovery
    - `connector_name` string, required — The (human readable) name of the connector that generated the attack discovery
    - `details_markdown` string, required — Details of the attack with bulleted markdown that always uses special syntax for field names and values from the source data.
    - `entity_summary_markdown` string — An optional, short (no more than a sentence) summary of the attack discovery featuring only the host.name and user.name fields (when they are applicable), using the same syntax
    - `generation_uuid` string, required — The generation ID of the run that created the attack discovery
    - `id` string, required — The unique ID of the attack discovery
    - `index` string — The concrete Elasticsearch index where this attack discovery is stored
    - `mitre_attack_tactics` string[] — An optional array of MITRE ATT&CK tactic for the attack discovery
    - `replacements` SecurityAttackDiscoveryAPIReplacements — Replacements object used to anonymize/deanonymize messages
    - `risk_score` integer — The optional, (but typically populated after generation) risk score of the alert
    - `summary_markdown` string, required — A markdown summary of attack discovery, using the same syntax
    - `tags` string[] — The optional array of tags assigned the attack
    - `timestamp` string, nonempty, required — A string that represents a timestamp in ISO 8601 format and does not contain only whitespace characters.
    - `title` string, required — A title for the attack discovery, in plain text
    - `user_id` string — The optional id of the user who generated the attack discovery
    - `user_name` string — The optional username of the user who generated the attack discovery, (not applicable to attack discoveries generated by rules)
    - `users` SecurityAttackDiscoveryAPIUser[] — The optional array of users who may view the attack discovery. When empty, (or not present), all users may view the attack discovery.
      - `id` string — User id.
      - `name` string — User name.

## Other responses

- `400` — Bad Request response.

---

[API](https://skmtc.net/elastic/apis/kibana-apis.md) · [All operations](https://skmtc.net/elastic/apis/kibana-apis/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/elastic/kibana-apis/versions/531c9e2a7d23/schema)
