Represents a collection of IG Media objects on an IG User .
On July 9, 2025, we added support for the existing user_tags
field for image and video stories on the /<IG_ID>/media
endpoint. You can mention users in a story and optionally specify x, y coordinates to tag them at a particular coordinate in the media.
On March 24, 2025, we introduced the new alt_text
field for image posts on the /<INSTAGRAM_PROFESSIONAL_ACCOUNT_ID>/media
endpoint. Reels and stories are not supported.
POST /<YOUR_APP_USERS_INSTAGRAM_USER_ID>/media
Steps to publish a media object include the following:
| Type | Description |
|---|---|
| If creating containers for product tagging , the app user must have an admin role on the Business Manager that owns the IG User's Instagram Shop . |
|
| If creating containers for product tagging , you will also need: |
|
| Your app user must be able to perform the |
The following are the specifications for Reels:
The following are the specifications for a Reels cover photo:
POST https://graph.facebook.com/ v25.0
/<YOUR_APP_USERS_IG_USER_ID>/media
?image_url=<IMAGE_URL>
&is_carousel_item=<TRUE_OR_FALSE>
&alt_text=<IMAGE_ALTERNATIVE_TEXT>
&caption=<IMAGE_CAPTION>
&location_id=<LOCATION_PAGE_ID>
&user_tags=<ARRAY_OF_USERS_FOR_TAGGING>>
&product_tags=<ARRAY_OF_PRODUCTS_FOR_TAGGING>
&access_token=<USER_ACCESS_TOKEN>
POST https://graph.facebook.com/ v25.0
/<YOUR_APP_USERS_INSTAGRAM_USER_ID>/media
?media_type=REELS
&video_url=<REEL_URL>
&caption=<IMAGE_CAPTION>
&share_to_feed=<TRUE_OR_FALSE>
&collaborators=<COLLABORATOR_USERNAMES>
&cover_url=<COVER_URL>
&audio_name=<AUDIO_NAME>
&user_tags=<ARRAY_OF_USERS_FOR_TAGGING>>
&location_id=<LOCATION_PAGE_ID>
&thumb_offset=<THUMB_OFFSET>
&share_to_feed=<TRUE_OR_FALSE>
&trial_params=<TRIAL_PARAM>
&access_token=<USER_ACCESS_TOKEN>
POST https://graph.facebook.com/ v25.0
/<YOUR_APP_USERS_INSTAGRAM_USER_ID>/media
?media_type=REELS
&upload_type=resumable
&caption=<IMAGE_CAPTION>
&collaborators=<COLLABORATOR_USERNAMES>
&cover_url=<COVER_URL>
&audio_name=<AUDIO_NAME>
&user_tags=<ARRAY_OF_USERS_FOR_TAGGING>>
&location_id=<LOCATION_PAGE_ID>
&thumb_offset=<THUMB_OFFSET>
&access_token=<USER_ACCESS_TOKEN>
On success, an ig-container-id
and a uri
is returned in the response, which will be used in subsequent steps, such as:
{
"id": "<IG_CONTAINER_ID>",
"uri": "https://rupload.facebook.com/ig-api-upload/ v25.0
/<IG_CONTAINER_ID>"
}
Carousel containers only. To create carousel item containers, create image or video containers instead (reels are not supported). See Carousel Posts for complete publishing steps.
POST https://graph.facebook.com/ v25.0
/<YOUR_APP_USERS_INSTAGRAM_USER_ID>/media
?media_type=CAROUSEL
&caption=<IMAGE_CAPTION>
&share_to_feed=<TRUE_OR_FALSE>
&collaborators=<COLLABORATOR_USERNAMES>
&location_id=<LOCATION_PAGE_ID>
&product_tags=<ARRAY_OF_PRODUCTS_FOR_TAGGING>
&children=<ARRAY_OF_CAROUSEL_CONTAINTER_IDS>
&access_token=<USER_ACCESS_TOKEN>
POST https://graph.facebook.com/ v25.0
/<YOUR_APP_USERS_INSTAGRAM_USER_ID>/media
?media_type=VIDEO
&is_carousel_item=true
&upload_type=resumable
&access_token=<USER_ACCESS_TOKEN>
On success, an ig-container-id
and a uri
is returned in the response, which will be used in subsequent steps.
POST https://graph.facebook.com/ v25.0
/<YOUR_APP_USERS_INSTAGRAM_USER_ID>/media
?image_url=<IMAGE_URL>
&media_type=STORIES
&user_tags=<ARRAY_OF_USERS_FOR_TAGGING>
&access_token=<USER_ACCESS_TOKEN>
POST https://graph.facebook.com/ v25.0
/<YOUR_APP_USERS_INSTAGRAM_USER_ID>/media
?video_url=<VIDEO_URL>
&media_type=STORIES
&user_tags=<ARRAY_OF_USERS_FOR_TAGGING>
&access_token=<USER_ACCESS_TOKEN>
POST https://graph.facebook.com/ v25.0
/<YOUR_APP_USERS_INSTAGRAM_USER_ID>/media
?media_type=STORIES
&upload_type=resumable
&access_token=<USER_ACCESS_TOKEN>
On success, an Instagram container ID and a URI is returned in the response, which will be used in subsequent steps.
Once the Instagram container ID returns from a resumable upload session call, send a POST
request to the https://rupload.facebook.com/ig-api-upload/
v25.0
/<IG_CONTAINER_ID>
endpoint.
ig-container-id
is the ID from the resumable reels, carousel and video container upload session examples above.access-token
is the same one used in other steps.offset
is set to the first byte being upload, generally 0
.file_size
is set to the size of your file in bytes.Your_file_local_path
sets to the file path of your local file, for example, if uploading a file from the Downloadsfolder on macOS, the path is @Downloads/example.mov.curl -X POST "https://rupload.facebook.com/ig-api-upload/ v25.0
/<IG_CONTAINER_ID>" \
-H "Authorization: OAuth <USER_ACCESS_TOKEN>" \
-H "offset: 0" \
-H "file_size: Your_file_size_in_bytes" \
--data-binary "@Your_local_file_path.extension"
On success, you should see response like this example:
{
"success":true,
"message":"Upload successful. ..."
}
This service can also support video upload from a hosted URL.
curl -X POST "https://rupload.facebook.com/ig-api-upload/ v25.0
/<IG_CONTAINER_ID>" \
-H "Authorization: OAuth <USER_ACCESS_TOKEN>" \
-H "file_url: <VIDEO_URL>"
| Placeholder | Value |
|---|---|
| The lastest API version is: v25.0
|
API version . |
| |
App user's app-scoped user ID. |
alt_text
<IMAGE_ALTERNATIVE_TEXT>
For image posts only.Alternative text, up to 1000 character, for an image. Only supported on a single image or image media in a carousel.
Reels and stories are not supported.
audio_name
<AUDIO_NAME>
For Reels only.Name of the audio of your Reels media. You can only rename once, either while creating a reel or after from the audio page.
caption
<IMAGE_CAPTION>
A caption for the image, video, or carousel. Can include hashtags (example: #crazywildebeest
) and usernames of Instagram users (example: @natgeo
). @Mentioned Instagram users receive a notification when the container is published. Maximum 2200 characters, 30 hashtags, and 20 @ tags.
Not supported on images or videos in carousels.
collaborators
<LIST_OF_COLLABORATORS>
For Feed image, Reels and Carousels only. A list of up to 3 instagram usernames as collaborators on an ig media.
Not supported for Stories.
children
<ARRAY_OF_CAROUSEL_CONTAINTER_IDS
Required for carousels. Applies only to carousels. An array of up to 10 container IDs of each image and video that should appear in the published carousel. Carousels can have up to 10 total images, vidoes, or a mix of the two.
cover_url
<COVER_URL>
For Reels only. The path to an image to use as the cover image for the Reels tab. We will cURL the image using the URL that you specify so the image must be on a public server. If you specify both cover_url
and thumb_offset
, we use cover_url
and ignore thumb_offset
. The image must conform to the specifications for a Reels cover photo
.
image_url
<IMAGE_URL>
For images only and required for images. The path to the image. We will cURL the image using the URL that you specify so the image must be on a public server.
is_carousel_item
<TRUE_OR_FALSE>
Applies only to images and video. Set to true
. Indicates image or video appears in a carousel.
location_id
<LOCATION_PAGE_ID>
The ID of a Page associated with a location that you want to tag the image or video with.
Use the Pages Search API
to search for Pages
whose names match a search string, then parse the results to identify any Pages that have been created for a physical location. Include the location
field in your query and verify that the Page you want to use has location data. Attempting to create a container using a Page that has no location data will fail with coded exception INSTAGRAM_PLATFORM_API__INVALID_LOCATION_ID
.
Not supported on images or videos in carousels.
media_type
<MEDIA_TYPE>
Required for carousels, stories, and reels.Indicates container is for a carousel, story or reel. Value can be:
CAROUSEL
REELS
STORIES
product_tags
<ARRAY_OF_PRODUCTS_FOR_TAGGING>
Required for product tagging. Applies only to images and videos. An array of objects specifying which product tags to tag the image or video with (maximum of 5; tags and product IDs must be unique). Each object should have the following information:
product_id
— Required.Product ID.x
— Images only.An optional float that indicates percentage distance from left edge of the published media image. Value must be within 0.0
– 1.0
range.y
— Images only.An optional float that indicates percentage distance from top edge of the published media image. Value must be within 0.0
– 1.0
range.For example:
[{product_id:'3231775643511089',x: 0.5,y: 0.8}]
share_to_feed
<TRUE_OR_FALSE>
For Reels only. When true
, indicates that the reel can appear in both the Feedand Reelstabs. When false
, indicates the reel can only appear in the Reelstab.
Neither value determines whether the reel actually appears in the Reelstab because the reel may not meet eligibilty requirements or may not be selected by our algorithm. See reel specifications for eligibility critera.
thumb_offset
<THUMB_OFFSET>
For videos and reels. Location, in milliseconds, of the video or reel frame to be used as the cover thumbnail image. The default value is 0
, which is the first frame of the video or reel. For reels, if you specify both cover_url
and thumb_offset
, we use cover_url
and ignore thumb_offset
.
upload_type
<UPLOAD_TYPE>
An optional parameter for users want to upload video through the rupload protocol, values can be set to lowercase string value: resumable
.
user_tags
<ARRAY_OF_USERS_FOR_TAGGING>>
Required for user tagging in images, videos, and stories.Videos in carousels are not supported. An array of public usernames and x
/ y
coordinates for any public Instagram users who you want to tag in the image. Each object in the array should have the following information:
username
— Required.Username.x
— Required for images, optional for stories. Applies only to images and stories.A float that indicates percentage distance from left edge of the published media image. Value must be within 0.0
– 1.0
range.y
— Required for images, optional for stories. Applies only to images and stories.A float that indicates percentage distance from top edge of the published media image. Value must be within 0.0
– 1.0
range. video_url
<VIDEO_URL>
Required for videos and reels. Applies only to videos and reels.Path to the video. We cURL the video using the passed-in URL, so it must be on a public server.
trial_params
<TRIAL_PARAM>
An optional parameter for publishing trial reels. The media_type
must be REELS
if this parameter is included in the request. Each object should have the following information:
graduation_strategy
- Required. The graduation strategy specifies the conditions to graduate a reel (convert the trial reel to a reel, sharing it to followers). The value should be either MANUAL
or SS_PERFORMANCE
. When MANUAL
, the trial reel can be manually graduated in the native app. When SS_PERFORMANCE
, the trial reel will be automatically graduated if the trial reel performs well. branded_content_sponsor_ids
<BRANDED_CONTENT_SPONSOR_IDS>
An array of Instagram user IDs of brands to tag as partners in a partnership ads label
. Maximum 2 IDs. Use the Business Discovery API
to look up a brand's ID by username. Requires instagram_branded_content_creator
or instagram_basic
permission.
Not supported on remixed media or close-friends-only posts.
is_paid_partnership
<TRUE_OR_FALSE>
Enables the "Paid partnership" label on the published post. Automatically set to true
when branded_content_sponsor_ids
is provided. Use without branded_content_sponsor_ids
for a label-only post. See Partnership ads label
for details.
A JSON-formatted object containing an IG Container ID which you can use to publish the container.
Video uploads are asynchronous, so receiving a container ID does not guarantee that the upload was successful. To verify that a video has been uploaded, request the status_code
field on the IG Container. If its value is FINISHED
, the video was uploaded successfully.
{
"id":"<IG_CONTAINER_ID>"
}
POST graph.facebook.com/17841400008460056/media
?image_url=curls//www.example.com/images/bronzed-fonzes.jpg
&caption=#BronzedFonzes!
&collaborators= [‘username1’,’username2’]
&user_tags=[
{
username:'kevinhart4real',
x: 0.5,
y: 0.8
},
{
username:'therock',
x: 0.3,
y: 0.2
}
]
{
"id": "17889455560051444"
}
GET /<YOUR_APP_USERS_INSTAGRAM_USER_ID>/media
Get all IG Media on an IG User .
GET /<YOUR_APP_USERS_INSTAGRAM_USER_ID>/stories
endpoint instead.| Type | Description |
|---|---|
| If the app user was granted a role on the Page via the Business Manager, you will also need one of: |
This endpoint supports time-based pagination
. Include since
and until
query-string parameters with Unix timestamp or strtotime
data values to define a time range.
GET graph.facebook.com/ v25.0
/17841405822304914/media
{
"data": [
{
"id": "17895695668004550"
},
{
"id": "17899305451014820"
},
{
"id": "17896450804038745"
},
{
"id": "17881042411086627"
},
{
"id": "17869102915168123"
}
]
}
This operation is not supported.
This operation is not supported.