Khởi tạo Template ZBS
API này cho phép bạn khởi tạo một Template Zalo Business Solution (ZBS) với đầy đủ nội dung hiển thị và các tham số động.
Luồng sử dụng:
- Khởi tạo template bằng API này — template được lưu ở trạng thái
DRAFTvà phản hồi trả về_id. - Xuất bản template bằng API Xuất bản Template ZBS để gửi lên Zalo kiểm duyệt (
PENDING_REVIEW). - Sau khi Zalo duyệt (
ENABLE), template mới có thể dùng để gửi tin nhắn.
Từ phiên bản mới, nội dung hiển thị của template được khai báo qua mảng contentBlocks (đoạn văn, bảng, voucher, đánh giá) thay cho hai trường paragraphs và tables trước đây.
Endpoint
POST https://staging-manage.api.miniai.vn/api/external/zns-template/create
POST https://manage-api.miniap.vn/api/external/zns-template/create
Tham số (Request Body)
Thông tin chung
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
oaId | string | ✅ | ID của Zalo OA dùng để gửi tin. Bắt buộc phải có trước khi xuất bản template. |
name | string | ✅ | Tên template (dùng để quản lý nội bộ). |
description | string | ❌ | Mô tả ngắn về mục đích template. |
title | string | ✅ | Tiêu đề hiển thị trong tin nhắn. Có thể chèn tham số động dạng <customer_fullname>. |
tag | "1" | "2" | "3" | ✅ | Cấp độ (loại nội dung) của template — xem bảng Cấp độ template. |
templateType | custom | voucher | rating | ✅ | Loại mẫu tin — xem Loại template. |
imageType | logo | image | ✅ | Kiểu ảnh đầu tin: dùng logo hay dùng ảnh banner. |
logoLight | string | ❌ | URL logo cho nền sáng. Bắt buộc khi imageType = logo (kiểm tra lúc xuất bản). |
logoDark | string | ❌ | URL logo cho nền tối. Bắt buộc khi imageType = logo. |
images | string[] | ❌ | Danh sách URL ảnh. Bắt buộc ít nhất 1 ảnh khi imageType = image. |
contentBlocks | object[] | ✅ | Nội dung thân tin nhắn — xem contentBlocks. |
buttons | object[] | ✅ | Danh sách nút bấm, tối đa 3 nút — xem buttons. |
params | object[] | ✅ | Khai báo tham số động — xem params. |
voucher | object | ⚠️ | Bắt buộc khi templateType = voucher — xem Mẫu voucher. |
rating | object | ⚠️ | Bắt buộc khi templateType = rating — xem Mẫu đánh giá. |
isCustomParams | boolean | ✅ | true nếu bạn tự khai báo tham số trong params; false nếu dùng bộ tham số mặc định của hệ thống. |
note | string | ❌ | Ghi chú gửi kèm cho đội kiểm duyệt của Zalo (giải thích ngữ cảnh sử dụng mẫu tin). |
Template luôn được tạo ở trạng thái DRAFT, kể cả khi bạn gửi kèm status. Việc chuyển trạng thái được thực hiện qua API Xuất bản Template ZBS.
Cấp độ template (tag)
Zalo phân loại mẫu tin theo cấp độ nội dung; cấp độ ảnh hưởng đến chính sách kiểm duyệt và giá gửi tin.
tag | Cấp độ | Nội dung phù hợp |
|---|---|---|
"1" | Giao dịch | Xác thực tài khoản, OTP, xác nhận đơn hàng/giao dịch, biến động số dư… |
"2" | Chăm sóc khách hàng | Tích lũy điểm thành viên, cập nhật chính sách, khảo sát ý kiến, chúc mừng sinh nhật… |
"3" | Hậu mãi | Giới thiệu sản phẩm/dịch vụ mới, mã giảm giá và CTKM, mời gia hạn dịch vụ… |
Loại template (templateType)
| Giá trị | Tên | Mô tả |
|---|---|---|
custom | Tin tùy chỉnh | Mẫu tin tự do: thông báo giao dịch, OTP, nhắc nhở… |
voucher | Mẫu voucher | Gửi mã giảm giá / voucher kèm điều kiện và hạn sử dụng. |
rating | Mẫu đánh giá | Thu thập đánh giá của khách sau khi dùng sản phẩm/dịch vụ. |
Nội dung tin nhắn (contentBlocks)
contentBlocks là mảng các khối nội dung, hiển thị theo đúng thứ tự bạn khai báo.
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
id | string | ✅ | Định danh duy nhất của khối (UUID do bạn sinh ra). |
type | paragraph | table | voucher | rating | ✅ | Loại khối nội dung. |
value | string | ⚠️ | Nội dung văn bản — dùng cho khối paragraph. Có thể chèn tham số <order_code>. |
rows | object[] | ⚠️ | Các dòng của bảng — dùng cho khối table. |
voucher | object | ⚠️ | Thông tin voucher — dùng cho khối voucher. |
rating | object | ⚠️ | Thông tin đánh giá — dùng cho khối rating. |
Dòng bảng (rows)
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
label | string | ✅ | Nhãn hiển thị bên trái (ví dụ Mã đơn hàng). |
key | string | ✅ | Giá trị hiển thị bên phải; dùng <ten_tham_so> để chèn tham số động. |
rowType | number | ❌ | Hiệu ứng màu của dòng, mặc định 0. |
Giá trị rowType:
rowType | Ý nghĩa |
|---|---|
0 | Không có hiệu ứng |
1 | Thành công (xanh lá) |
2 | Cập nhật (xanh dương) |
3 | Lưu ý (vàng) |
4 | Báo lỗi (đỏ) |
5 | Cơ bản |
Tham số động (params)
Mỗi tham số bạn dùng trong title, paragraph hay rows đều phải được khai báo trong params.
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
key | string | ✅ | Tên tham số, không kèm dấu <> (ví dụ order_code). |
label | string | ✅ | Tên hiển thị của tham số trong trình soạn thảo. |
techSetting | string | ✅ | Loại kỹ thuật do Zalo quy định — quyết định cách kiểm duyệt và độ dài tối đa. |
maxLength | number | ✅ | Độ dài tối đa của giá trị truyền vào, theo đúng techSetting. |
sampleValue | string | ✅ | Giá trị mẫu dùng để Zalo xem trước và kiểm duyệt. |
rowType | number | ❌ | Hiệu ứng màu áp dụng cho tham số, mặc định 0. |
isFixed | boolean | ❌ | true nếu giá trị cố định, không truyền động khi gửi tin. |
Bảng techSetting và maxLength tương ứng:
techSetting | Loại dữ liệu | maxLength |
|---|---|---|
"1" | Tên khách hàng | 30 |
"2" | Số điện thoại | 15 |
"3" | Địa chỉ | 200 |
"4" | Mã số (mã đơn hàng, mã khách hàng…) | 30 |
"5" | Nhãn tùy chỉnh | 30 |
"6" | Trạng thái giao dịch | 30 |
"7" | Thông tin liên hệ | 50 |
"8" | Giới tính / Danh xưng | 5 |
"9" | Tên sản phẩm / Thương hiệu | 200 |
"10" | Số lượng / Số tiền | 20 |
"11" | Thời gian | 20 |
"12" | OTP | 10 |
"13" | URL | 200 |
"14" | Tiền tệ (VNĐ) | 12 |
"15" | Nội dung chuyển khoản | 90 |
Tham số thiếu techSetting sẽ khiến request xuất bản template trả về lỗi 400. Chọn sai loại kỹ thuật (ví dụ dùng Nhãn tùy chỉnh cho số tiền) là nguyên nhân phổ biến khiến Zalo từ chối duyệt mẫu tin.
Nút bấm (buttons)
Tối đa 3 nút cho mỗi template.
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
label | string | ✅ | Nhãn hiển thị trên nút. |
type | string | ✅ | Loại hành động của nút — xem bảng dưới. |
value | string | ✅ | Giá trị đích của hành động (URL, số điện thoại, ID Mini App…). Có thể để chuỗi rỗng với các loại không cần giá trị. |
type | Hành động |
|---|---|
"1" | Đến trang của doanh nghiệp |
"2" | Gọi điện (giá trị là số điện thoại) |
"3" | Đến trang thông tin OA |
"4" | Đến Zalo Mini App của doanh nghiệp |
"5" | Đến trang ứng dụng của doanh nghiệp |
"6" | Đến trang phân phối sản phẩm |
"7" | Đến trang web / Zalo Mini App khác |
"8" | Đến ứng dụng khác |
"9" | Đến bài viết của doanh nghiệp |
"10" | Đến trang đích kêu gọi tải ứng dụng |
Mẫu voucher
Khi templateType = voucher, trường voucher ở cấp cao nhất là bắt buộc:
| Trường | Kiểu | Mô tả |
|---|---|---|
code | string | Mã voucher (thường là một tham số động, ví dụ <voucher_code>). |
title | string | Tên chương trình / ưu đãi. |
condition | string | Điều kiện áp dụng. |
startDate | string | Ngày bắt đầu hiệu lực. |
expiryDate | string | Ngày hết hạn. |
Trường voucher (và rating) ở cấp cao nhất dùng để kiểm tra dữ liệu đầu vào. Nội dung thực sự được hiển thị trong tin nhắn là khối voucher / rating bên trong contentBlocks, nên hãy khai báo trùng khớp ở cả hai nơi.
Mẫu đánh giá
Khi templateType = rating, trường rating ở cấp cao nhất là bắt buộc và chứa mảng items (ít nhất 1 phần tử):
| Trường | Kiểu | Mô tả |
|---|---|---|
star | number | Số sao tương ứng với kịch bản trả lời (1–5). |
title | string | Tiêu đề hiển thị cho mức sao đó. |
question | string | Câu hỏi tiếp theo dành cho khách. |
answers | string[] | Danh sách đáp án gợi ý. |
thanks | string | Lời cảm ơn sau khi khách đánh giá. |
description | string | Mô tả bổ sung. |
Ví dụ Request Body
- Tin tùy chỉnh
- Mẫu voucher
- Mẫu đánh giá
{
"oaId": "2288954399991473926",
"name": "Xác nhận đơn hàng",
"description": "Thông báo xác nhận đơn hàng cho khách",
"title": "Xin chào <customer_fullname>,",
"tag": "1",
"templateType": "custom",
"imageType": "logo",
"logoLight": "https://cdn.miniap.vn/zns/logo-light.png",
"logoDark": "https://cdn.miniap.vn/zns/logo-dark.png",
"images": [],
"isCustomParams": true,
"contentBlocks": [
{
"id": "10c8db12-7f66-4b53-a79c-22b5a01dac49",
"type": "paragraph",
"value": "Cảm ơn bạn đã đặt hàng tại cửa hàng. Đơn hàng của bạn đã được xác nhận."
},
{
"id": "6f2b0a54-1f5a-4f0f-9a52-0f5b2b6c7d10",
"type": "table",
"rows": [
{ "label": "Mã đơn hàng", "key": "<order_code>", "rowType": 0 },
{ "label": "Trạng thái", "key": "<order_status>", "rowType": 1 },
{ "label": "Tổng thanh toán", "key": "<order_price>", "rowType": 0 }
]
}
],
"buttons": [
{
"label": "Xem đơn hàng",
"value": "https://manage.miniai.vn/orders",
"type": "1"
}
],
"params": [
{
"key": "customer_fullname",
"label": "Customer fullname",
"techSetting": "1",
"maxLength": 30,
"sampleValue": "Nguyễn Văn A"
},
{
"key": "order_code",
"label": "Order code",
"techSetting": "4",
"maxLength": 30,
"sampleValue": "DH123456"
},
{
"key": "order_status",
"label": "Order status",
"techSetting": "6",
"maxLength": 30,
"sampleValue": "Đã xác nhận"
},
{
"key": "order_price",
"label": "Order price",
"techSetting": "14",
"maxLength": 12,
"sampleValue": "1500000"
}
],
"note": "Mẫu tin gửi khi đơn hàng được xác nhận"
}
{
"oaId": "2288954399991473926",
"name": "Tặng voucher sinh nhật",
"title": "Chúc mừng sinh nhật <customer_fullname>!",
"tag": "3",
"templateType": "voucher",
"imageType": "image",
"images": ["https://cdn.miniap.vn/zns/birthday-banner.png"],
"isCustomParams": true,
"contentBlocks": [
{
"id": "1c2f9a11-2b34-4d55-9f7a-88b0a1cd0f21",
"type": "paragraph",
"value": "Cửa hàng gửi tặng bạn một mã ưu đãi nhân dịp sinh nhật."
},
{
"id": "35b8de07-4c11-4f2a-88de-9a1c2e3b4d55",
"type": "voucher",
"voucher": {
"code": "<voucher_code>",
"title": "Giảm 20% toàn bộ đơn hàng",
"condition": "Áp dụng cho đơn từ 300.000đ",
"startDate": "2025-10-01",
"expiryDate": "2025-10-31"
}
}
],
"voucher": {
"code": "<voucher_code>",
"title": "Giảm 20% toàn bộ đơn hàng",
"condition": "Áp dụng cho đơn từ 300.000đ",
"startDate": "2025-10-01",
"expiryDate": "2025-10-31"
},
"buttons": [
{ "label": "Mua ngay", "value": "https://manage.miniai.vn/shop", "type": "7" }
],
"params": [
{
"key": "customer_fullname",
"label": "Customer fullname",
"techSetting": "1",
"maxLength": 30,
"sampleValue": "Nguyễn Văn A"
},
{
"key": "voucher_code",
"label": "Voucher code",
"techSetting": "4",
"maxLength": 30,
"sampleValue": "BDAY20"
}
],
"note": "Mẫu tin tặng voucher sinh nhật"
}
{
"oaId": "2288954399991473926",
"name": "Khảo sát sau mua hàng",
"title": "Xin chào <customer_fullname>,",
"tag": "2",
"templateType": "rating",
"imageType": "logo",
"logoLight": "https://cdn.miniap.vn/zns/logo-light.png",
"logoDark": "https://cdn.miniap.vn/zns/logo-dark.png",
"isCustomParams": true,
"contentBlocks": [
{
"id": "9a0f31bd-7d22-4a6d-8b39-1e0c5f2a7c44",
"type": "paragraph",
"value": "Bạn hài lòng với trải nghiệm mua hàng vừa rồi chứ?"
},
{
"id": "b71c4d92-5e88-4b1c-9f30-7c2a6e0d8b13",
"type": "rating",
"rating": {
"items": [
{
"star": 5,
"title": "Rất hài lòng",
"question": "Điều gì khiến bạn hài lòng nhất?",
"answers": ["Sản phẩm tốt", "Giao hàng nhanh"],
"thanks": "Cảm ơn bạn đã đánh giá!",
"description": ""
}
]
}
}
],
"rating": {
"items": [
{
"star": 5,
"title": "Rất hài lòng",
"question": "Điều gì khiến bạn hài lòng nhất?",
"answers": ["Sản phẩm tốt", "Giao hàng nhanh"],
"thanks": "Cảm ơn bạn đã đánh giá!",
"description": ""
}
]
},
"buttons": [],
"params": [
{
"key": "customer_fullname",
"label": "Customer fullname",
"techSetting": "1",
"maxLength": 30,
"sampleValue": "Nguyễn Văn A"
}
],
"note": "Mẫu tin khảo sát sau mua hàng"
}
Phản hồi (Response)
- Response
- Lỗi 400
{
"template": {
"name": "Xác nhận đơn hàng",
"description": "Thông báo xác nhận đơn hàng cho khách",
"oaId": "2288954399991473926",
"tag": "1",
"templateType": "custom",
"imageType": "logo",
"title": "Xin chào <customer_fullname>,",
"contentBlocks": [
{
"id": "10c8db12-7f66-4b53-a79c-22b5a01dac49",
"type": "paragraph",
"value": "Cảm ơn bạn đã đặt hàng tại cửa hàng. Đơn hàng của bạn đã được xác nhận."
},
{
"id": "6f2b0a54-1f5a-4f0f-9a52-0f5b2b6c7d10",
"type": "table",
"rows": [
{ "label": "Mã đơn hàng", "key": "<order_code>", "rowType": 0 },
{ "label": "Trạng thái", "key": "<order_status>", "rowType": 1 },
{ "label": "Tổng thanh toán", "key": "<order_price>", "rowType": 0 }
]
}
],
"buttons": [
{
"label": "Xem đơn hàng",
"value": "https://manage.miniai.vn/orders",
"type": "1"
}
],
"params": [
{
"key": "customer_fullname",
"label": "Customer fullname",
"techSetting": "1",
"maxLength": 30,
"sampleValue": "Nguyễn Văn A"
},
{
"key": "order_code",
"label": "Order code",
"techSetting": "4",
"maxLength": 30,
"sampleValue": "DH123456"
},
{
"key": "order_status",
"label": "Order status",
"techSetting": "6",
"maxLength": 30,
"sampleValue": "Đã xác nhận"
},
{
"key": "order_price",
"label": "Order price",
"techSetting": "14",
"maxLength": 12,
"sampleValue": "1500000"
}
],
"logoDark": "https://cdn.miniap.vn/zns/logo-dark.png",
"logoLight": "https://cdn.miniap.vn/zns/logo-light.png",
"images": [],
"note": "Mẫu tin gửi khi đơn hàng được xác nhận",
"shopId": "64204a17a5a97a86f12e1f0a",
"status": "DRAFT",
"isSync": false,
"isCustomParams": true,
"_id": "68c8ee675f8f83fc813e7830",
"createdAt": "2025-09-16T04:58:15.668Z",
"updatedAt": "2025-09-16T04:58:15.668Z",
"id": "68c8ee675f8f83fc813e7830"
}
}
{
"message": "\"oaId\" is required, \"params[0].techSetting\" is required"
}
Dùng _id trong phản hồi làm template_id để gọi API Xuất bản Template ZBS, sau đó tra cứu lại bằng Lấy chi tiết template.