API Reference

ゴルフ場APIガイド(連携・管理)

概要

ゴルフ場API は用途の異なる2系統で構成されます。パートナー予約連携API(会員向け)とは別物です。

系統パス認証用途
連携 (Integration)/api/integration/*APIキー(integration スコープ)外部予約・在庫システムとの双方向連携(ティータイム在庫/予約/Webhook)。在庫は tee-times/*(sync/pull/reconcile)に一本化。1キー = 1ゴルフ場
管理 (Management)/api/manage/*APIキー(リソース別スコープ)ゴルフ場の操作(予約・予約枠・通知・設定・レポート)。golf_club_id はキー(owner_id)から特定。
すべてのレスポンスは JSON(CSVエクスポートを除く)。日時は特記なき限り YYYY-MM-DD / HH:MM 形式。金額は VND(整数)です。

認証

Integration/api/integration/*

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

Management/api/manage/*

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

レスポンス共通形式

CSVエクスポートを除き、すべて以下の JSON エンベロープで返ります。

成功
{
  "status": "success",
  "message": "...",
  "data": { ... }
}
エラー
{
  "status": "error",
  "message": "エラー内容",
  "data": null
}

エラーコード一覧

HTTP意味
400リクエスト不正(必須パラメータ不足・JSON不正など)
401認証失敗(APIキー無効 / 未ログイン / トークン期限切れ)
403権限不足(スコープ不足 / 対象ゴルフ場へのアクセス不可)
404対象リソースが存在しない
405許可されていない HTTP メソッド
429レート制限超過
500サーバ内部エラー
外部連携 API(Integration)

連携: ティータイム

POST/api/integration/tee-times/sync.phpintegration:write

外部システムのティータイム枠を GOVIGO に同期(外部→GOVIGO)。最大 500 件/リクエスト。

パラメータ必須説明
slotsarray必須枠オブジェクトの配列(最大 500 件)
slots 要素フィールド
フィールド必須説明
course_idinteger必須コースID(自ゴルフ場所属のみ)
tee_timestring必須ティータイム(YYYY-MM-DD HH:MM
total_slotsinteger任意総枠数(既定: 4)
available_slotsinteger任意空き枠数(既定: total_slots と同値)
statusstring任意open / closed / maintenance(既定: open
plan_idinteger任意紐づくプラン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_countinteger新規作成した枠数
updated_countinteger更新した枠数
error_countinteger処理に失敗した件数
errorsarrayエラー詳細メッセージの配列
GET/api/integration/tee-times/pull.phpintegration:read

GOVIGO 側のティータイムを取得(GOVIGO→外部)。

パラメータ必須説明
date_fromstring必須取得開始日(YYYY-MM-DD)
date_tostring必須取得終了日(YYYY-MM-DD)
course_idinteger任意コースで絞り込み
リクエスト例
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_idintegerゴルフ場ID
date_from / date_tostring取得対象期間
countinteger返却枠数
slotsarray枠オブジェクトの配列(下表)
slots 要素フィールド
フィールド説明
slot_idinteger枠ID(GOVIGO内部ID)
course_idintegerコースID
course_namestringコース名
tee_timestringティータイム(YYYY-MM-DD HH:MM
total_slotsinteger総枠数
available_slotsinteger空き枠数
statusstringopen / closed / maintenance
allow_joinboolean相乗り許可フラグ
plan_idinteger|null紐づくプランID
POST/api/integration/tee-times/reconcile.phpintegration:write

指定期間の全量スナップショットで GOVIGO ミラーをクラブ側の正に合わせます(webhook 取りこぼし等のドリフト修復用)。全枠を upsert し、スナップショットに無い枠を掃除します。未予約の枠は論理クローズ(status=closed・物理削除しない)予約済みなのにスナップショットから消えた枠はクローズせず conflicts として返却(手動調整用)。クローズした枠は顧客の空き枠表示から除外され、クラブが再投入すれば自動的に open に戻ります。クラブが定期実行(例: 夜間)する想定。

パラメータ必須説明
date_from / date_tostring必須突合対象期間(YYYY-MM-DD)
course_idinteger任意指定時はそのコースのみ突合
slotsarray必須期間内の全枠(最大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_countinteger新規作成した枠数
updated_countinteger更新した枠数
closed_countinteger論理クローズした枠数(未予約 かつ スナップショット不在)
conflict_countintegerコンフリクト件数(予約済み かつ スナップショット不在)
conflictsarrayコンフリクト枠の配列(下表)。手動調整が必要。
error_countinteger処理エラー件数
errorsarrayエラー詳細メッセージの配列
conflicts 要素フィールド
フィールド説明
tee_time_slot_idinteger枠ID(GOVIGO内部ID)
course_idintegerコースID
tee_timestringティータイム(YYYY-MM-DD HH:MM
total_slotsinteger総枠数
available_slotsinteger空き枠数
bookedinteger予約済み人数(= total - available)

連携: 予約

POST/api/integration/reservations/receive.phpintegration:write

外部システムで発生した予約を GOVIGO に取り込みます(外部→GOVIGO)。external_ref が冪等キーとなり、同じ値での二重送信は既存予約を返して終了します。

パラメータ必須説明
external_refstring必須外部システム側の予約参照キー(重複取込防止の冪等キー)
course_idinteger必須コースID(自ゴルフ場所属のみ)
tee_datestring必須プレー日(YYYY-MM-DD)
customer_namestring必須予約者名
player_countinteger必須プレー人数(1以上)
tee_timestring任意ティータイム(HH:MM)。tee_time_slot_id 指定時はスロットの時刻を使用。
tee_time_slot_idinteger任意GOVIGO の予約枠ID。指定すると在庫を人数分確保(不足時は 409)。
golf_plan_idinteger任意プランID(自ゴルフ場所属のみ)
customer_emailstring任意予約者メール
customer_phonestring任意予約者電話番号
total_amountinteger任意合計金額(VND。既定: 0)
remarkstring任意備考
optionsobject任意オプション情報(任意の key-value)
attendeesarray任意同伴者の配列。各要素: {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_idintegerGOVIGOが採番した予約ID
external_refstring外部参照キー(リクエストと同値)
statusstringpending(作成時の初期ステータス)
duplicateboolean同じ external_ref が既存だった場合のみ true(HTTP 200)
POST/api/integration/reservations/update.phpintegration:write

外部システム側で変更された予約を GOVIGO ミラーへ反映します(外部→GOVIGO)。指定した項目だけ更新。人数を変更すると在庫を差分調整します(増員で空き不足は 409)。キャンセルは cancel.php を使用。スロット紐づき予約の日時変更は不可(キャンセル→再作成)。

パラメータ必須説明
external_refstringいずれか必須外部参照キーで対象を特定
reservation_idintegerいずれか必須GOVIGO予約IDで対象を特定
customer_namestring任意予約者名
customer_emailstring任意予約者メール
customer_phonestring任意予約者電話番号
tee_datestring任意プレー日(YYYY-MM-DD)。スロット紐づき予約は変更不可。
tee_timestring任意ティータイム(HH:MM)。スロット紐づき予約は変更不可。
player_countinteger任意プレー人数。スロットありの場合は在庫を差分調整。
total_amountinteger任意合計金額(VND)
remarkstring任意備考
optionsobject任意オプション情報
statusinteger任意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_idinteger更新した予約のID
external_refstring|null外部参照キー
POST/api/integration/reservations/cancel.phpintegration:write

外部システム側でキャンセルされた予約を GOVIGO ミラーへ反映します(外部→GOVIGO)。ステータスをキャンセルにし、枠があれば在庫を人数分復元します。冪等(既にキャンセル済みでも成功を返す)。

パラメータ必須説明
external_refstringいずれか必須外部参照キーで対象を特定
reservation_idintegerいずれか必須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_idintegerキャンセルした予約のID
external_refstring|null外部参照キー
statusstringcancelled
alreadyboolean既にキャンセル済みだった場合のみ true
POST/api/integration/reservations/push.phpintegration:read

GOVIGO 側の予約データを取得します(GOVIGO→外部)。既定では当日〜30日後が対象。

パラメータ必須説明
date_fromstring任意取得開始日(YYYY-MM-DD。既定: 当日)
date_tostring任意取得終了日(YYYY-MM-DD。既定: 当日+30日)
statusinteger任意ステータスコードで絞り込み(下表参照)
include_attendeesboolean任意true で同伴者情報を含める
レスポンス data フィールド
フィールド説明
golf_club_idintegerゴルフ場ID
date_from / date_tostring取得対象期間
countinteger返却件数
reservationsarray予約オブジェクトの配列(下表)
reservations 要素フィールド
フィールド説明
reservation_idintegerGOVIGO予約ID
course_idintegerコースID
course_namestringコース名
customer_namestring予約者名
customer_emailstring予約者メール
customer_phonestring予約者電話番号
tee_datestringプレー日(YYYY-MM-DD)
tee_timestringティータイム(HH:MM)
player_countintegerプレー人数
total_amountinteger合計金額(VND)
statusstringpending_payment / reserved / cancelled / completed
status_codeintegerステータスコード(0=支払待ち / 1=予約済み / 2=キャンセル / 3=完了)
sourcestring予約経路(api_integration 等)
external_refstring|null外部参照キー
created_atstring作成日時
updated_atstring更新日時
attendeesarrayinclude_attendees=true 時のみ。{name, email, phone} の配列

連携: Webhook

POST/api/integration/webhooks/subscribe.phpintegration:write

予約・在庫などのイベント通知先 URL を登録します。

パラメータ必須説明
urlstring必須Webhook受信URL(HTTPS必須)
eventsarray必須購読するイベント種別(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"] }
GET/api/integration/webhooks/list.phpintegration:read

登録済み Webhook の一覧を取得します(パラメータなし。対象ゴルフ場はキーから特定)。

POST/api/integration/webhooks/unsubscribe.phpintegration:write

登録済み Webhook を解除します。

パラメータ必須説明
subscription_idinteger必須解除対象のサブスクリプションID
POST/api/integration/webhooks/test.phpintegration:write

指定サブスクリプションにテストイベントを送信します。

パラメータ必須説明
subscription_idinteger必須テスト対象のサブスクリプションID
管理 API(Management)

管理: 予約

GET/api/manage/reservations/list.phpreservations:read

自ゴルフ場の予約一覧を取得します。既定: 20件/ページ(最大100件)。

パラメータ必須説明
statusinteger任意ステータスコードで絞り込み(下表参照)
date_from / date_tostring任意プレー日で絞り込み(YYYY-MM-DD)
searchstring任意予約者名・メール・電話番号のキーワード検索
pageinteger任意ページ番号(既定: 1)
per_pageinteger任意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 フィールド
フィールド説明
reservationsarray予約オブジェクトの配列(下表)
pagination.pageinteger現在ページ
pagination.per_pageinteger1ページの件数
pagination.total_countinteger総件数
pagination.total_pagesinteger総ページ数
pagination.has_nextboolean次ページの有無
pagination.has_prevboolean前ページの有無
reservations 要素フィールド
フィールド説明
idinteger予約ID
course_namestringコース名
customer_namestring予約者名
customer_emailstring予約者メール
customer_phonestring予約者電話番号
tee_datestringプレー日(YYYY-MM-DD)
tee_timestringティータイム(HH:MM)
player_countintegerプレー人数
total_amountinteger合計金額(VND)
statusstringステータス文字列(下表)
status_codeintegerステータスコード(0〜5, 9)
sourcestring予約経路
remarkstring備考
created_atstring作成日時
ステータスコード対応表
0 = pending(申請中)/ 1 = awaiting_confirmation(確認待ち)/ 2 = confirmed(確認済み)/ 3 = awaiting_payment(入金待ち)/ 4 = paid(支払済み)/ 5 = completed(完了)/ 9 = cancelled(キャンセル)
GET/api/manage/reservations/detail.phpreservations:read

予約の詳細を取得します。同伴者情報を含みます。

パラメータ必須説明
reservation_idinteger必須予約ID(旧 id も互換で受付)
レスポンス data.reservation フィールド
フィールド説明
idinteger予約ID
course_namestringコース名
plan_namestring|nullプラン名
customer_namestring予約者名
customer_emailstring予約者メール
customer_phonestring予約者電話番号
tee_datestringプレー日(YYYY-MM-DD)
tee_timestringティータイム(HH:MM)
player_countintegerプレー人数
total_amountinteger合計金額(VND)
remarkstring備考
optionsobject|nullオプション情報
statusstringステータス文字列(list と同じコード対応表)
status_codeintegerステータスコード(0〜5, 9)
sourcestring予約経路
external_refstring|null外部参照キー
created_atstring作成日時
updated_atstring更新日時
attendeesarray同伴者の配列。各要素: {id, name, email, phone}
POST/api/manage/reservations/update-status.phpreservations:write

予約ステータスを変更します。status=9 はキャンセル扱いとなり、在庫を復元します。キャンセル済み予約を別ステータスへ戻すことはできません(409)。

パラメータ必須説明
reservation_idinteger必須予約ID
statusinteger必須変更後ステータスコード(0〜5, 9)
memostring任意変更メモ(備考に追記されます)
リクエスト例
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_idinteger更新した予約のID
old_statusstring変更前ステータス文字列
new_statusstring変更後ステータス文字列

管理: 予約枠

GET/api/manage/tee-times/list.phptee_times:read

指定日の予約枠一覧を取得します。

パラメータ必須説明
datestring必須対象日(YYYY-MM-DD)
course_idinteger任意コースで絞り込み
レスポンス data フィールド
フィールド説明
datestring取得対象日
countinteger返却枠数
slotsarray枠オブジェクトの配列(下表)
slots 要素フィールド
フィールド説明
idinteger枠ID(= slot_id
course_idintegerコースID
course_namestringコース名
tee_timestringティータイム(HH:MM)
total_slotsinteger総枠数
available_slotsinteger空き枠数
booked_slotsinteger予約済み枠数(= total - available)
statusstringopen / closed / maintenance
allow_joinboolean相乗り許可フラグ
plan_idinteger|null紐づくプランID
plan_namestring|nullプラン名
POST/api/manage/tee-times/update.phptee_times:write

予約枠を1件更新します。更新後の available_slots が 0〜total_slots の範囲を外れる場合は 400 を返します。

パラメータ必須説明
slot_idinteger必須予約枠ID
total_slotsinteger任意総枠数(1以上)
available_slotsinteger任意空き枠数(0以上 かつ total_slots 以下)
statusstring任意open / closed / maintenance
allow_joinboolean任意相乗り許可
golf_club_plan_idinteger|null任意紐づくプランID(null で解除。自ゴルフ場所属のみ)
レスポンス data フィールド
フィールド説明
slot_idinteger更新した枠のID
updatedbooleantrue
POST/api/manage/tee-times/bulk-update.phptee_times:write

複数の予約枠をまとめて更新します(最大 200 件)。1件でもバリデーションエラーがあった場合はその件をスキップして続行し、errors に詳細を返します。

パラメータ必須説明
slotsarray必須更新対象枠の配列(最大200件)
slots 要素フィールド
フィールド必須説明
slot_idinteger必須予約枠ID
total_slotsinteger任意総枠数
available_slotsinteger任意空き枠数
statusstring任意open / closed / maintenance
allow_joinboolean任意相乗り許可
リクエスト例
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_countinteger更新に成功した枠数
error_countintegerスキップした件数
errorsarrayエラー詳細メッセージの配列

管理: 通知

GET/api/manage/notifications/list.phpnotifications:read

通知一覧を取得します。作成日時の降順。

パラメータ必須説明
pageinteger任意ページ番号(既定: 1)
per_pageinteger任意1ページの件数(既定: 20、最大: 100)
unread_onlyinteger任意1 で未読のみ取得
レスポンス data フィールド
フィールド説明
notificationsarray通知オブジェクトの配列(下表)
paginationobjectページング情報(予約一覧と同形式)
notifications 要素フィールド
フィールド説明
idinteger通知ID
typestring通知種別(例: reservation.created
reserve_idinteger|null関連する予約ID
titlestring通知タイトル
bodystring通知本文
is_readboolean既読フラグ
created_atstring作成日時
POST/api/manage/notifications/mark-read.phpnotifications:write

通知を既読にします。notification_idsall のいずれかが必須。

パラメータ必須説明
notification_idsarrayいずれか必須既読にする通知IDの配列(integer[])
allbooleanいずれか必須true で全件既読
レスポンス data フィールド
フィールド説明
updated_countinteger既読に更新した件数
GET/api/manage/notifications/unread-count.phpnotifications:read

未読通知数を取得します。パラメータなし。

レスポンス data フィールド
フィールド説明
unread_countinteger未読通知数

管理: 設定

GET/api/manage/settings/get.phpsettings:read

ゴルフ場設定を取得します。key 省略時は全件を { key: value } 形式で返します。

パラメータ必須説明
keystring任意指定すると当該キーのみ取得(省略時は全件)
レスポンス data フィールド(単件取得時)
フィールド説明
keystring設定キー
valuestring|null設定値(未登録の場合 null
レスポンス data フィールド(全件取得時)
フィールド説明
countinteger設定キー総数
settingsobject{ "key": "value", ... } 形式のオブジェクト
POST/api/manage/settings/update.phpsettings:write

ゴルフ場設定を更新します(UPSERT)。複数キーを一括更新可能。

パラメータ必須説明
settingsobject必須{ "key": "value", ... } 形式の設定オブジェクト
リクエスト例
POST /api/manage/settings/update.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json

{ "settings": { "auto_confirm": "1", "cancel_deadline_days": "3" } }
レスポンス data フィールド
フィールド説明
updated_countinteger更新した設定キー数
settingsobject更新後の { "key": "value", ... } オブジェクト

管理: レポート

GET/api/manage/reports/summary.phpreports:read

予約実績の集計を取得します。既定期間は当月。

パラメータ必須説明
date_from / date_tostring任意集計期間(YYYY-MM-DD。既定: 当月1日〜末日)
group_bystring任意date(日別)/ course(コース別)/ status(ステータス別)。既定: date
レスポンス data フィールド
フィールド説明
period.from / period.tostring集計期間
summary.total_reservationsinteger総予約件数
summary.pending_countinteger未確定件数(confirmed・cancelled 以外)
summary.confirmed_countinteger確認済み件数
summary.cancelled_countintegerキャンセル件数
summary.completed_countinteger完了件数
summary.total_playersinteger累計人数
summary.total_revenueinteger累計売上(VND。キャンセルを除く)
summary.avg_amountinteger平均単価(VND。キャンセルを除く)
breakdownarrayグループ別集計の配列(下表)
breakdown 要素フィールド
フィールド説明
date / course_name / statusstringgroup_by の指定に応じてキー名が変わる
reservation_countinteger予約件数
player_countinteger人数合計
revenueinteger売上合計(VND。キャンセルを除く)
GET/api/manage/reports/export.phpreports:read

予約データを CSV でエクスポートします。レスポンスは text/csv(JSON エンベロープではなく、UTF-8 BOM 付き CSV ファイル)。

パラメータ必須説明
date_from / date_tostring任意対象期間(YYYY-MM-DD。既定: 当月)
statusinteger任意ステータスコードで絞り込み
リクエスト例
GET /api/manage/reports/export.php?date_from=2026-07-01&date_to=2026-07-31 HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
CSV 列一覧
列名説明
予約IDGOVIGOの予約ID
コースコース名
予約者名顧客名
メール顧客メールアドレス
電話番号顧客電話番号
プレー日YYYY-MM-DD
時間HH:MM
人数プレー人数
金額合計金額(VND)
ステータス日本語ステータス名
ソース予約経路
備考備考テキスト
申込日作成日時