{"id":1063,"date":"2021-04-05T11:49:13","date_gmt":"2021-04-05T18:49:13","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/azure-sdk\/?p=1063"},"modified":"2021-04-16T10:12:07","modified_gmt":"2021-04-16T17:12:07","slug":"communication-services-ga","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/azure-sdk\/communication-services-ga\/","title":{"rendered":"Announcing the new Azure Communication Services Libraries GA"},"content":{"rendered":"<p>Today, we\u2019re excited to announce that the <a href=\"https:\/\/azure.microsoft.com\/services\/communication-services\/\"><strong>Azure Communication Services<\/strong><\/a> is generally available. Developers can now add chat, voice calling, video calling, traditional telephone calling, SMS messaging, and other forms of real-time communication to their applications using the same technology that powers Microsoft Teams. Interoperability with Microsoft Teams is also supported (<a href=\"https:\/\/docs.microsoft.com\/azure\/communication-services\/concepts\/teams-interop\">public preview<\/a>).<\/p>\n<p>We recently showcased Azure Communication Services at Microsoft Ignite. To see how these services work together, you can watch our feature sessions here:<\/p>\n<ul>\n<li><a href=\"https:\/\/myignite.microsoft.com\/sessions\/5685db58-004f-4d85-a6ed-1a8860c6a708?source=sessions\">Ignite On-Demand: Accelerating digital customer engagement with Azure Communication Services<\/a><\/li>\n<li><a href=\"https:\/\/myignite.microsoft.com\/sessions\/fca3cb5a-2c9c-4918-8bd6-e9cba036aac6?source=sessions\">Ignite Ask the Experts: Accelerating digital customer engagement with Azure Communication Services<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=apBX7ASurgM&amp;t=147s\">Microsoft Mechanics: Azure Communication Services Updates<\/a><\/li>\n<\/ul>\n<h2>SDK Availability<\/h2>\n<p>The Azure Communication Services development experience is divided into several composable client libraries that support a wide array of platforms and languages:<\/p>\n<table>\n<thead>\n<tr>\n<th>Area<\/th>\n<th>JavaScript<\/th>\n<th>.NET<\/th>\n<th>Python<\/th>\n<th>Java SE<\/th>\n<th>iOS*<\/th>\n<th>Android*<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Common<\/td>\n<td><a href=\"https:\/\/www.npmjs.com\/package\/@azure\/communication-common\">npm<\/a><\/td>\n<td><a href=\"https:\/\/www.nuget.org\/packages\/Azure.Communication.Common\/\">nuget<\/a><\/td>\n<td>&#8211;<\/td>\n<td><a href=\"https:\/\/search.maven.org\/artifact\/com.azure\/azure-communication-common\">Maven<\/a><\/td>\n<td><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-ios\/releases\/\">GitHub<\/a><\/td>\n<td><a href=\"https:\/\/search.maven.org\/artifact\/com.azure.android\/azure-communication-common\">Maven<\/a><\/td>\n<\/tr>\n<tr>\n<td>Phone Numbers**<\/td>\n<td><a href=\"https:\/\/www.npmjs.com\/package\/@azure\/communication-phone-numbers\">npm<\/a><\/td>\n<td><a href=\"https:\/\/www.nuget.org\/packages\/Azure.Communication.phonenumbers\">nuget<\/a><\/td>\n<td><a href=\"https:\/\/pypi.org\/project\/azure-communication-phonenumbers\/\">PyPi<\/a><\/td>\n<td><a href=\"https:\/\/search.maven.org\/artifact\/com.azure\/azure-communication-phonenumbers\">Maven<\/a><\/td>\n<td>&#8211;<\/td>\n<td>&#8211;<\/td>\n<\/tr>\n<tr>\n<td>Chat<\/td>\n<td><a href=\"https:\/\/www.npmjs.com\/package\/@azure\/communication-chat\">npm<\/a><\/td>\n<td><a href=\"https:\/\/www.nuget.org\/packages\/Azure.Communication.Chat\">nuget<\/a><\/td>\n<td><a href=\"https:\/\/pypi.org\/project\/azure-communication-chat\/\">PyPi<\/a><\/td>\n<td><a href=\"https:\/\/search.maven.org\/artifact\/com.azure\/azure-communication-chat\">Maven<\/a><\/td>\n<td><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-ios\/releases\">GitHub<\/a><\/td>\n<td><a href=\"https:\/\/search.maven.org\/artifact\/com.azure.android\/azure-communication-chat\">Maven<\/a><\/td>\n<\/tr>\n<tr>\n<td>SMS<\/td>\n<td><a href=\"https:\/\/www.npmjs.com\/package\/@azure\/communication-sms\">npm<\/a><\/td>\n<td><a href=\"https:\/\/www.nuget.org\/packages\/Azure.Communication.Sms\">nuget<\/a><\/td>\n<td><a href=\"https:\/\/pypi.org\/project\/azure-communication-sms\/\">PyPi<\/a><\/td>\n<td><a href=\"https:\/\/search.maven.org\/artifact\/com.azure\/azure-communication-sms\">Maven<\/a><\/td>\n<td>&#8211;<\/td>\n<td>&#8211;<\/td>\n<\/tr>\n<tr>\n<td>Calling<\/td>\n<td><a href=\"https:\/\/www.npmjs.com\/package\/@azure\/communication-calling\">npm<\/a><\/td>\n<td>&#8211;<\/td>\n<td>&#8211;<\/td>\n<td>&#8211;<\/td>\n<td><a href=\"https:\/\/github.com\/Azure\/Communication\/releases\/\">GitHub<\/a><\/td>\n<td><a href=\"https:\/\/search.maven.org\/artifact\/com.azure.android\/azure-communication-calling\/\">Maven<\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>**All mobile SDKs (Android and iOS) are under public preview mode.*<\/p>\n<p>**<em>Phone numbers SDKs (JavaScript\/TypeScript, .NET, Python, &amp; Java) are under public preview mode.<\/em><\/p>\n<h3>Identity<\/h3>\n<p>You can create identities with the Azure Communication Services Identity library and assign them to your users. An identity serves as an identifier in conversations and is used to create access tokens. The same identity can participate in multiple simultaneous sessions across multiple devices. An identity can also have multiple active access tokens at the same time.<\/p>\n<p><strong>The Identity library is only used by Calling features and Chat features.<\/strong><\/p>\n<h4>Key concepts<\/h4>\n<p><code>CommunicationIdentityClient<\/code> is used to create user identities and to create and revoke tokens associated with those identities. There are currently three ways to create it (<code>CommunicationIdentityClient<\/code>):<\/p>\n<p>The identity client can be authenticated using a connection string acquired from an Azure Communication Resources in the Azure Portal.<\/p>\n<pre><code class=\"csharp\">\/\/ Get a connection string to our Azure Communication resource. \nvar connectionString = \"\"; \nvar client = new CommunicationIdentityClient(connectionString);\n<\/code><\/pre>\n<p>The endpoint and access key acquired from an Azure Communication Resources in the Azure Portal can be used:<\/p>\n<pre><code class=\"csharp\">var endpoint = new Uri(\"https:\/\/my-resource.communication.azure.com\");\nvar accessKey = \"&lt;access_key>\";\nvar client = new CommunicationIdentityClient(endpoint, new AzureKeyCredential(accessKey));\n<\/code><\/pre>\n<p>Clients can authenticate using a valid Active Directory token via Azure.Identity:<\/p>\n<pre><code class=\"csharp\">var endpoint = new Uri(\"https:\/\/my-resource.communication.azure.com\"); \nTokenCredential tokenCredential = new DefaultAzureCredential(); \nvar client = new CommunicationIdentityClient(endpoint, tokenCredential);\n<\/code><\/pre>\n<p>Once you define your client you can also create users and tokens.<\/p>\n<p>Also, you will need the scope parameter; this parameter defines a nonempty set of primitives that can be used. Azure Communication Services supports the following scopes for access tokens.<\/p>\n<ul>\n<li><code>Chat<\/code>: Grants the ability to participate in a chat<\/li>\n<li><code>VoIP<\/code>: Grants the ability to call identities and phone numbers<\/li>\n<\/ul>\n<h4>Creating a new user<\/h4>\n<pre><code class=\"csharp\">Response&lt;communicationuseridentifier> userResponse = await client.CreateUserAsync();\nCommunicationUserIdentifier user = userResponse.Value;<\/code><\/pre>\n<h4>Getting a token for an existing user<\/h4>\n<pre><code class=\"csharp\">Response&lt;accesstoken> tokenResponse = await client.GetTokenAsync(user, scopes: new[] { CommunicationTokenScope.Chat });\nstring token = tokenResponse.Value.Token;\nDateTimeOffset expiresOn = tokenResponse.Value.ExpiresOn;<\/code><\/pre>\n<h4>Creating a user and a token in the same request<\/h4>\n<pre><code class=\"csharp\">Response&lt;communicationuseridentifierandtoken> response = await client.CreateUserAndTokenAsync(scopes: new[] { CommunicationTokenScope.Chat });<\/code><\/pre>\n<h4>Revoking a user&#8217;s tokens<\/h4>\n<p>In case a user&#8217;s tokens are compromised or need to be revoked you can revoke <strong>all<\/strong> tokens issued to that user.<\/p>\n<pre><code class=\"csharp\">Response revokeResponse = client.RevokeTokens(user);\n<\/code><\/pre>\n<p>Visit the <a href=\"https:\/\/docs.microsoft.com\/azure\/communication-services\/quickstarts\/managed-identity\">&#8220;Use Managed Identities&#8221; site<\/a> to find more details.<\/p>\n<h3>SMS<\/h3>\n<p>Azure Communication Services enables you to send and receive SMS text messages using the Communication Services SMS client libraries. These client libraries can be used to support customer service scenarios, appointment reminders, two-factor authentication, and other real-time communication needs. Communication Services SMS allows you to reliably send messages while exposing deliverability and response rate insights surrounding your campaigns.<\/p>\n<ul>\n<li><strong>Simple<\/strong> setup experience for adding SMS capability to your applications.<\/li>\n<li><strong>High Velocity<\/strong> message support over toll free numbers for A2P (Application to Person) use cases in the United States.<\/li>\n<li><strong>Two-way<\/strong> conversations to support scenarios like customer support, alerts, and appointment reminders.<\/li>\n<li><strong>Reliable Delivery<\/strong> with real-time delivery reports for messages sent from your application.<\/li>\n<li><strong>Opt-Out<\/strong> handling support to automatically detect and respect opt-outs for toll-free numbers. Opt-outs for US toll-free numbers are mandated and enforced by US carriers.<\/li>\n<\/ul>\n<h4>Key concepts<\/h4>\n<p><code>SmsClient<\/code> provides the functionality to send messages among phone numbers. <code>SmsClient<\/code> can be authenticated using the connection string and also be authenticated using a valid token credential; you can review the options that we listed before under <strong>Identity<\/strong> section.<\/p>\n<pre><code class=\"csharp\">string endpoint = \"&lt;endpoint_url>\";\nTokenCredential tokenCredential = new DefaultAzureCredential();\nSmsClient smsClient = new SmsClient(new Uri(endpoint), tokenCredential);\n    \nSmsSendResult sendResult = smsClient.Send(\n    from: \"&lt;from-phone-number>\", \/\/ Your E.164 formatted from phone number used to send SMS\n    to: \"&lt;to-phone-number>\", \/\/ E.164 formatted recipient phone number\n    message: \"Hello World via SMS\"\n);\n<\/code><\/pre>\n<p>You should replace <code>&lt;from-phone-number&gt;<\/code> with an SMS-enabled phone number associated with your Communication Services resource and <code>&lt;to-phone-number&gt;<\/code> with the phone number you wish to send a message to.<\/p>\n<p>Visit the <a href=\"https:\/\/docs.microsoft.com\/azure\/communication-services\/concepts\/telephony-sms\/sdk-features\">SMS SDK site<\/a> to find more details.<\/p>\n<h3>Phone numbers<\/h3>\n<p>Azure Communication Services allows you to use phone numbers to make voice calls and send SMS messages with the public-switched telephone network (PSTN). If your phone number will be used by an application (for example, to make calls or send messages on behalf of your organization), you can select a toll-free or local (geographic) number. If your phone number is being used by a person (for example, a user of your calling application), the local (geographic) phone number must be used. You can review more details in our <a href=\"https:\/\/docs.microsoft.com\/azure\/communication-services\/concepts\/telephony-sms\/plan-solution#number-types-and-features\">&#8220;Phone Numbers&#8221; documentation site.<\/a><\/p>\n<h4>Key concepts<\/h4>\n<p>Phone numbers can be searched through the search creation API by providing an area code, application type, phone number type, and capabilities. The phone number(s) in the search result will be reserved for ten minutes during which you can purchase them; otherwise, they will be released automatically. If the search is not purchased, the phone numbers will become available to others after ten minutes. The phone numbers found through the search operation could be acquired for the Azure resource and used by other communication services.<\/p>\n<p>The initial step is creating a <code>PhoneNumbersClient<\/code> to start interacting with the phone numbers. To create a new <code>PhoneNumbersClient<\/code> you need a connection string to the Azure Communication Services resource that you can get from the Azure Portal once you have created the resource.<\/p>\n<p>Phone numbers need to be searched before they can be purchased. Search is a long running operation that can be started by<code>StartSearchAvailablePhoneNumbers<\/code> function that returns an <code>SearchAvailablePhoneNumbersOperation<\/code> object.<code>SearchAvailablePhoneNumbersOperation<\/code> can be used to update status of the operation and to check for completeness.<\/p>\n<p>To create a client, you can use any of the suggested <strong>Identity<\/strong> options that we listed before; for this example, we use via a connection string. You can set a connection string based on an environment variable, a configuration setting, or any way that works for your application.<\/p>\n<pre><code class=\"csharp\">\/\/ Get a connection string to our Azure Communication resource.\nvar connectionString = \"&lt;connection_string>\";\nvar client = new PhoneNumbersClient(connectionString);\n\nvar capabilities = new PhoneNumberCapabilities(calling:PhoneNumberCapabilityType.None, sms:PhoneNumberCapabilityType.Outbound);\n\nvar searchOperation = await client.StartSearchAvailablePhoneNumbersAsync(countryCode, PhoneNumberType.TollFree, PhoneNumberAssignmentType.Application, capabilities);\nawait searchOperation.WaitForCompletionAsync();\n\nvar purchaseOperation = await client.StartPurchasePhoneNumbersAsync(searchOperation.Value.SearchId);\nawait purchaseOperation.WaitForCompletionResponseAsync();\n<\/code><\/pre>\n<p>Visit the <a href=\"https:\/\/docs.microsoft.com\/azure\/communication-services\/concepts\/telephony-sms\/telephony-concept\">&#8220;Telephony Concepts&#8221; site<\/a> to find more details.<\/p>\n<h3>Calling<\/h3>\n<p>You can use Azure Communication Services Calling client library to make and receive one-to-one or group voice and video calls. Your calls can be made to other users of your Azure Communication Services enabled app or website, and to PSTN telephones such as mobile phones. You can use the Communication Services JavaScript, Android, or iOS client libraries to build applications that allow your users to speak to one another in private conversations or in group discussions. Azure Communication Services supports calls to and from services or Bots.<\/p>\n<p>There are two separate families of Calling client libraries, for clients and services. Currently available client libraries are intended for end-user experiences: websites and native apps.<\/p>\n<h4>Calling client library capabilities<\/h4>\n<p>The calling client libraries support the following capabilities:<\/p>\n<table>\n<thead>\n<tr>\n<th><strong>Group of features<\/strong><\/th>\n<th><strong>Capability<\/strong><\/th>\n<th><strong>JS<\/strong><\/th>\n<th><strong>Java (Android)<\/strong><\/th>\n<th><strong>Objective-C (iOS)<\/strong><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Core Capabilities<\/td>\n<td>Place a one-to-one call between two users<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td>Place a group call with more than two users (up to 350 users)<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td>Invite another VoIP participant to join an ongoing group call<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<\/tr>\n<tr>\n<td>Mid call control<\/td>\n<td>Turn your video on\/off<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td>Mute\/Unmute mic<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td>Select audio and video input\/output devices<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<\/tr>\n<tr>\n<td>Screen sharing<\/td>\n<td>Share the entire screen or a select application<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<tr>\n<td>Roster<\/td>\n<td>List and remove participants<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<\/tr>\n<tr>\n<td>PSTN<\/td>\n<td>Place a one-to-one call with a PSTN participant<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td>Place a group call with PSTN participants<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td>Promote a one-to-one call with a PSTN participant into a group call<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<\/tr>\n<tr>\n<td>Echo Bot<\/td>\n<td>Test your mic, speaker, and camera with an audio testing service (available by calling 8:echo123)<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<td>\u2714\ufe0f<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>JavaScript calling client library support by OS and browser<\/h4>\n<p>Azure Communication Services client libraries support the following browsers:<\/p>\n<table>\n<thead>\n<tr>\n<th>\n      <\/th>\n<th>\n        Chrome\n      <\/th>\n<th>\n        Safari\n      <\/th>\n<th>\n        Edge (Chromium)\n      <\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\n        Android\n      <\/td>\n<td>\n        \u2714\ufe0f\n      <\/td>\n<td>\n        &#8211;\n      <\/td>\n<td>\n        &#8211;\n      <\/td>\n<\/tr>\n<tr>\n<td>\n        iOS\n      <\/td>\n<td>\n        &#8211;\n      <\/td>\n<td>\n        \u2714\ufe0f\n      <\/td>\n<td>\n        &#8211;\n      <\/td>\n<\/tr>\n<tr>\n<td>\n        macOS\n      <\/td>\n<td>\n        \u2714\ufe0f\n      <\/td>\n<td>\n        \u2714\ufe0f\n      <\/td>\n<td>\n        &#8211;\n      <\/td>\n<\/tr>\n<tr>\n<td>\n        Windows\n      <\/td>\n<td>\n        \u2714\ufe0f\n      <\/td>\n<td>\n        &#8211;\n      <\/td>\n<td>\n        \u2714\ufe0f\n      <\/td>\n<\/tr>\n<tr>\n<td>\n        Ubuntu\/Linux\n      <\/td>\n<td>\n        \u2714\ufe0f\n      <\/td>\n<td>\n        &#8211;\n      <\/td>\n<td>\n        &#8211;\n      <\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Visit the <a href=\"https:\/\/docs.microsoft.com\/azure\/communication-services\/concepts\/voice-video-calling\/calling-sdk-features\">Calling SDK site<\/a> to get more details.<\/p>\n<h3>Chat<\/h3>\n<p>Azure Communication Services Chat client library can be used to add real-time text chat to your applications.<\/p>\n<h4>Key concepts<\/h4>\n<p>A chat conversation is represented by a <strong>chat thread<\/strong>. Each user in the <strong>chat thread<\/strong> is called a thread participant and is backed by a communication user created through the <code>Azure Communication Identity<\/code> package. Thread participants can chat with one another privately in a 1:1 chat or huddle up in a 1:N group chat. Users also get near-real time updates for when others are typing and when they have read the messages.<\/p>\n<h3>Create a ChatClient<\/h3>\n<p>This will allow you to create, get, or delete chat threads.<\/p>\n<p><em>To authenticated in the <code>ChatClient<\/code>, you will need to authenticate by the user that is intended to send and receive messages. The user and its token can be created using the <code>Azure Communication Identity<\/code> package (you can review the options that we listed before <strong>Identity<\/strong> section).<\/em><\/p>\n<pre><code class=\"csharp\">ChatClient chatClient = new ChatClient(\n    endpoint,\n    new CommunicationTokenCredential(userToken));\n<\/code><\/pre>\n<p>Once you initialize a <code>ChatClient<\/code> class, you can perform chat operations:<\/p>\n<h4>Create a chat thread<\/h4>\n<pre><code class=\"csharp\">var chatParticipant = new ChatParticipant(identifier: new CommunicationUserIdentifier(id: \"&lt;user_id>\"))\n{\n    DisplayName = \"UserDisplayName\"\n};\nCreateChatThreadResult createChatThreadResult = await chatClient.CreateChatThreadAsync(topic: \"Hello world!\", participants: new[] { chatParticipant });\nChatThreadClient chatThreadClient = chatClient.GetChatThreadClient(threadId: createChatThreadResult.ChatThread.Id);\nstring threadId = chatThreadClient.Id;\n<\/code><\/pre>\n<p>Once you initialized a <code>ChatThreadClient<\/code> class, you can do the following chat operations:<\/p>\n<h4>Send a message<\/h4>\n<pre><code class=\"csharp\">SendChatMessageResult sendChatMessageResult = await chatThreadClient.SendMessageAsync(content:\"hello world\", type: ChatMessageType.Text);\nstring messageId = sendChatMessageResult.Id;\n<\/code><\/pre>\n<h4>Receive chat messages from a chat thread<\/h4>\n<pre><code class=\"csharp\">AsyncPageable&lt;chatmessage&gt; allMessages = chatThreadClient.GetMessagesAsync();\nawait foreach (ChatMessage message in allMessages)\n{\n    Console.WriteLine($\"{message.Id}:{message.Content.Message}\");\n}\n<\/code><\/pre>\n<h4>Add participants<\/h4>\n<pre><code class=\"csharp\">var josh= new CommunicationUserIdentifier(id: \"&lt;user_id_for_josh>\");\nvar gloria = new CommunicationUserIdentifier(id: \"&lt;user_id_for_gloria>\");\nvar amy = new CommunicationUserIdentifier(id: \"&lt;user_id_for_amy>\");\n\nvar participants = new[]\n{\n    new ChatParticipant(josh) { DisplayName = \"Josh\" },\n    new ChatParticipant(gloria) { DisplayName = \"Gloria\" },\n    new ChatParticipant(amy) { DisplayName = \"Amy\" }\n};\n\nawait chatThreadClient.AddParticipantsAsync(participants: participants);\n<\/code><\/pre>\n<p>Visit the <a href=\"https:\/\/docs.microsoft.com\/azure\/communication-services\/concepts\/chat\/sdk-features\">Chat SDK site<\/a> to find more details.<\/p>\n<h2>Conclusion<\/h2>\n<p>We hope this was a valuable technical introduction to <code>Azure Communication Services<\/code> and what you can use today to build and ship rich communication experiences.<\/p>\n<p>If you want to learn more and get started, here are some quick links to our official documentation:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-net\/tree\/master\/sdk\/communication\">.NET<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/tree\/master\/sdk\/communication\">Java<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-python\/tree\/master\/sdk\/communication\">Python<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-js\/tree\/master\/sdk\/communication\">JavaScript\/TypeScript<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-android\/tree\/master\/sdk\/communication\">Android<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-ios\/tree\/master\/sdk\/communication\">iOS<\/a><\/li>\n<\/ul>\n<h2>References<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.microsoft.com\/azure\/communication-services\/\">Official documentation<\/a><\/li>\n<li><a href=\"https:\/\/docs.microsoft.com\/azure\/communication-services\/quickstarts\/create-communication-resource?tabs=windows&amp;pivots=platform-azp\">Create your first resource<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/Communication\/tree\/master\/releasenotes\">Release notes<\/a><\/li>\n<\/ul>\n<p><!-- FOOTER: DO NOT EDIT OR REMOVE --> <div  class=\"d-flex justify-content-center\"><a class=\"cta_button_link btn-primary mb-24\" href=\"https:\/\/aka.ms\/azsdk\/releases\" target=\"_blank\">Azure SDK Releases<\/a><\/div><\/p>\n<h2>Azure SDK Blog Contributions<\/h2>\n<p>Thank you for reading this Azure SDK blog post! We hope that you learned something new and welcome you to share this post. We are open to Azure SDK blog contributions. Please contact us at <a href=\"&#109;&#x61;&#105;&#x6c;&#116;&#x6f;&#58;&#x61;z&#115;&#x64;&#107;&#x62;&#108;&#x6f;&#103;&#x40;&#109;&#105;&#x63;&#114;&#x6f;&#115;&#x6f;&#102;&#x74;&#46;&#x63;o&#109;\">&#x61;z&#115;&#x64;&#107;&#x62;&#108;&#x6f;&#103;&#x40;&#109;&#105;&#x63;&#114;&#x6f;&#115;&#x6f;&#102;&#x74;&#46;&#x63;o&#109;<\/a> with your topic and we&#8217;ll get you set up as a guest blogger.<\/p>\n<h2>Azure SDK Links<\/h2>\n<ul>\n<li>Azure SDK Website: <a href=\"https:\/\/aka.ms\/azsdk\">aka.ms\/azsdk<\/a><\/li>\n<li>Azure SDK Intro (3 minute video): <a href=\"https:\/\/aka.ms\/azsdk\/intro\">aka.ms\/azsdk\/intro<\/a><\/li>\n<li>Azure SDK Intro Deck (PowerPoint deck): <a href=\"https:\/\/aka.ms\/azsdk\/intro\/deck\">aka.ms\/azsdk\/intro\/deck<\/a><\/li>\n<li>Azure SDK Releases: <a href=\"https:\/\/aka.ms\/azsdk\/releases\">aka.ms\/azsdk\/releases<\/a><\/li>\n<li>Azure SDK Blog: <a href=\"https:\/\/aka.ms\/azsdk\/blog\">aka.ms\/azsdk\/blog<\/a><\/li>\n<li>Azure SDK Twitter: <a href=\"https:\/\/twitter.com\/AzureSDK\">twitter.com\/AzureSDK<\/a><\/li>\n<li>Azure SDK Design Guidelines: <a href=\"https:\/\/aka.ms\/azsdk\/guide\">aka.ms\/azsdk\/guide<\/a><\/li>\n<li>Azure SDKs &amp; Tools: <a href=\"https:\/\/azure.microsoft.com\/downloads\">azure.microsoft.com\/downloads<\/a><\/li>\n<li>Azure SDK Central Repository: <a href=\"https:\/\/github.com\/azure\/azure-sdk#azure-sdk\">github.com\/azure\/azure-sdk<\/a><\/li>\n<li>Azure SDK for .NET: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-net\">github.com\/azure\/azure-sdk-for-net<\/a><\/li>\n<li>Azure SDK for Java: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-java\">github.com\/azure\/azure-sdk-for-java<\/a><\/li>\n<li>Azure SDK for Python: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-python\">github.com\/azure\/azure-sdk-for-python<\/a><\/li>\n<li>Azure SDK for JavaScript\/TypeScript: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-js\">github.com\/azure\/azure-sdk-for-js<\/a><\/li>\n<li>Azure SDK for Android: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-android\">github.com\/Azure\/azure-sdk-for-android<\/a><\/li>\n<li>Azure SDK for iOS: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-ios\">github.com\/Azure\/azure-sdk-for-ios<\/a><\/li>\n<li>Azure SDK for Go: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-go\">github.com\/Azure\/azure-sdk-for-go<\/a><\/li>\n<li>Azure SDK for C: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-c\">github.com\/Azure\/azure-sdk-for-c<\/a><\/li>\n<li>Azure SDK for C++: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-cpp\">github.com\/Azure\/azure-sdk-for-cpp<\/a><\/li>\n<\/ul>\n<p><!-- FOOTER: DO NOT EDIT OR REMOVE --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this post, we&#8217;ll announce that the Azure Communication Services SDK has been released.<\/p>\n","protected":false},"author":55582,"featured_media":1071,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[701,795,794,24],"class_list":["post-1063","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure-sdk","tag-net","tag-acs","tag-azure-communication-services","tag-releases"],"acf":[],"blog_post_summary":"<p>In this post, we&#8217;ll announce that the Azure Communication Services SDK has been released.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts\/1063","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/users\/55582"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/comments?post=1063"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts\/1063\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/media\/1071"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/media?parent=1063"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/categories?post=1063"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/tags?post=1063"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}