API仕様書

RoomCraft — v1.0.0 — 2026-03-19

API仕様書

RoomCraft REST API リファレンス。すべてのエンドポイントは /api プレフィックスを持ちます。

レスポンスのContent-TypeはすべてJSON (application/json) です。


共通エラーレスポンス

ステータスコード説明
400バリデーションエラー(必須パラメータ不足など)
404リソースが見つからない
500サーバー内部エラー
{ "error": "エラーメッセージ" }

AIコーディネート

POST /api/ai-coordinate

スタイルと予算に合わせた家具コーディネート提案を3パターン生成します。

リクエストボディ

{
  "budget": 500000,
  "roomWidth": 4,
  "roomDepth": 5,
  "style": "modern",
  "makerIds": ["maker-id-1", "maker-id-2"]
}
フィールド必須説明
budgetnumber必須予算(円)
stylestring必須スタイル: modern / natural / nordic / wa-modern
roomWidthnumber任意部屋の幅(メートル)。デフォルト: 4
roomDepthnumber任意部屋の奥行き(メートル)。デフォルト: 5
makerIdsstring[]任意絞り込むメーカーIDの配列

レスポンス 200

{
  "results": [
    {
      "id": "pattern-1-1700000000000",
      "name": "ミニマルモダン",
      "description": "洗練されたラインと機能美が融合した都市型リビング",
      "totalPrice": 420000,
      "products": [
        {
          "id": "product-id",
          "name": "ソファ",
          "price": 150000,
          "maker": { "id": "maker-id", "name": "メーカー名", "logoUrl": "https://..." },
          "category": { "id": "cat-id", "name": "ソファ", "slug": "sofa" },
          "variants": []
        }
      ]
    }
  ],
  "meta": {
    "style": "modern",
    "budget": 500000,
    "roomArea": 20,
    "generatedAt": "2026-03-19T00:00:00.000Z"
  }
}

カート

GET /api/cart

ユーザーのカート内容を取得します。

クエリパラメータ

パラメータ必須説明
userIdstring必須ユーザーID

レスポンス 200

{
  "data": [
    {
      "id": "cart-item-id",
      "userId": "user-id",
      "productId": "product-id",
      "variantId": null,
      "quantity": 2,
      "createdAt": "2026-03-19T00:00:00.000Z",
      "product": {
        "id": "product-id",
        "name": "商品名",
        "maker": { "id": "maker-id", "name": "メーカー名" },
        "category": { "id": "cat-id", "name": "カテゴリ名" }
      },
      "variant": null
    }
  ]
}

POST /api/cart

カートに商品を追加します。同一商品・バリアントが既にある場合は数量を加算します。

リクエストボディ

{
  "userId": "user-id",
  "productId": "product-id",
  "variantId": "variant-id",
  "quantity": 1
}
フィールド必須説明
userIdstring必須ユーザーID
productIdstring必須商品ID
variantIdstring任意バリアントID
quantitynumber任意数量。デフォルト: 1

レスポンス 201 — 追加・更新されたカートアイテムオブジェクト


DELETE /api/cart

カートから商品を削除します。

クエリパラメータ

パラメータ必須説明
idstring必須カートアイテムID
userIdstring必須ユーザーID

レスポンス 200

{ "success": true }

コミュニティ

GET /api/community

コミュニティ投稿一覧を取得します。

クエリパラメータ

パラメータデフォルト説明
statusstringPUBLISHED投稿ステータス: PUBLISHED / HIDDEN / REPORTED
userIdstring-特定ユーザーの投稿に絞り込み
pagenumber1ページ番号
pageSizenumber121ページあたりの件数(最大50)

レスポンス 200

{
  "data": [
    {
      "id": "post-id",
      "title": "私のリビングルーム",
      "description": "北欧スタイルでまとめました",
      "screenshotUrl": "https://...",
      "likes": 42,
      "status": "PUBLISHED",
      "createdAt": "2026-03-19T00:00:00.000Z",
      "user": { "id": "user-id", "name": "山田太郎", "avatarUrl": null },
      "room": { "id": "room-id", "name": "リビング" }
    }
  ],
  "meta": { "total": 100, "page": 1, "pageSize": 12, "totalPages": 9 }
}

POST /api/community

コミュニティに投稿を作成します。

リクエストボディ

{
  "userId": "user-id",
  "roomId": "room-id",
  "title": "私のリビング",
  "description": "説明文",
  "screenshotUrl": "https://..."
}
フィールド必須説明
userIdstring必須ユーザーID
titlestring必須タイトル
roomIdstring任意関連ルームID
descriptionstring任意説明文
screenshotUrlstring任意スクリーンショットURL

レスポンス 201 — 作成された投稿オブジェクト


POST /api/community/[id]/like

投稿にいいねを追加します(1リクエストにつき +1)。

パスパラメータ

パラメータ説明
idstring投稿ID

レスポンス 200

{ "id": "post-id", "likes": 43 }

メーカー管理

GET /api/maker/analytics

メーカーの売上・閲覧数分析データを取得します。

クエリパラメータ

パラメータデフォルト説明
makerIdstring-メーカーID(未指定で全メーカー)
periodstringmonth期間: week / month / quarter / year

レスポンス 200

{
  "products": [
    {
      "productId": "product-id",
      "productName": "ソファ A",
      "views": 320,
      "sales": 12,
      "revenue": 1800000
    }
  ],
  "summary": {
    "monthlyRevenue": 5000000,
    "orderCount": 48,
    "totalViews": 9500,
    "conversionRate": 0.5
  },
  "period": "month",
  "startDate": "2026-03-01T00:00:00.000Z",
  "endDate": "2026-03-19T00:00:00.000Z"
}

GET /api/maker/orders

メーカー向け注文一覧を取得します。

クエリパラメータ

パラメータデフォルト説明
makerIdstring-メーカーID
statusstring-注文ステータスで絞り込み
pagenumber1ページ番号
pageSizenumber301ページあたりの件数(最大100)

レスポンス 200

{
  "data": [
    {
      "id": "order-id",
      "status": "PENDING",
      "totalAmount": "150000.00",
      "shippingAddress": { "postalCode": "150-0001", "prefecture": "東京都", "city": "渋谷区", "address1": "..." },
      "createdAt": "2026-03-19T00:00:00.000Z",
      "user": { "id": "user-id", "name": "山田太郎", "email": "yamada@example.com" },
      "items": [
        {
          "id": "item-id",
          "quantity": 1,
          "price": "150000.00",
          "product": { "id": "product-id", "name": "ソファ A", "price": "150000.00" },
          "variant": null
        }
      ]
    }
  ],
  "meta": { "total": 200, "page": 1, "pageSize": 30, "totalPages": 7 }
}

GET /api/maker/products

メーカーが管理する商品一覧を取得します。

クエリパラメータ

パラメータデフォルト説明
makerIdstring-メーカーID
qstring-商品名・説明文の全文検索
statusstring-ステータス: DRAFT / PUBLISHED / ARCHIVED
pagenumber1ページ番号
pageSizenumber201ページあたりの件数(最大100)

レスポンス 200

{
  "data": [
    {
      "id": "product-id",
      "name": "ソファ A",
      "slug": "sofa-a",
      "price": "150000.00",
      "status": "PUBLISHED",
      "stockCount": 10,
      "category": { "id": "cat-id", "name": "ソファ", "slug": "sofa" },
      "variants": [],
      "models": [{ "id": "model-id", "status": "READY" }],
      "_count": { "orderItems": 12, "favorites": 30 }
    }
  ],
  "meta": { "total": 50, "page": 1, "pageSize": 20, "totalPages": 3 }
}

POST /api/maker/products

メーカー管理画面から商品を登録します。

リクエストボディ

{
  "name": "ソファ A",
  "slug": "sofa-a",
  "description": "説明文",
  "price": 150000,
  "categoryId": "category-id",
  "makerId": "maker-id",
  "stockCount": 10,
  "status": "DRAFT",
  "variants": [
    { "type": "COLOR", "name": "カラー", "value": "ホワイト", "priceOverride": null, "stockCount": 5 }
  ]
}
フィールド必須説明
namestring必須商品名
pricenumber必須価格(円)
categoryIdstring必須カテゴリID(存在しない場合は自動作成)
makerIdstring任意メーカーID(省略時は最初のメーカーを使用)
slugstring任意URL用スラッグ(省略時は自動生成)
statusstring任意DRAFT / PUBLISHED / ARCHIVED。デフォルト: DRAFT
variantsarray任意バリアント配列

レスポンス 201 — 作成された商品オブジェクト(category, maker, variants含む)


注文

GET /api/orders

注文一覧を取得します(消費者向け)。

クエリパラメータ

パラメータデフォルト説明
userIdstring-ユーザーIDで絞り込み
statusstring-注文ステータスで絞り込み
pagenumber1ページ番号
pageSizenumber201ページあたりの件数(最大50)

注文ステータス一覧

ステータス説明
PENDING注文受付
CONFIRMED注文確認済み
SHIPPED発送済み
DELIVERED配達完了
CANCELLEDキャンセル
RETURNED返品

レスポンス 200

{
  "data": [
    {
      "id": "order-id",
      "userId": "user-id",
      "makerId": "maker-id",
      "status": "PENDING",
      "totalAmount": "150000.00",
      "shippingAddress": {},
      "trackingNumber": null,
      "createdAt": "2026-03-19T00:00:00.000Z",
      "maker": { "id": "maker-id", "name": "メーカー名", "logoUrl": null },
      "items": []
    }
  ],
  "meta": { "total": 5, "page": 1, "pageSize": 20, "totalPages": 1 }
}

POST /api/orders

注文を作成します。

リクエストボディ

{
  "userId": "user-id",
  "makerId": "maker-id",
  "items": [
    { "productId": "product-id", "variantId": null, "quantity": 1, "price": 150000 }
  ],
  "shippingAddress": {
    "postalCode": "150-0001",
    "prefecture": "東京都",
    "city": "渋谷区",
    "address1": "1-1-1"
  }
}
フィールド必須説明
userIdstring必須ユーザーID
makerIdstring必須メーカーID
itemsarray必須注文明細(productId, quantity, price必須)
shippingAddressobject必須配送先住所

レスポンス 201 — 作成された注文オブジェクト(maker, items含む)


商品

GET /api/products

商品一覧を取得します(消費者向けカタログ)。

クエリパラメータ

パラメータデフォルト説明
qstring-商品名・説明文の全文検索
categoryIdstring-カテゴリIDで絞り込み
makerIdstring-メーカーIDで絞り込み
statusstringPUBLISHEDステータス(all で全件)
minPricenumber-価格下限(円)
maxPricenumber-価格上限(円)
pagenumber1ページ番号
pageSizenumber121ページあたりの件数(最大50)

レスポンス 200

{
  "data": [
    {
      "id": "product-id",
      "name": "ソファ A",
      "slug": "sofa-a",
      "description": "...",
      "price": "150000.00",
      "status": "PUBLISHED",
      "stockCount": 10,
      "createdAt": "2026-03-19T00:00:00.000Z",
      "maker": { "id": "maker-id", "name": "メーカー名", "logoUrl": null, "slug": "maker-slug" },
      "category": { "id": "cat-id", "name": "ソファ", "slug": "sofa" },
      "variants": [],
      "models": [{ "id": "model-id", "status": "READY", "format": "glb" }]
    }
  ],
  "meta": { "total": 120, "page": 1, "pageSize": 12, "totalPages": 10 }
}

POST /api/products

商品を作成します(管理者・メーカー向け)。

リクエストボディ

{
  "name": "ソファ A",
  "price": 150000,
  "categoryId": "category-id",
  "makerId": "maker-id",
  "description": "説明文",
  "stockCount": 10,
  "status": "DRAFT",
  "variants": []
}
フィールド必須説明
namestring必須商品名
pricenumber必須価格(円)
categoryIdstring必須カテゴリID
makerIdstring必須メーカーID

レスポンス 201 — 作成された商品オブジェクト


GET /api/products/[id]

商品詳細を取得します。3Dモデル情報・バリアント・カテゴリ階層を含みます。

パスパラメータ

パラメータ説明
idstring商品ID

レスポンス 200 — 商品オブジェクト(maker, category(parent含む), variants, models含む)

レスポンス 404

{ "error": "商品が見つかりません" }

PATCH /api/products/[id]

商品情報を部分更新します。

リクエストボディ — 以下フィールドはすべて任意

{
  "name": "新商品名",
  "description": "更新説明文",
  "price": 160000,
  "categoryId": "new-category-id",
  "stockCount": 5,
  "status": "PUBLISHED"
}

レスポンス 200 — 更新後の商品オブジェクト


DELETE /api/products/[id]

商品を削除します。

レスポンス 200

{ "success": true }

ルーム(3Dシミュレーター)

GET /api/rooms

ユーザーの保存済みルーム一覧を取得します。

クエリパラメータ

パラメータデフォルト説明
userIdstringsystemユーザーID
pagenumber1ページ番号
pageSizenumber201ページあたりの件数(最大50)

レスポンス 200

{
  "data": [
    {
      "id": "room-id",
      "userId": "user-id",
      "name": "リビングルーム",
      "floorPlan": { "width": 4, "depth": 5 },
      "furniture": [
        { "productId": "product-id", "x": 1.0, "y": 0, "z": 2.0, "rotation": 0 }
      ],
      "wallSettings": { "color": "#ffffff" },
      "floorSettings": { "material": "wood" },
      "lightSettings": { "ambient": 0.5 },
      "createdAt": "2026-03-19T00:00:00.000Z",
      "updatedAt": "2026-03-19T00:00:00.000Z"
    }
  ],
  "meta": { "total": 3, "page": 1, "pageSize": 20, "totalPages": 1 }
}

POST /api/rooms

新しいルームを作成します。

リクエストボディ

{
  "name": "リビングルーム",
  "userId": "user-id",
  "floorPlan": { "width": 4, "depth": 5 },
  "furniture": [],
  "wallSettings": {},
  "floorSettings": {},
  "lightSettings": {}
}
フィールド必須説明
namestring必須ルーム名
userIdstring必須ユーザーID
floorPlanobject任意間取り設定JSON
furniturearray任意配置済み家具の配列
wallSettingsobject任意壁の設定JSON
floorSettingsobject任意床の設定JSON
lightSettingsobject任意照明の設定JSON

レスポンス 201 — 作成されたルームオブジェクト


GET /api/rooms/[id]

ルーム詳細を取得します。コミュニティ投稿への参照も含みます。

パスパラメータ

パラメータ説明
idstringルームID

レスポンス 200 — ルームオブジェクト(communityPosts含む)

レスポンス 404

{ "error": "ルームが見つかりません" }

PATCH /api/rooms/[id]

ルームを部分更新します(3Dシミュレーターの自動保存に使用)。

リクエストボディ — 以下フィールドはすべて任意

{
  "name": "更新ルーム名",
  "furniture": [...],
  "wallSettings": {},
  "floorSettings": {},
  "lightSettings": {}
}

レスポンス 200 — 更新後のルームオブジェクト


DELETE /api/rooms/[id]

ルームを削除します。

レスポンス 200

{ "success": true }