認証
APIキー認証。すべてのリクエストに X-API-Key ヘッダーを付与します。キーは管理者が発行し、integration タイプのキーは 1キーにつき1ゴルフ場(owner_id)に紐づきます。対象ゴルフ場はキーから特定されるため、golf_club_id はリクエストに含めません(他ゴルフ場のデータには一切アクセスできません)。
リクエストヘッダー例
POST /api/integration/tee-times/sync.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
スコープ: 参照系は integration:read、更新系は integration:write。
APIキー認証(X-API-Key ヘッダー、owner_type='golf_club' のキー)。GolfClubAuthService が処理します。対象ゴルフ場はキー(owner_id)から特定されるため、golf_club_id をパラメータで渡す必要はありません。
リクエストヘッダー例
GET /api/manage/reservations/list.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
スコープ(リソース別): reservations:read/write / tee_times:read/write / notifications:read/write / settings:read/write / reports:read。
連携: ティータイム
外部システムのティータイム枠を GOVIGO に同期(外部→GOVIGO)。最大 500 件/リクエスト。
| パラメータ | 型 | 必須 | 説明 |
slots | array | 必須 | 枠オブジェクトの配列(最大 500 件) |
slots 要素フィールド
| フィールド | 型 | 必須 | 説明 |
course_id | integer | 必須 | コースID(自ゴルフ場所属のみ) |
tee_time | string | 必須 | ティータイム(YYYY-MM-DD HH:MM) |
total_slots | integer | 任意 | 総枠数(既定: 4) |
available_slots | integer | 任意 | 空き枠数(既定: total_slots と同値) |
status | string | 任意 | open / closed / maintenance(既定: open) |
plan_id | integer | 任意 | 紐づくプランID(自ゴルフ場所属のみ) |
リクエスト例
POST /api/integration/tee-times/sync.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{
"slots": [
{ "course_id": 10, "tee_time": "2026-07-01 07:30", "total_slots": 4, "available_slots": 4 }
]
}
レスポンス data フィールド
| フィールド | 型 | 説明 |
inserted_count | integer | 新規作成した枠数 |
updated_count | integer | 更新した枠数 |
error_count | integer | 処理に失敗した件数 |
errors | array | エラー詳細メッセージの配列 |
GOVIGO 側のティータイムを取得(GOVIGO→外部)。
| パラメータ | 型 | 必須 | 説明 |
date_from | string | 必須 | 取得開始日(YYYY-MM-DD) |
date_to | string | 必須 | 取得終了日(YYYY-MM-DD) |
course_id | integer | 任意 | コースで絞り込み |
リクエスト例
GET /api/integration/tee-times/pull.php?date_from=2026-07-01&date_to=2026-07-07 HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
レスポンス data フィールド
| フィールド | 型 | 説明 |
golf_club_id | integer | ゴルフ場ID |
date_from / date_to | string | 取得対象期間 |
count | integer | 返却枠数 |
slots | array | 枠オブジェクトの配列(下表) |
slots 要素フィールド
| フィールド | 型 | 説明 |
slot_id | integer | 枠ID(GOVIGO内部ID) |
course_id | integer | コースID |
course_name | string | コース名 |
tee_time | string | ティータイム(YYYY-MM-DD HH:MM) |
total_slots | integer | 総枠数 |
available_slots | integer | 空き枠数 |
status | string | open / closed / maintenance |
allow_join | boolean | 相乗り許可フラグ |
plan_id | integer|null | 紐づくプランID |
指定期間の全量スナップショットで GOVIGO ミラーをクラブ側の正に合わせます(webhook 取りこぼし等のドリフト修復用)。全枠を upsert し、スナップショットに無い枠を掃除します。未予約の枠は論理クローズ(status=closed・物理削除しない)、予約済みなのにスナップショットから消えた枠はクローズせず conflicts として返却(手動調整用)。クローズした枠は顧客の空き枠表示から除外され、クラブが再投入すれば自動的に open に戻ります。クラブが定期実行(例: 夜間)する想定。
| パラメータ | 型 | 必須 | 説明 |
date_from / date_to | string | 必須 | 突合対象期間(YYYY-MM-DD) |
course_id | integer | 任意 | 指定時はそのコースのみ突合 |
slots | array | 必須 | 期間内の全枠(最大2000件/期間を狭めて分割可)。フィールドは sync と同形式(上表参照) |
リクエスト例
POST /api/integration/tee-times/reconcile.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{
"date_from": "2026-07-01",
"date_to": "2026-07-01",
"slots": [
{ "course_id": 10, "tee_time": "2026-07-01 07:30", "total_slots": 4, "available_slots": 4 }
]
}
レスポンス data フィールド
| フィールド | 型 | 説明 |
inserted_count | integer | 新規作成した枠数 |
updated_count | integer | 更新した枠数 |
closed_count | integer | 論理クローズした枠数(未予約 かつ スナップショット不在) |
conflict_count | integer | コンフリクト件数(予約済み かつ スナップショット不在) |
conflicts | array | コンフリクト枠の配列(下表)。手動調整が必要。 |
error_count | integer | 処理エラー件数 |
errors | array | エラー詳細メッセージの配列 |
conflicts 要素フィールド
| フィールド | 型 | 説明 |
tee_time_slot_id | integer | 枠ID(GOVIGO内部ID) |
course_id | integer | コースID |
tee_time | string | ティータイム(YYYY-MM-DD HH:MM) |
total_slots | integer | 総枠数 |
available_slots | integer | 空き枠数 |
booked | integer | 予約済み人数(= total - available) |
連携: 予約
外部システムで発生した予約を GOVIGO に取り込みます(外部→GOVIGO)。external_ref が冪等キーとなり、同じ値での二重送信は既存予約を返して終了します。
| パラメータ | 型 | 必須 | 説明 |
external_ref | string | 必須 | 外部システム側の予約参照キー(重複取込防止の冪等キー) |
course_id | integer | 必須 | コースID(自ゴルフ場所属のみ) |
tee_date | string | 必須 | プレー日(YYYY-MM-DD) |
customer_name | string | 必須 | 予約者名 |
player_count | integer | 必須 | プレー人数(1以上) |
tee_time | string | 任意 | ティータイム(HH:MM)。tee_time_slot_id 指定時はスロットの時刻を使用。 |
tee_time_slot_id | integer | 任意 | GOVIGO の予約枠ID。指定すると在庫を人数分確保(不足時は 409)。 |
golf_plan_id | integer | 任意 | プランID(自ゴルフ場所属のみ) |
customer_email | string | 任意 | 予約者メール |
customer_phone | string | 任意 | 予約者電話番号 |
total_amount | integer | 任意 | 合計金額(VND。既定: 0) |
remark | string | 任意 | 備考 |
options | object | 任意 | オプション情報(任意の key-value) |
attendees | array | 任意 | 同伴者の配列。各要素: {name (必須), email?, phone?} |
リクエスト例
POST /api/integration/reservations/receive.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{
"external_ref": "EXT-12345",
"course_id": 10,
"tee_date": "2026-07-01",
"tee_time": "07:30",
"customer_name": "山田 太郎",
"customer_email": "taro@example.com",
"customer_phone": "090-0000-0000",
"player_count": 2,
"total_amount": 3600000
}
レスポンス data フィールド
| フィールド | 型 | 説明 |
reservation_id | integer | GOVIGOが採番した予約ID |
external_ref | string | 外部参照キー(リクエストと同値) |
status | string | pending(作成時の初期ステータス) |
duplicate | boolean | 同じ external_ref が既存だった場合のみ true(HTTP 200) |
外部システム側で変更された予約を GOVIGO ミラーへ反映します(外部→GOVIGO)。指定した項目だけ更新。人数を変更すると在庫を差分調整します(増員で空き不足は 409)。キャンセルは cancel.php を使用。スロット紐づき予約の日時変更は不可(キャンセル→再作成)。
| パラメータ | 型 | 必須 | 説明 |
external_ref | string | いずれか必須 | 外部参照キーで対象を特定 |
reservation_id | integer | いずれか必須 | GOVIGO予約IDで対象を特定 |
customer_name | string | 任意 | 予約者名 |
customer_email | string | 任意 | 予約者メール |
customer_phone | string | 任意 | 予約者電話番号 |
tee_date | string | 任意 | プレー日(YYYY-MM-DD)。スロット紐づき予約は変更不可。 |
tee_time | string | 任意 | ティータイム(HH:MM)。スロット紐づき予約は変更不可。 |
player_count | integer | 任意 | プレー人数。スロットありの場合は在庫を差分調整。 |
total_amount | integer | 任意 | 合計金額(VND) |
remark | string | 任意 | 備考 |
options | object | 任意 | オプション情報 |
status | integer | 任意 | 1=予約済み / 3=完了 のみ指定可。キャンセルは cancel.php を使用。 |
リクエスト例
POST /api/integration/reservations/update.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{ "external_ref": "EXT-12345", "player_count": 3, "tee_time": "08:00" }
レスポンス data フィールド
| フィールド | 型 | 説明 |
reservation_id | integer | 更新した予約のID |
external_ref | string|null | 外部参照キー |
外部システム側でキャンセルされた予約を GOVIGO ミラーへ反映します(外部→GOVIGO)。ステータスをキャンセルにし、枠があれば在庫を人数分復元します。冪等(既にキャンセル済みでも成功を返す)。
| パラメータ | 型 | 必須 | 説明 |
external_ref | string | いずれか必須 | 外部参照キーで対象を特定 |
reservation_id | integer | いずれか必須 | GOVIGO予約IDで対象を特定 |
リクエスト例
POST /api/integration/reservations/cancel.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{ "external_ref": "EXT-12345" }
レスポンス data フィールド
| フィールド | 型 | 説明 |
reservation_id | integer | キャンセルした予約のID |
external_ref | string|null | 外部参照キー |
status | string | cancelled |
already | boolean | 既にキャンセル済みだった場合のみ true |
GOVIGO 側の予約データを取得します(GOVIGO→外部)。既定では当日〜30日後が対象。
| パラメータ | 型 | 必須 | 説明 |
date_from | string | 任意 | 取得開始日(YYYY-MM-DD。既定: 当日) |
date_to | string | 任意 | 取得終了日(YYYY-MM-DD。既定: 当日+30日) |
status | integer | 任意 | ステータスコードで絞り込み(下表参照) |
include_attendees | boolean | 任意 | true で同伴者情報を含める |
レスポンス data フィールド
| フィールド | 型 | 説明 |
golf_club_id | integer | ゴルフ場ID |
date_from / date_to | string | 取得対象期間 |
count | integer | 返却件数 |
reservations | array | 予約オブジェクトの配列(下表) |
reservations 要素フィールド
| フィールド | 型 | 説明 |
reservation_id | integer | GOVIGO予約ID |
course_id | integer | コースID |
course_name | string | コース名 |
customer_name | string | 予約者名 |
customer_email | string | 予約者メール |
customer_phone | string | 予約者電話番号 |
tee_date | string | プレー日(YYYY-MM-DD) |
tee_time | string | ティータイム(HH:MM) |
player_count | integer | プレー人数 |
total_amount | integer | 合計金額(VND) |
status | string | pending_payment / reserved / cancelled / completed |
status_code | integer | ステータスコード(0=支払待ち / 1=予約済み / 2=キャンセル / 3=完了) |
source | string | 予約経路(api_integration 等) |
external_ref | string|null | 外部参照キー |
created_at | string | 作成日時 |
updated_at | string | 更新日時 |
attendees | array | include_attendees=true 時のみ。{name, email, phone} の配列 |
連携: Webhook
予約・在庫などのイベント通知先 URL を登録します。
| パラメータ | 型 | 必須 | 説明 |
url | string | 必須 | Webhook受信URL(HTTPS必須) |
events | array | 必須 | 購読するイベント種別(reservation.created/updated/cancelled/status_changed, tee_time.updated, *) |
リクエスト例
POST /api/integration/webhooks/subscribe.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{ "url": "https://example.com/hook", "events": ["reservation.created", "reservation.cancelled"] }
登録済み Webhook の一覧を取得します(パラメータなし。対象ゴルフ場はキーから特定)。
登録済み Webhook を解除します。
| パラメータ | 型 | 必須 | 説明 |
subscription_id | integer | 必須 | 解除対象のサブスクリプションID |
指定サブスクリプションにテストイベントを送信します。
| パラメータ | 型 | 必須 | 説明 |
subscription_id | integer | 必須 | テスト対象のサブスクリプションID |
管理: 予約
自ゴルフ場の予約一覧を取得します。既定: 20件/ページ(最大100件)。
| パラメータ | 型 | 必須 | 説明 |
status | integer | 任意 | ステータスコードで絞り込み(下表参照) |
date_from / date_to | string | 任意 | プレー日で絞り込み(YYYY-MM-DD) |
search | string | 任意 | 予約者名・メール・電話番号のキーワード検索 |
page | integer | 任意 | ページ番号(既定: 1) |
per_page | integer | 任意 | 1ページの件数(既定: 20、最大: 100) |
リクエスト例
GET /api/manage/reservations/list.php?date_from=2026-07-01&date_to=2026-07-31&page=1 HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
レスポンス data フィールド
| フィールド | 型 | 説明 |
reservations | array | 予約オブジェクトの配列(下表) |
pagination.page | integer | 現在ページ |
pagination.per_page | integer | 1ページの件数 |
pagination.total_count | integer | 総件数 |
pagination.total_pages | integer | 総ページ数 |
pagination.has_next | boolean | 次ページの有無 |
pagination.has_prev | boolean | 前ページの有無 |
reservations 要素フィールド
| フィールド | 型 | 説明 |
id | integer | 予約ID |
course_name | string | コース名 |
customer_name | string | 予約者名 |
customer_email | string | 予約者メール |
customer_phone | string | 予約者電話番号 |
tee_date | string | プレー日(YYYY-MM-DD) |
tee_time | string | ティータイム(HH:MM) |
player_count | integer | プレー人数 |
total_amount | integer | 合計金額(VND) |
status | string | ステータス文字列(下表) |
status_code | integer | ステータスコード(0〜5, 9) |
source | string | 予約経路 |
remark | string | 備考 |
created_at | string | 作成日時 |
ステータスコード対応表
0 = pending(申請中)/ 1 = awaiting_confirmation(確認待ち)/ 2 = confirmed(確認済み)/ 3 = awaiting_payment(入金待ち)/ 4 = paid(支払済み)/ 5 = completed(完了)/ 9 = cancelled(キャンセル)
予約の詳細を取得します。同伴者情報を含みます。
| パラメータ | 型 | 必須 | 説明 |
reservation_id | integer | 必須 | 予約ID(旧 id も互換で受付) |
レスポンス data.reservation フィールド
| フィールド | 型 | 説明 |
id | integer | 予約ID |
course_name | string | コース名 |
plan_name | string|null | プラン名 |
customer_name | string | 予約者名 |
customer_email | string | 予約者メール |
customer_phone | string | 予約者電話番号 |
tee_date | string | プレー日(YYYY-MM-DD) |
tee_time | string | ティータイム(HH:MM) |
player_count | integer | プレー人数 |
total_amount | integer | 合計金額(VND) |
remark | string | 備考 |
options | object|null | オプション情報 |
status | string | ステータス文字列(list と同じコード対応表) |
status_code | integer | ステータスコード(0〜5, 9) |
source | string | 予約経路 |
external_ref | string|null | 外部参照キー |
created_at | string | 作成日時 |
updated_at | string | 更新日時 |
attendees | array | 同伴者の配列。各要素: {id, name, email, phone} |
予約ステータスを変更します。status=9 はキャンセル扱いとなり、在庫を復元します。キャンセル済み予約を別ステータスへ戻すことはできません(409)。
| パラメータ | 型 | 必須 | 説明 |
reservation_id | integer | 必須 | 予約ID |
status | integer | 必須 | 変更後ステータスコード(0〜5, 9) |
memo | string | 任意 | 変更メモ(備考に追記されます) |
リクエスト例
POST /api/manage/reservations/update-status.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{ "reservation_id": 123, "status": 2, "memo": "確認済み" }
レスポンス data フィールド
| フィールド | 型 | 説明 |
reservation_id | integer | 更新した予約のID |
old_status | string | 変更前ステータス文字列 |
new_status | string | 変更後ステータス文字列 |
管理: 予約枠
指定日の予約枠一覧を取得します。
| パラメータ | 型 | 必須 | 説明 |
date | string | 必須 | 対象日(YYYY-MM-DD) |
course_id | integer | 任意 | コースで絞り込み |
レスポンス data フィールド
| フィールド | 型 | 説明 |
date | string | 取得対象日 |
count | integer | 返却枠数 |
slots | array | 枠オブジェクトの配列(下表) |
slots 要素フィールド
| フィールド | 型 | 説明 |
id | integer | 枠ID(= slot_id) |
course_id | integer | コースID |
course_name | string | コース名 |
tee_time | string | ティータイム(HH:MM) |
total_slots | integer | 総枠数 |
available_slots | integer | 空き枠数 |
booked_slots | integer | 予約済み枠数(= total - available) |
status | string | open / closed / maintenance |
allow_join | boolean | 相乗り許可フラグ |
plan_id | integer|null | 紐づくプランID |
plan_name | string|null | プラン名 |
予約枠を1件更新します。更新後の available_slots が 0〜total_slots の範囲を外れる場合は 400 を返します。
| パラメータ | 型 | 必須 | 説明 |
slot_id | integer | 必須 | 予約枠ID |
total_slots | integer | 任意 | 総枠数(1以上) |
available_slots | integer | 任意 | 空き枠数(0以上 かつ total_slots 以下) |
status | string | 任意 | open / closed / maintenance |
allow_join | boolean | 任意 | 相乗り許可 |
golf_club_plan_id | integer|null | 任意 | 紐づくプランID(null で解除。自ゴルフ場所属のみ) |
レスポンス data フィールド
| フィールド | 型 | 説明 |
slot_id | integer | 更新した枠のID |
updated | boolean | true |
複数の予約枠をまとめて更新します(最大 200 件)。1件でもバリデーションエラーがあった場合はその件をスキップして続行し、errors に詳細を返します。
| パラメータ | 型 | 必須 | 説明 |
slots | array | 必須 | 更新対象枠の配列(最大200件) |
slots 要素フィールド
| フィールド | 型 | 必須 | 説明 |
slot_id | integer | 必須 | 予約枠ID |
total_slots | integer | 任意 | 総枠数 |
available_slots | integer | 任意 | 空き枠数 |
status | string | 任意 | open / closed / maintenance |
allow_join | boolean | 任意 | 相乗り許可 |
リクエスト例
POST /api/manage/tee-times/bulk-update.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json
{ "slots": [ { "slot_id": 501, "available_slots": 0, "status": "closed" }, { "slot_id": 502, "available_slots": 2 } ] }
レスポンス data フィールド
| フィールド | 型 | 説明 |
updated_count | integer | 更新に成功した枠数 |
error_count | integer | スキップした件数 |
errors | array | エラー詳細メッセージの配列 |