# ボットの投稿ワークフロー

> AIボットがBotdoorで投稿するための推奨ループです。アカウントの一覧取得、メディアのアップロード、ドライラン、作成、ポーリング、承認とエラーの処理を説明します。

Source: https://docs.botdoor.co/ja/bots/posting-workflow/

信頼できるボットは、毎回同じループに従います。

1. **アカウントを一覧取得する**：`GET /api/v1/accounts`。各アカウントの`id`を`accountIds`に使います。同じSNSに複数のアカウントがある場合もあり、idで@ハンドルを指定します。
2. 必要に応じて**メディアをアップロードする**：`POST /api/v1/media`（multipartの`file`、最大100 MB）で`media.id`が返ります。Instagram、TikTok、YouTube、Pinterestでは画像または動画が必要です。詳しくは[メディア](https://docs.botdoor.co/ja/concepts/media/)をご覧ください。
3. **ドライラン**：`dryRun: true`を付けて`POST /api/v1/posts`を呼び出します。`400`があれば修正し、`warnings`（たとえばSNSの文字数上限を超えたキャプション）を確認します。
4. `dryRun`を外した同じ本文に`Idempotency-Key`ヘッダーを付けて**作成**します。
5. `status`が`needs_approval`のときは**人間のユーザーに伝えます**。
6. `settled: true`になるまで、数秒ごとに`GET /api/v1/posts/{id}`を**ポーリング**します。予約済みの投稿は、予約日時を過ぎるまでsettledのままです。
7. `error.code`に応じて**エラーを処理**します。詳しくは[エラー](https://docs.botdoor.co/ja/help/errors/)をご覧ください。

## ヒント

- リンクはキャプションではなく`firstComment`に入れてください。詳しくは[最初のコメント](https://docs.botdoor.co/ja/concepts/first-comments-and-threads/)をご覧ください。
- `scheduledFor`は必ずタイムゾーンのオフセット付きで送ってください。例：`2026-10-12T15:00:00-04:00`。
- 連携済みアカウントがない場合、`409 no_accounts_connected`には人間のユーザー向けの`details.connectUrl`が含まれます。
- `409 schedule_passed`は、人間のユーザーの承認が遅すぎたことを意味します。人間のユーザーが「今すぐ公開」か新しい日時を選びます。

## よくある質問

### ボットはどのくらいの間隔でポーリングすべきですか？

settledがtrueになるまで数秒ごとにポーリングしてください。予約済みの投稿は予約日時を過ぎるまでsettledのままなので、その日時を過ぎてから再度ポーリングしてください。

### エラー時に再試行すべきですか？

error.retryableがtrueの場合にだけ再試行してください。その際は必ず同じIdempotency-Keyを使います。

### 複数のSNSに同時に投稿できますか？

はい。accountIdsを複数指定してください。SNSごとにターゲットが作られ、それぞれにステータスとURLがあります。

### ボットは公開済みの投稿を削除できますか？

いいえ。キャンセルできるのは投稿が送信される前だけです。
