API Reference

APIガイド(パートナー予約連携)

認証

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
APIキーは管理画面から発行されます。各キーにはスコープ(権限)が設定されており、必要な操作に応じたスコープが付与されたキーを使用してください。予約連携パートナーには partner タイプのキーが発行されます。

利用可能なスコープ:

スコープ説明
golf_clubs:readゴルフ場・プラン情報の参照
tee_times:read空き状況・料金カレンダーの参照
reservations:read料金見積・予約情報の参照
reservations:write予約の作成・変更・キャンセル
webhooks:read / webhooks:writeWebhook(自分の予約イベント通知)の参照・管理(後述)

レスポンス共通形式

すべてのAPIレスポンスは以下の共通形式で返却されます。

{
  "success": true,
  "data": { ... },
  "message": "",
  "http_code": 200
}
フィールド説明
successbooleanリクエスト成功時 true、失敗時 false
dataobject|nullレスポンスデータ(エラー時は null
messagestringメッセージ(エラー時はエラー内容)
http_codeintegerHTTPステータスコード

エラーコード一覧

HTTPコード意味説明
400Bad Requestリクエストパラメータが不正
401UnauthorizedAPIキーが無効または未指定
403Forbiddenスコープ不足
404Not Found指定されたリソースが存在しない(または参照権限がない)
405Method Not AllowedHTTPメソッドが不正
409Conflictリソースの競合(重複予約、変更不可状態など)
429Too Many Requestsレートリミット超過
500Internal Server Errorサーバー内部エラー

予約の参照と認可

予約は2つのキーで参照できます。

キー説明
reservation_id / idGOVIGO内部の予約ID(整数)。レスポンスで返却されます。
external_refパートナー側システムの予約参照ID(文字列)。作成時に渡すと、以降は自社IDのまま予約を参照・変更・キャンセルできます。こちらの利用を推奨します。
認可(重要): APIキーには所有者スコープが適用されます。パートナーキーで参照・操作できるのは自分が作成した予約のみです。他者の予約IDを指定しても 404 Not Found を返します。external_ref は同一パートナー内で一意にしてください(重複時は既存予約を返します)。

疎通確認

GET /api/ping.php any

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
}

ゴルフ場・プラン情報

GET /api/golf-clubs/detail.php golf_clubs:read

ゴルフ場の詳細情報を取得します。id を省略すると一覧として返却されます。

パラメータ必須説明
idinteger任意ゴルフ場ID
countryinteger任意国コード(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)と料金(feenull = 提供なし)を返します。料金は null0 も「提供なし」として扱います。
GET /api/golf-clubs/plans.php golf_clubs:read

ゴルフ場のプラン一覧を取得します。ここで得られる id が予約時の golf_plan_id(必須)です。

パラメータ必須説明
golf_club_idinteger必須ゴルフ場ID
datestring任意指定日に有効なプランのみ取得(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: truesource: golf_plan)のプランのみです。cancel_policy はお客様向けのキャンセル規定で、プラン個別の規定があればそれを、無ければゴルフ場のキャンセル規定を返します。

空き状況

GET /api/tee-times/available.php tee_times:read

指定日の空きティータイムスロットを取得します。ティータイムスロットを使う場合は、予約時に tee_time_slot_id を渡せます(任意)。

パラメータ必須説明
golf_club_idinteger必須ゴルフ場ID
datestring必須日付(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
}
GET /api/tee-times/min-prices.php tee_times:read

指定月の日別最低料金を取得します(カレンダー表示用)。

パラメータ必須説明
golf_club_idinteger必須ゴルフ場ID
yearinteger任意年(デフォルト: 今年)
monthinteger任意月(デフォルト: 今月)
レスポンス例
{
  "success": true,
  "data": {
    "golf_club_id": 1,
    "year": 2026,
    "month": 3,
    "prices": {
      "2026-03-01": 1500000,
      "2026-03-02": 1800000
    }
  },
  "message": "",
  "http_code": 200
}

料金見積

GET /api/reservations/quote.php reservations:read

予約作成前に確定金額を取得します。予約作成API(create)は同じ計算ロジックで金額を再計算するため、本見積と一致します。返却額はパートナー価格(通常価格 − パートナー割引)です。

パラメータ必須説明
golf_club_idinteger必須ゴルフ場ID
golf_plan_idinteger必須プランID(plansのid
local_playersinteger必須*現地(ローカル)料金のプレー人数
inbound_playersinteger必須*インバウンド料金のプレー人数(* いずれか一方以上。合計1〜20。混在可)
datestring任意プレー日(YYYY-MM-DD)。指定するとプラン適用期間・曜日も検証
rental_clubinteger任意レンタルクラブ本数(提供のあるゴルフ場のみ)
rental_shoesinteger任意レンタルシューズ数(提供のあるゴルフ場のみ)
レンタルクラブ/シューズはゴルフ場ごとに提供有無が異なります。提供有無と料金は /api/golf-clubs/detail.phprentalclub_available / shoes_available)または /api/golf-clubs/plans.phprental_club_fee / rental_shoes_feenull = 提供なし)で予約前に確認できます。提供のない(料金未設定の)ゴルフ場に本数を指定すると 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
}

予約

POST /api/reservations/create.php reservations:write

新しい予約を作成します。リクエストボディはJSON形式です。金額(total_amount)はサーバ側で golf_plan_id から再計算されるため、リクエストでは指定不要です。

パラメータ必須説明
golf_club_idinteger必須ゴルフ場ID
golf_plan_idinteger必須プランID(plansのid
tee_datestring必須プレー日(YYYY-MM-DD)
customer_namestring必須予約者氏名
customer_emailstring必須予約者メールアドレス
customer_phonestring任意予約者電話番号(指定時は予約者本人の連絡先として保存)
playersobject必須タイプ別プレー人数 {local?, inbound?}(混在可。合計1〜20)
tee_timestring任意希望ティータイム(HH:MM)。通常予約のみ。既定 08:00
tee_time_slot_idinteger任意指定するとリアルタイム枠で即時確定+ゴルフ場側のティーシートに反映(availableで取得)。スロットの日付は tee_date と一致している必要があります。未指定は通常(リクエスト)予約
optionsobject任意レンタル等 {rental_club, rental_shoes}
remarkstring任意備考
attendeesarray任意同伴者リスト({name, email?, phone?})
external_refstring任意パートナー側の予約参照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"
}
レスポンス例(201 Created)
{
  "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
}
GET /api/reservations/list.php reservations:read

予約一覧を取得します(自分が作成した予約のみ)。ページネーション対応。

パラメータ必須説明
golf_club_idinteger任意ゴルフ場IDで絞り込み
statusinteger任意ステータスコード(1=予約依頼, 2=ゴルフ場確認中, 3=入金依頼中, 4=入金確認済・確定, 5=日程変更中, 6=キャンセル依頼, 7=キャンセル中(返金なし), 8=キャンセル中(返金あり), 9=完了, 10=完了(キャンセル))
date_fromstring任意プレー日の開始(YYYY-MM-DD)
date_tostring任意プレー日の終了(YYYY-MM-DD)
pageinteger任意ページ番号(デフォルト: 1)
per_pageinteger任意1ページあたりの件数(デフォルト: 20, 最大: 100)
sortstring任意ソート項目(tee_date / created)
orderstring任意ソート順(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
}
GET /api/reservations/detail.php reservations:read

予約の詳細情報を取得します。id または external_ref のいずれかを指定します。

パラメータ必須説明
idintegerいずれかGOVIGO予約ID
external_refstringいずれかパートナー側参照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
}
POST /api/reservations/update.php reservations:write

予約内容を変更します。指定した項目のみ更新されます。players / options を変更した場合、total_amount はサーバ側で再計算されます。players は予約作成時と同じ解釈で、省略したタイプは0名として扱われます(必ず全タイプの人数を指定してください)。リアルタイム予約で合計人数が変わるとゴルフ場側の在庫も増減します。キャンセル系(status=6〜8)・完了(status=9,10)の予約は変更できません。

パラメータ必須説明
reservation_id / external_refinteger/stringいずれか必須対象予約の参照キー
playersobject任意タイプ別プレー人数 {local?, inbound?}(変更時は金額再計算。省略タイプは0名扱い)
optionsobject任意レンタル等(変更時は金額再計算)
customer_name / customer_email / customer_phonestring任意予約者情報
tee_datestring任意プレー日(YYYY-MM-DD)。リアルタイム予約(tee_time_slot_id 付き)は変更不可(キャンセル→再作成で対応)
remarkstring任意備考
attendeesarray任意同伴者(指定時は総入れ替え)
リクエスト例
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
}
POST /api/reservations/cancel.php reservations:write

予約をキャンセルします。reservation_id または external_ref を指定します。会員予約と同様にキャンセル依頼(status=6)として受け付け、担当者が確定します。リアルタイム枠の在庫は確定キャンセル時に復元されます(依頼時点では戻しません)。既にキャンセル系(status=6〜8)・完了(status=9,10)の予約はキャンセルできません。

パラメータ必須説明
reservation_id / external_refinteger/stringいずれか必須対象予約の参照キー
reasonstring任意キャンセル理由
リクエスト例
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
}

Webhook

自分(パートナー)が作成した予約のステータス変化を自社システムへ通知する仕組みです。ゴルフ場を問わず、あなたのAPIキーで作成した全予約のイベントが対象になります(golf_club_id の指定は不要)。イベント発生時にHTTPS POSTで通知を送信します。

利用可能なイベント:
reservation.created(予約作成) / reservation.updated(内容変更。人数・オプション等) / reservation.status_changed(ステータス遷移) / reservation.cancelled(キャンセル) / *(全イベント)
reservation.cancelledreservation.status_changed の違い:
reservation.status_changedすべてのステータス遷移で発火します(payload に old_status / new_status を含む)。reservation.cancelledキャンセル「確定」(status 9 / 10)へ遷移したときに併せて発火する利便イベントです(キャンセル依頼 status 6 では発火しません。依頼は却下されうるため)。したがってキャンセル確定時は両方が発火します。キャンセル依頼の段階から追いたい場合は reservation.status_changednew_status=6 を検知してください。
ステータス一覧(status / *_status_label
コードラベル説明
0applying申込(仮予約)
1confirming確認中(予約直後)
2confirmed確定
3payment_waiting支払待ち
4paid支払済
5completed完了(プレー済)
6cancel_requestedキャンセル依頼(確定待ち)
7cancel_rejectedキャンセル却下
8refunded返金済
9cancelledキャンセル
10cancelledキャンセル(無効化)
POST /api/webhooks/subscribe.php webhooks:write

Webhookの受信URLを登録します。配信範囲は自動的に「自分が作成した予約」に限定されます。

パラメータ必須説明
urlstring必須Webhook受信URL(HTTPS必須)
eventsarray必須購読するイベント種別
リクエスト例
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"]
}
レスポンス例(201 Created)
{
  "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 が含まれます。
GET /api/webhooks/list.php webhooks:read

登録済みの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
}
POST /api/webhooks/unsubscribe.php webhooks:write

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

パラメータ必須説明
subscription_idinteger必須解除対象のサブスクリプションID
リクエスト例
POST /api/webhooks/unsubscribe.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json

{ "subscription_id": 10 }
POST /api/webhooks/test.php webhooks:write

登録済みWebhookにテスト通知を送信し、受信URLの疎通と署名検証を確認します。

パラメータ必須説明
subscription_idinteger必須テスト対象のサブスクリプションID
リクエスト例
POST /api/webhooks/test.php HTTP/1.1
Host: govigolf.comX-API-Key: YOUR_API_KEY
Content-Type: application/json

{ "subscription_id": 10 }