GOVIGO APIはAPIキー認証を使用します。すべてのリクエストに X-API-Key ヘッダーを含めてください。
GET /api/golf-clubs/plans.php?golf_club_id=1 HTTP/1.1 Host: govigolf.comX-API-Key: YOUR_API_KEY
partner タイプのキーが発行されます。
利用可能なスコープ:
| スコープ | 説明 |
|---|---|
golf_clubs:read | ゴルフ場・プラン情報の参照 |
tee_times:read | 空き状況・料金カレンダーの参照 |
reservations:read | 料金見積・予約情報の参照 |
reservations:write | 予約の作成・変更・キャンセル |
webhooks:read / webhooks:write | Webhook(自分の予約イベント通知)の参照・管理(後述) |
すべてのAPIレスポンスは以下の共通形式で返却されます。
{
"success": true,
"data": { ... },
"message": "",
"http_code": 200
}
| フィールド | 型 | 説明 |
|---|---|---|
success | boolean | リクエスト成功時 true、失敗時 false |
data | object|null | レスポンスデータ(エラー時は null) |
message | string | メッセージ(エラー時はエラー内容) |
http_code | integer | HTTPステータスコード |
| HTTPコード | 意味 | 説明 |
|---|---|---|
400 | Bad Request | リクエストパラメータが不正 |
401 | Unauthorized | APIキーが無効または未指定 |
403 | Forbidden | スコープ不足 |
404 | Not Found | 指定されたリソースが存在しない(または参照権限がない) |
405 | Method Not Allowed | HTTPメソッドが不正 |
409 | Conflict | リソースの競合(重複予約、変更不可状態など) |
429 | Too Many Requests | レートリミット超過 |
500 | Internal Server Error | サーバー内部エラー |
予約は2つのキーで参照できます。
| キー | 説明 |
|---|---|
reservation_id / id | GOVIGO内部の予約ID(整数)。レスポンスで返却されます。 |
external_ref | パートナー側システムの予約参照ID(文字列)。作成時に渡すと、以降は自社IDのまま予約を参照・変更・キャンセルできます。こちらの利用を推奨します。 |
404 Not Found を返します。external_ref は同一パートナー内で一意にしてください(重複時は既存予約を返します)。
APIキーの有効性・所有者・付与スコープ・レート上限を確認します。連携の初期疎通テストに使用してください(スコープ不問)。
{
"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
}
ゴルフ場の詳細情報を取得します。id を省略すると一覧として返却されます。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
id | integer | 任意 | ゴルフ場ID |
country | integer | 任意 | 国コード(0=ベトナム, 1=タイ, 2=日本)。現在はベトナム(0)のみ提供対象(他国を指定しても結果は返りません) |
{
"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ホール、パー72",
"cancel_policy": "3日前まで無料",
"rental": {
"club_available": true,
"club_fee": 300000,
"shoes_available": false,
"shoes_fee": null
},
"options": {
"rental_cart": { "available": true, "fee": 500000 },
"rental_umbrella": { "available": false, "fee": null },
"caddy": { "available": true, "fee": 400000 },
"caddy_designate": { "available": false, "fee": null },
"caddybag_storage": { "available": false, "fee": null },
"sent_caddybag": { "available": false, "fee": null },
"accompany": { "available": false, "fee": null },
"pickup": { "available": false, "fee": null }
}
}
]
},
"message": "",
"http_code": 200
}
rental(クラブ・シューズ)は本API(quote/create)で予約パラメータとして指定できるレンタルです。options(カート・キャディ・送迎等)は参考情報のみ(API予約不可)で、ベンダー側の表示・制御用に提供有無(available)と料金(fee。null = 提供なし)を返します。料金は null も 0 も「提供なし」として扱います。
ゴルフ場のプラン一覧を取得します。ここで得られる id が予約時の golf_plan_id(必須)です。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
golf_club_id | integer | 必須 | ゴルフ場ID |
date | string | 任意 | 指定日に有効なプランのみ取得(YYYY-MM-DD) |
{
"success": true,
"data": {
"golf_club_id": 1,
"count": 1,
"plans": [
{
"id": 10,
"source": "golf_plan",
"name": "平日プラン",
"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": "平日限定のお得なプラン",
"cancel_policy": "3日前まで無料キャンセル可能",
"rental_club_fee": 300000,
"rental_shoes_fee": 100000
}
]
},
"message": "",
"http_code": 200
}
price_local は現地(ローカル)料金、price_inbound はインバウンド(訪問客)料金です。予約・見積時はタイプ別人数(local / inbound。混在可)に応じてそれぞれの料金が適用されます。実際の予約・見積は partner_price_local / partner_price_inbound(パートナー価格)で確定します。予約できるのは bookable: true(source: golf_plan)のプランのみです。cancel_policy はお客様向けのキャンセル規定で、プラン個別の規定があればそれを、無ければゴルフ場のキャンセル規定を返します。
指定日の空きティータイムスロットを取得します。ティータイムスロットを使う場合は、予約時に tee_time_slot_id を渡せます(任意)。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
golf_club_id | integer | 必須 | ゴルフ場ID |
date | string | 必須 | 日付(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": "平日プラン", "price": 1500000 }
}
]
},
"message": "",
"http_code": 200
}
指定月の日別最低料金を取得します(カレンダー表示用)。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
golf_club_id | integer | 必須 | ゴルフ場ID |
year | integer | 任意 | 年(デフォルト: 今年) |
month | integer | 任意 | 月(デフォルト: 今月) |
{
"success": true,
"data": {
"golf_club_id": 1,
"year": 2026,
"month": 3,
"prices": {
"2026-03-01": 1500000,
"2026-03-02": 1800000
}
},
"message": "",
"http_code": 200
}
予約作成前に確定金額を取得します。予約作成API(create)は同じ計算ロジックで金額を再計算するため、本見積と一致します。返却額はパートナー価格(通常価格 − パートナー割引)です。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
golf_club_id | integer | 必須 | ゴルフ場ID |
golf_plan_id | integer | 必須 | プランID(plansのid) |
local_players | integer | 必須* | 現地(ローカル)料金のプレー人数 |
inbound_players | integer | 必須* | インバウンド料金のプレー人数(* いずれか一方以上。合計1〜20。混在可) |
date | string | 任意 | プレー日(YYYY-MM-DD)。指定するとプラン適用期間・曜日も検証 |
rental_club | integer | 任意 | レンタルクラブ本数(提供のあるゴルフ場のみ) |
rental_shoes | integer | 任意 | レンタルシューズ数(提供のあるゴルフ場のみ) |
/api/golf-clubs/detail.php の rental(club_available / shoes_available)または /api/golf-clubs/plans.php の rental_club_fee / rental_shoes_fee(null = 提供なし)で予約前に確認できます。提供のない(料金未設定の)ゴルフ場に本数を指定すると 409 エラーになります(0円での見積・予約は行いません)。
{
"success": true,
"data": {
"plan_id": 10,
"plan_name": "平日プラン",
"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
}
新しい予約を作成します。リクエストボディはJSON形式です。金額(total_amount)はサーバ側で golf_plan_id から再計算されるため、リクエストでは指定不要です。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
golf_club_id | integer | 必須 | ゴルフ場ID |
golf_plan_id | integer | 必須 | プランID(plansのid) |
tee_date | string | 必須 | プレー日(YYYY-MM-DD) |
customer_name | string | 必須 | 予約者氏名 |
customer_email | string | 必須 | 予約者メールアドレス |
customer_phone | string | 任意 | 予約者電話番号(指定時は予約者本人の連絡先として保存) |
players | object | 必須 | タイプ別プレー人数 {local?, inbound?}(混在可。合計1〜20) |
tee_time | string | 任意 | 希望ティータイム(HH:MM)。通常予約のみ。既定 08:00 |
tee_time_slot_id | integer | 任意 | 指定するとリアルタイム枠で即時確定+ゴルフ場側のティーシートに反映(availableで取得)。スロットの日付は tee_date と一致している必要があります。未指定は通常(リクエスト)予約 |
options | object | 任意 | レンタル等 {rental_club, rental_shoes} |
remark | string | 任意 | 備考 |
attendees | array | 任意 | 同伴者リスト({name, email?, phone?}) |
external_ref | string | 任意 | パートナー側の予約参照ID(推奨。一意) |
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": "田中太郎",
"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
}
予約一覧を取得します(自分が作成した予約のみ)。ページネーション対応。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
golf_club_id | integer | 任意 | ゴルフ場IDで絞り込み |
status | integer | 任意 | ステータスコード(1=予約依頼, 2=ゴルフ場確認中, 3=入金依頼中, 4=入金確認済・確定, 5=日程変更中, 6=キャンセル依頼, 7=キャンセル中(返金なし), 8=キャンセル中(返金あり), 9=完了, 10=完了(キャンセル)) |
date_from | string | 任意 | プレー日の開始(YYYY-MM-DD) |
date_to | string | 任意 | プレー日の終了(YYYY-MM-DD) |
page | integer | 任意 | ページ番号(デフォルト: 1) |
per_page | integer | 任意 | 1ページあたりの件数(デフォルト: 20, 最大: 100) |
sort | string | 任意 | ソート項目(tee_date / created) |
order | string | 任意 | ソート順(asc / desc) |
{
"success": true,
"data": {
"reservations": [
{
"id": 500,
"golf_club_id": 1,
"golf_club_name": "Sample Golf Club",
"customer_name": "田中太郎",
"tee_date": "2026-03-15",
"tee_time": "08:00",
"player_count": 4,
"players": { "local": 2, "inbound": 2 },
"total_amount": 7200000,
"status": "1.予約依頼",
"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
}
予約の詳細情報を取得します。id または external_ref のいずれかを指定します。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
id | integer | いずれか | GOVIGO予約ID |
external_ref | string | いずれか | パートナー側参照ID |
{
"success": true,
"data": {
"reservation": {
"id": 500,
"golf_club_id": 1,
"golf_club_name": "Sample Golf Club",
"plan_id": 10,
"plan_name": "平日プラン",
"customer_name": "田中太郎",
"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.予約依頼",
"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": "佐藤花子", "email": null, "phone": null }
]
}
},
"message": "",
"http_code": 200
}
予約内容を変更します。指定した項目のみ更新されます。players / options を変更した場合、total_amount はサーバ側で再計算されます。players は予約作成時と同じ解釈で、省略したタイプは0名として扱われます(必ず全タイプの人数を指定してください)。リアルタイム予約で合計人数が変わるとゴルフ場側の在庫も増減します。キャンセル系(status=6〜8)・完了(status=9,10)の予約は変更できません。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
reservation_id / external_ref | integer/string | いずれか必須 | 対象予約の参照キー |
players | object | 任意 | タイプ別プレー人数 {local?, inbound?}(変更時は金額再計算。省略タイプは0名扱い) |
options | object | 任意 | レンタル等(変更時は金額再計算) |
customer_name / customer_email / customer_phone | string | 任意 | 予約者情報 |
tee_date | string | 任意 | プレー日(YYYY-MM-DD)。リアルタイム予約(tee_time_slot_id 付き)は変更不可(キャンセル→再作成で対応) |
remark | string | 任意 | 備考 |
attendees | array | 任意 | 同伴者(指定時は総入れ替え) |
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": "1名キャンセル"
}
{
"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.予約依頼",
"status_code": 1,
"external_ref": "EXT-2026-00500",
"updated_at": "2026-03-02 09:00:00"
},
"message": "Reservation updated.",
"http_code": 200
}
予約をキャンセルします。reservation_id または external_ref を指定します。会員予約と同様にキャンセル依頼(status=6)として受け付け、担当者が確定します。リアルタイム枠の在庫は確定キャンセル時に復元されます(依頼時点では戻しません)。既にキャンセル系(status=6〜8)・完了(status=9,10)の予約はキャンセルできません。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
reservation_id / external_ref | integer/string | いずれか必須 | 対象予約の参照キー |
reason | string | 任意 | キャンセル理由 |
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": "予定変更のため"
}
{
"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
}
自分(パートナー)が作成した予約のステータス変化を自社システムへ通知する仕組みです。ゴルフ場を問わず、あなたのAPIキーで作成した全予約のイベントが対象になります(golf_club_id の指定は不要)。イベント発生時にHTTPS POSTで通知を送信します。
reservation.created(予約作成) / reservation.updated(内容変更。人数・オプション等) / reservation.status_changed(ステータス遷移) / reservation.cancelled(キャンセル) / *(全イベント)
reservation.cancelled と reservation.status_changed の違い:reservation.status_changed はすべてのステータス遷移で発火します(payload に old_status / new_status を含む)。reservation.cancelled はキャンセル「確定」(status 9 / 10)へ遷移したときに併せて発火する利便イベントです(キャンセル依頼 status 6 では発火しません。依頼は却下されうるため)。したがってキャンセル確定時は両方が発火します。キャンセル依頼の段階から追いたい場合は reservation.status_changed で new_status=6 を検知してください。
status / *_status_label)| コード | ラベル | 説明 |
|---|---|---|
0 | applying | 申込(仮予約) |
1 | confirming | 確認中(予約直後) |
2 | confirmed | 確定 |
3 | payment_waiting | 支払待ち |
4 | paid | 支払済 |
5 | completed | 完了(プレー済) |
6 | cancel_requested | キャンセル依頼(確定待ち) |
7 | cancel_rejected | キャンセル却下 |
8 | refunded | 返金済 |
9 | cancelled | キャンセル |
10 | cancelled | キャンセル(無効化) |
Webhookの受信URLを登録します。配信範囲は自動的に「自分が作成した予約」に限定されます。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
url | string | 必須 | Webhook受信URL(HTTPS必須) |
events | array | 必須 | 購読するイベント種別 |
POST /api/webhooks/subscribe.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{
"url": "https://your-system.com/webhook/govigo",
"events": ["reservation.created", "reservation.status_changed", "reservation.cancelled"]
}
{
"success": true,
"data": {
"subscription_id": 10,
"url": "https://your-system.com/webhook/govigo",
"events": ["reservation.created", "reservation.status_changed", "reservation.cancelled"],
"secret": "a1b2c3d4e5f6..."
},
"message": "",
"http_code": 201
}
secret はWebhookペイロードのHMAC検証に使用します。受信時に X-Webhook-Signature: sha256=... を検証してリクエストの正当性を確認してください。reservation.status_changed のペイロードには old_status / new_status(数値)と old_status_label / new_status_label が含まれます。
登録済みのWebhook一覧を取得します(パラメータ不要)。
{
"success": true,
"data": {
"count": 1,
"subscriptions": [
{
"id": 10,
"url": "https://your-system.com/webhook/govigo",
"events": ["reservation.created", "reservation.status_changed"],
"is_active": true,
"created_at": "2026-03-01 10:00:00",
"updated_at": "2026-03-01 10:00:00"
}
]
},
"message": "",
"http_code": 200
}
登録済みのWebhookを解除します。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
subscription_id | integer | 必須 | 解除対象のサブスクリプションID |
POST /api/webhooks/unsubscribe.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{ "subscription_id": 10 }
登録済みWebhookにテスト通知を送信し、受信URLの疎通と署名検証を確認します。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
subscription_id | integer | 必須 | テスト対象のサブスクリプションID |
POST /api/webhooks/test.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{ "subscription_id": 10 }