# AddTicketReply

Add a reply to a ticket by Ticket ID.

### Request Parameters

| Parameter | Type | Description | Required |
|  --- | --- | --- | --- |
| action | string | "AddTicketReply" | Required |
| ticketid | int | The id of the ticket in the database. $ticketid is required | Required |
| message | string | The content of the ticket reply | Required |
| markdown | bool | Should markdown be used on the ticket reply output | Optional |
| clientid | int | Pass a clientid to associate the ticket reply with a specific client | Optional |
| contactid | int | Pass a contactid to associate the ticket reply with a specific contact belonging to $clientid | Optional |
| adminusername | string | The admin username to associate the ticket reply with | Optional |
| name | string | The name to associate with the ticket reply if not an admin or client response | Optional |
| email | string | The email to associate with the ticket reply if not an admin or client response | Optional |
| status | string | The status to set on the ticket after the reply is made if the default status on admin/client response is not required. See GetSupportStatuses API command | Optional |
| noemail | bool | Set to true to stop the ticket reply email being sent | Optional |
| customfields | string | A base64 encoded array of the custom fields to update | Optional |
| attachments | array | Optional base64 json encoded array of file attachments. Can be the direct output of a multipart-form-data form submission ($_FILES superglobal in PHP) or an array of arrays consisting of both a filename and data keys (see example below). | Optional |
| created | string | The date and time the ticket reply will show as sent. Format: ISO8601 or YYYY-MM-DD HH:mm:ss | Optional |


### Response Parameters

| Parameter | Type | Description |
|  --- | --- | --- |
| result | string | The result of the operation: success or error |


### Example Request (CURL)

```
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.example.com/includes/api.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
    http_build_query(
        array(
            'action' => 'AddTicketReply',
            // See https://developers.whmcs.com/api/authentication
            'username' => 'IDENTIFIER_OR_ADMIN_USERNAME',
            'password' => 'SECRET_OR_HASHED_PASSWORD',
            'ticketid' => '1',
            'message' => 'This is a sample ticket reply',
            'clientid' => '1',
            'customfields' => base64_encode(serialize(array("1"=>"Google"))),
            'markdown' => true,
            'attachments' => base64_encode(json_encode([['name' => 'sample_text_file.txt', 'data' => base64_encode('This is a sample text file contents')]])),
            'responsetype' => 'json',
        )
    )
);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
```

### Example Request (Local API)

```
$command = 'AddTicketReply';
$postData = array(
    'ticketid' => '1',
    'message' => 'This is a sample ticket reply',
    'clientid' => '1',
    'customfields' => base64_encode(serialize(array("1"=>"Google"))),
    'markdown' => true,
    'attachments' => base64_encode(json_encode([['name' => 'sample_text_file.txt', 'data' => base64_encode('This is a sample text file contents')]])),
);
$adminUsername = 'ADMIN_USERNAME'; // Optional for WHMCS 7.2 and later

$results = localAPI($command, $postData, $adminUsername);
print_r($results);
```

### Example Response JSON

```
{
    "result": "success"
}
```

### Error Responses

Possible error condition responses include:

* Ticket ID not found
* Client ID Not Found
* Contact ID Not Found
* Name and email address are required if not a client
* Message is required
* Email Address Invalid
* Invalid Ticket Status
* Invalid Date Format
* Reply creation date cannot be in the future


### Version History

| Version | Changelog |
|  --- | --- |
| 1.0 | Initial Version |
| 7.5 | Added support for attachments |
| 8.0 | Added support for ticket reply date and time |