はじめに

Performance Hub Partner API を使用すると、外部のパートナープラットフォームを Performance Hub のコアモジュールとシームレスに連携できます。この API は、コンピュータービジョン、分析、会員のアクセスログ、施設のインサイトをサポートしています。

リクエストの形式

API は JSON でエンコードされたリクエスト本文を受け付け、JSON でエンコードされたレスポンスを返します。

レート制限

公平な利用とシステムの安定性を確保するため、Partner API アカウントには最初に次の既定の制限が適用されます。

  • エンドポイントごとに毎秒 5 リクエスト
  • 最適なパフォーマンスのため、バッチリクエストあたり推奨: 最大 1000 項目
  • ペイロードサイズは最大 10MB

レート制限は調整可能で、Performance Hub のパートナーアカウントマネージャーが個別に設定できます。リリース、移行、レポートのバックフィル、利用量の多い施設のために連携でより高いスループットが必要な場合は、オンボーディング中または予定している変更作業の前にご相談ください。

ベース URL

https://partner-api.performancehub.co/partner/v1/

認証

Partner API にアクセスするには、API シークレットキーによる認証が必要です。キーは Partner Console で生成、管理します。

API キーは、パートナーリソースにアクセスするための資格情報です。各キーは特定の組織データへのアクセスに制限されており、必要に応じて即座に無効化できます。

API キーはアカウントへの完全なアクセスを提供するため、慎重に取り扱ってください。 公開リポジトリ、クライアントサイドのアプリケーション、その他漏洩のおそれがある場所でこれらのキーを公開しないでください。

リクエストは HTTP Basic 認証で認証し、API キーをユーザー名として渡します。パスワードは空欄のままにします。

API は安全な HTTPS 接続のみを受け付けます。 プレーンな HTTP リクエストは拒否され、適切な認証資格情報がないリクエストも拒否されます。

リクエストの例

curl https://partner-api.performancehub.co/partner/v1/organisations \
  -u sk_live_YOUR_PARTNER_SECRET_KEY:
# The colon prevents curl from asking for a password.

シークレットキーの確認

curl https://partner-api.performancehub.co/partner/v1/auth/ping \
  -u sk_live_YOUR_PARTNER_SECRET_KEY:
# Returns { "message": "You are successfully authorised as <PartnerName>" }

本番稼働チェックリスト

本番環境の施設でパートナー連携を有効にする前に、このチェックリストを使用してください。

Partner Console の設定

  • パートナープロフィールの入力が完了している。
  • ロゴの URL、Web サイト、カテゴリ、説明が正確である。
  • データのリンク方法(Direct Link または Linking Identifier)が設定されている。
  • 少なくとも 1 つの実際の施設で施設のリンクがテスト済みである。
  • 適切な種類のキーを使用している。
    • 非破壊的な書き込みテストには Dryrun。
    • データを安全に利用するには Read-only。
    • 本番データに影響を与える準備ができた場合にのみ Live。

認証とキーの管理

  • シークレットキーはサーバー側にのみ保存されている。
  • キーがクライアントサイドのアプリケーション、モバイルアプリ、公開リポジトリ、サポートチケットに埋め込まれていない。
  • キーのローテーションと失効がテスト済みである。
  • 各環境でどのキーが使用されているかをチームが把握している。

データの検証

  • 呼び出すすべてのエンドポイントで必須フィールドが含まれている。
  • 施設識別子が設定済みのリンク方法と一致している。
  • お使いのシステムの ID が安定しており、同期ごとに変わらない。
  • 大規模なインポートが、ドキュメントに記載された上限内のバッチに分割されている。
  • バッチ内の失敗した項目を特定して再送信できる。

エンドポイントのテスト

リリース前に、連携が依存するすべてのエンドポイントをテストしてください。

  • 組織と施設を読み取れる。
  • 会員を保存、更新できる。
  • 会員プラン、アクセスゾーン、アクセス時間が正しく同期される。
  • チェックインが受け付けられ、お使いのシステムと関連付けることができる。
  • レポートのスナップショットで、想定どおりのレポート期間と指標が使用されている。
  • 該当する場合、ドア/ゲートコントローラーのフローが実際のハードウェアでテスト済みである。

Access Time Window の準備

連携で Access Time Windows を提供する場合:

  • 絶対的なウィンドウと週次のウィンドウの例が、プロデューサー認定チェックリストに合格している。
  • エポックが引用符なしの整数(Unix 秒)であり、[from, to) の境界が正確にテスト済みである。
  • UTC の既定値、連携独自の IANA タイムゾーン、関連する夏時間の切り替えが検証済みである。
  • 永続的で単調増加する 1 つの会員/ソースのリビジョンストリームによって、差分更新、照合、再試行が調整されている。
  • 省略、完全な置き換え、冪等、競合、古いデータ、明示的な [] の各動作をオペレーターが理解している。
  • default を含むすべての scope_key に承認済みの Performance Hub のマッピングがあり、不明なキーが拒否側に倒れることがテスト済みである。
  • 連携で想定される更新の頻度、ソースデータの最大経過時間、ソースデータが古い場合の動作、アラートが設定されている。
  • 上流からの取得に失敗しても、空または部分的なスナップショットが送信されないことが確認済みである。
  • ステージングでのストリームの収束、キャンセル/失効、物理ドアでの開始/終了の境界が、合意した目標を満たしている。
  • 通常のルールと恒久的な許可がフォールバック経路として機能することが検証済みであり、ウィンドウによってユーザーの無効化、blockAllAccess、メンテナンス、ジオフェンスが回避されない。

アクセスコントロールの準備

アクセスコントロールの連携の場合:

  • Performance Hub を呼び出す前に、お使いのシステムがアクセスの判断を行う。
  • 連携で device_offline、maintenance_mode_active、unlock_confirmation_timeout を処理している。
  • タイムアウトは解錠が確認されなかったことを意味する、とオペレーターが理解している。
  • 返された event_id と command_id がログに保存されている。
  • 施設のスタッフ向けに、手動でのフォールバック手順が用意されている。

エラー処理と再試行

  • 400、401、403、404、409、422 のレスポンスは、むやみに再試行せず、オペレーターまたはサポートチームに通知される。
  • 429、500、502、503、504 のレスポンスでは、バックオフを伴う上限付きの再試行ロジックを使用している。
  • 失敗が繰り返されると、お使いのシステムでアラートが作成される。
  • 連携が失敗したレコードを通知なしに破棄することがない。

可観測性

  • ログに、エンドポイント、タイムスタンプ、施設識別子、ソースレコード ID、リクエストの結果、レスポンス本文が含まれている。
  • サポートチームが会員 ID、施設 ID、チェックイン ID、解錠イベント ID で検索できる。
  • 失敗した同期を再実行または照合する手段がある。

本番リリース

  • Performance Hub が本番環境へのアクセスを確認している。
  • 少なくとも 1 つの本番環境の施設で連携が有効になっている。
  • 本番用のキーが有効である。
  • 運用担当者と技術担当者の連絡先が最新である。
  • お客様向けにサポート手順が文書化されている。

これらのチェックが完了すると、設定した連携が Performance Hub のコアプラットフォーム内にある Performance Hub パートナーディレクトリに表示されます。

ベストプラクティス

これらのパターンを使用して、パートナー連携の動作を予測可能かつ監視可能にし、施設にとって安全な状態を保ってください。

施設を一貫した方法で識別する

パートナーアカウントに設定されているリンク方法を選択し、一貫して使用してください。

  • Direct Link - 施設エンドポイントから返される Performance Hub の facility_id を使用します。
  • Linking Identifier - 支店 ID、拠点コード、店舗番号など、独自の拠点識別子を使用します。

同じリクエストで両方の識別子を送信しないでください。Performance Hub は、パートナーアカウントに設定されているリンク方法を使用してリクエストを解決します。

設定方法については、パートナーのリンク方法を参照してください。

書き込みは慎重にバッチ処理する

Partner API は JSON のリクエスト本文を受け付け、ドキュメントに記載されている場合はバッチ単位の同期ワークフロー向けに設計されています。バッチのサイズに上限を設け、再試行可能な状態にしてください。

標準的な目安:

  • 最適なパフォーマンスのため、バッチリクエストあたり最大 1000 項目を使用します。
  • ペイロードは 10MB 未満に抑えます。
  • エンドポイントごとに毎秒 5 リクエストの範囲内に収めます。

レート制限は調整可能で、Performance Hub のパートナーアカウントマネージャーが個別に設定できます。大量のインポート、リリース時のトラフィック、レポートのバックフィルが見込まれる場合は、変更作業の時間帯より前に必要なスループットについて合意してください。

大規模なデータセットを同期する必要がある場合は、決定論的なチャンクに分割し、各チャンクの ID をお使いのシステム側で記録してください。これにより、失敗した再試行の状況を把握しやすくなります。

安全に再試行する

429、500、502、503、504 などの一時的なエラーには、指数バックオフを使用してください。

間隔の短い再試行ループは避けてください。最初の目安は次のとおりです。

  1. 1 秒後に再試行します。
  2. 2 秒後に再試行します。
  3. 4 秒後に再試行します。
  4. それでも操作が失敗する場合は、停止してアラートを送信します。

400 や 422 などの検証エラーの場合は、リクエストを修正してから再試行してください。

サポートされている場合は冪等性を利用する

ドア/ゲートコントローラーの解錠エンドポイントは、省略可能な idempotency_key をサポートしています。同じパートナー、施設、ドアに対して同じキーを再利用すると、既存の結果がある場合はその結果が返されます。

お使いのシステムのチェックイン ID やアクセスイベント ID など、実行する操作に対して安定したキーを使用してください。

エンドポイントのドキュメントに記載されていない限り、すべての書き込みエンドポイントが冪等性をサポートしているとは想定しないでください。

ソースデータをクリーンに保つ

可能な限り、安定した正規化済みの値を送信してください。

  • ソースシステムの会員、プラン、施設、チェックインの ID を一貫して使用します。
  • 日付と時刻には ISO 8601 形式のタイムスタンプを使用します。
  • 電話番号は、可能な場合は国際形式で送信します。
  • 通貨は、各エンドポイントのドキュメントに記載されたフィールドを使用して送信します。
  • 構造化フィールドに入れるべきデータで、自由記述フィールドを埋めないようにします。

差分同期と完全同期の両方に対応する設計にする

ほとんどのパートナー連携では、次の両方が必要です。

  • 日々の変更のための差分同期。
  • 取りこぼしたイベント、過去データのインポート、データのずれを修正するための完全な照合同期。

連携では、以前のリクエストが成功したかどうかに依存せずに、会員、会員プラン、レポートのスナップショットの現在の状態を再送信できるようにしてください。

Access Time Windows を安全に公開する

各会員の access_time_windows の値は、独立してリビジョン管理される完全なスナップショットとして扱ってください。

  • 差分同期と照合のワーカー全体で、単調増加する access_time_windows_revision のストリームを 1 つに統一します。
  • 配信結果が不確かな場合や一時的なエラーの場合は、同じリビジョンと正規化されたペイロードで再試行します。
  • access_time_windows を更新しない場合は省略します。
  • [] は、信頼できるソースからの取得に成功し、残っているウィンドウがないことが確認された場合にのみ送信します。上流のタイムアウト、部分的な結果、解析エラーを失効として扱わないでください。
  • external_id と scope_key を安定した値に保ち、本番稼働前にすべてのスコープのマッピングを認定します。
  • その連携で合意した鮮度ポリシーに照らして、ソースデータの経過時間を監視します。

完全なスナップショット、タイムゾーン、夏時間、キャンセル、テストベクターについては、正式な Access Time Windows プロデューサーガイドを参照してください。

アクセスコントロールを安全上重要なものとして扱う

ドア/ゲートコントローラーの解錠について:

  • Performance Hub を呼び出す前に、人物の入場を許可するかどうかをお使いのシステムで判断する必要があります。
  • Performance Hub は、リレーが物理的に解錠されたことを現地のコントローラーが確認した後にのみ 200 を返します。
  • ほとんどの確認は 3〜5 秒で完了します。
  • タイムアウトは解錠の明示的な失敗であり、バックグラウンドでの成功ではありません。
  • 独自のアクセスルールと安全ルールに従ってのみ再試行してください。

解錠エンドポイントから返される event_id と command_id は必ず記録してください。

連携を監視する

開発中とリリース時には、Partner Console のリクエストログを使用してください。本番環境では、次の情報を含む独自のログも管理してください。

  • リクエストのタイムスタンプ。
  • エンドポイント。
  • ソースレコード ID。
  • 施設識別子。
  • HTTP ステータスコード。
  • Performance Hub のレスポンス本文またはエラーメッセージ。

これらのフィールドがあれば、お客様から何が起きたのかを尋ねられた際に、サポートや照合を大幅に迅速化できます。

組織

Performance Hub プラットフォームと連携している 1 つ以上の施設を運営する、最上位の事業体を表します。

エンドポイント

GET /partner/v1/organisations - List all organisations

組織オブジェクト

属性

  • org_id string 必須

    組織の一意の識別子。

  • name string 必須

    組織名。

組織オブジェクト

{
  "org_id": "00000000-0000-0000-0000-000000000050",
  "name": "Harbourside Group"
}

すべての組織を一覧表示する

パートナーアカウントからアクセスできる組織の一覧を返します。

戻り値

組織オブジェクトの配列を含む data プロパティを持つ JSON オブジェクトを返します。

リクエスト

curl https://partner-api.performancehub.co/partner/v1/organisations \
  -u sk_live_YOUR_PARTNER_SECRET_KEY:

レスポンス

{
  "data": [
    {
      "org_id": "00000000-0000-0000-0000-000000000050",
      "name": "Harbourside Group"
    },
    {
      "org_id": "6ba7b811-9dad-11d1-80b4-00c04fd430c8",
      "name": "Wellness Studios Network"
    }
  ]
}

施設

会員がサービスを利用できる物理的な拠点(オフィス、店舗、会場、キャンパス、クリニック、ジムなど)を表します。

エンドポイント

GET /partner/v1/facilities - List all facilities

施設オブジェクト

属性

  • facility_id string 必須

    施設の一意の識別子。

  • org_id string 必須

    親組織の一意の識別子。

  • name string 必須

    施設名。

  • brand string 省略可

    施設が使用するブランド名。

  • website_url string 省略可

    施設の Web サイトの URL。

  • place_data object 省略可

    Google Places API から取得した位置データ。国、整形済みの住所、Google Place ID、州、市区町村が含まれます。

  • social_links object 省略可

    施設のソーシャルメディアへのリンク。

  • timezone string 省略可

    IANA タイムゾーン識別子(例: "Australia/Sydney"、"America/New_York")。

施設オブジェクト

{
  "facility_id": "550e8400-e29b-41d4-a716-446655440000",
  "org_id": "00000000-0000-0000-0000-000000000050",
  "name": "Harbourside Central",
  "brand": "Harbourside",
  "website_url": "https://example.com/central",
  "social_links": {
    "instagram": {
      "handle": "@harbourside.central"
    },
    "facebook": {
      "handle": "HarboursideCentral"
    }
  },
  "place_data": {
    "country": {
      "iso_code": "AU",
      "full_name": "Australia"
    },
    "formatted_address": "123 Main Street, Suite 100, Sydney NSW 2000, Australia",
    "google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
    "province": {
      "abbreviation": "NSW",
      "full_name": "New South Wales"
    },
    "city": {
      "short_name": "Sydney",
      "full_name": "Sydney"
    }
  },
  "timezone": "Australia/Sydney"
}

すべての施設を一覧表示する

パートナーアカウントからアクセスできる施設の一覧を返します。

戻り値

施設オブジェクトの配列を含む data プロパティを持つ JSON オブジェクトを返します。

リクエスト

curl https://partner-api.performancehub.co/partner/v1/facilities \
  -u sk_live_YOUR_PARTNER_SECRET_KEY:

レスポンス

{
  "data": [
    {
      "facility_id": "550e8400-e29b-41d4-a716-446655440000",
      "org_id": "00000000-0000-0000-0000-000000000050",
      "name": "Harbourside Central",
      "brand": "Harbourside",
      "website_url": "https://example.com/central",
      "place_data": {
        "country": {
          "iso_code": "AU",
          "full_name": "Australia"
        },
        "formatted_address": "123 Main Street, Sydney NSW 2000, Australia",
        "google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
        "province": {
          "abbreviation": "NSW",
          "full_name": "New South Wales"
        },
        "city": {
          "short_name": "Sydney",
          "full_name": "Sydney"
        }
      },
      "timezone": "Australia/Sydney"
    }
  ]
}

会員プラン

組織または施設が提供する購入可能なプランを定義します。サービス、利用資格、スケジュール、料金が含まれます。

エンドポイント

POST /partner/v1/membership-plans - Save a membership plan

会員プランオブジェクト

属性

  • membership_plan_id string 必須

    会員プランの一意の識別子。

  • facility_id string いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    Performance Hub での施設の一意の識別子。

  • linking_identifier string いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    パートナーが使用する各拠点の一意の識別子の値(例: 「Branch ID」、「Location Code」、「Store Number」)。詳細

  • name string 必須

    人が読める形式のプラン名(例: "Office tenant – business hours"、"Student – term access"、"Hotel guest"、"10 Class Pack")。

  • billing_cycle string 省略可

    請求の頻度。weekly、fortnightly、monthly、annually、one_time のいずれかです。

  • price integer 省略可

    通貨の最小単位で表した基本料金(USD/AUD の場合はセント)。

  • currency string 省略可

    ISO 4217 の通貨コード(例: "AUD"、"USD")。

  • description string 省略可

    マーケティング用または内部用の説明(省略可)。

  • active_members integer 省略可

    この会員プランを利用している有効な会員の数

  • is_recurring boolean 省略可

    プランが自動更新されるかどうか。

  • is_trial boolean 省略可

    体験用のプランかどうか。

  • visible_to_public boolean 省略可

    プランをセルフサービスで購入できるかどうか。

  • duration_days integer 省略可

    会員プランの有効日数。

  • access_zones array 省略可

    会員プランに含まれるアクセスゾーンの配列。各ゾーンに独自のアクセス時間を定義できます。詳細については、アクセスゾーンを参照してください。

  • class_limit integer 省略可

    利用できるクラスの最大数(無制限の場合は null)。

会員プランオブジェクト

この例では facility_id を使用しています。Linking Identifier の連携の場合は、代わりに "linking_identifier": "branch_downtown" を送信します。

{
  "membership_plan_id": "plan_99999",
  "facility_id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Office tenant – business hours",
  "description": "Weekday access to the level 3 tenancy and the end-of-trip facilities",
  "billing_cycle": "monthly",
  "price": 8900,
  "currency": "AUD",
  "duration_days": 30,
  "is_recurring": true,
  "is_trial": false,
  "visible_to_public": false,
  "active_members": 245,
  "access_zones": [
    {
      "name": "Level 3 Tenancy",
      "description": "Lift lobby, offices and meeting rooms on level 3",
      "access_hours": {
        "mon": [["07:00", "19:00"]],
        "tue": [["07:00", "19:00"]],
        "wed": [["07:00", "19:00"]],
        "thu": [["07:00", "19:00"]],
        "fri": [["07:00", "19:00"]]
      }
    },
    {
      "name": "End-of-trip Facilities",
      "description": "Bike storage, lockers and showers",
      "access_hours": {
        "mon": [["06:00", "20:00"]],
        "tue": [["06:00", "20:00"]],
        "wed": [["06:00", "20:00"]],
        "thu": [["06:00", "20:00"]],
        "fri": [["06:00", "20:00"]]
      }
    }
  ],
  "class_limit": null
}

アクセスゾーン

アクセスゾーンは、会員プランでアクセスが許可される施設内の特定のエリアを定義します。各ゾーンに独自のアクセス時間を設定できるため、エリアごとに異なる時間制限を適用できます。

構造

各アクセスゾーンには次の項目が含まれます。

  • name string 必須

    ゾーンの名前(例: 「Level 3 Tenancy」、「Library」、「Guest Floors」、「Main Gym Floor」)。

  • description string 省略可

    そのゾーンに含まれる内容の説明。

  • access_hours object 省略可

    このゾーンに固有のアクセス時間。時間範囲の形式については、アクセス時間を参照してください。

例

テナント向けのジムがあるオフィスビルの例: テナントのフロアには営業時間中に、ジムには早朝から夜遅くまでアクセスできます。

{
  "access_zones": [
    {
      "name": "Level 3 Tenancy",
      "description": "Lift lobby, offices and meeting rooms on level 3",
      "access_hours": {
        "mon": [["07:00", "19:00"]],
        "tue": [["07:00", "19:00"]],
        "wed": [["07:00", "19:00"]],
        "thu": [["07:00", "19:00"]],
        "fri": [["07:00", "19:00"]]
      }
    },
    {
      "name": "Tenant Gym",
      "description": "Ground-floor gym and change rooms for building tenants",
      "access_hours": {
        "mon": [["05:00", "22:00"]],
        "tue": [["05:00", "22:00"]],
        "wed": [["05:00", "22:00"]],
        "thu": [["05:00", "22:00"]],
        "fri": [["05:00", "22:00"]],
        "sat": [["07:00", "18:00"]],
        "sun": [["07:00", "18:00"]]
      }
    }
  ]
}

アクセス時間

アクセス時間は、曜日ごとに、会員が特定のゾーンにアクセスできる時間を指定します。アクセス時間は アクセスゾーンごとに定義されるため、施設のエリアごとに異なる時間制限を設定できます。

構造

{
  "mon": [["start_time", "end_time"]],
  "tue": [["start_time", "end_time"]],
  "wed": [["start_time", "end_time"]],
  "thu": [["start_time", "end_time"]],
  "fri": [["start_time", "end_time"]],
  "sat": [["start_time", "end_time"]],
  "sun": [["start_time", "end_time"]]
}

各曜日は、HH:MM 形式(24 時間表記)の時間範囲の配列です。空の配列 [] は、その曜日にアクセスできないことを意味します。省略した曜日は空の配列と同じように扱われます。

ユースケースの例

オフィスのテナント – 営業時間: 平日の営業時間のみアクセスできます。

{
  "access_hours": {
    "mon": [["07:00", "19:00"]],
    "tue": [["07:00", "19:00"]],
    "wed": [["07:00", "19:00"]],
    "thu": [["07:00", "19:00"]],
    "fri": [["07:00", "19:00"]]
  }
}

学生 – 学期中のアクセス: キャンパスの図書館は平日(日中に休憩時間あり)と土曜日の午前中に開館しています。

{
  "access_hours": {
    "mon": [["08:00", "12:30"], ["13:30", "21:00"]],
    "tue": [["08:00", "12:30"], ["13:30", "21:00"]],
    "wed": [["08:00", "12:30"], ["13:30", "21:00"]],
    "thu": [["08:00", "12:30"], ["13:30", "21:00"]],
    "fri": [["08:00", "12:30"], ["13:30", "17:00"]],
    "sat": [["09:00", "13:00"]]
  }
}

ジム – 早朝会員: 平日の午前中のみアクセスできます。

{
  "access_hours": {
    "mon": [["04:00", "12:00"]],
    "tue": [["04:00", "12:00"]],
    "wed": [["04:00", "12:00"]],
    "thu": [["04:00", "12:00"]],
    "fri": [["04:00", "12:00"]]
  }
}

ホテルの宿泊客 – 24 時間 365 日: 常にアクセスできます。最も一般的なユースケースです。

{
  "access_hours": {
    "mon": [["00:00", "23:59"]],
    "tue": [["00:00", "23:59"]],
    "wed": [["00:00", "23:59"]],
    "thu": [["00:00", "23:59"]],
    "fri": [["00:00", "23:59"]],
    "sat": [["00:00", "23:59"]],
    "sun": [["00:00", "23:59"]]
  }
}

ゾーンごとの例

客室フロアには 24 時間アクセスでき、プールの利用時間は短く設定されたホテル宿泊客向けのプラン:

{
  "access_zones": [
    {
      "name": "Guest Floors",
      "description": "Lifts and corridors on the guest room levels",
      "access_hours": {
        "mon": [["00:00", "23:59"]],
        "tue": [["00:00", "23:59"]],
        "wed": [["00:00", "23:59"]],
        "thu": [["00:00", "23:59"]],
        "fri": [["00:00", "23:59"]],
        "sat": [["00:00", "23:59"]],
        "sun": [["00:00", "23:59"]]
      }
    },
    {
      "name": "Swimming Pool",
      "description": "Access to the swimming pool and change rooms",
      "access_hours": {
        "mon": [["06:00", "20:00"]],
        "tue": [["06:00", "20:00"]],
        "wed": [["06:00", "20:00"]],
        "thu": [["06:00", "20:00"]],
        "fri": [["06:00", "20:00"]],
        "sat": [["08:00", "18:00"]],
        "sun": [["08:00", "18:00"]]
      }
    }
  ]
}

会員プランを保存する

会員プランの記録を作成または更新します。API は membership_plan_id に基づいて、作成するか更新するかを判断します。

パラメーター

  • membership_plans array 必須

    保存する会員プランオブジェクトの配列。最適なパフォーマンスのため、推奨される上限はリクエストあたり 1000 項目です。API は処理のために項目を自動的にバッチ化します。各項目には、facility_id(linking_identifier を使用しない場合は必須)または linking_identifier(facility_id を使用しない場合は必須)のいずれかを含める必要があります。

戻り値

同期操作を確認する簡単なメッセージを返します。

リクエスト

この例では facility_id を使用しています。Linking Identifier の連携の場合は、代わりに "linking_identifier": "branch_downtown" を送信します。

curl -X POST https://partner-api.performancehub.co/partner/v1/membership-plans \
  -u sk_live_YOUR_PARTNER_SECRET_KEY: \
  -H "Content-Type: application/json" \
  -d '{
    "membership_plans": [
      {
        "membership_plan_id": "plan_99999",
        "facility_id": "550e8400-e29b-41d4-a716-446655440000",
        "name": "Student – term access",
        "description": "Library and student hub access for one teaching term",
        "billing_cycle": "one_time",
        "price": 4500,
        "currency": "AUD",
        "duration_days": 84,
        "is_recurring": false,
        "is_trial": false,
        "visible_to_public": true,
        "active_members": 245,
        "access_zones": [
          {
            "name": "Library",
            "description": "Reading rooms, study spaces and bookable rooms",
            "access_hours": {
              "mon": [["08:00", "21:00"]],
              "tue": [["08:00", "21:00"]],
              "wed": [["08:00", "21:00"]],
              "thu": [["08:00", "21:00"]],
              "fri": [["08:00", "17:00"]],
              "sat": [["09:00", "13:00"]]
            }
          },
          {
            "name": "Student Hub",
            "description": "Common room, kitchen and lockers",
            "access_hours": {
              "mon": [["07:00", "22:00"]],
              "tue": [["07:00", "22:00"]],
              "wed": [["07:00", "22:00"]],
              "thu": [["07:00", "22:00"]],
              "fri": [["07:00", "22:00"]]
            }
          }
        ],
        "class_limit": null
      }
    ]
  }'

レスポンス

同期操作に関するメタデータを含む成功メッセージを返します。

{
  "message": "Membership plan sync successful.",
  "metadata": {
    "success": 98,
    "skipped": 2,
    "skipped_items": [
      {
        "membership_plan_id": "plan_456",
        "facility_id": null,
        "reason": "Missing facility_id"
      }
    ]
  }
}

メタデータフィールド:

  • success - 正常に処理された会員プランの数
  • skipped - スキップされたプランの数(ある場合)
  • skipped_items - スキップされたプランとその理由の配列(ある場合)
  • dry-run - dryrun キーの種類を使用している場合のブール値フラグ(該当する場合)

会員

施設の個々の顧客を表します。リード、見込み客、継続利用の顧客、期限切れの会員、ブロック済みのユーザーのいずれかです。

会員のアップサートには、絶対的なアクセスと毎週繰り返すアクセスを含む、リビジョン管理された完全な access_time_windows スナップショットを含めることもできます。これらのフィールドを生成する前に、Access Time Windows を参照してください。これらは追加の権限であり、施設の通常のルールや恒久的な許可を置き換えるものではありません。

エンドポイント

POST /partner/v1/members - Save a member

会員オブジェクト

属性

  • member_id string 必須

    会員の一意の識別子。

  • facility_id string いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    Performance Hub での施設の一意の識別子。

  • linking_identifier string いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    パートナーが使用する各拠点の一意の識別子の値(例: 「Branch ID」、「Location Code」、「Store Number」)。詳細

  • first_name string 必須

    会員の名。

  • last_name string 必須

    会員の姓。

  • email string 省略可

    メールアドレス。

  • mobile_phone string 省略可

    E.123 形式の携帯電話番号(例: "+1 415 555 2671")。

  • address object 省略可

    次のプロパティを持つ住所オブジェクト。

    • address_line_1 (string) - 主な番地
    • address_line_2 (string, optional) - 住所の 2 行目
    • city (string) - 市区町村名
    • state (string) - 州/都道府県のコード
    • postal_code (string) - 郵便番号
    • country (string) - ISO 3166-1 alpha-2 の国コード (例: "AU"、"US")
    • country_name (string, optional) - 国の正式名称
  • date_of_birth string 省略可

    YYYY-MM-DD 形式の生年月日。

  • gender string 省略可

    male、female、non_binary、prefer_not_to_say、unknown のいずれかです。

  • type string 省略可

    会員の種類(例: staff、member、prospect)。

  • tags array 省略可

    特定の会員を分類、識別するための簡易的な文字列やテキスト(例: ["vip", "personal-training", "student"])。

  • membership_status string 省略可

    現在の会員ステータス(例: active、expired、on_hold)。

  • membership_plans array 省略可

    会員に関連付けられている会員プランの配列。

  • profile_picture string 省略可

    Base64 でエンコードされたプロフィール画像(省略可)。

  • created string 省略可

    会員が作成された日時の ISO 8601 形式のタイムスタンプ。

  • updated string 省略可

    会員が最後に更新された日時の ISO 8601 形式のタイムスタンプ。

  • access_time_windows array 省略可

    ソースが所有する、絶対および/または毎週繰り返す Access Time Windows の完全なスナップショット。スナップショットを変更しない場合はフィールドを省略し、失効させる場合はより新しいリビジョンで空の配列を送信します。形式、検証、スコープのマッピング、置き換えのセマンティクスについては、Access Time Windows を参照してください。

  • access_time_windows_revision integer access_time_windows 指定時は必須

    この会員/ソースのストリームに対する、単調増加する負でない整数(JSON で安全に扱える値)。access_time_windows が含まれる場合は常に必須です。

会員オブジェクト

{
  "member_id": "member_11111",
  "facility_id": "550e8400-e29b-41d4-a716-446655440000",
  // "linking_identifier": "branch_downtown",  // If using linking identifier
  "first_name": "John",
  "last_name": "Smith",
  "email": "john.smith@example.com",
  "mobile_phone": "+61 412 345 678",
  "date_of_birth": "1985-06-15",
  "gender": "male",
  "type": "member",
  "tags": ["vip", "personal-training"],
  "profile_picture": "/9j/4AAQSkZJRgABAQAAAQ...",
  "membership_status": "current",
  "created": "2024-01-15T10:30:00Z",
  "updated": "2024-01-20T14:45:00Z",
  "access_time_windows_revision": 1842,
  "access_time_windows": [
    {
      "external_id": "access-4b1782",
      "kind": "absolute",
      "from": 1792053000,
      "to": 1792058400,
      "timezone": "Australia/Perth",
      "scope_key": "after_hours_entry",
      "label": "Temporary site access"
    }
  ],
  "address": {
    "address_line_1": "456 Bourke Street",
    "address_line_2": "Apt 12",
    "city": "Melbourne",
    "state": "VIC",
    "postal_code": "3000",
    "country": "AU",
    "country_name": "Australia"
  },
  "membership_plans": [
    {
      "membership_plan_id": "plan_99999",
      "name": "Unlimited Monthly",
      "start_date": "2024-01-01T00:00:00Z",
      "status": "current",
      "is_current": true,
      "end_date": null
    }
  ]
}

アクセス時間ウィンドウ

Access Time Windows を使用すると、パートナーの会員に、外部システムから提供される一時的なアクセスや定期的なアクセスを持たせることができます。このページは、access_time_windows と access_time_windows_revision に関する正式なプロデューサーガイドです。

Access Time Windows は、許可のみを追加する権限です。有効なウィンドウはアクセスを許可できますが、無効、期限切れ、古い、またはマッピングされていないウィンドウが、通常のルールや恒久的な許可ですでに許可されているアクセスを拒否することはありません。ユーザーの無効化、ドアの明示的なブロック、メンテナンスモード、ジオフェンス、レート制限、コントローラーの可用性は引き続き適用されます。

特定の上流システム向けの実装は、別個のアダプターとして扱います。アダプターは、フィールドの意味を変えずに、ソースデータをこのベンダー非依存の仕様に変換する必要があります。

会員スナップショットのフィールド

  • access_time_windows array 省略可

    この会員とパートナーソースに対する、完全な Access Time Window のスナップショット。1 つのスナップショットに absolute と weekly のウィンドウを混在させることができます。保存済みのスナップショットを変更しない場合はフィールドを省略し、このソースが所有するすべてのウィンドウを失効させる場合は [] を送信します。

  • access_time_windows_revision integer access_time_windows 指定時は必須

    この会員/ソースのリビジョンストリームに対する、単調増加する負でない整数(JSON で安全に扱える値)。access_time_windows が含まれる場合は常に必須で、9007199254740991 を超えることはできません。

各スナップショットに含められるウィンドウは最大 50 件です。external_id、scope_key、label は最大 120 文字です。絶対ウィンドウの期間は最大 90 日です。週次の 1 日あたり、重複しないブロックを最大 8 つまで指定できます。無効なデータは、切り詰めたり推測したりせずに拒否されます。

ウィンドウの形式

絶対ウィンドウは、1 つの正確な期間を表します。

混在した完全なリクエスト

このリクエストは、ソースが所有する会員の以前のスナップショットを、1 つの絶対ウィンドウと 1 つの週次ウィンドウで置き換えます。

時刻と境界のルール

from、to、active_from、active_until は、UTC の時点を表す JSON 整数の Unix 秒です。

  • 引用符なしの JSON 整数を送信してください。数値の文字列、浮動小数点数、RFC 3339 の文字列、Unix ミリ秒は拒否されます。
  • すべての期間は半開区間 [from, to) です。アクセスはちょうど from の時点で開始でき、ちょうど to の時点で無効になります。
  • from は to より小さくする必要があります。週次の両方の境界を指定する場合は、active_from を active_until より小さくする必要があります。
  • タイムゾーンのない現地の日付/時刻からエポックを算出しないでください。まずソースの時刻を UTC の時点に解決し、次に Unix ミリ秒を 1000 で割って、結果が整数であることを確認してください。

タイムゾーンと夏時間

timezone は、UTC、Australia/Perth、America/New_York などの有効な IANA タイムゾーンである必要があります。省略した場合の既定値は UTC です。

  • 絶対ウィンドウ: from と to はすでに正確な UTC の時点を表しています。timezone は表示と監査のためのメタデータにすぎず、変更してもどちらの時点もずれることはありません。
  • 週次ウィンドウ: timezone は、access_hours の評価に使用する現地の時計時刻と夏時間のルールを定義します。週次のブロックを事前に UTC に変換しないでください。
  • 夏時間の開始で時計が進む際、タイムゾーンで飛ばされる現地時刻は発生しません。
  • 夏時間の終了で時計が戻る際、同じ現地時刻を持つ実際の 2 つの時点の両方が週次のブロックに一致します。
  • 週次ウィンドウで UTC 以外のタイムゾーンを使用する場合でも、active_from と active_until は UTC の時点のままです。

access_hours では、小文字の sun から sat を使用します。各値は、ゼロ埋めした 24 時間形式の HH:mm による [start, end] の組の配列です。ブロックは空でなく、順序どおりに並び、重複していない必要があります。end はその時刻を含みません。ブロックは午前 0 時をまたぐことができないため、日をまたぐソースの期間は、1 日目の遅い時間帯のブロックと翌日の早い時間帯のブロックに分割してください。

安定した ID とスコープのマッピング

external_id は、論理的なウィンドウが存在する間は変わらず、会員のスナップショット内で一意である必要があります。オペレーターや監査記録でリビジョンを関連付けられるよう、時刻やラベルが変わっても同じ値を保ってください。関係のないウィンドウに再利用しないでください。

scope_key は、安定した論理的なアクセス対象です。既定値は default です。施設の管理者が、許可された各キーを Performance Hub の施設全体、ドア、またはアクセス範囲の対象にマッピングします。

完全なスナップショットとリビジョン

この 2 つのフィールドは、会員のアップサート内で個別にバージョン管理される区画として扱ってください。

入力 結果
access_time_windows を省略 既存のスナップショットは変更されません。リビジョンは不要です
より新しいリビジョンで指定 この会員/ソースの保存済みスナップショット全体が置き換えられます
同じリビジョンで、正規化後のペイロードも同じ 冪等なリプレイです。スナップショットは変更されません
同じリビジョンで、正規化後のペイロードが異なる 競合です。照合した後、新しいリビジョンを割り当ててください
より古いリビジョン 古いスナップショットはスキップされ、新しい状態を上書きできません
より新しいリビジョンで access_time_windows: [] ソースが所有するすべてのウィンドウを明示的に失効させます

スナップショットは差分ではなく、完全な状態です。リビジョン 1842 にウィンドウ A と B があり、リビジョン 1843 に B のみが含まれる場合、A は削除されます。

Webhook のワーカー、ポーリング、リプレイ、完全な照合の全体で、パートナー/会員ごとに調整された 1 つのリビジョンストリームを維持してください。永続的なデータベースのシーケンスを推奨します。Unix ミリ秒の値をリビジョンとして使用できるのは、すべての書き込み元が調整を行い、厳密な順序と一意性を保証する場合に限られます。これはリビジョンの値であり、エポックのフィールドではありません。

API のレスポンスが判明するまで、正確なリクエストとリビジョンを保存してください。タイムアウトや一時的なエラーの後は、同じ正規化済みのスナップショットを同じリビジョンで再試行してください。転送の配信結果が不確かだという理由だけで、新しいリビジョンを割り当てないでください。

キャンセル、期限切れ、上流のエラー

  • 1 つのウィンドウをキャンセルする: 信頼できるソースの状態を正常に取得し、そのウィンドウを削除して、残りの完全なスナップショットをより新しいリビジョンで送信します。
  • すべてのウィンドウをキャンセルする: より新しいリビジョンで access_time_windows: [] を送信します。
  • 絶対ウィンドウを期限切れにする: ウィンドウは to の時点で許可を停止します。スナップショットを整理するため、後の照合で期限切れの項目を除いて送信してください。
  • 週次ウィンドウを終了する: より新しいスナップショットで削除するか、ソースに既知の終了時点がある場合は active_until を使用します。
  • ソースの取得が失敗した、または不完全な場合: [] を送信せず、部分的なスナップショットも公開しないでください。アラートを出して取得を再試行してください。上流のエラーを空のスナップショットに変換すると、意図しないアクセスの失効につながります。
  • Partner API のリクエストが検証に失敗した場合: データを修正し、正規化後のスナップショットが変わる場合にのみ、より新しいリビジョンで送信してください。一時的なエラーは元のリビジョンで再試行してください。

ソースの鮮度は、連携ごとに、約束された配信と照合の頻度に基づいて設定されます。有効化する前に、ソースデータの最大経過時間、それを超えた場合の動作、アラートのしきい値、各ウィンドウ自体の範囲のみに依存することをオペレーターが了承できるかどうかについて合意してください。古いソースのウィンドウが拒否ルールになることはなく、通常のルールと恒久的な許可は引き続きフォールバック経路となります。

プロデューサーのアルゴリズム

会員を更新するたびに、次の言語に依存しないワークフローを使用してください。

認定チェックリスト

最終的な scope_key のマッピングを使用して、ステージングの施設で次のチェックを完了してください。

  • タイムゾーンを省略した絶対ウィンドウが受け付けられ、UTC として評価される。
  • カスタムの IANA タイムゾーンを指定した絶対ウィンドウで、同じ from/to の時点が維持される。
  • カスタムの IANA タイムゾーンを指定した週次ウィンドウが、夏時間の開始と終了の切り替えをまたいで現地の時計時刻に従う。
  • 絶対/週次が混在したスナップショットが、以前のスナップショットを完全に置き換える。
  • アクセスがちょうど from で開始し、ちょうど to で停止する。週次ブロックの終了時刻もその時刻を含まない。
  • 同じ external_id で時刻を更新し、より新しいリビジョンで送信すると反映される。
  • access_time_windows を省略すると、ウィンドウは変更されずに会員のその他のフィールドが変更される。
  • 同じリビジョン/ペイロードのリプレイが冪等である。
  • 同じリビジョンで異なるペイロードを送信すると競合が返され、スナップショットは変更されない。
  • 順序が入れ替わった古いリビジョンが古いものとして報告され、状態を巻き戻せない。
  • より新しい [] によってソースが所有するウィンドウが失効し、上流からの取得に失敗した場合は何も送信されない。
  • 不明またはマッピングされていない scope_key が拒否側に倒れ、オペレーターに見える警告が作成される。
  • ソースデータの経過時間に関するアラートと、設定した古いソースのポリシーが、合意したしきい値で機能する。
  • Webhook と完全な照合の経路が、同じスナップショットとリビジョンの順序に収束する。
  • ストリームの配信が、合意した目標時間内にドア/ゲートアクセスに到達する。
  • 有効なウィンドウでマッピングされた物理ドアへのアクセスを許可できるが、ユーザーの無効化、blockAllAccess、メンテナンス、ジオフェンスは回避できない。
  • ウィンドウの前、範囲外、終了後も、通常のルールと恒久的な許可によって、ほかの条件を満たすユーザーのアクセスが引き続き許可される。

関連ガイダンス

{
  "external_id": "access-4b1782",
  "kind": "absolute",
  "from": 1792053000,
  "to": 1792058400,
  "timezone": "Australia/Perth",
  "scope_key": "after_hours_entry",
  "label": "Temporary site access"
}

必須フィールドは external_id、kind、from、to です。timezone、scope_key、label は省略可能です。

週次ウィンドウは、現地の時計時刻で繰り返す期間を表し、必要に応じて UTC の時点で範囲を区切ることができます。

{
  "external_id": "weekly-early-access",
  "kind": "weekly",
  "timezone": "America/New_York",
  "access_hours": {
    "sun": [],
    "mon": [["06:00", "08:30"]],
    "tue": [["06:00", "08:30"]],
    "wed": [["06:00", "08:30"]],
    "thu": [["06:00", "08:30"]],
    "fri": [["06:00", "08:30"]],
    "sat": []
  },
  "active_from": 1790812800,
  "active_until": 1796083200,
  "scope_key": "main_entry",
  "label": "Weekday early access"
}

必須フィールドは external_id、kind、access_hours です。timezone、active_from、active_until、scope_key、label は省略可能です。

curl -X POST https://partner-api.performancehub.co/partner/v1/members \
  -u sk_live_YOUR_PARTNER_SECRET_KEY: \
  -H "Content-Type: application/json" \
  -d '{
    "members": [
      {
        "member_id": "member_11111",
        "facility_id": "550e8400-e29b-41d4-a716-446655440000",
        "first_name": "John",
        "last_name": "Smith",
        "access_time_windows_revision": 1842,
        "access_time_windows": [
          {
            "external_id": "access-4b1782",
            "kind": "absolute",
            "from": 1792053000,
            "to": 1792058400,
            "timezone": "Australia/Perth",
            "scope_key": "after_hours_entry",
            "label": "Temporary site access"
          },
          {
            "external_id": "weekly-early-access",
            "kind": "weekly",
            "timezone": "America/New_York",
            "access_hours": {
              "sun": [],
              "mon": [["06:00", "08:30"]],
              "tue": [["06:00", "08:30"]],
              "wed": [["06:00", "08:30"]],
              "thu": [["06:00", "08:30"]],
              "fri": [["06:00", "08:30"]],
              "sat": []
            },
            "active_from": 1790812800,
            "active_until": 1796083200,
            "scope_key": "main_entry",
            "label": "Weekday early access"
          }
        ]
      }
    ]
  }'

設定済みのリンク方法に応じて、facility_id または linking_identifier のいずれかを使用してください。両方を送信しないでください。

エポックの変換

2026-10-15T08:30:00Z は 1792053000 に変換されます。

UTC instant                 Unix milliseconds   Unix seconds sent
2026-10-15T08:30:00Z        1792053000000        1792053000

言語に依存しない変換:

instant = parse_source_timestamp_with_explicit_zone(source_timestamp)
milliseconds = instant.to_unix_milliseconds()
assert milliseconds modulo 1000 equals 0
seconds = milliseconds / 1000
assert seconds is a JSON-safe nonnegative integer

ソースに 1 秒未満の精度がある場合は、連携テストの前に、開始/終了の丸め方針を意図的に定めてください。ミリ秒を渡して、単位の推測を API に任せることは絶対に避けてください。

Partner scope_key           Performance Hub mapping
default                     Facility's configured default target
main_entry                  Access Scope "Main entrances"
after_hours_entry           Doors approved for after-hours entry

パートナーは、Performance Hub の施設、ドア、アクセス範囲の ID をウィンドウ内で送信しません。不明、無効、またはマッピングされていない scope_key は、そのウィンドウについて拒否側に倒れ、アクセスが広がることはありません。リリース前にマッピングについて合意し、テストしてください。

function publish_member(member_key):
    source_result = fetch_authoritative_access_state(member_key)

    if source_result.failed or source_result.incomplete:
        record_failure(member_key)
        schedule_retry(member_key)
        return without sending access_time_windows

    windows = []
    for source_window in source_result.current_windows:
        if source_window.is_absolute:
            windows.append({
                external_id: stable_window_id(source_window),
                kind: "absolute",
                from: to_integer_unix_seconds(source_window.start_instant),
                to: to_integer_unix_seconds(source_window.end_instant),
                timezone: source_window.display_timezone or "UTC",
                scope_key: stable_scope_key(source_window) or "default",
                label: safe_label(source_window)
            })
        else:
            windows.append({
                external_id: stable_window_id(source_window),
                kind: "weekly",
                timezone: valid_iana_zone(source_window.timezone) or "UTC",
                access_hours: split_validate_and_sort_weekly_blocks(source_window),
                active_from: optional_integer_unix_seconds(source_window.active_start),
                active_until: optional_integer_unix_seconds(source_window.active_end),
                scope_key: stable_scope_key(source_window) or "default",
                label: safe_label(source_window)
            })

    normalized_snapshot = validate_sort_and_deduplicate(windows)
    revision = next_durable_member_revision(member_key)
    request = member_upsert_with(normalized_snapshot, revision)
    persist_for_retry(member_key, request)

    response = post_request(request)
    if response.is_transient_or_unknown:
        retry_exact_request_with_same_revision(request)
    else if response.is_revision_conflict:
        reconcile_with_latest_committed_source_state(member_key)
    else if response.is_stale_skip:
        stop_replaying_this_revision_and_reconcile(member_key)

最低限のテストベクター

[
  {
    "name": "absolute-half-open",
    "window": {
      "external_id": "tv-absolute",
      "kind": "absolute",
      "from": 1792053000,
      "to": 1792058400
    },
    "expect": {
      "1792052999": "inactive",
      "1792053000": "active",
      "1792058399": "active",
      "1792058400": "inactive"
    }
  },
  {
    "name": "weekly-dst",
    "window": {
      "external_id": "tv-weekly-dst",
      "kind": "weekly",
      "timezone": "America/New_York",
      "access_hours": {
        "sun": [["01:00", "03:30"]],
        "mon": [],
        "tue": [],
        "wed": [],
        "thu": [],
        "fri": [],
        "sat": []
      }
    },
    "expect": "Evaluate local wall time: skipped times do not occur; both repeated 01:30 instants qualify."
  }
]

Unix ミリ秒、数値の文字列、浮動小数点数、無効な IANA タイムゾーン、from >= to、重複した external_id、重なり合うブロック、日をまたぐブロック、1 日に 8 つを超えるブロック、50 件を超えるウィンドウ、マッピングされていないスコープキーについての異常系のベクターも提出してください。

会員を保存する

会員の記録を作成または更新します。API は member_id に基づいて、作成するか更新するかを判断します。

パラメーター

  • members array 必須

    保存する会員オブジェクトの配列。最適なパフォーマンスのため、推奨される上限はリクエストあたり 1000 項目です。API は処理のために項目を自動的にバッチ化します。各項目には、facility_id(linking_identifier を使用しない場合は必須)または linking_identifier(facility_id を使用しない場合は必須)のいずれかを含める必要があります。

    会員に access_time_windows を含める場合は、access_time_windows_revision も含める必要があります。この配列はソースの完全なスナップショットであり、差分ではありません。既存のスナップショットを維持する場合は省略し、ソースが所有するすべてのウィンドウを失効させる場合はより新しいリビジョンで [] を送信します。このフィールドを有効にする前に、Access Time Windows ガイドをお読みください。

戻り値

同期操作を確認する簡単なメッセージを返します。

ウィンドウのスナップショットが冪等なリプレイまたは古いデータのスキップとして報告された場合でも、会員のプロフィールフィールドは通常どおりアップサートされます。同じリビジョンで異なるペイロードを持つ競合したスナップショットは、そのまま再試行することはできません。ソースの状態を照合し、より新しいリビジョンで送信してください。

リクエスト

curl -X POST https://partner-api.performancehub.co/partner/v1/members \
  -u sk_live_YOUR_PARTNER_SECRET_KEY: \
  -H "Content-Type: application/json" \
  -d '{
    "members": [
      {
        "member_id": "member_11111",
        "facility_id": "550e8400-e29b-41d4-a716-446655440000",
        // "linking_identifier": "branch_downtown",  // If using linking identifier
        "first_name": "John",
        "last_name": "Smith",
        "email": "john.smith@example.com",
        "mobile_phone": "+61 412 345 678",
        "date_of_birth": "1985-06-15",
        "gender": "male",
        "type": "member",
        "tags": ["vip", "personal-training"],
        "profile_picture": "/9j/4AAQSkZJRgABAQAAAQ...",
        "membership_status": "current",
        "created": "2024-01-15T10:30:00Z",
        "updated": "2024-01-20T14:45:00Z",
        "access_time_windows_revision": 1842,
        "access_time_windows": [
          {
            "external_id": "access-4b1782",
            "kind": "absolute",
            "from": 1792053000,
            "to": 1792058400,
            "timezone": "Australia/Perth",
            "scope_key": "after_hours_entry",
            "label": "Temporary site access"
          }
        ],
        "address": {
          "address_line_1": "456 Bourke Street",
          "address_line_2": "Apt 12",
          "city": "Melbourne",
          "state": "VIC",
          "postal_code": "3000",
          "country": "AU",
          "country_name": "Australia"
        },
        "membership_plans": [
          {
            "membership_plan_id": "plan_99999",
            "name": "Unlimited Monthly",
            "start_date": "2024-01-01T00:00:00Z",
            "status": "current",
            "is_current": true,
            "end_date": null
          }
        ]
      }
    ]
  }'

レスポンス

同期操作に関するメタデータを含む成功メッセージを返します。

{
  "message": "Member sync successful.",
  "metadata": {
    "success": 245,
    "skipped": 5,
    "skipped_items": [
      {
        "member_id": "member_123",
        "facility_id": null,
        "reason": "Facility integration is disabled in facility-partner-config"
      }
    ]
  }
}

メタデータフィールド:

  • success - 正常に処理された会員の数
  • skipped - スキップされた会員の数(ある場合)
  • skipped_items - スキップされた会員とその理由の配列(ある場合)
  • dry-run - dryrun キーの種類を使用している場合のブール値フラグ(該当する場合)

チェックイン

施設、クラス、アクティビティに人物が来場した記録を表します。出席の追跡、利用状況の分析、映像による検出精度の向上に使用されます。

エンドポイント

POST /partner/v1/check-ins - Save check-ins

チェックインオブジェクト

属性

  • check_in_id string 省略可

    チェックインの一意の識別子。省略可能です。指定しない場合は、member_id と timestamp の組み合わせから自動生成されます。

  • member_id string 必須

    会員の一意の識別子。

  • facility_id string いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    Performance Hub での施設の一意の識別子。

  • linking_identifier string いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    パートナーが使用する各拠点の一意の識別子の値(例: 「Branch ID」、「Location Code」、「Store Number」)。詳細

  • check_in_type string 省略可

    来場の種類。member、class、staff、guest、trial のいずれかです。

  • source string 省略可

    チェックインの取得方法。一般的な値には manual、tag、rfid、kiosk、app があります。door_reader や booking などの値も使用できます。

  • class_id string 省略可

    省略可能です。クラスの予約や出席に関連付けられている場合に指定します。

  • timestamp string 必須

    チェックインが発生した日時の ISO 8601 形式のタイムスタンプ。

チェックインオブジェクト

{
  // "check_in_id": "checkin_abc123",  // Optional - auto-generated from member_id + timestamp if not provided
  "member_id": "mem_12345",
  "facility_id": "550e8400-e29b-41d4-a716-446655440000",
  // "linking_identifier": "branch_downtown",  // If using linking identifier
  "check_in_type": "member",
  "source": "rfid",
  "timestamp": "2025-01-20T08:45:30Z"
}

チェックインを保存する

チェックインの記録を作成します。API は会員、施設、タイムスタンプに基づいて重複を自動的に除外します。

パラメーター

  • check_ins array 必須

    保存するチェックインオブジェクトの配列。最適なパフォーマンスのため、推奨される上限はリクエストあたり 1000 項目です。API は処理のために項目を自動的にバッチ化します。各項目には、facility_id(linking_identifier を使用しない場合は必須)または linking_identifier(facility_id を使用しない場合は必須)のいずれかを含める必要があります。

戻り値

同期操作を確認する簡単なメッセージを返します。

リクエスト

curl -X POST https://partner-api.performancehub.co/partner/v1/check-ins \
  -u sk_live_YOUR_PARTNER_SECRET_KEY: \
  -H "Content-Type: application/json" \
  -d '{
    "check_ins": [
      {
        // "check_in_id": "checkin_abc123",  // Optional - auto-generated from member_id + timestamp if not provided
        "member_id": "mem_12345",
        "facility_id": "550e8400-e29b-41d4-a716-446655440000",
        // "linking_identifier": "branch_downtown",  // If using linking identifier
        "check_in_type": "member",
        "source": "rfid",
        "timestamp": "2025-01-20T08:45:30Z"
      }
    ]
  }'

レスポンス

同期操作に関するメタデータを含む成功メッセージを返します。

{
  "message": "Check-in sync successful.",
  "metadata": {
    "success": 523,
    "skipped": 3,
    "skipped_items": [
      {
        "member_id": "member_789",
        "facility_id": null,
        "reason": "No matching facility_id for the linking_identifier"
      }
    ]
  }
}

メタデータフィールド:

  • success - 正常に処理されたチェックインの数
  • skipped - スキップされたチェックインの数(ある場合)
  • skipped_items - スキップされたチェックインとその理由の配列(ある場合)
  • dry-run - dryrun キーの種類を使用している場合のブール値フラグ(該当する場合)

アクセスコントロール

Partner API を使用すると、連携が有効になっている施設で Performance Hub のドア/ゲートコントローラーのハードウェアを動作させることができます。

この API は、会員管理システムが人物の入場を許可するとすでに判断した場合に使用します。Performance Hub は、会員ステータス、アクセス時間、ドアゾーンのルール、不正チェック、利用停止のロジックを評価しません。これらの判断は、引き続きお使いのシステムが行います。

解錠リクエストは同期的に処理されます。Performance Hub はコマンドを現地のコントローラーにリアルタイムで送信し、リレーが物理的に解錠されたことをデバイスが確認した後にのみ 200 を返します。ほとんどの確認は 3〜5 秒で完了します。タイムアウト時間内に確認を受け取れなかった場合、API は明示的な失敗を返します。

コントローラーに到達しなかったアクセスの試行や拒否を記録することもできます。この呼び出しではドアは解錠されません。ドア/ゲートアクセスのアクセスログにイベントが書き込まれます。

エンドポイント

GET /partner/v1/access-control/doors - List available Door/Gate Controllers
GET /partner/v1/access-control/doors/{door_id} - Get Door/Gate Controller status
POST /partner/v1/access-control/doors/{door_id}/unlock - Unlock a Door/Gate Controller
POST /partner/v1/access-control/doors/{door_id}/access-events - Record an access attempt or denial

ドア/ゲートコントローラーオブジェクト

属性

  • door_id string 必須

    ドア/ゲートコントローラーの一意の識別子。検出後にお使いのシステムに保存し、解錠エンドポイントを呼び出す際に使用します。

  • facility_id string 必須

    Performance Hub の施設 ID。

  • linking_identifier string 省略可

    連携で Linking Identifier を使用している場合の、パートナーの施設識別子。詳細

  • name string 必須

    Performance Hub で設定された、人が読める形式のデバイス名。

  • zone string 省略可

    ドアのゾーンまたは場所(Entrance など)。

  • status string 必須

    online または offline。

  • relay_state string 省略可

    最新の既知のリレー状態(locked、unlocked など)。

  • maintenance_mode string 必須

    現在のメンテナンスモード。off、force-open、force-closed のいずれかです。

  • hold_time_seconds integer 必須

    ドアに設定されている既定の解錠保持時間。

  • last_seen string 省略可

    デバイスのメタデータが最後に更新された日時の ISO タイムスタンプ。

ドア/ゲートコントローラーオブジェクト

{
  "door_id": "00000000000000000000000000000007",
  "facility_id": "550e8400-e29b-41d4-a716-446655440000",
  "linking_identifier": "branch_downtown",
  "name": "Front Door",
  "zone": "Entrance",
  "status": "online",
  "online": true,
  "relay_state": "locked",
  "maintenance_mode": "off",
  "hold_time_seconds": 10,
  "last_seen": "2026-05-01T04:30:00.000Z"
}

ドア/ゲートコントローラーの一覧を取得する

連携で利用できるドア/ゲートコントローラーを返します。

facility_id と linking_identifier のどちらも指定しない場合、API はパートナーアカウントにリンクされているすべての施設のドア/ゲートコントローラーを返します。

Recommended: Include a facility identifier whenever possible. Requests without `facility_id` or `linking_identifier` may take longer to load for partners with hundreds or thousands of Door/Gate Controllers.

パラメーター

  • facility_id string 省略可 いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    Performance Hub の施設 ID。Direct Link の連携で使用します。

  • linking_identifier string 省略可 いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    独自の施設/拠点識別子。連携が Linking Identifier 用に設定されている場合に使用します。

戻り値

ドア/ゲートコントローラーオブジェクトの配列を返します。

リクエスト

curl -X GET "https://partner-api.performancehub.co/partner/v1/access-control/doors?facility_id=550e8400-e29b-41d4-a716-446655440000" \
  -u sk_live_YOUR_PARTNER_SECRET_KEY:

レスポンス

{
  "data": [
    {
      "door_id": "00000000000000000000000000000007",
      "facility_id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "Front Door",
      "zone": "Entrance",
      "status": "online",
      "relay_state": "locked",
      "maintenance_mode": "off",
      "hold_time_seconds": 10,
      "last_seen": "2026-05-01T04:30:00.000Z"
    }
  ]
}

ドア/ゲートコントローラーのステータスを取得する

1 台のドア/ゲートコントローラーについて、最新の既知の状態と基本的な設定を取得します。

ドアが連携からアクセス可能な施設に属していることを Performance Hub が確認できるよう、施設識別子を指定してください。

パラメーター

  • door_id string 必須

    一覧エンドポイントから返されたドア/ゲートコントローラーの ID。

  • facility_id string いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    Performance Hub の施設 ID。Direct Link の連携で必須です。

  • linking_identifier string いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    パートナーの施設識別子。Linking Identifier の連携で必須です。

戻り値

ドア/ゲートコントローラーオブジェクトを返します。

リクエスト

curl -X GET "https://partner-api.performancehub.co/partner/v1/access-control/doors/00000000000000000000000000000007?facility_id=550e8400-e29b-41d4-a716-446655440000" \
  -u sk_live_YOUR_PARTNER_SECRET_KEY:

レスポンス

{
  "data": {
    "door_id": "00000000000000000000000000000007",
    "facility_id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Front Door",
    "zone": "Entrance",
    "status": "online",
    "relay_state": "locked",
    "maintenance_mode": "off",
    "hold_time_seconds": 10,
    "last_seen": "2026-05-01T04:30:00.000Z"
  }
}

ドア/ゲートコントローラーを解錠する

ドア/ゲートコントローラーに解錠コマンドを送信し、物理リレーが解錠を確認するまで待機します。

このエンドポイントを呼び出す前に、人物が許可されているかどうかをお使いのシステムで判断する必要があります。Performance Hub が確認するのは、パートナーキー、施設へのアクセス、ドアの所有関係、デバイスの状態のみです。

パラメーター

  • door_id string 必須

    一覧エンドポイントから返されたドア/ゲートコントローラーの ID。

  • facility_id string いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    Performance Hub の施設 ID。Direct Link の連携で必須です。

  • linking_identifier string いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    パートナーの施設識別子。Linking Identifier の連携で必須です。

  • member_id string 必須

    パートナーの会員 ID。監査ログと後のデータのリンクに使用されます。

  • first_name string 必須

    ドアを開ける人物の名。

  • last_name string 必須

    ドアを開ける人物の姓。

  • full_name string 省略可

    省略可能です。省略した場合、Performance Hub は first_name と last_name を結合します。

  • check_in_id string 省略可

    関連付けのための、お使いのシステムのチェックイン ID(省略可)。

  • idempotency_key string 省略可

    リプレイ防止用のキー(省略可)。同じパートナー、施設、ドアに対して同じキーを再利用すると、既存の結果がある場合はその結果が返されます。

戻り値

デバイスがリレーの物理的な解錠を確認した場合にのみ 200 を返します。ドアは Performance Hub のデバイス管理で設定された保持時間を使用します。パートナーがリクエストごとにリレーのタイミングを上書きすることはできません。ほとんどの確認は 3〜5 秒で完了します。ドキュメントに記載されたタイムアウトは解錠の明示的な失敗として扱い、独自の安全ルールに従ってのみ再試行してください。

主なエラー:

  • 403 integration_not_enabled - 施設で連携が有効になっていない。
  • 409 maintenance_mode_active - 施設のスタッフがドアのメンテナンスモードを有効にしている。
  • 503 device_offline - ドア/ゲートコントローラーがオフラインであるか、情報が古くなっている。
  • 504 unlock_confirmation_timeout - コマンドは送信されたが、タイムアウトまでに対応する確認を受信できなかった。

リクエスト

curl -X POST https://partner-api.performancehub.co/partner/v1/access-control/doors/00000000000000000000000000000007/unlock \
  -u sk_live_YOUR_PARTNER_SECRET_KEY: \
  -H "Content-Type: application/json" \
  -d '{
    "facility_id": "550e8400-e29b-41d4-a716-446655440000",
    "member_id": "mem_12345",
    "first_name": "Jane",
    "last_name": "S.",
    "full_name": "Jane S.",
    "source": "door_reader",
    "idempotency_key": "unlock_20260501_0001"
  }'

レスポンス

{
  "status": "unlocked",
  "door_id": "00000000000000000000000000000007",
  "facility_id": "550e8400-e29b-41d4-a716-446655440000",
  "event_id": "00000000-0000-0000-0000-000000000045",
  "command_id": "00000000-0000-0000-0000-000000000049",
  "hold_time_seconds": 10,
  "confirmed_at": "2026-05-01T04:30:00.000Z"
}

失敗時のレスポンス

{
  "status": "failed",
  "reason": "device_offline",
  "door_id": "00000000000000000000000000000007",
  "facility_id": "550e8400-e29b-41d4-a716-446655440000",
  "event_id": "00000000-0000-0000-0000-000000000045"
}

アクセスの試行または拒否を記録する

お使いのシステムですでに判断したアクセスの試行または拒否を記録します。ドア/ゲートコントローラーには接続されず、ドアは解錠されません。

システムが入場を拒否した場合や、解錠せずに試行をドア/ゲートアクセスのアクセスログに表示させたい場合に使用します。Performance Hub は、会員ステータス、アクセス時間、その他のアクセスルールを評価しません。

拒否イベントは、Denied の結果、パートナー名、ドア、会員識別子(送信した場合)、読みやすい形式の理由コードとともに、ドア/ゲートアクセスのアクセスログに表示されます。たとえば、membership_expired は「Membership Expired」と表示されます。reason_display_text と user_email はイベントとともに保存されます。

パラメーター

  • door_id string 必須

    一覧エンドポイントから返されたドア/ゲートコントローラーの ID。

  • facility_id string いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    Performance Hub の施設 ID。Direct Link の連携で必須です。

  • linking_identifier string いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    パートナーの施設識別子。Linking Identifier の連携で必須です。

  • outcome string 必須

    denied または attempted。

  • reason string 省略可

    小文字の snake_case による理由コード(最大 64 文字)。outcome が denied の場合は必須です。例: membership_expired。

  • reason_display_text string 省略可

    人が読める形式の理由(最大 256 文字)。例: Membership expired on 2026-04-01。

  • member_id string 省略可

    パートナーの会員 ID。不明なカードなど、資格情報が会員と一致しなかった場合は省略します。

  • user_email string 省略可

    アクセスを試みた人物のメールアドレス。

  • timestamp string 省略可

    試行が発生した日時(タイムゾーン付きの ISO 8601 形式)。例: 2026-05-18T10:15:30Z。既定値はリクエストを受信した時刻です。5 分を超える未来の日時や、30 日より前の日時は指定できません。

  • idempotency_key string 省略可

    リプレイ防止用のキー(最大 128 文字)。同じパートナー、施設、ドアに対して同じキーを再利用すると、元の結果が返されます。

戻り値

イベントが記録されると 201 を返します。同じ idempotency_key で再送信すると、idempotent が true に設定された 200 が返され、新しいイベントは作成されません。

dry-run キーを使用すると、dry_run が true に設定された 200 が返されます。何も記録されません。

主なエラー:

  • 400 - 本文が無効である、拒否に reason がない、タイムスタンプが範囲外である、または facility_id / linking_identifier がリンク済みの施設と一致しない。
  • 403 - キーが読み取り専用である。
  • 403 integration_not_enabled - 施設で連携が有効になっていない。理由は message に示されます。
  • 404 - リンク済みの施設でドア/ゲートコントローラーが見つからなかった。

リクエスト

curl -X POST https://partner-api.performancehub.co/partner/v1/access-control/doors/00000000000000000000000000000007/access-events \
  -u sk_live_YOUR_PARTNER_SECRET_KEY: \
  -H "Content-Type: application/json" \
  -d '{
    "facility_id": "550e8400-e29b-41d4-a716-446655440000",
    "outcome": "denied",
    "reason": "membership_expired",
    "reason_display_text": "Membership expired on 2026-04-01",
    "member_id": "mem_12345",
    "user_email": "member@example.com",
    "timestamp": "2026-05-18T10:15:30Z",
    "idempotency_key": "evt_abc12345"
  }'

レスポンス

{
  "status": "recorded",
  "event_id": "00000000-0000-0000-0000-000000000045",
  "outcome": "denied",
  "door_id": "00000000000000000000000000000007",
  "facility_id": "550e8400-e29b-41d4-a716-446655440000",
  "timestamp": "2026-05-18T10:15:30.000Z"
}

冪等なリプレイ

{
  "status": "recorded",
  "event_id": "00000000-0000-0000-0000-000000000045",
  "outcome": "denied",
  "door_id": "00000000000000000000000000000007",
  "facility_id": "550e8400-e29b-41d4-a716-446655440000",
  "timestamp": "2026-05-18T10:15:30.000Z",
  "idempotent": true
}

施設レポート

特定の期間における施設の主要な運用指標と財務指標を記録した、ある時点の記録です。

エンドポイント

POST /partner/v1/report-snapshots - Save report snapshots

レポートスナップショットオブジェクト

属性

  • facility_id string いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    Performance Hub での施設の一意の識別子。

  • linking_identifier string いずれか一方連携に設定されている施設識別子の種類を指定してください。Direct Link の連携では facility_id を、Linking Identifier の連携では linking_identifier を使用します。両方を送信しないでください。API はパートナーアカウントに設定された識別子の種類を使用し、もう一方は無視します。詳細

    パートナーが使用する各拠点の一意の識別子の値(例: 「Branch ID」、「Location Code」、「Store Number」)。詳細

  • start_date string 必須

    YYYY-MM-DD 形式のスナップショット期間の開始日。

  • end_date string 必須

    YYYY-MM-DD 形式のスナップショット期間の終了日。

  • metrics object 必須

    期間中の会員と収益のデータを含む指標オブジェクト。

レポートスナップショットオブジェクト

{
  "facility_id": "550e8400-e29b-41d4-a716-446655440000",
  // "linking_identifier": "branch_downtown",  // If using linking identifier
  "start_date": "2025-01-01",
  "end_date": "2025-01-31",
  "metrics": {
    "members": {
      "active": 1200,
      "new": 45,
      "cancelled": 12
    },
    "revenue": {
      "total_payments": 289000.00,
      "total_payments_count": 1200,
      "currency": "AUD"
    }
  }
}

レポートのスナップショットを保存する

特定の期間における施設の運用指標と財務指標を送信します。

パラメーター

  • snapshots array 必須

    保存するレポートスナップショットオブジェクトの配列。リクエストあたり最大 25 項目です。各項目には、facility_id(linking_identifier を使用しない場合は必須)または linking_identifier(facility_id を使用しない場合は必須)のいずれかを含める必要があります。

戻り値

同期操作を確認する簡単なメッセージを返します。

リクエスト

curl -X POST https://partner-api.performancehub.co/partner/v1/report-snapshots \
  -u sk_live_YOUR_PARTNER_SECRET_KEY: \
  -H "Content-Type: application/json" \
  -d '{
    "snapshots": [
      {
        "facility_id": "550e8400-e29b-41d4-a716-446655440000",
        // "linking_identifier": "branch_downtown",  // If using linking identifier
        "start_date": "2025-01-01",
        "end_date": "2025-01-31",
        "metrics": {
          "members": {
            "active": 1200,
            "new": 45,
            "cancelled": 12
          },
          "revenue": {
            "total_payments": 289000.00,
            "currency": "AUD"
          }
        }
      }
    ]
  }'

レスポンス

{
  "message": "Report snapshot sync successful."
}

エラー

Partner API は、標準の HTTP ステータスコードと JSON のレスポンス本文を使用して、リクエストが失敗した理由を説明します。

エラーレスポンスの形式

ほとんどの API エラーは、メッセージと、利用可能な場合は構造化された詳細を含む JSON 本文を返します。

ステータスコード

Access Time Window のエラー

ウィンドウの検証は、無効なスナップショットが書き込まれる前に失敗します。再試行できない一般的な原因は次のとおりです。

  • access_time_windows があるのに access_time_windows_revision がない。
  • 文字列、浮動小数点数、またはミリ秒単位と思われるエポック値。
  • 無効な IANA タイムゾーン、開始と終了が逆転した期間、重複した external_id、重なり合う週次ブロック、または分割されていない日をまたぐブロック。
  • ドキュメントに記載された件数、長さ、期間の上限を超える値。

同じリビジョンで正規化後の内容が異なる場合は 409 Conflict になります。最新の信頼できる状態と照合し、より新しいリビジョンを割り当ててください。競合している組み合わせで再試行を続けないでください。古いリビジョンは、新しい状態を上書きすることなく、古いためスキップされたスナップショットとして報告されます。不明な scope_key やマッピングされていない scope_key は、認可の面で拒否側に倒れるため、設定に関するアラートとして扱ってください。

配信がタイムアウトした場合や一時的な 5xx を受信した場合は、正規化済みのスナップショットをそのまま同じリビジョンで再試行してください。上流のソースからの取得に失敗した場合は、ウィンドウのフィールド自体を省略してください。空の配列で代用しないでください。

再試行のガイダンス

次のエラーは、上限付きの指数バックオフで再試行してください。

  • 429
  • 500
  • 502
  • 503
  • 504

次のエラーは、むやみに再試行しないでください。

  • 400
  • 401
  • 403
  • 404
  • 409
  • 422

アクセスコントロールでは、独自のアクセスルールや安全手順で別途定めていない限り、タイムアウトやオフラインのレスポンスは常に解錠の失敗として扱ってください。

サポートに伝える詳細

サポートに連絡する際は、次の情報を含めてください。

  • エンドポイントと HTTP メソッド。
  • タイムスタンプとタイムゾーン。
  • パートナーキー ID(シークレットキーではありません)。
  • 使用した施設識別子。
  • お使いのシステムでのソースレコード ID。
  • レスポンスのステータスと本文。
  • 利用可能な場合は event_id または command_id。
{
  "success": false,
  "message": "Request body.members[0].member_id is required"
}

一部のドメイン固有のエンドポイントは、明示的なステータスと理由を返します。たとえば、アクセスコントロールのエラーには reason、door_id、facility_id、event_id などのフィールドが含まれます。

{
  "status": "failed",
  "reason": "device_offline",
  "door_id": "00000000000000000000000000000007",
  "facility_id": "550e8400-e29b-41d4-a716-446655440000",
  "event_id": "00000000-0000-0000-0000-000000000045"
}

400 Bad Request

リクエストの形式が正しくないか、必須フィールドがありません。リクエストを修正してから再試行してください。

401 Unauthorized

認証に失敗しました。HTTP Basic 認証を使用し、API シークレットキーをユーザー名に、パスワードを空欄にしていることを確認してください。

403 Forbidden

キーは有効ですが、操作が許可されていません。一般的な原因として、書き込み操作に読み取り専用キーを使用している場合や、連携が有効になっていない施設にアクセスしようとしている場合があります。

404 Not Found

要求されたリソースが見つからないか、連携では利用できません。

409 Conflict

リクエストが現在のリソースの状態と競合しています。アクセスコントロールの場合、ドア/ゲートコントローラーがメンテナンスモードになっていることが原因の場合があります。

422 Unprocessable Entity

リクエストは有効な JSON ですが、意味的な検証に失敗しました。データを修正してから再試行してください。

429 Too Many Requests

連携がドキュメントに記載されたレート制限を超えました。指数バックオフを使用して再試行してください。

500 Internal Server Error

内部エラーのため、Performance Hub はリクエストを完了できませんでした。バックオフを使用して再試行してください。問題が解決しない場合は、エンドポイント、タイムスタンプ、レスポンス本文を添えてサポートにお問い合わせください。

503 Service Unavailable

依存するサービスまたはデバイスが利用できません。ドア/ゲートコントローラーの解錠の場合は、コントローラーがオフラインであることを意味する場合があります。

504 Gateway Timeout

操作がタイムアウトしました。ドア/ゲートコントローラーの解錠の場合は、タイムアウト時間内に解錠が確認されなかったことを意味します。

バージョン管理

Partner API のバージョンは URL で指定します。現在のバージョンは次のとおりです。

変更ポリシー

Performance Hub は、可能な限り、追加的で後方互換性のある変更を行うよう努めています。

後方互換性のある変更の例:

  • リクエストに新しい省略可能なフィールドを追加する。
  • レスポンスに新しいフィールドを追加する。
  • 新しいエンドポイントを追加する。
  • クライアントが不明な値を処理することが想定される列挙型に、新しい値を追加する。
  • ステータスコードの仕様を変えずに、検証メッセージを改善する。

access_time_windows と access_time_windows_revision は、会員リクエストに追加されたフィールドです。これらを省略する既存のクライアントでは、保存済みの Access Time Window のスナップショットは変更されません。この省略のルールにより、部分的なアップサートとの互換性が保たれます。省略することは、空の配列を送信することと同じではありません。

互換性を損なう変更の例:

  • フィールドを削除する、または名前を変更する。
  • フィールドの型を変更する。
  • 省略可能なリクエストフィールドを必須にする。
  • エンドポイントを削除する。
  • 既存のステータスコードやドメイン固有の reason の意味を変更する。

非推奨化

互換性を損なう変更が必要な場合、Performance Hub は可能な限り既存のバージョンをそのまま変更することを避けます。代わりに、新しいバージョンまたは移行手段を導入し、影響を受けるパートナーに変更をお知らせします。

非推奨化の通知には、次のものが含まれる場合があります。

  • 変更履歴の項目。
  • パートナーへの直接の連絡。
  • Partner Console での注記。
  • ドキュメントでの移行ガイダンス。

クライアントに関する推奨事項

追加的な変更に対応できるクライアントを構築してください。

  • 使用しないレスポンスフィールドは無視する。
  • 不明な列挙値は、クラッシュさせずにサポート対象外として扱う。
  • レスポンスの厳密な一致チェックを避ける。
  • 認識できない値をログに記録し、意図的に連携を更新できるようにする。

Access Time Windows のようにリビジョン管理される会員の区画については、結果が判明するまで、送信したリビジョンと正規化済みのペイロードを保存してください。変更された内容にリビジョンを再利用すると競合になり、同じ内容を再送信した場合は冪等になります。Access Time Windows を参照してください。

OpenAPI 仕様

公開されている OpenAPI 仕様を使用して、クライアントの生成、リクエストの検証、API の形式の変更の追跡を行ってください。

OpenAPI 仕様を参照してください。

https://partner-api.performancehub.co/partner/v1/

変更履歴

この変更履歴には、連携の動作に影響する Partner API と Partner Console の主な変更を記録しています。

2026-09-09

2026-05-06

2026-05-01

変更のカテゴリ

今後の項目では、次のカテゴリを使用します。

  • Added - 新しいエンドポイント、フィールド、ガイド、機能。
  • Changed - サポートを終了することなく、動作またはドキュメントが変更されたもの。
  • Deprecated - 機能は引き続き利用できるが、移行が予定されているもの。
  • Removed - 機能またはエンドポイントが削除されたもの。
  • Fixed - バグの修正またはドキュメントの訂正。
  • Security - 認証、認可、データの取り扱い、キー管理に関する変更。

追加

  • ベンダーに依存しない会員の access_time_windows スナップショットを追加しました。絶対的なウィンドウと毎週繰り返すウィンドウを組み合わせて使用できます。
  • access_time_windows_revision による順序付け、冪等なリプレイ、競合、古いデータのスキップ、明示的な失効のセマンティクスを追加しました。
  • IANA タイムゾーン、夏時間、論理的な scope_key のマッピング、ソースの鮮度、プロデューサーの実装、認定に関するガイダンスを追加しました。

追加

  • パートナーの種類、オンボーディング、ベストプラクティス、本番稼働の準備、エラー、バージョン管理、サポートを扱うパートナープログラムのドキュメントを追加しました。
  • 技術パートナーや商業パートナーをご検討中の方向けに、専用の「パートナーになる」お問い合わせフローを追加しました。
  • 承認されたパートナー連携が Performance Hub のコアプラットフォーム内の Performance Hub パートナーディレクトリにどのように表示されるかについてのドキュメントを追加しました。

追加

  • 一覧、ステータス、解錠の操作を含む、ドア/ゲートコントローラーのアクセスコントロールに関するドキュメントを追加しました。
  • 同期的な解錠動作に関するドキュメントを追加しました。API は、リレーが物理的に解錠されたことを現地のコントローラーが確認した後にのみ成功を返します。
  • ドア/ゲートコントローラーの解錠リクエストで省略可能な idempotency_key のサポートに関するドキュメントを追加しました。