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_ruleslines 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_idprice.
  • Create booking: lấy package_id từ package và lấy price_rule_id từ price_rules, sau đó gửi vào mảng lines.
  • Tổng tiền: hệ thống tự tính theo công thức sum(quantity * price) từ các dòng lines hợp lệ.

Luồng tích hợp khuyến nghị

  1. Gọi API lấy sản phẩm để chọn product_id.
  2. Gọi API chi tiết sản phẩm (hoặc packages) để lấy package_idprice_rule_id.
  3. Gọi API tạo booking với product_id, package_id, date, lines, contact.
  4. Gọi API lấy chi tiết booking để theo dõi trạng thái.
  5. 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

ParamBắt buộcMô tả
pageKhôngMặc định 1
page_sizeKhôngMặc định 20, tối đa 100
dateKhôngY-m-d, dùng cho logic giá nội bộ
get_packagesKhông1/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ườngKiểuMô tả
successbooleanLuôn là true khi thành công.
data[]arrayDanh sách sản phẩm theo trang hiện tại.
data[].idintegerID sản phẩm (product_id).
data[].titlestringTên sản phẩm.
data[].descriptionstringMô tả ngắn sản phẩm.
data[].currencystringĐơn vị tiền tệ, hiện tại là VND.
data[].providerstringNhà cung cấp vé nội bộ (ví dụ: sun).
data[].updated_atintegerUnix timestamp cập nhật gần nhất.
data[].packagesarrayChỉ có khi gọi với get_packages=true.
meta.pageintegerTrang hiện tại.
meta.page_sizeintegerSố bản ghi trên mỗi trang.
meta.totalintegerTổng số sản phẩm thỏa điều kiện.
meta.has_morebooleanCòn dữ liệu trang sau hay không.
meta.with_packagesbooleanXác nhận response có nhúng package.
meta.request_idstringMã request để tra soát log.
meta.partner_idintegerID 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ườngKiểuMô tả
successbooleanLuôn là true khi thành công.
data.product.idintegerID sản phẩm.
data.product.titlestringTên sản phẩm.
data.packages[]arrayDanh sách package của sản phẩm.
data.packages[].idintegerID package nội bộ.
data.packages[].titlestringTên package.
data.packages[].description/include/exclude/terms_servicestringThông tin mô tả package.
data.packages[].statusintegerTrạng thái package.
data.packages[].prices[]arrayCác khoảng giá và price rule tương ứng.
meta.request_idstringMã request để tra soát log.
meta.partner_idintegerID 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ườngKiểuMô tả
successbooleanLuôn là true khi thành công.
data.idintegerID sản phẩm.
data.titlestringTên sản phẩm.
data.descriptionstringMô tả ngắn sản phẩm.
data.currencystringĐơn vị tiền tệ, hiện tại là VND.
data.providerstringNhà cung cấp vé.
data.updated_atintegerUnix timestamp cập nhật gần nhất.
data.packages[]arrayDanh sách package và thông tin giá.
meta.request_idstringMã request để tra soát log.
meta.partner_idintegerID 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ườngKiểuMô tả
successbooleanLuôn là true khi tạo thành công.
data.codestringMã booking (vd: VT123456).
data.datestringNgày sử dụng (Y-m-d).
data.statusintegerTrạng thái đơn (create API mặc định giữ chỗ).
data.issueintegerTrạng thái xuất vé (0: chưa, 1: đã).
data.providerstringNhà cung cấp vé.
data.total_pricenumberTổng tiền hệ thống tính theo lines.
data.paidnumberSố tiền đã ghi nhận thanh toán tại thời điểm trả về.
data.customers[]arrayDanh sách dòng khách tương ứng với lines.
data.tickets[]arrayThông tin vé (thường rỗng khi vừa tạo booking).
meta.request_idstringMã request để tra soát log.
meta.partner_idintegerID 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ườngKiểuMô tả
successbooleanLuôn là true khi lấy chi tiết thành công.
data.codestringMã booking.
data.datestringNgày sử dụng.
data.statusintegerTrạng thái đơn hiện tại.
data.issueintegerTrạng thái xuất vé.
data.providerstringNhà cung cấp vé.
data.total_pricenumberTổng tiền booking.
data.paidnumberSố tiền đã thanh toán ghi nhận.
data.customers[]arrayDanh sách dòng khách của booking.
data.tickets[]arrayDanh sách vé (nếu đã issue).
meta.request_idstringMã request để tra soát log.
meta.partner_idintegerID 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ườngKiểuMô tả
successbooleanLuôn là true khi xuất vé thành công.
data.codestringMã booking.
data.statusintegerTrạng thái sau xuất vé (thường là đã thanh toán/hoàn tất).
data.issueintegerTrạng thái xuất vé (1 = đã xuất).
data.paidnumberSố tiền đã ghi nhận sau khi issue.
data.total_pricenumberTổng tiền booking.
data.customers[]arrayDanh sách dòng khách.
data.tickets[]arrayDanh sách mã vé đã xuất.
meta.request_idstringMã request để tra soát log.
meta.partner_idintegerID 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ườngKiểuMô tả
successbooleanLuôn là true khi lấy ví thành công.
data.partner_idintegerID partner sở hữu ví.
data.wallet_idintegerID ví nội bộ.
data.statusstringTrạng thái ví (active, suspended...).
data.balancenumberSố dư hiện tại của ví.
data.credit_limitnumberHạn mức tín dụng bổ sung.
data.availablenumberSố dư khả dụng = balance + credit_limit.
meta.request_idstringMã request để tra soát log.
meta.partner_idintegerID 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

CodeHTTPÝ nghĩa
AUTH_MISSING_TOKEN401Thiếu Authorization header
AUTH_INVALID_TOKEN401Token không hợp lệ
AUTH_PARTNER_SUSPENDED403Partner bị khóa
AUTH_IP_BLOCKED403IP nằm trong blacklist
AUTH_IP_NOT_ALLOWED403Không khớp whitelist
PARTNER_AGENT_NOT_FOUND422Không có agent hợp lệ
INVALID_JSON400Body không phải JSON hợp lệ
VALIDATION_ERROR400Thiếu/sai field input
PRODUCT_NOT_FOUND404Không tìm thấy product
PACKAGE_NOT_FOUND404package_id không thuộc product
PRICE_NOT_AVAILABLE422Không có bảng giá theo ngày
PRICE_RULE_MISMATCH422price_rule_id không hợp lệ
PARTNER_ORDER_DUPLICATE409Trùng partner_order_code
BOOKING_NOT_FOUND404Không tìm thấy booking
BOOKING_ACCESS_DENIED403Booking không thuộc partner
ISSUE_ALREADY_DONE409Đã issue trước đó
BOOKING_NOT_PAID422Áp dụng với non-api_partner booking
WALLET_NOT_FOUND422Không tìm thấy ví
WALLET_SUSPENDED422Ví bị khóa
WALLET_INSUFFICIENT_BALANCE422Không đủ số dư khả dụng
METHOD_NOT_ALLOWED405Sai method HTTP
SERVER_MISCONFIG500Thiếu function/module nội bộ

Tải Postman Collection

Bạn có thể tải file Postman collection tại đây:

Download Vntix API v1 Postman Collection (.json)