VTO API Serviceは、HMAC署名とJWTトークンを組み合わせた2段階の認証フローを採用しています。 まずサーバー側でHMAC署名を生成し、トークンエンドポイントからJWTを取得。その後、JWTを用いてWidgetを認証し、 VTOやステータス取得を行います。
// 署名対象文字列: api_key|origin|timestamp(パイプ区切り)
message = "api_XXXX-XXXX-XXXX-XXXX|https://your-ec-site.com|1710345600"
signature = hmac_sha256(message, shared_secret)
// PHP例:
$message = $apiKey . '|' . $origin . '|' . $timestamp;
$signature = hash_hmac('sha256', $message, $sharedSecret);
パラメータ:
api_key: マイページで取得したAPIキー(api_XXXX-XXXX-XXXX-XXXX)origin: ECサイトのオリジン(例: https://your-ec-site.com)timestamp: 現在のUnixタイムスタンプ(秒)※ ±5分以内shared_secret: マイページで確認できるシークレットキーPOST /API/api/token.php
Content-Type: application/json
{
"api_key": "api_XXXX-XXXX-XXXX-XXXX",
"origin": "https://your-ec-site.com",
"timestamp": 1710345600,
"signature": "hmac_sha256_hex_string"
}
レスポンス:
{
"success": true,
"data": {
"widget_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expires_in": 3600
}
}
取得した widget_token は Widget JS が自動で使用します。
お客様サーバーにプロキシPHPを設置し、Widget JS の tokenEndpoint に指定してください。
<script src="https://asp.kitemir.jp/API_SERVICES/widget/vto-widget.js"></script>
<link rel="stylesheet" href="https://asp.kitemir.jp/API_SERVICES/widget/vto-widget.css">
<script>
VtoWidget.init({
tokenEndpoint: '/api/widget_token.php', // お客様サーバーのプロキシPHP
apiBase: 'https://asp.kitemir.jp/API_SERVICES'
});
</script>
<!-- 商品ページに試着ボタンを設置 -->
<button onclick="VtoWidget.open({
garmentUrl: 'https://your-ec-site.com/images/product.webp',
category: 'tops',
productName: 'エレガントブラウス',
productPrice: 12000,
onAddToCart: function() { addToMyCart(123); }
})">試着してみる</button>
概要: HMAC署名からJWTトークンを取得します
認証: HMAC署名
レート制限: 1IP/分あたり30リクエスト
概要: バーチャル試着を実行します(非同期)
認証: Bearer JWT(widget_token)
Content-Type: multipart/form-data または application/json
パラメータ:
person_image (file/base64): ユーザーの身体写真(JPEG/PNG)garment_url (string): 試着用服画像のURL(https://〜)category (string): tops / bottoms / one-pieces / auto注意: garment_url はURLを指定します(ファイルアップロードではありません)。サーバー側で画像をダウンロードして FASHN AI に送信します。
概要: VTO実行のステータスを確認(ポーリング用)
認証: Bearer JWT
推奨ポーリング間隔: 2〜3秒
ステータス値:
queued: キュー待機中processing: 処理中completed: 完了(result_url / designer_comment 付き)failed: 失敗(error_message 付き)概要: ライセンスキーの有効性確認(初期設定用・CORS対応)
認証: 不要(ライセンスキーのみ検証)
用途: 初期セットアップ画面でのキー検証
リクエスト:
curl -X POST https://asp.kitemir.jp/API/api/token.php \
-H "Content-Type: application/json" \
-d '{
"api_key": "api_1234-5678-9abc-def0",
"origin": "https://your-ec-site.com",
"timestamp": 1710345600,
"signature": "a1b2c3d4e5f6..."
}'
レスポンス(成功):
{
"success": true,
"data": {
"widget_token": "eyJhbGciOiJIUzI1NiIs...",
"expires_in": 3600
}
}
multipart/form-data 方式:
curl -X POST https://asp.kitemir.jp/API/api/tryon.php \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-F "person_image=@person.jpg" \
-F "garment_url=https://your-ec-site.com/images/dress.webp" \
-F "category=one-pieces"
JSON方式(base64):
curl -X POST https://asp.kitemir.jp/API/api/tryon.php \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"person_image": "/9j/4AAQSkZJRg...(base64)",
"garment_url": "https://your-ec-site.com/images/dress.webp",
"category": "one-pieces"
}'
レスポンス(成功):
{
"success": true,
"data": {
"tryon_id": "pred_abc123def456",
"status": "processing"
}
}
リクエスト:
curl -X GET "https://asp.kitemir.jp/API/api/status.php?tryon_id=vto_1710345678_abc123" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
レスポンス(完了):
{
"success": true,
"data": {
"status": "completed",
"result_url": "https://cdn.fashn.ai/results/tryon_123456.jpg",
"designer_comment": "このワンピースはあなたの優雅さを引き出しており、非常に素敵です。深い色合いは肌のトーンを美しく見せ、シルエットは体を的確にサポートしています。特に首周りのデザインは顔立ちを柔らかく見せています。",
"cost_usd": 0.075
}
}
| コード | エラー名 | 説明 |
|---|---|---|
| 400 | Bad Request | リクエストパラメータが不正です |
| 401 | Unauthorized | 認証に失敗しました(署名・トークン無効) |
| 403 | Forbidden | ライセンスが無効またはプランが非アクティブ |
| 402 | Payment Required | 月間VTO上限に達しました(プランのアップグレードが必要) |
| 500 | Internal Server Error | サーバーエラー(お問い合わせください) |
| 503 | Service Unavailable | VTOサービスが一時的に利用不可 |
💡 ヒント: すべてのエラーレスポンスは JSON形式で {"success": false, "error": "...", "code": 400} の形式で返されます。