# Tạo Phản hồi Ticket

> Trả lời một ticket đang tồn tại (thêm phản hồi của bạn vào cuộc trao đổi).

## Endpoint

| Môi trường | URL |
| --- | --- |
| Production | `https://online-gateway.ghn.vn/shiip/public-api/ticket/reply` |
| Staging | `https://dev-online-gateway.ghn.vn/shiip/public-api/ticket/reply` |

**Method**: `POST`

## Headers

| Header | Bắt buộc | Mô tả |
| --- | --- | --- |
| `Content-Type` | Có | Định dạng **form**: `multipart/form-data` (bắt buộc khi gửi file đính kèm) hoặc `application/x-www-form-urlencoded`. **Không** dùng `application/json` — body JSON sẽ bị bỏ qua âm thầm |
| `Token` | Có | Token của shop (do GHN cấp). Tài khoản của bạn còn phải có quyền ticket, nếu không phản hồi sẽ bị từ chối với HTTP 403 — [lấy token](https://developer.ghn.vn/vi/docs/token/get-token.md) |
| `ShopId` | Không | Shop ID (số nguyên). Mặc định là shop chính của tài khoản. Ticket phải thuộc tài khoản của shop được phân giải — để trả lời ticket của shop khác shop mặc định, hãy gửi `ShopId` của shop đó |

## Tham số

Gửi mọi trường dưới dạng **form value** (multipart hoặc URL-encoded). Giá trị đặt trong body JSON hay query string sẽ không được đọc.

- **ticket_id** (Int): Mã ticket do [Tạo Ticket](https://developer.ghn.vn/vi/docs/ticket/create.md) trả về. Phải là số (giá trị không phải số bị coi là `0` và bị từ chối). Ticket phải thuộc tài khoản của shop đang thao tác
- **description** (String): Nội dung phản hồi của bạn (tối đa 2000 ký tự). Được ghi vào ticket như một phản hồi của khách
- **attachments** (File(s)): File đính kèm (chỉ multipart). Tối đa **10 file**, mỗi file tối đa **~2 MB**. Phần mở rộng cho phép: `.docx` `.doc` `.xls` `.xlsx` `.pdf` `.jpg` `.jpeg` `.png` `.zip` `.pptx`. **Không** cho phép `.csv`

> **NOTE**
> Request này là **form-data, không phải JSON** — gửi bằng `--form`/`-F` hoặc `--data-urlencode`, tuyệt đối không dùng `--data '{...}'`. Body JSON sẽ đọc ra rỗng và fail validation.

## Ví dụ Request

```bash
curl -X POST https://dev-online-gateway.ghn.vn/shiip/public-api/ticket/reply \
  -H "Token: 5c1d8a9e-2f4b-11ed-..." \
  -H "ShopId: 92837" \
  -F "ticket_id=1234567" \
  -F "description=Cảm ơn, vui lòng giao vào buổi sáng" \
  -F "attachments=@/path/to/photo.jpg"
```

## Response

### Thành công (HTTP 200)

`data` là phản hồi vừa được tạo. Phản hồi luôn được ghi nhận là do bạn (khách hàng) gửi; việc trả lời **không** làm thay đổi `status`/`status_id` của ticket trong response này.

```json
{
  "code": 200,
  "message": "Success",
  "data": {
    "body": "Cảm ơn, vui lòng giao vào buổi sáng",
    "from_email": "cskh@ghn.vn",
    "user_id": 45678,
    "created_at": "2026-07-15T04:55:00Z",
    "updated_at": "2026-07-15T04:55:00Z"
  }
}
```

### Các trường Response

| Trường | Kiểu | Mô tả |
| --- | --- | --- |
| `code` | Int | Mã HTTP (`200` nếu thành công) |
| `message` | String | Thông báo kết quả (`Success`) |
| `data.body` | String | Nội dung phản hồi |
| `data.from_email` | String | Nhãn email người gửi (bỏ qua khi rỗng) |
| `data.user_id` | Int | User ID nội bộ của người viết phản hồi (bỏ qua khi bằng `0`) |
| `data.created_at` | String | Thời điểm tạo (bỏ qua khi rỗng) |
| `data.updated_at` | String | Thời điểm cập nhật cuối (bỏ qua khi rỗng) |
| `data.attachments` | Array | Danh sách file đính kèm của phản hồi (bỏ qua khi rỗng) |
| `data.cc_emails` | String[] | Danh sách CC (bỏ qua khi rỗng) |
| `data.bcc_emails` | String[] | Danh sách BCC (bỏ qua khi rỗng) |
| `data.private` | Bool | Có phải ghi chú nội bộ hay không; phản hồi bạn tạo luôn công khai (bỏ qua khi `false`) |

### Lỗi — thiếu ticket_id (HTTP 400)

_Lấy từ một lần gọi thật trên môi trường Staging._

```json
{
  "code": 400,
  "message": "Key: 'myRequest.TicketID' Error:Field validation for 'TicketID' failed on the 'required' tag",
  "data": null
}
```

## Bảng mã lỗi

| Điều kiện | HTTP | Ý nghĩa |
| --- | --- | --- |
| Thiếu/không phải số `ticket_id`, hoặc thiếu/quá dài `description` | 400 | Một trường form bắt buộc bị thiếu hoặc không hợp lệ |
| File đính kèm bị từ chối | 400 | Quá số file (>10), file lớn hơn ~2 MB, hoặc phần mở rộng không cho phép (vd `.csv`) |
| Không có quyền (`Bạn không có quyền trả lời ticket này`) | 403 | Ticket không thuộc tài khoản của shop đang thao tác |
| Không có quyền ticket (`Bạn không có quyền thực hiện thao tác...`) | 403 | Tài khoản của bạn thiếu quyền ticket — liên hệ GHN |
