DEVELOPER · GUIDE

連携ガイド

plott LIFE Open APIを連携するパートナー向けの段階別ガイドです。

PHASE 01 · 開始

APIキー発行から開発環境設定まで

STEP 01

アプリ追加とAPIキー発行

Open APIを利用するには、アプリ作成後にAPIクライアントキーとシークレットを発行してください。

アプリ作成

  1. アプリ画面で申請フォームを記入します。
  2. サービス名・英語名(チャネルコード)・サービスURLを入力して送信
  3. 運営チームの審査後に非公開チャネルが作成され、結果はメールで通知されます。承認後、アプリ詳細ページからAPIキーを発行できます。

APIクライアント発行

  1. アプリ詳細ページの APIクライアント セクションで [クライアントを追加] をクリックします。
  2. Client ID(自由形式、最大100文字)と使用するスコープを選択します。
  3. 作成直後に表示される Client Secretをすぐに安全な場所に保存 してください。この値は再表示されません。

スコープ

  • buildingUnit:readBUILDING_UNIT_READ部屋参照
  • buildingUnit:writeBUILDING_UNIT_WRITE部屋マッピング作成・編集
  • booking:readBOOKING_READ予約参照
  • booking:writeBOOKING_WRITE予約作成・変更
  • contract:readCONTRACT_READ契約参照
  • contract:writeCONTRACT_WRITE契約作成・変更(方式B)
  • user:writeUSER_WRITEユーザー作成(方式A・ログイン連携)
  • userLoginTicket:writeUSER_LOGIN_TICKET_WRITEログインチケット発行(方式A・ログイン連携)
  • chat:readCHAT_READチャット参照
  • chat:writeCHAT_WRITEチャット作成・送信

結果

Client IDとClient Secretを取得したら、このキーはすべてのAPIリクエストのAuthorization: Basic … ヘッダーで使用されます。

STEP 02

テストルーム登録とチャネルマッピング設定

APIで契約・予約を登録するには、テスト用の部屋を作成しチャネルマッピングを設定する必要があります。

手順

  1. ホスト画面で新しい部屋を登録します。
  2. チャネルマッピング画面登録した部屋を選び、部屋単位マッピングと室単位マッピングを設定します。部屋単位は任意ですが、室単位マッピングを設定しないとOpen APIで契約登録できません。外部物件IDには該当チャネルで使用する室のIDを指定してください。
  3. ゲストページで登録した部屋を確認するには /rooms/{roomId}にアクセスしてください。

参考

外部物件IDの例) https://www.airbnb.co.kr/rooms/1252576808547167623 1252576808547167623

STEP 03

MCPでドキュメント参照

AIコーディングエージェント(Claude Code、Cursorなど)にplott LIFE Open APIのMCPサーバーを登録すると、エージェントがAPI仕様を即座に参照でき、より速く連携できます。

Claude Codeに登録

claude mcp add --transport http plott-life-partner \
  https://life.plott.co.kr/api/open/mcp \
  --header "Authorization: Basic {base64(clientId:clientSecret)}"

{base64(clientId:clientSecret)} はStep 01で発行したClient IDとSecretを clientId:clientSecret の形式で結合してbase64でエンコードした値です。

MCPサーバー登録後にAIコーディングエージェントがplott LIFEのOpen API仕様を探索する例MCPで取得したAPI仕様をもとにエージェントが連携コードを生成する例

PHASE 02 · 連携

連携方式を選んで実装・運用する

IMPLEMENT & OPERATE

連携方式の選択

パートナーサービスがどこまで対応するかにより、連携方式は2種類あります。 方式A・ログイン連携 は部屋一覧とログインのみを連携し、契約・決済はplott LIFEへ引き渡すハンドオフ方式です。 方式B・契約連携 は契約APIまで連携し、パートナーアプリ内で販売を完結する方式です。下のタブで方式を選ぶと、対応する実装・運用ステップが表示されます。

パートナーサービスがどこまで扱うかに応じて、2つの連携方式のいずれかを選択します。下の実装・運用ステップは選択した方式に応じて表示されます。前段の共通ステップ(アプリ申請・キー発行、テスト物件・チャネルマッピング、MCP)と、後の公開チャネル段階は両方式で同じです。

方式A・ログイン連携(ハンドオフ)

パートナーサービスでは部屋一覧のみ表示し、契約・決済はplott LIFEのページに引き継ぎます。あらかじめ会員を作成し、ログインチケット(SSO)を発行して渡せば、ユーザーはplott LIFEで自動ログインした状態で契約を続行できます。必要なスコープは user:write, userLoginTicket:write です。

IMPLEMENT・ログイン連携

実装ステップ

1. 部屋一覧連携

パートナーサービスがplott LIFEの部屋(物件)を取得してユーザーに表示するステップです。

GET /open/v1/building-unit-type で部屋一覧を、 GET /open/v1/building-unit-type/{id} で個別詳細を取得します。一覧は page·size ページネーションを使用し、 デフォルトのsizeは20です。無限スクロールはレスポンスの totalItems で追加読み込みがあるか判定します。

  • page任意0から始まるページ番号
  • size任意・デフォルト20ページあたりの項目数
  • operationStatus推奨一般ユーザーに表示する際はPUBLISHED(運用中)のみ取得
const res = await fetch(
  'https://life.plott.co.kr/api/open/v1/building-unit-type?page=0&size=20&operationStatus=PUBLISHED',
  { headers: { Authorization: `Basic ${credentials}` } },
);
const { items, totalItems, totalPages } = await res.json();

参考

部屋の料金計算ポリシー(日割り家賃・割引・管理費・保証金・サービス手数料)と保存方式(直接呼び出し/ミラーリング)は両方式で同じです。詳細な計算式と例は APIドキュメントで確認してください。

2. 会員作成連携

POST /open/v1/user でパートナーサービスの会員をplott LIFEの会員として作成します。 externalUserId (パートナーの会員識別子)を基に冪等処理され、既に存在する会員なら既存の会員IDを返します。

  • externalUserId必須パートナーサービスの会員識別子(冪等キー)
  • email必須会員のメールアドレス
  • firstName / lastName必須名 / 姓
  • phoneCode / phoneNumber必須国番号 / 電話番号(例: 82 / 1012345678)
  • countryCode任意国コード(例: KR)
const res = await fetch('https://life.plott.co.kr/api/open/v1/user', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Basic ${credentials}`,
  },
  body: JSON.stringify({
    externalUserId: 'partner-user-001',
    email: 'user@example.com',
    firstName: '길동',
    lastName: '홍',
    phoneCode: '82',
    phoneNumber: '1012345678',
    countryCode: 'KR',
  }),
});

const { id } = await res.json(); // 플라트라이프 회원 ID

3. ログインチケット発行連携

POST /open/v1/userLoginTicket で対象会員のワンタイムログインチケットを発行します。リクエストには userId (会員作成応答の id)または externalUserId のいずれかを含めます。応答で受け取った ticket は 5分間有効 で 1回のみ使用 できるため、ユーザーがplott LIFEに遷移する直前に発行してください。

  • userIduserId / externalUserId のいずれかを選択plott LIFE会員ID(会員作成応答のid)
  • externalUserIduserId / externalUserId のいずれかを選択パートナーサービスの会員識別子
const res = await fetch(
  'https://life.plott.co.kr/api/open/v1/userLoginTicket',
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Authorization: `Basic ${credentials}`,
    },
    body: JSON.stringify({ externalUserId: 'partner-user-001' }),
  },
);

const { ticket } = await res.json(); // 5분 TTL · 1회용

ヒント

この方式では契約APIを連携しません。契約・決済はplott LIFEページで行われるため、パートナーサービスは部屋一覧の表示とログイン連携のみ実装すれば十分です。

OPERATE・ログイン連携

運用ステップ

  1. パートナーサービスで部屋一覧を表示します。
  2. ユーザーが部屋を選ぶと、その会員の ログインチケットを発行 します(会員がいない場合は会員作成後に発行)。
  3. 発行したチケットを含めて https://life.plott.co.kr/rooms/{id}?ticket=<ticket> へリダイレクトします。plott LIFEがチケットを交換して 自動ログイン させます。
  4. その後の契約・決済はplott LIFEページで行われます。パートナーサービスは契約フローを直接扱いません。

チケットの有効期限

ログインチケットは発行後5分間のみ有効で、1回しか使用できません。リダイレクト直前に発行し、遅延なく渡してください。

PHASE 03 · 公開チャネル

検証後、公開チャネルに切替え本格運用へ

PUBLIC CHANNEL

公開チャネル審査の申請

非公開チャネルで連携を十分に検証したら、公開チャネルへの切替を申請して全ホストの部屋にアクセスできる権限を拡張します。この手順は両方式とも同じです。

申請方法

  1. アプリ詳細ページ申請状況カードで [公開チャネル切替申請] をクリックします。
  2. 運営チームが審査し、結果をメールで通知します。
  3. 却下された場合は理由を確認し、補足のうえ再申請できます。

PUBLIC CHANNEL

公開チャネルの有効化

公開チャネルになると、追加作業なしでplott LIFEに登録された全ホストの部屋をOpen APIで取得できます。取得した部屋から扱う物件を選んでチャネルマッピングを設定すれば、選んだ連携方式のフローでそのまま運用できます。

全物件一覧の取得

const res = await fetch(
  'https://life.plott.co.kr/api/open/v1/building-unit-type?page=0&size=20',
  { headers: { Authorization: `Basic ${credentials}` } },
);
const { items, totalItems, totalPages } = await res.json();

基本動作

基本的に 運用中 運用中の部屋のみ表示されます。自分が登録した部屋だけを見たい場合は isMine=true で申請できます。

REFERENCE · 共通事項

認証・エラー・レート制限の注意点

COMMON

認証

Open APIの全リクエストはHTTP Basic認証を使用します。 アプリ詳細ページで発行された Client ID と Client Secret をコロンでつなぎbase64でエンコードして Authorization ヘッダーに入れて送信してください。

const credentials = Buffer.from(
  `${process.env.CLIENT_ID}:${process.env.CLIENT_SECRET}`,
).toString('base64');

const res = await fetch('https://life.plott.co.kr/api/open/v1/contract-channel', {
  headers: {
    Authorization: `Basic ${credentials}`,
  },
});

Client Secretの保護

Client Secretは発行時に一度しか表示されません。紛失・漏洩した場合は アプリ詳細ページ該当箇所で直ちにクライアントを削除し、新しいものを発行してください。

COMMON

エラー応答

エラー発生時 RFC 9457 Problem Detail の形式で応答します。

{
  "type": "about:blank",
  "title": "Not Found",
  "status": 404,
  "detail": "예약 매핑을 찾을 수 없습니다.",
  "instance": "/open/v1/booking"
}
  • typeエラータイプURI
  • titleHTTPステータステキスト
  • statusHTTPステータスコード
  • detailエラー詳細メッセージ
  • instanceリクエストパス

COMMON

レート制限

サービス安定性とパートナーの公平利用のため、Open APIに呼び出し制限を設けています。

  • 適用範囲/open/** の全エンドポイント
  • 制限単位ホストアカウント
  • 上限1分あたり300リクエスト
  • 回復方式連続回復(greedy refill)。約1秒ごとに5リクエスト分のトークンが補充されます。

上限超過応答

上限を超えたリクエストは即時拒否され、 429 Too Many Requests が返されます。

推奨クライアント処理

  • 429 応答を受けたら すぐに再試行せず 一定時間待ってから再試行してください。
  • 平均で約 200ms間隔 なら安定して呼び出せます。
  • 短時間で多数リクエストが必要なバッチは、間隔を開けるか指数バックオフで再試行してください。

ヒント

通常利用で 429 が頻発する場合は上限引き上げを検討できます。別途お問い合わせください。

DOCUMENTATION

エンドポイント全仕様を見る

リクエスト・レスポンスのスキーマ、パラメータ、エラーコードを一箇所で確認できます。

APIドキュメントへ