# Schedule Threads text and image posts with SosoAPI

Canonical URL: https://sosoapi.ai/docs/threads-api-publishing

Schedule a text or image post to one connected Threads account, then check whether it went live. The examples use placeholders and do not run from this page. Publishing contract reviewed 20 October 2026.

## 1. Connect and check the destination

Connect the intended Threads account in SosoAPI. The provider consent needs threads_content_publish for publishing. The SosoAPI caller also needs an allowed Workspace, editor access and the agent:publish capability for scheduling.

Check that SosoAPI has returned the Threads account you intend to use. Run full-draft eligibility with the content and time before scheduling. Features such as replies, locations and cross-sharing have additional permission and eligibility requirements.

- [Check the platform capability matrix](https://sosoapi.ai/docs/publishing-capabilities)

## 2. Schedule a reviewed text post

Use the server helper from the API reference, replace the placeholders and choose a future ISO-8601 time with an offset. Running this request creates a real schedule, so confirm the account, wording and time before you send it.

For a TEXT post, leave media empty. Keep one idempotency key for this request and save the returned post.id so you can check its status. Use a Threads provider_payload with this account.

```
await sosoPost("/studio-api/scheduled-posts/create", {
  "workspace_id": "<workspace-uuid>",
  "social_account_id": "<threads-account-uuid>",
  "caption": "A reviewed update from our team.",
  "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": "<stable-key-for-this-one-intent>"
});
```

- [Publishing API reference](https://sosoapi.ai/docs/publishing-api-reference)

## 3. Use a ready registered image

For a local image, use sosoapi_upload_asset. For a public image URL, call sosoapi_import_asset_url and check sosoapi_get_asset_import_status until it is ready. Use the registered asset’s ID and canonical URL in the post.

For the normal create request, set post_type to IMAGE and add the ready image to media. The fragment below replaces those two fields in the text example. Keep the caption, account and time, and use a new stable key for this newly confirmed post.

- Replace asset_id with the actual positive integer, not a numeric string.

- Do not schedule with the source URL, a temporary preview URL or an unfinished import.

- The same library image can be reused only when its rights, Workspace and chosen content are appropriate.

```
{
  "media": [{
    "kind": "image",
    "asset_id": "<ready-image-asset-id-as-number>",
    "url": "<canonical-image-asset-url>"
  }],
  "provider_payload": {
    "platform": "threads",
    "publish_options": {"post_type": "IMAGE"}
  }
}
```

## 4. Verify publication and avoid duplicate sends

Read the original Scheduled Post and check its terminal publish outcome. An ID, accepted schedule or Threads media container means the request exists; it does not confirm publication. Show the provider’s post ID or permalink when one is available.

If Threads is still processing, or you lose the response, keep checking the same post. Do not send another create request with a different key. Reconnecting the account does not establish whether an earlier write succeeded.

Once Threads starts publishing a text post, the provider step may no longer be reversible. Follow the available actions returned by SosoAPI rather than resending the post. Processing time can vary.

- [Review with Claude Code or Codex](https://sosoapi.ai/docs/claude-code-codex-social-publishing)

- [Publishing API reference](https://sosoapi.ai/docs/publishing-api-reference)
