# オブジェクト

> 小道具と商品を REST で操作します。オブジェクトの作成とアーカイブ、メイン画像、素材とアングルのバリエーション、モーションクリップの生成、メイン画像の承認ができます。

Source: https://nodaro.ai/ja/docs/developers/api/objects

**オブジェクト API** を使うと、オブジェクト／小道具スタジオが小道具と商品に対して行うことを、すべてスクリプトから実行できます。オブジェクトを作成し、メイン画像の候補を生成して、そのうち 1 つを承認し、アングル、素材、バリエーションの画像とモーションクリップを追加します。その後は画像ノードと動画ノードがそのオブジェクトを再利用するので、同じランタン、車、椅子がどのショットでも同じ見た目になります。

これらのルートは、すべてのエディションで使えます。認証にはベアラートークンを使います。個人用 API トークン（`ndr_…`）、OAuth アプリのトークン（`ndr_app_…`）、Community エディションではセッショントークンのいずれかです。すべてのルートは呼び出し元に限定されています。[認証](https://nodaro.ai/docs/developers/api/authentication)を参照してください。

## エンドポイント
| メソッド | パス | 説明 |
| --- | --- | --- |
| `GET` | `/v1/objects` | 自分のオブジェクトを一覧表示します。 |
| `GET` | `/v1/objects/:id` | 1 つのオブジェクトを、進行中のジョブとともに取得します。 |
| `POST` | `/v1/objects` | オブジェクトを作成します。ボディに `id` がある場合は、そのオブジェクトを更新します。 |
| `DELETE` | `/v1/objects/:id` | オブジェクトをアーカイブします。復元できます。 |
| `DELETE` | `/v1/objects/:id?permanent=true` | アーカイブしたオブジェクトと、そのファイルを完全に削除します。 |
| `POST` | `/v1/objects/:id/restore` | アーカイブしたオブジェクトを復元します。 |
| `POST` | `/v1/generate-object` | メイン画像の候補を生成します。 |
| `POST` | `/v1/generate-object-asset` | アングル、素材、`variations` バケットの画像、またはカスタムバリエーションを 1 つ生成します。 |
| `POST` | `/v1/generate-object-motion` | メイン画像をアニメーション化して、モーションクリップにします。 |
| `POST` | `/v1/objects/:id/approve-main-image` | 候補をメイン画像として承認し、オブジェクトの説明を作成します。 |
| `POST` | `/v1/objects/:id/llm-caption` | 現在のメイン画像から、説明を作成し直します。 |

## オブジェクトが持つ情報
| フィールド | 内容 |
| --- | --- |
| `id`、`name`、`description` | 識別子、表示名、アイデンティティのメモです。 |
| `category` | `furniture`、`vehicle`、`weapon`、`food`、`clothing`、`electronics`、`nature`、`tool`、`animal`、`other` のいずれかです。 |
| `style` | `realistic`、`anime`、`3d-pixar`、`illustration` のいずれかです。 |
| `sourceImageUrl` | 基準となるメイン画像です。候補を承認すると設定されます。 |
| `canonicalDescription` | メイン画像の承認時に Nodaro が作成する、80〜120 語程度の見た目の説明です。それまでは空の文字列です。 |
| `styleLock` | バリエーションをメイン画像から生成するかどうかです。デフォルトは `true` です。 |
| `angles`、`materials`、`variations`、`motionClips` | アセットバケットです。各エントリーは `{ name, url }` です。`motionClips` には動画が入ります。 |
| `referencePhotos` | 最大 20 枚のムードボード写真で、それぞれ `{ kind, url }` の形式です。 |
| `pendingJobs` | `GET /v1/objects/:id` を取得した場合のみ。このオブジェクトについて、まだ実行中のバリエーションのジョブです。 |

### アセットバケット
| バケット | 内容 | プリセットのバリエーション |
| --- | --- | --- |
| `angles` | 別の視点から見たオブジェクト | front, side, top, back, three-quarter, detail, in-context, exploded, perspective |
| `materials` | 別の素材のオブジェクト | wood, metal, glass, plastic, fabric, stone, ceramic, leather, paper, gold, silver, copper, marble |
| `variations` | 別の状態やスタイル | clean, weathered, damaged, ornate, minimal, broken, antique, futuristic, holographic, dirty, polished |
| `motionClips` | ループするカメラワークのクリップ | rotate-360, hover, spin-slow, parallax, pulse, drift, dolly-around, push-in, drone-orbit |

### リファレンス写真
ムードボードは、オブジェクトと一緒に渡されます。オブジェクトを使うすべてのノードは、画像を接続していなくても、これらの写真を追加のリファレンスとして受け取ります。各写真の `kind` が、その写真が何のためのものかをモデルに伝えます。

| `kind` | 用途 |
| --- | --- |
| `front` | すっきりした正面図です。 |
| `side` | 側面図です。乗り物、家具、武器で役立ちます。 |
| `detail` | 特徴的な部分のクローズアップです。彫刻やヒンジなどです。 |
| `context` | 実際に置かれた、持たれた、取り付けられた状態のオブジェクトです。大きさの目安になります。 |
| `moodBoard` | 配色や雰囲気です。 |
| `other` | それ以外のものです。 |

写真は最大 20 枚まで追加でき、各種類の枚数に制限はありません。主役の小道具や看板商品では、最初の生成の前に 3〜6 枚の写真を追加してください。最初の結果が、はるかに忠実になります。

## オブジェクトを一覧表示する
`GET /v1/objects` は、自分のアクティブなオブジェクトを新しい順に返します。アーカイブを見るには `archived=true` を、1 つのプロジェクトに絞るには `projectId` を追加します。`limit` を指定しない場合、ルートは全件を返します。`limit`（最大 500）を指定すると、1 ページ分と `nextCursor` を返すので、`null` になるまで `cursor` として渡し続けてください。

**curl**

```bash
curl "https://app.nodaro.ai/v1/objects?limit=100" \
  -H "Authorization: Bearer $NODARO_API_KEY"
```

**TypeScript SDK**

```ts

const client = createClient({
baseUrl: 'https://app.nodaro.ai',
auth: new StaticTokenAuth(process.env.NODARO_API_KEY!),
})

const page = await client.objects.list({ limit: 100 })
const next = await client.objects.list({ limit: 100, cursor: page.nextCursor! })
const { objects: archived } = await client.objects.listArchived()
```

**CLI**

```bash
nodaro objects list --json
nodaro objects list --archived
```

`GET /v1/objects/:id` は、`pendingJobs` を含む 1 つのオブジェクトを返します。アーカイブされたオブジェクトは `404 not_found` を返します。これは、存在しないオブジェクトと同じ応答です。

## オブジェクトを作成または更新する
`POST /v1/objects` は、ボディに `id` がない場合はオブジェクトを作成し、`id` がある場合はそのオブジェクトを更新します。作成には `nodeId` と `name` が必要です。キャンバスのノードがない場合は、`nodeId` に `"scripted"` のような任意のラベルを使います。

更新では、送信したフィールドだけが書き込まれます。アセットバケットは更新では書き込まれないため、保存によって、ジョブが追加中のバリエーションが上書きされることはありません。オブジェクトの現在の `updatedAt` を `expectedUpdatedAt` として送信すると、読み取った後にほかの誰かがオブジェクトを変更していた場合に更新を拒否できます。その場合、ルートは `409 concurrent_modification` を返します。

**curl**

```bash
curl -X POST https://app.nodaro.ai/v1/objects \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
"nodeId": "scripted",
"name": "Antique Lantern",
"description": "Weathered brass lantern with hand-engraved filigree",
"category": "tool",
"style": "realistic"
}'
```

**TypeScript SDK**

```ts
const { id } = await client.objects.create({
nodeId: 'scripted',
name: 'Antique Lantern',
description: 'Weathered brass lantern with hand-engraved filigree',
category: 'tool',
style: 'realistic',
})

const object = await client.objects.get(id)
await client.objects.update(id, { styleLock: false, expectedUpdatedAt: object.updatedAt })
```

**CLI**

```bash
nodaro objects create "Antique Lantern" --node-id scripted \
  --description "Weathered brass lantern with hand-engraved filigree" \
  --category tool --style realistic

nodaro objects update <id> --style-lock false
```

作成は `{ id }` を返します。更新は `{ id, updatedAt }` を返します。

<TypeTable
type={{
id: { type: 'string (uuid)', description: '更新するオブジェクトです。オブジェクトを作成する場合は省略します。' },
nodeId: { type: 'string', description: '作成時は必須です。オブジェクトが属するキャンバスのノードです。ノードがない場合は、任意のラベルを指定します。' },
name: { type: 'string', description: '作成時は必須です。' },
description: { type: 'string', description: 'オブジェクトの特徴を、1〜3 文で説明したものです。' },
category: { type: 'string', description: 'furniture、vehicle、weapon、food、clothing、electronics、nature、tool、animal、other のいずれかです。' },
style: { type: 'string', description: 'realistic、anime、3d-pixar、illustration のいずれかです。' },
styleLock: { type: 'boolean', description: '承認済みのメイン画像からバリエーションを生成します。', default: 'true' },
referencePhotos: { type: 'array', description: '最大 20 枚の { kind, url } 形式のムードボード写真です。' },
canonicalDescription: { type: 'string', description: '作成された説明を置き換えます。' },
sourceImageUrl: { type: 'string', description: 'メイン画像を直接設定します。' },
projectId: { type: 'string (uuid)', description: 'オブジェクトを所属させるプロジェクトです。' },
expectedUpdatedAt: { type: 'string (ISO 8601)', description: '更新時：このタイムスタンプ以降にオブジェクトが変更されていた場合、409 で書き込みを拒否します。' },
}}
/>

### スタイルの固定が変えるもの
- **オン（デフォルト）。**すべてのアングル、素材、バリエーションが、承認済みのメイン画像から生成されます。どれも、プロポーション、シルエット、特徴的な部分を保ちます。オブジェクトを使うノードは、基準となる説明も受け取ります。どのショットでも同じアイテムに見せたいものに使います。
- **オフ。**バリエーションはテキストだけから生成されます。ノードは基準となる説明を受け取りますが、目安として扱われるだけなので、モデルがデザインを解釈し直すことがあります。別の案を検討したり、見た目を比較したりするときに使います。

## メイン画像の候補を生成する
`POST /v1/generate-object` は、候補ごとに 1 つのジョブを開始し、候補ごとの ID を含む `jobIds` をすぐに返します。候補が 1 つだけのリクエストでは、`jobId` も返されます。ジョブは[ジョブ API](https://nodaro.ai/docs/developers/api/jobs) でポーリングしてください。

`attachToObjectId` と `count` に 1 を指定すると、ジョブが完了したときに、結果がオブジェクトのメイン画像になります。候補が複数の場合は、何もアタッチされません。気に入ったものを承認してください。

**curl**

```bash
curl -X POST https://app.nodaro.ai/v1/generate-object \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Antique Lantern", "count": 4 }'
```

**TypeScript SDK**

```ts
const { jobIds } = await client.objects.generate({
name: 'Antique Lantern',
description: 'Weathered brass lantern with hand-engraved filigree',
count: 4,
})
```

**CLI**

```bash
nodaro objects generate --name "Antique Lantern" --count 1 \
  --attach-to-object-id <id> --watch
```

```json
{
"jobIds": [
"5e2a8c1f-3b7d-4f9a-a6c2-8d1e4b7f0a3c",
"6f3b9d2a-4c8e-4a1b-b7d3-9e2f5c8a1b4d",
"7a4c1e3b-5d9f-4b2c-c8e4-1f3a6d9b2c5e",
"8b5d2f4c-6e1a-4c3d-d9f5-2a4b7e1c3d6f"
]
}
```

| フィールド | 説明 |
| --- | --- |
| `name` | 必須。オブジェクトの名前で、1〜200 文字です。 |
| `description` | アイデンティティのメモで、最大 2,000 文字です。 |
| `category`、`style` | オブジェクトのカテゴリーと、ビジュアルスタイルです。 |
| `count` | 生成する候補の数で、1〜10 です。デフォルトは 1 です。 |
| `provider` | 画像モデルの ID です。省略すると、デフォルトのモデルを使います。 |
| `seedPromptHint` | プロンプトに組み込むプロンプトの断片で、最大 2,000 文字です。たとえば、[**素材**（Material）](https://nodaro.ai/docs/nodes/creative-controls/material)ピッカーの `antique brass` です。 |
| `sourceImageUrl` | 元にする画像です。 |
| `aspectRatio` | メイン画像のフレームです。 |
| `attachToObjectId`、`expectedUpdatedAt` | 候補 1 つをこのオブジェクトにアタッチします。オブジェクトが変更されていない場合のみアタッチするよう指定することもできます。 |

`seedPromptHint` は、`generate-object-asset` と `generate-object-motion` でも使えます。乗り物や素材などのカタログの選択肢を、ピッカーノードを接続せずにプロンプトへ組み込めます。

## バリエーションを生成する
`POST /v1/generate-object-asset` は、1 つのバリエーションを生成し、`{ jobId }` を返します。ジョブが完了したときにバケットへ `{ name: attachName, url }` を追加するには、`attachToObjectId`、`attachToColumn`、`attachName` を送信します。

**curl**

```bash
curl -X POST https://app.nodaro.ai/v1/generate-object-asset \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
"name": "Antique Lantern",
"assetType": "materials",
"variant": "gold",
"attachToObjectId": "2c7e9a4b-1d3f-4e8a-9b6c-5f0d2a7e3b1c",
"attachToColumn": "materials",
"attachName": "gold"
}'
```

**TypeScript SDK**

```ts
await client.objects.generateAsset({
name: 'Antique Lantern',
assetType: 'variations',
variant: 'weathered',
attachToObjectId: id,
attachToColumn: 'variations',
attachName: 'weathered',
})
```

**CLI**

```bash
nodaro objects generate-asset --asset-type materials --variant gold \
  --attach-to-object-id <id> --attach-to-column materials --watch
```

| フィールド | 説明 |
| --- | --- |
| `name` | 必須。オブジェクトの名前です。 |
| `assetType` | 必須。`angles`、`materials`、`variations`、`custom` のいずれかです。 |
| `variant` | 必須。生成するバリエーションで、1〜100 文字です。 |
| `description` | このバリエーションの説明で、最大 1,000 文字です。オブジェクトにアタッチする際にこれを省略すると、Nodaro がオブジェクトの基準となる説明とバリエーション名から作成します。自分で指定すると、この自動作成をスキップします。 |
| `provider`、`sourceImageUrl`、`aspectRatio` | 画像モデル、元にする画像、フレームです。 |
| `attachToObjectId`、`attachToColumn`、`attachName` | 結果の保存先です。`attachToColumn` は `angles`、`materials`、`variations` のいずれかで、`custom` のバリエーションでは必ず指定します。 |

## メイン画像をアニメーション化する
`POST /v1/generate-object-motion` は、オブジェクトの画像を、ゆっくりとした回転、浮遊、ドローン周回などの短いカメラワークのクリップにします。クリップは、B ロールや、長い動画の出発点として使えます。ルートは `{ jobId }` を返します。

`sourceImageUrl` は必須です。フォールバックはないため、承認済みのメイン画像を渡してください。`attachToObjectId` と `attachName` を指定すると、完了時にクリップが `motionClips` に追加されます。列を指定する必要はありません。

**curl**

```bash
curl -X POST https://app.nodaro.ai/v1/generate-object-motion \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
"name": "Antique Lantern",
"motionPrompt": "slow 360 rotation, soft golden rim light",
"sourceImageUrl": "https://cdn.nodaro.ai/objects/lantern-main.png",
"provider": "kling-turbo",
"attachToObjectId": "2c7e9a4b-1d3f-4e8a-9b6c-5f0d2a7e3b1c",
"attachName": "rotate-360"
}'
```

**TypeScript SDK**

```ts
const lantern = await client.objects.get(id)

await client.objects.generateMotion({
name: 'Antique Lantern',
motionPrompt: 'slow 360 rotation, soft golden rim light',
sourceImageUrl: lantern.sourceImageUrl!,
provider: 'kling-turbo',
attachToObjectId: id,
attachName: 'rotate-360',
})
```

**CLI**

```bash
nodaro objects generate-motion --name "Antique Lantern" \
  --motion-prompt "slow 360 rotation, soft golden rim light" \
  --source-image-url "https://cdn.nodaro.ai/objects/lantern-main.png" \
  --provider kling-turbo --attach-to-object-id <id> --attach-name "rotate-360" --watch
```

| フィールド | 説明 |
| --- | --- |
| `name`、`motionPrompt` | 必須。オブジェクトの名前と、作り出す動きです。 |
| `sourceImageUrl` | 必須。開始フレームです。 |
| `provider` | `kling-turbo`（デフォルト）、`kling`、`kling-3.0`、`minimax`、`hailuo-2.3`、`wan-i2v`、`seedance`、`bytedance-lite` のいずれかです。 |
| `aspectRatio` | `1:1`（デフォルト。中央に配置された商品フレーム）、`3:4`、`16:9`、`9:16`、`4:3` のいずれかです。 |
| `refineFromVideoUrl` | 画像からやり直す代わりに、新しいプロンプトで調整する既存のクリップです。構図は保たれます。`wan-i2v` など、動画から動画への変換に対応したモデルを使ってください。 |
| `attachToObjectId`、`attachName` | オブジェクトと、`motionClips` でのクリップの名前です。 |

クリップの料金は、そのモデルで画像から動画を生成する料金です。

| Model | Maker | Modes | Credits | Details |
| --- | --- | --- | --- | --- |
| [Kling 2.5 Turbo Pro](https://nodaro.ai/docs/models/video/kling-2-5-turbo-pro) | Kuaishou | Image to video, Text to video | from 110 | Faster Kling — good quality at lower cost. Supports end frame. |
| [Kling 2.6](https://nodaro.ai/docs/models/video/kling-2-6) | Kuaishou | Image to video, Text to video | from 138 | Kling 2.6 I2V — strong motion realism. 5s/10s, optional native audio. |
| [Kling 3.0](https://nodaro.ai/docs/models/video/kling-3-0) | Kuaishou | Image to video, Text to video | from 270 | Premium Kling 3.0 — variable 3-15s duration, native audio, 720P/1080P. |
| [Hailuo 02 I2V Pro](https://nodaro.ai/docs/models/video/hailuo-02-i2v-pro) | MiniMax | Image to video, Text to video | 143 | Hailuo 02 Pro — strong photoreal motion, fixed 5-second clips. Supports end frame. |
| [Hailuo 2.3 Standard](https://nodaro.ai/docs/models/video/hailuo-2-3-standard) | MiniMax | Image to video | from 75 | Cheaper Hailuo 2.3 tier — good baseline quality. |
| [Wan 2.6 I2V](https://nodaro.ai/docs/models/video/wan-2-6-i2v) | Alibaba | Image to video | from 175 | Wan 2.6 image-to-video — 5/10/15s at 720p/1080p. |
| [Bytedance Lite I2V](https://nodaro.ai/docs/models/video/bytedance-lite-i2v) | Bytedance | Image to video, Text to video | 57 | Cheapest Bytedance video tier with end-frame support. |

## メイン画像を承認する
`POST /v1/objects/:id/approve-main-image` は、完了した候補をメイン画像に設定し、同じ呼び出しの中で `canonicalDescription` を作成します。これは、以降のプロンプトがオブジェクトを説明するために使うテキストです。ボディは `{ candidateJobId, expectedUpdatedAt? }` で、候補は自分の `completed` のジョブである必要があります。

ルートは `{ sourceImageUrl, canonicalDescription }` を返します。説明の作成に失敗した場合でも、メイン画像は設定され、`canonicalDescription` は空の文字列になります。SDK は、代わりに `null` を返します。もう一度試すには、`POST /v1/objects/:id/llm-caption` を呼び出します。このルートは `{ canonicalDescription }` を返し、説明を作成できなかった場合は `502` を、メイン画像がまだない場合は `400 main_image_required` を返します。`expectedUpdatedAt` は受け付けません。繰り返し呼び出しても問題ありません。

**curl**

```bash
curl -X POST https://app.nodaro.ai/v1/objects/2c7e9a4b-1d3f-4e8a-9b6c-5f0d2a7e3b1c/approve-main-image \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "candidateJobId": "6f3b9d2a-4c8e-4a1b-b7d3-9e2f5c8a1b4d" }'
```

**TypeScript SDK**

```ts
const approved = await client.objects.approveMainImage(id, jobIds[1])
if (approved.canonicalDescription === null) {
await client.objects.recaption(id)
}
```

**CLI**

```bash
nodaro objects approve-main-image <id> --candidate-job-id <jobId>
nodaro objects recaption <id>
```

## オブジェクトのアーカイブ、復元、削除
| 操作 | curl | TypeScript SDK | CLI |
| --- | --- | --- | --- |
| アーカイブ | `DELETE /v1/objects/:id` | `client.objects.delete(id)` | `nodaro objects delete <id>` |
| 復元 | `POST /v1/objects/:id/restore` | `client.objects.restore(id)` | `nodaro objects restore <id>` |
| 完全な削除 | `DELETE /v1/objects/:id?permanent=true` | `client.objects.permanentDelete(id)` | `nodaro objects delete <id> --permanent` |

- **アーカイブ**：`{ success: true, archived: true }` を返します。アーカイブ済みのオブジェクトをアーカイブしても、何も変わりません。
- **復元**：`{ id, name }` を返します。大文字と小文字を区別せずに同じ名前のアクティブなオブジェクトがある場合、Nodaro は名前の末尾に `(restored)` を付け、新しい名前を返します。
- **完全な削除**：`{ success: true, permanent: true }` を返し、オブジェクトと、それが参照するすべてのファイルを削除します。メイン画像、バリエーション、クリップ、リファレンス写真です。アーカイブされたオブジェクトにしか使えません。アクティブなオブジェクトに使うと `400 not_archived` が返されます。先にアーカイブしてから削除してください。

## アプリを実行するときにバリエーションを選ぶ
[**オブジェクト／小道具アセット**（Object/Props Asset）](https://nodaro.ai/docs/nodes/assets/object)ノードを含むワークフローをアプリとして公開すると、オブジェクトはアプリの入力の 1 つになります。その実行でバリエーションをオブジェクトのメイン画像として使うには、`"<bucket>/<variant>"` を渡します。たとえば `"materials/gold"` です。バリエーション名は、小文字にしてスペースをハイフンに変えて書きます。`polished-brass` は、Polished Brass という名前のバリエーションに一致します。不明なバケットやバリエーションは、メイン画像にフォールバックします。アプリの実行については、[ワークフロー](https://nodaro.ai/docs/developers/api/workflows)を参照してください。

## ほかの生成でオブジェクトを使う
オブジェクトのアセット URL を、[**画像生成**（Generate Image）](https://nodaro.ai/docs/nodes/image/generate-image)や[**動画生成**（Generate Video）](https://nodaro.ai/docs/nodes/video/generate-video)にリファレンス画像として渡します。コードでは、明示的な URL がいちばん簡単な方法です。ワークフローでは、オブジェクトノードを画像ノードに接続するか、プロンプトでバリエーションをメンションします。たとえば、Lantern という名前のオブジェクトでは `@lantern:1:materials/gold` です。メンションせずにオブジェクトを接続した場合、Nodaro はプロンプト内のバリエーション名も探します。「gold finish」は `materials/gold` を選びます。[オブジェクト](https://nodaro.ai/docs/guides/objects)を参照してください。

## MCP から使う
| ツール | 説明 |
| --- | --- |
| `list_objects`、`get_object` | オブジェクトを探し、そのバリエーションの URL を読み取ります。 |
| `generate_object` | メイン画像またはバリエーションを生成します。 |
| `approve_object_main_image`、`recaption_object` | メイン画像を承認するか、その説明を作成し直します。 |
| `generate_object_motion` | メイン画像をアニメーション化します。 |

オブジェクトの作成、更新、アーカイブ、復元、削除を行う MCP ツールはありません。`generate_object` が作成を行い、それ以外の変更は REST、SDK、CLI で行います。[MCP ツールリファレンス](https://nodaro.ai/docs/mcp/tools)を参照してください。

## クレジット
| ルート | Nodaro Cloud での料金 |
| --- | --- |
| `POST /v1/generate-object` | 画像モデルの料金 × `count` です。最初のジョブが始まる前に、すべての候補の分が確保されます。 |
| `POST /v1/generate-object-asset` | バリエーション 1 つにつき、画像モデルの料金です。 |
| `POST /v1/generate-object-motion` | クリップ 1 本につき、動画モデルで画像から動画を生成する料金です。 |
| `approve-main-image` | 無料です。 |
| `llm-caption` | 呼び出し 1 回につき 7 クレジットです。 |

## エラー
| ステータス | コード | 説明 |
| --- | --- | --- |
| `400` | `validation_error` | フィールドが不足しているか、無効です。 |
| `400` | `not_archived` | アーカイブされていないオブジェクトに、完全な削除が送信されました。 |
| `400` | `main_image_required` | オブジェクトにメイン画像がない状態で、`llm-caption` が呼び出されました。 |
| `401` | `unauthorized` | トークンがないか、無効か、取り消されています。 |
| `402` | `insufficient_credits` | Nodaro Cloud のみ。アカウントの残高では、確保に必要なクレジットが足りません。 |
| `404` | `not_found` | その ID を持つ、自分のアクティブなオブジェクトがありません。 |
| `409` | `concurrent_modification` | `expectedUpdatedAt` が一致しなくなりました。オブジェクトを読み取り直し、変更をマージしてから、もう一度試してください。 |
| `502` | — | 基準となる説明を作成できませんでした。もう一度試してください。 |

## Frequently asked questions

### Nodaro API のオブジェクトとは何ですか？

オブジェクトは、承認済みのメイン画像、文章による説明、バリエーション画像を持つ、保存された小道具、商品、乗り物、家具です。画像ノードと動画ノードがオブジェクトを再利用するので、どのショットでも同じアイテムに見えます。

### スタイルの固定は、何をしますか？

スタイルの固定をオン（デフォルト）にすると、すべてのバリエーションが承認済みのメイン画像から生成されるため、プロポーションと細部が同じに保たれます。オフにすると、バリエーションがデザインを解釈し直せるようになります。たとえば、別の案を検討する場合です。

### API でオブジェクトを完全に削除できますか？

はい。まず DELETE /v1/objects/:id でアーカイブし、次に DELETE /v1/objects/:id?permanent=true を呼び出します。完全な削除は、オブジェクトとそのファイルを削除します。アーカイブされていないオブジェクトには使えません。

### オブジェクトをアニメーション化できるモデルはどれですか？

プロバイダー ID で 8 つの動画モデルです。kling-turbo（デフォルト。Kling 2.5 Turbo Pro）、kling、kling-3.0、minimax、hailuo-2.3、wan-i2v、seedance、bytedance-lite です。クリップ 1 本の料金は、そのモデルで画像から動画を生成する料金と同じです。

### アーカイブしたオブジェクトで GET /v1/objects/:id が 404 を返すのはなぜですか？

アーカイブしたオブジェクトは、ID による読み取りでは表示されません。GET /v1/objects?archived=true で一覧表示し、POST /v1/objects/:id/restore で復元してください。
