# Dịch Vụ MKT X/Twitter - Tài Liệu API

## Mục Lục

1. [Tổng Quan API](#tổng-quan-api)
2. [Xác Thực](#xác-thực)
3. [Quản Lý Tài Khoản](#quản-lý-tài-khoản)
4. [Quản Lý Liên Hệ](#quản-lý-liên-hệ)
5. [Quản Lý Hội Thoại](#quản-lý-hội-thoại)
6. [Quản Lý Template](#quản-lý-template)
7. [Quản Lý Chiến Dịch](#quản-lý-chiến-dịch)
8. [Quản Lý Segment](#quản-lý-segment)
9. [Automation Flows](#automation-flows)
10. [AI Chatbot](#ai-chatbot)
11. [Phân Tích](#phân-tích)
12. [Webhooks](#webhooks)
13. [Xử Lý Lỗi](#xử-lý-lỗi)

---

## Tổng Quan API

### Base URL

```
Development: http://localhost:5000/api/v1/mkt-x
Production:  https://api.goodgo.com/api/v1/mkt-x
```

### Versioning

API versioning được xử lý thông qua URL path (`/api/v1/`).

### Định Dạng Request

Tất cả requests với body nên sử dụng:
```
Content-Type: application/json
```

### Định Dạng Response

Tất cả responses tuân theo cấu trúc này:

**Success Response**
```json
{
  "success": true,
  "data": { ... },
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 100,
    "totalPages": 5
  }
}
```

**Error Response**
```json
{
  "success": false,
  "error": "Mô tả lỗi"
}
```

---

## Xác Thực

### JWT Bearer Token

Tất cả API endpoints (ngoại trừ webhooks) yêu cầu xác thực qua JWT bearer token.

**Request Header**
```
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

### Lấy Token

Tokens được lấy từ IAM service:

```bash
POST /api/v1/auth/login
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "password"
}
```

**Response**
```json
{
  "success": true,
  "data": {
    "accessToken": "eyJhbGci...",
    "refreshToken": "refresh...",
    "expiresIn": 3600
  }
}
```

---

## Quản Lý Tài Khoản

### Kết Nối Tài Khoản Twitter

Kết nối tài khoản Twitter sử dụng OAuth 1.0a credentials.

**Endpoint**
```
POST /accounts
```

**Request Body**
```json
{
  "oauthToken": "oauth_token_từ_twitter",
  "oauthTokenSecret": "oauth_token_secret_từ_twitter"
}
```

**Response** `200 OK`
```json
{
  "success": true,
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "merchantId": "merchant-uuid",
    "twitterUserId": "123456789",
    "username": "goodgo_shop",
    "displayName": "GoodGo Official",
    "status": "active",
    "connectedAt": "2026-01-18T10:00:00Z"
  }
}
```

**Mã Lỗi**
- `400` - OAuth credentials không hợp lệ
- `401` - Unauthorized
- `409` - Tài khoản đã được kết nối

---

### Danh Sách Tài Khoản Đã Kết Nối

Lấy tất cả tài khoản Twitter đã kết nối bởi merchant.

**Endpoint**
```
GET /accounts
```

**Query Parameters**
- `status` (tùy chọn) - Lọc theo trạng thái: `active`, `inactive`, `error`

**Response** `200 OK`
```json
{
  "success": true,
  "data": [
    {
      "id": "uuid",
      "merchantId": "uuid",
      "twitterUserId": "123456789",
      "username": "goodgo_shop",
      "displayName": "GoodGo Official",
      "status": "active",
      "connectedAt": "2026-01-18T10:00:00Z"
    }
  ]
}
```

---

### Lấy Chi Tiết Tài Khoản

Lấy thông tin chi tiết về tài khoản Twitter cụ thể.

**Endpoint**
```
GET /accounts/{accountId}
```

**Response** `200 OK`
```json
{
  "success": true,
  "data": {
    "id": "uuid",
    "merchantId": "uuid",
    "twitterUserId": "123456789",
    "username": "goodgo_shop",
    "displayName": "GoodGo Official",
    "profileImageUrl": "https://pbs.twimg.com/profile_images/...",
    "status": "active",
    "webhookId": "webhook-id",
    "connectedAt": "2026-01-18T10:00:00Z",
    "statistics": {
      "totalContacts": 1234,
      "totalConversations": 567,
      "messagesThisMonth": 890
    }
  }
}
```

**Mã Lỗi**
- `404` - Không tìm thấy tài khoản

---

### Ngắt Kết Nối Tài Khoản

Ngắt kết nối tài khoản Twitter và thu hồi OAuth tokens.

**Endpoint**
```
DELETE /accounts/{accountId}
```

**Response** `200 OK`
```json
{
  "success": true,
  "data": null
}
```

---

### Cập Nhật Cài Đặt Tài Khoản

Cập nhật cài đặt cấu hình tài khoản.

**Endpoint**
```
PUT /accounts/{accountId}
```

**Request Body**
```json
{
  "autoReplyEnabled": true,
  "businessHours": {
    "enabled": true,
    "timezone": "Asia/Ho_Chi_Minh",
    "schedule": {
      "monday": { "start": "09:00", "end": "18:00" },
      "tuesday": { "start": "09:00", "end": "18:00" }
    }
  }
}
```

**Response** `200 OK`

---

## Quản Lý Liên Hệ

### Danh Sách Liên Hệ

Lấy danh sách liên hệ có phân trang với filtering.

**Endpoint**
```
GET /contacts
```

**Query Parameters**
- `accountId` (tùy chọn) - Lọc theo tài khoản Twitter
- `tags` (tùy chọn) - Tags phân cách bằng dấu phẩy: `vip,customer`
- `search` (tùy chọn) - Tìm kiếm trong username/display name
- `skip` (tùy chọn, mặc định: 0) - Pagination offset
- `take` (tùy chọn, mặc định: 20, tối đa: 100) - Items per page

**Response** `200 OK`
```json
{
  "success": true,
  "data": [
    {
      "id": "uuid",
      "accountId": "uuid",
      "twitterUserId": "987654321",
      "username": "customer_john",
      "displayName": "John Doe",
      "profileImageUrl": "https://...",
      "tags": ["vip", "customer"],
      "attributes": {
        "purchaseCount": 5,
        "totalSpent": 1250000,
        "lastPurchaseDate": "2026-01-15"
      },
      "conversationCount": 3,
      "firstInteractionAt": "2025-12-01T10:00:00Z",
      "lastInteractionAt": "2026-01-18T09:30:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 1234,
    "totalPages": 62
  }
}
```

---

### Lấy Chi Tiết Liên Hệ

Lấy thông tin chi tiết về liên hệ cụ thể.

**Endpoint**
```
GET /contacts/{contactId}
```

**Response** `200 OK`
```json
{
  "success": true,
  "data": {
    "id": "uuid",
    "accountId": "uuid",
    "twitterUserId": "987654321",
    "username": "customer_john",
    "displayName": "John Doe",
    "profileImageUrl": "https://...",
    "tags": ["vip", "customer"],
    "attributes": {
      "purchaseCount": 5,
      "totalSpent": 1250000,
      "lastPurchaseDate": "2026-01-15",
      "preferredLanguage": "vi"
    },
    "source": "inbound_message",
    "conversationCount": 3,
    "firstInteractionAt": "2025-12-01T10:00:00Z",
    "lastInteractionAt": "2026-01-18T09:30:00Z",
    "engagement": {
      "messagesSent": 15,
      "messagesReceived": 18,
      "averageResponseTime": "5m 30s"
    }
  }
}
```

---

### Cập Nhật Liên Hệ

Cập nhật thông tin liên hệ.

**Endpoint**
```
PUT /contacts/{contactId}
```

**Request Body**
```json
{
  "displayName": "John Doe (VIP)",
  "attributes": {
    "preferredLanguage": "vi",
    "notes": "Khách hàng cao cấp"
  }
}
```

**Response** `200 OK`

---

### Thêm Tags vào Liên Hệ

Thêm một hoặc nhiều tags vào liên hệ.

**Endpoint**
```
POST /contacts/{contactId}/tags
```

**Request Body**
```json
{
  "tags": ["vip", "premium"]
}
```

**Response** `200 OK`

---

### Xóa Tag khỏi Liên Hệ

Xóa tag cụ thể khỏi liên hệ.

**Endpoint**
```
DELETE /contacts/{contactId}/tags/{tagName}
```

**Response** `200 OK`

---

### Cập Nhật Thuộc Tính Liên Hệ

Cập nhật hàng loạt thuộc tính tùy chỉnh cho liên hệ.

**Endpoint**
```
PUT /contacts/{contactId}/attributes
```

**Request Body**
```json
{
  "attributes": {
    "purchaseCount": 6,
    "totalSpent": 1500000,
    "lastPurchaseDate": "2026-01-18",
    "membershipTier": "gold"
  }
}
```

**Response** `200 OK`

---

### Lấy Hội Thoại của Liên Hệ

Lấy tất cả hội thoại cho liên hệ cụ thể.

**Endpoint**
```
GET /contacts/{contactId}/conversations
```

**Query Parameters**
- `status` (tùy chọn) - Lọc theo trạng thái: `open`, `closed`
- `skip` (tùy chọn) - Pagination offset
- `take` (tùy chọn) - Items per page

**Response** `200 OK`
```json
{
  "success": true,
  "data": [
    {
      "id": "uuid",
      "contactId": "uuid",
      "status": "open",
      "messageCount": 5,
      "startedAt": "2026-01-18T09:00:00Z",
      "lastMessageAt": "2026-01-18T09:30:00Z"
    }
  ]
}
```

---

### Xóa Liên Hệ

Xóa liên hệ và tất cả dữ liệu liên quan (tuân thủ GDPR).

**Endpoint**
```
DELETE /contacts/{contactId}
```

**Response** `200 OK`

---

## Quản Lý Hội Thoại

### Danh Sách Hội Thoại

Lấy danh sách hội thoại có phân trang.

**Endpoint**
```
GET /conversations
```

**Query Parameters**
- `accountId` (tùy chọn) - Lọc theo tài khoản
- `status` (tùy chọn) - Lọc theo trạng thái: `open`, `closed`
- `assignedTo` (tùy chọn) - Lọc theo user ID được gán
- `skip` (tùy chọn) - Pagination offset
- `take` (tùy chọn) - Items per page

**Response** `200 OK`
```json
{
  "success": true,
  "data": [
    {
      "id": "uuid",
      "contactId": "uuid",
      "accountId": "uuid",
      "status": "open",
      "channel": "direct_message",
      "assignedToUserId": "uuid",
      "messageCount": 12,
      "startedAt": "2026-01-18T09:00:00Z",
      "lastMessageAt": "2026-01-18T10:15:00Z",
      "contact": {
        "username": "customer_john",
        "displayName": "John Doe"
      }
    }
  ],
  "pagination": { ... }
}
```

---

### Lấy Hội Thoại với Tin Nhắn

Lấy chi tiết hội thoại bao gồm tất cả tin nhắn.

**Endpoint**
```
GET /conversations/{conversationId}
```

**Query Parameters**
- `includeMessages` (tùy chọn, mặc định: true) - Bao gồm lịch sử tin nhắn

**Response** `200 OK`
```json
{
  "success": true,
  "data": {
    "id": "uuid",
    "contactId": "uuid",
    "accountId": "uuid",
    "status": "open",
    "channel": "direct_message",
    "assignedToUserId": "uuid",
    "startedAt": "2026-01-18T09:00:00Z",
    "messages": [
      {
        "id": "uuid",
        "conversationId": "uuid",
        "direction": "inbound",
        "type": "text",
        "content": "Xin chào, tôi có câu hỏi về đơn hàng",
        "attachments": [],
        "isFromBot": false,
        "sentAt": "2026-01-18T09:00:00Z"
      },
      {
        "id": "uuid",
        "conversationId": "uuid",
        "direction": "outbound",
        "type": "text",
        "content": "Chào bạn! Tôi rất vui được hỗ trợ. Mã đơn hàng của bạn là gì?",
        "attachments": [],
        "isFromBot": false,
        "sentAt": "2026-01-18T09:02:00Z"
      }
    ]
  }
}
```

---

### Gửi Tin Nhắn

Gửi tin nhắn trong hội thoại.

**Endpoint**
```
POST /conversations/{conversationId}/messages
```

**Request Body**
```json
{
  "content": "Đơn hàng #12345 của bạn đã được gửi đi!",
  "type": "text",
  "attachments": [
    {
      "type": "image",
      "url": "https://example.com/tracking.png"
    }
  ]
}
```

**Response** `200 OK`
```json
{
  "success": true,
  "data": {
    "id": "uuid",
    "conversationId": "uuid",
    "twitterMessageId": "123456789",
    "direction": "outbound",
    "type": "text",
    "content": "Đơn hàng #12345 của bạn đã được gửi đi!",
    "sentAt": "2026-01-18T10:30:00Z"
  }
}
```

**Mã Lỗi**
- `400` - Nội dung tin nhắn vượt quá giới hạn Twitter (10,000 ký tự)
- `429` - Vượt quá rate limit

---

### Đóng Hội Thoại

Đóng hội thoại đang hoạt động.

**Endpoint**
```
PUT /conversations/{conversationId}/close
```

**Request Body** (tùy chọn)
```json
{
  "reason": "resolved"
}
```

**Response** `200 OK`

---

### Gán Hội Thoại

Gán hội thoại cho user/agent cụ thể.

**Endpoint**
```
POST /conversations/{conversationId}/assign
```

**Request Body**
```json
{
  "userId": "user-uuid"
}
```

**Response** `200 OK`

---

## Quản Lý Template

### Tạo Template

Tạo template tin nhắn mới.

**Endpoint**
```
POST /templates
```

**Request Body**
```json
{
  "name": "Tin Nhắn Chào Mừng",
  "type": "text",
  "content": "Chào {{name}}, chào mừng đến {{shop_name}}! Sử dụng mã {{discount_code}} để được giảm giá 10% cho đơn hàng đầu tiên.",
  "variables": ["name", "shop_name", "discount_code"]
}
```

**Response** `200 OK`
```json
{
  "success": true,
  "data": {
    "id": "uuid",
    "merchantId": "uuid",
    "name": "Tin Nhắn Chào Mừng",
    "type": "text",
    "content": "Chào {{name}}, chào mừng đến...",
    "variables": ["name", "shop_name", "discount_code"],
    "createdAt": "2026-01-18T10:00:00Z"
  }
}
```

---

### Danh Sách Templates

Lấy tất cả templates của merchant.

**Endpoint**
```
GET /templates
```

**Query Parameters**
- `type` (tùy chọn) - Lọc theo loại: `text`, `quick_reply`, `card`
- `search` (tùy chọn) - Tìm kiếm trong tên template

**Response** `200 OK`

---

### Lấy Template

Lấy chi tiết template.

**Endpoint**
```
GET /templates/{templateId}
```

**Response** `200 OK`

---

### Cập Nhật Template

Cập nhật template hiện có.

**Endpoint**
```
PUT /templates/{templateId}
```

**Request Body**
```json
{
  "name": "Tin Nhắn Chào Mừng Đã Cập Nhật",
  "content": "Xin chào {{name}}!..."
}
```

**Response** `200 OK`

---

### Xóa Template

Xóa template.

**Endpoint**
```
DELETE /templates/{templateId}
```

**Response** `200 OK`

**Mã Lỗi**
- `409` - Template đang được sử dụng bởi chiến dịch đang hoạt động

---

### Xem Trước Template

Xem trước template đã render với dữ liệu mẫu.

**Endpoint**
```
POST /templates/{templateId}/preview
```

**Request Body**
```json
{
  "variables": {
    "name": "John",
    "shop_name": "GoodGo Shop",
    "discount_code": "WELCOME10"
  }
}
```

**Response** `200 OK`
```json
{
  "success": true,
  "data": {
    "rendered": "Chào John, chào mừng đến GoodGo Shop! Sử dụng mã WELCOME10 để được giảm giá 10% cho đơn hàng đầu tiên."
  }
}
```

---

## Quản Lý Chiến Dịch

### Tạo Chiến Dịch

Tạo chiến dịch tin nhắn mới.

**Endpoint**
```
POST /campaigns
```

**Request Body**
```json
{
  "name": "Khuyến Mãi Tết 2026",
  "templateId": "template-uuid",
  "segmentIds": ["segment-uuid-1", "segment-uuid-2"],
  "schedule": {
    "startAt": "2026-01-25T09:00:00Z",
    "endAt": "2026-01-31T23:59:59Z"
  },
  "variables": {
    "discount_code": "TET2026"
  }
}
```

**Response** `200 OK`
```json
{
  "success": true,
  "data": {
    "id": "uuid",
    "merchantId": "uuid",
    "name": "Khuyến Mãi Tết 2026",
    "status": "scheduled",
    "targetContactCount": 1500,
    "createdAt": "2026-01-18T10:00:00Z"
  }
}
```

---

### Danh Sách Chiến Dịch

Lấy tất cả chiến dịch.

**Endpoint**
```
GET /campaigns
```

**Query Parameters**
- `status` (tùy chọn) - Lọc theo trạng thái: `draft`, `scheduled`, `running`, `paused`, `completed`
- `skip` (tùy chọn) - Pagination offset
- `take` (tùy chọn) - Items per page

**Response** `200 OK`

---

### Lấy Chi Tiết Chiến Dịch

**Endpoint**
```
GET /campaigns/{campaignId}
```

**Response** `200 OK`
```json
{
  "success": true,
  "data": {
    "id": "uuid",
    "name": "Khuyến Mãi Tết 2026",
    "status": "running",
    "templateId": "uuid",
    "segmentIds": ["uuid"],
    "schedule": {
      "startAt": "2026-01-25T09:00:00Z",
      "endAt": "2026-01-31T23:59:59Z"
    },
    "metrics": {
      "totalSent": 1200,
      "delivered": 1180,
      "opened": 850,
      "clicked": 320,
      "replied": 45,
      "failed": 20
    }
  }
}
```

---

### Bắt Đầu Chiến Dịch

Bắt đầu thực thi chiến dịch.

**Endpoint**
```
POST /campaigns/{campaignId}/start
```

**Response** `200 OK`

---

### Tạm Dừng Chiến Dịch

Tạm dừng chiến dịch đang chạy.

**Endpoint**
```
POST /campaigns/{campaignId}/pause
```

**Response** `200 OK`

---

### Tiếp Tục Chiến Dịch

Tiếp tục chiến dịch đã tạm dừng.

**Endpoint**
```
POST /campaigns/{campaignId}/resume
```

**Response** `200 OK`

---

### Lấy Số Liệu Chiến Dịch

Lấy số liệu chi tiết cho chiến dịch.

**Endpoint**
```
GET /campaigns/{campaignId}/metrics
```

**Response** `200 OK`
```json
{
  "success": true,
  "data": {
    "totalSent": 1200,
    "delivered": 1180,
    "deliveryRate": 98.3,
    "opened": 850,
    "openRate": 72.0,
    "clicked": 320,
    "clickRate": 37.6,
    "replied": 45,
    "replyRate": 5.3,
    "failed": 20,
    "failureRate": 1.7
  }
}
```

---

## Quản Lý Segment

### Tạo Segment

Tạo phân khúc khách hàng mới.

**Endpoint**
```
POST /segments
```

**Request Body**
```json
{
  "name": "Khách Hàng VIP",
  "conditions": [
    {
      "field": "attributes.purchaseCount",
      "operator": "gte",
      "value": 5
    },
    {
      "field": "tags",
      "operator": "contains",
      "value": "vip"
    }
  ]
}
```

**Response** `200 OK`

---

### Danh Sách Segments

**Endpoint**
```
GET /segments
```

**Response** `200 OK`

---

### Đánh Giá Segment

Lấy số lượng liên hệ khớp với điều kiện segment.

**Endpoint**
```
POST /segments/{segmentId}/evaluate
```

**Response** `200 OK`
```json
{
  "success": true,
  "data": {
    "segmentId": "uuid",
    "contactCount": 345,
    "sampleContacts": [
      {
        "id": "uuid",
        "username": "customer_1",
        "displayName": "Customer 1"
      }
    ]
  }
}
```

---

## Automation Flows

### Tạo Automation Flow

Tạo workflow tự động hóa.

**Endpoint**
```
POST /automation/flows
```

**Request Body**
```json
{
  "name": "Chào Mừng Khách Hàng Mới",
  "trigger": {
    "type": "contact_created",
    "config": {}
  },
  "nodes": [
    {
      "type": "send_message",
      "templateId": "welcome-template-uuid",
      "delay": 0
    },
    {
      "type": "wait",
      "duration": 86400
    },
    {
      "type": "send_message",
      "templateId": "followup-template-uuid",
      "delay": 0
    }
  ]
}
```

**Response** `200 OK`

---

### Kích Hoạt Flow

Kích hoạt automation flow.

**Endpoint**
```
POST /automation/flows/{flowId}/activate
```

**Response** `200 OK`

---

### Hủy Kích Hoạt Flow

Hủy kích hoạt automation flow.

**Endpoint**
```
POST /automation/flows/{flowId}/deactivate
```

**Response** `200 OK`

---

## AI Chatbot

### Gửi Tin Nhắn AI

Gửi tin nhắn và nhận phản hồi AI.

**Endpoint**
```
POST /ai/conversations/{conversationId}/message
```

**Request Body**
```json
{
  "message": "Tôi muốn kiểm tra đơn hàng của tôi"
}
```

**Response** `200 OK`
```json
{
  "success": true,
  "data": {
    "message": "Dạ, tôi có thể giúp bạn kiểm tra đơn hàng. Vui lòng cho tôi biết mã đơn hàng của bạn.",
    "intent": "check_order",
    "confidence": 0.95,
    "needsHumanEscalation": false
  }
}
```

---

### Cấu Hình AI Chatbot

Cập nhật cài đặt AI chatbot cho tài khoản.

**Endpoint**
```
PUT /ai/accounts/{accountId}/config
```

**Request Body**
```json
{
  "enabled": true,
  "model": "gpt-4",
  "systemPrompt": "Bạn là trợ lý ảo của GoodGo Shop...",
  "temperature": 0.7,
  "escalationThreshold": 0.6
}
```

**Response** `200 OK`

---

## Phân Tích

### Tổng Quan Analytics

Lấy số liệu tổng quan cho merchant.

**Endpoint**
```
GET /analytics/overview
```

**Query Parameters**
- `startDate` (bắt buộc) - Ngày bắt đầu (YYYY-MM-DD)
- `endDate` (bắt buộc) - Ngày kết thúc (YYYY-MM-DD)
- `accountId` (tùy chọn) - Lọc theo tài khoản

**Response** `200 OK`
```json
{
  "success": true,
  "data": {
    "period": {
      "startDate": "2026-01-01",
      "endDate": "2026-01-18"
    },
    "summary": {
      "totalContacts": 1234,
      "newContacts": 145,
      "totalConversations": 567,
      "activeConversations": 89,
      "messagesSent": 2340,
      "messagesReceived": 1890,
      "campaignsCompleted": 12,
      "averageResponseTime": "3m 45s"
    },
    "trends": {
      "contactsGrowth": 12.5,
      "conversationsGrowth": 8.3,
      "messagesGrowth": -2.1
    }
  }
}
```

---

### Phân Tích Liên Hệ

Lấy thống kê về liên hệ.

**Endpoint**
```
GET /analytics/contacts
```

**Response** `200 OK`

---

### Phân Tích Hội Thoại

Lấy số liệu về hội thoại.

**Endpoint**
```
GET /analytics/conversations
```

**Response** `200 OK`

---

### Phân Tích Chiến Dịch

Lấy hiệu suất chiến dịch.

**Endpoint```
GET /analytics/campaigns
```

**Response** `200 OK`

---

## Webhooks

### Endpoint Webhook

Twitter sẽ gửi events đến:

```
POST /webhooks/twitter
```

### Xác Minh CRC

Twitter gửi challenge để xác minh webhook:

```
GET /webhooks/verify?crc_token=xxx
```

**Response** `200 OK`
```json
{
  "response_token": "sha256=..."
}
```

### Sự Kiện Webhook

#### Direct Message Event
```json
{
  "direct_message_events": [
    {
      "type": "message_create",
      "id": "123456789",
      "created_timestamp": "1642000000000",
      "message_create": {
        "sender_id": "987654321",
        "message_data": {
          "text": "Xin chào!"
        }
      }
    }
  ]
}
```

---

## Xử Lý Lỗi

### Mã Lỗi HTTP

| Mã | Ý Nghĩa | Mô Tả |
|----|---------|-------|
| `400` | Bad Request | Request không hợp lệ hoặc thiếu tham số |
| `401` | Unauthorized | Token xác thực không hợp lệ hoặc thiếu |
| `403` | Forbidden | Không có quyền truy cập tài nguyên |
| `404` | Not Found | Không tìm thấy tài nguyên |
| `409` | Conflict | Xung đột với trạng thái hiện tại |
| `422` | Unprocessable Entity | Validation failed |
| `429` | Too Many Requests | Vượt quá rate limit |
| `500` | Internal Server Error | Lỗi server |

### Error Response Structure

```json
{
  "success": false,
  "error": "Mô tả lỗi",
  "errorCode": "ERROR_CODE",
  "details": {
    "field": "fieldName",
    "message": "Chi tiết lỗi"
  }
}
```

### Validation Errors

```json
{
  "success": false,
  "error": "Validation failed",
  "errorCode": "VALIDATION_ERROR",
  "details": [
    {
      "field": "templateId",
      "message": "Template ID là bắt buộc"
    },
    {
      "field": "segmentIds",
      "message": "Cần ít nhất một segment"
    }
  ]
}
```

---

## Rate Limiting

Service thực thi các giới hạn sau:

- **API Calls**: 100 requests/phút mỗi merchant
- **Message Sending**: 500 tin nhắn/24 giờ mỗi tài khoản Twitter
- **Webhook Processing**: 1000 events/phút

**Rate Limit Headers**:
```
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1642000000
```

---

## Pagination

Tất cả list endpoints hỗ trợ pagination:

**Query Parameters**:
- `skip` - Offset (mặc định: 0)
- `take` - Limit (mặc định: 20, tối đa: 100)

**Response**:
```json
{
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 1234,
    "totalPages": 62
  }
}
```

---

## Best Practices

### 1. Sử Dụng Pagination

Luôn sử dụng pagination cho list endpoints để tránh timeout.

### 2. Xử Lý Rate Limits

Implement exponential backoff khi nhận `429` errors.

### 3. Validate Input

Validate dữ liệu trước khi gửi để giảm lỗi validation.

### 4. Sử Dụng Webhooks

Sử dụng webhooks thay vì polling để nhận real-time updates.

### 5. Cache Responses

Cache responses khi phù hợp để giảm API calls.

---

## Tài Nguyên Bổ Sung

- [Twitter API Documentation](https://developer.twitter.com/en/docs/twitter-api)
- [OpenAI API Documentation](https://platform.openai.com/docs)
- [Tài Liệu Kiến Trúc](KIEN-TRUC.md)
- [Hướng Dẫn Thiết Lập Twitter](CAI-DAT-TWITTER.md)

---

## Hỗ Trợ

Để được hỗ trợ về API:

- **Email**: api-support@goodgo.com
- **Documentation Issues**: Mở issue trên GitHub
- **Emergency Support**: support-priority@goodgo.com
