Replace a case attachment Technical preview; added in 9.6.0

PUT /api/cases/{caseId}/attachments/{attachmentId}

Spaces method and path for this operation:

put /s/{space_id}/api/cases/{caseId}/attachments/{attachmentId}

Refer to Spaces for more information.

Fully replaces an attachment. You cannot change the attachment type or owner. 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.

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.

  • attachmentId string Required

    The ID of the attachment, which is its id field, not attachmentId. To get it, use the find case attachments API.

    Maximum length is 512.

application/json
Body object Required

The full replacement for the attachment. The type and owner must match the existing attachment. Reference attachment types require attachmentId. Value attachment types require data and don't accept attachmentId. Unknown properties are rejected.

One of:

Responses

  • 200 application/json

    Indicates a successful call. Returns the replaced attachment.

    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 is file.
    • The request changes the attachment type or owner.
    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 attachment was not found in the case.

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

    The attachment changed since you read it. Get the latest version and retry.

    Hide response attributes Show response attributes object
    • error string
    • message string
    • statusCode integer
PUT /api/cases/{caseId}/attachments/{attachmentId}
curl \
 --request PUT 'https://localhost:5601/api/cases/9c235210-6834-11ea-a78c-6ffb38a34414/attachments/71ec1870-725b-11ea-a0b2-c51ea50a58e2' \
 --header "Authorization: $API_KEY" \
 --header "Content-Type: application/json" \
 --header "kbn-xsrf: string" \
 --data '{
  "data": {
    "content": "An updated comment."
  },
  "owner": "cases",
  "type": "comment",
  "version": "WzIzLDFd"
}'
Request example
{
  "data": {
    "content": "An updated comment."
  },
  "owner": "cases",
  "type": "comment",
  "version": "WzIzLDFd"
}
Response examples (200)
{
  "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": "An updated comment."
  },
  "id": "8048b460-fe2b-11ec-b15d-779a7c8bbcc3",
  "owner": "cases",
  "pushed_at": null,
  "pushed_by": null,
  "type": "comment",
  "updated_at": "2026-10-01T08:45:21.512Z",
  "updated_by": {
    "email": null,
    "full_name": null,
    "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0",
    "username": "elastic"
  },
  "version": "WzI0LDFd"
}
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
}
Response examples (409)
{
  "error": "Conflict",
  "message": "This attachment has been updated. Please refresh before saving additional updates.",
  "statusCode": 409
}