This document explains how to publish a reel on a Facebook Page. To publish a reel on a Facebook Page you will:
When uploading a Reel using your app, the app user should be presented with disclosure of and options for control over how their Reels are used on Facebook. Privacy / Who can see this?User selectable choice of audience.An app user should be able to select the audience for their reel. This selection corresponds to the privacy parameter in the publishing step. Posting to a Page has implicit public scope, and only the 'Public' option should be available. Limitations
| Sharing Disclosure Mockup ![]() |
You will need:
CREATE_CONTENT
task on the Page.pages_show_list
pages_read_engagement
pages_manage_posts
Property | Specification | ||
---|---|---|---|
File Type | .mp4 (recommended) | ||
Aspect Ratio | 9 x 16 | ||
Resolution | 1080 x 1920 pixels (recommended). Minimum is 540 x 960 pixels | ||
Frame Rate | 24 to 60 frames per second | ||
Duration | 3 to 90 seconds | ||
Video Settings |
| ||
Audio Settings |
|
Before you can publish a video to a Facebook Page, you must first upload it to the Meta social graph. You will need to initialize a video upload session to start the upload process. To start a session, send a POST
request to the /page-id/video_reels
endpoint, where page-id is the ID for your Facebook Page, with the upload_phase
parameter set to start
.
Be sure the host is graph.facebook.com
.
Formatted for readability. Replace bold, italics values, such as page_access_token, with your values.
curl -X POST "https://graph.facebook.com/v18.0
/Your_page_id/video_reels" \
-H "Content-Type: application/json" \
-d '{
"upload_phase":"start",
"access_token":"Your_page_access_token"
}'
On success, your app will receive a video ID and a URL to the video. This video ID will be used in subsequent steps.
{ "video_id": "video-id", "upload_url": "https://rupload.facebook.com/video-upload/video-id", }
Most Graph API calls use the graph.facebook.com host however, calls to upload videos for reels use rupload.facebook.com
.
The following file sources are supported for uploaded video files:
To initiate the upload of the video asset, send a POST
request using application/octet-stream as content type to the /video-upload/
video-id
endpoint where video-id is the ID from Step 1, offset
is set to the first byte being upload, generally 0
, and file_size
set to the size of your file, in bytes.
Be sure the host is rupload.facebook.com
.
Video Reel Upload Quick Reference
Formatted for readability. Replace bold, italics values, such as page_access_token, with your values.
curl -X POST "https://rupload.facebook.com/video-upload/v18.0
/video-id" \
-H "Authorization: OAuth Your_page_access_token" \
-H "offset: 0" \
-H "file_size: Your_file_size_in_bytes" \
--data-binary "@my_video_file.mp4"
To upload a hosted file, send a POST
request to the /video-upload/
video-id
endpoint where video-id is the ID returned in Step 1 and file_url
is set to the URL for your hosted file.
Be sure the host is rupload.facebook.com
.
Formatted for readability. Replace bold, italics values, such as page_access_token, with your values.
curl -X POST "https://rupload.facebook.com/video-upload/v18.0
/video_id" \
-H "Authorization: OAuth Your_page_access_token" \
-H "file_url: https://some.cdn.url/video.mp4"
If you upload was successful, your app will receive a JSON object with success
set to true
.
{"success": true}
To get the status of a video, send a GET
request to the /
video-id
endpoint where the video-id is the ID from initialization step and with the field
set to status
.
Be sure the host is graph.facebook.com
.
curl -X GET "https://graph.facebook.com/v18.0
/video-id
?field=status
&access_token=Your_page_access_token"
On success your app will receive a JSON object with status information that includes the processing, uploading, and publishing phases, and the video status.
If reuploading doesn’t work, try again from step 1.
{ "status": { "video_status": "processing", "uploading_phase": { "status": "complete", }, "processing_phase": { "status": "not_started", "error": { "message": "Resolution too low. Video must have a minimum resolution of 540p." } } "publishing_phase": { "status": "not_started", } } }
{ "status": { "video_status": "processing", "uploading_phase": { "status": "in_progress", "bytes_transfered": 50002 } "processing_phase": { "status": "not_started" } "publishing_phase": { "status": "not_started", "publish_status": "scheduled", "publish_time": 234523452 } } }
Error Type | Error Message | Recommended Solution |
---|---|---|
OffsetInvalidError | Request starting offset is invalid | Set the ‘offset’ parameter to the |
PartialRequestError | Partial request (did not match length of file) | Check the file size and try the upload again. |
ProcessingFailedError | Request processing failed | Please try uploading again. Make sure the video meets all of the requirements. If the upload does not work, initialize a new upload session. |
If the video upload is interrupted, it can be resumed.
To resume an upload, send another POST request to the /video-upload/video-id
endpoint and use the value for upload_phase.bytes_transfered
as the value for offset
.
To end the upload session and publish your video, send a POST
request to the /
page-id
/video_reels
endpoint. You can also include any of the additional fields, like description
, which can include hashtags, and title
.
Be sure the host is graph.facebook.com
.
POST Page Video Reels Quick Reference
Formatted for readability. Replace bold, italics values, such as page_access_token, with your values.
curl -X POST "https://graph.facebook.com/v18.0
/page-id/video_reels
?access_token=Your_page_access_token
&video_id=video-id
&upload_phase=finish
&video_state=PUBLISHED
&description=What a beautiful day! #sunnyand72"
On success your app will receive a JSON object with success
set to true
.
{"success": true}
To get a list of all reels published on your Facebook Page, send a GET
request to /
page-id
/video_reels
endpoint.
Be sure the host is graph.facebook.com
for this API call.
Note: When using since
and until
in your GET
request, the date for until
must be a date after the date for since
. For example, if since
is 2023-01-31
, until
must be after 2023-01-31
. You can use both parameters, or one or the other. Date formats can be any of the following:
today
, yesterday
yyyy-mm-dd
(2023-1-31)
curl -X GET "https://graph.facebook.com/v18.0
/page-id/video_reels?access_token=Your_page_access_token"
On success your app will receive a JSON object with information about your published reels such as video ID and published time.
{ "data": [ { "updated_time": "unix_timestamp", "id": "video-1-id" }, { "description": "sample_description", "updated_time": "unix_timestamp", "id": "video-2-id" }, ... ] }
Invite a person, a collaborator, to publish your Reel on their Facebook Page.
To publish a reel on a collaborator's Facebook Page you will invite the collaborator to publish your reel on their Facebook Page. When they accept the invitation, the reel will immediately be published on their Facebook Page if the reel has been published, or the reel will be published on their Page when you publish the reel on your Page.
You will need:
To invite a collaborator to publish your Reel on their Facebook Page, send a POST
request to the /
video-id
/collaborators
endpoint with the target_id
parameter set to the ID for the collaborator's Facebook Page.
curl -X POST "https://graph.facebook.com/v18.0
/video-id/collaborators
?target_id=collaborators-page-id
&access_token=your-page-access-token"
On success your app will receive a JSON response with the link to the invitation and your collaborator will receive an invite notification.
{ "success": true, “collaborator_id”: “collaborators-page-id” “invitation_link”: “facebook-url-for-invitation” }
To get the status for an invitation you sent, send a GET
request to the /
video-id
/collaborators
endpoint.
curl -X POST "https://graph.facebook.com/v18.0
/video-id/collaborators
?access_token=your-page-or-user--access-token"
On success your app will receive a JSON response with the invitation status of Accepted
, Declined
, or Pending
.
{ “id”: “video-id” “name”: “collaborators-page-name” “invite_status”: “Accepted” “invitation_link”: “facebook-url-for-invitation” }
Common error codes and possible mitigations.
Error Code | Error Message | Possible Mitigation |
---|---|---|
| "error": { "message": "(#100) Missing parameter: {a list of missing parameters}", "type": "OAuthException", "code": 100, "fbtrace_id": "----" } } | A required parameter, such as |
| The video you tried to upload has an aspect ratio that isn't supported on Facebook. Aspect ratios for videos need to be between 16x9 and 9x16. Please try uploading a video in a supported aspect ratio. | Aspect ratios for videos need to be between 16x9 and 9x16. |
| The video you tried to upload has resolution that isn't supported on Facebook for this product. Please try uploading a video with a supported resolution | Minimum resolution is 540 x 960 pixels. Recommended resolution is 1080 x 1920 pixels. |
| The video you tried to upload has a duration that isn't supported on Facebook for this product. Please try uploading a video with a supported duration. | Reels duration must be between 3 and 90 seconds. |
| The video you tried to upload has an average frame rate that isn't supported on Facebook for this product. Please try uploading a video with a supported frame rate | Reels frame rate must be between 24 and 60 frames per second. |
Customize your reel to create a richer reels experience for your viewers.