---
title: "Add String/Asset Comment"
method: POST
path: "/projects/{projectId}/comments"
tags: ["String/Asset Comments"]
---

# Add String/Asset Comment

`POST /projects/{projectId}/comments`

## Request

- Base URL: `https://api.crowdin.com/api/v2`
- URL: `https://api.crowdin.com/api/v2/projects/{projectId}/comments`
- Auth: none declared
- TypeScript: <https://skmtc.dev/crowdin/apis/crowdin-enterprise-api-v2/docs/projects/:projectId/comments/post.ts> (a function with typed inputs; its response is checked against the schema)

**Required scopes:** `project.source.string` (Read and Write).

Add a comment or issue to a string or asset. Use the oneOf pattern:
- **String type**: Use `stringId`
- **Asset type**: Use `fileId`

## Path parameters

- `projectId` integer, required

## Request body

- union
  - EnterpriseStringCommentCreateForm
    - `stringId` integer, required: String Identifier. Get via [List Strings](#operation/api.projects.strings.getMany)
    - `text` string, required
    - `type` 'comment' | 'issue', required: Defines comment or issue
    - `targetLanguageId` string: Target Language Identifier. Get via [List Supported Languages](#operation/api.languages.getMany)
    - `isShared` boolean: Defines shared comment or issue
    - `issueType` 'general_question' | 'translation_mistake' | 'context_request' | 'source_mistake': Defines issue type
    - `attachments` object[]: List of attachments to be added to the comment. Each object must contain id (Storage Identifier). Get via [List Storages](#operation/api.storages.getMany)
      - `id` integer: Storage Identifier. Get via [List Storages](#operation/api.storages.getMany)
  - EnterpriseAssetCommentCreateForm
    - `fileId` integer, required: File Identifier. Get via [List Files](#operation/api.projects.files.getMany)
    - `text` string, required
    - `type` 'comment' | 'issue', required: Defines comment or issue
    - `targetLanguageId` string: Target Language Identifier. Get via [List Supported Languages](#operation/api.languages.getMany)
    - `isShared` boolean: Defines shared comment or issue
    - `issueType` 'general_question' | 'translation_mistake' | 'context_request' | 'source_mistake': Defines issue type
    - `attachments` object[]: List of attachments to be added to the comment. Each object must contain id (Storage Identifier). Get via [List Storages](#operation/api.storages.getMany)
      - `id` integer: Storage Identifier. Get via [List Storages](#operation/api.storages.getMany)

## Response `201`

String/Asset Comment was successfully created

- union
  - EnterpriseStringCommentResource: Base schema of resource container. Container is a wrapper object that contains payload in required `data` property and provides space for adding any other metadata.
    - `data` EnterpriseStringComment, required: String/Asset Comment Response Model. For string comments, `stringId` is provided and `fileId` is null. For asset comments, `fileId` is provided and `stringId` is null.
      - `id` integer: Comment ID
      - `isShared` boolean: Whether the comment is shared
      - `text` string: Comment text
      - `userId` integer: User ID
      - `user` object: User object
        - `id` integer: User ID
        - `username` string: User username
        - `fullName` string: User full name
        - `avatarUrl` string: User avatar URL
      - `projectId` integer: Project ID
      - `languageId` string: Language ID
      - `type` 'comment' | 'issue': Comment type
      - `issueType` 'general_question' | 'translation_mistake' | 'context_request' | 'source_mistake': Issue type
      - `issueStatus` 'resolved' | 'unresolved': Issue status
      - `resolverId` integer: Resolver ID
      - `senderOrganization` object: Sender organization object
        - `id` integer: Sender organization ID
        - `domain` string: Sender organization domain
      - `resolverOrganization` object: Resolver organization object
        - `id` integer: Resolver organization ID
        - `domain` string: Resolver organization domain
      - `resolver` object: Resolver object
        - `id` integer: Resolver ID
        - `username` string: Resolver username
        - `fullName` string: Resolver full name
        - `avatarUrl` string: Resolver avatar URL
      - `resolvedAt` string, date-time: Resolved at
      - `createdAt` string, date-time: Created at
      - `attachments` object[]: List of attachments added to the comment
        - `id` integer: Attachment ID
        - `name` string: Original file name
        - `mime` string: MIME type
        - `size` integer: File size in bytes
        - `category` string: Attachment category (image, video, audio, document, other)
        - `thumbnailUrl` string, nullable: Thumbnail URL
        - `url` string: Preview URL
        - `downloadUrl` string: Download URL
      - `stringId` integer: String ID
      - `string` object: String object
        - `id` integer: String ID
        - `text` string: String text
        - `type` string: String type
        - `hasPlurals` boolean: Whether the string has plurals
        - `isIcu` boolean: Whether the string is ICU
        - `context` string: String context
        - `fileId` integer: File ID
  - EnterpriseAssetCommentResource: Base schema of resource container. Container is a wrapper object that contains payload in required `data` property and provides space for adding any other metadata.
    - `data` EnterpriseAssetComment, required: String/Asset Comment Response Model. For string comments, `stringId` is provided and `fileId` is null. For asset comments, `fileId` is provided and `stringId` is null.
      - `id` integer: Comment ID
      - `isShared` boolean: Whether the comment is shared
      - `text` string: Comment text
      - `userId` integer: User ID
      - `user` object: User object
        - `id` integer: User ID
        - `username` string: User username
        - `fullName` string: User full name
        - `avatarUrl` string: User avatar URL
      - `projectId` integer: Project ID
      - `languageId` string: Language ID
      - `type` 'comment' | 'issue': Comment type
      - `issueType` 'general_question' | 'translation_mistake' | 'context_request' | 'source_mistake': Issue type
      - `issueStatus` 'resolved' | 'unresolved': Issue status
      - `resolverId` integer: Resolver ID
      - `senderOrganization` object: Sender organization object
        - `id` integer: Sender organization ID
        - `domain` string: Sender organization domain
      - `resolverOrganization` object: Resolver organization object
        - `id` integer: Resolver organization ID
        - `domain` string: Resolver organization domain
      - `resolver` object: Resolver object
        - `id` integer: Resolver ID
        - `username` string: Resolver username
        - `fullName` string: Resolver full name
        - `avatarUrl` string: Resolver avatar URL
      - `resolvedAt` string, date-time: Resolved at
      - `createdAt` string, date-time: Created at
      - `attachments` object[]: List of attachments added to the comment
        - `id` integer: Attachment ID
        - `name` string: Original file name
        - `mime` string: MIME type
        - `size` integer: File size in bytes
        - `category` string: Attachment category (image, video, audio, document, other)
        - `thumbnailUrl` string, nullable: Thumbnail URL
        - `url` string: Preview URL
        - `downloadUrl` string: Download URL
      - `fileId` integer: File ID
      - `file` object: File object for asset comments
        - `id` integer: File ID
        - `name` string: Asset filename
        - `type` string: File type
        - `context` string: Asset context

## Other responses

- `400`: Invalid Request Parameters
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Project with specified id was not found
- `405`: Method Not Allowed
- `503`: Service Unavailable

---

[API](https://skmtc.dev/crowdin/apis/crowdin-enterprise-api-v2.md) - [All operations](https://skmtc.dev/crowdin/apis/crowdin-enterprise-api-v2/llms.txt) - [OpenAPI document](https://skmtc.dev/crowdin/apis/crowdin-enterprise-api-v2/revisions/dc68744c5384?raw)
