Developer API Reference & Xác thực Bearer Token
This content is not available in your language yet.
TrolyPage cung cấp hệ thống RESTful API cho phép Lập trình viên tích hợp dữ liệu với phần mềm nội bộ (ERP, KiotViet, Nhanh.vn, Haravan, MISA…) — đồng bộ khách hàng, đơn hàng và gửi tin nhắn.
1. Base URL & Quy ước chung
Phần tiêu đề “1. Base URL & Quy ước chung”| Khái niệm | Giá trị |
|---|---|
| Base URL | https://trolypage.com/app/api/v1 |
| Content-Type | application/json (mọi request body) |
| Accept | application/json |
| Charset | UTF-8 |
| Kiểu dữ liệu | snake_case cho field; số tiền nguyên VND (350000 = 350.000đ) |
| Múi giờ | Mốc thời gian trả về dạng Unix timestamp (giây) |
Tất cả endpoint trong tài liệu này đều ghép sau Base URL. Ví dụ GET /customers = GET https://trolypage.com/app/api/v1/customers.
2. Phương thức Xác thực (Authentication)
Phần tiêu đề “2. Phương thức Xác thực (Authentication)”Mọi yêu cầu API bắt buộc kèm Header Authorization chứa API Bearer Token (tiền tố tp_live_):
GET /app/api/v1/customers HTTP/1.1Host: trolypage.comAuthorization: Bearer tp_live_9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4cContent-Type: application/jsonAccept: application/json# curlcurl -X GET https://trolypage.com/app/api/v1/customers \ -H "Authorization: Bearer tp_live_9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c" \ -H "Accept: application/json"3. Khách hàng (Customers API)
Phần tiêu đề “3. Khách hàng (Customers API)”GET /customers — danh sách (có phân trang)
Phần tiêu đề “GET /customers — danh sách (có phân trang)”Query params («cần xác nhận tên param chính xác»):
| Param | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
page |
int | 1 | Trang hiện tại |
per_page |
int | 20 | Số bản ghi/trang (max 100) |
q |
string | — | Tìm theo tên/SĐT |
Response 200:
{ "data": [ { "id": 8520, "name": "Nguyễn Văn A", "phone": "0912345678", "email": "khach@example.com", "address": "123 Lê Lợi, Q.1, TP.HCM", "tags": ["vip", "khach-cu"], "created_at": 1774800000 } ], "pagination": { "page": 1, "per_page": 20, "total": 153, "has_more": true }}POST /customers — tạo khách
Phần tiêu đề “POST /customers — tạo khách”Request body:
{ "name": "Trần Thị B", "phone": "0987654321", "email": "tranb@example.com", "address": "45 Hai Bà Trưng, Đà Nẵng", "tags": ["moi"]}Response 201:
{ "data": { "id": 8521, "name": "Trần Thị B", "phone": "0987654321", "email": "tranb@example.com", "address": "45 Hai Bà Trưng, Đà Nẵng", "tags": ["moi"], "created_at": 1774889400 }}curl -X POST https://trolypage.com/app/api/v1/customers \ -H "Authorization: Bearer tp_live_..." \ -H "Content-Type: application/json" \ -d '{"name":"Trần Thị B","phone":"0987654321"}'GET /customers/{id} — chi tiết 1 khách
Phần tiêu đề “GET /customers/{id} — chi tiết 1 khách”Trả về 200 + object khách (như một phần tử trong data ở trên). Nếu {id} không tồn tại → 404 (xem Error envelope).
PUT /customers/{id} — cập nhật
Phần tiêu đề “PUT /customers/{id} — cập nhật”Request body: bất kỳ field nào trong name/phone/email/address/tags. Response 200 trả object đã cập nhật.
4. Đơn hàng (Orders API)
Phần tiêu đề “4. Đơn hàng (Orders API)”GET /orders — danh sách theo trạng thái
Phần tiêu đề “GET /orders — danh sách theo trạng thái”Query params:
| Param | Kiểu | Mô tả |
|---|---|---|
status |
string | Lọc theo pending | confirmed | shipping | completed |
page, per_page |
int | Phân trang |
Response 200:
{ "data": [ { "order_id": "DH-9821", "status": "confirmed", "total_amount": 350000, "currency": "VND", "payment_status": "paid", "customer": { "id": 8520, "name": "Nguyễn Văn A", "phone": "0912345678" }, "items": [ { "product_id": 101, "product_name": "Áo thun Polo", "quantity": 1, "price": 350000 } ], "created_at": 1774889450 } ], "pagination": { "page": 1, "per_page": 20, "total": 42, "has_more": false }}POST /orders — tạo đơn mới
Phần tiêu đề “POST /orders — tạo đơn mới”Request body:
{ "customer_id": 8520, "items": [ { "product_id": 101, "quantity": 1 } ], "note": "Giao giờ hành chính", "payment_method": "vietqr"}Response 201: object đơn (như phần tử trong data ở trên).
PUT /orders/{id}/status — đổi trạng thái
Phần tiêu đề “PUT /orders/{id}/status — đổi trạng thái”Request body:
{ "status": "shipping" }Status enum: pending → confirmed → shipping → completed. («cần xác nhận có cancelled/refunded không»)
Response 200: object đơn với status mới.
5. Gửi tin nhắn (Messaging API)
Phần tiêu đề “5. Gửi tin nhắn (Messaging API)”POST /messages/send — gửi tin tới khách
Phần tiêu đề “POST /messages/send — gửi tin tới khách”Request body:
{ "customer_id": 8520, "channel": "facebook_msg", "text": "Dạ đơn DH-9821 đã giao cho đơn vị vận chuyển ạ 🚚", "attachments": []}Response 200:
{ "data": { "message_id": "msg_9f8a7b6c5d4e", "status": "sent", "channel": "facebook_msg", "sent_at": 1774889460 }}Không lạm dụng
API này gửi tin chủ động tới khách — tuân thủ chính sách chống spam của nền tảng (Facebook 24h window, Zalo OA quota). Spam = bị nền tảng chặn kênh.
6. Error Envelope & Mã lỗi
Phần tiêu đề “6. Error Envelope & Mã lỗi”Mọi lỗi trả về cùng 1 cấu trúc JSON:
{ "error": { "code": "validation_failed", "message": "Trường phone không hợp lệ.", "details": { "phone": ["Số điện thoại phải có 10 chữ số."] } }}Bảng mã lỗi:
| HTTP | error.code |
Ý nghĩa |
|---|---|---|
400 |
bad_request |
Request sai định dạng / thiếu field bắt buộc |
400 |
validation_failed |
Dữ liệu không qua validate (xem details) |
401 |
unauthenticated |
Thiếu/thiếu hợp lệ Authorization header |
401 |
token_expired |
Token đã hết hạn — tạo token mới |
403 |
forbidden |
Token hợp lệ nhưng không có quyền thực hiện |
404 |
not_found |
Resource ({id}) không tồn tại |
409 |
conflict |
Trùng lặp (vd tạo khách đã có SĐT) («cần xác nhận») |
422 |
unprocessable_entity |
Đúng format nhưng logic không cho phép |
429 |
rate_limited |
Vượt rate limit (xem header Retry-After) |
500 |
server_error |
Lỗi máy chủ — báo dev + thử lại sau |
7. Rate Limiting
Phần tiêu đề “7. Rate Limiting”| Quy tắc | Giá trị |
|---|---|
| Giới hạn | 100 requests/phút («theo IP hay workspace? cần xác nhận») |
| Khi vượt | 429 + header Retry-After: <số giây chờ> |
Header rate limit trả về ở mọi response («cần xác nhận tên header»):
X-RateLimit-Limit: 100X-RateLimit-Remaining: 73X-RateLimit-Reset: 1774889460Retry-After: 12 # chỉ có khi bị 429Khuyến nghị client: đọc X-RateLimit-Remaining, khi sắp hết → tự throttle; gặp 429 → ngủ đúng Retry-After giây rồi retry (kèm Idempotency-Key nếu là POST).
8. Phân trang
Phần tiêu đề “8. Phân trang”Mọi endpoint list (GET /customers, GET /orders) dùng cùng cấu trúc pagination trong response:
"pagination": { "page": 1, "per_page": 20, "total": 153, "has_more": true}- Lấy trang kế:
GET /customers?page=2&per_page=20. - Dừng khi
has_more: false.
9. Versioning
Phần tiêu đề “9. Versioning”Đường dẫn chứa version (/v1). Khi có breaking change sẽ ra /v2 và duy trì /v1 một thời gian («cần chính sách deprecation từ dev: bao lâu, thông báo ra sao»).
Bài viết liên quan
Phần tiêu đề “Bài viết liên quan”- Cấu trúc Webhook Payloads — JSON Schema sự kiện + chữ ký HMAC.
- Tích hợp hệ thống bên thứ 3 — Google Sheets, Slack, Zapier.
- Chợ Tiện ích Extensions — Plugins tích hợp.
- Hồ sơ & API Tokens — Tạo/quản lý token.
