製品開発者

製品に公開機能を追加する。

架空の日記アプリに、ユーザーが確認して投稿を予約し、結果を表示する操作を追加します。

自社製品+SOSOAPI

説明用の連携フロー
  1. 自社製品準備して確認
  2. SosoAPI確認した投稿を一件予約
  3. ソーシャルアカウント結果を追跡
連携フローの例です。サーバー側APIリクエストとレスポンスのフィールドは手順ガイドをご覧ください。

三つのステップ

  1. コンテンツを準備

    製品内で文案と画像を集める。

  2. ユーザーに確認してもらう

    予約前にアカウント、内容、日時を表示する。

  3. 結果を取り込む

    進行と最終公開結果を表示する。

ソーシャル投稿を、自社製品の機能に。

詳しい手順を見る

シナリオ

架空の日記アプリに、内容を確認して実行する「このお知らせを予約」操作を追加します。ユーザーのワークスペースと正確な接続アカウントを表示し、プロバイダーが公開したと誤解させずに返された状態を示してください。

「製品に公開機能を追加。」のSosoAPIワークスペースの説明用イラスト
架空データを使った共通New Post画面。投稿は送信していません。

始める前に

  • SosoAPIを作成・認証し、目的のワークスペースを選ぶ。
  • App Settings → Agents & API Accessでキーを作り、サーバーのSOSOAPI_API_KEYに保存します。JavaScript例はNode.js 20+を使い、SosoAPIソースリポジトリは不要です。
  • 現在の認可範囲から、実際のワークスペースUUIDとThreadsソーシャルアカウントUUIDのみを選びます。アカウントはThreadsテキスト投稿に適格である必要があります。
  • APIキー所有者には選択ワークスペースのeditorかownerアクセスが必要です。キーはサーバー側に保持し、ブラウザーコード、リクエストJSON、ログに含めないでください。

入力例

架空の製品
Harborlight Journal · 非公開の日記アプリの構想。実際の連携を示すものではありません。
ユーザーの意図
選択Threadsアカウントに確認済み製品メモ一件を、未来の現地時刻で予約する。
文案例
「あとで読み返す小さなメモ。Harborlight Journalは、短い日々の振り返りのための余白を作っています。思いを一つ残して、あとは明日に。」
実行時に必要なスコープ
現在のユーザー認可範囲から<workspace-uuid>と<threads-social-account-uuid>を取得し、推測しないでください。
予約
<future ISO-8601 instant with offset>。display_timezoneはAsia/Hong_Kongに設定します。
再試行の識別情報
<unique stable idempotency key for this one user intent>。同じ要求の安全な再試行時のみ再利用します。

手順ガイド

  1. API呼び出しの前に製品の確認画面を設計する

    SosoAPIでこの画面を開く
    • SosoAPIアプリで目的のワークスペースを選び、接続アカウントを確認します。製品モックアップでも、そのユーザーが選んだワークスペースとアカウントを表示し、黙って別の対象を選ばないでください。

    • 確認手順で正確なキャプション、アカウント、現地時刻、タイムゾーンを表示します。本人がScheduleを選ぶ必要があり、フォームを開くだけで送信してはいけません。

    得られるもの

    書き込み前に人が投稿先と日時を確認できます。架空の製品モックアップは設計例であり、導入済みの顧客連携ではありません。

  2. サーバーから現在のScheduled Postsを取得

    • <workspace-uuid>を選択ワークスペースIDに置き換え、サーバーで次の読み取り専用要求を実行します:

    • const apiKey = process.env.SOSOAPI_API_KEY;
      if (!apiKey) throw new Error("Configure a SosoAPI API key on your server");
      const response = await fetch(
        "https://gqeshlawtcexsapabaui.supabase.co/functions/v1/studio-api/scheduled-posts/list",
        {
          method: "POST",
          headers: {
            "Authorization": "Bearer " + apiKey,
            "Content-Type": "application/json"
          },
          body: JSON.stringify({"workspace_id":"<workspace-uuid>"})
        }
      );
      const result = await response.json();
      if (!response.ok) throw new Error("SosoAPI request failed: " + response.status);
      // Use result in your server response; never return or log the API key.
    • 返されたデータで製品の一覧を更新し、本人の確認は読み取りと分けます。

    得られるもの

    現在のワークスペース投稿、または認可・検証エラーを返します。読み取り専用で、投稿は作成しません。

  3. ユーザーの明示的な確認後のみ送信

    • CalendarからNew Postを選び、アプリの同じ操作で確認手順を比較します。

    • すべてのプレースホルダーを認可されたID、オフセット付きの未来のISO日時、一意の冪等性キーに置き換えてください。サーバー側リクエストの実行前に、アカウント、文案、日時を確認します。

    • const apiKey = process.env.SOSOAPI_API_KEY;
      if (!apiKey) throw new Error("Configure a SosoAPI API key on your server");
      const response = await fetch(
        "https://gqeshlawtcexsapabaui.supabase.co/functions/v1/studio-api/scheduled-posts/create",
        {
          method: "POST",
          headers: {
            "Authorization": "Bearer " + apiKey,
            "Content-Type": "application/json"
          },
          body: JSON.stringify({
        "workspace_id": "<workspace-uuid>",
        "social_account_id": "<threads-social-account-uuid>",
        "caption": "A small note for later: Harborlight Journal is making room for shorter daily reflections. Keep one thought; leave the rest for tomorrow.",
        "hashtags": [],
        "media": [],
        "provider_payload": {"platform": "threads", "publish_options": {"post_type": "TEXT"}},
        "scheduled_at": "<future ISO-8601 instant with offset>",
        "display_timezone": "Asia/Hong_Kong",
        "idempotency_key": "<unique-stable-key-for-this-intent>"
      })
        }
      );
      const result = await response.json();
      if (!response.ok) throw new Error("SosoAPI request failed: " + response.status);
      // Use result in your server response; never return or log the API key.
    • 実行すると実際の予約を作成します。ユーザー確認後のみ送信し、APIキーをブラウザーに公開しないでください。

    得られるもの

    有効な受理応答はScheduled Postを識別しますが、公開の証明ではありません。権限拒否、無効範囲・アカウント、非対応内容、予約拒否は成功でなくエラーとして表示してください。

  4. 返された状態を表示し、安全な次の操作を案内する

    SosoAPIでこの画面を開く
    • 返されたScheduled Post IDを保存し、現在の状態、投稿先、予約を製品で表示します。

    • 該当するScheduled Postの詳細へ案内します。配信に人の対応が必要なら、黙って再送せずNeeds Attentionへ案内してください。

    • プロバイダー確認済みの最終状態が記録されるまで、公開済みと表示しないでください。

    得られるもの

    受領記録と、予約済み、公開処理中、公開済み、失敗、不明を区別します。不明な結果は新しい書き込み前に既存投稿と照合します。

リクエストの受領。その先の公開結果まで。

以下はAPIレスポンスの一部フィールドに架空の値を入れた例です。予約作成後はpost.idを保存し、その投稿の結果確認に使ってください。

1. 作成レスポンス

{
  "post": {
    "id": "10000000-0000-4000-8000-000000000001",
    "status": "scheduled",
    "scheduled_at": "2100-01-05T10:00:00+08:00",
    "published_at": null,
    "permalink": null
  },
  "deduped": false
}

2. 同じ投稿を取得する

POST /studio-api/scheduled-posts/get
{
  "id": "10000000-0000-4000-8000-000000000001"
}

プロバイダー確認後の詳細レスポンスには、次が含まれる場合があります:

{
  "post": {
    "id": "10000000-0000-4000-8000-000000000001",
    "status": "published",
    "published_at": "2100-01-05T02:00:08Z",
    "permalink": "https://www.threads.net/@example/post/EXAMPLE"
  },
  "delivery": {
    "stage": "terminal",
    "message": "Published on Threads."
  }
}
post.status
scheduled、publishing、published、failedなど実際の状態を使います。接続が切れたら、判断前に同じ投稿を取得してください。
post.permalink
取得できる場合のプロバイダー投稿リンク。nullの場合があります。上のURLは例です。
delivery / outcomes
詳細レスポンスは公開の進行と利用可能なプラットフォーム結果を示します。失敗時は詳細とNeeds Attentionを確認してから対応を選んでください。

フィールドの例で、実際の公開結果記録ではありません。このページはAPIを呼びません。

各ステータスの意味

Submittedリクエストへの応答
リクエストを受領しました。予約済み・公開済みと扱う前に現在の状態を確認します。
Scheduled投稿の詳細
未来の日時でScheduled Postが受理されています。待機中は投稿先と予約日時を表示してください。
Publishing投稿の詳細
配信中です。最終結果を待ってください。処理中は成功ではありません。
Published投稿の詳細
SosoAPIがScheduled Postにプロバイダーの最終確認を記録した後にのみ使用します。
Failed投稿の詳細
最終的な失敗は確認が必要です。変更・再試行前に詳細と利用できる操作を調べます。
Unknownアプリに表示されるもの
接続が切れて結果が不確かな場合、再送前にScheduled PostsとNeeds Attentionを確認します。

関連ガイド

サーバー側API例を掲載しています。実行前に認可IDとAPIキーを設定してください。ページ自体はリクエストを送りません。

最初のワークフローを試す。

アカウントを作り、Freeで始める。

Freeで始める