PHASE 01 · 開始
APIキー発行から開発環境設定まで
STEP 01
アプリ追加とAPIキー発行
Open APIを利用するには、アプリ作成後にAPIクライアントキーとシークレットを発行してください。
アプリ作成
- アプリ画面で申請フォームを記入します。
- サービス名・英語名(チャネルコード)・サービスURLを入力して送信
- 運営チームの審査後に非公開チャネルが作成され、結果はメールで通知されます。承認後、アプリ詳細ページからAPIキーを発行できます。
APIクライアント発行
- アプリ詳細ページの APIクライアント セクションで [クライアントを追加] をクリックします。
- Client ID(自由形式、最大100文字)と使用するスコープを選択します。
- 作成直後に表示される 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で契約・予約を登録するには、テスト用の部屋を作成しチャネルマッピングを設定する必要があります。
手順
- ホスト画面で新しい部屋を登録します。
- チャネルマッピング画面登録した部屋を選び、部屋単位マッピングと室単位マッピングを設定します。部屋単位は任意ですが、室単位マッピングを設定しないとOpen APIで契約登録できません。外部物件IDには該当チャネルで使用する室のIDを指定してください。
- ゲストページで登録した部屋を確認するには /rooms/{roomId}にアクセスしてください。
参考
外部物件IDの例) https://www.airbnb.co.kr/rooms/1252576808547167623 1252576808547167623STEP 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でエンコードした値です。


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・ログイン連携
運用ステップ
- パートナーサービスで部屋一覧を表示します。
- ユーザーが部屋を選ぶと、その会員の ログインチケットを発行 します(会員がいない場合は会員作成後に発行)。
- 発行したチケットを含めて
https://life.plott.co.kr/rooms/{id}?ticket=<ticket>へリダイレクトします。plott LIFEがチケットを交換して 自動ログイン させます。 - その後の契約・決済はplott LIFEページで行われます。パートナーサービスは契約フローを直接扱いません。
チケットの有効期限
ログインチケットは発行後5分間のみ有効で、1回しか使用できません。リダイレクト直前に発行し、遅延なく渡してください。PHASE 03 · 公開チャネル
検証後、公開チャネルに切替え本格運用へ
PUBLIC CHANNEL
公開チャネル審査の申請
非公開チャネルで連携を十分に検証したら、公開チャネルへの切替を申請して全ホストの部屋にアクセスできる権限を拡張します。この手順は両方式とも同じです。
申請方法
- アプリ詳細ページ申請状況カードで [公開チャネル切替申請] をクリックします。
- 運営チームが審査し、結果をメールで通知します。
- 却下された場合は理由を確認し、補足のうえ再申請できます。
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エラータイプURItitleHTTPステータステキストstatusHTTPステータスコードdetailエラー詳細メッセージinstanceリクエストパス
COMMON
レート制限
サービス安定性とパートナーの公平利用のため、Open APIに呼び出し制限を設けています。
適用範囲/open/** の全エンドポイント制限単位ホストアカウント上限1分あたり300リクエスト回復方式連続回復(greedy refill)。約1秒ごとに5リクエスト分のトークンが補充されます。
上限超過応答
上限を超えたリクエストは即時拒否され、 429 Too Many Requests が返されます。
推奨クライアント処理
429応答を受けたら すぐに再試行せず 一定時間待ってから再試行してください。- 平均で約 200ms間隔 なら安定して呼び出せます。
- 短時間で多数リクエストが必要なバッチは、間隔を開けるか指数バックオフで再試行してください。
ヒント
通常利用で429 が頻発する場合は上限引き上げを検討できます。別途お問い合わせください。DOCUMENTATION
エンドポイント全仕様を見る
リクエスト・レスポンスのスキーマ、パラメータ、エラーコードを一箇所で確認できます。