### Get Bucket Detail Request Example Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Example of how to make a GET request to retrieve the details of a specific bucket using C# HttpClient. Ensure the bucket name is correctly formatted in the URL. ```csharp using var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://api.kissgroup.io/v1/kissdata/buckets/{bucket_name}"); using var response = await client.SendAsync(request); ``` -------------------------------- ### Get Tickets Request Example Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Example of how to make a GET request to the /v1/tickets endpoint using C# HttpClient. Includes common query parameters for filtering and pagination. ```csharp using var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://api.kissgroup.io/v1/tickets?page=1&pagesize=25&status_id=1&type_id=1&product_id=1&service_id=&q="); using var response = await client.SendAsync(request); ``` -------------------------------- ### Download Ticket Attachment (C# HttpClient) Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Example of how to initiate a GET request to download a ticket attachment using C#'s HttpClient. Ensure you replace '{file_key}' with the actual file key. ```csharp using var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://api.kissgroup.io/v1/tickets/1/files/{file_key}"); using var response = await client.SendAsync(request); ``` -------------------------------- ### C# HttpClient Request for Ticket Priorities Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Example of how to make a GET request to retrieve ticket priorities using C# HttpClient. Ensure you have the necessary API key and scope (`tickets:read`). ```csharp using var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://api.kissgroup.io/v1/tickets/priorities"); using var response = await client.SendAsync(request); ``` -------------------------------- ### List Ticket Products Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Retrieves a list of all products for which tickets can be opened, such as KissLink or KissMobile. This list can be used to filter tickets via the `product_id` parameter in the GET /v1/tickets endpoint. Requires the 'tickets:read' scope. ```csharp using var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://api.kissgroup.io/v1/tickets/products"); using var response = await client.SendAsync(request); ``` -------------------------------- ### Get Current User Information Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Retrieves information about the currently authenticated user. ```APIDOC ## GET /v1/me ### Description Retrieves information about the currently authenticated user. ### Method GET ### Endpoint /v1/me ### Authentication API Key in header: `Authorization: Bearer ` ``` -------------------------------- ### List Buckets Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Retrieves a list of all KissData buckets associated with your account. You can filter by client code and paginate the results. The response includes bucket size and object count. For detailed connection information (S3 credentials), use the bucket name with the GET /v1/kissdata/buckets/{bucket_name} endpoint. ```APIDOC ## GET /v1/kissdata/buckets ### Description Récupère tous tes buckets KissData avec leur taille et leur nombre d'objets. Filtre sur un client avec `client_code`. 50 par page (max 200). Utilise le `bucket_name` retourné pour récupérer le détail complet (infos de connexion S3) avec `GET /v1/kissdata/buckets/{bucket_name}`. **Scope requis** : `kissdata:buckets:read` ### Method GET ### Endpoint /v1/kissdata/buckets ### Parameters #### Query Parameters - **page** (integer | string) - Optional - Which page to fetch (starts at 1). Default: 1 - **pagesize** (integer | string) - Optional - How many buckets per page (1–200). Default: 50 - **client_code** (string) - Optional - Only show buckets for this client. ### Response #### Success Response (200) Your buckets - **page** (integer) - The current page number. - **pagesize** (integer) - The number of items per page. - **total** (integer) - The total number of items available. - **items** (array) - A list of bucket objects. - **client_code** (string) - The client code associated with the bucket. - **client_name** (string) - The name of the client. - **bucket_name** (string) - The name of the bucket. - **bucket_size** (integer) - The size of the bucket in bytes. - **bucket_object** (integer) - The number of objects in the bucket. #### Response Example (200) ```json { "page": 1, "pagesize": 1, "total": 1, "items": [ { "client_code": null, "client_name": null, "bucket_name": null, "bucket_size": 1, "bucket_object": 1 } ] } ``` #### Error Responses - **401** - Missing or invalid API key - **403** - Your API key isn't allowed to read buckets - **429** - Too many requests — slow down ``` -------------------------------- ### Get Tickets Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Retrieves a paginated list of tickets. Supports filtering by status, type, product, service, and a general search query. Requires `tickets:read` scope. ```APIDOC ## GET /v1/tickets ### Description Retrieves a paginated list of tickets, sorted by last activity. Supports filtering by status, type, product, service, and a general search query. ### Method GET ### Endpoint /v1/tickets ### Parameters #### Query Parameters - **page** (integer) - Optional - Index of the page (1-based). Defaults to 1. - **pagesize** (integer) - Optional - Items per page (1–200). Defaults to 25. - **status_id** (integer) - Optional - Filter by status. See `GET /v1/tickets/statuses`. - **type_id** (integer) - Optional - Filter by type. See `GET /v1/tickets/types`. - **product_id** (integer) - Optional - Filter by product. See `GET /v1/tickets/products`. - **service_id** (string) - Optional - Filter by underlying service (`link_code`, `line_code`, `trunk_code`, etc.). - **q** (string) - Optional - Free search on subject / ticket ID / requester name and email / service ID. ### Request Example ```csharp using var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://api.kissgroup.io/v1/tickets?page=1&pagesize=25&status_id=1&type_id=1&product_id=1&service_id=&q="); using var response = await client.SendAsync(request); ``` ### Response #### Success Response (200) - **page** (integer) - The current page number. - **pagesize** (integer) - The number of items per page. - **total** (integer) - The total number of tickets available. - **items** (array) - A list of ticket objects. - **ticket_id** (integer) - The unique identifier for the ticket. - **ticket_subject** (string) - The subject of the ticket. - **ticket_status** (string) - The current status of the ticket. - **ticket_type** (string) - The type of the ticket. - **ticket_product** (string) - The product associated with the ticket. - **ticket_service_id** (string) - The ID of the underlying service. - **client_code** (string) - The client code associated with the ticket. - **client_name** (string) - The name of the client. - **ticket_priority** (string) - The priority of the ticket. - **requester_name** (string) - The name of the person who requested the ticket. - **requester_email** (string) - The email of the person who requested the ticket. - **primary_agent_name** (string) - The name of the primary agent assigned to the ticket. - **ticket_creation_date** (string) - The date and time the ticket was created. - **ticket_last_update** (string) - The date and time of the last update to the ticket. #### Response Example ```json { "page": 1, "pagesize": 1, "total": 1, "items": [ { "ticket_id": 1, "ticket_subject": null, "ticket_status": null, "ticket_type": null, "ticket_product": null, "ticket_service_id": null, "client_code": null, "client_name": null, "ticket_priority": null, "requester_name": null, "requester_email": null, "primary_agent_name": null, "ticket_creation_date": null, "ticket_last_update": null } ] } ``` ### Error Handling - **401**: Missing or invalid API key. - **403**: Your API key isn't allowed to read tickets. - **429**: Too many requests — slow down. ``` -------------------------------- ### Get Bucket Detail Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Retrieves the complete details of a specific bucket, including its S3 connection information such as endpoint URL, region, access key, and secret key. The secret key should be treated as a password. ```APIDOC ## GET /v1/kissdata/buckets/{bucket_name} ### Description Retrieves the complete details of a specific bucket, including its S3 connection information. ### Method GET ### Endpoint /v1/kissdata/buckets/{bucket_name} ### Parameters #### Path Parameters - **bucket_name** (string) - Required - Name of the bucket as returned by `GET /v1/kissdata/buckets`. ### Responses #### Success Response (200) Bucket detail - **client_code** (string) - null - **client_name** (string) - null - **bucket_name** (string) - null - **bucket_size** (integer) - 1 - **bucket_object** (integer) - 1 - **date_creation** (string) - null - **object_lock_enabled** (boolean) - true - **versioning_enabled** (boolean) - true - **region** (string) - null - **url** (string) - null - **access_key** (string) - null - **secret_key** (string) - null #### Error Responses - **401** - Missing or invalid API key - **403** - Your API key isn't allowed to read buckets - **404** - No bucket with this name (or not yours) - **429** - Too many requests — slow down ``` -------------------------------- ### List Ticket Statuses Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Retrieves a list of all possible ticket statuses, including their IDs and names in English and French. This information can be used to filter tickets via the `status_id` parameter in the GET /v1/tickets endpoint. Requires the 'tickets:read' scope. ```csharp using var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://api.kissgroup.io/v1/tickets/statuses"); using var response = await client.SendAsync(request); ``` -------------------------------- ### Get Tickets Response Schema Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Schema for a successful paginated response from the GET /v1/tickets endpoint. It outlines the structure of ticket data returned. ```json { "page": 1, "pagesize": 1, "total": 1, "items": [ { "ticket_id": 1, "ticket_subject": null, "ticket_status": null, "ticket_type": null, "ticket_product": null, "ticket_service_id": null, "client_code": null, "client_name": null, "ticket_priority": null, "requester_name": null, "requester_email": null, "primary_agent_name": null, "ticket_creation_date": null, "ticket_last_update": null } ] } ``` -------------------------------- ### Download Ticket Attachment Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Retrieves a file attached to a ticket. The file_key is the 'url' field from the attachment object obtained from GET /v1/tickets/{ticket_id}. The ticket_id must match the parent ticket of the file. ```APIDOC ## GET /v1/tickets/{ticket_id}/files/{file_key} ### Description Downloads a file attached to a ticket. ### Method GET ### Endpoint /v1/tickets/{ticket_id}/files/{file_key} ### Parameters #### Path Parameters - **ticket_id** (integer) - Required - Ticket to which the file belongs. - **file_key** (string) - Required - Value of the `url` from the attachment object (e.g., `955dbbb5-…_1780672658.pdf`). ### Responses #### Success Response (200) File stream #### Error Responses - **401**: Missing or invalid API key - **403**: Your API key isn't allowed to read tickets - **404**: No such attachment, or it isn't on a ticket of yours - **429**: Too many requests — slow down - **502**: Attachment storage is temporarily unreachable ### Request Example ```csharp using var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://api.kissgroup.io/v1/tickets/1/files/{file_key}"); using var response = await client.SendAsync(request); ``` ### Response Example (200) ```json { "fileStream": {}, "contentType": null, "fileDownloadName": null, "lastModified": null, "entityTag": { "tag": { "buffer": null, "offset": 1, "length": 1, "value": null, "hasValue": true }, "isWeak": true }, "enableRangeProcessing": true } ``` ``` -------------------------------- ### List Ticket Types Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Fetches a list of all available ticket types, including their IDs, names in English and French, and category (Support or Customer Care). This data can be used to filter tickets using the `type_id` parameter in the GET /v1/tickets endpoint. Requires the 'tickets:read' scope. ```csharp using var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://api.kissgroup.io/v1/tickets/types"); using var response = await client.SendAsync(request); ``` -------------------------------- ### Create a KissData Bucket with C# HttpClient Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais This C# code demonstrates how to provision a new KissData bucket. You must provide a bucket name and client code. Optional parameters include enabling object lock and versioning. Remember to securely store the returned access and secret keys. Requires 'kissdata:buckets:write' scope. ```csharp using var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, "https://api.kissgroup.io/v1/kissdata/buckets"); request.Content = new StringContent( """ {"client_code":null,"bucket_name":null,"object_lock_enabled":false,"versioning_enabled":false} """, System.Text.Encoding.UTF8, "application/json-patch+json"); using var response = await client.SendAsync(request); ``` -------------------------------- ### KissHosting — VM templates Operations Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Operations for retrieving VM templates in KissHosting. ```APIDOC ## GET /v1/kisshosting/vm-templates ### Description Retrieves a list of available VM templates. ### Method GET ### Endpoint /v1/kisshosting/vm-templates ``` -------------------------------- ### Create Bucket Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Provisions a new KissData bucket for one of your clients. The response includes full bucket details, including newly issued access and secret keys. It's crucial to store the secret key immediately as it cannot be retrieved later. Object lock and versioning can be enabled at creation time only. ```APIDOC ## POST /v1/kissdata/buckets ### Description Provisionne un nouveau bucket KissData pour un de tes clients. Renvoie `201` avec le détail complet du bucket, y compris l'`access_key` et la `secret_key` fraîchement émises — stocke la clé secrète tout de suite, tu pourras la relire plus tard via `GET /v1/kissdata/buckets/{bucket_name}` mais traite-la comme un mot de passe. Le verrouillage d'objets ne peut être activé qu'à la création et ne peut pas être modifié ensuite. **Scope requis** : `kissdata:buckets:write` ### Method POST ### Endpoint /v1/kissdata/buckets ### Parameters #### Request Body - **bucket_name** (string) - Required - Nom du bucket. Ton `client_code` est ajouté en préfixe automatiquement — envoie uniquement le suffixe (ex: `myapp-data`, pas `k02000-myapp-data`). Lettres minuscules, chiffres et tirets uniquement, 3 à 63 caractères, ne peut ni commencer ni finir par un tiret. - **client_code** (string) - Required - Le client auquel rattacher le bucket (le `client_code` que tu utilises ailleurs sur l'API). - **object_lock_enabled** (boolean) - Optional - Active le verrouillage d'objets S3 à la création. Non modifiable après coup. Default: false - **versioning_enabled** (boolean) - Optional - Active le versioning S3 à la création. Default: false ### Request Example ```json { "client_code": null, "bucket_name": null, "object_lock_enabled": false, "versioning_enabled": false } ``` ### Response #### Success Response (201) Bucket created - **client_code** (string) - The client code associated with the bucket. - **client_name** (string) - The name of the client. - **bucket_name** (string) - The name of the bucket. - **bucket_size** (integer) - The size of the bucket in bytes. - **bucket_object** (integer) - The number of objects in the bucket. - **date_creation** (string) - The date and time the bucket was created. - **object_lock_enabled** (boolean) - Indicates if object lock is enabled. - **versioning_enabled** (boolean) - Indicates if versioning is enabled. - **region** (string) - The AWS region where the bucket is located. - **url** (string) - The URL of the bucket. - **access_key** (string) - The access key for the bucket. - **secret_key** (string) - The secret key for the bucket. #### Response Example (201) ```json { "client_code": null, "client_name": null, "bucket_name": null, "bucket_size": 1, "bucket_object": 1, "date_creation": null, "object_lock_enabled": true, "versioning_enabled": true, "region": null, "url": null, "access_key": null, "secret_key": null } ``` #### Error Responses - **400** - Invalid payload (missing fields, malformed `bucket_name`) - **401** - Missing or invalid API key - **403** - Your API key isn't allowed to create buckets - **404** - Client not found for this partner - **409** - A bucket with this name already exists - **429** - Too many requests — slow down - **502** - The bucket couldn't be provisioned — try again in a moment ``` -------------------------------- ### KissHosting — ISOs Operations Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Operations for managing ISO images in KissHosting. ```APIDOC ## GET /v1/kisshosting/isos ### Description Retrieves a list of available ISO images. ### Method GET ### Endpoint /v1/kisshosting/isos ## POST /v1/kisshosting/isos ### Description Uploads a new ISO image. ### Method POST ### Endpoint /v1/kisshosting/isos ``` -------------------------------- ### KissHosting — VMs Operations Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Operations for managing Virtual Machines (VMs) within KissHosting. ```APIDOC ## GET /v1/kisshosting/vms ### Description Retrieves a list of all virtual machines. ### Method GET ### Endpoint /v1/kisshosting/vms ## POST /v1/kisshosting/vms ### Description Creates a new virtual machine. ### Method POST ### Endpoint /v1/kisshosting/vms ## GET /v1/kisshosting/vms/requests ### Description Retrieves a list of VM creation requests. ### Method GET ### Endpoint /v1/kisshosting/vms/requests ## GET /v1/kisshosting/vms/{vm_id} ### Description Retrieves details for a specific virtual machine. ### Method GET ### Endpoint /v1/kisshosting/vms/{vm_id} #### Path Parameters - **vm_id** (string) - Required - The ID of the virtual machine. ## PATCH /v1/kisshosting/vms/{vm_id} ### Description Updates an existing virtual machine. ### Method PATCH ### Endpoint /v1/kisshosting/vms/{vm_id} #### Path Parameters - **vm_id** (string) - Required - The ID of the virtual machine. ## PATCH /v1/kisshosting/vms/{vm_id}/resources ### Description Updates the resources (CPU, RAM) of a virtual machine. ### Method PATCH ### Endpoint /v1/kisshosting/vms/{vm_id}/resources #### Path Parameters - **vm_id** (string) - Required - The ID of the virtual machine. ## PATCH /v1/kisshosting/vms/{vm_id}/disks/{device} ### Description Updates a specific disk attached to a virtual machine. ### Method PATCH ### Endpoint /v1/kisshosting/vms/{vm_id}/disks/{device} #### Path Parameters - **vm_id** (string) - Required - The ID of the virtual machine. - **device** (string) - Required - The name of the disk device. ## POST /v1/kisshosting/vms/{vm_id}/disks ### Description Adds a new disk to a virtual machine. ### Method POST ### Endpoint /v1/kisshosting/vms/{vm_id}/disks #### Path Parameters - **vm_id** (string) - Required - The ID of the virtual machine. ## POST /v1/kisshosting/vms/{vm_id}/start ### Description Starts a virtual machine. ### Method POST ### Endpoint /v1/kisshosting/vms/{vm_id}/start #### Path Parameters - **vm_id** (string) - Required - The ID of the virtual machine. ## POST /v1/kisshosting/vms/{vm_id}/stop ### Description Stops a virtual machine. ### Method POST ### Endpoint /v1/kisshosting/vms/{vm_id}/stop #### Path Parameters - **vm_id** (string) - Required - The ID of the virtual machine. ## POST /v1/kisshosting/vms/{vm_id}/shutdown ### Description Shuts down a virtual machine. ### Method POST ### Endpoint /v1/kisshosting/vms/{vm_id}/shutdown #### Path Parameters - **vm_id** (string) - Required - The ID of the virtual machine. ## POST /v1/kisshosting/vms/{vm_id}/reboot ### Description Reboots a virtual machine. ### Method POST ### Endpoint /v1/kisshosting/vms/{vm_id}/reboot #### Path Parameters - **vm_id** (string) - Required - The ID of the virtual machine. ## POST /v1/kisshosting/vms/{vm_id}/reset ### Description Resets a virtual machine. ### Method POST ### Endpoint /v1/kisshosting/vms/{vm_id}/reset #### Path Parameters - **vm_id** (string) - Required - The ID of the virtual machine. ## GET /v1/kisshosting/vms/{vm_id}/backups ### Description Retrieves a list of backups for a virtual machine. ### Method GET ### Endpoint /v1/kisshosting/vms/{vm_id}/backups #### Path Parameters - **vm_id** (string) - Required - The ID of the virtual machine. ## POST /v1/kisshosting/vms/{vm_id}/backups ### Description Creates a backup for a virtual machine. ### Method POST ### Endpoint /v1/kisshosting/vms/{vm_id}/backups #### Path Parameters - **vm_id** (string) - Required - The ID of the virtual machine. ``` -------------------------------- ### List KissData Buckets with C# HttpClient Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Use this snippet to retrieve a list of your KissData buckets. You can filter by client code and control pagination. Ensure your API key has the 'kissdata:buckets:read' scope. ```csharp using var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://api.kissgroup.io/v1/kissdata/buckets?page=1&pagesize=50&client_code="); using var response = await client.SendAsync(request); ``` -------------------------------- ### Liste les produits ticket Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Retrieves a list of all products for which tickets can be opened, such as 'KissLink' or 'KissMobile'. The `product_id` can be used for filtering tickets. ```APIDOC ## GET /v1/tickets/products ### Description Retrieves a list of all products for which tickets can be opened. The `product_id` can be used to filter tickets via the `GET /v1/tickets?product_id=` endpoint. ### Method GET ### Endpoint /v1/tickets/products ### Responses #### Success Response (200) - **Products** (array) - A list of ticket product objects. #### Error Responses - **401** - Missing or invalid API key. - **429** - Too many requests — slow down. ### Request Example ```csharp using var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://api.kissgroup.io/v1/tickets/products"); using var response = await client.SendAsync(request); ``` ### Response Example (200) ```json [ { "product_id": 1, "name": null } ] ``` ``` -------------------------------- ### Retrieve a Ticket with Conversation Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Fetches a complete ticket including its conversation history, showing public replies and internal notes. Requires the 'tickets:read' scope. Internal Kissgroup notes are filtered out. ```csharp using var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://api.kissgroup.io/v1/tickets/1"); using var response = await client.SendAsync(request); ``` -------------------------------- ### Reply to Ticket with HttpClient in C# Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Use this snippet to send a reply to a specific ticket via the API. It demonstrates how to construct a multipart/form-data request with various parameters like body, status, and user ID. Ensure your API key has the 'tickets:write' scope. ```csharp using var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, "https://api.kissgroup.io/v1/tickets/1/reply"); var content = new MultipartFormDataContent(); content.Add(new StringContent(""), "body"); content.Add(new StringContent("false"), "is_partner_note"); content.Add(new StringContent("1"), "new_status_id"); content.Add(new StringContent("1"), "user_id"); content.Add(new StringContent("[object File]"), "files"); request.Content = content; using var response = await client.SendAsync(request); ``` -------------------------------- ### KissMobile Plans and Numbers Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Endpoints for retrieving available plans and numbers. ```APIDOC ## GET /v1/kissmobile/plans ### Description Retrieves a list of available mobile plans. ### Method GET ### Endpoint /v1/kissmobile/plans ``` ```APIDOC ## GET /v1/kissmobile/available-numbers ### Description Retrieves a list of available phone numbers. ### Method GET ### Endpoint /v1/kissmobile/available-numbers ``` ```APIDOC ## GET /v1/kissmobile/portability-dates ### Description Retrieves portability dates information. ### Method GET ### Endpoint /v1/kissmobile/portability-dates ``` -------------------------------- ### POST /v1/tickets/{ticket_id}/reply Source: https://api.kissgroup.io/docs/#v1--fran%C3%A7ais Post a new message to a ticket, optionally with attached files and a status change. The request is sent as `multipart/form-data`. ```APIDOC ## POST /v1/tickets/{ticket_id}/reply ### Description Post a new message to a ticket, optionally with attached files and a status change. Sent as `multipart/form-data`. By default, the reply appears under the name of the teammate associated with your API key; pass `user_id` to have it posted under another teammate's name (from `GET /v1/users`). **Side effects on status** (skipped when `is_partner_note: true`): * `new_status_id` provided → the ticket transitions to this status. * No `new_status_id`, ticket currently `Resolved` / `Closed` / `Waiting on client` → the ticket reopens to `Open` (same auto-reopening as the portal applies when a teammate replies). * Otherwise, the status remains unchanged. **Body Format** — `body` is HTML. Plain text also works: when it doesn't start with an HTML tag, it's wrapped in `

...

` and line breaks are converted to `
` so the message isn't rendered on a single uninterrupted line. Each body is sanitized server-side via an allowlist (formatting tags, lists, tables, links, images — schemas limited to `http` / `https` / `mailto`). Tags or attributes not on the allowlist (`