{"id":390,"date":"2022-10-03T20:19:25","date_gmt":"2022-10-03T20:19:25","guid":{"rendered":"https:\/\/infobip.com\/developers\/?p=390"},"modified":"2023-09-11T14:34:13","modified_gmt":"2023-09-11T14:34:13","slug":"connect-two-calls-in-a-conference-with-infobip-calls-api","status":"publish","type":"post","link":"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api","title":{"rendered":"Connect two calls in a conference with Infobip Calls API"},"content":{"rendered":"\n<p>Have you heard about our latest addition to the Infobip API family, Calls? Our flexible and granular API has been designed to cater to any voice scenario you can think of without compromising performance.<\/p>\n\n\n\n<p>Its granularity allows you to design your user journey exactly how you had it in mind. You don&#8217;t have to adapt to a particular scenario dictated by an API infrastructure.<\/p>\n\n\n\n<p>In this blog post, we will discuss how to use the Calls API to make a one-on-one call using the conferencing feature.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Use case overview<\/strong><\/h2>\n\n\n\n<p>Let&#8217;s use the Calls API to recreate the following scenario:<\/p>\n\n\n\n<p class=\"has-text-align-center\">&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n\n\n\n<p class=\"p.double {border-style: double;}\">A user calls a DID number and an application accepts the call. The application then creates a conference room and moves the call there. The user is informed that another call is being connected. While waiting for the second party to join the call, they can enjoy some music. In the meantime, the application makes a call to the other party. If they answer the call, the music stops, and both users can have a conversation. However, if the party doesn&#8217;t answer the call, the music stops and the first caller is informed that the other party was not able to join. The call than terminates.<\/p>\n\n\n\n<p class=\"has-text-align-center\">&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Tools you need\">Tools you need<\/h2>\n\n\n\n<p>You&#8217;ll need an active <a href=\"https:\/\/portal.infobip.com\/login\/\">Infobip account<\/a> with an enabled Voice channel. You should also have your own application. However, if you want to test the Calls API without developing an application, use any online webhook simulator, like Beeceptor or Mocky.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Prepare your app to work with Infobip\">Prepare your app to work with Infobip<\/h2>\n\n\n\n<p>To set up the Infobip environment, you&#8217;ll need to do these three things:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Declare the application you&#8217;re going to use.<\/li>\n\n\n\n<li>Set up an authentication method (HMAC or Basic).<\/li>\n\n\n\n<li>Expose the following webhooks: <code>receiveUrl<\/code> and <code>eventUrl<\/code>.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><code>receiveUrl<\/code> &#8212;&gt; receives all <code>CALL_RECEIVED<\/code> events.<\/p>\n\n\n\n<p><code>eventUrl<\/code> &#8212;-&gt; catches all events you have subscribed your app to.<\/p>\n<\/blockquote>\n\n\n\n<p>Use the <code>subscribedEvents<\/code> field to pass the events you want to subscribe your app to. That way the Infobip platform knows which events it needs to send to the app.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>curl -L -g -X POST &#39;https:\/\/{baseUrl}\/calls\/1\/applications&#39; \\\n-H &#39;Authorization: {authorization}&#39; \\\n-H &#39;Content-Type: application\/json&#39; \\\n-H &#39;Accept: application\/json&#39; \\\n--data-raw &#39;{\n  &quot;name&quot;: &quot;Example application&quot;,\n  &quot;subscribedEvents&quot;: [\n    &quot;CALL_RECEIVED&quot;,\n    &quot;CALL_RINGING&quot;,\n    &quot;CALL_ESTABLISHED&quot;,\n    &quot;CALL_FINISHED&quot;,\n    &quot;CALL_FAILED&quot;,\n    &quot;CONFERENCE_CREATED&quot;,\n    &quot;CONFERENCE_FINISHED&quot;,\n    &quot;PARTICIPANT_JOIN_FAILED&quot;,\n    &quot;PARTICIPANT_JOINED&quot;,\n    &quot;PARTICIPANT_JOINING&quot;,\n    &quot;PARTICIPANT_REMOVED&quot;,\n    &quot;PLAY_FINISHED&quot;,\n    &quot;SAY_FINISHED&quot;\n  ],\n  &quot;webhook&quot;: {\n    &quot;receiveUrl&quot;: &quot;https:\/\/www.example.com\/receive&quot;,\n    &quot;eventUrl&quot;: &quot;https:\/\/www.example.com\/event&quot;\n  }\n}&#39;<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Key points<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>baseUrl<\/code> is a custom URL you&#8217;ll see in your Infobip account where you can also grab the API Key.<\/li>\n\n\n\n<li>Familiarize yourself with the complete list of events to which you can subscribe your app.<\/li>\n<\/ul>\n\n\n\n<p>The response will contain <code>applicationId<\/code>  which you will then use for creating calls.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Answer a call and add it to a conference\">Answer a call and add it to a conference<\/h2>\n\n\n\n<p>In our scenario, it is the end user who calls the application, so we need to prepare it to answer a call. The app will first receive a <a href=\"https:\/\/www.infobip.com\/docs\/api\/channels\/voice\/calls\/calls-applications\/receive-calls-event\"><code>CALL_RECEIVED<\/code> event<\/a> on its <code>receiveUrl<\/code>.<\/p>\n\n\n\n<p>Then, it will extract the <code>callId<\/code>  from the event, and pass it as a path parameter it in the <code>POST answer<\/code>  method, which should leave you with a <code>200OK<\/code> response with a status <code>IN_PROGRESS<\/code>.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>curl -L -g -X POST &#39;https:\/\/{baseUrl}\/calls\/1\/calls\/{callId}\/answer&#39; \\\n-H &#39;Authorization: {authorization}&#39; \\\n-H &#39;Content-Type: application\/json&#39; \\\n-H &#39;Accept: application\/json&#39; \\\n--data-raw &#39;{}&#39;<\/code><\/pre><\/div>\n\n\n\n<p>Once the call is live, we would have to transfer it into a conference. To do that, we need to first create one, and then add a call to it.<\/p>\n\n\n\n<p>To create a conference, simply pass your application ID and give it a name. Make sure you do that, as otherwise, the name will be autogenerated.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>curl -L -g -X POST &#39;https:\/\/{baseUrl}\/calls\/1\/conferences&#39; \\\n-H &#39;Authorization: {authorization}&#39; \\\n-H &#39;Content-Type: application\/json&#39; \\\n-H &#39;Accept: application\/json&#39; \\\n--data-raw &#39;{\n  &quot;name&quot;: &quot;Example conference&quot;,\n  &quot;applicationId&quot;: &quot;61c060db2675060027d8c7a6&quot;\n}&#39;<\/code><\/pre><\/div>\n\n\n\n<p>Once the conference is created and you got its id from the response, use it to add an existing inbound call. All you need to do is to pass the conference ID and the call ID as path parameters.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>curl -L -g -X POST &#39;https:\/\/{baseUrl}\/calls\/1\/conferences\/{conferenceId}\/call\/{callId}&#39; \\\n-H &#39;Authorization: {authorization}&#39; \\\n-H &#39;Content-Type: application\/json&#39; \\\n-H &#39;Accept: application\/json&#39;<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Interact with the caller on the conference\">Interact with the caller during the conference<\/h2>\n\n\n\n<p>First and foremost, we want to make sure that the caller has joined the call successfully. To do so, we need to ensure we have received a <code>PARTICIPANT_JOINED<\/code> event that confirms it. Knowing that the caller is in the conference, we want to inform them that we are trying to connect another call. Finally, to make the waiting time pleasant, we want to play some relaxing whale sounds while the caller&#8217;s waiting.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Use text-to-speech messaging to inform the caller about the call connect attempt.<\/li>\n<\/ol>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>curl -L -g -X POST &#39;https:\/\/{baseUrl}\/calls\/1\/calls\/{callId}\/say&#39; \\\n-H &#39;Authorization: {authorization}&#39; \\\n-H &#39;Content-Type: application\/json&#39; \\\n-H &#39;Accept: application\/json&#39; \\\n--data-raw &#39;{\n  &quot;text&quot;: &quot;Hello, we are trying to connect another caller to this conference. Please wait and enjoy the sounds of nature.&quot;,\n  &quot;language&quot;: &quot;en&quot;\n}&#39;<\/code><\/pre><\/div>\n\n\n\n<p>As we want to be sure that our Say action has been completed, will wait for the <code>PLAY_FINISHED<\/code> event to arrive to our application, before we can proceed to the next action.<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Once we&#8217;re sure that the previous action is complete, we can add another one. We want to share some joyful nature sounds to make the waiting time easy peasy API squeezy. \ud83d\ude09 What you need here, is the call ID and a URL of the track you want to play or a file ID of the previously uploaded file in WAV format. If you&#8217;re worried that your track is too short, you can always set the <code>loopCount<\/code>  parameter to specify how many times in a row the track should be played.<\/li>\n<\/ol>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>curl -L -g -X POST &#39;https:\/\/{baseUrl}\/calls\/1\/calls\/{callId}\/play&#39; \\\n-H &#39;Authorization: {authorization}&#39; \\\n-H &#39;Content-Type: application\/json&#39; \\\n-H &#39;Accept: application\/json&#39; \\\n--data-raw &#39;{\n  &quot;loopCount&quot;: 3,\n  &quot;content&quot;: {\n    &quot;fileId&quot;: &quot;a8b4cc89-a2d7-4a4c-adaf-c7d921b9f52a&quot;,\n    &quot;type&quot;: &quot;FILE&quot;\n  }\n}&#39;<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Connect another party\">Connect another party<\/h2>\n\n\n\n<p>Your original caller is happily waiting. You can now try to connect another party and add them to the conference. <\/p>\n\n\n\n<p>While you&#8217;re at it, remember to also cater to the possibility that they may not pick up. If that happens, you&#8217;ll need to inform the caller about it and terminate the conference.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Add a new call to the conference<\/h3>\n\n\n\n<p>Let&#8217;s start with adding a new call to the conference we have just created and setting up a timeout period. After this specified period, the call is dropped if the other party doesn&#8217;t pick up. <\/p>\n\n\n\n<p>We will use the <code>connectTimeout<\/code>  field to set up the number of seconds to wait before dropping the call.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>curl -L -g -X POST &#39;https:\/\/{baseUrl}\/calls\/1\/conferences\/{conferenceId}\/call&#39; \\\n-H &#39;Authorization: {authorization}&#39; \\\n-H &#39;Content-Type: application\/json&#39; \\\n-H &#39;Accept: application\/json&#39; \\\n--data-raw &#39;{\n  &quot;callRequest&quot;: {\n    &quot;endpoint&quot;: {\n      &quot;type&quot;: &quot;PHONE&quot;,\n      &quot;phoneNumber&quot;: &quot;447415784323&quot;\n    },\n    &quot;applicationId&quot;:&quot;61e983736574eb453b06c922&quot;,\n    &quot;from&quot;: &quot;4592457976&quot;,\n    &quot;connectTimeout&quot;: 60\n  }\n}&#39;<\/code><\/pre><\/div>\n\n\n\n<p>The response we&#8217;ll get from this method will include the <code>callId<\/code> for the new call. <\/p>\n\n\n\n<p>Once generated, all subsequent events received by the application can now be related to the original inbound call or to the new outbound call.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Stop playing music for the first caller<\/h3>\n\n\n\n<p>Regardless of whether the call is answered or not, we need to stop playing music for the first caller. We can also inform them that the other party is joining or is not joining the call. <\/p>\n\n\n\n<p>To learn about the call status, we&#8217;re going to wait for the events the Infobip platform will send to our application, which in this particular case would be either a <code>PARTICIPANT_JOINED<\/code> or <code>PARTICIPANT_JOINED_FAILED<\/code> event. <\/p>\n\n\n\n<p>We can then verify the payload of these events to check whether their <code>callId<\/code>  matches the <code>callId<\/code>  of the new call we&#8217;ve requested.<\/p>\n\n\n\n<p>To stop playing music, we will fire the <code>POST stop-play<\/code> endpoint providing the conference ID as a path parameter.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>curl -L -g -X POST &#39;https:\/\/{baseUrl}\/calls\/1\/conferences\/{conferenceId}\/stop-play&#39; \\\n-H &#39;Authorization: {authorization}&#39; \\\n-H &#39;Content-Type: application\/json&#39; \\\n-H &#39;Accept: application\/json&#39;<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Inform the caller of the call status<\/h3>\n\n\n\n<p>Next, once the whales have stopped sparking joy in the original caller and we&#8217;ve received a <code>PLAY_FINISHED<\/code> event, we can proceed to the next action and inform the caller that another party is joining the call.<\/p>\n\n\n\n<p>Alternatively, in the case of the <code>PARTICIPANT_JOINED_FAILED<\/code> event, we can inform them that the party has not picked up, and the conference will be terminated. We&#8217;ll use the <code>POST say<\/code> method, we&#8217;ve used before for both scenarios.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>curl -L -g -X POST &#39;https:\/\/{baseUrl}\/calls\/1\/calls\/{callId}\/say&#39; \\\n-H &#39;Authorization: {authorization}&#39; \\\n-H &#39;Content-Type: application\/json&#39; \\\n-H &#39;Accept: application\/json&#39; \\\n--data-raw &#39;{\n  &quot;text&quot;: &quot;Another caller is joining the call now.&quot;,\n  &quot;language&quot;: &quot;en&quot;\n}&#39;<\/code><\/pre><\/div>\n\n\n\n<p>And finally, as part of the scenario when the second party has not picked up, we will need to terminate the conference with the <code>POST hangup<\/code> method. <\/p>\n\n\n\n<p>You don&#8217;t have to use this method if the conference actually happened. Once all callers hang up, the conference is automatically terminated.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>curl -L -g -X POST &#39;https:\/\/{baseUrl}\/calls\/1\/conferences\/{conferenceId}\/hangup&#39; \\\n-H &#39;Authorization: {authorization}&#39; \\\n-H &#39;Content-Type: application\/json&#39; \\\n-H &#39;Accept: application\/json&#39;<\/code><\/pre><\/div>\n\n\n\n<p>And that&#8217;s basically it! <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">To sum up!<\/h2>\n\n\n\n<p>As you can see, there are a lot of possible scenarios you can explore with this use case that we haven&#8217;t delved into in this post. <\/p>\n\n\n\n<p>You can record the conference. Choose the accent or the gender of your text-to-speech message. Add logic for muting a caller so that they can&#8217;t speak. Or you can deafen them so that they can&#8217;t hear other participants. <\/p>\n\n\n\n<p>In the case of Calls API, the world is your oyster! <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Have you heard about our latest addition to the [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"||\n|----------|\n|A user calls a DID number and an application accepts the call. The application then creates a conference room and moves the call there. The user is informed that another call is being connected and they hear music while waiting for the second party to join the call. In the meantime, the application makes a call to the other party and if they answer the call, the music stops, and both users can have a conversation. However, if the party doesn't answer the call, the music stops and the first caller is informed that the other party was not able to join, and the call terminates.|","footnotes":""},"categories":[28,255],"tags":[43],"coauthors":[134],"class_list":["post-390","post","type-post","status-publish","format-standard","hentry","category-blog-post","category-infobip-products","tag-api"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Connect Two Calls in a Conference with Infobip Calls API | Infobip Developers Hub<\/title>\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.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Connect Two Calls in a Conference with Infobip Calls API | Infobip Developers Hub\" \/>\n<meta property=\"og:description\" content=\"Have you heard about our latest addition to the [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api\" \/>\n<meta property=\"og:site_name\" content=\"Infobip Developers Hub\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/infobip\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-10-03T20:19:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-11T14:34:13+00:00\" \/>\n<meta name=\"author\" content=\"Joanna Suau\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@JoannaSuau\" \/>\n<meta name=\"twitter:site\" content=\"@InfobipDev\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joanna Suau\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api\"},\"author\":{\"name\":\"Joanna Suau\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/707842627f046bb5722c37a9fdc85d62\"},\"headline\":\"Connect two calls in a conference with Infobip Calls API\",\"datePublished\":\"2022-10-03T20:19:25+00:00\",\"dateModified\":\"2023-09-11T14:34:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api\"},\"wordCount\":1238,\"publisher\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#organization\"},\"keywords\":[\"API\"],\"articleSection\":[\"Blog Post\",\"Infobip Products\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api\",\"url\":\"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api\",\"name\":\"Connect Two Calls in a Conference with Infobip Calls API | Infobip Developers Hub\",\"isPartOf\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#website\"},\"datePublished\":\"2022-10-03T20:19:25+00:00\",\"dateModified\":\"2023-09-11T14:34:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.infobip.com\/developers\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Connect two calls in a conference with Infobip Calls API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#website\",\"url\":\"https:\/\/www.infobip.com\/developers\/\",\"name\":\"Infobip Developers Hub\",\"description\":\"Build meaningful customer relationships across any channel\",\"publisher\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.infobip.com\/developers\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#organization\",\"name\":\"Infobip Developers Hub\",\"url\":\"https:\/\/www.infobip.com\/developers\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png\",\"contentUrl\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png\",\"width\":696,\"height\":696,\"caption\":\"Infobip Developers Hub\"},\"image\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/infobip\/\",\"https:\/\/x.com\/InfobipDev\",\"https:\/\/www.youtube.com\/channel\/UCUPSTy53VecI5GIir3J3ZbQ\",\"https:\/\/github.com\/infobip-community\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/707842627f046bb5722c37a9fdc85d62\",\"name\":\"Joanna Suau\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/image\/cccb05b0dfa8fde5d00a09f4047f929e\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b632afa61f1a27c1a0d823a9ec17eeb047cf476c570012dd90ba88a1bb9b1585?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b632afa61f1a27c1a0d823a9ec17eeb047cf476c570012dd90ba88a1bb9b1585?s=96&d=mm&r=g\",\"caption\":\"Joanna Suau\"},\"description\":\"Joanna is a Developer Educator at Infobip, working in the Developer Relations team.\",\"sameAs\":[\"https:\/\/medium.com\/@joanna.suau\",\"https:\/\/www.linkedin.com\/in\/joannasuau\/\",\"https:\/\/x.com\/JoannaSuau\"],\"url\":\"https:\/\/www.infobip.com\/developers\/blog\/author\/joanna\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Connect Two Calls in a Conference with Infobip Calls API | Infobip Developers Hub","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.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api","og_locale":"en_US","og_type":"article","og_title":"Connect Two Calls in a Conference with Infobip Calls API | Infobip Developers Hub","og_description":"Have you heard about our latest addition to the [&hellip;]","og_url":"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api","og_site_name":"Infobip Developers Hub","article_publisher":"https:\/\/www.facebook.com\/infobip\/","article_published_time":"2022-10-03T20:19:25+00:00","article_modified_time":"2023-09-11T14:34:13+00:00","author":"Joanna Suau","twitter_card":"summary_large_image","twitter_creator":"@JoannaSuau","twitter_site":"@InfobipDev","twitter_misc":{"Written by":"Joanna Suau","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api#article","isPartOf":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api"},"author":{"name":"Joanna Suau","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/707842627f046bb5722c37a9fdc85d62"},"headline":"Connect two calls in a conference with Infobip Calls API","datePublished":"2022-10-03T20:19:25+00:00","dateModified":"2023-09-11T14:34:13+00:00","mainEntityOfPage":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api"},"wordCount":1238,"publisher":{"@id":"https:\/\/www.infobip.com\/developers\/#organization"},"keywords":["API"],"articleSection":["Blog Post","Infobip Products"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api","url":"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api","name":"Connect Two Calls in a Conference with Infobip Calls API | Infobip Developers Hub","isPartOf":{"@id":"https:\/\/www.infobip.com\/developers\/#website"},"datePublished":"2022-10-03T20:19:25+00:00","dateModified":"2023-09-11T14:34:13+00:00","breadcrumb":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.infobip.com\/developers\/blog\/connect-two-calls-in-a-conference-with-infobip-calls-api#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.infobip.com\/developers\/"},{"@type":"ListItem","position":2,"name":"Connect two calls in a conference with Infobip Calls API"}]},{"@type":"WebSite","@id":"https:\/\/www.infobip.com\/developers\/#website","url":"https:\/\/www.infobip.com\/developers\/","name":"Infobip Developers Hub","description":"Build meaningful customer relationships across any channel","publisher":{"@id":"https:\/\/www.infobip.com\/developers\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.infobip.com\/developers\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.infobip.com\/developers\/#organization","name":"Infobip Developers Hub","url":"https:\/\/www.infobip.com\/developers\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/","url":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png","contentUrl":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png","width":696,"height":696,"caption":"Infobip Developers Hub"},"image":{"@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/infobip\/","https:\/\/x.com\/InfobipDev","https:\/\/www.youtube.com\/channel\/UCUPSTy53VecI5GIir3J3ZbQ","https:\/\/github.com\/infobip-community"]},{"@type":"Person","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/707842627f046bb5722c37a9fdc85d62","name":"Joanna Suau","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/image\/cccb05b0dfa8fde5d00a09f4047f929e","url":"https:\/\/secure.gravatar.com\/avatar\/b632afa61f1a27c1a0d823a9ec17eeb047cf476c570012dd90ba88a1bb9b1585?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b632afa61f1a27c1a0d823a9ec17eeb047cf476c570012dd90ba88a1bb9b1585?s=96&d=mm&r=g","caption":"Joanna Suau"},"description":"Joanna is a Developer Educator at Infobip, working in the Developer Relations team.","sameAs":["https:\/\/medium.com\/@joanna.suau","https:\/\/www.linkedin.com\/in\/joannasuau\/","https:\/\/x.com\/JoannaSuau"],"url":"https:\/\/www.infobip.com\/developers\/blog\/author\/joanna"}]}},"_links":{"self":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts\/390","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/comments?post=390"}],"version-history":[{"count":19,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts\/390\/revisions"}],"predecessor-version":[{"id":2541,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts\/390\/revisions\/2541"}],"wp:attachment":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/media?parent=390"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/categories?post=390"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/tags?post=390"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/coauthors?post=390"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}