Threads Posts
Updated: Apr 14, 2026
Copy for LLM
You can use the Threads API to publish image, video, text, or carousel posts.
This document covers:
Single thread posts
Publishing a single image, video, or text post is a two-step process:
- Create a media container with text only or with an image or video hosted on your public server with optional text using the
POST /{threads-user-id}/threadsendpoint. - Publish the media container using the
POST /{threads-user-id}/threads_publishendpoint.
Limitations
- Text posts are limited to 500 characters.
- Emojis are counted as the number of UTF-8 bytes.
Step 1: Create a Threads media container
Use the
POST /{threads-user-id}/threads endpoint to create a Threads media container.Parameters
| Name | Description |
|---|---|
is_carousel_item
Boolean
| Required. Indicates that images and/or videos will appear in a carousel. Values: true, false (default for single thread posts) |
media_type
string
| Required. Indicates the current media type. Values: TEXT, IMAGE, VIDEONote: CAROUSEL is not available for single thread posts. |
image_url
URL
| Optional. Required for media_type=IMAGE.The URL path to the image. Note: Threads retrieves your image from the URL provided, so it must be on a public server. |
video_url
URL
| Optional. Required for media_type=VIDEO.The URL path to the video. Note: Threads retrieves your video from the URL provided, so it must be on a public server. |
text
string
| Optional. Required for media_type=TEXT.The text associated with the post. If any URLs are included, the first URL in the text field will be used as the link preview for the post.Note: For the post character limit, emojis are counted as the number of UTF-8 bytes. |
Refer to the
POST /{threads-user-id}/threads endpoint reference for additional supported parameters.Example request
curl -i -X POST \ -d "media_type=IMAGE" \ -d "image_url=<IMAGE_URL>" \ -d "text=<TEXT>" \ -d "access_token=<ACCESS_TOKEN>" \ "https://graph.threads.com/v1.0/<THREADS_USER_ID>/threads"
Example response
{ "id": "<THREADS_MEDIA_CONTAINER_ID>" }
Step 2: Publish the Threads media container
Use the
POST /{threads-user-id}/threads_publish endpoint to publish the media container ID returned in the previous step.It is recommended to wait on average 30 seconds before publishing a Threads media container to give our server enough time to fully process the upload. See the media container status endpoint for more details.
Parameters
| Name | Description |
|---|---|
creation_id
int
| Required. The Threads media container ID. |
Example request
curl -i -X POST \ -d "creation_id=<MEDIA_CONTAINER_ID>" \ -d "access_token=<ACCESS_TOKEN>" \ "https://graph.threads.com/v1.0/<THREADS_USER_ID>/threads_publish"
Example response
{ "id": "<THREADS_MEDIA_ID>" }
Carousel posts
You may publish up to 20 images, videos, or a mix of the two in a carousel post. Publishing carousels is a three-step process:
- Create the individual media containers for each image and video that should appear in the carousel using the
POST /{threads-user-id}/threadsendpoint. - Create a single carousel container to contain the media containers using the
POST /{threads-user-id}/threadsendpoint. - Publish the carousel container using the
POST /{threads-user-id}/threads_publishendpoint.
Note: Carousel posts count as a single post against a profile’s rate limit.
Limitations
- Carousels are limited to 20 images, videos, or a mix of the two.
- Carousels require a minimum of two children.
Step 1: Create a media container
Use the
POST /{threads-user-id}/threads endpoint to create a media container for each of the images and/or videos that will appear in the carousel.Parameters
| Name | Description |
|---|---|
is_carousel_item
Boolean
| Required. Indicates that images and/or videos will appear in a carousel when set to true.Values: true, false |
media_type
string
| Required. Indicates the current media type. Values: IMAGE, VIDEONote: CAROUSEL is not available for single thread posts. |
image_url
URL
| Optional. Required for media_type=IMAGE.The URL path to the image. Note: Threads retrieves your image from the URL provided, so it must be on a public server. |
video_url
URL
| Optional. Required for media_type=VIDEO.The URL path to the video. Note: Threads retrieves your video from the URL provided, so it must be on a public server. |
text
string
| Optional. The text associated with the post. If any URLs are included, the first URL in the text field will be used as the link preview for the post.Note: For the post character limit, emojis are counted as the number of UTF-8 bytes. |
Refer to the
POST /{threads-user-id}/threads endpoint reference for additional supported parameters.Example request
curl -i -X POST \ -d "image_url=<IMAGE_URL>" \ -d "is_carousel_item=true" \ -d "access_token=<ACCESS_TOKEN>" \ "https://graph.threads.com/v1.0/<THREADS_USER_ID>/threads"
Example response
{ "id": "<THREADS_MEDIA_CONTAINER_ID>" }
If the operation is successful, the API will return a media container ID, which can be used when creating the carousel container.
Repeat this process for each image and/or video that will appear in the carousel.
Step 2: Create a carousel container
Use the
POST /{threads-user-id}/threads endpoint to create a carousel container.Parameters
| Name | Description |
|---|---|
media_type
string
| Required. Indicates the current media type. Value: CAROUSEL |
children
list<int>
| Required. A comma-separated list of the media container IDs of the images and/or videos that should appear in the published carousel. Note: Carousels must have at least 2 and no more than 20 total images, videos, or a mix of the two. |
text
string
| Optional. The text associated with the post. |
Refer to the
POST /{threads-user-id}/threads endpoint reference for additional supported parameters.Example request
curl -i -X POST \ -d "media_type=CAROUSEL" \ -d "children=<MEDIA_ID_1>,<MEDIA_ID_2>,<MEDIA_ID_3>,..." \ -d "access_token=<ACCESS_TOKEN>" \ "https://graph.threads.com/v1.0/<THREADS_USER_ID>/threads"
Example response
{ "id": "<THREADS_CAROUSEL_CONTAINER_ID>" }
Step 3: Publish the carousel container
Use the
POST /{threads-user-id}/threads_publish endpoint to publish a carousel post.Note: Profiles are limited to 250 published posts within a 24-hour period. Publishing a carousel counts as a single post.
Parameters
| Name | Description |
|---|---|
creation_id
int
| Required. The Threads carousel container ID. |
Example request
curl -i -X POST \ -d "creation_id=<MEDIA_CONTAINER_ID>" \ -d "access_token=<ACCESS_TOKEN>" \ "https://graph.threads.com/v1.0/<THREADS_USER_ID>/threads_publish"
Example response
{ "id": "<THREADS_MEDIA_ID>" }
If the operation is successful, the API will return the carousel album’s Threads media ID.
Topics and links appear in posts in such a way as to encourage engagement.
Topics make posts more social by allowing central topics of discussion. You can include a topic in a post either by using the
topic_tag parameter or by including a tag within the text of a post.Using the topic_tag parameter
Note: Topic tags must be at least 1 character and no more than 50 characters long. The following characters are not allowed:
- Periods (.)
- Ampersands (&)
Example request
curl -i -X POST \ -d "media_type=TEXT" \ -d "text=<Text>" \ -d "access_token=<ACCESS_TOKEN>" \ -d "topic_tag=<TAG>" \ "https://graph.threads.com/v1.0/<THREADS_USER_ID>/threads"
Using an in-text topic tag
This method is not preferred but is kept for backward compatibility.
A topic can also be attached to a post by including it in-line within the text of the post. Only one topic tag is allowed per post, so the first valid tag included in a post of any type (text-only, image, video, carousel) via the API is treated as the tag for that post.
Information to keep in mind when adding a topic to a post using an in-text tag:
- Valid tags start with a hash sign (#).
- The text is also configured in the app without the hash sign.
- Topic must be at least 1 character and no more than 50 characters long.
- Whole numbers that are preceded by a hash sign (i.e., #1) will not be converted into a tag. This is because it is assumed that # is signifying a number sign in this scenario.
- The following characters are not allowed when using in-text tags with the Threads API, so any in-text tag that starts with a hash sign will end just before these characters:
- Spaces, Tabs, New Line Characters
- Periods (.)
- Ampersands (&)
- At Signs (@)
- Exclamation Marks (!)
- Question Marks (?)
- Commas (,)
- Semi-Colons (;)
- Colons (:)
Links
To attach a link to your post, use the
link_attachment parameter when creating a media container.
If no link_attachment parameter is provided, then the first link made in a text-only post via the API is configured as the link attachment, which displays as a preview card, to make it easier to engage with and click on.Limitations
- This feature is only available for text-only posts. It will not work with image, video, or carousel posts.
- The number of links is restricted to 5 or fewer.
Starting December 22, 2025, Threads posts containing more than 5 links will fail to post during the media creation step (
POST /{threads-user-id}/threads) with the error code: THREADS_API__LINK_LIMIT_EXCEEDED.How links are counted:
- All unique URLs found in the text field are counted as links.
- If the
link_attachmentfield contains a URL that is different from all URLs in the text field, it is counted as an additional link. - If the
link_attachmentURL is the same as any URL in the text field, it is only counted once, rather than twice.
Examples:
- If the
textfield contains only www.facebook.com, and thelink_attachmentis also www.facebook.com, this counts as 1 link. - If the
textfield contains www.instagram.com and www.threads.com, and thelink_attachmentis www.facebook.com, this counts as 3 links. - If the
textfield contains www.example.com, www.example.com, and www.test.com, and thelink_attachmentis www.test.com, this counts as 2 links (www.example.com and www.test.com are each counted once).
If you receive this error, reduce the number of unique links in your post to 5 or fewer.
Publishing
Links can be attached when making an API call to the
POST /{threads-user-id}/threads endpoint to create a media container.| Name | Description |
|---|---|
link_attachment
URL
| Optional. The URL that should be attached to a Threads post and displayed as a link preview. This must be a valid, publicly accessible URL. Note: Can only be used for media_type=TEXT posts. |
Example request
curl -i -X POST \ -d "media_type=TEXT" \ -d "text=<TEXT>" \ -d "access_token=<ACCESS_TOKEN>" \ -d "link_attachment=<URL> \ "https://graph.threads.com/v1.0/<THREADS_USER_ID>/threads"
Example response
{ "id": "<THREADS_MEDIA_CONTAINER_ID>" }
The request above creates a Threads media container that, once published, will attach a link preview to your media.
Media Retrieval
The value for the
link_attachment URL can be retrieved by making a request to the GET /threads or GET /{threads_media_id} endpoint to retrieve media object(s).| Name | Description |
|---|---|
link_attachment_url
URL
| The URL attached to a Threads post. |
Example request
curl -s -X GET \ "https://graph.threads.com/v1.0/<THREADS_MEDIA_ID>?fields=id,link_attachment_url&access_token=<ACCESS_TOKEN>"
Example response
{ "id": "<THREADS_MEDIA_ID>", "link_attachment_url": "<LINK_ATTACHMENT_URL>", }
GIFs
GIFs make posts more engaging by allowing users to express reactions, emotions, or ideas visually.
Limitations
- This feature is only available for text-only posts. It will not work on image, video, or carousel posts.
- GIPHY is currently the only available GIF provider.
Publishing
GIFS can be attached when making an API call to the
POST /{threads-user-id}/threads endpoint to create a media container.| Name | Description |
|---|---|
gif_attachment
object
| Optional. The ID and GIF provider for the GIF to attach to the post. Fields: gif_id, provider |
Example request
curl -i -X POST \ -d "media_type=TEXT" \ -d "text=<Text> \ -d "access_token=<ACCESS_TOKEN>" \ -d "gif_attachment={"gif_id":"<GIF_ID>","provider":"GIPHY"}" \ "https://graph.threads.com/v1.0/<THREADS_USER_ID>/threads"
Note: The value of the
id field you receive from the GIF provider’s API response should be used as the <GIF_ID> in the API call.Example response
{ "id": "<THREADS_MEDIA_ID>" }
The request above creates a Threads media container that, once published, will attach a GIF to your media.
Media Specifications
Image Specifications
- Format: JPEG and PNG image types are the officially supported formats for image posts.
- File Size: 8 MB maximum.
- Aspect Ratio Limit: 10:1
- Minimum Width: 320 (will be scaled up to the minimum if necessary)
- Maximum Width: 1440 (will be scaled down to the maximum if necessary)
- Height: Varies (depending on width and aspect ratio)
- Color Space: sRGB. Images using other color spaces will have their color spaces converted to sRGB.
Video Specifications
- Container: MOV or MP4 (MPEG-4 Part 14), no edit lists, moov atom at the front of the file.
- Audio Codec: AAC, 48khz sample rate maximum, 1 or 2 channels (mono or stereo).
- Video Codec: HEVC or H264, progressive scan, closed GOP, 4:2:0 chroma subsampling.
- Frame Rate: 23-60 FPS
- Picture Size:
- Maximum Columns (horizontal pixels): 1920
- Required aspect ratio is between 0.01:1 and 10:1 but we recommend 9:16 to avoid cropping or blank space.
- Video Bitrate: VBR, 100 Mbps maximum.
- Audio Bitrate: 128 kbps.
- Duration: 300 seconds (5 minutes) maximum, minimum longer than 0 seconds.
- File Size: 1 GB maximum.