構築 · AI撮影SaaS

AI商品撮影サービスを構築する

要約

テナントごとにPhotta APIキーをプロビジョニングし(ボリュームが小さい場合はプール)、各顧客のカタログをキューへファンアウトし、商品ごとに/api/v1/tryon/apparelを呼び出し、ワーカープールで生成IDをポーリングし、結果を顧客のバケットに保存して、Phottaのcredit原価にマージンを乗せて請求可能単位(creditまたはレンダリング画像)ごとに請求します。

  • Credits: 2Kで5 credits · 4Kで6 credits
  • 所要時間の目安: 1.5–4 min
  • 処理方式: 非同期、ポーリング

このページに記載されている数値はすべて以下に基づきます: Photta APIドキュメント · 確認済み

顧客のカタログ全体へファンアウトし、商品ごとにtry-onジョブを発行し、credit単位で請求します。Phottaが個々の開発者に提供している同一のプリミティブを組み合わせることで、境界を正しく設計すればホワイトラベルSaaSを構築できます。

RESPONSE=$(curl -s -X POST https://api.photta.app/api/v1/tryon/apparel \
  -H "Authorization: Bearer $PHOTTA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "product_type": "top",
  "product_images": [
    "https://cdn.yourstore.com/products/shirt-front.jpg"
  ],
  "product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
  "product_category": "t_shirt",
  "mannequin_id": "mnk_f3a9b1",
  "pose_id": "pose_c2d4e5",
  "background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
  "lock_background": true,
  "resolution": "2K",
  "aspect_ratio": "3:4",
  "body_size": "M",
  "expression": "neutral",
  "user_instruction": "Keep the collar pattern crisp and centered."
}')
ID=$(echo "$RESPONSE" | jq -r '.data.id')

仕組み

単一キーからマルチテナントサービスへ

本番コードを書く前に下すべき5つのアーキテクチャ上の決定事項。

  1. ステップ 1

    プロダクトのコントラクトを定義する

    請求単位あたりに顧客が何を得られるかを決定します:レンダリング画像1枚か?バッチか?月次のcreditプールか?その決定が、キューの深さ、再試行ポリシー、料金ページの文言など、他のすべてを左右します。

  2. ステップ 2

    テナントごとにPhottaキーをプロビジョニングする

    小規模の場合:1つのキーをプールし、データベース内でテナントごとの使用量を追跡します。大規模の場合:Phottaダッシュボードで管理し、テナントごとに1つのPhottaキーを割り当てます。帰属が明確になり、漏洩時の被害範囲を最小限に抑えられます。

  3. ステップ 3

    キューを経由してファンアウトする

    顧客フィード内の各商品に対して、撮影ジョブをエンキューします。CSVインポート中に同期的に送信しないでください。毎分600リクエストのレート制限に達し、429エラーでジョブを失うことになります。

  4. ステップ 4

    credit価格にマージンを上乗せする

    4Kのアパレルレンダリングは1回あたり6 creditsかかります。発行するすべての請求書は「credits × マージン」である必要があります。財務部門がPhottaの請求書と売上高を照合できるよう、生のcreditコストを台帳に記録してください。

  5. ステップ 5

    レイテンシと失敗率を監視する

    テナントごとの完了時間と失敗率を追跡します。特定の顧客の写真処理が常に4分以上かかる場合や繰り返し失敗する場合は、Photta側の問題ではなく、入力データの問題(URLの破損、未対応のproduct_type)であることがほとんどです。

必要な3つのパターン

ファンアウト、テナント別ディスパッチ、請求台帳 — 撮影SaaSの屋台骨となる構成要素。

// For each product in the customer's feed, kick off a try-on.
for (const product of catalog) {
  await photoQueue.add("photo", {
    customerId: product.customer_id,
    productUrl: product.image,
    productType: product.type, // "top" | "bottom" | "top_and_bottom" | "one_piece"
  });
}
const res = await fetch("https://api.photta.app/api/v1/tryon/apparel", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.PHOTTA_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "product_type": "top",
    "product_images": [
      "https://cdn.yourstore.com/products/shirt-front.jpg"
    ],
    "product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
    "product_category": "t_shirt",
    "mannequin_id": "mnk_f3a9b1",
    "pose_id": "pose_c2d4e5",
    "background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
    "lock_background": true,
    "resolution": "2K",
    "aspect_ratio": "3:4",
    "body_size": "M",
    "expression": "neutral",
    "user_instruction": "Keep the collar pattern crisp and centered."
  }),
});
const { data } = await res.json(); // data.id, data.status
// A completed apparel job costs 5 credits at 2K and 6 at 4K.
// Record it to your billing pipeline so you can margin on top of it.
await billingLedger.append({
  customer: data.customerId,
  sku: "photo-4k",
  quantity: 1,
  wholesaleCost: 6, // credits, = your Photta spend
});

開発者からのよくある質問

Photta上でサービスを運用する

テナントごとに個別のPhotta APIキーが必要ですか?

必須ではありませんが、規模が拡大した際に有用です。数社程度の顧客であれば、1つのキーをプールして自社のデータベースでテナントごとの使用量を追跡するだけで十分です。それ以上の規模になると、テナントごとのキー運用のほうが帰属の明確化、ローテーションの容易さ、漏洩時の被害範囲の極小化につながります。

creditsが枯渇した場合はどうすればよいですか?

APIは、必要な数量と利用可能な数量を含む402 insufficient_creditsを返します。低残高の基準値(例:100 credits)を設定し、ジョブが失敗し始める前に自動で補充してください。失敗したジョブのcreditsは返金されるため、402エラーが一時的に多発しても損失が連鎖することはありません。

サービスの価格設定はどうすべきですか?

Phottaの料金は2Kで5 credits、4Kで6 creditsです。これを販売通貨に換算し(原価 × 利益率 × credit換算率)、画像ごと、バッチごと、または月額課金のいずれにするかを決定してください。多くの撮影SaaS製品は、月額最低保証付きの画像従量課金を採用しています。

PhottaはどのようなSLAを提供していますか?

ドキュメント記載のPhottaのジョブ完了目安は1ジョブあたり1.5〜4分です。公開されている厳密な稼働率SLAはありません。提供するSaaS側でターンアラウンドタイムを保証する場合は、自社の契約に余裕を持たせ(例: 「1時間以内に写真を提供」とすれば10倍の安全マージンが確保できます)、テナントごとのレイテンシを監視して劣化を早期に検知してください。

出力結果をホワイトラベル化できますか?

はい。返却される画像にはPhottaのブランディングは含まれません。自社のCDNドメインを前段に配置して顧客のバケットに配信できるため、顧客にPhottaのパイプラインで生成されたことを意識させる必要はありません。API自体はホワイトラベル化されておらず、キーとダッシュボードにはPhottaのブランド名が表示されます。

Phottaを基盤にした撮影SaaSの構築

共通のAPI、独自のブランド、独自の利益率。APIキーを取得し、上記の3つのパターンをワーカーに組み込めば、ローンチの準備はほぼ完了です。