> ## Documentation Index
> Fetch the complete documentation index at: https://docs.developers.nerds.nl/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a comment on a ticket

> Adds a new comment to the ticket identified by `id`.
If `id` is provided in the body and a comment with that ID
already exists, it is updated (idempotent).




## OpenAPI

````yaml openapi.yaml post /ticket/{id}/comment
openapi: 3.1.0
info:
  title: Thalamus Partner API
  description: >
    API for external systems (n8n, Zendesk connectors, etc.) to create and
    manage

    tickets, contacts, organizations, and comments in Thalamus.


    ## Authentication

    All endpoints require a Bearer token in the Authorization header.

    API keys are issued per partner and follow the format
    `nerds_{environment}_{random}`.

    The partner context (partner_uuid) is derived from the API key — no need to
    pass it in the request body.


    ## Conventions

    - All create/update endpoints are idempotent (upsert) — if the `id` already
    exists for the partner, the record is updated.

    - IDs in path parameters and request/response bodies refer to the canonical
    identifiers from the partner's source system (e.g., Zendesk ticket ID).

    - Timestamps use ISO 8601 format.

    - All responses follow `{ success, data?, message?, error? }` shape.

    - POST returns `201` when a new record is created, `200` when an existing
    record is updated.

    - Only provided fields are updated — omitted fields remain unchanged
    (partial update).
  version: 1.3.0
  contact:
    name: Thalamus Engineering
    email: development@nerds.nl
servers:
  - url: https://thalamus.nerds.nl/api/v1/partner
    description: Production
  - url: http://localhost:3001/api/v1/partner
    description: Local development
security:
  - BearerAuth: []
tags:
  - name: Tickets
    description: Create, update, and retrieve tickets
  - name: Comments
    description: Create comments on tickets
  - name: Contacts
    description: Create, update, and retrieve contacts
  - name: Organizations
    description: Create, update, and retrieve organizations
  - name: Tasks
    description: Create task records (callbacks, appointments, etc.)
  - name: References
    description: Manage reference data (statuses, types, groups, categories, agents)
paths:
  /ticket/{id}/comment:
    post:
      tags:
        - Comments
      summary: Create a comment on a ticket
      description: |
        Adds a new comment to the ticket identified by `id`.
        If `id` is provided in the body and a comment with that ID
        already exists, it is updated (idempotent).
      operationId: createComment
      parameters:
        - $ref: '#/components/parameters/TicketId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CommentCreateBody'
      responses:
        '200':
          description: Comment updated (existing ID)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommentResponse'
        '201':
          description: Comment created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommentResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  parameters:
    TicketId:
      name: id
      in: path
      required: true
      description: Ticket ID from the source system (e.g., Zendesk ticket ID)
      schema:
        type: string
        example: '328099'
  schemas:
    CommentCreateBody:
      type: object
      required:
        - body
      properties:
        id:
          type: string
          nullable: true
          description: >-
            Comment ID (for idempotent upsert). If provided and already exists,
            the comment is updated.
          example: CMT-98765
        contact_id:
          type: string
          nullable: true
          description: Contact ID of the comment author (if customer)
          example: C-10042
        agent_id:
          type: string
          nullable: true
          description: Agent ID of the comment author (if agent)
          example: AGT-42
        body:
          type: string
          description: Comment body (HTML or plain text)
          example: <p>Customer called again about the issue.</p>
        visibility:
          type: string
          enum:
            - public
            - internal
            - private
          default: public
          description: Comment visibility
        created_at:
          type: string
          format: date-time
          nullable: true
          description: Original creation timestamp
          example: '2026-03-09T14:20:00Z'
    CommentResponse:
      type: object
      properties:
        success:
          type: boolean
          example: true
        data:
          type: object
          properties:
            uuid:
              type: string
              format: uuid
            id:
              type: string
              nullable: true
              description: Comment ID (from source system)
            ticket_id:
              type: string
              description: Parent ticket ID
            body:
              type: string
            visibility:
              type: string
              enum:
                - public
                - internal
                - private
            created_at:
              type: string
              format: date-time
        message:
          type: string
    ErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: false
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
            details:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  field:
                    type: string
                  message:
                    type: string
  responses:
    BadRequest:
      description: Invalid request body or parameters
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error:
              code: INVALID_REQUEST
              message: 'Validation failed: body is required'
    Unauthorized:
      description: Missing or invalid API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error:
              code: UNAUTHORIZED
              message: Invalid or revoked API key
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error:
              code: NOT_FOUND
              message: Resource not found
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: Partner API key (e.g. `nerds_live_a8f3d9k2m5n7p1q4r6t8v0w2x4y6z8`)

````