← ドキュメント一覧に戻る

機能仕様書

保険リードマーケットプレイス — Functional Specification

バージョン: v1.0.0  |  作成日: 2026-03-18  |  ステータス: 承認済み

1. 文書管理情報

項目内容
文書名機能仕様書(Functional Specification)
対象システム保険リードマーケットプレイス
バージョンv1.0.0
作成日2026-03-18
最終更新日2026-03-18
ステータス承認済み
作成者開発チーム
承認者プロダクトオーナー
本文書の目的:保険リードマーケットプレイスの全機能仕様を定義し、API設計・状態遷移・スコアリングロジック・価格算出・WebSocketイベント・エラーハンドリング・認可制御を網羅的に記述します。 開発チーム・QAチーム・ステークホルダー間の共通認識を確立することを目的とします。

2. API設計

本システムのAPIはRESTfulアーキテクチャに準拠し、JSON形式でリクエスト/レスポンスを行います。 認証にはJWT(JSON Web Token)を使用し、アクセストークン(有効期限15分)とリフレッシュトークン(有効期限7日)の二重トークン方式を採用します。 一覧取得APIにはカーソルベースのページネーションを実装し、大量データの効率的な取得を可能にします。

共通ヘッダー:
Authorization: Bearer <access_token>
Content-Type: application/json
X-Request-ID: <uuid>(トレーサビリティ用)
ページネーション(カーソル方式):
リクエスト: ?cursor=<encoded_cursor>&limit=20
レスポンス: { "data": [...], "nextCursor": "...", "hasMore": true }

2.1 認証 API(Auth)

MethodPath説明認証許可ロール
POST/api/auth/loginログイン(JWT発行)No-
POST/api/auth/register新規ユーザー登録No-
POST/api/auth/refreshアクセストークン再発行YesALL
POST/api/auth/mfa/verifyMFA二段階認証コード検証YesALL

2.2 リード API(Leads)

MethodPath説明認証許可ロール
GET/api/leadsリード一覧取得(カーソルページネーション)YesADMIN, AGENT
POST/api/leadsLP経由リード登録(顧客送信)No-
GET/api/leads/:idリード詳細取得YesADMIN, AGENT
GET/api/leads/:id/scoreスコアリング結果取得YesADMIN

2.3 オークション API(Auctions)

MethodPath説明認証許可ロール
GET/api/auctionsオークション一覧取得YesADMIN, AGENT
GET/api/auctions/activeアクティブオークション一覧YesADMIN, AGENT
GET/api/auctions/:idオークション詳細取得YesADMIN, AGENT
POST/api/auctions/:id/bid入札実行YesAGENT
POST/api/auctions/:id/instant-buy即時購入実行YesAGENT

2.4 案件 API(Cases)

MethodPath説明認証許可ロール
GET/api/cases案件一覧取得YesADMIN, AGENT
GET/api/cases/:id案件詳細取得YesADMIN, AGENT
PATCH/api/cases/:id/status案件ステータス更新YesADMIN, AGENT
POST/api/cases/:id/contact-log対応履歴追加YesAGENT

2.5 返金 API(Refunds)

MethodPath説明認証許可ロール
POST/api/refunds返金リクエスト作成YesAGENT
GET/api/refunds返金リクエスト一覧取得YesADMIN, AGENT
PATCH/api/refunds/:id/review返金リクエスト承認/却下YesADMIN

2.6 請求 API(Billing)

MethodPath説明認証許可ロール
GET/api/invoices請求書一覧取得YesADMIN, AGENT
GET/api/invoices/:id請求書詳細取得YesADMIN, AGENT
POST/api/billing/setup-intentStripe SetupIntent作成(カード登録)YesAGENT

2.7 管理 API(Admin)

MethodPath説明認証許可ロール
GET/api/admin/settingsシステム設定取得YesADMIN
PATCH/api/admin/settingsシステム設定更新YesADMIN
GET/api/admin/statsダッシュボード統計取得YesADMIN

3. 状態遷移図

各エンティティのライフサイクルをステートマシンとして定義します。 不正な遷移が要求された場合は HTTP 409 Conflict を返却します。

3.1 リードステータス(Lead Status)

  [NEW]
    |
    | スコアリング完了 & オークション作成
    v
  [IN_AUCTION]
    |
    +--- 落札者確定 -----------> [SOLD]
    |
    +--- 入札なし・期限切れ ---> [UNSOLD]
    |                             |
    |                             +--- 再出品(自動/手動)---> [IN_AUCTION]
    |
    +--- 管理者による無効化 ---> [INVALID]
ステータス説明遷移先
NEWLP経由で登録直後。スコアリング処理待ちIN_AUCTION
IN_AUCTIONオークション出品中。入札受付中SOLD, UNSOLD, INVALID
SOLD落札済み。案件(Case)が生成される(終了状態)
UNSOLD入札なしで終了。再出品可能IN_AUCTION(再出品時)
INVALID管理者が無効と判定。重複・不正データ等(終了状態)

3.2 オークションステータス(Auction Status)

  [SCHEDULED]
    |
    | 開始時刻到達
    v
  [ACTIVE]
    |
    +--- 終了3分前に入札あり ---> [EXTENDED](3分延長)
    |                               |
    |                               +--- 延長後に再入札 ---> [EXTENDED](再延長)
    |                               |
    |                               +--- 延長終了 ---------> [COMPLETED]
    |
    +--- 入札あり&時間終了 -----> [COMPLETED]
    |
    +--- 入札なし&時間終了 -----> [NO_BID]
    |                               |
    |                               +--- 自動再出品 -------> [SCHEDULED]
    |
    +--- 管理者取消 -------------> [CANCELLED]
ステータス説明遷移先
SCHEDULEDオークション予約済み。開始時刻待ちACTIVE, CANCELLED
ACTIVEオークション進行中。入札受付中EXTENDED, COMPLETED, NO_BID, CANCELLED
EXTENDED終了間際の入札により3分延長中EXTENDED(再延長), COMPLETED
COMPLETED落札者確定。最高額入札者が落札(終了状態)
NO_BID入札ゼロで終了。再出品判定へSCHEDULED(再出品時)
CANCELLED管理者により取消(終了状態)
再出品ルール(NO_BID時):
1〜3回目: 同一価格で即時再出品(自動)
4回目: エントリー価格を10%値下げして再出品(自動)
5回目以降: 管理者による手動判断(再出品 or アーカイブ)

3.3 案件ステータス(Case Status)

  [NOT_CONTACTED]
    |
    | 初回連絡実施
    v
  [IN_PROGRESS]
    |
    +--- 連絡不通(3回以上)---> [UNREACHABLE]
    |                             |
    |                             +--- 返金申請 ---> [REFUND_REQUESTED]
    |
    +--- 面談実施 -------------> [MET]
    |                             |
    |                             +--- 成約/終了 ---> [CLOSED]
    |
    +--- 返金申請 -------------> [REFUND_REQUESTED]
    |                             |
    |                             +--- 承認 -------> [CLOSED](返金処理)
    |                             |
    |                             +--- 却下 -------> [IN_PROGRESS]
    |
    +--- 案件完了 -------------> [CLOSED]
ステータス説明遷移先
NOT_CONTACTED落札直後。まだ顧客への連絡未実施IN_PROGRESS
IN_PROGRESS顧客対応中。連絡履歴を記録UNREACHABLE, MET, REFUND_REQUESTED, CLOSED
UNREACHABLE3回以上連絡不通。返金申請可能REFUND_REQUESTED, CLOSED
MET顧客と面談実施済みCLOSED
REFUND_REQUESTED返金申請中。管理者レビュー待ちCLOSED, IN_PROGRESS(却下時)
CLOSED案件完了(成約・返金・終了)(終了状態)

3.4 返金ステータス(Refund Status)

  [PENDING]
    |
    +--- 管理者承認 ---> [APPROVED](Stripe経由で返金処理)
    |
    +--- 管理者却下 ---> [REJECTED](理由通知)
ステータス説明遷移先
PENDING返金申請受付済み。管理者レビュー待ちAPPROVED, REJECTED
APPROVED返金承認済み。Stripe経由で返金処理実行(終了状態)
REJECTED返金却下。理由を申請者に通知(終了状態)

4. スコアリングアルゴリズム詳細

LP経由で登録されたリードの品質を0〜100点で定量評価します。 スコアは3つのサブスコアの合計で算出され、オークションのエントリー価格に直接影響します。

計算式:
totalScore = inputScore + temperatureScore + attributeScore
各サブスコアの上限: inputScore(40) + temperatureScore(30) + attributeScore(30) = 100

4.1 入力完全性スコア(inputScore: 0〜40点)

フォーム入力の充実度を評価します。必須項目と任意項目の入力率、自由記述の文字数を考慮します。

評価項目配点算出方法
必須項目入力率0〜20点filledRequired / totalRequired * 20(全必須項目入力で20点満点)
任意項目入力率0〜10点filledOptional / totalOptional * 10(全任意項目入力で10点満点)
自由記述文字数0〜10点50文字未満: 2点 / 50〜100文字: 5点 / 100〜200文字: 8点 / 200文字以上: 10点

4.2 温度感スコア(temperatureScore: 0〜30点)

顧客の検討緊急度と相談方法から見込み度合いを評価します。

評価項目スコア
検討緊急度WITHIN_1_MONTH(1ヶ月以内)30点
検討緊急度WITHIN_3_MONTHS(3ヶ月以内)20点
検討緊急度NOT_URGENT(急ぎではない)10点
相談方法ボーナスVISIT(来店相談希望)+5点
相談方法ボーナスONLINE(オンライン相談希望)+3点
相談方法ボーナスPHONE(電話相談希望)+0点
上限制御:temperatureScore = min(urgencyScore + methodBonus, 30)

4.3 属性スコア(attributeScore: 0〜30点)

顧客の属性情報から商談成約の見込み度を評価します。

評価項目スコア
年収レンジ800万円以上10点
年収レンジ500〜800万円7点
年収レンジ300〜500万円4点
年収レンジ300万円未満2点
家族構成既婚・子あり8点
家族構成既婚・子なし5点
家族構成未婚3点
住居状況持ち家(ローンあり)6点
住居状況持ち家(ローンなし)4点
住居状況賃貸3点
保険種別生命保険 / 医療保険 / 学資保険6点
保険種別年金保険5点
保険種別損害保険 / その他4点
上限制御:attributeScore = min(incomeScore + familyScore + housingScore + categoryScore, 30)

5. 価格算出ロジック

リードのスコアと保険種別に基づき、オークションのエントリー価格・即時購入価格・入札単位を算出します。

5.1 エントリー価格(entryPrice)

entryPrice = basePrice + score * scoreCoefficient * categoryMultiplier

basePrice = 8,000円(固定基本価格)
scoreCoefficient = 200円(スコア1点あたりの加算額)
categoryMultiplier = 保険種別に応じた係数(下表参照)

5.2 カテゴリ乗数(categoryMultiplier)

保険種別カテゴリコード乗数説明
生命保険LIFE1.0標準倍率。基準カテゴリ
医療保険MEDICAL0.9成約率がやや低いため減額
学資保険EDUCATION1.1計画的な検討が多く見込み度が高い
損害保険CASUALTY0.8単価が低いため減額
年金保険PENSION1.2高額契約が見込める
その他GENERAL0.7カテゴリ不明のため最低倍率

5.3 即時購入価格(instantPrice)

instantPrice = entryPrice * instantPriceMultiplier

instantPriceMultiplier = 2.0(エントリー価格の2倍)

5.4 入札単位(bidUnit)

bidUnit = 500円

入札額は常にbidUnitの倍数でなければならない。
次回最低入札額 = currentPrice + bidUnit

5.5 計算例

項目
リードスコア75点
保険種別学資保険(EDUCATION: 1.1)
entryPrice8,000 + 75 * 200 * 1.1 = 8,000 + 16,500 = 24,500円
instantPrice24,500 * 2.0 = 49,000円
bidUnit500円
最低入札額(初回)24,500 + 500 = 25,000円

6. WebSocket イベント仕様

リアルタイム通信にはWebSocket(Socket.IO互換)を使用します。 オークションの入札状況・終了通知・各種アラートをクライアントにプッシュ配信します。

接続エンドポイント:
wss://api.example.com/ws?token=<access_token>
認証トークンをクエリパラメータで渡し、接続時にサーバー側で検証します。 トークン期限切れ時は自動的に再接続を試行します。
イベント名方向ペイロード説明
auction:updateServer -> Client{ auctionId, currentPrice, bidCount, latestBidderId }入札が行われた際にオークション情報を配信
auction:endingServer -> Client{ auctionId, remainingSeconds: 180 }オークション終了3分前の警告通知
auction:completedServer -> Client{ auctionId, winnerId, finalPrice, status }オークション終了・落札者決定の通知
bid:acceptedServer -> Client{ auctionId, bidId, amount, position }自分の入札が受理された通知
bid:rejectedServer -> Client{ auctionId, reason, code }自分の入札が拒否された通知(理由付き)
notification:newServer -> Client{ id, type, title, body, createdAt }新しい通知の配信(落札、返金結果等)

6.1 サブスクリプション管理

クライアントイベントペイロード説明
auction:subscribe{ auctionId }特定オークションのリアルタイム更新を購読
auction:unsubscribe{ auctionId }オークションの購読を解除
ping{}接続維持用のハートビート(30秒間隔)

7. エラーコード定義

全APIで統一されたエラーレスポンス形式を使用します。エラーレスポンスには一意のエラーコードを含め、 クライアント側での適切なエラーハンドリングを可能にします。

エラーレスポンス形式:
{ "error": { "code": "AUTH_001", "message": "認証トークンが無効または期限切れです", "details": { ... }, "requestId": "550e8400-e29b-41d4-a716-446655440000" } }

7.1 認証エラー(AUTH)

エラーコードHTTPステータスメッセージ
AUTH_001401認証トークンが無効または期限切れです
AUTH_002401メールアドレスまたはパスワードが正しくありません
AUTH_003403このリソースへのアクセス権限がありません
AUTH_004429ログイン試行回数の上限を超えました。しばらくお待ちください
AUTH_005400MFA認証コードが正しくありません

7.2 リードエラー(LEAD)

エラーコードHTTPステータスメッセージ
LEAD_001404指定されたリードが見つかりません
LEAD_002422リード登録の入力値が不正です
LEAD_003409重複するリードが既に登録されています

7.3 オークションエラー(AUCTION)

エラーコードHTTPステータスメッセージ
AUCTION_001404指定されたオークションが見つかりません
AUCTION_002409オークションは既に終了しています
AUCTION_003409オークションはまだ開始されていません
AUCTION_004409即時購入は他の入札がある場合利用できません
AUCTION_005500オークション処理中に内部エラーが発生しました

7.4 入札エラー(BID)

エラーコードHTTPステータスメッセージ
BID_001400入札金額が現在の最高額を下回っています
BID_002400入札単位(500円)の倍数で指定してください
BID_003409自分が出品したリードには入札できません
BID_004429短時間に連続して入札することはできません

7.5 返金エラー(REFUND)

エラーコードHTTPステータスメッセージ
REFUND_001400返金申請期限(購入後72時間)を過ぎています
REFUND_002409この案件は既に返金申請済みです
REFUND_003400返金理由の記載が不十分です

7.6 請求エラー(BILLING)

エラーコードHTTPステータスメッセージ
BILLING_001402決済手段が登録されていません
BILLING_002402決済処理に失敗しました
BILLING_003404指定された請求書が見つかりません

8. 認可マトリクス

各APIエンドポイントに対するロール別アクセス権限を定義します。 「OK (own)」は自身が関連するリソースのみアクセス可能であることを示します。

ロール定義:
ADMIN - システム管理者。全リソースへのフルアクセス権限
AGENT - 保険募集人。リード購入・案件管理・請求確認が可能
GUEST - 未認証ユーザー。LP経由のリード登録・ログイン・新規登録のみ
エンドポイントADMINAGENTGUEST
POST /api/auth/login--OK
POST /api/auth/register--OK
POST /api/auth/refreshOKOK-
POST /api/auth/mfa/verifyOKOK-
GET /api/leadsOKOK (own)-
POST /api/leads--OK
GET /api/leads/:idOKOK (own)-
GET /api/leads/:id/scoreOK--
GET /api/auctionsOKOK-
GET /api/auctions/activeOKOK-
GET /api/auctions/:idOKOK-
POST /api/auctions/:id/bid-OK-
POST /api/auctions/:id/instant-buy-OK-
GET /api/casesOKOK (own)-
GET /api/cases/:idOKOK (own)-
PATCH /api/cases/:id/statusOKOK (own)-
POST /api/cases/:id/contact-log-OK (own)-
POST /api/refunds-OK-
GET /api/refundsOKOK (own)-
PATCH /api/refunds/:id/reviewOK--
GET /api/invoicesOKOK (own)-
GET /api/invoices/:idOKOK (own)-
POST /api/billing/setup-intent-OK-
GET /api/admin/settingsOK--
PATCH /api/admin/settingsOK--
GET /api/admin/statsOK--