Create a case attachment Technical preview; added in 9.6.0

POST /api/cases/{caseId}/attachments

Spaces method and path for this operation:

post /s/{space_id}/api/cases/{caseId}/attachments

Refer to Spaces for more information.

Adds a single attachment, such as a comment or an alert, to a case. You must have all privileges for the Cases feature in the Management, Observability, or Security section of the Kibana feature privileges, depending on the owner of the case. NOTE: Each case can have a maximum of 1,000 alerts.

Headers

  • kbn-xsrf string Required

    Cross-site request forgery protection

Path parameters

  • caseId string Required

    The identifier for the case. To retrieve case IDs, use the search cases (_find) API. All non-ASCII characters must be URL encoded.

application/json
Body object Required

The attachment to add to the case. Reference attachment types, such as alerts, require attachmentId. Value attachment types, such as comments, require data and don't accept attachmentId. The owner must match the owner of the case. Unknown properties are rejected.

One of:

Responses

  • 201 application/json

    Indicates a successful call. Returns the new attachment, or the existing one if the alert or event was already attached.

    Hide response attributes Show response attributes object
    • attachmentId string | array[string]

      The ID of the attached item, such as an alert or a dashboard. To attach several alerts, use an array. This isn't the attachment's own ID (id).

    • created_at string(date-time) Required
    • created_by object Required
      Hide created_by attributes Show created_by attributes object
      • email string | null Required
      • full_name string | null Required
      • profile_uid string
      • username string | null Required
    • data object | null

      The attachment's content. Required for comments, where content is the comment text (up to 30,000 characters). In requests, it can be up to 524,288 characters when serialized as JSON and nest up to 30 levels deep.

      Additional properties are allowed.

    • id string Required

      The attachment identifier.

    • metadata object | null

      Extra details about the attachment. For alerts, this is the alert's index and rule. Required for some types, such as dashboard. In requests, it can be up to 524,288 characters when serialized as JSON and nest up to 30 levels deep.

      Additional properties are allowed.

    • owner string Required

      The application that owns the cases: Stack Management, Observability, or Elastic Security.

      Values are cases, observability, or securitySolution.

    • pushed_at string(date-time) | null Required

      When this attachment was last pushed to an external system, such as Jira. Is null if it hasn't been pushed.

    • pushed_by object | null Required
      Hide pushed_by attributes Show pushed_by attributes object | null
      • email string | null Required
      • full_name string | null Required
      • profile_uid string
      • username string | null Required
    • type string Required

      The attachment type, such as comment, security.alert, observability.alert, stack.alert, security.event, lens, dashboard, or file. security.* types only work on Security cases, observability.* on Observability cases, and stack.* on Stack Management cases. Use comment (not the legacy user type) and a *.alert type (not alert). You can't add or replace file attachments with this API. To add a file, use POST /api/cases/{caseId}/files.

    • updated_at string(date-time) | null Required
    • updated_by object | null Required
      Hide updated_by attributes Show updated_by attributes object | null
      • email string | null Required
      • full_name string | null Required
      • profile_uid string
      • username string | null Required
    • version string Required

      The attachment's current version. Include it when you replace the attachment.

  • 400 application/json

    The request failed for one of these reasons:

    • The request body is invalid.
    • The attachment type isn't registered, or is file.
    • The owner doesn't match the case owner.
    • A case limit was exceeded.
    Hide response attributes Show response attributes object
    • error string
    • message string
    • statusCode integer
  • 401 application/json

    Authorization information is missing or invalid.

    Hide response attributes Show response attributes object
    • error string
    • message string
    • statusCode integer
  • 403 application/json

    You don't have the required privileges for this case.

    Hide response attributes Show response attributes object
    • error string
    • message string
    • statusCode integer
  • 404 application/json

    The case was not found.

    Hide response attributes Show response attributes object
    • error string
    • message string
    • statusCode integer
POST /api/cases/{caseId}/attachments
curl \
 --request POST 'https://localhost:5601/api/cases/9c235210-6834-11ea-a78c-6ffb38a34414/attachments' \
 --header "Authorization: $API_KEY" \
 --header "Content-Type: application/json" \
 --header "kbn-xsrf: string" \
 --data '{
  "attachmentId": "6b24c4dc44bc720cfc92797f3d61fff952f2b2627db1fb4f8cc49f4530c4ff42",
  "metadata": {
    "index": ".internal.alerts-security.alerts-default-000001",
    "rule": {
      "id": "94309390-b76c-11ee-b4d6-39d8a0fcbc1b",
      "name": "Endpoint Security"
    }
  },
  "owner": "securitySolution",
  "type": "security.alert"
}'
Request examples
{
  "attachmentId": "6b24c4dc44bc720cfc92797f3d61fff952f2b2627db1fb4f8cc49f4530c4ff42",
  "metadata": {
    "index": ".internal.alerts-security.alerts-default-000001",
    "rule": {
      "id": "94309390-b76c-11ee-b4d6-39d8a0fcbc1b",
      "name": "Endpoint Security"
    }
  },
  "owner": "securitySolution",
  "type": "security.alert"
}
{
  "data": {
    "content": "A new comment."
  },
  "owner": "cases",
  "type": "comment"
}
Response examples (201)
{
  "created_at": "2026-09-30T19:32:13.104Z",
  "created_by": {
    "email": null,
    "full_name": null,
    "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0",
    "username": "elastic"
  },
  "data": {
    "content": "A new comment."
  },
  "id": "8048b460-fe2b-11ec-b15d-779a7c8bbcc3",
  "owner": "cases",
  "pushed_at": null,
  "pushed_by": null,
  "type": "comment",
  "updated_at": null,
  "updated_by": null,
  "version": "WzIzLDFd"
}
Response examples (400)
{
  "error": "Bad Request",
  "message": "Invalid attachment payload for type 'comment': data.content: Comment content must be a non-empty string",
  "statusCode": 400
}
Response examples (401)
{
  "error": "Unauthorized",
  "message": "Unable to authenticate with the provided credentials.",
  "statusCode": 401
}
Response examples (403)
{
  "error": "Forbidden",
  "message": "Unauthorized to access cases",
  "statusCode": 403
}
Response examples (404)
{
  "error": "Not Found",
  "message": "Saved object [cases-template/9da1ea2a-09f8-4d0e-bf9d-09bf8c9d0f42] not found",
  "statusCode": 404
}