Vntix API v1
- Base URL:
https://dev.vntix.vn - Content-Type:
application/json - Success envelope:
{ success: true, data: ..., meta: ... } - Error envelope:
{ success: false, error: { code, message, details } }
Xác thực
Mọi request bắt buộc gửi Bearer token:
Authorization: Bearer your_partner_token
Các lỗi xác thực thường gặp:
AUTH_MISSING_TOKEN(401)AUTH_INVALID_TOKEN(401)AUTH_PARTNER_SUSPENDED(403)AUTH_IP_BLOCKED/AUTH_IP_NOT_ALLOWED(403)
Khái niệm & luồng dữ liệu đặt vé
Để tích hợp đúng, đối tác cần hiểu mối quan hệ giữa product, package, price_rules và lines khi tạo booking.
- Product: là sản phẩm vé tham quan.
- Package: là gói bán cụ thể của sản phẩm, dùng
package_idđể đặt vé. - Price period: mỗi package có các khoảng giá theo thời gian.
- Price rule: mỗi khoảng giá có nhiều dòng giá (ví dụ người lớn/trẻ em), mỗi dòng có
price_rule_idvàprice. - Create booking: lấy
package_idtừ package và lấyprice_rule_idtừprice_rules, sau đó gửi vào mảnglines. - Tổng tiền: hệ thống tự tính theo công thức
sum(quantity * price)từ các dònglineshợp lệ.
Luồng tích hợp khuyến nghị
- Gọi API lấy sản phẩm để chọn
product_id. - Gọi API chi tiết sản phẩm (hoặc packages) để lấy
package_idvàprice_rule_id. - Gọi API tạo booking với
product_id,package_id,date,lines,contact. - Gọi API lấy chi tiết booking để theo dõi trạng thái.
- Khi cần xuất vé, gọi API issue theo
bookingCode.
Danh sách API
GET /api/v1/products
Lấy danh sách sản phẩm.
Request mẫu
GET /api/v1/products?page=1&page_size=10&date=2026-05-01&get_packages=1 HTTP/1.1 Host: dev.vntix.vn Authorization: Bearer your_partner_token
Tham số query
| Param | Bắt buộc | Mô tả |
|---|---|---|
page | Không | Mặc định 1 |
page_size | Không | Mặc định 20, tối đa 100 |
date | Không | Y-m-d, dùng cho logic giá nội bộ |
get_packages | Không | 1/true/yes/on sẽ nhúng packages |
Response thành công mẫu
{
"success": true,
"data": [
{
"id": 12345,
"title": "Vé tham quan mẫu",
"description": "Mô tả ngắn",
"currency": "VND",
"provider": "sun",
"updated_at": 1760000000,
"packages": [
{
"id": 1,
"title": "Gói tiêu chuẩn",
"description": "",
"include": "",
"exclude": "",
"terms_service": "",
"status": 1,
"prices": []
}
]
}
],
"meta": {
"page": 1,
"page_size": 10,
"total": 1,
"has_more": false,
"with_packages": true,
"request_id": "abc123",
"partner_id": 5
}
}
Mô tả trường response
| Trường | Kiểu | Mô tả |
|---|---|---|
success | boolean | Luôn là true khi thành công. |
data[] | array | Danh sách sản phẩm theo trang hiện tại. |
data[].id | integer | ID sản phẩm (product_id). |
data[].title | string | Tên sản phẩm. |
data[].description | string | Mô tả ngắn sản phẩm. |
data[].currency | string | Đơn vị tiền tệ, hiện tại là VND. |
data[].provider | string | Nhà cung cấp vé nội bộ (ví dụ: sun). |
data[].updated_at | integer | Unix timestamp cập nhật gần nhất. |
data[].packages | array | Chỉ có khi gọi với get_packages=true. |
meta.page | integer | Trang hiện tại. |
meta.page_size | integer | Số bản ghi trên mỗi trang. |
meta.total | integer | Tổng số sản phẩm thỏa điều kiện. |
meta.has_more | boolean | Còn dữ liệu trang sau hay không. |
meta.with_packages | boolean | Xác nhận response có nhúng package. |
meta.request_id | string | Mã request để tra soát log. |
meta.partner_id | integer | ID partner đang gọi API. |
GET /api/v1/products/{productId}/packages
Lấy package + price của 1 product.
Request mẫu
GET /api/v1/products/12345/packages HTTP/1.1 Host: dev.vntix.vn Authorization: Bearer your_partner_token
Response thành công mẫu
{
"success": true,
"data": {
"product": {
"id": 12345,
"title": "Vé tham quan mẫu"
},
"packages": [
{
"id": 1,
"title": "Gói tiêu chuẩn",
"description": "",
"include": "",
"exclude": "",
"terms_service": "",
"status": 1,
"prices": []
}
]
},
"meta": {
"request_id": "abc123",
"partner_id": 5
}
}
Mô tả trường response
| Trường | Kiểu | Mô tả |
|---|---|---|
success | boolean | Luôn là true khi thành công. |
data.product.id | integer | ID sản phẩm. |
data.product.title | string | Tên sản phẩm. |
data.packages[] | array | Danh sách package của sản phẩm. |
data.packages[].id | integer | ID package nội bộ. |
data.packages[].title | string | Tên package. |
data.packages[].description/include/exclude/terms_service | string | Thông tin mô tả package. |
data.packages[].status | integer | Trạng thái package. |
data.packages[].prices[] | array | Các khoảng giá và price rule tương ứng. |
meta.request_id | string | Mã request để tra soát log. |
meta.partner_id | integer | ID partner đang gọi API. |
GET /api/v1/products/{productId}
Lấy chi tiết 1 sản phẩm theo productId, luôn bao gồm dữ liệu packages.
Request mẫu
GET /api/v1/products/12345 HTTP/1.1 Host: dev.vntix.vn Authorization: Bearer your_partner_token
Response thành công mẫu
{
"success": true,
"data": {
"id": 12345,
"title": "Vé tham quan mẫu",
"description": "Mô tả ngắn",
"currency": "VND",
"provider": "sun",
"updated_at": 1760000000,
"packages": [
{
"id": 1,
"title": "Gói tiêu chuẩn",
"description": "",
"include": "",
"exclude": "",
"terms_service": "",
"status": 1,
"prices": []
}
]
},
"meta": {
"request_id": "abc123",
"partner_id": 5
}
}
Mô tả trường response
| Trường | Kiểu | Mô tả |
|---|---|---|
success | boolean | Luôn là true khi thành công. |
data.id | integer | ID sản phẩm. |
data.title | string | Tên sản phẩm. |
data.description | string | Mô tả ngắn sản phẩm. |
data.currency | string | Đơn vị tiền tệ, hiện tại là VND. |
data.provider | string | Nhà cung cấp vé. |
data.updated_at | integer | Unix timestamp cập nhật gần nhất. |
data.packages[] | array | Danh sách package và thông tin giá. |
meta.request_id | string | Mã request để tra soát log. |
meta.partner_id | integer | ID partner đang gọi API. |
POST /api/v1/booking/create
Tạo booking giữ chỗ, chưa issue, chưa paid.
Request mẫu
POST /api/v1/booking/create HTTP/1.1
Host: dev.vntix.vn
Authorization: Bearer your_partner_token
Content-Type: application/json
{
"product_id": 12345,
"package_id": 1,
"date": "2026-05-01",
"lines": [
{ "price_rule_id": 111, "quantity": 2 }
],
"contact": {
"full_name": "Nguyen Van A",
"tel": "0909123456",
"email": "a@example.com",
"address": "HCM"
},
"idempotency_key": "partner-ord-2026-001",
"partner_order_code": "PARTNER-001",
"note": "Ghi chú"
}
Response thành công mẫu (201)
{
"success": true,
"data": {
"code": "VT123456",
"date": "2026-05-01",
"status": 1,
"issue": 0,
"provider": "sun",
"total_price": 900000,
"paid": 0,
"customers": [
{ "price_rule_id": 111, "quantity": 2, "price": 450000, "discount": 0 }
],
"tickets": []
},
"meta": {
"request_id": "abc123",
"partner_id": 5
}
}
Mô tả trường response
| Trường | Kiểu | Mô tả |
|---|---|---|
success | boolean | Luôn là true khi tạo thành công. |
data.code | string | Mã booking (vd: VT123456). |
data.date | string | Ngày sử dụng (Y-m-d). |
data.status | integer | Trạng thái đơn (create API mặc định giữ chỗ). |
data.issue | integer | Trạng thái xuất vé (0: chưa, 1: đã). |
data.provider | string | Nhà cung cấp vé. |
data.total_price | number | Tổng tiền hệ thống tính theo lines. |
data.paid | number | Số tiền đã ghi nhận thanh toán tại thời điểm trả về. |
data.customers[] | array | Danh sách dòng khách tương ứng với lines. |
data.tickets[] | array | Thông tin vé (thường rỗng khi vừa tạo booking). |
meta.request_id | string | Mã request để tra soát log. |
meta.partner_id | integer | ID partner đang gọi API. |
GET /api/v1/bookings/{bookingCode}
Lấy chi tiết booking.
Request mẫu
GET /api/v1/bookings/VT123456 HTTP/1.1 Host: dev.vntix.vn Authorization: Bearer your_partner_token
Response thành công mẫu
{
"success": true,
"data": {
"code": "VT123456",
"date": "2026-05-01",
"status": 1,
"issue": 0,
"provider": "sun",
"total_price": 900000,
"paid": 0,
"customers": [
{ "price_rule_id": 111, "quantity": 2, "price": 450000, "discount": 0 }
],
"tickets": []
},
"meta": {
"request_id": "abc123",
"partner_id": 5
}
}
Mô tả trường response
| Trường | Kiểu | Mô tả |
|---|---|---|
success | boolean | Luôn là true khi lấy chi tiết thành công. |
data.code | string | Mã booking. |
data.date | string | Ngày sử dụng. |
data.status | integer | Trạng thái đơn hiện tại. |
data.issue | integer | Trạng thái xuất vé. |
data.provider | string | Nhà cung cấp vé. |
data.total_price | number | Tổng tiền booking. |
data.paid | number | Số tiền đã thanh toán ghi nhận. |
data.customers[] | array | Danh sách dòng khách của booking. |
data.tickets[] | array | Danh sách vé (nếu đã issue). |
meta.request_id | string | Mã request để tra soát log. |
meta.partner_id | integer | ID partner đang gọi API. |
POST /api/v1/bookings/{bookingCode}/issue
Issue vé. Nếu booking thuộc api_partner, hệ thống sẽ debit ví trước khi issue.
Request mẫu
POST /api/v1/bookings/VT123456/issue HTTP/1.1
Host: dev.vntix.vn
Authorization: Bearer your_partner_token
Content-Type: application/json
{}
Luồng xử lý tóm tắt
- Check booking tồn tại, thuộc partner, chưa issue.
- Check ví và số dư khả dụng (
balance + credit_limit). - Debit ví reference
booking_debit. - Cập nhật booking sang
status=2,paid=total_price. - Gọi hàm issue nội bộ.
- Nếu issue fail sau debit: credit refund
booking_issue_refund.
Response thành công mẫu
{
"success": true,
"data": {
"code": "VT123456",
"date": "2026-05-01",
"status": 2,
"issue": 1,
"provider": "sun",
"total_price": 900000,
"paid": 900000,
"customers": [
{ "price_rule_id": 111, "quantity": 2, "price": 450000, "discount": 0 }
],
"tickets": [
{
"code": "TICKET001"
}
]
},
"meta": {
"request_id": "abc123",
"partner_id": 5
}
}
Mô tả trường response
| Trường | Kiểu | Mô tả |
|---|---|---|
success | boolean | Luôn là true khi xuất vé thành công. |
data.code | string | Mã booking. |
data.status | integer | Trạng thái sau xuất vé (thường là đã thanh toán/hoàn tất). |
data.issue | integer | Trạng thái xuất vé (1 = đã xuất). |
data.paid | number | Số tiền đã ghi nhận sau khi issue. |
data.total_price | number | Tổng tiền booking. |
data.customers[] | array | Danh sách dòng khách. |
data.tickets[] | array | Danh sách mã vé đã xuất. |
meta.request_id | string | Mã request để tra soát log. |
meta.partner_id | integer | ID partner đang gọi API. |
GET /api/v1/wallet/balance
Kiểm tra số dư ví hiện tại của partner.
Request mẫu
GET /api/v1/wallet/balance HTTP/1.1 Host: dev.vntix.vn Authorization: Bearer your_partner_token
Response thành công mẫu
{
"success": true,
"data": {
"partner_id": 5,
"wallet_id": 12,
"status": "active",
"balance": 2000000,
"credit_limit": 500000,
"available": 2500000
},
"meta": {
"request_id": "abc123",
"partner_id": 5
}
}
Mô tả trường response
| Trường | Kiểu | Mô tả |
|---|---|---|
success | boolean | Luôn là true khi lấy ví thành công. |
data.partner_id | integer | ID partner sở hữu ví. |
data.wallet_id | integer | ID ví nội bộ. |
data.status | string | Trạng thái ví (active, suspended...). |
data.balance | number | Số dư hiện tại của ví. |
data.credit_limit | number | Hạn mức tín dụng bổ sung. |
data.available | number | Số dư khả dụng = balance + credit_limit. |
meta.request_id | string | Mã request để tra soát log. |
meta.partner_id | integer | ID partner đang gọi API. |
Cấu trúc dữ liệu
Product item
{
"id": 123,
"title": "Tên sản phẩm",
"description": "...",
"currency": "VND",
"provider": "sun",
"updated_at": 1760000000,
"packages": [ ... ]
}
Package item
{
"id": 1,
"title": "Gói 1",
"description": "...",
"include": "...",
"exclude": "...",
"terms_service": "...",
"status": 1,
"prices": [ ... ]
}
Price item
{
"id": 999,
"from_date": 1760000000,
"to_date": 1760600000,
"exclude_dates": [
{ "timestamp": 1760200000, "date": "2026-05-12" }
],
"price_rules": [
{
"title": "Người lớn",
"description": "",
"price_rule_id": 11,
"price": 450000
}
]
}
Mã lỗi thường gặp
| Code | HTTP | Ý nghĩa |
|---|---|---|
AUTH_MISSING_TOKEN | 401 | Thiếu Authorization header |
AUTH_INVALID_TOKEN | 401 | Token không hợp lệ |
AUTH_PARTNER_SUSPENDED | 403 | Partner bị khóa |
AUTH_IP_BLOCKED | 403 | IP nằm trong blacklist |
AUTH_IP_NOT_ALLOWED | 403 | Không khớp whitelist |
PARTNER_AGENT_NOT_FOUND | 422 | Không có agent hợp lệ |
INVALID_JSON | 400 | Body không phải JSON hợp lệ |
VALIDATION_ERROR | 400 | Thiếu/sai field input |
PRODUCT_NOT_FOUND | 404 | Không tìm thấy product |
PACKAGE_NOT_FOUND | 404 | package_id không thuộc product |
PRICE_NOT_AVAILABLE | 422 | Không có bảng giá theo ngày |
PRICE_RULE_MISMATCH | 422 | price_rule_id không hợp lệ |
PARTNER_ORDER_DUPLICATE | 409 | Trùng partner_order_code |
BOOKING_NOT_FOUND | 404 | Không tìm thấy booking |
BOOKING_ACCESS_DENIED | 403 | Booking không thuộc partner |
ISSUE_ALREADY_DONE | 409 | Đã issue trước đó |
BOOKING_NOT_PAID | 422 | Áp dụng với non-api_partner booking |
WALLET_NOT_FOUND | 422 | Không tìm thấy ví |
WALLET_SUSPENDED | 422 | Ví bị khóa |
WALLET_INSUFFICIENT_BALANCE | 422 | Không đủ số dư khả dụng |
METHOD_NOT_ALLOWED | 405 | Sai method HTTP |
SERVER_MISCONFIG | 500 | Thiếu function/module nội bộ |
Tải Postman Collection
Bạn có thể tải file Postman collection tại đây: