1. Overview
Threads publishing uses the Threads Graph API two-step flow: SocialAPI creates a media container, optionally polls until a video container is ready, then publishes it. Text-only posts skip polling and publish immediately.| Field | Value |
|---|---|
| Platform slug | threads |
| Auth type | OAuth 2.0 (Meta Threads) |
| API | Threads Graph API (graph.threads.net) |
| Create post | Yes |
| Update post | No (not supported by platform) |
| Delete post | Yes |
| Schedule | Yes (deferred publish via schedule_at) |
| First comment | No |
2. Supported media
| Content type | How to trigger | Notes |
|---|---|---|
| Text only | Omit media_ids | Supported natively; unlike Instagram, text-only posts work without any media |
| Single image | One media_ids entry pointing to an image URL | Sent as media_type: IMAGE |
| Single video | One media_ids entry pointing to a video URL (.mp4, .mov, .avi, .mkv, .webm) | Sent as media_type: VIDEO; container is polled until FINISHED |
| Carousel | Two or more media_ids entries | Up to 20 items; mix of images allowed |
3. Create post
UsePOST /v1/posts with account_ids targeting a Threads account. The text field becomes the post body.
Platform data fields
Pass these insideplatform_data.threads:
| Field | Type | Description |
|---|---|---|
reply_control | string | Who can reply. One of "everyone" (default), "accounts_you_follow", or "mentioned_only". |
link_attachment | string | A URL to attach as a link preview. Must be a valid URL string. |
platform_data.threads directly to the underlying platform API. These fields are not validated by SocialAPI and may break if the platform changes its API. See Threads API reference for the full list of supported parameters.
Scheduling
Setschedule_at to an ISO 8601 timestamp (UTC) to defer publishing:
4. Update post
Threads does not support editing a published post via the API.PATCH /v1/posts/:pid for a Threads target returns 501 Not Implemented.
If you need to correct a post, delete it and recreate it.
5. Delete post
DELETE /{media-id} on the Threads Graph API. If the media ID no longer exists on Threads, the API returns success.
6. Retrieve posts
UseGET /v1/posts to list posts. Filter by platform or account:
targets array with per-platform status and engagement metrics:
0 and metrics_synced_at is null. This is a platform limitation, not a SocialAPI limitation.
7. Quirks, errors, and recovery
Container polling for video
After creating a video container, SocialAPI polls the container status (once per minute, up to 5 attempts) before publishing. If the container reachesFINISHED or PUBLISHED, the post is immediately sent to threads_publish. If the container returns ERROR or EXPIRED, the publish fails. If the container does not finish within 5 minutes, SocialAPI returns 504 Gateway Timeout and marks the post target as failed.
Image and text posts skip polling entirely and proceed directly to publish.
No post editing
Threads has no API for editing a post’s text or media after publication. AttemptingPATCH /v1/posts/:pid targeting Threads always returns 501 Not Implemented. Delete and recreate the post if a correction is needed.
Text-only posts
Unlike Instagram, Threads supports text-only posts natively. Omitmedia_ids entirely to create a post with just a text body. The container is created with media_type: TEXT.
reply_control defaults to “everyone”
Ifreply_control is not set in platform_data.threads, the Threads API defaults to "everyone". You must explicitly pass "accounts_you_follow" or "mentioned_only" to restrict who can reply.
Token expiry
Threads long-lived user access tokens expire after approximately 60 days. SocialAPI stores the token and its expiry. When a token expires, publish calls will fail with anauth error. Reconnect the account via the OAuth flow to obtain a fresh token.
Error shapes
When a publish fails, the post target’serror field contains a structured error:
| Error code | Category | Caused by | Meaning |
|---|---|---|---|
platform.threads.api_error | platform | platform | Threads Graph API rejected the request. Check message for details. |
platform.threads.auth | auth | platform | Access token expired or revoked. Reconnect the account. |
Recovery
- Auth error: Disconnect and reconnect the Threads account through the OAuth flow to obtain a fresh token.
- Container timeout: Usually caused by a large video file or a slow upstream URL. Re-upload the media and retry.
- API error: Retry the post via
POST /v1/posts/:pid/retryafter reviewing themessagefield for platform guidance.
8. Full worked example
The following example publishes a video post with restricted reply control, then checks its status. Step 1: Upload media9. Required OAuth scopes
The following Threads app scopes must be approved for your application before publishing will work:| Scope | Purpose |
|---|---|
threads_basic | Read basic account info and profile |
threads_content_publish | Create and publish media containers |
threads_read_replies | Read replies on posts |
threads_manage_replies | Hide, unhide, and delete replies |
threads_delete | Delete published posts |
400 or 403 from the Threads Graph API.
To verify which scopes your connected account has, call GET /v1/accounts/:id/limits.