Files
pos-system/services/mkt-x-service-net/docs/vi/API.md

1436 lines
24 KiB
Markdown

# 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