API GOVIGO dùng xác thực bằng API key. Hãy thêm header X-API-Key vào mọi yêu cầu.
GET /api/golf-clubs/plans.php?golf_club_id=1 HTTP/1.1 Host: govigolf.comX-API-Key: YOUR_API_KEY
partner.
Các scope khả dụng:
| Scope | Mô tả |
|---|---|
golf_clubs:read | Xem thông tin sân golf / gói |
tee_times:read | Xem tình trạng trống / lịch giá |
reservations:read | Xem báo giá / thông tin đặt chỗ |
reservations:write | Tạo / sửa / hủy đặt chỗ |
integration:read / integration:write | Quản lý Webhook và liên kết phía sân golf (mô tả sau) |
Tất cả phản hồi API được trả về theo định dạng chung sau.
{
"success": true,
"data": { ... },
"message": "",
"http_code": 200
}
| Trường | Kiểu | Mô tả |
|---|---|---|
success | boolean | true khi thành công, false khi thất bại |
data | object|null | Dữ liệu phản hồi (null khi lỗi) |
message | string | Thông điệp (nội dung lỗi khi có lỗi) |
http_code | integer | Mã trạng thái HTTP |
| Mã HTTP | Ý nghĩa | Mô tả |
|---|---|---|
400 | Bad Request | Tham số yêu cầu không hợp lệ |
401 | Unauthorized | API key không hợp lệ hoặc thiếu |
403 | Forbidden | Thiếu scope |
404 | Not Found | Tài nguyên không tồn tại (hoặc không có quyền) |
405 | Method Not Allowed | Phương thức HTTP không hợp lệ |
409 | Conflict | Xung đột tài nguyên (đặt trùng, trạng thái không sửa được, v.v.) |
429 | Too Many Requests | Vượt giới hạn tần suất |
500 | Internal Server Error | Lỗi nội bộ máy chủ |
Có thể tham chiếu đặt chỗ bằng hai khóa.
| Khóa | Mô tả |
|---|---|
reservation_id / id | ID đặt chỗ nội bộ GOVIGO (số nguyên). Được trả về trong phản hồi. |
external_ref | ID tham chiếu đặt chỗ của hệ thống đối tác (chuỗi). Nếu truyền khi tạo, sau đó có thể tra cứu / sửa / hủy bằng ID của chính bạn. Khuyến nghị dùng. |
404 Not Found. Hãy giữ external_ref duy nhất trong cùng một đối tác (trùng sẽ trả về đặt chỗ hiện có).
Kiểm tra tính hợp lệ của API key, chủ sở hữu, scope được cấp và giới hạn tần suất. Dùng để kiểm tra kết nối ban đầu (không cần scope).
{
"success": true,
"data": {
"authenticated": true,
"owner": { "type": "partner", "id": 3, "name": "Partner A" },
"key_prefix": "a1b2c3d4",
"scopes": ["golf_clubs:read", "tee_times:read", "reservations:read", "reservations:write"],
"rate_limit": 120,
"expires_at": null,
"server_time": "2026-06-01T10:00:00+07:00"
},
"message": "pong",
"http_code": 200
}
Lấy thông tin chi tiết sân golf. Bỏ qua id để trả về danh sách.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
id | integer | Tùy chọn | ID sân golf |
country | integer | Tùy chọn | Mã quốc gia (0=Việt Nam, 1=Thái Lan, 2=Nhật Bản) |
{
"success": true,
"data": {
"count": 1,
"golf_clubs": [
{
"id": 1,
"name": "Sample Golf Club",
"area": "Hanoi",
"country": 0,
"address": "123 Golf Street",
"google_map": "https://maps.google.com/...",
"course_info": "18 lỗ, par 72",
"cancel_policy": "Miễn phí đến 3 ngày trước",
"cancel_policy_govigo": "..."
}
]
},
"message": "",
"http_code": 200
}
Lấy danh sách gói của sân golf. id lấy ở đây chính là golf_plan_id (bắt buộc) khi đặt chỗ.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
golf_club_id | integer | Bắt buộc | ID sân golf |
date | string | Tùy chọn | Chỉ các gói hiệu lực vào ngày chỉ định (YYYY-MM-DD) |
{
"success": true,
"data": {
"golf_club_id": 1,
"count": 1,
"plans": [
{
"id": 10,
"source": "golf_plan",
"name": "Gói ngày thường",
"day_type": "weekday",
"price_local": 1500000,
"price_inbound": 2000000,
"partner_price_local": 1450000,
"partner_price_inbound": 1850000,
"apply_period": { "from": "2026-01-01", "to": "2026-12-31" },
"time_range": "06:00-10:00",
"minimum_players": 1,
"summary": "Gói ưu đãi chỉ ngày thường",
"rental_club_fee": 300000,
"rental_shoes_fee": 100000
}
]
},
"message": "",
"http_code": 200
}
price_local là giá nội địa, price_inbound là giá inbound (khách thăm). Khi đặt / báo giá, giá tương ứng được áp dụng theo số người chơi từng loại (local / inbound, có thể trộn lẫn trong cùng một đặt chỗ). Đặt / báo giá được xác định theo partner_price_local / partner_price_inbound (giá đối tác). Chỉ các gói có bookable: true (source: golf_plan) mới đặt được.
Lấy chính sách hủy của sân golf.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
golf_club_id | integer | Bắt buộc | ID sân golf |
{
"success": true,
"data": {
"golf_club_id": 1,
"cancel_policy": "Hủy miễn phí đến 3 ngày trước",
"cancel_policy_govigo": "Đặt chỗ qua GOVIGO...",
"rules": [
{ "days_before": 3, "cancel_fee_rate": 0 },
{ "days_before": 1, "cancel_fee_rate": 50 },
{ "days_before": 0, "cancel_fee_rate": 100 }
]
},
"message": "",
"http_code": 200
}
Lấy các khung giờ tee trống cho ngày chỉ định. Nếu dùng khung giờ tee, truyền tee_time_slot_id khi đặt (tùy chọn).
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
golf_club_id | integer | Bắt buộc | ID sân golf |
date | string | Bắt buộc | Ngày (YYYY-MM-DD) |
{
"success": true,
"data": {
"golf_club_id": 1,
"date": "2026-03-15",
"is_closed": false,
"count": 1,
"slots": [
{
"slot_id": 101,
"tee_date": "2026-03-15",
"tee_time": "07:00",
"total_slots": 4,
"available_slots": 2,
"allow_join": true,
"plan": { "id": 10, "name": "Gói ngày thường", "price": 1500000 }
}
]
},
"message": "",
"http_code": 200
}
Lấy giá tối thiểu theo ngày trong tháng chỉ định (để hiển thị lịch).
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
golf_club_id | integer | Bắt buộc | ID sân golf |
year | integer | Tùy chọn | Năm (mặc định: năm nay) |
month | integer | Tùy chọn | Tháng (mặc định: tháng này) |
{
"success": true,
"data": {
"golf_club_id": 1,
"year": 2026,
"month": 3,
"prices": {
"2026-03-01": 1500000,
"2026-03-02": 1800000
}
},
"message": "",
"http_code": 200
}
Lấy số tiền cuối cùng trước khi tạo đặt chỗ. API create tính lại bằng cùng logic nên khớp với báo giá này. Số tiền trả về là giá đối tác (giá thường trừ chiết khấu đối tác).
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
golf_club_id | integer | Bắt buộc | ID sân golf |
golf_plan_id | integer | Bắt buộc | ID gói (id từ plans) |
local_players | integer | Bắt buộc* | Số người chơi theo giá nội địa |
inbound_players | integer | Bắt buộc* | Số người chơi theo giá inbound (* phải có ít nhất một trong hai. Tổng 1-20. Có thể trộn lẫn) |
date | string | Tùy chọn | Ngày chơi (YYYY-MM-DD). Nếu có, kiểm tra cả thời hạn áp dụng / ngày trong tuần của gói |
rental_club | integer | Tùy chọn | Số bộ gậy thuê |
rental_shoes | integer | Tùy chọn | Số đôi giày thuê |
{
"success": true,
"data": {
"plan_id": 10,
"plan_name": "Gói ngày thường",
"players": {
"local": { "count": 2, "regular_unit_price": 1500000, "discount_per_player": 50000, "unit_price": 1450000, "amount": 2900000 },
"inbound": { "count": 2, "regular_unit_price": 2000000, "discount_per_player": 150000, "unit_price": 1850000, "amount": 3700000 }
},
"player_count": 4,
"minimum_players": 1,
"base_amount": 6600000,
"rental": {
"club_count": 2, "club_fee": 600000,
"shoes_count": 0, "shoes_fee": 0,
"subtotal": 600000
},
"currency": "VND",
"total_amount": 7200000,
"golf_club_id": 1
},
"message": "Quote calculated.",
"http_code": 200
}
Tạo đặt chỗ mới. Thân yêu cầu là JSON. Số tiền (total_amount) được tính lại ở máy chủ từ golf_plan_id, nên không cần chỉ định trong yêu cầu.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
golf_club_id | integer | Bắt buộc | ID sân golf |
golf_plan_id | integer | Bắt buộc | ID gói (id từ plans) |
tee_date | string | Bắt buộc | Ngày chơi(YYYY-MM-DD) |
customer_name | string | Bắt buộc | Tên người đặt |
customer_email | string | Bắt buộc | Email người đặt |
customer_phone | string | Bắt buộc | SĐT người đặt |
players | object | Bắt buộc | Số người chơi theo loại giá {local?, inbound?} (có thể trộn lẫn; tổng 1-20) |
tee_time | string | Tùy chọn | Giờ tee mong muốn (HH:MM). Chỉ đặt thường. Mặc định 08:00 |
tee_time_slot_id | integer | Tùy chọn | Nếu chỉ định, xác nhận tức thì theo khung real-time và phản ánh lên bảng giờ tee của sân golf (lấy qua available). Ngày của khung phải khớp với tee_date. Nếu bỏ qua, là đặt thường (yêu cầu) |
options | object | Tùy chọn | Thuê v.v. {rental_club, rental_shoes} |
remark | string | Tùy chọn | Ghi chú |
attendees | array | Tùy chọn | Danh sách người đi cùng ({name, email?, phone?}) |
external_ref | string | Tùy chọn | ID tham chiếu đặt chỗ của đối tác (khuyến nghị, duy nhất) |
POST /api/reservations/create.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{
"golf_club_id": 1,
"golf_plan_id": 10,
"tee_date": "2026-03-15",
"customer_name": "Taro Tanaka",
"customer_email": "tanaka@example.com",
"customer_phone": "090-1234-5678",
"players": { "local": 2, "inbound": 2 },
"options": { "rental_club": 2 },
"external_ref": "EXT-2026-00500"
}
{
"success": true,
"data": {
"reservation_id": 500,
"status": 1,
"golf_club_id": 1,
"tee_date": "2026-03-15",
"tee_time": "08:00",
"player_count": 4,
"players": { "local": 2, "inbound": 2 },
"total_amount": 7200000,
"source": "api_partner"
},
"message": "Reservation created successfully.",
"http_code": 201
}
Lấy danh sách đặt chỗ (chỉ đặt chỗ do bạn tạo). Hỗ trợ phân trang.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
golf_club_id | integer | Tùy chọn | Lọc theo ID sân golf |
status | integer | Tùy chọn | Mã trạng thái (1=đã yêu cầu, 2=sân đang xác nhận, 3=yêu cầu thanh toán, 4=đã thanh toán/xác nhận, 5=đang đổi lịch, 6=yêu cầu hủy, 7=đang hủy(không hoàn), 8=đang hủy(có hoàn), 9=hoàn tất, 10=hoàn tất(đã hủy)) |
date_from | string | Tùy chọn | Ngày chơi bắt đầu (YYYY-MM-DD) |
date_to | string | Tùy chọn | Ngày chơi kết thúc (YYYY-MM-DD) |
page | integer | Tùy chọn | Số trang (mặc định: 1) |
per_page | integer | Tùy chọn | Số mục mỗi trang (mặc định: 20, tối đa: 100) |
sort | string | Tùy chọn | Trường sắp xếp (tee_date / created) |
order | string | Tùy chọn | Thứ tự sắp xếp (asc / desc) |
{
"success": true,
"data": {
"reservations": [
{
"id": 500,
"golf_club_id": 1,
"golf_club_name": "Sample Golf Club",
"customer_name": "Taro Tanaka",
"tee_date": "2026-03-15",
"tee_time": "08:00",
"player_count": 4,
"players": { "local": 2, "inbound": 2 },
"total_amount": 7200000,
"status": "1.đã yêu cầu",
"status_code": 1,
"source": "api_partner",
"external_ref": "EXT-2026-00500",
"created_at": "2026-03-01 10:00:00"
}
],
"pagination": {
"page": 1, "per_page": 20, "total_count": 1,
"total_pages": 1, "has_next": false, "has_prev": false
}
},
"message": "",
"http_code": 200
}
Lấy chi tiết đặt chỗ. Chỉ định id hoặc external_ref.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
id | integer | một trong | ID đặt chỗ GOVIGO |
external_ref | string | một trong | ID tham chiếu đối tác |
{
"success": true,
"data": {
"reservation": {
"id": 500,
"golf_club_id": 1,
"golf_club_name": "Sample Golf Club",
"plan_id": 10,
"plan_name": "Gói ngày thường",
"customer_name": "Taro Tanaka",
"customer_email": "tanaka@example.com",
"customer_phone": "090-1234-5678",
"tee_date": "2026-03-15",
"tee_time": "08:00",
"player_count": 4,
"players": { "local": 2, "inbound": 2 },
"total_amount": 7200000,
"remark": null,
"options": { "rental_club": 2, "rental_shoes": 0 },
"status": "1.đã yêu cầu",
"status_code": 1,
"source": "api_partner",
"external_ref": "EXT-2026-00500",
"created_at": "2026-03-01 10:00:00",
"updated_at": "2026-03-01 10:00:00",
"attendees": [
{ "name": "Hanako Sato", "email": null, "phone": null }
]
}
},
"message": "",
"http_code": 200
}
Cập nhật đặt chỗ. Chỉ cập nhật các trường được chỉ định. Nếu players / options thay đổi, total_amount được tính lại ở máy chủ. players được hiểu giống như khi tạo đặt chỗ: các loại bị bỏ qua được coi là 0 người (luôn chỉ định số người cho tất cả các loại). Với đặt real-time, thay đổi tổng số người cũng điều chỉnh tồn kho phía sân golf. Đặt chỗ đã hủy (status=6-8) / hoàn tất (status=9,10) không thể sửa.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
reservation_id / external_ref | integer/string | Bắt buộc (một trong) | Khóa tham chiếu của đặt chỗ mục tiêu |
players | object | Tùy chọn | Số người chơi theo loại giá {local?, inbound?} (tính lại tổng tiền; các loại bị bỏ qua được coi là 0) |
options | object | Tùy chọn | Thuê v.v. (tính lại tiền khi đổi) |
customer_name / customer_email / customer_phone | string | Tùy chọn | Thông tin người đặt |
tee_date | string | Tùy chọn | Ngày chơi(YYYY-MM-DD). Đặt real-time (có tee_time_slot_id) không thể thay đổi (hãy hủy rồi tạo lại) |
remark | string | Tùy chọn | Ghi chú |
attendees | array | Tùy chọn | Người đi cùng (thay toàn bộ nếu chỉ định) |
POST /api/reservations/update.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{
"external_ref": "EXT-2026-00500",
"players": { "local": 2, "inbound": 1 },
"remark": "Hủy 1 người"
}
{
"success": true,
"data": {
"reservation_id": 500,
"golf_club_id": 1,
"plan_id": 10,
"player_count": 3,
"players": { "local": 2, "inbound": 1 },
"total_amount": 5350000,
"status": "1.đã yêu cầu",
"status_code": 1,
"external_ref": "EXT-2026-00500",
"updated_at": "2026-03-02 09:00:00"
},
"message": "Reservation updated.",
"http_code": 200
}
Hủy đặt chỗ. Chỉ định reservation_id hoặc external_ref. Giống đặt chỗ hội viên, được tiếp nhận như yêu cầu hủy (status=6) và nhân viên xác nhận. Đặt real-time tự khôi phục tồn kho phía sân golf. Đặt chỗ đang hủy (status=6-8) / hoàn tất (status=9,10) không thể hủy.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
reservation_id / external_ref | integer/string | Bắt buộc (một trong) | Khóa tham chiếu của đặt chỗ mục tiêu |
reason | string | Tùy chọn | Lý do hủy |
POST /api/reservations/cancel.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{
"external_ref": "EXT-2026-00500",
"reason": "Do thay đổi lịch"
}
{
"success": true,
"data": {
"reservation_id": 500,
"status": "cancel_requested",
"status_code": 6,
"cancelled_at": "2026-03-02T10:00:00+07:00"
},
"message": "Reservation cancelled successfully.",
"http_code": 200
}
Cơ chế thông báo cho hệ thống của bạn về thay đổi trạng thái đặt chỗ. Thông báo gửi qua HTTPS POST khi có sự kiện.
reservation.created / reservation.updated / reservation.cancelled / reservation.status_changed / *(tất cả sự kiện)
Đăng ký URL nhận Webhook.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
golf_club_id | integer | Bắt buộc | ID sân golf |
url | string | Bắt buộc | URL nhận Webhook (bắt buộc HTTPS) |
events | array | Bắt buộc | Loại sự kiện đăng ký |
POST /api/integration/webhooks/subscribe.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{
"golf_club_id": 1,
"url": "https://your-system.com/webhook/govigo",
"events": ["reservation.created", "reservation.updated", "reservation.cancelled"]
}
{
"success": true,
"data": {
"subscription_id": 10,
"golf_club_id": 1,
"url": "https://your-system.com/webhook/govigo",
"events": ["reservation.created", "reservation.updated", "reservation.cancelled"],
"secret": "a1b2c3d4e5f6..."
},
"message": "",
"http_code": 201
}
secret dùng để xác minh HMAC của payload Webhook. Hãy xác minh chữ ký khi nhận để xác nhận tính hợp lệ.
Lấy danh sách Webhook đã đăng ký.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
golf_club_id | integer | Bắt buộc | ID sân golf |
{
"success": true,
"data": {
"golf_club_id": 1,
"count": 1,
"subscriptions": [
{
"id": 10,
"golf_club_id": 1,
"url": "https://your-system.com/webhook/govigo",
"events": ["reservation.created", "reservation.cancelled"],
"is_active": true,
"created_at": "2026-03-01 10:00:00",
"updated_at": "2026-03-01 10:00:00"
}
]
},
"message": "",
"http_code": 200
}
Hủy đăng ký một Webhook đã đăng ký.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
subscription_id | integer | Bắt buộc | ID đăng ký cần hủy |
POST /api/integration/webhooks/unsubscribe.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{ "subscription_id": 10 }
Gửi thông báo thử đến Webhook đã đăng ký để kiểm tra kết nối URL và xác minh chữ ký.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
subscription_id | integer | Bắt buộc | ID đăng ký cần thử |
POST /api/integration/webhooks/test.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{ "subscription_id": 10 }