API Reference

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

認証

GOVIGO APIはAPIキー認証を使用します。すべてのリクエストに X-API-Key ヘッダーを含めてください。

リクエストヘッダー例
GET /api/golf-clubs/plans.php?golf_club_id=1 HTTP/1.1
Host: govigolf.com
X-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)のみ提供対象(他国を指定しても結果は返りません)
langstring任意返す言語。ja(既定)/ en / vi / kr / cn。それ以外は 400
updated_sincestring任意ISO 8601 日時(例 2026-10-01T00:00:00Z)。updated_at がこれ以降のゴルフ場だけを返します(該当なしは count: 0)
レスポンス例(lang=en)
{
  "success": true,
  "data": {
    "lang": "en",
    "count": 1,
    "golf_clubs": [
      {
        "id": 1,
        "name": "Sample Golf Club",
        "area": "Central (Da Nang / Hue)",
        "area_code": 3,
        "country": 0,
        "address": "Xa Loc Vinh, Phu Loc, Hue, Viet Nam",
        "google_map": "https://maps.google.com/...",
        "latitude": 16.3312358,
        "longitude": 107.9558334,
        "phone": "+842343695880",
        "opening_hours": "05:30-18:00",
        "description": "Located about an hour's drive from Da Nang ...",
        "access": null,
        "courses": [
          { "name": "Lagoon Course", "holes": 18, "par": 71, "length_yards": 7101, "designer": "Sir Nick Faldo" }
        ],
        "course_info": "18 holes, Par 71 / 7,101 yards",
        "remark": "Located about an hour's drive from Da Nang ...",
        "opened_on": "2013-03-01",
        "dress_code": "Collared shirts required ...",
        "cancel_policy": "Free cancellation up to 9 days before tee time ...",
        "main_image": {
          "url": "https://govigolf.com/images/golf_club_top_picture/xxx.jpg",
          "thumbnail_url": "https://govigolf.com/images/golf_club_picture/thumb/xxx.jpg"
        },
        "images": [
          { "url": "https://govigolf.com/images/golf_club_picture/yyy.jpg",
            "thumbnail_url": "https://govigolf.com/api/golf-clubs/thumbnail.php?src=..." }
        ],
        "facilities": {
          "driving_range": { "available": true,  "note": null },
          "pro_shop":      { "available": true,  "note": null },
          "restaurant":    { "available": true,  "note": null },
          "lesson":        { "available": false, "note": null },
          "night_golf":    { "available": false },
          "note": null
        },
        "updated_at": "2026-08-18T09:30:40Z",
        "rental": {
          "club_available": true,
          "club_fee": 300000,
          "shoes_available": false,
          "shoes_fee": null
        },
        "options": {
          "rental_cart":      { "available": true,  "included": true,  "fee": null },
          "rental_umbrella":  { "available": false, "included": false, "fee": null },
          "caddy":            { "available": true,  "included": true,  "fee": null },
          "caddy_designate":  { "available": true,  "included": false, "fee": 200000 },
          "caddybag_storage": { "available": false, "included": false, "fee": null },
          "sent_caddybag":    { "available": false, "included": false, "fee": null },
          "accompany":        { "available": false, "included": false, "fee": null },
          "pickup":           { "available": false, "description": null }
        }
      }
    ]
  },
  "message": "Golf club information retrieved.",
  "http_code": 200
}
言語について: name / area / description / access / course_info / remark / dress_code / cancel_policy / facilities.note は lang の言語で返します。未登録の言語は vi・kr・cn → en → ja、en → ja の順に代わりの言語で返します(kr・cn は現在ほぼ英語になります)。address は現地表記のみです。facilities.*.note(各施設の説明)は日本語のみのため lang=ja のときだけ返します。
主な項目
description紹介文。
accessアクセス(登録のあるゴルフ場のみ。無ければ null)。
coursesコースごとの仕様(コース名・ホール数・パー・総距離〔ヤード〕・設計者)。複数コースのゴルフ場は複数件。未登録のゴルフ場は []、未登録の項目は null。
course_infoコース概要(自由記述)。courses が未登録でも、ここにホール数・パー・距離が書かれていることがあります。両方ある場合は両方返します。
opening_hours営業時間(例 05:30-18:00。未登録は null)。
cancel_policyお客様向けのキャンセル規定。
latitude / longitude緯度・経度(取得できていないゴルフ場は null)。
phone代表電話番号(無ければ null)。
opened_on開場日(YYYY-MM-DD、不明は null)。
main_image / imagesトップ画像と掲載写真(最大5枚)。thumbnail_url は長辺480pxの縮小版です。写真の種類(コース・クラブハウス等)の区別はありません。
facilities練習場・プロショップ・レストラン・レッスン・ナイターの有無。
updated_at基本情報・座標・紹介文・コース仕様のうち最も新しい更新日時(UTC)。料金・プランの更新は含みません(/api/golf-clubs/plans.php を参照)。
area / area_codeエリア名とエリアコード(下表)。
エリアコード一覧(ベトナム)
area_codejaenvi
0北部(ハノイ)North (Hanoi)Miền Bắc (Hà Nội)
1北部(ハイフォン)North (Hai Phong)Miền Bắc (Hải Phòng)
2北部(その他)North (Other)Miền Bắc (Khác)
3中部(ダナン・フエ)Central (Da Nang / Hue)Miền Trung (Đà Nẵng / Huế)
4中部(その他)Central (Other)Miền Trung (Khác)
5南部(ホーチミン)South (Ho Chi Minh City)Miền Nam (TP. Hồ Chí Minh)
6南部(その他)South (Other)Miền Nam (Khác)
7南部(ニャチャン)South (Nha Trang)Miền Nam (Nha Trang)
8南部(フーコック)South (Phu Quoc)Miền Nam (Phú Quốc)
rental(クラブ・シューズ)は本API(quote/create)で予約パラメータとして指定できるレンタルです。options(カート・キャディ・送迎等)は参考情報のみ(API予約不可)で、ベンダー側の表示・制御用に提供有無(available)、すべてのプランに含まれるか(included)、料金(fee)を返します。included: true は追加料金なしでプラン料金に含まれる(多くのゴルフ場でカート・キャディ)ため fee は null です。available: true で fee: null かつ included: false の場合は料金が別途見積です。rental は料金が決まっているものだけ available: true になります。
掲載について: 画像・紹介文は、GOVIGO経由で予約を受け付ける目的に限り、貴社サイト・アプリに掲載いただけます。
GET /api/golf-clubs/plans.php golf_clubs:read

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

パラメータ型必須説明
golf_club_idinteger必須ゴルフ場ID
datestring任意指定日に有効なプランのみ取得(YYYY-MM-DD)
langstring任意返す言語。ja(既定)/ en / vi / kr / cn。それ以外は 400
レスポンス例
{
  "success": true,
  "data": {
    "golf_club_id": 1,
    "lang": "ja",
    "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_ranges": [{ "from": "06:00", "to": "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 はお客様向けのキャンセル規定で、プラン個別の規定があればそれを、無ければゴルフ場のキャンセル規定を返します。name / summary / cancel_policy は lang の言語で返します。未登録の言語の代わりは /api/golf-clubs/detail.php と同じ順です(vi・kr・cn → en → ja、en → ja)。cancel_policy は、言語ごとにプラン個別の規定 → ゴルフ場の規定の順に探します。time_ranges はこのプランで予約できるティータイムの時間帯です(最大3つ。両端を含む。空配列は時間の指定なし)。予約時の tee_time がどの時間帯にも入らないと 409 になります。

空き状況

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

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

パラメータ型必須説明
golf_club_idinteger必須ゴルフ場ID
datestring必須日付(YYYY-MM-DD)
langstring任意返す言語。ja(既定)/ en / vi / kr / cn。それ以外は 400
レスポンス例
{
  "success": true,
  "data": {
    "golf_club_id": 1,
    "date": "2026-03-15",
    "lang": "en",
    "is_closed": false,
    "count": 1,
    "slots": [
      {
        "slot_id": 101,
        "course_id": 3,
        "course_name": "Lake Course",
        "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
}
course_name と plan.name は、ゴルフ場が登録した言語別の表記を lang の言語で返します。未登録の言語は vi・kr・cn → en → 登録時の表記、en → 登録時の表記の順に代わりの表記で返します。
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)。指定するとプラン適用期間・曜日も検証
tee_timestring任意希望ティータイム(HH:MM)。指定するとプランの時間帯(plans の time_ranges)に入るかも検証し、外れていれば 409
rental_clubinteger任意レンタルクラブ本数(提供のあるゴルフ場のみ)
rental_shoesinteger任意レンタルシューズ数(提供のあるゴルフ場のみ)
レンタルクラブ/シューズはゴルフ場ごとに提供有無が異なります。提供有無と料金は /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": "平日プラン",
    "time_ranges": [{ "from": "06:00", "to": "10:00" }],
    "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
}
レスポンスの time_ranges はプランの予約できる時間帯です(plans と同じ)。

予約

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)。* tee_time_slot_id を指定しない通常予約では必須(省略すると 400)。プランの時間帯(plans の time_ranges)の中で指定してください(外れていれば 409)。リアルタイム枠の予約では使いません
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.com
X-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.com
X-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.com
X-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.cancelled と reservation.status_changed の違い:
reservation.status_changed はすべてのステータス遷移で発火します(payload に old_status / new_status を含む)。reservation.cancelled はキャンセル「確定」(status 10 = 完了(キャンセル))へ遷移したときに併せて発火する利便イベントです(キャンセル依頼 status 6 では発火しません。依頼は却下されうるため)。したがってキャンセル確定時は両方が発火します。キャンセル依頼の段階から追いたい場合は reservation.status_changed で new_status=6 を検知してください。
ステータス一覧(status / *_status_label)
コードラベル説明
1requested予約依頼
2confirmingゴルフ場確認中
3payment_waiting入金依頼中
4paid入金確認済み。schedule_confirmed が false の間はティータイム未確定(入金確認のみ)、true で日程確定
5reschedule_requested予約情報変更中
6cancel_requestedキャンセル依頼
7cancelling_no_refundキャンセル中(返金なし)
8cancelling_with_refundキャンセル中(返金あり)
9completed完了(プレー済)
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.com
X-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.com
X-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.com
X-API-Key: YOUR_API_KEY
Content-Type: application/json

{ "subscription_id": 10 }