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

# Add internal note

> Add a private internal note to a native-ticketing conversation.

Creates a new internal-note event in a conversation without sending a customer-facing message or generating an AI response. Native ticketing must be enabled for the workspace, and the conversation must have a widget or email source.

Unlike [Add feedback note](/en/api-reference/add-conversation-feedback-note), this endpoint creates a new event rather than annotating an existing response. It does not post a note to an external helpdesk.

## Headers

<ParamField header="Authorization" type="string" required>
  Bearer token containing your Fini workspace API key. Format: `Bearer fini_...`. The key needs `write` scope.
</ParamField>

<ParamField header="Content-Type" type="string" required>
  Send `application/json`.
</ParamField>

## Path parameters

<ParamField path="id" type="string" required>
  ID of a widget or email conversation in the authenticated workspace.
</ParamField>

## Body parameters

<ParamField body="content" type="string" required>
  Note text. Leading and trailing whitespace is trimmed; the result must not be empty. This endpoint accepts text, not attachments.
</ParamField>

<RequestExample>
  ```bash cURL theme={null}
  curl --request POST \
    --url 'https://api-prod.usefini.com/v2/hc-interactions/0b8626b0-4cc8-4a3d-8fc2-f18ad1a4a1a8/internal-note/public' \
    --header 'Authorization: Bearer fini_your_api_key' \
    --header 'Content-Type: application/json' \
    --data '{"content": "Billing review complete. Follow up with the customer tomorrow."}'
  ```

  ```javascript Node.js theme={null}
  const conversationId = "0b8626b0-4cc8-4a3d-8fc2-f18ad1a4a1a8";
  const response = await fetch(
    `https://api-prod.usefini.com/v2/hc-interactions/${conversationId}/internal-note/public`,
    {
      method: "POST",
      headers: {
        Authorization: "Bearer fini_your_api_key",
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        content: "Billing review complete. Follow up with the customer tomorrow.",
      }),
    }
  );
  if (!response.ok) throw new Error(`Request failed: ${response.status}`);
  const note = await response.json();
  ```

  ```python Python theme={null}
  import requests

  conversation_id = "0b8626b0-4cc8-4a3d-8fc2-f18ad1a4a1a8"
  response = requests.post(
      f"https://api-prod.usefini.com/v2/hc-interactions/{conversation_id}/internal-note/public",
      headers={"Authorization": "Bearer fini_your_api_key"},
      json={
          "content": "Billing review complete. Follow up with the customer tomorrow.",
      },
      timeout=30,
  )
  response.raise_for_status()
  note = response.json()
  ```
</RequestExample>

## Response

Returns `201 Created` with a single public event object, not an array or a success wrapper.

<ResponseField name="id" type="string">
  ID of the newly created event.
</ResponseField>

<ResponseField name="interactionId" type="string">
  Conversation ID supplied in the path.
</ResponseField>

<ResponseField name="createdAt" type="number">
  Event creation time as a Unix timestamp in milliseconds.
</ResponseField>

<ResponseField name="role" type="string">
  `agent` for the internal note.
</ResponseField>

<ResponseField name="type" type="string">
  `internalnote`.
</ResponseField>

<ResponseField name="message" type="string">
  The trimmed note text supplied as `content`.
</ResponseField>

The event also includes the standard public-event feedback, external-reference, attachment, tag, and article fields. The empty arrays in this example are intentional: a newly created text note has no attachments, tags, or retrieved articles. Private author metadata is not included in this public response.

<ResponseExample>
  ```json 201 Created theme={null}
  {
    "id": "f61a9a11-2c3b-4704-8f57-7078854d87cf",
    "interactionId": "0b8626b0-4cc8-4a3d-8fc2-f18ad1a4a1a8",
    "createdAt": 1792010400000,
    "role": "agent",
    "type": "internalnote",
    "message": "Billing review complete. Follow up with the customer tomorrow.",
    "externalId": null,
    "externalCreatedAt": null,
    "csatRating": null,
    "feedback": null,
    "approved": null,
    "resolved": null,
    "attachments": [],
    "tags": [],
    "usedArticles": []
  }
  ```
</ResponseExample>

## Errors

<AccordionGroup>
  <Accordion title="400 Bad Request" icon="circle-exclamation">
    `content` is missing, is not a string, or is empty after trimming; or the conversation source is not widget or email.
  </Accordion>

  <Accordion title="401 Unauthorized" icon="lock">
    The workspace API key is missing or invalid.
  </Accordion>

  <Accordion title="403 Forbidden" icon="shield-halved">
    The API key lacks `write` scope, or native ticketing is not enabled for the workspace.
  </Accordion>

  <Accordion title="404 Not Found" icon="ban">
    The conversation cannot be accessed in the authenticated workspace.
  </Accordion>
</AccordionGroup>

## Related topics

* [Conversations API](/en/api-reference/conversations)
* [Get conversation](/en/api-reference/get-conversation)
* [Add feedback note](/en/api-reference/add-conversation-feedback-note)


## Related topics

- [Add feedback note](/en/api-reference/add-conversation-feedback-note.md)
- [Email](/en/deploy/email.md)
- [Overview](/en/api-reference/conversations.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.