# ソーシャルメディア公開 API

> ソーシャルメディアアカウントを接続し、投稿を予約し、AI 生成クリップを YouTube、TikTok、Instagram、Facebook、X / Twitter、LinkedIn などへ公開します。

## ソーシャルメディア公開 API

ソーシャルメディア公開 API を使うと、ソーシャルメディアアカウントを接続し、WayinVideo のクリップをそのアカウントへ直接公開できます。

この API は [AI クリッピング](https://wayin.ai/ja/api-docs/ai-clipping/) と [モーメント検索](https://wayin.ai/ja/api-docs/find-moments/) で生成されたエクスポート済みクリップ向けです。先にいずれかの API でクリップを作成し、元のプロジェクトが `enable_export = true` で送信されていることを確認してください。その後、取得した `project_id` とクリップの `idx` を使って公開タスクを作成します。

基本的な流れ：

1. 接続したいプラットフォームの OAuth 認可 URL を作成します。
2. 返された `auth_url` をブラウザで開き、認可を完了します。
3. アカウント一覧 API を呼び出して、接続済みアカウントの `id` を確認します。
4. 対象クリップと公開設定を使って公開タスクを作成します。

すべてのエンドポイントで以下が必要です：

```http
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
x-wayinvideo-api-version: v2
```

> **課金：** 期間限定プロモーション中は、ソーシャルメディアアカウントを 1 つ正常に接続するごとに **10 API Units** を消費します。認可が正常に完了しなかった場合、API Units は消費されません。

---

## エンドポイント

| Method | Path                                    | 説明                                             |
| ------ | --------------------------------------- | ------------------------------------------------ |
| `POST` | `/api/v2/social-media/oauth/{platform}` | 1 回限りの OAuth 認可 URL を作成します           |
| `GET`  | `/api/v2/social-media/accounts`         | 接続済みソーシャルメディアアカウントを取得します |
| `POST` | `/api/v2/social-media/publish`          | 1 つ以上の接続済みアカウントへクリップを公開します |

---

## ソーシャルメディアアカウントを接続する

接続したいプラットフォームの OAuth 認可 URL を作成します。

```
POST https://wayinvideo-api.wayin.ai/api/v2/social-media/oauth/{platform}
```

### パスパラメータ

| パラメータ | 型     | 必須 | 説明                                                                                      |
| ---------- | ------ | ---- | ----------------------------------------------------------------------------------------- |
| `platform` | string | はい | ソーシャルメディアプラットフォーム。値：`youtube`、`tiktok`、`twitter`、`instagram`、`facebook`、`linkedin`。 |

### リクエストボディ

リクエストボディは不要です。

### リクエスト例

```bash
curl -X POST https://wayinvideo-api.wayin.ai/api/v2/social-media/oauth/youtube \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "x-wayinvideo-api-version: v2" \
  --data ''
```

### レスポンス例

```json
{
  "data": {
    "auth_url": "https://example.com/oauth2/auth?xxxxxx",
    "state": "a49bc736-xxxxx"
  }
}
```

### レスポンスフィールド

| フィールド | 型     | 説明                                           |
| ---------- | ------ | ---------------------------------------------- |
| `auth_url` | string | 第三者 OAuth 認可ページの URL。ブラウザで開いて認可します。 |
| `state`    | string | 認可状態の識別子。                             |

### 注意

- 各 `auth_url` は 1 回だけ使用できます。認可に失敗した場合や URL が期限切れになった場合は、再度この API を呼び出してください。
- 認可成功後、[ソーシャルメディアアカウント一覧](#ソーシャルメディアアカウント一覧)で接続結果を確認します。
- 同じプラットフォームで複数アカウントを接続できます。たとえば YouTube OAuth API を複数回呼び出すと、複数の YouTube チャンネルを接続できます。
- アカウント接続が成功しなかった場合、API Units は消費されません。

---

## ソーシャルメディアアカウント一覧

現在の API Key 所有者に接続されているソーシャルメディアアカウントを取得します。公開前に、この API で `publish_configs` に使うアカウント `id` を確認してください。

```
GET https://wayinvideo-api.wayin.ai/api/v2/social-media/accounts?active_only={active_only}
```

### クエリパラメータ

| パラメータ    | 型      | 必須 | 既定値  | 説明                                    |
| ------------- | ------- | ---- | ------- | --------------------------------------- |
| `active_only` | boolean | いいえ | `false` | `true` の場合、有効な token を持つアカウントのみ返します。 |

### リクエスト例

```bash
curl -X GET "https://wayinvideo-api.wayin.ai/api/v2/social-media/accounts?active_only=true" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "x-wayinvideo-api-version: v2"
```

### アカウント未接続時のレスポンス

```json
{
  "data": []
}
```

`data` が空の場合は、先に[ソーシャルメディアアカウントを接続する](#ソーシャルメディアアカウントを接続する)を実行してください。

### アカウント接続済みのレスポンス

```json
{
  "data": [
    {
      "id": "smaccxxx",
      "platform": "youtube",
      "platform_username": "MyChannel",
      "platform_avatar": "https://example.com/avatar.jpg",
      "token_valid": true,
      "token_expiring_soon": false
    }
  ]
}
```

### レスポンスフィールド

| フィールド            | 型             | 説明                                                          |
| --------------------- | -------------- | ------------------------------------------------------------- |
| `id`                  | string         | ソーシャルアカウント ID。`/publish` の `publish_configs` の key として使います。 |
| `platform`            | string         | プラットフォーム識別子。[プラットフォーム値](#プラットフォーム値)を参照。 |
| `platform_username`   | string         | プラットフォーム上のユーザー名、チャンネル名、またはアカウント名。 |
| `platform_avatar`     | string \| null | アカウントのアバター URL。                                   |
| `token_valid`         | boolean        | `true` の場合、認可 token が有効で公開に使用できます。       |
| `token_expiring_soon` | boolean        | `true` の場合、token がまもなく期限切れになります。再接続を案内してください。 |

### 推奨事項

- 公開タスク作成前に、対象アカウントの `token_valid` が `true` であることを確認してください。

---

## 公開タスクを作成する

1 つのクリップを 1 つ以上の接続済みソーシャルメディアアカウントへ公開します。プロジェクト ID とクリップインデックスで対象クリップを指定します。

> **必須：** `project_id` は、`enable_export = true` で送信された AI クリッピングまたはモーメント検索タスクのものを使用してください。ソーシャル公開にはエクスポート済みのクリップ動画が必要です。エクスポートを有効にせず作成されたプロジェクトは、この API では公開できません。

```
POST https://wayinvideo-api.wayin.ai/api/v2/social-media/publish
```

### リクエストフィールド

| フィールド        | 型              | 必須 | 説明                                                 |
| ----------------- | --------------- | ---- | ---------------------------------------------------- |
| `project_id`      | string          | はい | プロジェクト ID。                                    |
| `idx`             | integer         | はい | プロジェクト内のクリップインデックス。               |
| `resolution`      | string          | いいえ | エクスポート済みクリップの解像度。例：`1080p`、`720p`。 |
| `publish_configs` | object          | はい | ソーシャルアカウント ID を key にした公開設定。      |
| `scheduled_at`    | integer \| null | いいえ | 予約公開時刻のミリ秒タイムスタンプ。`null` または省略で即時公開。 |

> **`scheduled_at` 値の生成方法**
>
> `scheduled_at` はミリ秒単位の Unix タイムスタンプです。現在時刻から 5 分以上先、30 日以内である必要があります。
>
> JavaScript で 10 分後に予約する例：
>
> ```js
> const scheduledAt = Date.now() + 10 * 60 * 1000;
> ```
>
> 特定の時刻を指定する例：
>
> ```js
> const scheduledAt = new Date('2026-06-15T10:00:00Z').getTime();
> ```

### プラットフォーム別公開設定

`publish_configs` の各 value は、プラットフォーム別の公開設定オブジェクトです。

| フィールド         | 型       | 必須     | 説明                                      |
| ------------------ | -------- | -------- | ----------------------------------------- |
| `title`            | string   | 条件付き | 動画タイトル。YouTube では必須。          |
| `description`      | string   | 条件付き | 動画説明または投稿本文。TikTok では必須。 |
| `tags`             | string[] | いいえ   | タグ一覧。                                |
| `visibility`       | string   | いいえ   | 公開範囲：`public`、`private`、`unlisted`。対応状況はプラットフォームにより異なります。 |
| `thumbnail_url`    | string   | いいえ   | カスタムサムネイル画像 URL。              |
| `category`         | string   | いいえ   | プラットフォーム固有のカテゴリ。          |
| `allow_comment`    | boolean  | いいえ   | コメントを許可するか。                    |
| `allow_duet`       | boolean  | いいえ   | デュエットを許可するか。TikTok 専用。     |
| `allow_stitch`     | boolean  | いいえ   | スティッチを許可するか。TikTok 専用。     |
| `disclose_content` | boolean  | いいえ   | 広告・プロモーション内容であることを開示するか。TikTok 専用。 |

> **重要：** `publish_configs` の key は `/api/v2/social-media/accounts` が返すアカウント ID（例：`smacct06ixxxxxxx`）である必要があります。`youtube` や `tiktok` などのプラットフォーム名を key にしないでください。

### リクエスト例

```bash
curl -sS -X POST https://wayinvideo-api.wayin.ai/api/v2/social-media/publish \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "x-wayinvideo-api-version: v2" \
  -d '{
    "project_id": "prj06ixxxxxxx",
    "idx": 0,
    "resolution": "1080p",
    "publish_configs": {
      "smacct06ixxxxxxx": {
        "title": "API Test Video",
        "description": "Posted by curl test",
        "tags": ["api", "test"],
        "visibility": "public"
      }
    },
    "scheduled_at": null
  }'
```

### レスポンス例

```json
{
  "data": {
    "task_id": "pubtask06ixxxxxxx",
    "status": "PENDING",
    "created_at": 1781251687210
  }
}
```

公開スケジュールとリアルタイム結果は [WayinVideo calendar](https://wayin.ai/wayinvideo/calendar) で確認できます。

---

## プラットフォーム値

| 値          | プラットフォーム | Web サイト            |
| ----------- | ---------------- | --------------------- |
| `youtube`   | YouTube          | https://youtube.com   |
| `tiktok`    | TikTok           | https://tiktok.com    |
| `twitter`   | Twitter / X      | https://twitter.com   |
| `instagram` | Instagram        | https://instagram.com |
| `facebook`  | Facebook         | https://facebook.com  |
| `linkedin`  | LinkedIn         | https://linkedin.com  |

## 公開ステータス値

| 値             | 説明                                         |
| -------------- | -------------------------------------------- |
| `PENDING`      | タスク作成済み、スケジュール待ち。           |
| `SCHEDULED`    | 予約済み、指定時刻待ち。                     |
| `PROCESSING`   | 公開処理中。動画アップロードと平台側処理を含みます。 |
| `DONE`         | 公開成功。                                   |
| `PARTIAL_DONE` | 一部成功。複数アカウント公開時のみ発生します。 |
| `ERROR`        | 公開失敗。                                   |
| `CANCELLED`    | キャンセル済み。                             |

---

## 完全なフロー例

1. OAuth API を呼び出し、ブラウザで `auth_url` を開いて認可を完了します。
2. アカウント一覧 API を呼び出し、対象アカウントの `id` をコピーします。
3. `project_id`、`idx`、`publish_configs` を使って公開タスクを作成します。

---

## 注意事項

1. `publish_configs` の key は接続済みアカウント ID であり、プラットフォーム名ではありません。
2. 予約公開する場合は将来のミリ秒タイムスタンプを渡します。`null` または省略で即時公開です。
3. 予約公開時刻は 5 分以上先、30 日以内である必要があります。
4. ソーシャル公開にはエクスポート済みクリップ動画が必要です。`enable_export = true` で作成した AI クリッピングまたはモーメント検索タスクの `project_id` を使用してください。
5. 公開時にアカウント token エラーが返った場合は、対象ソーシャルメディアアカウントを再接続してから再試行してください。
6. 同じクリップは複数回公開できます。同じアカウントへ同じクリップを再度公開すると、別の公開タスクが作成されます。
