{"id":1519,"date":"2021-03-22T07:10:53","date_gmt":"2021-03-22T01:40:53","guid":{"rendered":"https:\/\/www.enablex.io\/insights\/?p=1519"},"modified":"2025-08-05T09:49:44","modified_gmt":"2025-08-05T04:19:44","slug":"what-is-webrtc-and-how-it-works","status":"publish","type":"post","link":"https:\/\/www.enablex.io\/insights\/what-is-webrtc-and-how-it-works\/","title":{"rendered":"What is WebRTC And How It Works"},"content":{"rendered":"<p><span data-contrast=\"auto\">The world of web-based communication is changing at the speed you might not even imagine<\/span><span data-contrast=\"auto\">.\u00a0<\/span><span data-contrast=\"auto\">\u00a0Now, for making a <a href=\"https:\/\/www.enablex.io\/cpaas\/video-api\">video conferencing call<\/a>, sharing a file\u2014all that you\u00a0<\/span><span data-contrast=\"auto\">need<\/span><span data-contrast=\"auto\">\u00a0is a\u00a0<\/span><span data-contrast=\"auto\">URL, thanks to the power of<\/span><span data-contrast=\"auto\">\u00a0WebRTC\u00a0<\/span><span data-contrast=\"auto\">for opening the door of infinite possibilities for\u00a0<\/span><span data-contrast=\"auto\">developers and businesses.\u00a0<\/span><span data-contrast=\"auto\">\u00a0\u00a0<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span> <span data-contrast=\"auto\">Developed by Google in 2011<\/span><span data-contrast=\"auto\">\u00a0as an\u00a0<\/span><span data-contrast=\"auto\">open-source<\/span><span data-contrast=\"auto\">\u00a0framework<\/span><span data-contrast=\"auto\">\u00a0comprising standards, protocols<\/span><span data-contrast=\"auto\">,<\/span><span data-contrast=\"auto\">\u00a0and JavaScript APIs<\/span><span data-contrast=\"auto\">, WebRTC<\/span><span data-contrast=\"auto\">\u00a0or Web Real<\/span><span data-contrast=\"auto\">&#8211;<\/span><span data-contrast=\"auto\">Time Communications facilitates<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">the\u00a0<\/span><span data-contrast=\"auto\">peer-to-peer<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">transfer of<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">audio, video, and data\u00a0<\/span><span data-contrast=\"auto\">without plugins<\/span><span data-contrast=\"auto\">,<\/span><span data-contrast=\"auto\">\u00a0native applications<\/span><span data-contrast=\"auto\">,<\/span><span data-contrast=\"auto\">\u00a0or any third-party\u00a0<\/span><span data-contrast=\"auto\">proprietary\u00a0<\/span><span data-contrast=\"auto\">software<\/span><span data-contrast=\"auto\">.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span> <span data-contrast=\"auto\">Supported by<\/span><span data-contrast=\"auto\">\u00a0major browsers including Chrome, Safari, Mozilla,\u00a0<\/span><span data-contrast=\"auto\">and\u00a0<\/span><span data-contrast=\"auto\">Opera<\/span><span data-contrast=\"auto\">, t<\/span><span data-contrast=\"auto\">he scope of new standard Web\u00a0<\/span><span data-contrast=\"auto\">Real-Time<\/span><span data-contrast=\"auto\">\u00a0Communication goes beyond the realms of web bro<\/span><span data-contrast=\"auto\">wsers.\u00a0\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span> <span data-contrast=\"auto\">It\u2019s indeed an exciting and disruptive technology built on top of free JavaScript APIs<\/span><span data-contrast=\"auto\">. All it requires<\/span><span data-contrast=\"auto\">\u00a0is<\/span><span data-contrast=\"auto\">\u00a0a few lines of JavaScript code, and you can enjoy a rich video calling with peer-to-peer data transfers.\u00a0<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span> <span data-contrast=\"auto\">But wait! i<\/span><span data-contrast=\"auto\">t\u2019s\u00a0<\/span><span data-contrast=\"auto\">not that simple:\u00a0<\/span><span data-contrast=\"auto\">it l<\/span><span data-contrast=\"auto\">everages\u00a0<\/span><span data-contrast=\"auto\">a variety of protocols\u00a0<\/span><span data-contrast=\"auto\">and standards\u00a0<\/span><span data-contrast=\"auto\">including\u00a0<\/span><span data-contrast=\"auto\">SDP (Session Development\u00a0<\/span><span data-contrast=\"auto\">Protocol), SIP (Session Initiation Protocols), NAT,\u00a0<\/span><span data-contrast=\"auto\">ICE,\u00a0<\/span><span data-contrast=\"auto\">and\u00a0<\/span><span data-contrast=\"auto\">UDP\/TC<\/span><span data-contrast=\"auto\">P, and many more<\/span><span data-contrast=\"auto\">\u00a0to provide secure, interoperable (between browsers), real<\/span><span data-contrast=\"auto\">&#8211;<\/span><span data-contrast=\"auto\">time browser-based\u00a0<\/span><span data-contrast=\"auto\">peer-to-peer\u00a0<\/span><span data-contrast=\"auto\">communication.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>Also read: <a href=\"https:\/\/www.enablex.io\/insights\/the-most-comprehensive-guide-on-webrtc\/\"><span style=\"text-decoration: underline;\"><strong>The Most Comprehensive Guide on WebRTC<\/strong><\/span><\/a><\/p>\n<p>&nbsp;<\/p>\n<h2><b><span data-contrast=\"auto\">How WebRTC Works<\/span><\/b><\/h2>\n<p><span data-contrast=\"auto\">Similar to<\/span><span data-contrast=\"auto\">\u00a0any genuinely disruptive technolog<\/span><span data-contrast=\"auto\">y<\/span><span data-contrast=\"auto\">, WebRTC may\u00a0<\/span><span data-contrast=\"auto\">initially\u00a0<\/span><span data-contrast=\"auto\">sound cool and\u00a0<\/span><span data-contrast=\"auto\">magical!<\/span><span data-contrast=\"auto\">\u00a0IT folks\u00a0<\/span><span data-contrast=\"auto\">can be lured by the promises of building\u00a0<\/span><span data-contrast=\"auto\">the next Zoom application only to discover\u00a0<\/span><span data-contrast=\"auto\">how compl<\/span><span data-contrast=\"auto\">icated<\/span><span data-contrast=\"auto\">\u00a0it can be to gain an<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">idea of the\u00a0<\/span><span data-contrast=\"auto\">multiple\u00a0<\/span><span data-contrast=\"auto\">moving components\u00a0<\/span><span data-contrast=\"auto\">and\u00a0<\/span><span data-contrast=\"auto\">understand\u00a0<\/span><span data-contrast=\"auto\">how\u00a0<\/span><span data-contrast=\"auto\">all of them\u00a0<\/span><span data-contrast=\"auto\">fit into\u00a0<\/span><span data-contrast=\"auto\">the\u00a0<\/span><span data-contrast=\"auto\">overall piece of the puzzle<\/span><span data-contrast=\"auto\">\u2014called WebRTC<\/span><span data-contrast=\"auto\">.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span> <span data-contrast=\"auto\">Y<\/span><span data-contrast=\"auto\">ou\u00a0<\/span><span data-contrast=\"auto\">can, however,<\/span><span data-contrast=\"auto\">\u00a0get into the skin of things<\/span><span data-contrast=\"auto\">\u00a0once you understand the<\/span><span data-contrast=\"auto\">\u00a0basic\u00a0<\/span><span data-contrast=\"auto\">concept.<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">To enable<\/span><span data-contrast=\"auto\">\u00a0WebRTC<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">communication, the following\u00a0<\/span><span data-contrast=\"auto\">four\u00a0<\/span><span data-contrast=\"auto\">steps<\/span><span data-contrast=\"auto\">\u00a0are required<\/span><span data-contrast=\"auto\">:\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><b><span data-contrast=\"auto\">Step 1:<\/span><\/b><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">A<\/span><span data-contrast=\"auto\">ccess to media streams<\/span><span data-contrast=\"auto\">\u00a0through webcam or microphone<\/span><span data-contrast=\"auto\">\u00a0(carried out via\u00a0<\/span><b><span data-contrast=\"auto\">GetUserMedia\u00a0<\/span><\/b><span data-contrast=\"auto\">JavaScript API)<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><b><span data-contrast=\"auto\">Step 2:<\/span><\/b><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">B<\/span><span data-contrast=\"auto\">asic<\/span><span data-contrast=\"auto\">\u00a0network<\/span><span data-contrast=\"auto\">&#8211;<\/span><span data-contrast=\"auto\">related information such\u00a0<\/span><span data-contrast=\"auto\">as\u00a0<\/span><span data-contrast=\"auto\">ports and IP addresses and this information needs to\u00a0<\/span><span data-contrast=\"auto\">be\u00a0<\/span><span data-contrast=\"auto\">shared with\u00a0<\/span><span data-contrast=\"auto\">an<\/span><span data-contrast=\"auto\">other browser<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">through signalling<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">(carried out via\u00a0<\/span><b><span data-contrast=\"auto\">RTCPeerConnection<\/span><\/b><span data-contrast=\"auto\">\u00a0JavaScript API)<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><b><span data-contrast=\"auto\">Step 3:<\/span><\/b><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">I<\/span><span data-contrast=\"auto\">nfo about the parameters of media data<\/span><span data-contrast=\"auto\">\u00a0(<\/span><span data-contrast=\"auto\">carried out via\u00a0<\/span><b><span data-contrast=\"auto\">RTCPeerConnection<\/span><\/b><span data-contrast=\"auto\">\u00a0JavaScript API)\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><b><span data-contrast=\"auto\">Step 4:<\/span><\/b><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">Transfer media data<\/span><span data-contrast=\"auto\">\u00a0(carried out via\u00a0<\/span><b><span data-contrast=\"auto\">RTCDataChannel\u00a0<\/span><\/b><span data-contrast=\"auto\">JavaScript API)<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><strong>Broadly, these objectives are achieved with\u00a0the following\u00a0three main JavaScript groups:\u00a0<\/strong><\/p>\n<h3>1. GetUserMedia (or MediaStream API)<span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559685&quot;:284,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/h3>\n<p><span data-contrast=\"auto\">The API\u00a0<\/span><span data-contrast=\"auto\">is used to access a webcam or microphone of the device<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">and<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">enables developers to\u00a0<\/span><span data-contrast=\"auto\">receive\u00a0<\/span><span data-contrast=\"auto\">access to\u00a0<\/span><span data-contrast=\"auto\">the\u00a0<\/span><span data-contrast=\"auto\">video\/audio stream objects<\/span><span data-contrast=\"auto\">.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span> <span data-contrast=\"auto\">It\u00a0<\/span><span data-contrast=\"auto\">assists\u00a0<\/span><span data-contrast=\"auto\">in<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">selecting<\/span><span data-contrast=\"auto\">\u00a0the desired input user device out of multiple media capture devices. Whether\u00a0<\/span><span data-contrast=\"auto\">it\u2019s\u00a0<\/span><span data-contrast=\"auto\">taking\u00a0<\/span><span data-contrast=\"auto\">a\u00a0<\/span><span data-contrast=\"auto\">profile picture of a user, collecting audio samples, or recording audio\/video\u2014getUserMedia\u00a0API performs these tasks.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span> <span data-contrast=\"auto\">For instance, to open a default media device, it works the following way:\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<ul>\n<li data-leveltext=\"o\" data-font=\"Courier New\" data-listid=\"9\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"auto\">A call to\u00a0getUserMedia\u00a0() instantly triggers a permission request that needs to be accepted by the user to get access to\u00a0MediaStream.\u00a0<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"o\" data-font=\"Courier New\" data-listid=\"9\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span data-contrast=\"auto\">In case the permission is denied, it\u00a0<\/span><span data-contrast=\"auto\">throws\u00a0PermissionDeniedError<\/span><span data-contrast=\"auto\">.\u00a0<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"o\" data-font=\"Courier New\" data-listid=\"9\" aria-setsize=\"-1\" data-aria-posinset=\"3\" data-aria-level=\"1\"><span data-contrast=\"auto\">If it doesn\u2019t find any matching device, it throws\u00a0NotFoundError.\u00a0\u00a0<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<\/ul>\n<figure id=\"attachment_1520\" aria-describedby=\"caption-attachment-1520\" style=\"width: 760px\" class=\"wp-caption aligncenter\"><img decoding=\"async\" class=\"wp-image-1520 size-large\" src=\"https:\/\/www.enablex.io\/insights\/wp-content\/uploads\/2021\/03\/MicrosoftTeams-image-3-1024x576.jpg\" alt=\"webRTC\" width=\"760\" height=\"428\" srcset=\"https:\/\/www.enablex.io\/insights\/wp-content\/uploads\/2021\/03\/MicrosoftTeams-image-3-1024x576.jpg 1024w, https:\/\/www.enablex.io\/insights\/wp-content\/uploads\/2021\/03\/MicrosoftTeams-image-3-300x169.jpg 300w, https:\/\/www.enablex.io\/insights\/wp-content\/uploads\/2021\/03\/MicrosoftTeams-image-3-768x432.jpg 768w, https:\/\/www.enablex.io\/insights\/wp-content\/uploads\/2021\/03\/MicrosoftTeams-image-3.jpg 1152w\" sizes=\"(max-width: 760px) 100vw, 760px\" \/><figcaption id=\"caption-attachment-1520\" class=\"wp-caption-text\">Source: webrtc.org<\/figcaption><\/figure>\n<h3>2. RTCPeerConnection<span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559685&quot;:284,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/h3>\n<p><span data-contrast=\"auto\">It<\/span><span data-contrast=\"auto\"> is the heart and soul of WebRTC\u00a0<\/span><span data-contrast=\"auto\">and\u00a0<\/span><span data-contrast=\"auto\">the most\u00a0<\/span><span data-contrast=\"auto\">complicated<\/span><span data-contrast=\"auto\">\u00a0one. It almost performs all tasks\u00a0<\/span><span data-contrast=\"auto\">taking<\/span><span data-contrast=\"auto\">\u00a0place in<\/span><span data-contrast=\"auto\">side<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">a\u00a0<\/span><span data-contrast=\"auto\">peer-to-peer\u00a0<\/span><span data-contrast=\"auto\">communication.\u00a0<\/span><span data-contrast=\"auto\">\u00a0\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span> <span data-contrast=\"auto\">It performs the following functions:\u00a0<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<ul>\n<li data-leveltext=\"o\" data-font=\"Courier New\" data-listid=\"10\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"auto\">Setting up and creating a peer<\/span><span data-contrast=\"auto\">-to-peer<\/span><span data-contrast=\"auto\">\u00a0connection<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"o\" data-font=\"Courier New\" data-listid=\"10\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"auto\">Taking care of session management<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"o\" data-font=\"Courier New\" data-listid=\"10\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span data-contrast=\"auto\">Managing all\u00a0<\/span><span data-contrast=\"auto\">Session Description Protocol (<\/span><span data-contrast=\"auto\">SDP<\/span><span data-contrast=\"auto\">)<\/span><span data-contrast=\"auto\">\u00a0message exchanges and handling negotiations through ICE candidates (uses STUN and Turn if required)<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"o\" data-font=\"Courier New\" data-listid=\"10\" aria-setsize=\"-1\" data-aria-posinset=\"3\" data-aria-level=\"1\"><span data-contrast=\"auto\">Encoding and decoding media streams (audio\/video\/text) in real-time<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"o\" data-font=\"Courier New\" data-listid=\"10\" aria-setsize=\"-1\" data-aria-posinset=\"4\" data-aria-level=\"1\"><span data-contrast=\"auto\">Handling all network-related issues such as bandwidth estimation, packet loss etc. <\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<\/ul>\n<p><span data-contrast=\"auto\">Once a peer connection\u00a0<\/span><span data-contrast=\"auto\">between browsers\u00a0<\/span><span data-contrast=\"auto\">is\u00a0<\/span><span data-contrast=\"auto\">established,<\/span><span data-contrast=\"auto\"> multimedia streams can be sent to the remote browser. This, however, is not as easy as it sounds<\/span><span data-contrast=\"auto\">\u00a0because of the following three distinct\u00a0<\/span><span data-contrast=\"auto\">possible scenarios<\/span><span data-contrast=\"auto\">:\u00a0<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<ul>\n<li data-leveltext=\"\uf0a7\" data-font=\"Wingdings\" data-listid=\"7\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"auto\">It is likely that b<\/span><span data-contrast=\"auto\">oth peers might\u00a0<\/span><span data-contrast=\"auto\">reside\u00a0<\/span><span data-contrast=\"auto\">within their private network<\/span><span data-contrast=\"auto\">s or<\/span><span data-contrast=\"auto\">\u00a0behind multiple layers of NAT<\/span><span data-contrast=\"auto\">. Consequently, neither<\/span><span data-contrast=\"auto\">\u00a0of them\u00a0<\/span><span data-contrast=\"auto\">is<\/span><span data-contrast=\"auto\">\u00a0approachable.<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0a7\" data-font=\"Wingdings\" data-listid=\"12\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span data-contrast=\"auto\">They do<\/span><span data-contrast=\"auto\">\u00a0not have<\/span><span data-contrast=\"auto\">\u00a0the basic network information<\/span><span data-contrast=\"auto\">,<\/span><span data-contrast=\"auto\">\u00a0such as<\/span><span data-contrast=\"auto\">\u00a0IP<\/span><span data-contrast=\"auto\">,\u00a0<\/span><span data-contrast=\"auto\">port<\/span><span data-contrast=\"auto\">,<\/span><span data-contrast=\"auto\">\u00a0and location<\/span><span data-contrast=\"auto\">\u00a0about the other<\/span><span data-contrast=\"auto\"> which are vital to establishing communication.<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0a7\" data-font=\"Wingdings\" data-listid=\"12\" aria-setsize=\"-1\" data-aria-posinset=\"3\" data-aria-level=\"1\"><span data-contrast=\"auto\">And\u00a0<\/span><span data-contrast=\"auto\">finally<\/span><span data-contrast=\"auto\">,\u00a0<\/span><span data-contrast=\"auto\">both<\/span><span data-contrast=\"auto\">\u00a0will require to traverse the NAT.\u00a0<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<\/ul>\n<p><span data-contrast=\"auto\">A proper understanding of why these scenarios arise<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">at the first place\u00a0<\/span><span data-contrast=\"auto\">is important.\u00a0<\/span><span data-contrast=\"auto\">The simple reason is Internet has moved beyond the client-server paradigm long ago.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<h4>WebRTC Signaling NAT Traversal<\/h4>\n<p><span data-contrast=\"auto\">Before starting communication between browsers, it needs three things:\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<ul>\n<li data-leveltext=\"\uf0a7\" data-font=\"Wingdings\" data-listid=\"13\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"auto\">Identify\u00a0peers<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0a7\" data-font=\"Wingdings\" data-listid=\"13\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span data-contrast=\"auto\">Exchange session descriptions to setup media ports and IPs<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0a7\" data-font=\"Wingdings\" data-listid=\"13\" aria-setsize=\"-1\" data-aria-posinset=\"3\" data-aria-level=\"1\"><span data-contrast=\"auto\">Information about media data which is imparted through SDP (Session Description Protocol)<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<\/ul>\n<p><span data-contrast=\"auto\">Nowadays, people prefer accessing the web behind firewalls or NAT that masks your original IP address by dynamically changing it. What public at large see the IP can be very different from the original IP of the user<\/span><span data-contrast=\"auto\">\u00a0hidden behind a firewall<\/span><span data-contrast=\"auto\">, and t<\/span><span data-contrast=\"auto\">here are\u00a0<\/span><span data-contrast=\"auto\">some\u00a0<\/span><span data-contrast=\"auto\">devices that blocks the unsolicited traffic toward users\u2019 network.\u00a0<\/span><span data-contrast=\"auto\">S<\/span><span data-contrast=\"auto\">ome enterprises don\u2019t allow any traffic to their network without vetting it. As a result, it is not\u00a0<\/span><span data-contrast=\"auto\">always\u00a0<\/span><span data-contrast=\"auto\">possible to communicate with the peer browser located in the private network.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span> <span data-contrast=\"auto\">That\u2019s where the roles of\u00a0<\/span><span data-contrast=\"auto\">STUN (Session Traversal Utilities for NAT) and TURN (Traversal Using Relays around NAT)\u00a0<\/span><span data-contrast=\"auto\">servers come into\u00a0<\/span><span data-contrast=\"auto\">the\u00a0<\/span><span data-contrast=\"auto\">picture.\u00a0<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span> <span data-contrast=\"auto\">This is how the process goes:\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<ul>\n<li data-leveltext=\"\uf0a7\" data-font=\"Wingdings\" data-listid=\"5\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"auto\">A request for public IP address is sent to STUN\/TURN servers.\u00a0<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0a7\" data-font=\"Wingdings\" data-listid=\"5\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"auto\">Now, this server responds with the IP address\u00a0<\/span><span data-contrast=\"auto\">that<\/span><span data-contrast=\"auto\">\u00a0it perceives correct.\u00a0\u00a0<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0a7\" data-font=\"Wingdings\" data-listid=\"5\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span data-contrast=\"auto\">I<\/span><span data-contrast=\"auto\">t creates a set of Interactive Connectivity Establishment<\/span><span data-contrast=\"auto\">\u00a0(ICE)\u00a0<\/span><span data-contrast=\"auto\">that contains<\/span><span data-contrast=\"auto\">\u00a0IP address, port, and transport protocols.\u00a0\u00a0<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0a7\" data-font=\"Wingdings\" data-listid=\"5\" aria-setsize=\"-1\" data-aria-posinset=\"3\" data-aria-level=\"1\"><span data-contrast=\"auto\">With this information about the public IP and port<\/span><span data-contrast=\"auto\">,<\/span><span data-contrast=\"auto\">\u00a0it easily connects with the peer<\/span><span data-contrast=\"auto\">.\u00a0<\/span><span data-contrast=\"auto\">\u00a0\u00a0<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0a7\" data-font=\"Wingdings\" data-listid=\"5\" aria-setsize=\"-1\" data-aria-posinset=\"4\" data-aria-level=\"1\"><span data-contrast=\"auto\">The peer browser<\/span><span data-contrast=\"auto\">, on the other hand,<\/span><span data-contrast=\"auto\">\u00a0does the same thing while using\u00a0<\/span><span data-contrast=\"auto\">the\u00a0<\/span><span data-contrast=\"auto\">STUN or TURN server.\u00a0\u00a0\u00a0<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<\/ul>\n<p><span data-contrast=\"auto\">Here it is to be noted that\u00a0<\/span><span data-contrast=\"auto\">signalling\u00a0<\/span><span data-contrast=\"auto\">is\u00a0<\/span><span data-contrast=\"auto\">not a\u00a0<\/span><span data-contrast=\"auto\">part of the WebRTC framework<\/span><span data-contrast=\"auto\">,\u00a0<\/span><span data-contrast=\"auto\">it was left out\u00a0<\/span><span data-contrast=\"auto\">for valid reasons<\/span><span data-contrast=\"auto\">. D<\/span><span data-contrast=\"auto\">ifferent applications might need different protocols and the working group\u00a0<\/span><span data-contrast=\"auto\">for WebRTC\u00a0<\/span><span data-contrast=\"auto\">did not want to\u00a0<\/span><span data-contrast=\"auto\">limit\u00a0<\/span><span data-contrast=\"auto\">the choices for developers<\/span><span data-contrast=\"auto\">.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<h3>3. RTCDataChannel<\/h3>\n<p><span data-contrast=\"none\">Apart from audio and video, WebRTC manages the\u00a0<\/span><span data-contrast=\"none\">bidirectional\u00a0<\/span><span data-contrast=\"none\">transmission of arbitrary data including text chats, games, and other files through RTC DataChannel API. Every data channel is connected\u00a0<\/span><span data-contrast=\"none\">through this API.\u00a0\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<h2>Summing up\u2026<span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/h2>\n<p><span data-contrast=\"none\">The importance of WebRTC in peer-to-peer communication is obvious,\u00a0<\/span><span data-contrast=\"none\">but<\/span><span data-contrast=\"none\">\u00a0multiple\u00a0<\/span><span data-contrast=\"none\">factors\u00a0<\/span><span data-contrast=\"none\">like<\/span><span data-contrast=\"none\">\u00a0Multiple Conferencing Unit (MCU)<\/span><span data-contrast=\"none\">, multitenancy<\/span><span data-contrast=\"none\">, SIP integration<\/span><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">need to be\u00a0taken i<\/span><span data-contrast=\"none\">nto account\u00a0while building a\u00a0<\/span><span data-contrast=\"none\">reliable, robust, and scalable\u00a0<\/span><span data-contrast=\"none\">video calling solution. For developers,\u00a0<\/span><span data-contrast=\"none\">there is a better way to b<\/span><span data-contrast=\"none\">uild\u00a0<\/span><span data-contrast=\"none\">a video calling solution\u2014they can\u00a0<\/span><span data-contrast=\"none\">opt\u00a0<\/span><span data-contrast=\"none\">for a\u00a0<\/span><a href=\"https:\/\/www.enablex.io\/cpaas\/\" target=\"_blank\" rel=\"noopener\"><span data-contrast=\"none\">CPaaS<\/span><\/a><span data-contrast=\"none\">\u00a0service provider\u00a0<\/span><span data-contrast=\"none\">like\u00a0<\/span><span data-contrast=\"none\">Enable<\/span><span data-contrast=\"none\">X<\/span><span data-contrast=\"none\"> that offers all features, building blocks, and SDKs to build exciting and scalable video calling solutions.\u00a0<\/span> To try it out, simply\u00a0<a href=\"https:\/\/portal.enablex.io\/cpaas\/trial-sign-up\/\">sign up here for free<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The world of web-based communication is changing at the speed you might not even imagine.\u00a0\u00a0Now, for making a video conferencing call, sharing a file\u2014all that you\u00a0need\u00a0is a\u00a0URL, thanks to the power of\u00a0WebRTC\u00a0for opening the door of infinite possibilities for\u00a0developers and businesses.\u00a0\u00a0\u00a0\u00a0\u00a0 Developed by Google in 2011\u00a0as an\u00a0open-source\u00a0framework\u00a0comprising standards, protocols,\u00a0and JavaScript APIs, WebRTC\u00a0or Web Real&#8211;Time Communications &#8230;<\/p>\n","protected":false},"author":25,"featured_media":1521,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[122,23,93,110],"tags":[138,30,137,47],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>WebRTC Explained: What It Is and How It Works<\/title>\n<meta name=\"description\" content=\"Learn what WebRTC is, how it enables real-time video, audio, and data communication, and why it&#039;s key to modern web and mobile apps.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.enablex.io\/insights\/what-is-webrtc-and-how-it-works\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WebRTC Explained: What It Is and How It Works\" \/>\n<meta property=\"og:description\" content=\"Learn what WebRTC is, how it enables real-time video, audio, and data communication, and why it&#039;s key to modern web and mobile apps.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.enablex.io\/insights\/what-is-webrtc-and-how-it-works\/\" \/>\n<meta property=\"og:site_name\" content=\"Insights about video API, SMS API; WhatsApp for Business API\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-22T01:40:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-05T04:19:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.enablex.io\/insights\/wp-content\/uploads\/2021\/03\/WEBRTC-Insight-Image.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1201\" \/>\n\t<meta property=\"og:image:height\" content=\"423\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Jason Wills\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@enablexio\" \/>\n<meta name=\"twitter:site\" content=\"@enablexio\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jason Wills\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WebRTC Explained: What It Is and How It Works","description":"Learn what WebRTC is, how it enables real-time video, audio, and data communication, and why it's key to modern web and mobile apps.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.enablex.io\/insights\/what-is-webrtc-and-how-it-works\/","og_locale":"en_US","og_type":"article","og_title":"WebRTC Explained: What It Is and How It Works","og_description":"Learn what WebRTC is, how it enables real-time video, audio, and data communication, and why it's key to modern web and mobile apps.","og_url":"https:\/\/www.enablex.io\/insights\/what-is-webrtc-and-how-it-works\/","og_site_name":"Insights about video API, SMS API; WhatsApp for Business API","article_published_time":"2021-03-22T01:40:53+00:00","article_modified_time":"2025-08-05T04:19:44+00:00","og_image":[{"width":1201,"height":423,"url":"https:\/\/www.enablex.io\/insights\/wp-content\/uploads\/2021\/03\/WEBRTC-Insight-Image.png","type":"image\/png"}],"author":"Jason Wills","twitter_card":"summary_large_image","twitter_creator":"@enablexio","twitter_site":"@enablexio","twitter_misc":{"Written by":"Jason Wills","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.enablex.io\/insights\/what-is-webrtc-and-how-it-works\/#article","isPartOf":{"@id":"https:\/\/www.enablex.io\/insights\/what-is-webrtc-and-how-it-works\/"},"author":{"name":"Jason Wills","@id":"https:\/\/www.enablex.io\/insights\/#\/schema\/person\/422d2b153c3c96827da141c6446d11a3"},"headline":"What is WebRTC And How It Works","datePublished":"2021-03-22T01:40:53+00:00","dateModified":"2025-08-05T04:19:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.enablex.io\/insights\/what-is-webrtc-and-how-it-works\/"},"wordCount":1125,"publisher":{"@id":"https:\/\/www.enablex.io\/insights\/#organization"},"keywords":["video api","video call","video sdk","webrtc"],"articleSection":["Communication APIs","TechTalks","Video API","WebRTC"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.enablex.io\/insights\/what-is-webrtc-and-how-it-works\/","url":"https:\/\/www.enablex.io\/insights\/what-is-webrtc-and-how-it-works\/","name":"WebRTC Explained: What It Is and How It Works","isPartOf":{"@id":"https:\/\/www.enablex.io\/insights\/#website"},"datePublished":"2021-03-22T01:40:53+00:00","dateModified":"2025-08-05T04:19:44+00:00","description":"Learn what WebRTC is, how it enables real-time video, audio, and data communication, and why it's key to modern web and mobile apps.","breadcrumb":{"@id":"https:\/\/www.enablex.io\/insights\/what-is-webrtc-and-how-it-works\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.enablex.io\/insights\/what-is-webrtc-and-how-it-works\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.enablex.io\/insights\/what-is-webrtc-and-how-it-works\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.enablex.io\/insights\/"},{"@type":"ListItem","position":2,"name":"What is WebRTC And How It Works"}]},{"@type":"WebSite","@id":"https:\/\/www.enablex.io\/insights\/#website","url":"https:\/\/www.enablex.io\/insights\/","name":"Enablex","description":"","publisher":{"@id":"https:\/\/www.enablex.io\/insights\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.enablex.io\/insights\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.enablex.io\/insights\/#organization","name":"Enablex","url":"https:\/\/www.enablex.io\/insights\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.enablex.io\/insights\/#\/schema\/logo\/image\/","url":"https:\/\/www.enablex.io\/insights\/wp-content\/uploads\/2023\/05\/EnableX-Logo-01.png","contentUrl":"https:\/\/www.enablex.io\/insights\/wp-content\/uploads\/2023\/05\/EnableX-Logo-01.png","width":17382,"height":3567,"caption":"Enablex"},"image":{"@id":"https:\/\/www.enablex.io\/insights\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/twitter.com\/enablexio","https:\/\/www.linkedin.com\/company\/vcloudx"]},{"@type":"Person","@id":"https:\/\/www.enablex.io\/insights\/#\/schema\/person\/422d2b153c3c96827da141c6446d11a3","name":"Jason Wills","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.enablex.io\/insights\/#\/schema\/person\/image\/","url":"https:\/\/www.enablex.io\/insights\/wp-content\/uploads\/2025\/05\/envato-labs-ai-f14f6981-d7f8-4c3e-9234-00323c7d5ca0-96x96.jpg","contentUrl":"https:\/\/www.enablex.io\/insights\/wp-content\/uploads\/2025\/05\/envato-labs-ai-f14f6981-d7f8-4c3e-9234-00323c7d5ca0-96x96.jpg","caption":"Jason Wills"},"description":"Jason works behind the scenes at EnableX, helping to turn complex tech into practical tools that developers and businesses can actually use. With several years of experience in product development and platform architecture, he focuses on making communication technologies simpler, smarter and easier to build with. Whether he's writing step-by-step guides, product tips or explaining how our APIs work, Jason keeps things clear and useful.","sameAs":["https:\/\/www.enablex.io\/","https:\/\/www.linkedin.com\/company\/vcloudx\/"],"url":"https:\/\/www.enablex.io\/insights\/author\/jason-wills\/"}]}},"_links":{"self":[{"href":"https:\/\/www.enablex.io\/insights\/wp-json\/wp\/v2\/posts\/1519"}],"collection":[{"href":"https:\/\/www.enablex.io\/insights\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.enablex.io\/insights\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.enablex.io\/insights\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/www.enablex.io\/insights\/wp-json\/wp\/v2\/comments?post=1519"}],"version-history":[{"count":0,"href":"https:\/\/www.enablex.io\/insights\/wp-json\/wp\/v2\/posts\/1519\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.enablex.io\/insights\/wp-json\/wp\/v2\/media\/1521"}],"wp:attachment":[{"href":"https:\/\/www.enablex.io\/insights\/wp-json\/wp\/v2\/media?parent=1519"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.enablex.io\/insights\/wp-json\/wp\/v2\/categories?post=1519"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.enablex.io\/insights\/wp-json\/wp\/v2\/tags?post=1519"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}