The RTCPeerConnection interface's onnegotiationneeded property is an EventListener which specifies a function which is called to handle the negotiationneeded event when it occurs on an RTCPeerConnection instance. This event is fired when a change has occurred which requires session negotiation. This negotiation should be carried out as the offerer, because some session changes cannot be negotiated as the answerer.

Most commonly, the negotiationneeded event is fired after a send track is added to the RTCPeerConnection. If the session is modified in a manner that requires negotiation while a negotiation is already in progress, no negotiationneeded event will fire until negotiation completes, and only then if negotiation is still needed.


RTCPeerConnection.onnegotiationneeded = eventHandler;


This should be set to a function you provide which is passed a single parameter: an Event object containing the negotiationneeded event. There's no additional information provided in the event; anything you need, you can get by examining the properties of the RTCPeerConnection.


This example, derived from the example in Signaling and video calling, establishes a handler for negotiationneeded events to handle creating an offer, configuring the local end of the connection, and sending the offer to the remote peer.

pc.onnegotiationneeded = function() {
  pc.createOffer().then(function(offer) {
    return pc.setLocalDescription(offer);
  .then(function() {
      // Send the offer to the remote peer through the signaling server

First, it creates the offer by calling createOffer(). When that succeeds, the offer is passed into setLocalDescription() to set the local description for the connection. Once that's succeeded in turn, the offer can be sent to the signaling server for delivery to the remote peer.


Specification Status Comment
WebRTC 1.0: Real-time Communication Between Browsers
The definition of 'RTCPeerConnection.onnegotiationneeded' in that specification.
Candidate Recommendation Initial specification.

Browser compatibility

Update compatibility data on GitHub
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung Internet
onnegotiationneededChrome Full support 24Edge Full support 15Firefox Full support 22IE No support NoOpera Full support 43
Full support 43
Notes Promise-based version.
No support 37Ā ā€” 43
Safari Full support 11WebView Android Full support YesChrome Android Full support YesFirefox Android Full support 44Opera Android Full support 43
Full support 43
Notes Promise-based version.
No support 37Ā ā€” 43
Safari iOS Full support YesSamsung Internet Android Full support 6.0


Full support Ā 
Full support
No support Ā 
No support
See implementation notes.
See implementation notes.

See also