Support for Live Video API for Facebook

FAQ

Streaming software, or RTMP encoding software, takes your RTMP stream URL and key and sends them to Facebook. We do not provide the streaming software. Many live streams can use OBS (Open Broadcasting Software) or Player.me, both of which offer free versions.

You can begin using the Live API immediately. However, if you want to create a full production quality stream with multiple cameras and graphics, it can take 1-2 weeks or longer, depending on App Review.

There's about a 4-5 second delay from when you go live to when your video shows on Facebook. You'll know it's up when you see the video playing on your test (or public) page.

If you are having issues with your live streams, please refer to our guides to make sure that you are using our API correctly. We also recommend reviewing our video specifications to ensure that your settings are best suited for a quality live stream. If you believe you have run into a bug, you can send it directly to our Bug Tool and an engineer will get back to you.

Yes you can! The second stream will likely get fewer inferred notifications than the first. Please refer to our Best Practices documentation for more information on how notifications work.

Not necessarily. If you want to stream to two (or more) different pages, there are encoders and APIs available that can make this possible, such as Wowza and Streamshark. While it is possible to stream to different pages from one encoder, we recommend instead streaming to one page and sharing to other pages so the comments, reactions, and viewer counts are consolidated.

Our default aspect ratio is 16x9, though we infer the aspect ratio from the stream. For complete specifications, see our reference.

You can embed live videos using the embeddable parameter through the Live Video API.

Send a POST /{live_video_id} request, and set the embeddable parameter to true. Use a Page or User access token with the same permissions as are required when creating a live video.

curl -i -X POST \
 "https://graph.facebook.com/{your-live-video-id}
   ?embeddable=true&access_token={your-access-token}"
GraphRequest request = GraphRequest.newPostRequest(
  accessToken,
  "/{your-live-video-id}",
  new JSONObject("{}"),
  new GraphRequest.Callback() {
    @Override
    public void onCompleted(GraphResponse response) {
      // Insert your code here
    }
});
request.executeAsync();
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
    initWithGraphPath:@"/{your-live-video-id}"
           parameters:@{ @"embeddable": @"true",}
           HTTPMethod:@"POST"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
    // Insert your code here
}];
FB.api(
  '/{your-live-video-id}',
  'POST',
  {"embeddable":"true"},
  function(response) {
      // Insert your code here
  }
);
try {
  // Returns a `FacebookFacebookResponse` object
  $response = $fb->post(
    '/{your-live-video-id}',
    array (
      'embeddable' => 'true'
    ),
    '{access-token}'
  );
} catch(FacebookExceptionsFacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}
$graphNode = $response->getGraphNode();

To get the embedded HTML, send a GET /{live_video_id}?fields=embed_html request. Use a Page or User access token with the same permissions as are required when creating a live video.

curl -i -X GET \
 "https://graph.facebook.com/{your-live_video_id}
   ?fields=embed_html
   &access_token={your-access-token}"
GraphRequest request = GraphRequest.newGraphPathRequest(
  accessToken,
  "/{your-live_video_id}",
  new GraphRequest.Callback() {
    @Override
    public void onCompleted(GraphResponse response) {
      // Insert your code here
    }
});

Bundle parameters = new Bundle();
parameters.putString("fields", "embed_html");
request.setParameters(parameters);
request.executeAsync();
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
    initWithGraphPath:@"/{your-live_video_id}"
           parameters:@{ @"fields": @"embed_html",}
           HTTPMethod:@"GET"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
    // Insert your code here
}];
FB.api(
  '/{your-live_video_id}',
  'GET',
  {"fields":"embed_html"},
  function(response) {
      // Insert your code here
  }
);
try {
  // Returns a `FacebookFacebookResponse` object
  $response = $fb->get(
    '/{your-live_video_id}',
    '{access-token}'
  );
} catch(FacebookExceptionsFacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}
$graphNode = $response->getGraphNode();

Sample Response

{
  "embed_html": "<iframe src=\"https://www.facebook.com/plugins/video.php?href=https%3A%2F%2Fwww.facebook.com%2Fyourpage%2Fvideos%2F{your-page-id}%2F&width=0\" width=\"0\" height=\"0\" style=\"border:none;overflow:hidden\" scrolling=\"no\" frameborder=\"0\" allowTransparency=\"true\" allowFullScreen=\"true\"></iframe>",
  "id": "{your-live-video-id}"
}

No, this is the expected behavior. We do not currently support watching live videos on mobile web until they are VODs (Videos On Demand). However, if you want to watch a live video on mobile web that has been embedded into another site, you will be redirected to the Facebook app to watch.

There are a few reasons why this may have happened. Here are a few of the most common reasons:

  1. If you have music playing in the background of your live video, your video may be taken down for copyright violation. This may happen either during the live video or afterwards, in VOD replay.
  2. You, or another author of your page, may have deleted the live video. If a live video has been manually deleted, it cannot be recovered.
  3. Your video may have been flagged automatically for IP violation. If this occurs, Facebook will send you an email that contains a link for you to review the takedown and resubmit the video for review by our Policy team.

This occurs when the broadcast does not start sealing or processing after signaling the end of the live video. Be sure you have sent a POST request with the end_live_video parameter. If this occurs again, please file a bug in our bug tool, and be sure to include your video ID.

Audio distortion can occur when Facebook receives a video stream with distorted audio or after we've received the frames but before we re-encode for broadcast. A possible reason for this type of error is that the bitrate used is higher than what the connection between your broadcasting endpoint and Facebook servers can sustain. If that happens, or if there's a packet lost, some of the video or audio track won't be received correctly, and this can cause audio distortion.

Audio/Visual sync issues may occur when a live broadcast is delivered with limited bandwidth to the client, or the client does not have the bandwidth to view it live. Additionally, if the stream received by the Facebook server is out of sync, then the live video will also be out of sync. Be sure to check recording and encoding hardware for potential places in which the audio could be misaligned with the video.

The Live Video API requires audio. If you attempt to stream video only, the stream ends.

Your live feed may drop due to an encoder failure or poor network connectivity. If this happens, you have 2-3 minutes to reconnect to the original stream URL that you generated for your live post. Otherwise, you will have to generate a new stream key and URL to continue your live stream.

Yes, you can geo-gate (restrict who can see your video depending on the viewer's location). See Audience Targeting to learn how.

Yes, videos taken down for copyright violation can be restored. You should receive a notification that gives you the option to restore the video. However, if you do not take this action when you receive the notification, the video can no longer be restored.

No. Unfortunately, live videos can't be boosted at this time.

Currently there is no endpoint for creating closed captions. However, you can add closed captions to LiveVideo broadcasts after they have ended, or you can add closed captions to your live video stream as it streams to our servers using the CEA-608 closed captions standard.

To add captions to a LiveVideo that has ended (i.e, has a status of VOD) refer to our "How do I add captions to my Page's video?" help topic. To add captions using the CEA-608 standard refer to our Closed Captions guide.

It is against Facebook's live video policy to include third-party ads in live streams. For example, please do not include bumpers, pre-roll, mid-roll, or post-roll.

We encourage all live broadcasts to exclusively contain live content so as to preserve the integrity of the viewer's experience. However, there are unique cases in which cutting to a pre-recorded clip makes sense, similar to how a news show might show previously recorded content on live TV.

Yes, refer to our Crossposting guide and How do I crosspost another Page's video? Help Center topic to learn how. Comments and reactions are shown only in the original Page.

To appear on the Live Map, you must set your video's location by using the place parameter in a POST /{live_video_id} request.

To reset a persistent key, go to www.facebook.com/live/create, click Create a Live Stream, check the Use a persistent stream key checkbox, then click the Reset button.

Reporting Bugs

If you believe you may have found a bug in the Live API, please file a bug report in our bug tool and an engineer will take a look at it shortly. You can also search for existing bugs by API error codes, SDK methods, and more.

Report a Bug