投稿
投稿を公開する
ライブアプリは即時公開・予約・下書き保存、テストアプリはシミュレーションのみ。?dry_run=true ならすべて検証し、何も書き込みません。
投稿は 1 つの店舗に属し、1 つ以上のネットワーク(ターゲット)に公開されます。各ターゲットに、独自の文章、メディア、形式、状態があります。
投稿の種類:今すぐ、予約、下書き
ボディの 2 つのフィールドが、投稿をいつ、そして公開するかどうかを決めます。
| ケース | ボディ | 動作 |
|---|---|---|
| 今すぐ | scheduledAt なし | 投稿はすぐに公開されます。 |
| 予約 | scheduledAt:未来の ISO 8601 形式の日時 | scheduledAt に公開されます。 |
| 下書き | "status": "draft"、scheduledAt なし | 保存されるだけで、公開されません。 |
投稿のボディ
| フィールド | 意味 |
|---|---|
establishmentId | 公開する店舗(GET /v1/establishments) |
targets[] | ネットワークごとに 1 件:platform、text、任意で media、format、accountId |
targets[].media[] | メディアライブラリのメディアを id で指定するか、公開の https の url と type(image または video)を指定 |
targets[].accountId | 店舗にそのネットワークのアカウントが複数ある時に使うアカウント |
scheduledAt | 未来の ISO 8601 形式の日時。なければ、投稿はすぐに公開されます |
status | draft で、公開されない下書きを保存します(その場合 scheduledAt は不要) |
ターゲットのメディア
targets[].media の各項目は、メディアライブラリのメディアを id で指定するか、公開の https の url と type(image または video)を指定します。Instagram と TikTok では、写真か動画が必須です。メディアライブラリにメディアを追加するには、メディアをインポートするをご覧ください。
投稿を複製する
投稿を複製する専用のエンドポイントはありません。`GET /v1/posts/{id}` で読み取り、その内容を新しい POST /v1/posts リクエストで送り直してください。
送り直す前に、Sofia が自分で設定するフィールドを取り除きます。最低限、次のとおりです。
- 投稿の
idとcreatedAt。 - 読み取った投稿の
status(送信状態を要約したもの):希望する値を指定するか、省略します。 - 各ターゲットの
state、publishedAt、permalink、error。
establishmentId と、各ターゲットの platform と accountId は残します。読み取りの結果にはターゲットの文章もメディアも含まれないので、もう一度指定してください。最後に、新しい scheduledAt を設定します(省略するとすぐに公開され、"status": "draft" を送ると下書きになります)。
最初の投稿
1. 接続済みネットワークを確認する
投稿は、店舗に接続されたアカウントを通じて公開されます。一覧を取得し、足りないものがあれば接続リンクを作成してください。接続済みアカウントをご覧ください。
2. メディアを追加する
Instagram と TikTok では、写真か動画が必須です。公開の https URL からインポートしてください。Sofia がメディアライブラリにダウンロードし、id を返します。メディアをインポートするをご覧ください。
3. ドライランで確認する
?dry_run=true を付けます。Sofia は、各ネットワークを実際のルールと接続済みアカウントで判定し、何も書き込みません。
curl -X POST 'https://api.sofia-post.com/api/v1/posts?dry_run=true' \
-H "Authorization: Bearer $SOFIA_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"establishmentId": "'$ESTABLISHMENT_ID'",
"targets": [
{ "platform": "instagram", "text": "Tarte tatin du jour", "media": [{ "id": "'$MEDIA_ID'" }] },
{ "platform": "facebook", "text": "Tarte tatin du jour", "media": [{ "id": "'$MEDIA_ID'" }] }
]
}'{
"status": "ready",
"dryRun": true,
"targets": [
{ "platform": "instagram", "accountId": "fecd0904-…", "handle": "sof_ia_officiel", "state": "ready" },
{ "platform": "facebook", "accountId": "a423b3a4-…", "handle": "Sofia post", "state": "ready" }
]
}4. 公開する
dry_run なしで同じボディを送り、Idempotency-Key を付けると、再試行しても 2 回公開されません。scheduledAt がなければ投稿はすぐに公開され、未来の scheduledAt があれば予約されます。
curl -X POST https://api.sofia-post.com/api/v1/posts \
-H "Authorization: Bearer $SOFIA_API_KEY" \
-H 'Content-Type: application/json' \
-H "Idempotency-Key: $(uuidgen)" \
-d @post.json5. 追跡する
投稿は publishing で返り、そのあとネットワークごとに、パーマリンクつきの published か、理由つきの failed になります。`GET /v1/posts/{id}` で読み取るか、Webhook を登録して通知を受けてください。
ドライラン
POST /v1/posts?dry_run=true は、実際の投稿と同じチェック(各ネットワークのルール、接続済みアカウント、メディア、日付、プラン)を実行します。何も保存せず、何も送信しません。
準備完了
すべてのネットワークが投稿を受け付ける場合、レスポンスは 200 で status: "ready" となり、ターゲットごとに公開するアカウントが示されます。
拒否
そうでない場合、レスポンスは 422 post_refused で、理由ごとの詳細が付きます。各詳細に、ネットワーク、code、直すべき内容が示されます。
{
"error": {
"code": "post_refused",
"message": "The post would not be published: x: the text is too long (300 characters, at most 280)",
"details": [
{
"platform": "x",
"code": "caption_too_long",
"max": 280,
"actual": 300,
"message": "x: the text is too long (300 characters, at most 280)"
}
],
"docUrl": "https://www.sofia-post.com/developers/errors#post_refused"
}
}それぞれの理由はエラーに一覧があります。
アプリのテストモードについては、テストモードとドライランをご覧ください。Idempotency-Key は POST /v1/posts も保護します。冪等性をご覧ください。
認可
Authorizationstringheader必須個人キーまたは OAuth アクセストークン。
Bearer <token>として送信します。
クエリパラメーター
dry_runstringtrue:送信時と同じ検証(ネットワークの規則、アカウント、メディア、作成、ライブの購読)をすべて行い、何も書き込みません。200readyまたは 422post_refusedを返します。使用できる値:
truefalse
ヘッダー
Idempotency-Keystring同じボディで再送すると、2 件目の投稿を作らず同じレスポンスを返します。ドライランではキーは消費されません。
ボディ
establishmentIdstring必須トークンのグラントに含まれる Workspace 内の店舗(
GET /v1/establishments)targetsobject[]必須ターゲットごとに 1 つのネットワーク
子属性を表示
platformstring必須対象のネットワーク
使用できる値:
instagramfacebookxlinkedintiktoktextstring必須このネットワークで公開するキャプション
mediaobject[]添付するメディア
子属性を表示
idstring店舗のライブラリにあるメディアの ID(なければ
urlとtype)urlstringメディアの公開 URL(ライブでは https)。ID がない場合
typestringURL で指定したメディアの種類
使用できる値:
imagevideo
formatstringフォーマット(
post、reel、story、carouselなど)。省略時はネットワークが提供するものaccountIdstringライブ:店舗がこのネットワークに複数のアカウントを持つ場合に、公開する連携アカウント(
GET /v1/establishments/:id/accounts)
scheduledAtstring<date-time>予約日時(ISO 8601)。未来の日時。省略すると即時公開。
statusがdraftの場合は指定できませんstatusstringdraft:下書き(ライブのみ)。日時なしで作成され、何も送信されません。PATCH /v1/posts/:idで予約します使用できる値:
draft
レスポンス
ドライラン:すべての検証に成功しました。
statusstring必須常に
ready使用できる値:
readydryRunboolean必須常に
true使用できる値:
truetargetsobject[]必須検証されたターゲット
子属性を表示
platformstring必須ターゲットのネットワーク
statestring必須常に
ready使用できる値:
readyaccountIdstringライブ:公開されるアカウント
handlestringライブ:その表示用ハンドル