# Desk360 Overview

On these pages, you can access detailed documentation on how to implement WhatsApp integrations and quickly integrate your products with the Desk360 platform

Desk360 is an official WhatsApp Business solution provider and you can manage all WhatsApp communications directly from Desk360 platform.

**What does WhatsApp Integration do?**

WhatsApp integration allows you to provide live support to your customers who reach you via WhatsApp channel.

After successfully completing the WhatsApp integration, you can manage all WhatsApp messages sent by your customers from the Desk360 panel. If you want, you can solve their problems instantly, or you can turn these chats into support requests and get back to your customers later.

\
\
&#x20;                                                     [<mark style="color:blue;">**Homepage**</mark>](https://desk360.com/)                                          [<mark style="color:blue;">**Pricing**</mark>](https://desk360.com/pricing)


# Register

You can register for the Desk360 platform by [clicking here](https://my.desk360.com/register).

<figure><img src="/files/ijM2QS1k8sA6iZHO3SvG" alt="" width="363"><figcaption></figcaption></figure>

After filling in the fields for email, first and last name, phone number, country and password, you can complete registration. During registration, you can select “Continue with Google” to open a pop-up window where you can sign in with your Google account and use the email and first and last name information of that account.

Pay attention to:

* Entering a minimum of 3 characters in the name and surname field.
* Setting a password with a minimum of 8 characters that contains uppercase and lowercase letters, and at least 1 number.

&#x20;                                                     [<mark style="color:blue;">**Homepage**</mark>](https://desk360.com/)                                         [ ](https://desk360.com/pricing)[<mark style="color:blue;">**Pricing**</mark>](https://desk360.com/pricing)


# Login

You can sign in to the Desk360 platform by [clicking here](https://my.desk360.com/login).

<figure><img src="/files/svFisBBuhiRZQlcRgL0P" alt="" width="320"><figcaption></figcaption></figure>

If you have registered with your Google account, you can log in to the Desk360 platform after signing in with your Google account in the window that opens after clicking on “Sign in with Google.” You can also sign in with your Desk360 account by filling in the Email Address and Password fields.

&#x20;                                                     [<mark style="color:blue;">**Homepage**</mark>](https://desk360.com/)                                         [ ](https://desk360.com/pricing)[<mark style="color:blue;">**Pricing**</mark>](https://desk360.com/pricing)


# Reset Password

If you forgot your password, you can access the password reset page by clicking here or by clicking on “Forgot your password?” at the bottom of the page where you sign in to your Desk360 account.

On the page that pops up, you just need to enter the email address of your Desk360 account and click on the “Send” button. You can then create a new password by following the instructions in the password reset email that will be sent to your email address.

If you haven't received the password reset email:

* Please check your email spam box. The password reset email may have gone to your spam folder.
* Wait a while and try again.
* &#x20;If you still haven't received the password reset email, you can send a support request to <support@desk360.com>.

<figure><img src="/files/Ed3tJr42mWppkDOQRWUg" alt="" width="360"><figcaption></figcaption></figure>

&#x20;                                                     [<mark style="color:blue;">**Homepage**</mark>](https://desk360.com/)                                         [ ](https://desk360.com/pricing)[<mark style="color:blue;">**Pricing**</mark>](https://desk360.com/pricing)


# WhatsApp Business API Setup

The WhatsApp Business API Setup page allows you to set up quickly and easily for the phone number you want to receive Business API service on.

The setup involves 5 steps. These are respectively:<br>

1\.        Connecting your Facebook Business Account\
2\.        Determining the phone number you want to use and the display name of your business profile\
3\.        Invoicing\
4\.        Phone number verification\
5\.        Completion of the setup

Things to consider before starting the setup:

* You must have a Verified Facebook Business Account to set up the WhatsApp Business API.
* &#x20;A phone number cannot be used in Business API and Business APP at the same time. Due to the rules of Meta, you can only benefit from only one platform.
* &#x20;If the phone number you want to set up is registered in WhatsApp, please delete it from your WhatsApp accounts. *Even if you delete the WhatsApp application, your account remains registered. Therefore, you need to delete your account by visiting the “Account” section of the WhatsApp application.* After deleting your account, you need to wait 5 minutes.
* Your previous messages from before setup cannot be transferred.
* If the phone number you want to set up is registered with a different Business API provider, go to your Facebook Business Manager and turn off 2-Step Verification before setting up.
* &#x20;All steps must be completed successfully. Skipping any step is not possible.

### **First Step: Connecting the Facebook Account**

You must have a Verified Facebook Business Account to complete this step. [Click here](https://www.facebook.com/business/tools/business-manager/get-started-guide) for more information about Facebook Business Account.

To connect your account, click on the “Continue” button and then sign in with your Facebook Business Manager Account in the pop-up window.&#x20;

### **Second Step: Determining Phone Number and Display Name**

In this step, you need to enter the phone number and the display name of the phone number you want to set up the WhatsApp Business API on.

Display Name is the name of your WhatsApp Business Profile that can be viewed by your customers. The name you choose undergoes a review process by WhatsApp and you can only use it if it is approved.

What to consider to get your Display Name approved:

* The name you choose must be related to your business.
* &#x20;It must not violate WhatsApp trade and business policies.
* It must comply with the Display Name rules. [Click here](https://www.facebook.com/business/help/757569725593362) to access the rules.

After entering your phone number and Display Name, you can select “Continue” and complete the step.

### **Third Step: Invoicing**

After completing the second step, you will be presented with the invoicing process. In this step, you will be offered 2 different options: Annual and Monthly. After choosing the package that suits your needs, click on the “Continue” button.

Then enter your card information in the following page and click on the “Next” button. After clicking on the Next button, you will be asked for some information in order to make an invoice for your payment. You need to select “Individual Selection” for individual invoice and “Commercial Selection” for commercial invoice. Your invoice will be issued according to the selection you make on this screen and the information you enter.&#x20;

After entering the necessary information for the invoice, click on the “Next” button and after checking your pricing details again on the “Complete Subscription” screen, which is the last step of the invoicing, you can complete this step by clicking on the “Complete” button.

### **Fourth Step: Phone Number Verification**

In this step, the verification process of the phone number to set up the Business API on is completed.

&#x20;There are 2 different methods for verification. These are text message and phone call. You can choose the one that suits your needs best and click on “Send” button. Then, Meta will send a 6-digit verification code to your phone number with the method you specify. Simply enter this code in the field that will pop up and select “Verify”.

&#x20;If you do not receive the verification code, you can try the other verification method by clicking on the “Back” button.

&#x20;Things to consider before sending the verification code:

* &#x20;In the case you prefer the phone call method, if there is an active IVR on your phone number, it must be deactivated or call forwarding must be set up before sending the code. Otherwise, you will not receive the verification code.
* If your phone number will be transferred from a different service provider, log in to your Facebook Business Manager and turn off 2-Step Verification.
* &#x20;If your phone number is registered on WhatsApp, go to the app, delete your account in the “Account” section, and wait 5 minutes before requesting the verification code.

### **Fifth Step: Completing the Setup**

&#x20;Once the verification code step is completed, the setup process starts. It may take a few minutes to be completed. Once the setup is finished, you will receive a notification at the top of the page informing that the setup is complete and you will be redirected to the Products page.

&#x20;                                                     [<mark style="color:blue;">**Homepage**</mark>](https://desk360.com/)                                         [ ](https://desk360.com/pricing)[<mark style="color:blue;">**Pricing**</mark>](https://desk360.com/pricing)

&#x20;


# Virtual Number Setup and Configuration

This document explains how to use the virtual number selection feature during the WhatsApp Business API (WABA) setup process.

### Why Virtual Number?

The virtual number feature provides the following advantages:

* Does not require a physical SIM card.
* Accelerates the WABA setup process.
* Offers a low entry barrier for users who want to try the platform.

### Step-by-Step Usage

#### 1) Number Selection Screen

During the WABA setup process, all users encounter the following screen.

* When the "Click to Purchase Number" button is pressed, the number addition field opens.

#### 2) Number Display

The following fields are located within the relevant area:

* **Phone Number:** An automatic number is displayed to the user.
* **Refresh button:** When clicked, a random new number is displayed to the user.
* **"I Will Choose My Own Number"** button: Allows the user to select their own number.
* Currently, only US-compatible phone numbers can be obtained.

#### 3) Number Selection and Summary Screen

When the "Select Number" button is clicked, the user is directed to a summary screen.

* The selected number is displayed here.
* The selected number is reserved for the user for 15 minutes. If the user waits more than 15 minutes on this screen, the number reservation will be cancelled.

#### 4) Completing the Setup

After clicking the "Complete" button:

* An OTP (verification code) is received from Meta via SMS in the background.
* The code is automatically verified.
* The user proceeds to the "Setup Completing" screen, which is the final step of the setup.


# WhatsApp Accounts

You can manage and customize your WhatsApp Accounts on the WhatsApp Account page.

You can access this page by clicking on the first button on the left menu. On the WhatsApp Account page, you can:

* See your previously added WhatsApp accounts,
* Add a new WhatsApp account,
* Complete/cancel an unfinished WhatsApp setup,
* Access the details of your WhatsApp accounts (message sending limit, quality status of your phone number, etc.),
* Edit your WhatsApp account profile,
* Add/delete users for your WhatsApp account,
* Apply for a green tick (official account),
* Utilize Public API service,
* Access mobile or web chat platforms,
* Delete your existing WhatsApp account.

## **WhatsApp Account List**

On this screen, your WhatsApp accounts (Products) whose setup is completed or unfinished are listed and each row represents 1 WhatsApp account. You can also start a new WhatsApp Business API Setup by clicking on the “+ New” button in the upper right corner.

To the right of the Display Name and Phone number information of your installed accounts, there are buttons to access Settings, Public API and Chat services respectively.

For your accounts whose setup is not completed, there are “Complete Integration” and “Cancel” buttons to the right of the Display Name and Phone number information.

If you want to complete the integration of your unfinished WhatsApp account, you can click on the “Complete Integration” button and access the WhatsApp Business API Setup page for this account. If you want to abort the process without completing the integration, you can click on the “Cancel” button.

## **WhatsApp Account Settings**

To access the Waba settings, click on WhatsApp Account on the left menu. Then click on the settings button to the right of the product whose “Settings” page you want to access from the WhatsApp Account listing screen. On this screen, you can access and edit a lot of information about your installed products.

Here are the actions you can perform in the settings tab:\
\
At the top of the page that opens in the settings tab; you can see the phone number, display name, quality status, message sending limit, country, and integration type of your WhatsApp account and you can delete/ de-integrate your account completely. \
\
Messaging limits are the maximum number of messages that can be delivered from a business phone number to unique WhatsApp user phone numbers, outside of a [customer service window](https://developers.facebook.com/docs/whatsapp/cloud-api/guides/send-messages#customer-service-windows), within a moving 24-hour period.

By default, new business phone numbers are limited to 250 delivered messages, but this limit can be increased to:

* 1,000 (by completing a [scaling path](https://developers.facebook.com/docs/whatsapp/messaging-limits/#scaling-paths))
* 10,000 (via [automatic scaling](https://developers.facebook.com/docs/whatsapp/messaging-limits/#automatic-scaling)
* 100,000 (via automatic scaling)
* Unlimited (via automatic scaling)

Increasing your limit

You can increase your messaging limit to 1,000 by completing one of the [scaling paths](https://developers.facebook.com/docs/whatsapp/messaging-limits/#scaling-paths) below. After that, we will automatically increase your limit to the next higher limit if you meet our [automatic scaling criteria](https://developers.facebook.com/docs/whatsapp/messaging-limits/#automatic-scaling).

#### Scaling paths <a href="#scaling-paths" id="scaling-paths"></a>

* [Verify your business](https://www.facebook.com/business/help/2058515294227817)
* Send 1,000 delivered messages outside of customer service windows to unique WhatsApp user phone numbers in a 30-day moving period, using templates with a high [quality rating](https://www.facebook.com/business/help/766346674749731).

Once you complete one of these paths, we will analyze your [message quality](https://developers.facebook.com/docs/whatsapp/cloud-api/guides/send-messages#message-quality). Based on this analysis, your number's eligibility for automatic scaling will either be approved or denied

In the Business Profile section, you can customize various information about your business. You can click on the “Save” button at the bottom of the page to save the customization changes you have made.

**Profile Picture:** From this area you can upload a profile photo for your WhatsApp account.

**Display Name:** From this area you can change the display name of your WhatsApp account. To change the display name, click on the pencil icon in the area. Then enter your new display name in the window that opens and click on the "OK" button.

Your change request will be submitted to Meta for approval and will proceed to the review phase. You can follow the review process and the result from the information area just above your display name with progress indicators such as “Approved”, “Rejected”, “Under Review”. If your display name change request is rejected, you can continue using your old name or request a new one. For Facebook Naming Guidelines, you can check here.\[OA3]&#x20;

**Category:** In this area, you can choose a category that applies to your business.

**Official Business Account (Green Tick):** From this area, you can apply for an Official Business Account (green tick) for your WhatsApp account. To do this, click on the “Submit Request” button and fill in the application form that will appear.

Important reminders and notes:

* Official business account applications are reviewed by Meta and finalized within 2-3 business days on average.
* If your application is rejected, you will have to wait 1 month before you can apply again.
* In order to apply, your messaging limit must be higher than 1K/24 hours, you must have a verified Facebook Business Account, your display name must be approved, and your account must have 2FA turned on.
* You can follow the review process and the result of your application in the information area just below the “Submit Request” button, with progress indicators such as “Approved”, “Rejected”, “Under Review”.

**Description:** In this field you can enter a description text for your business.

**Contact Information:** In this field you can enter the address, email and website (maximum 2) information for your business.

**Business Profile Preview:** In this field you can see a preview of the changes you have made.

## **Public API**

Under this tab, you can get Public API service for your installed WhatsApp Business Account.

**How does it work?**\
In order to benefit from this service, you need to enter a Webhook Url and Token information on the screen that opens. After entering the information, click on the “Save” button. After saving the information, the messaging data sent by WhatsApp to Desk360 is forwarded to the Webhook Url you created and saved with the POST method. After this, your messaging data will not be forwarded to Desk360.

If you want to cancel this, you can click on the “Delete” button on the same screen. After it is canceled, your messaging data will be forwarded to Desk360 and data flow to your Webhook Url will stop.

## **Messaging**

Under this tab, you can send invites to your teammates to create a Desk360 account for your Customer Service, download the Desk360 WhatsApp Messenger application, and access our panel where you can perform web-based messaging.

To access the web-based messaging platform(Coming soon), you must first download the mobile application to your phone and log in with your Desk360 account. Then, simply click on the link in the Desk360 Messenger Web area and scan the QR Code on the mobile application.

To add new teammates to your customer service and send invites, click on “Invite new people” on the screen and enter the email addresses of the people you want to invite. Then click on the “Invite” button. Make sure you have enough funds in your wallet to send an invite.

The invite you send will be valid for 72 hours. If the invite expires, you can send invites again. To resend an invite to a person you have already sent an invite to, you can click on the “Resend Invite” button to the right of the user information.\
\
To delete an added user, you can click on the “Delete” button to the right of the user information.

## WhatsApp Web Widget

The WhatsApp Web Widget appears in the corner of your website and encourages visitors to start a conversation with your business. Through this screen, you can customize the widget’s language, appearance, text, and theme, then copy the HTML code to integrate it into your website.

<figure><img src="/files/Ncb7VH5vE3BpYkOcFAmN" alt=""><figcaption></figcaption></figure>

### a) Fields and Features

#### **Default Language**

Select the default language the widget will appear in.\
*Example: English, Turkish.*

#### **WhatsApp Web Widget Default View**

* **Closed by default** → The widget stays closed when the user enters the site.
* **Open by default** → The widget automatically opens when the user enters the site.

#### **Open Delay**

Set how many seconds after page load the widget will open.\
*Example: `0` → immediately, `5` → after 5 seconds.*

#### **Other Languages**

Add additional language options to support multilingual users.\
*Example: Turkish, German, French.*

#### **Brand Name**

The brand or company name displayed at the top of the widget.\
Character limit: **75**.

#### **Subtitle**

Informative text displayed under the brand name.\
*Example: “We typically reply within a day.”*

#### **Button Name**

The label that appears on the WhatsApp button.\
*Example: “Message us” or “Contact us”.*

#### **Welcome Message**

The first message displayed when the chat box opens.\
*Example: “Hi there! How can I help you?”*

#### **Customer Message**

A default suggested message that users can send.\
*Example: “Hello, can you help me with something?”*

#### **Theme & Alignment**

* **Theme**: Light Theme / Dark Theme.
* **Alignment**: Align the widget to the left or right of the screen.

#### **Save**

Click the **Save** button to apply your changes.

#### **Copy Code**

Copy the generated HTML code and paste it into your website’s source code.\
This code enables the widget to function on your website

&#x20;                                                     [<mark style="color:blue;">**Homepage**</mark>](https://desk360.com/)                                         [ ](https://desk360.com/pricing)[<mark style="color:blue;">**Pricing**</mark>](https://desk360.com/pricing)


# WhatsApp Template Messages

## **Creating a Message Template**&#x20;

Before you can create a WhatsApp Message Template, you must be logged in with your Desk360 account and have at least 1 WhatsApp Account already set up. From the left menu, click on the Message Templates button to access the page where you can view and manage your template messages and create new message templates.

If you have only 1 WhatsApp account set up, your message template will be listed directly. However, if you have more than one WhatsApp account, you must first select the WhatsApp account you want to process.

You can start creating a new Message Template by clicking on the “Create Template” button on the right side of this page.

<figure><img src="/files/nQJ1Mo8BkpwqAE1F2akB" alt=""><figcaption></figcaption></figure>

There are 3 procedures you need to complete on this screen: category selection, naming, and language selection. All of the fields must be filled in.

**Category selection**: In this field, you should select the category that is the most suitable for the content of your template message. In case of incorrect category selection, your message template may be rejected by Meta. You can click here for more information about categories.

**Name**: In this field, you need to give your template a name. Here are the important details for the name field:

* Only lowercase letters, English characters, and special characters “\_” can be used.
* &#x20;The maximum number of characters in the name field must be 255.
* A message template cannot be named “test.”
* It is not possible to reuse the name of a deleted template message.

**Language**: You must select at least 1 language in this field. You can also select more than one language.

After filling in these 3 fields, you can access the page where you can create the content of your message template by pressing the “Continue” button in the upper right corner.

## **Creating Message Template Content**

**Header:** This field is optional. You can leave it unselected if you do not want to add a title to your template. You can make 3 different selections for this field. These are respectively: None, Text, and Media.

* None: This option must be selected if you do not want to use a title.
* Text: You can select this option if you want to add a caption to your template. You can enter a maximum of 60 characters. You can define a variable for your text with the “Add Variable” button in the bottom right corner. The number of variable characters is also included in the 60-character limit.
* Media: When you make this selection, you can add images, videos, or documents as titles to your template. The media you add to this field must be a sample and must not contain any customer data. You need to upload the source media when you send your message to your customers after the template is approved. File types supported for image selection are JPG and PNG. For video selection, the supported file type is MP4. The supported file type for document selection is PDF.<br>

<figure><img src="/files/L73P78cQW2btAQ2TIlYm" alt=""><figcaption></figcaption></figure>

&#x20;

**Body:** This is a mandatory field; it cannot be left blank. You can write the content of your template message in this field. The content you will write should include the original message you will send to your customers. The maximum number of characters you can enter is 1024. You can add variables to this field. The number of characters of your variable is also included in the maximum character limit you can use. The content you add to the body field should not start and end with a variable.

<figure><img src="/files/EC71n1rOHkHq1yqtu7kR" alt=""><figcaption></figcaption></figure>

**Footer**: This field is optional. You can use this field if you want to add a footer or a signature to your template. This section supports text only, with a maximum input of 60 characters and no variables can be added.

&#x20;

<figure><img src="/files/Eic6xoFU69efJ98mxzRE" alt=""><figcaption></figcaption></figure>

**Buttons:** This field is optional. By adding buttons to your template, you can enable your customers to respond to your message or take action. You can add up to 10 buttons to your message. Buttons are divided into 2: Quick Reply and Call to Action.

* Quick Response Button: Includes Custom Button. With the custom button, you can create buttons with the texts you specify. You can enter up to 25 characters and you can add up to 10.
* Call to Action Buttons: Includes 2 different types of buttons: Visit Website and Call Phone Number.<br>

  With the visit website button, you can forward your customers to specific internet addresses. You can enter text with a maximum length of 25 characters and the url can contain a maximum of 2000 characters. Do not forget to add https\:// at the beginning of the URL.

  With the Call phone number button, you can have your customers call the phone number you specify. You can enter text with a maximum length of 25 characters.

<figure><img src="/files/kd7NKix1qnEv3bx9SHxV" alt=""><figcaption></figcaption></figure>

**Adding/Removing Languages:** You can add a new language or remove an existing language from the Language field on the left side of the page. Templates undergo a separate approval process for each language. For example, if you prepare a template in 2 different languages, English and Turkish, English may be approved while Turkish may be rejected. For more detailed information about the approval process, you can visit the WhatsApp Message Templates page.

**Message Preview:** From the Message Preview area on the right side of the page, you can instantly preview all the changes you have made to your message as follows.

<figure><img src="/files/wjON2gVuieoCaN4QTCie" alt="" width="284"><figcaption></figcaption></figure>

**Send for Approval:** You can send the message template you have prepared for approval with the “Send” button on the right side. If the template is approved, you can start using it immediately and send it to your customers. However, you cannot send templates that are not approved.

## **Editing Message Template**

You can edit a WhatsApp message template you have created before, by clicking the “Message Templates” button from the left menu after logging in to your Desk360 account.

If you have set up only 1 WhatsApp account, your message templates will be listed directly. However, if you have more than one WhatsApp account, you must first select the WhatsApp account you want to process.

You can edit your message template by clicking the edit (pencil icon) button to the right of the listed message templates.

When your editing is complete, you can send your template for Meta's approval with the “Send” button on the right side of the screen. If your request is rejected, you can edit your template message again and send it to Meta for approval.

A message template can only be edited 1 time in 24 hours.

## **Deleting Message Template**

To delete a WhatsApp message template you have created before, you must click the “Message Templates” button from the left menu after logging in to your Desk360 account.

If you have set up only 1 WhatsApp account, your message templates will be listed directly. However, if you have more than one WhatsApp account, you must first select the WhatsApp account you want to process.

You can delete your message template by using the delete (trash icon) button to the right of the listed message templates.

**Important notes:**

* If the message template you want to delete contains more than one language, your messages in all languages will be deleted.
* The name of the deleted message template cannot be reused.

If you want to delete the content of a template that you have prepared in more than one language, you can do so by selecting the edit (pencil icon) button to the right of the listed message templates. To delete, you can use the Language field on the left side of the message template editing screen.

## **Sending Message Template**

To send a previously created and approved message template to your customers, you must click the “Message Templates” button from the left menu after logging in to your Desk360 account.

If you have set up only 1 WhatsApp account, your message templates will be listed directly. However, if you have more than one WhatsApp account, you must first select the WhatsApp account you want to process.

You can access the message template sending page by selecting the send (arrow icon) button to the right of the listed message templates.

There are 2 options for sending message templates: Single Send and Multiple Send.

**Single Send:** With the “Single Send” option at the top right of the page, you can send the same message to one or more numbers at the same time by changing the variables and media in your text. Please enter your country code in the section where the phone number will be added. If there is a variable or media in your message, you need to fill in those fields completely.

<figure><img src="/files/X7fnS2MWGNZ45q3YQSs4" alt=""><figcaption></figcaption></figure>

**Multiple Send:** You can send the same message to more than one phone number with the same variables and the same media with the “Multiple Send” option in the upper right corner of the page. You can send to a maximum of 1000 phone numbers at a time.

There are 2 different methods for multiple sending. The first method is to download a sample .csv file from the CSV File field, save the phone numbers and variables you will send to the file you downloaded, and then upload the same file and send a bulk message. The second method is that you can enter the phone numbers one by one in the “Manual Upload” field, enter the variables, and upload the media in the variable and media upload field just below.

<figure><img src="/files/RmE4AszrReeW1s1tP2P7" alt=""><figcaption></figcaption></figure>

**Send by Category and Tag:**\
From the *Data Upload* section, you can select the relevant categories to send template messages. Additionally, while sending to selected tags, you also have the option to exclude specific tags. There is a $50 sending limit.

* **“Category”** → Allows you to select the category created from the *Data Upload* section.
* **“Tags to Send Messages To”** → Lets you define your target audience.
* **“Tags to Exclude from Sending”** → Filters out the people you want to exclude.

**Example:**\
A category named *“August Campaign List”* was created with 10 people.\
All numbers in this list were assigned the tag *“Campaign”*.\
However, 2 of these people also had the tag *“Do Not Contact”* assigned earlier.\
When *“Do Not Contact”* is selected from the *“Tags to Exclude from Sending”* list, these 2 people are automatically excluded.\
As a result, the message is sent to 8 people in total.<br>

<figure><img src="/files/EFsMDXyJ1xaq6tk77Vep" alt=""><figcaption></figcaption></figure>

**Send by Tag:**\
This option allows you to send (or not send) messages to specific tags across all numbers that have ever been tagged.

* **“Tags to Send Messages To”** → Lets you define your target audience.
* **“Tags to Exclude from Sending”** → Filters out the people you want to exclude.

**Example:**\
When a business has communicated with a total of 100 people:\
60 of them are marked with the tag *“Female”*.\
If *“Female”* is selected from the *“Tags to Send Messages To”* field, the message will only be sent to these 60 people.

Additionally:\
If 30 of these 60 people also have the *“Do Not Contact”* tag,\
and *“Do Not Contact”* is selected from the *“Tags to Exclude from Sending”* field, these people will be excluded.\
**Result:** The message is sent to a total of 30 people.\ <br>

<figure><img src="/files/jIU8jMXih11FTP62bryF" alt=""><figcaption></figcaption></figure>

&#x20;                                                     [<mark style="color:blue;">**Homepage**</mark>](https://desk360.com/)                                         [ ](https://desk360.com/pricing)[<mark style="color:blue;">**Pricing**</mark>](https://desk360.com/pricing)

&#x20;


# Template Message Send Summary

### Summary

The Send Summary is a statistics panel attached to every WhatsApp template message you send. It shows you exactly how that message performed — who received it, how many read it, whether they clicked a button, and who sent it — all in one place, without having to open individual conversations.

***

### What the Send Summary Shows

The panel displays the following information for every sent template message:

| Field                | Description                                                                                                                                                                                                                                                                                                                        |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Template Name**    | The name of the WhatsApp message template that was used.                                                                                                                                                                                                                                                                           |
| **Send Date & Time** | The exact date and time the message was sent.                                                                                                                                                                                                                                                                                      |
| **Language**         | The language the template was sent in.                                                                                                                                                                                                                                                                                             |
| **Sent By**          | The name of the user or account who sent the message. If the user has been deleted, their name (or email address) is still shown — this information is never lost.                                                                                                                                                                 |
| **Recipients**       | The total number of contacts the message was sent to.                                                                                                                                                                                                                                                                              |
| **Delivery Rate**    | The percentage of recipients who successfully received the message.                                                                                                                                                                                                                                                                |
| **Read Rate**        | The percentage of recipients who opened and read the message.                                                                                                                                                                                                                                                                      |
| **Button Clicks**    | The total number of button clicks, with a breakdown per button shown in a tooltip (e.g., Button 1: 35%, Button 2: 20%, Button 3: 45%). If the button text in a template was changed after the message was sent, the summary still shows the button text that was active at the time of sending — historical accuracy is preserved. |

***

### Exporting the Send Summary as a Report

You can export the Send Summary data as a report file. The export includes all fields listed above, plus one additional column:

#### The `clickedButton` Column

When you export a report, each row represents one recipient. The `clickedButton` column shows the text of the **first button that recipient tapped**.

* If the recipient tapped a button → the column shows the button's text label.
* If the recipient did not tap any button → the column is left empty.

This lets you filter and segment recipients by the action they took — for example, identifying everyone who tapped "Yes, I'm interested" vs. everyone who did not respond.

***

### Notes and Limitations

* The Send Summary is available for **all** sent template messages — whether sent to a single contact or as part of a bulk send.
* Delivery and read rate data depends on WhatsApp reporting. In some cases, WhatsApp does not confirm read status if the recipient has read receipts turned off — this will be reflected as a lower read rate.
* Button click data is recorded at the time of the click. If a template's button text is updated after messages were already sent, the summary for those older messages continues to show the original button text.
* The `clickedButton` export column records only the **first** button tapped by each recipient. Subsequent taps are not recorded separately.
* Sender information is retained permanently. Even if the sending user's account is deleted from Desk360, their name or email address continues to appear in the Send Summary for all messages they sent.

***

### Frequently Asked Questions

**Q: Does the Send Summary work for both individual and bulk template messages?** A: Yes. It appears on every sent template message regardless of how it was sent.

**Q: What if a recipient didn't receive the message — will that affect the delivery rate?** A: Yes. Recipients who did not receive the message are not counted in the delivery rate. You can compare the Recipients count with the Delivery Rate to understand how many contacts were not reached.

**Q: Why is my read rate lower than my delivery rate?** A: This is normal. Read rate only counts recipients who opened the message. If a recipient received it but hasn't opened it, or has disabled read receipts on WhatsApp, they will not be counted in the read rate.

**Q: Can I see which specific contact clicked which button?** A: Yes — export the report and use the `clickedButton` column to see the first button each individual recipient tapped.


# Template Message Statics

### Summary

The Template Message Statistics page gives you a full performance view of any WhatsApp template message you have sent. From a single screen, you can track delivery and read rates, analyze button engagement, review error breakdowns, and export raw data — all filtered by the date range you choose.

***

### Who This Is For

Any Desk360 user who sends WhatsApp template messages and wants to understand how those messages are performing: support team leads, campaign managers, and customer experience managers.

***

### How to Access

1. Go to **Template Message Management** in the left navigation menu.
2. Open the **Template Messages** page.
3. Find the template you want to analyze in the list.
4. Click the **eye icon** on that template's row.

The Statistics page for that template will open. The date range defaults to **Last 30 days** automatically.

> If the selected template has never been sent, an empty state screen is shown instead of statistics.

***

### Filtering by Date Range

At the top of the page, use the **date range dropdown** to filter all statistics on the page.

The following options are available:

| Option       | What it shows                      |
| ------------ | ---------------------------------- |
| Last 7 days  | The past 7 days                    |
| Last 30 days | The past 30 days *(default)*       |
| Last 90 days | The past 90 days                   |
| Custom range | Pick a specific start and end date |

When you change the date range, all metrics, charts, and tables on the page update automatically.

***

### Top-Level Metric Cards

At the top of the page, three summary cards give you an instant cost overview for the selected period:

| Card                 | What it shows                              | Example format |
| -------------------- | ------------------------------------------ | -------------- |
| **Total Spend**      | Total cost of messages sent in this period | 12.5B          |
| **Cost per Message** | Unit cost per message sent                 | $0.01          |
| **Cost per Click**   | Unit cost per button click received        | $0.40          |

Each card has an **ⓘ info icon**. Click it to see a tooltip explaining how that metric is calculated.

***

### Performance Metrics

The Performance section has two tabs: **Trend** and **Funnel**.

#### Trend Tab

Shows the total volume of each key metric for the selected period:

| Metric                 | What it counts                                   |
| ---------------------- | ------------------------------------------------ |
| **Messages Sent**      | Total number of template messages sent           |
| **Messages Delivered** | Messages that successfully reached the recipient |
| **Messages Read**      | Messages opened by the recipient                 |
| **Clicks**             | Total button taps across all delivered messages  |

> **Note:** If the template does not contain any buttons, the Clicks metric is not shown.

#### Funnel Tab

Shows the conversion rates between each stage of the message journey:

```
Messages Sent       100%
      ↓
Messages Delivered   46%
      ↓
Messages Read        56%
      ↓
Clicks               10%
```

Each percentage represents the proportion of the previous stage. Use this view to identify where recipients drop off.

***

### Time Series Chart

Below the metric cards, a line chart shows how your key metrics changed over time within the selected date range.

**What the chart shows:**

| Line               | Metric                  | Color  |
| ------------------ | ----------------------- | ------ |
| Sent messages      | Total sent per day      | Yellow |
| Delivered messages | Total delivered per day | Red    |
| Read messages      | Total read per day      | Blue   |

**How to use it:**

* Hover over any point on the chart to see the exact value for that date.
* Use the **legend** at the top of the chart to identify each line.
* The X axis shows dates across the selected range. The Y axis shows message count.

***

### Error Message Analysis

The **Error Messages** section breaks down why some messages were not delivered. It has two tabs:

#### Summary Tab

Displays each error category as a progress bar, showing both the count and the visual proportion relative to total errors.

Common error categories include:

| Error                                            | Description                                                                                    |
| ------------------------------------------------ | ---------------------------------------------------------------------------------------------- |
| **Message undeliverable**                        | The message could not be delivered to the recipient's number                                   |
| **Ecosystem health: message delivery opted out** | WhatsApp's system selected this message for non-delivery as part of ecosystem quality controls |
| **User number part of an experiment**            | The recipient's number was included in a WhatsApp-side test that affected delivery             |

Progress bars are displayed in green tones — the darker the bar, the higher the proportion of that error type.

#### Trend Tab

Shows how error volumes changed over time, using the same date range as the rest of the page.

***

### Button Click Analysis

If your template contains buttons, this section shows how recipients interacted with them. It has two tabs:

#### Table View

Each row represents one button in the template:

| Column           | Description                                                                                                             |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------- |
| **TAG**          | The button's identifier label                                                                                           |
| **TYPE**         | The button type (e.g., Website, Quick Reply)                                                                            |
| **TOTAL CLICKS** | Total number of times this button was clicked                                                                           |
| **TITLE**        | The button's display text                                                                                               |
| **CLICK RATE**   | Percentage of delivered messages that resulted in a click on this button *(calculated as: clicks ÷ delivered messages)* |

#### Chart View

A visual representation of the button click distribution across all buttons in the template.

***

### Message Preview

On the right side of the page, the **Message Preview** panel shows exactly how your template message appears to recipients on WhatsApp.

The preview includes:

* The full message body text
* All buttons with their labels
* The message timestamp

This helps you connect the performance numbers to the actual message your customers received.

***

### Top Blocking Reason

In the bottom-right area of the page, the **Top Blocking Reason** widget highlights the single most common reason messages were blocked or not delivered in the last 30 days.

* The total blocked count is shown prominently.
* An **ⓘ info icon** provides additional context about what this metric means.

***

### Editing the Template

If you identify a performance issue and want to make changes, click the **Edit Template** button at the top of the page. You will be redirected to the template editing screen. After saving your changes, you will return to the template list.

***

### Exporting Statistics

To download the statistics data, click the **Export** button at the top of the page.

* **Format:** CSV
* **Contents:** Metric data for the selected date range

The exported file is named in the format: `insights_YYYY-MM-DD_to_YYYY-MM-DD.csv`

***

### Notes and Limitations

* Statistics are available for all sent template messages regardless of volume — even if only one message was sent.
* Data on the page updates dynamically each time the page is refreshed.
* The **Clicks** section in Performance and the Button Click Analysis section are only shown if the template contains buttons.
* The **Replies** metric is currently under development and is not yet available.
* Click Rate in the Button Click Analysis is calculated as: total clicks on that button ÷ total delivered messages (not total sent).
* The Top Blocking Reason widget always shows data for the last 30 days, regardless of the date range selected for the rest of the page.

***

### Frequently Asked Questions

**Q: I clicked the eye icon but see an empty screen — why?** A: The template you selected has never been sent. Statistics only appear after at least one message has been sent using that template.

**Q: Why is my delivered count lower than my sent count?** A: Not all sent messages are successfully delivered. Delivery can fail due to the recipient's phone being off, number issues, or WhatsApp ecosystem controls. Check the Error Messages section for a breakdown.

**Q: Why is the Clicks section missing?** A: The template you are viewing does not contain any buttons. Click metrics only appear for templates that include buttons.

**Q: How is Click Rate calculated?** A: Click Rate = Number of clicks on that button ÷ Number of delivered messages. It measures how many recipients who received the message went on to click that button.

**Q: Can I compare two templates side by side?** A: Not on this page — each statistics page is for a single template. Return to the Template Messages list and open the eye icon for a different template to view its stats separately.


# Desk360 Balance Management

With Desk360 Wallet, you can manage the payment processes of many services you benefit from such as WhatsApp Business API setup, subscription, adding new users, and WhatsApp Message Templates from a single place. Before you benefit from a paid service, you need to top up your wallet balance. You can also see the details of the transactions made with your wallet and receive an invoice.

## **Wallet Management**

You can manage your payment processes such as adding/updating cards, viewing balance, balance top-up, and refund requests, and access your wallet history via Desk360 wallet.

**Adding/Updating Cards:** You can follow these steps to add a card to use in your wallet: Wallet > Add Payment Method. In the window that pops up, simply enter your card information and save the information you have entered.\
\
You can save only 1 card in your wallet. You can change the card information you have previously entered by clicking on the 3 dots on the top right of the card you have saved on the Wallet page.

**Balance viewing and top-up:** You can view your current balance by going to your Desk360 Wallet or you can top up balance to your wallet via bank transfer or credit/debit card methods by following these steps: Wallet > Add Balance.

After accessing the “Add Balance” page, you need to type the amount you want to add. The minimum amount you can add to your wallet is 50 USD. Once you have set the amount, you can proceed to the “Payment Method” page.

On the Payment Method page, you can choose the method that suits your needs from the Bank Transfer or Card options.

If you choose the Bank Transfer method, you can see the transaction summary of your payment on the right side of the screen. After completing this step, you will be directed to the “Wire Transfer Instructions” page. On this page, you can access your payment summary and access the details of the account to which you will make the bank transfer. You can quickly copy the account information by using the copy function on the right of the account detail lines. You can enter your bank transfer by pressing the Enter Bank Transfer button.

&#x20;This process does not automatically transfer money from your account. You need to transfer money to your Desk360 bank account following the instructions shared with you.

If you choose to pay with a card, you can make the payment using the card whose information you entered before or with new card information. You can see your payment summary on the right side of the screen and continue the payment process.

**Balance History:** You can follow these steps to view the balance history of your wallet: Wallet > Balance history. On this page, you can view your current balance, the latest status of your top-ups and expenditures, and search by entering a date filter. You can download a summary of your wallet history by clicking on the button to the right of the date filter.

**Invoice Information:** You can follow these steps to view and edit your invoice information: Wallet > Invoice Information or Settings > Invoice Information.

On this screen, you can access and edit your invoice information or view your previously issued invoices.

On this page, you can access the invoice editing screen by clicking on the Edit button in the upper right corner. On the invoice editing screen, you need to fill in the fields by selecting the suitable option from the Personal or Business options. All fields must be filled in. You can also access your past invoices by clicking on See All Invoices. Invoices will be sent to your email address.

## Auto Recharge

To avoid hitting fee limits during sending, users can set up an auto top-up when their balance falls below a certain threshold.<br>

<figure><img src="/files/2h8c4RSAUeexEU3O3tRS" alt=""><figcaption></figcaption></figure>

After making a minimum initial deposit of $50, they can enter the desired additional amount in the field below. This additional amount must also be at least $50.

## **WABA Pricing**

Meta has transitioned from a conversation-based pricing model to a **per-delivered-message pricing model**. Each outbound message is billed individually, and charges are determined by message category and destination country.

The four applicable message categories are:

* **Marketing** – Promotional content, special offers, announcements.
* **Utility** – Account updates, confirmations, reminders, notifications.
* **Authentication** – One-time passcodes, login verifications.
* **Service** – Responses to customer-initiated conversations. *(Service messages sent within the 24-hour customer service window remain free of charge.)*

&#x20;Regional Pricing (Indicative USD Rates)

| Region                            | Marketing ($)                           | Utility ($)                                   | Authentication ($)                      |
| --------------------------------- | --------------------------------------- | --------------------------------------------- | --------------------------------------- |
| **Turkey**                        | \~0.010–0.012                           | \~0.005–0.006                                 | \~0.008–0.009                           |
| **Europe** (examples: FR, DE, UK) | FR: \~0.143 / DE: \~0.137 / UK: \~0.053 | FR: \~0.030–0.085 / DE: \~0.055 / UK: \~0.022 | FR: \~0.069 / DE: \~0.077 / UK: \~0.036 |
| **North America** (US/Canada)     | \~0.025                                 | \~0.004                                       | \~0.0135                                |

> **Note:** Rates vary by market and currency. For precise and up-to-date pricing, consult Meta’s official [Message Rate Card Tool](https://business.whatsapp.com/products/platform-pricing?utm_source=chatgpt.com).

#### Key Considerations

* **Service messages are free** within the 24-hour response window when initiated by the customer.
* **Entry-point initiated conversations** (via Ads or website buttons) allow businesses to send messages free of charge for 72 hours.

####

&#x20;                                                     [<mark style="color:blue;">**Homepage**</mark>](https://desk360.com/)                                         [ ](https://desk360.com/pricing)[<mark style="color:blue;">**Pricing**</mark>](https://desk360.com/pricing)

&#x20;


# AI Agent Setup and Configuration

## AI Agent Setup and Configuration

### Desk360: AI Agent Customer Assistant Setup and Configuration Guide

#### Introduction

The AI Agent developed by Desk360 aims to automate customer support processes, reduce the workload of representatives, and improve customer experience. This AI-powered system provides uninterrupted service even when customer representatives cannot provide live support, ensuring 24/7 accessibility.

AI Agent enables faster and more effective communication with expanding customer bases. This allows instant responses to customer demands while representatives can focus on more complex and critical issues. This both increases operational efficiency and enhances customer satisfaction.

#### AI Agent Activation Scenarios

There are two fundamental scenarios for AI Agent usage:

**When representatives are offline:** If a customer representative is not active in the system, AI Agent steps in to address customer questions and provide guidance.

**Always active mode:** AI Agent can be configured to respond in all situations, regardless of whether customer representatives are online or offline.

This flexibility provides organizations with an advantage in ensuring service continuity. AI Agent makes customer interaction seamless, making the support experience uninterrupted and fast.

#### Welcome Screen and User Interface

In the Desk360 platform, if a user has not yet created an AI Agent or if the existing AI Agent has been deleted, they encounter a special welcome screen featuring the ChatGPT logo. When they press the Start button, the steps for creating an AI Agent are presented clearly and understandably, directing them to the first step, the General tab.

After creating an AI Agent, users encounter a structure consisting of five main tabs in the user interface:

* **General:** Section where basic settings are configured
* **Knowledge Base:** Area where training data for AI is uploaded
* **Commands:** Tab where commands are organized to customize responses
* **Agent Redirections:** Settings for redirecting to customer representatives by defining keywords
* **Testing Area:** Agent is tested and activated

Settings and content made in each tab are saved with the "Save and Continue" button, and users are automatically directed to the next tab.

Additionally, activity status control can be performed in the AI Agent interface; users can activate or deactivate the Agent at any time. The deletion process begins by clicking the trash icon and continues with a confirmation pop-up that appears on the screen. When the user confirms the deletion, the AI Agent is permanently removed from the system.

### 1) General Tab: AI Agent Basic Settings

The General tab is a critical configuration stage where the basic working principles and communication style of the AI Agent are determined. In this section, users are expected to make the following six basic settings:

#### WhatsApp Business Account Selection

The WhatsApp Business account through which the AI Agent will respond is selected here. If the user has multiple WhatsApp Business accounts defined, a selection field opens; if only one account exists, it is automatically assigned. When a new WhatsApp Business account is added, the selection screen becomes visible again.

#### AI Agent Responses

The condition for AI Agent responses is determined here. Two options are available:

* **Always:** AI Agent always responds to customers
* **Only when operator is offline:** Responds only when customer representatives are offline

The default setting is Always.

#### Conversation Tone (Tone of Voice)

The AI's communication tone is selected. Available options are Neutral, Friendly, and Formal. Selecting the appropriate tone according to user experience and brand identity is important. The default value is Neutral.

#### Emoji Usage

The preference for emoji usage in messages is determined here. By default, emoji usage is disabled. Users can activate this feature if they want to provide more intimate communication with customers.

#### GPT Model Selection

The AI Agent's basic language model is selected here. By default, the GPT-4o Mini model is assigned. Different models supported by Desk360 are presented in list form, and performance and features may vary according to the selected model.

Proper and conscious configuration of all these settings directly affects both the technical performance of the AI Agent and the quality of interaction with customers. Users ensure that selected preferences are saved by pressing the "Save and Continue" button after each completed setting and proceed to the next configuration step.

### 2) Knowledge Base Tab: Creating Information Database for AI Agent

The Knowledge Base tab creates the fundamental data source for the AI Agent to provide accurate, fast, and effective responses. In this section, users add various data types to train the AI and increase its knowledge capacity for customer demands.

All added information is processed by the AI Agent's algorithm and used in response generation. Providing accurate and diverse data sources enables the AI to better understand customer demands and produce quick solutions. Flexibility in uploading different data formats allows users to create knowledge bases specific to their sectors and needs.

Knowledge base creation steps and rules are as follows:

#### File Upload

Users can upload documents for the AI Agent to learn. Supported file formats include .pdf, .doc, .docx, .txt, .csv, .dot, .ppt. A maximum of 5 files can be uploaded per user with a 10 MB size limit per file.

#### Text Input

Users can also provide information to the AI by directly writing text. These texts are limited to a maximum of 1024 characters. Text input is ideal for providing additional information easily and quickly, such as explanations, brief instructions, or frequently used answers.

#### Website Addition

Websites can be added to the information base using two main methods: Crawl and individual website. When the Crawl method is selected, pages connected to the specified URL are listed under "Connected Links," and users can select or remove pages among these. A maximum of 20 different websites can be added. If there are more than 20 links, the "Add" button is automatically disabled.

#### Question-Answer Definition

Question and answer pairs are added for the AI Agent to provide correct responses to frequently asked questions. It is mandatory to enter both questions and answers in this field; if one of the fields is left empty, the user receives a "This field is required" warning. A maximum of 20 question-answer pairs can be added.

### 3) Commands Tab: Custom Response Creation and Optimization

The Commands tab is a critical step for the AI Agent to provide personalized and optimized responses in customer communication. In this section, users write their specific requirements briefly and clearly in the text input field on the left. Then, by pressing the "Generate" button, an optimized command generated by the AI model using the entered information is provided. The command displayed on the right can be edited by the user and customized according to needs.

The Commands tab directly affects the quality of the AI Agent's communication with customers. A well-configured command ensures the generation of accurate and purpose-appropriate responses. After making necessary adjustments, users save changes by clicking the "Save and Continue" button at the bottom of the page and are directed to the next step, the Agent Redirections tab.

### 4) Agent Redirections Tab: Trigger Settings and Redirection

The Agent Redirections tab is a configuration area that enables the AI Agent to make automatic redirections to customer representatives. In this section, users can define specific keywords so that when customers use these words, they are directly transferred to real representatives. For example, phrases like "discount, I want to buy" can be defined.

Additionally, when customer representatives are offline, the AI Customer Representative Continue Conversation feature provides informational messages to customers and continues communication seamlessly. This way, user experience is not negatively affected.

All settings are saved with the "Save and Continue" button, ensuring smooth transition to the next tab.

### 5) Testing Area Tab: Testing and Publishing

The Testing Area tab is the final stage where the AI Agent is tested and activated after completing its configuration. In this section, users experience the responses given by the AI Agent to customer questions, evaluating them in terms of accuracy, fluency, and consistency.

During testing, if users need to, they can return to previous tabs and make necessary adjustments; thus, the AI Agent is optimized.

This stage is created to ensure uninterrupted and quality customer experience, providing insight into the AI Agent's field performance.

When satisfied with the tests, users press the "Finish" button to create the AI Agent. When publishing is completed, the system directs users to the welcome screen and the AI Agent is opened for service in passive mode. Users need to switch the toggle to active position to activate it.

Only 1 AI Agent can be active at a time.\
\
AI Agent pricing structure is given below.\ <br>

| GPT-4o              |             |          |                           |
| ------------------- | ----------- | -------- | ------------------------- |
| Conversation Number | Total Token | Total($) | %40 Desk360 Comission ($) |
| 1000                | 400k        | 4        | 1,6                       |
| 10000               | 4M          | 40       | 16                        |
| 100000              | 40M         | 400      | 160                       |
|                     |             |          |                           |
| GPT-4o mini         |             |          |                           |
| Conversation Number | Total Token | Total($) | %40 Desk360 Comission ($) |
| 1000                | 400k        | 0,32     | 0,13                      |
| 10000               | 4M          | 3,2      | 1,28                      |
| 100000              | 40M         | 32       | 12,8                      |


# Chat

**Desk360 Chat Interface** allows you to communicate with users in real time. When you click the **"Chat"** button in the admin panel interface, you gain access to the chat list and customer profiles.

#### 1 - Left Area: Active and Archived Chat Lists

2 - Middle Area: Conversation space with the customer

3 - Right Area: Customer profile and general information section

<figure><img src="/files/M2QgChgMLrdLgGQ6U7os" alt=""><figcaption></figcaption></figure>

#### **Chat List Overview**

The chat list is divided into two main categories:

* **Active Chat List**:\
  Contains conversations with users that are still within the 24-hour messaging window. You can continue messaging all users in this list.
* **Archived Chat List**:\
  Contains chats that have either passed the 24-hour messaging window or have been resolved for a specific reason. Chats that haven't completed the 24-hour period can be moved back to the active list.

***

#### **b) Status Selection**

Users can update their status based on their current availability. After each status change, the timer below resets and starts counting again. Status descriptions are as follows:

* **Online**:\
  When the user is online, they can receive new customers and chat requests in the queue. They have access to both active and archived chats.
* **Invisible**:\
  The user cannot receive new customers or chat requests but can continue chatting with their current customers. They have access to both active and archived chats.
* **Break**:\
  The user cannot receive new customers or chat requests but can continue chatting with their current customers. They have access to both active and archived chats.
* **Offline**:\
  The user cannot receive new customers or chat requests and cannot continue chatting with their current customers. Only archived chats are accessible. If a user switches from Online to Offline, their active chats are reassigned to others in the queue.


# Active Chat

#### **a) Reassigning a Conversation**

If a customer representative is unable to respond to a request in real time, the conversation can be reassigned to another available online representative.\
By clicking the **"Assign Chat"** button, a list of assignable representatives will be displayed.\
The list opens automatically, and once an available representative is selected, the conversation is transferred immediately.

***

#### **b) Adding Tags**

Tags can be added to categorize users.\
For example, a new customer can be marked with a tag like **"New Customer"**.\
Tags are entered via the **"Add Tag"** button and added by pressing the **Enter** key.\
Tags can be removed at any time.

To view users with specific tags, use the filter function in the **Archived Chat** page.

***

#### **c) Sending Template Messages**

There are two ways to send a template message:

1. From within the chatbox
2. Via the **"+"** button at the top left

**Chatbox Template Message Sending:**

Predefined and approved template messages can be sent to customers in the active chat list.\
To send a message, click the icon located in the red area inside the message bubble.\
Once clicked, a list of pre-approved and ready-to-send templates will appear.\
If your balance does not meet the minimum requirement, template message sending is disabled and a top-up warning will be displayed.

**Template Message Sending (outside of chat):**

Template messages can also be sent to archived or new contacts (i.e., contacts without ongoing conversations).\
You must manually enter the phone number of the recipient.\
**Bulk template message sending is not available** in this section.\
If your balance is insufficient, the template message will not be sent and a top-up warning will appear.

***

#### **c.1) Sending Template Messages Outside of Chat List**

Template messages can be sent not only during active conversations but also to users from new or archived chats via a dedicated interface.

When the **"+"** button is clicked, a screen opens where the recipient’s phone number must be entered.\
\
Only **one phone number** is allowed in this field. For sending messages to multiple recipients, please refer to the relevant page.

Once the number is entered, the template message selection screen appears.\
Only **one template message** can be selected. By hovering over the eye icon, you can preview the content of the selected template. You then proceed to the final review step.

The phone number is reviewed for final confirmation. When the **Continue** button is clicked, the selected template message is sent.

***

#### **d) Ending a Conversation**

Before ending a chat, a **“Reason”** must be selected.\
The reason list can be managed from: **Main Panel → Chat Settings → Request Topics** section.\
After selecting a reason, click the adjacent **"Confirm"** button to close the conversation. It will then be moved to the **Archived Chat List**.

The chat will not return to the active list unless a new message is received from the customer.\
If the 24-hour messaging window is still valid, the conversation can be manually moved back to the active chat area.

After adding a new reason in the panel, please **refresh the page** to make sure it appears in the list.


# Archieve Chat

To access the **Archived Chat List** screen, click the designated menu button in the **chat management menu**.

* New tags can be added to archived conversations, but the **resolution reason cannot be changed**.
* If a conversation is archived **before the 24-hour messaging window has expired**, it can be moved back to the **Active Chat List**, and communication with the customer can continue.
* If a customer in the **Archived Chat List** sends a new message, the conversation is **automatically moved back to the Active Chat List**.

#### **a) Moving a Chat from Archived to Active**

* Conversations that were archived **within the 24-hour messaging window** can be moved back to the **Active Chat List** using the relevant button.
* This button **will not be visible** for chats that have exceeded the 24-hour window.
* To move the conversation back to active, a **template message** can also be sent to the user.

***

#### **b) Filtering**

In the **Archived Chats** section, various filters can be used to review past conversations.\
Please note that **filtering is currently not available** in the **Active Chat List**.\
Archived chats can be filtered based on the following four criteria:

* **User**:\
  Filters archived chats based on who archived them. Both archived and active chats are accessible.
* **Reason**:\
  Shows the reason why a chat was archived. This is the reason selected when ending the conversation.\
  All reasons are displayed here, regardless of whether they are currently active or inactive.
* **Tag**:\
  Filters chats by the tags assigned to users. All existing tags are shown in this section.
* **Date**:\
  Users can access conversations within a desired date range.


# Chat Reports

**Chat Reports** allow you to monitor your agents’ performance and track statistics for chats coming through WhatsApp. From this page, you can view metrics such as waiting times, tag distribution, peak hours, and also download detailed reports.

#### Accessing the Page

* Go to **Chat > Chat Reports** from the left menu.
* By default, data from the **last 30 days** is displayed.
* Use the **date filter** at the top right to select a different range.
* At the top left, you can select a WhatsApp account:
  * If only one WABA integration exists, no selection is required.
  * If multiple WABAs exist, the data of the first added account is shown by default.

**Note:** All data is filtered based on the selected date range.\ <br>

<figure><img src="/files/XtUb2CZOnbhDNc8URIvH" alt=""><figcaption></figcaption></figure>

#### Page Summary

For the selected date range, the following are displayed:

* **Total Number of Chats** (resolved + unresolved).
  * Chats reactivated from the archive increase the total.
  * Transferring chats between agents does not increase the total.
  * Chats answered by AI are not included.
* **Average Waiting Time**
* **Most Requested Topic**
* **Peak Day**
* **Peak Hour** (based on chats in the selected date range).\ <br>

  <figure><img src="/files/fjqK0HrVBxK2Kfz3xZ2o" alt=""><figcaption></figcaption></figure>

#### Details

**Chat Volume Table**

* Shows the number of chats received per day.
* **Note:** When calculating the average, days with no chats are also included.
* If a customer has 2 sessions, both sessions are counted separately.\ <br>

  <figure><img src="/files/5E56vMXgWcppdXOy43XM" alt=""><figcaption></figcaption></figure>

**Waiting Time**

* Displays the daily average time customers wait before being transferred to an agent.
* AI interactions are excluded.
* Format example: `1D 18H 12M 37S`.\ <br>

  <figure><img src="/files/eC16Q7LWa2FeryIliJ3K" alt=""><figcaption></figcaption></figure>

**Reason Report**

* Shows how many times each topic was selected, listed in descending order.
* **Note:** If a user changes the selected topic, the previous one will no longer appear in the statistics.\ <br>

  <figure><img src="/files/TXgEdt848xZSEM4XgU6E" alt=""><figcaption></figcaption></figure>

**Tag Report**

* Displays the frequency of tags applied to chats.
* **Note:** If a tag is removed from a chat, reports update dynamically (including downloaded reports).

<figure><img src="/files/ULzXlV8tc6zhRTZ6s0j1" alt=""><figcaption></figcaption></figure>

**Peak Hours**

* Shows days of the week (vertical) vs. 24 hours of the day (horizontal).
* A color scale indicates density (darker = more chats).
* **Note:** This report is displayed on a weekly basis.\ <br>

  <figure><img src="/files/GKRGIw0dmOcxsZXQrt9q" alt=""><figcaption></figcaption></figure>


# User Report

**User Reports** allow you to measure the performance of each customer representative (agent).

#### Page Features

* Date filter (default: last 30 days).

#### Displayed Data

* **Username**
* **Average First Response Time** (average time of the first reply after the chat is assigned).
* **Average Resolution Time** (time until the chat is moved to archive, including those reactivated from archive).
* **Assigned Chats** (chats directed to the agent, including forwarded ones).
* **Resolved Chats** (chats archived by the agent).

  > Note: Chats automatically archived after 24 hours are **not** included in the “Resolved Chats” count.
* **Reactivated from Archive**
* **Forwarded Chats**

#### Report Download

At the bottom of the page, you can click the **“Send Report”** button to receive all data for the selected date range as a CSV sent to your email address.

**CSV columns:** Username, Average First Response Time, Average Resolution Time, Assigned Chats, Resolved Chats, Reactivated from Archive, Forwarded Chats.

\ <br>

<figure><img src="/files/vtufNf53W9J43Bugt6QK" alt=""><figcaption></figcaption></figure>


# Chat Cockpit

**Cockpit** displays the real-time statuses and performance of customer representatives (agents). Only root accounts have access.Data is reset at the end of each day.\ <br>

<figure><img src="/files/r620rAQ6YE48XUXmZDGM" alt=""><figcaption></figcaption></figure>

#### Features

* WhatsApp account selection (if multiple WABAs are available, selection can be made).
* Agents are grouped by their status:
  * Online
  * Break
  * Invisible
  * Offline (collapsed by default, expandable on click).

#### Displayed Data

* **Username**
* **User status** (can be changed by root admin)
  * Offline agents’ status cannot be changed.
  * After a status change, data is **not** reset; data only resets at the end of the day.
* **Average First Response Time** (daily, real-time).
* **Average Resolution Time** (daily, real-time).
* **Active Chats**
* **Resolved Chats**
* **Reactivated from Archive**
* **Forwarded Chats**


# Desk360 Chat Settings

Chat Settings is a section that allows you to manage customizations that may be required during the chat process. Under this menu, there are four main options:

Reason Settings: This section includes the reasons added for ending a conversation and moving it to the archive on the chat screen. You can create new request topics, edit existing ones, or deactivate them.

Tag Management: Tags are keywords or short phrases that allow you to add multiple contexts to requests. These tags are visible on the customer chat page but are not reflected to the customer.

Auto Replies: These are messages sent automatically when a customer representative is unavailable or during specified days/hours according to your rules.

Quick Response: Predefined messages that allow you to quickly respond to frequently asked questions. Quick Replies can be used directly in the Chat screen.


# Reason Settings

You can create different reasons based on customer requests received through Desk360. These reasons can be customized according to product features. This makes it easy to analyze what the customer is contacting you about. When you want to end an active conversation with a customer, you can move the chat to the Archive by selecting a Reason. If you wish to reconnect within 24 hours, you can move the chat back to the "Active Chat" page.

You can use the Add Reason button to create a new reason edit existing ones, or set them to inactive.

**a) Creating a Reason**

Click the Add Topic button to add a new topic. In the pop-up screen, enter two main pieces of information:

* Request Topic Name: A title with a maximum of 50 characters.
* Status: Can be set as active or inactive. Inactive topics will not appear on the chat screen.<br>


# Tag Management

Tags allow you to categorize your customers or support requests and facilitate workload sharing between teams. For example, a tag like "technical\_issue" can be added for technical problems. With tags, you can filter requests and perform bulk actions.\
\
**a) Adding a New Tag**

You can add a new tag via the Chat Settings or the Chat page.

* Go to the Tag Management page under Chat Settings and click the Add Tag button.
* On the Chat page, enter a keyword that is not already in your list and press enter.

Tag Name should be a maximum of 50 characters. Do not use spaces; use "-" or "\_" instead.

<br>


# Auto Replies

With the WhatsApp Auto Reply feature, you can automatically send messages such as greetings, information, or legal texts to customers at scheduled days and times. This increases customer satisfaction and shortens response times.

Auto replies can be deleted or edited.

\
**a) Creating an Auto Reply**

Click the Add Auto Reply button and fill in the following fields:

* Name: Maximum 50 characters. This is the name displayed in the list.
* Description: The content of the message to be sent. Maximum 4096 characters. You can optionally attach files in .jpeg, .jpg, .pdf, .doc, .mp4, .png formats.
* Day Selection: Specifies the days the message will be sent. If no time is selected, it will be valid all day.
* Time Selection: Optionally define the time range during which the message will be sent.

After completing all fields, click Save to activate the auto reply.


# Quick Response

Quick Replies help support agents save time by creating predefined answers to frequently asked questions. This way, the support team can send ready-made responses with a single click instead of typing repetitive answers manually.<br>

**a) Creating a Quick Response**

Click the + Add Quick Response button at the top right. Fill in the following fields in the form:

* Title: A short name describing the reply.
* Content: The message to be sent to the customer. Formatting (bold, italic, link, emoji) is supported.
* Status: Specifies whether the reply is active or inactive.

After completing all fields, click the Save button. Use the ✏️ icon to edit and the 🗑️ icon to delete the reply. Deletion is irreversible.

**b) Sending a Quick Response**

You can use defined quick replies during an active conversation with these steps:

* Open the chat screen.
* Select an active customer conversation.
* Click the quick reply icon next to the message box.
* The list of defined replies will appear. Select the appropriate one.
* The reply content will be automatically added to the message box. You can edit it if needed.
* Click the Send button to send the message.

Notes:

* Only active replies are visible.
* You can send multiple quick replies to a customer consecutively.
* Replies can be edited and personalized.


# Settings

## **Account Settings**

On the account settings page, you can edit the user settings of your Desk360 account and change your password or panel language. You can access the account settings by following these steps: Settings > Account Settings.

**User settings:** On this field, you can set a profile photo for your Desk360 account and change your name, surname, or phone number.

**Panel Settings:** In this field, you can change your Desk360 panel language to English or Turkish.

**Time Zone:** The user can perform actions based on the time zone in which the product operates. For example, if a product in Turkey provides services to the United States, the U.S. time zone can be applied.

## **Invoice Information**

You can access detailed information about the invoice information page under the [Wallet](/desk360-balance-management#wallet-management) category.

&#x20;                                                     [<mark style="color:blue;">**Homepage**</mark>](https://desk360.com/)                                         [ ](https://desk360.com/pricing)[<mark style="color:blue;">**Pricing**</mark>](https://desk360.com/pricing)


# API Documentation

## :speech\_balloon: Introduction

​Desk360 API is a Representational State Transfer ([REST](https://en.wikipedia.org/wiki/Representational_state_transfer)) ​​structure that provides operations such as:\
\
:black\_medium\_small\_square:Reading\
:black\_medium\_small\_square:Modifying\
:black\_medium\_small\_square:Adding data\
:black\_medium\_small\_square:Deleting data\
\
from your help desk.

{% hint style="success" %}
Desk360 APIs also support Cross-Origin Resource Sharing ([CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing)).
{% endhint %}

### :sparkles: HTTP Methods

> **The list of API commands used by Desk360**

| **Command** | **Description**            |
| ----------- | -------------------------- |
| **GET**     | Fetches object(s)          |
| **POST**    | Creates an object          |
| **PUT**     | Updates/Modifies an object |
| **DELETE**  | Deletes an object          |

{% hint style="info" %}
All API requests must reach the secure endpoint i.e. **HTTPS** only
{% endhint %}

### :dash: **Rate Limit** <a href="#rate-limit" id="rate-limit"></a>

This rate limit applies are based on IP address.

| **Plan**     | **Rate Limit/Minute** |
| ------------ | --------------------- |
| **Business** | 60                    |

{% hint style="success" %}

* Make sure to apply the rate limit-best practices and it stays within the rate limit.
* Make sure to make API calls in a safe layer such as your backend, **not** **front-end or your mobile application**.
* Remind that even invalid requests are included in the rate limit.
  {% endhint %}

Check your current rate limit status by looking at the following HTTP headers returned in response to each API request:

```http
HTTP/1.1 200 OK
Content-Type: application/json
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58
```

| **Title**                 | **Description**                                                                                                                                            |
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **X-RateLimit-Limit**     | Total number of API calls allowed per minute.                                                                                                              |
| **X-RateLimit-Remaining** | The number of requests remaining in the current rate limit window.                                                                                         |
| **X-RateLimit-Reset**     | The reset time in Unix epoch time format.                                                                                                                  |
| **Retry-After**           | <p>The number of seconds you should wait in order to trigger your next API request.</p><p>This header is returned only when the rate limit is reached.</p> |

{% hint style="info" %}
If your API request is received after the rate limit is reached, Desk360 will return an error in the response. The **Retry-After** value in the response header will tell you how long to wait before sending another API request.
{% endhint %}

```http
HTTP/1.1 200 OK
Content-Type: application/json
Retry-After: 26
```

## :rocket: Getting Started

### :lock: Authentication <a href="#authentication" id="authentication"></a>

> **Who can access my helpdesk? Can anyone see my data?**

Before prioritizing responding to a customer or using any of the APIs listed above, you must **authenticate** or **log in** as you sign in to your helpdesk web portal.

You need to create an API Key for your WABA account using the "Create API Key" button on the Public API page where you entered your webhook URL information. You must use the API Key you generate as the Bearer token required for authorization in Desk360 API requests.

All Desk360 API endpoints need this API Key as Bearer token in order to respond to your request.

You can see an example of the API Key below.

```
06RS4pzxsPquYVOmHAZlogoRNatNjYnVCI1eZZiUK1Fu1DpxqFz1Fl9zyRON4juM
```

### :paperclip: Attachments

The following endpoints are supported with attachments:

:black\_medium\_small\_square:Sending a media message\
:black\_medium\_small\_square:Sending a interactive message

{% hint style="info" %}
Please follow the guidelines listed below:

* Only files on a local machine can be added using the API. You can not use links!
* **Content-Type** should always be multi-part/form-data for attached requests.
  {% endhint %}

### :x: Errors

> **I received an error. How can I solve it?**

API requests that cause errors will return an appropriate HTTP status code to help determine the type of error. You can use the following table to understand what each code means:

| **HTTP Status Code** | **Status Code Definition**       | **Description**                                                                                                                                                                                                                                                                            |
| -------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **400**              | **Client or Validation Error**   | <p>The request body/query string is not in the correct format.</p><p>For example, the <strong>Send a message</strong> API requires the <strong>to</strong> field to be submitted as part of the request, and if it is missing, this status code is returned.</p>                           |
| **401**              | **Authentication Failure**       | <p>This indicates that the <strong>Authorization</strong> field is either missing or incorrect.</p><p>Check <a href="#authentication">Authentication</a> for more information.</p>                                                                                                         |
| **404**              | **Requested Resource not Found** | <p>The request contains an <strong>invalid ID</strong> or <strong>invalid parameters in the URL</strong>.<br>For example, an API call to retrieve a integration with an invalid ID will return an <strong>HTTP 404</strong> status code to inform you that no such integration exists.</p> |
| **405**              | **Method not allowed**           | <p>This API request has used the wrong HTTP method.</p><p>For example, a <strong>DELETE</strong> requested on <strong>/integrations</strong> endpoint will return an <strong>HTTP 405</strong> as <strong>/integrations</strong> allows only <strong>GET</strong> requests.</p>            |
| **406**              | **Unsupported Accept Header**    | Only **application/json** and **\*/\*** are supported. When uploading files **multipart/form-data** are supported.                                                                                                                                                                         |
| **415**              | **Unsupported Content-type**     | Only **application/json** is supported.                                                                                                                                                                                                                                                    |
| **429**              | **Rate Limit Exceeded**          | The API rate limit allowed for your Desk360 domain has been exhausted. Check[ Rate Limit](#rate-limit).                                                                                                                                                                                    |
| **500**              | **Unexpected Server Error**      | You can't do much more here. This indicates an error on the Desk360 side. Please [email us](mailto:support@desk360.com) your API script with response headers. We will contact you and fix this issue as soon as possible.                                                                 |

**Sample error response**

In addition to the HTTP status code, most errors also return a response with more information to help you troubleshoot the error. An example error response is shown below. The format of the error response is explained after the example.

```http
    "error": {
        "code": "failed_validation",
        "message": "The to field is required."
        "doc_url": "https://docs.desk360.com/api"
    }
}
```

**Error Response Fields**

| **Field**    | **Description**                                                  |
| ------------ | ---------------------------------------------------------------- |
| **code**     | Custom error code that is machine-parseable.                     |
| **message**  | Descriptive error message.                                       |
| **doc\_url** | A link to guide you if there is a solution on the documentation. |

#### Error Codes

| **Code**                            | **Description**                                                                                                                                                                            |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **authentication\_exception**       | Authentication failed. The token is missing or invalid. Do not forget to put "**Bearer**" in the beginning of your token. eg: "**Bearer YOUR-API-TOKEN**"                                  |
| **method\_not\_allowed\_exception** | If the method and endpoint is mismatched, you will get this error. Please check the endpoint method. eg:  [Products](broken://pages/-MQC-odt5EE5AOxHXsnb#products) only allows GET method. |
| **not\_found\_exception**           | You may have made a typo in your request URL.                                                                                                                                              |
| **model\_not\_found\_exception**    | Requested resource not found, the resource maybe deleted or maybe the resource is not yours.                                                                                               |
| **internal\_server\_error**         | The error is coming from our servers. If you have been receiving this error message for a while, [contact us](mailto:support@desk360.com).                                                 |
| **insecure\_request\_exception**    | HTTP is not allowed. Use **HTTPS** instead.                                                                                                                                                |
| **too\_many\_requests\_exception**  | Check [Rate Limit](#rate-limit).                                                                                                                                                           |
| **invalid\_credentials**            | You typed your email/password wrong.                                                                                                                                                       |
| **too\_many\_attempts**             | If you entered your email/password wrong more than 5 times, you should wait for a minute.                                                                                                  |
| **not\_authorized**                 | You do not have permission to modify the resource.                                                                                                                                         |
| **not\_found**                      | Requested resource not found, the resource maybe deleted or maybe the resource is not yours.                                                                                               |
| **failed\_validation**              | This is a validation error, please read the message and apply what it says.                                                                                                                |

### :page\_facing\_up: Pagination

API responses that return a list of objects are paginated, for example, **View Integration List**. Add the parameter page to the query string to navigate through the pages. The page number starts from 1 and each page is fixed to show 20 objects.

```http
https://public-api.desk360.com/api/v1/integrations?page=1
```

The "Link" header in the response will be showing the next page if it exists:

```http
Headers
"Link" : <https://public-api.desk360.com/v1/integrations?page=2>; rel=next
```

{% hint style="info" %}
If you are on the last page the link header will not be filled.
{% endhint %}

### :white\_check\_mark: Best Practices

* Whenever it is possible, please queue API calls on your side. This allows you to buffer recent calls to avoid reaching the rate limit. Once you reach the rate limit, retry API calls after the retry period.
* Whenever it is feasible, cache the data that does not change much on your side. For example, the mapping between agent name and ID is extremely unlikely to change, so it is a useful approach to cache this data to avoid the rate limit.&#x20;
* Avoid making API calls directly from a mobile app, instead, send the request to your servers and make API calls from there. This ensures that if an API endpoint is changed, you can make and deploy the change on your server instead of updating your application and forcing your customers to the latest version.

## Integrations

Apart from its competitors, Desk360 enables its customers to manage multiple integrations under one account.

In order to find your **Integration ID**, visit [Integrations](#introduction).

### Integrations <a href="#integrations" id="integrations"></a>

<mark style="color:blue;">`GET`</mark> `https://public-api.desk360.com/v1/integrations`

List of your integrations.

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | string | Your API token |

{% tabs %}
{% tab title="200 " %}

```json
[
    {
        "id": 11,
        "display_name": "YourIntegration1",
        "phone_number": "+905554443322"
    },
    {
        "id": 22,
        "name": "YourIntegration2",
        "logo": "+905555555555"
    }
]
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location --request GET 'https://public-api.desk360.com/v1/integrations' \
--header 'Authorization: Bearer YOUR_API_TOKEN'
```

{% endtab %}

{% tab title="C#" %}

```csharp
var client = new RestClient("https://public-api.desk360.com/v1/integrations");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer YOUR_API_TOKEN");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations")
  .method("GET", null)
  .addHeader("Authorization", "Bearer YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var axios = require('axios');

var config = {
  method: 'get',
  url: 'https://public-api.desk360.com/v1/integrations',
  headers: { 
    'Authorization': 'Bearer YOUR_API_TOKEN'
  }
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HTTPHEADER => array(
    'Authorization: Bearer YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://public-api.desk360.com/v1/integrations"

payload={}
headers = {
  'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
```

{% endtab %}
{% endtabs %}

## Chats

Every WhatsApp conversation between your customers and an integration is stored as a chat. Each chat belongs to exactly one integration and groups all messages exchanged with the same contact.

In order to find your Chat ID, list the chats under an integration via List Chats.

### Chats

<mark style="color:blue;">`GET`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId/chats`

List of your chats.

#### Path Parameters

| Name                                             | Type    | Description                      |
| ------------------------------------------------ | ------- | -------------------------------- |
| integrationId <mark style="color:red;">\*</mark> | Integer | The ID of your integration       |
| tag\_start\_date                                 | String  | The start date for tag filtering |
| tag\_end\_date                                   | String  | The end date for tag filtering   |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | string | Your API token |

{% tabs %}
{% tab title="200 " %}

```json
[
    {
        "id": 1024,
        "integration_id": 11,
        "phone": "90xxxxxxxxxx",
        "name": "John",
        "tags": [
            {
                "id": 12,
                "name": "tag-name-1",
                "created_at": "2024-05-30T12:14:28.000000Z",
                "updated_at": "2024-05-31T06:33:30.000000Z"
            },
            {
                "id": 27,
                "name": "tag-name-2",
                "created_at": "2024-05-30T12:14:28.000000Z",
                "updated_at": "2024-05-31T06:33:30.000000Z"
            }
        ],
        "last_message_at": "2024-05-31T06:33:30.000000Z",
        "created_at": "2024-05-30T06:33:30.000000Z"
    },
    {
        "id": 1025,
        "integration_id": 11,
        "phone": "90xxxxxxxxxx",
        "name": "Doe",
        "tags": [],
        "last_message_at": "2024-05-31T06:33:30.000000Z",
        "created_at": "2024-05-30T06:33:30.000000Z"
    }
]
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

<pre class="language-bash"><code class="lang-bash">curl --location --request GET 'https://public-api.desk360.com/v1/integrations/:integrationId/chats' \
<strong>--header 'Authorization: Bearer YOUR_API_TOKEN'
</strong></code></pre>

{% endtab %}

{% tab title="C#" %}

```csharp
var client = new RestClient("https://public-api.desk360.com/v1/integrations");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer YOUR_API_TOKEN");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations")
  .method("GET", null)
  .addHeader("Authorization", "Bearer YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var axios = require('axios');

var config = {
  method: 'get',
  url: 'https://public-api.desk360.com/v1/integrations',
  headers: { 
    'Authorization': 'Bearer YOUR_API_TOKEN'
  }
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HTTPHEADER => array(
    'Authorization: Bearer YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://public-api.desk360.com/v1/integrations"

payload={}
headers = {
  'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
```

{% endtab %}
{% endtabs %}

### Chat Messages

<mark style="color:blue;">`GET`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId`/chats/:chatId/messages

List of your chat messages.

#### Path Parameters

| Name                                             | Type    | Description                |
| ------------------------------------------------ | ------- | -------------------------- |
| integrationId <mark style="color:red;">\*</mark> | Integer | The ID of your integration |
| chatId <mark style="color:red;">\*</mark>        | Integer | The ID of your chat        |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | string | Your API token |

{% tabs %}
{% tab title="200 " %}

```json
[
    {
        "id": 55012,
        "chat_id": 1024,
        "writer_name": "Jon Doe",
        "content": "Hello, I need help with my order *#A123*.",
        "attachments": null,
        "payload": null,
        "is_customer": true,
        "platform_message_id": "wamid.HBgLOTA1...",
        "platform_parent_id": null,
        "type": 6,
        "status": 3,
        "created_at": "2026-05-04T14:21:08.000000Z"
    },
    {
        "id": 55013,
        "chat_id": 1024,
        "writer_name": "Jon Doe",
        "content": "Hello, I need help with my order *#A123*.",
        "attachments": null,
        "payload": null,
        "is_customer": true,
        "platform_message_id": "wamid.HBgLOTA1...",
        "platform_parent_id": null,
        "type": 6,
        "status": 4,
        "created_at": "2026-05-04T14:22:08.000000Z"
    }
]
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

<pre class="language-bash"><code class="lang-bash">curl --location --request GET 'https://public-api.desk360.com/v1/integrations/:integrationId/chats/:chatId/messages' \
<strong>--header 'Authorization: Bearer YOUR_API_TOKEN'
</strong></code></pre>

{% endtab %}

{% tab title="C#" %}

```csharp
var client = new RestClient("https://public-api.desk360.com/v1/integrations");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer YOUR_API_TOKEN");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations")
  .method("GET", null)
  .addHeader("Authorization", "Bearer YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var axios = require('axios');

var config = {
  method: 'get',
  url: 'https://public-api.desk360.com/v1/integrations',
  headers: { 
    'Authorization': 'Bearer YOUR_API_TOKEN'
  }
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HTTPHEADER => array(
    'Authorization: Bearer YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://public-api.desk360.com/v1/integrations"

payload={}
headers = {
  'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
```

{% endtab %}
{% endtabs %}

## Tags

Tags let you label chats with short keywords.

Tag names must be 3–25 characters long and follow the allowed tag-name pattern. When you attach tags to a chat you can either reference an existing tag by its id or create a new one on the fly by sending only its name. The system will create it under the integration automatically.

A typical flow looks like this:

1. List the integration's existing tags via Integration Tags.
2. List the tags currently attached to a chat via Chat Tags.
3. Attach / replace / detach tags on a chat via Attach Chat Tags.

> The attach endpoint is a sync operation. The chat's tags become exactly the list you send. Any tag that is currently attached but missing from your payload will be detached.

### Integration Tags

<mark style="color:blue;">`GET`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId/tags`

List of your integration tags.

#### Path Parameters

| Name                                             | Type    | Description                |
| ------------------------------------------------ | ------- | -------------------------- |
| integrationId <mark style="color:red;">\*</mark> | Integer | The ID of your integration |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | String | Your API token |

{% tabs %}
{% tab title="200 " %}

```json
[
    {
        "id": 12,
        "name": "tag-name-1"
    },
    {
        "id": 27,
        "name": "tag-name-2"
    },
    {
        "id": 88,
        "name": "tag-name-3"
    }
]
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

<pre class="language-bash"><code class="lang-bash">curl --location --request GET 'https://public-api.desk360.com/v1/integrations/:integrationId/tags' \
<strong>--header 'Authorization: Bearer YOUR_API_TOKEN'
</strong></code></pre>

{% endtab %}

{% tab title="C#" %}

```csharp
var client = new RestClient("https://public-api.desk360.com/v1/integrations");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer YOUR_API_TOKEN");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations")
  .method("GET", null)
  .addHeader("Authorization", "Bearer YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var axios = require('axios');

var config = {
  method: 'get',
  url: 'https://public-api.desk360.com/v1/integrations',
  headers: { 
    'Authorization': 'Bearer YOUR_API_TOKEN'
  }
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HTTPHEADER => array(
    'Authorization: Bearer YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://public-api.desk360.com/v1/integrations"

payload={}
headers = {
  'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
```

{% endtab %}
{% endtabs %}

### Chat Tags

<mark style="color:blue;">`GET`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId/chats/:chatId/tags`

List of your chat tags.

#### Path Parameters

| Name                                             | Type    | Description                |
| ------------------------------------------------ | ------- | -------------------------- |
| integrationId <mark style="color:red;">\*</mark> | Integer | The ID of your integration |
| chatId <mark style="color:red;">\*</mark>        | Integer | The ID of your chat        |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | String | Your API Token |

{% tabs %}
{% tab title="200 " %}

```json
[
    {
        "id": 12,
        "name": "tag-name-1"
    },
    {
        "id": 27,
        "name": "tag-name-2"
    }
]
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

<pre class="language-bash"><code class="lang-bash">curl --location --request GET 'https://public-api.desk360.com/v1/integrations/:integrationId/chats/:chatId/tags' \
<strong>--header 'Authorization: Bearer YOUR_API_TOKEN'
</strong></code></pre>

{% endtab %}

{% tab title="C#" %}

```csharp
var client = new RestClient("https://public-api.desk360.com/v1/integrations");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer YOUR_API_TOKEN");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations")
  .method("GET", null)
  .addHeader("Authorization", "Bearer YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var axios = require('axios');

var config = {
  method: 'get',
  url: 'https://public-api.desk360.com/v1/integrations',
  headers: { 
    'Authorization': 'Bearer YOUR_API_TOKEN'
  }
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HTTPHEADER => array(
    'Authorization: Bearer YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://public-api.desk360.com/v1/integrations"

payload={}
headers = {
  'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
```

{% endtab %}
{% endtabs %}

### Chat Tags Attach

<mark style="color:blue;">`POST`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId/chats/:chatId/tags`

Attach of your chat tags.

#### Path Parameters

| Name                                             | Type    | Description                |
| ------------------------------------------------ | ------- | -------------------------- |
| integrationId <mark style="color:red;">\*</mark> | Integer | The ID of your integration |
| chatId <mark style="color:red;">\*</mark>        | Integer | The ID of your chat        |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | String | Your API token |

#### Body Parameters

| Name                                            | Type    | Description                                                                                                               |
| ----------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------- |
| tags <mark style="color:red;">\*</mark>         | Array   | The full list of tags the chat should have after the call. Each item is an object with **either** `id` **or** `name`.     |
| tags\[].id                                      | Integer | The id of an existing tag under the integration. Use this to attach a tag that is already defined.                        |
| tags\[].name <mark style="color:red;">\*</mark> | String  | A new tag name (3–25 chars). If no tag with this name exists under the integration, it will be created and then attached. |

{% tabs %}
{% tab title="200 " %}

```json
[
    {
        "id": 12,
        "name": "tag-name-1"
    },
    {
        "id": 104,
        "name": "tag-new-name"
    }
]
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location --request POST 'https://public-api.desk360.com/v1/integrations/:integrationId/chats/:chatId/tags' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--data-raw '{
    "tags": [
        { "id": 12, "name": "tag-name-1" },
        { "id": 27, "name": "tag-name-2" },
        { "id": null, "name": "new-tag-name" }
    ]
}'
```

{% endtab %}

{% tab title="C#" %}

```csharp
var client = new RestClient("https://public-api.desk360.com/v1/integrations");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer YOUR_API_TOKEN");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations")
  .method("GET", null)
  .addHeader("Authorization", "Bearer YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
var axios = require('axios');

var config = {
  method: 'get',
  url: 'https://public-api.desk360.com/v1/integrations',
  headers: { 
    'Authorization': 'Bearer YOUR_API_TOKEN'
  }
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HTTPHEADER => array(
    'Authorization: Bearer YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://public-api.desk360.com/v1/integrations"

payload={}
headers = {
  'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
```

{% endtab %}
{% endtabs %}

## WhatsApp Message Templates

WhatsApp message templates are message formats that let you deliver multiple notifications to customers who have agreed to receive them via WhatsApp.

### WhatsApp Message Templates

<mark style="color:blue;">`GET`</mark> `https://public-api.desk360.comv1/integrations/:integrationId/conversations/templates`

Get WhatsApp message template and languages list from a product.

#### Path Parameters

| Name                                             | Type    | Description                |
| ------------------------------------------------ | ------- | -------------------------- |
| IntegrationId <mark style="color:red;">\*</mark> | Integer | The ID of your integration |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | String | Your API Token |

{% tabs %}
{% tab title="200 " %}

```json
[
  {
    "id": 75,
    "name": "template_02",
    "category_editable": false,
    "sendable": true,
    "category": {
      "value": 2,
      "label": "template-messages.new.custom",
      "subLabel": "template-messages.new.custom-subtitle",
      "status": 1,
      "children": []
    },
    "category_label": "template-messages.new.custom",
    "supported_languages": [
      {
        "label": "English",
        "value": 1,
        "filled": true
      },
      {
        "label": "Türkçe",
        "value": 2,
        "filled": true
      }
    ],
    "translations": [
      {
        "language_id": 1,
        "language": "English",
        "header_type": null,
        "header_variables": null,
        "header": null,
        "header_file": null,
        "body": "English content test",
        "body_variables": null,
        "footer": null,
        "variables": [],
        "buttons": [],
        "editable": true,
        "status": "template-messages.in-review",
        "status_value": 1,
        "quality": "template-messages.quality-unavailable",
        "updated_at": "2024-05-31T06:33:30.000000Z"
      },
      {
        "language_id": 2,
        "language": "Türkçe",
        "header_type": {
          "value": 4,
          "label": "TEXT"
        },
        "header_variables": [
          {
            "id": "",
            "key": "1",
            "value": "Header 1"
          }
        ],
        "header": "Merhaba {{1}} ,",
        "header_file": null,
        "body": "Merhaba {{1}}, Sipariş takip numaranız: {{2}} Bu takip numarası ile siparişinizin durumunu sorgulayabilirsiniz.",
        "body_variables": [
          {
            "id": "",
            "key": "1",
            "value": "Ahmet Kara"
          },
          {
            "id": "",
            "key": "2",
            "value": "SP123456789"
          }
        ],
        "footer": null,
        "variables": [
          "header-1",
          "body-1",
          "body-2"
        ],
        "buttons": [],
        "editable": true,
        "status": "template-messages.active",
        "status_value": 2,
        "quality": "template-messages.quality-unavailable",
        "updated_at": "2024-05-30T12:16:37.000000Z"
      }
    ],
    "created_at": "2024-05-30T12:14:28.000000Z",
    "updated_at": "2024-05-31T06:33:30.000000Z"
  }
]
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location --request GET 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/?page=1' \--header 'Authorization: Bearer YOUR_API_TOKEN'
```

{% endtab %}

{% tab title="C#" %}

```csharp
var client = new RestClientRestClient("https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer YOUR_API_TOKEN");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates")
  .method("GET", null)
  .addHeader("Authorization", "Bearer YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="Javascript" %}

```javascript
var axios = require('axios');

var config = {
  method: 'get',
  url: 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates',
  headers: { 
    'Authorization': 'Bearer YOUR_API_TOKEN', 
  }
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HTTPHEADER => array(
    'Authorization: Bearer YOUR_API_TOKEN',
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates"

payload={}
headers = {
  'Authorization': 'Bearer YOUR_API_TOKEN',
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)

```

{% endtab %}
{% endtabs %}

### Send WhatsApp Message Template

<mark style="color:green;">`POST`</mark> `https://public-api.desk360.com/v1/integrations/:integrationsId/conversations/templates/send`

Send active WhatsApp message template to a WhatsApp number. If you send with attachments, use form-data. You can also send other body parameters with form-data as well.&#x20;

#### Path Parameters

| Name                                             | Type    | Description                |
| ------------------------------------------------ | ------- | -------------------------- |
| IntegrationId <mark style="color:red;">\*</mark> | Integer | The ID of your integration |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | string | Your API Token |

#### Request Body

<table><thead><tr><th width="261">Name</th><th width="109">Type</th><th>Description</th></tr></thead><tbody><tr><td>template_id <mark style="color:red;">*</mark></td><td>Integer</td><td>The template id of the template to be sent.</td></tr><tr><td>language_id <mark style="color:red;">*</mark></td><td>Integer</td><td>The language id of the template to be sent.</td></tr><tr><td>destinations[] <mark style="color:red;">*</mark></td><td>array</td><td>Required parameters for the template. The key list received in the template list should be used as a key during submission.</td></tr><tr><td>destinations.*.phone <mark style="color:red;">*</mark></td><td>string</td><td>WhatsApp number to be sent. It should start with (+) and a country code.</td></tr><tr><td>destinations.*.parameters</td><td>object</td><td>Required parameters for the template. The key list received in the template list should be used as a key during submission.</td></tr><tr><td>attachment </td><td>file</td><td>Attachment for the message template (only allowed in form-data).</td></tr></tbody></table>

{% tabs %}
{% tab title="200 " %}

```json
{
    "message_id": "gBEGkFBXUQRnAglW0luHY8xsrFk"
}
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location --request POST 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send' \
--header 'Authorization: YOUR_API_TOKEN' \
--form 'template_id="1"' \
--form 'language_id="1"' \
--form 'destinations[0][phone]="+905555555555"' \
--form 'destinations[0][parameters][header-1]="Header 1"' \
--form 'destinations[0][parameters][body-1]="Body 1"' \
--form 'destinations[0][parameters][body-2]="Body 2"' \
--form 'attachment=@"/test_image.jpg"'
```

{% endtab %}

{% tab title="C#" %}

```csharp
var options = new RestClientOptions("https://public-api.desk360.com")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("/v1/integrations/integrationId/conversations/templates/send", Method.Post);
request.AddHeader("Authorization", "YOUR_API_TOKEN");
request.AlwaysMultipartFormData = true;
request.AddParameter("template_id", "1");
request.AddParameter("language_id", "1");
request.AddParameter("destinations[0][phone]", "+905555555555");
request.AddParameter("destinations[0][parameters][header-1]", "Header 1");
request.AddParameter("destinations[0][parameters][body-1]", "Body 1");
request.AddParameter("destinations[0][parameters][body-2]", "Body 2");
request.AddFile("attachment", "/test_image.jpg");
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
  .addFormDataPart("template_id","1")
  .addFormDataPart("language_id","1")
  .addFormDataPart("destinations[0][phone]","+905555555555")
  .addFormDataPart("destinations[0][parameters][header-1]","Header 1")
  .addFormDataPart("destinations[0][parameters][body-1]","Body 1")
  .addFormDataPart("destinations[0][parameters][body-2]","Body 2")
  .addFormDataPart("attachment","test_image.jpg",
    RequestBody.create(MediaType.parse("application/octet-stream"),
    new File("/test_image.jpg")))
  .build();
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send")
  .method("POST", body)
  .addHeader("Authorization", "YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="Javascript" %}

```javascript
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
let data = new FormData();
data.append('template_id', '1');
data.append('language_id', '1');
data.append('destinations[0][phone]', '+905555555555');
data.append('destinations[0][parameters][header-1]', 'Header 1');
data.append('destinations[0][parameters][body-1]', 'Body 1');
data.append('destinations[0][parameters][body-2]', 'Body 2');
data.append('attachment', fs.createReadStream('/test_image.jpg'));

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send',
  headers: { 
    'Authorization': 'YOUR_API_TOKEN', 
    ...data.getHeaders()
  },
  data : data
};

axios.request(config)
.then((response) => {
  console.log(JSON.stringify(response.data));
})
.catch((error) => {
  console.log(error);
});
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => array('template_id' => '1','language_id' => '1','destinations[0][phone]' => '+905555555555','destinations[0][parameters][header-1]' => 'Header 1','destinations[0][parameters][body-1]' => 'Body 1','destinations[0][parameters][body-2]' => 'Body 2','attachment'=> new CURLFILE('/test_image.jpg')),
  CURLOPT_HTTPHEADER => array(
    'Authorization: YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send"

payload = {'template_id': '1',
'language_id': '1',
'destinations[0][phone]': '+905555555555',
'destinations[0][parameters][header-1]': 'Header 1',
'destinations[0][parameters][body-1]': 'Body 1',
'destinations[0][parameters][body-2]': 'Body 2'}
files=[
  ('attachment',('test_image.jpg',open('/test_image.jpg','rb'),'image/png'))
]
headers = {
  'Authorization': 'YOUR_API_TOKEN'
}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)

```

{% endtab %}
{% endtabs %}

### Bulk Send WhatsApp Message Template

<mark style="color:green;">`POST`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/bulk`

Send active WhatsApp message template to multiple WhatsApp number. If you send with attachments, use form-data. You can also send other body parameters with form-data as well.&#x20;

#### Path Parameters

| Name                                             | Type    | Description                |
| ------------------------------------------------ | ------- | -------------------------- |
| IntegrationId <mark style="color:red;">\*</mark> | Integer | The ID of your integration |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | String | Your API Token |

#### Request Body

<table><thead><tr><th width="219">Name</th><th width="96">Type</th><th>Description</th></tr></thead><tbody><tr><td>template_id <mark style="color:red;">*</mark></td><td>Integer</td><td>The template id of the template to be sent.</td></tr><tr><td>language_id <mark style="color:red;">*</mark></td><td>Integer</td><td>The language id of the template to be sent.</td></tr><tr><td>destinations[]</td><td>array</td><td>Destinations for the template.</td></tr><tr><td>destinations.*.phone</td><td>string</td><td>WhatsApp number to be sent. It should start with (+) and a country code.</td></tr><tr><td>parameters</td><td>object</td><td>Required parameters for the template. The key list received in the template list should be used as a key during submission.</td></tr><tr><td>attachment </td><td>file</td><td>Attachment for the message template (only allowed in form-data).</td></tr><tr><td>destinations_file</td><td>file</td><td>WhatsApp numbers csv file to be sent. It should start with (+) and a country code.</td></tr></tbody></table>

{% tabs %}
{% tab title="200 " %}

```json
{
    "phones": [
        "+905555555555"
    ]
}
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location --request POST 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/bulk' \
--header 'Authorization: YOUR_API_TOKEN' \
--form 'template_id="1"' \
--form 'language_id="1"' \
--form 'destinations[0][phone]="+905555555555"' \
--form 'parameters[header-1]="Header 1"' \
--form 'parameters[body-1]="Body 1"' \
--form 'parameters[body-2]="Body 2"' \
--form 'attachment=@"/test_image.jpg"'
```

{% endtab %}

{% tab title="C#" %}

```csharp
var options = new RestClientOptions("https://public-api.desk360.com")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("/v1/integrations/:integrationId/conversations/templates/send/bulk", Method.Post);
request.AddHeader("Authorization", "YOUR_API_TOKEN");
request.AlwaysMultipartFormData = true;
request.AddParameter("template_id", "1");
request.AddParameter("language_id", "1");
request.AddParameter("destinations[0][phone]", "+905555555555");
request.AddParameter("parameters[header-1]", "Header 1");
request.AddParameter("parameters[body-1]", "Body 1");
request.AddParameter("parameters[body-2]", "Body 2");
request.AddFile("attachment", "/test_image.jpg");
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
  .addFormDataPart("template_id","1")
  .addFormDataPart("language_id","1")
  .addFormDataPart("destinations[0][phone]","+905555555555")
  .addFormDataPart("parameters[header-1]","Header 1")
  .addFormDataPart("parameters[body-1]","Body 1")
  .addFormDataPart("parameters[body-2]","Body 2")
  .addFormDataPart("attachment","test_image.jpg",
    RequestBody.create(MediaType.parse("application/octet-stream"),
    new File("/test_image.jpg")))
  .build();
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/bulk")
  .method("POST", body)
  .addHeader("Authorization", "YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
let data = new FormData();
data.append('template_id', '1');
data.append('language_id', '1');
data.append('destinations[0][phone]', '+905555555555');
data.append('parameters[header-1]', 'Header 1');
data.append('parameters[body-1]', 'Body 1');
data.append('parameters[body-2]', 'Body 2');
data.append('attachment', fs.createReadStream('/test_image.jpg'));

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/bulk',
  headers: { 
    'Authorization': 'YOUR_API_TOKEN', 
    ...data.getHeaders()
  },
  data : data
};

axios.request(config)
.then((response) => {
  console.log(JSON.stringify(response.data));
})
.catch((error) => {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/bulk',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => array('template_id' => '1','language_id' => '1','destinations[0][phone]' => '+905555555555','parameters[header-1]' => 'Header 1','parameters[body-1]' => 'Body 1','parameters[body-2]' => 'Body 2','attachment'=> new CURLFILE('/test_image.jpg')),
  CURLOPT_HTTPHEADER => array(
    'Authorization: YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/bulk"

payload = {'template_id': '1',
'language_id': '1',
'destinations[0][phone]': '+905555555555',
'parameters[header-1]': 'Header 1',
'parameters[body-1]': 'Body 1',
'parameters[body-2]': 'Body 2'}
files=[
  ('attachment',('desk360_facebook.png',open('/test_image.jpg','rb'),'image/png'))
]
headers = {
  'Authorization': 'YOUR_API_TOKEN'
}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)

```

{% endtab %}
{% endtabs %}

### List Message Template Sending Stats

<mark style="color:blue;">`GET`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/stats`

Get the list of WhatsApp message template sendings. Each item represents a single sending operation (single or bulk) and its id is the sending id used in the detail endpoint.

**Path Parameters**

| Name                                             | Type    | Description                |
| ------------------------------------------------ | ------- | -------------------------- |
| IntegrationId <mark style="color:red;">\*</mark> | Integer | The ID of your integration |

**Query Parameters**

| Name | Type    | Description     |
| ---- | ------- | --------------- |
| page | Integer | The page number |

**Headers**

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | String | Your API Token |

{% tabs %}
{% tab title="200 " %}

```json
[
    {
        "id": "5d3c5c2a-8b1a-4c6d-1e7f-2a4b6c9d0e1c",
        "name": "template_02",
        "message": "Merhaba {{1}}, Sipariş takip numaranız: {{2}} Bu takip numarası ile siparişinizin durumunu sorgulayabilirsiniz.",
        "language": "English",
        "import_status": "",
        "posted_by": "John Doe",
        "last_sended": "2026-06-30T09:41:12.000000Z"
    }
]
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location --request GET 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/stats?page=1' \
--header 'Authorization: Bearer YOUR_API_TOKEN'
```

{% endtab %}

{% tab title="C#" %}

```csharp
var options = new RestClientOptions("https://public-api.desk360.com")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("/v1/integrations/:integrationId/conversations/templates/send/bulk", Method.Post);
request.AddHeader("Authorization", "YOUR_API_TOKEN");
request.AlwaysMultipartFormData = true;
request.AddParameter("template_id", "1");
request.AddParameter("language_id", "1");
request.AddParameter("destinations[0][phone]", "+905555555555");
request.AddParameter("parameters[header-1]", "Header 1");
request.AddParameter("parameters[body-1]", "Body 1");
request.AddParameter("parameters[body-2]", "Body 2");
request.AddFile("attachment", "/test_image.jpg");
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
  .addFormDataPart("template_id","1")
  .addFormDataPart("language_id","1")
  .addFormDataPart("destinations[0][phone]","+905555555555")
  .addFormDataPart("parameters[header-1]","Header 1")
  .addFormDataPart("parameters[body-1]","Body 1")
  .addFormDataPart("parameters[body-2]","Body 2")
  .addFormDataPart("attachment","test_image.jpg",
    RequestBody.create(MediaType.parse("application/octet-stream"),
    new File("/test_image.jpg")))
  .build();
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/bulk")
  .method("POST", body)
  .addHeader("Authorization", "YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
let data = new FormData();
data.append('template_id', '1');
data.append('language_id', '1');
data.append('destinations[0][phone]', '+905555555555');
data.append('parameters[header-1]', 'Header 1');
data.append('parameters[body-1]', 'Body 1');
data.append('parameters[body-2]', 'Body 2');
data.append('attachment', fs.createReadStream('/test_image.jpg'));

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/bulk',
  headers: { 
    'Authorization': 'YOUR_API_TOKEN', 
    ...data.getHeaders()
  },
  data : data
};

axios.request(config)
.then((response) => {
  console.log(JSON.stringify(response.data));
})
.catch((error) => {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/bulk',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => array('template_id' => '1','language_id' => '1','destinations[0][phone]' => '+905555555555','parameters[header-1]' => 'Header 1','parameters[body-1]' => 'Body 1','parameters[body-2]' => 'Body 2','attachment'=> new CURLFILE('/test_image.jpg')),
  CURLOPT_HTTPHEADER => array(
    'Authorization: YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/bulk"

payload = {'template_id': '1',
'language_id': '1',
'destinations[0][phone]': '+905555555555',
'parameters[header-1]': 'Header 1',
'parameters[body-1]': 'Body 1',
'parameters[body-2]': 'Body 2'}
files=[
  ('attachment',('desk360_facebook.png',open('/test_image.jpg','rb'),'image/png'))
]
headers = {
  'Authorization': 'YOUR_API_TOKEN'
}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)
```

{% endtab %}
{% endtabs %}

### Get Message Template Sending Stats Detail

<mark style="color:blue;">`GET`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/stats/:sendingId`

Get the per-recipient delivery statuses of a single template sending.

**Path Parameters**

| Name                                             | Type    | Description                                         |
| ------------------------------------------------ | ------- | --------------------------------------------------- |
| IntegrationId <mark style="color:red;">\*</mark> | Integer | The ID of your integration                          |
| SendingId <mark style="color:red;">\*</mark>     | String  | The sending id returned from the sending stats list |

**Query Parameters**

| Name | Type    | Description     |
| ---- | ------- | --------------- |
| page | Integer | The page number |

**Headers**

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | String | Your API Token |

{% tabs %}
{% tab title="200 " %}

```json
[
    {
        "id": "5d3c5c2a-8b1a-4c6d-1e7f-2a4b6c9d0e1c",
        "phone": "+905555555555",
        "status_id": 4,
        "status_label": "Read",
        "error_code": null,
        "error_message": null,
        "date": "2026-06-30T09:41:12.000000Z"
    },
    {
        "id": "5d3c5c2a-8b1a-4c6d-1e7f-2a4b6c9d0e1c",
        "phone": "+905555555556",
        "status_id": 3,
        "status_label": "Delivered",
        "error_code": null,
        "error_message": null,
        "date": "2026-06-30T09:41:12.000000Z"
    },
    {
        "id": "5d3c5c2a-8b1a-4c6d-1e7f-2a4b6c9d0e1c",
        "phone": "+905555555557",
        "status_id": 5,
        "status_label": "Failed",
        "error_code": 131049,
        "error_message": "Meta chose not to deliver",
        "date": "2026-06-30T09:41:12.000000Z"
    }
]
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location --request GET 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/stats/:sendingId?page=1' \
--header 'Authorization: Bearer YOUR_API_TOKEN'
```

{% endtab %}

{% tab title="C#" %}

```csharp
var options = new RestClientOptions("https://public-api.desk360.com")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("/v1/integrations/:integrationId/conversations/templates/send/bulk", Method.Post);
request.AddHeader("Authorization", "YOUR_API_TOKEN");
request.AlwaysMultipartFormData = true;
request.AddParameter("template_id", "1");
request.AddParameter("language_id", "1");
request.AddParameter("destinations[0][phone]", "+905555555555");
request.AddParameter("parameters[header-1]", "Header 1");
request.AddParameter("parameters[body-1]", "Body 1");
request.AddParameter("parameters[body-2]", "Body 2");
request.AddFile("attachment", "/test_image.jpg");
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
  .addFormDataPart("template_id","1")
  .addFormDataPart("language_id","1")
  .addFormDataPart("destinations[0][phone]","+905555555555")
  .addFormDataPart("parameters[header-1]","Header 1")
  .addFormDataPart("parameters[body-1]","Body 1")
  .addFormDataPart("parameters[body-2]","Body 2")
  .addFormDataPart("attachment","test_image.jpg",
    RequestBody.create(MediaType.parse("application/octet-stream"),
    new File("/test_image.jpg")))
  .build();
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/bulk")
  .method("POST", body)
  .addHeader("Authorization", "YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
let data = new FormData();
data.append('template_id', '1');
data.append('language_id', '1');
data.append('destinations[0][phone]', '+905555555555');
data.append('parameters[header-1]', 'Header 1');
data.append('parameters[body-1]', 'Body 1');
data.append('parameters[body-2]', 'Body 2');
data.append('attachment', fs.createReadStream('/test_image.jpg'));

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/bulk',
  headers: { 
    'Authorization': 'YOUR_API_TOKEN', 
    ...data.getHeaders()
  },
  data : data
};

axios.request(config)
.then((response) => {
  console.log(JSON.stringify(response.data));
})
.catch((error) => {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/bulk',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => array('template_id' => '1','language_id' => '1','destinations[0][phone]' => '+905555555555','parameters[header-1]' => 'Header 1','parameters[body-1]' => 'Body 1','parameters[body-2]' => 'Body 2','attachment'=> new CURLFILE('/test_image.jpg')),
  CURLOPT_HTTPHEADER => array(
    'Authorization: YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://public-api.desk360.com/v1/integrations/:integrationId/conversations/templates/send/bulk"

payload = {'template_id': '1',
'language_id': '1',
'destinations[0][phone]': '+905555555555',
'parameters[header-1]': 'Header 1',
'parameters[body-1]': 'Body 1',
'parameters[body-2]': 'Body 2'}
files=[
  ('attachment',('desk360_facebook.png',open('/test_image.jpg','rb'),'image/png'))
]
headers = {
  'Authorization': 'YOUR_API_TOKEN'
}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)
```

{% endtab %}
{% endtabs %}

## WhatsApp Messages

Use the messages node to send text, location, contact, media, interactive, location request and read receipt message to your customers.

{% hint style="info" %}
If the user has no phone number (contacted you via a WhatsApp username), send the message using the `recipient` parameter with their business-scoped user ID (e.g. `TR.15590A515V846X34`) instead of `to`. Provide only one of the two.
{% endhint %}

### Send WhatsApp Message

<mark style="color:green;">`POST`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages`

Send message to an active WhatsApp number.

#### Path Parameters

| Name                                            | Type    | Description                |
| ----------------------------------------------- | ------- | -------------------------- |
| IntegrationId<mark style="color:red;">\*</mark> | Integer | The ID of your integration |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | string | Your API Token |

#### Request Body

| Name                                    | Type   | Description                                                              |
| --------------------------------------- | ------ | ------------------------------------------------------------------------ |
| to<mark style="color:red;">\*</mark>    | string | WhatsApp number to be sent. It should start with (+) and a country code. |
| text <mark style="color:red;">\*</mark> | string | Message body. It should max 4096 chars.                                  |

#### Text Formatting

You can style message text using the HTML tags listed below. Include them directly in the message `body` and the WhatsApp will render them.

```html
# Inline styles
Bold            <b>Bold</b>
Italic          <i>Italic</i>
Strikethrough   <s>Strikethrough</s>
Monospace       <code>Monospace</code>

# Structure
Line break      <br>
Paragraph       <p>Paragraph</p>
Quote           <blockquote>Quote</blockquote>

# Lists
Bullet list     <ul><li>item</li></ul>
Numbered list   <ol><li>item</li></ol>

# Link
Link            <a href="https://example.com">Link</a>
```

{% tabs %}
{% tab title="200 " %}

```json
{
    "message_id": "gBEGkFBXUQRnAgnoOJ1ESPKBwME"
}
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location --request POST 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--form 'to="+90xxxxxxxxxx"' \
--form 'text="Hello!"'
```

{% endtab %}

{% tab title="C#" %}

```csharp
var options = new RestClientOptions("https://public-api.desk360.com")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("/v1/integrations/:integrationId/conversations/messages", Method.Post);
request.AddHeader("Authorization", "Bearer YOUR_API_TOKEN");
request.AlwaysMultipartFormData = true;
request.AddParameter("to", "+90xxxxxxxxxx");
request.AddParameter("text", "Hello!");
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
  .addFormDataPart("to","+90xxxxxxxxxx")
  .addFormDataPart("text","Hello!")
  .build();
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages")
  .method("POST", body)
  .addHeader("Authorization", "Bearer YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');
const FormData = require('form-data');
let data = new FormData();
data.append('to', '+90xxxxxxxxxx');
data.append('text', 'hello!');

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages',
  headers: { 
    'Authorization': 'Bearer YOUR_API_TOKEN', 
    ...data.getHeaders()
  },
  data : data
};

axios.request(config)
.then((response) => {
  console.log(JSON.stringify(response.data));
})
.catch((error) => {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => array('to' => '+90xxxxxxxxxx','text' => 'Hello!'),
  CURLOPT_HTTPHEADER => array(
    'Authorization: Bearer YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages"

payload = {'to': '+90xxxxxxxxxx',
'text': 'Hello!'}
files=[

]
headers = {
  'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)

```

{% endtab %}
{% endtabs %}

### Send WhatsApp Location Message

<mark style="color:green;">`POST`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages`

Send location message to an active WhatsApp number.

#### Path Parameters

| Name                                            | Type    | Description                |
| ----------------------------------------------- | ------- | -------------------------- |
| IntegrationId<mark style="color:red;">\*</mark> | Integer | The ID of your integration |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | String | Your API Token |

#### Request Body

| Name                                                 | Type    | Description                                                              |
| ---------------------------------------------------- | ------- | ------------------------------------------------------------------------ |
| to<mark style="color:red;">\*</mark>                 | String  | WhatsApp number to be sent. It should start with (+) and a country code. |
| location<mark style="color:red;">\*</mark>           | Object  | An object of the message.                                                |
| location.longitude<mark style="color:red;">\*</mark> | Numeric | Longitude of location.                                                   |
| location.latitude<mark style="color:red;">\*</mark>  | Numeric | Latitude of location.                                                    |
| location.name<mark style="color:red;">\*</mark>      | String  | Name of location.                                                        |
| location.address<mark style="color:red;">\*</mark>   | String  | Address of location.                                                     |

{% tabs %}
{% tab title="200 " %}

```json
{
    "message_id": "gBEGkFBXUQRnAgn3kXajlucbaso"
}
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location --request POST 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/locations' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--data '{
    "to": "+90xxxxxxxxxx",
    "location": {
        "longitude": -122.425332,
        "latitude": 37.758056,
        "name": "Facebook HQ",
        "address": "1 Hacker Way, Menlo Park, CA 94025"
    }
}'
```

{% endtab %}

{% tab title="C#" %}

```csharp
var options = new RestClientOptions("https://public-api.desk360.com")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("/v1/integrations/:integrationId/conversations/messages/locations", Method.Post);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer YOUR_API_TOKEN");
var body = @"{" + "\n" +
@"    ""to"": ""+90xxxxxxxxxx""," + "\n" +
@"    ""location"": {" + "\n" +
@"        ""longitude"": -122.425332," + "\n" +
@"        ""latitude"": 37.758056," + "\n" +
@"        ""name"": ""Facebook HQ""," + "\n" +
@"        ""address"": ""1 Hacker Way, Menlo Park, CA 94025""" + "\n" +
@"    }" + "\n" +
@"}";
request.AddStringBody(body, DataFormat.Json);
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n    \"to\": \"+90xxxxxxxxxx\",\n    \"location\": {\n        \"longitude\": -122.425332,\n        \"latitude\": 37.758056,\n        \"name\": \"Facebook HQ\",\n        \"address\": \"1 Hacker Way, Menlo Park, CA 94025\"\n    }\n}");
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/locations")
  .method("POST", body)
  .addHeader("Content-Type", "application/json")
  .addHeader("Authorization", "Bearer YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');
let data = JSON.stringify({
  "to": "+90xxxxxxxxxx",
  "location": {
    "longitude": -122.425332,
    "latitude": 37.758056,
    "name": "Facebook HQ",
    "address": "1 Hacker Way, Menlo Park, CA 94025"
  }
});

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/locations',
  headers: { 
    'Content-Type': 'application/json', 
    'Authorization': 'Bearer YOUR_API_TOKEN'
  },
  data : data
};

axios.request(config)
.then((response) => {
  console.log(JSON.stringify(response.data));
})
.catch((error) => {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/locations',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
    "to": "+90xxxxxxxxxx",
    "location": {
        "longitude": -122.425332,
        "latitude": 37.758056,
        "name": "Facebook HQ",
        "address": "1 Hacker Way, Menlo Park, CA 94025"
    }
}',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'Authorization: Bearer YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests
import json

url = "https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/locations"

payload = json.dumps({
  "to": "+90xxxxxxxxxx",
  "location": {
    "longitude": -122.425332,
    "latitude": 37.758056,
    "name": "Facebook HQ",
    "address": "1 Hacker Way, Menlo Park, CA 94025"
  }
})
headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)

```

{% endtab %}
{% endtabs %}

### Send WhatsApp Contact Message

<mark style="color:green;">`POST`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/contacts`

Send contact message to an active WhatsApp number.

#### Path Parameters

| Name                                            | Type    | Description                |
| ----------------------------------------------- | ------- | -------------------------- |
| IntegrationId<mark style="color:red;">\*</mark> | Integer | The ID of your integration |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | String | Your API Token |

#### Request Body

| Name                                                               | Type   | Description                                                              |
| ------------------------------------------------------------------ | ------ | ------------------------------------------------------------------------ |
| to<mark style="color:red;">\*</mark>                               | String | WhatsApp number to be sent. It should start with (+) and a country code. |
| contacts<mark style="color:red;">\*</mark>                         | Array  | An array of the message.                                                 |
| contacts.\*.addresses.\*.street                                    | String | Street of address.                                                       |
| contacts.\*.addresses.\*.city                                      | String | City of address.                                                         |
| contacts.\*.addresses.\*.state                                     | String | State of address.                                                        |
| contacts.\*.addresses.\*.zip                                       | String | Zip code of address.                                                     |
| contacts.\*.addresses.\*.country                                   | String | Country of address.                                                      |
| contacts.\*.addresses.\*.country\_code                             | String | Country code of address.                                                 |
| contacts.\*.addresses.\*.type                                      | String | Type of address.                                                         |
| contacts.\*.birthday                                               | String | Birtday of contacts. Must be "Y-m-d" format.                             |
| contacts.\*.emails.\*.email                                        | String | Email of emails.                                                         |
| contacts.\*.emails.\*.type                                         | String | Type of emails.                                                          |
| contacts.\*.name.formatted\_name<mark style="color:red;">\*</mark> | String | Formatted name of name object.                                           |
| contacts.\*.name.first\_name<mark style="color:red;">\*</mark>     | String | First name of name object.                                               |
| contacts.\*.name.last\_name<mark style="color:red;">\*</mark>      | String | Last name of name object.                                                |
| contacts.\*.name.middle\_name                                      | String | Middle name of name object.                                              |
| contacts.\*.name.suffix                                            | String | Suffix of name.                                                          |
| contacts.\*.name.prefix                                            | String | Prefix of name.                                                          |
| contacts.\*.org.company                                            | String | Company name of organization.                                            |
| contacts.\*.org.department                                         | String | Department of organization.                                              |
| contacts.\*.org.title                                              | String | Title of organization.                                                   |
| contacts.\*.phones.\*.phone                                        | String | Phone number of phones.                                                  |
| contacts.\*.phones.\*.type                                         | String | Type of phones.                                                          |
| contacts.\*.phones.\*.wa\_id                                       | String | WAID of phones                                                           |
| contacts.\*.urls.\*.url                                            | String | Url of urls.                                                             |
| contacts.\*.urls.\*.type                                           | String | Type of urls.                                                            |

{% tabs %}
{% tab title="200 " %}

```json
{
    "message_id": "gBEGkFBXUQRnAgkCL1xSaIMoDz0"
}
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location --request POST 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/contacts' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--data-raw '{
    "to": "+90xxxxxxxxxx",
    "contacts": [
        {
            "addresses": [
                {
                    "city": "Menlo Park",
                    "country": "United States",
                    "country_code": "us",
                    "state": "CA",
                    "street": "1 Hacker Way",
                    "type": "HOME",
                    "zip": "94025"
                }
            ],
            "birthday": "2012-08-18",
            "emails": [
                {
                    "email": "test@whatsapp.com",
                    "type": "WORK"
                }
            ],
            "name": {
                "first_name": "John",
                "formatted_name": "John Smith",
                "last_name": "Smith"
            },
            "org": {
                "company": "WhatsApp",
                "department": "Design",
                "title": "Manager"
            },
            "phones": [
                {
                    "phone": "+1 (650) 555-1234",
                    "type": "WORK",
                    "wa_id": "16505551234"
                }
            ],
            "urls": [
                {
                    "url": "https://www.facebook.com",
                    "type": "WORK"
                }
            ]
        }
    ]
}'
```

{% endtab %}

{% tab title="C#" %}

```csharp
var options = new RestClientOptions("https://public-api.desk360.com")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("/v1/integrations/:integrationId/conversations/messages/contacts", Method.Post);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer YOUR_API_TOKEN");
var body = @"{" + "\n" +
@"    ""to"": ""+90xxxxxxxxxx""," + "\n" +
@"    ""contacts"": [" + "\n" +
@"        {" + "\n" +
@"            ""addresses"": [" + "\n" +
@"                {" + "\n" +
@"                    ""city"": ""Menlo Park""," + "\n" +
@"                    ""country"": ""United States""," + "\n" +
@"                    ""country_code"": ""us""," + "\n" +
@"                    ""state"": ""CA""," + "\n" +
@"                    ""street"": ""1 Hacker Way""," + "\n" +
@"                    ""type"": ""HOME""," + "\n" +
@"                    ""zip"": ""94025""" + "\n" +
@"                }" + "\n" +
@"            ]," + "\n" +
@"            ""birthday"": ""2012-08-18""," + "\n" +
@"            ""emails"": [" + "\n" +
@"                {" + "\n" +
@"                    ""email"": ""test@whatsapp.com""," + "\n" +
@"                    ""type"": ""WORK""" + "\n" +
@"                }" + "\n" +
@"            ]," + "\n" +
@"            ""name"": {" + "\n" +
@"                ""first_name"": ""John""," + "\n" +
@"                ""formatted_name"": ""John Smith""," + "\n" +
@"                ""last_name"": ""Smith""" + "\n" +
@"            }," + "\n" +
@"            ""org"": {" + "\n" +
@"                ""company"": ""WhatsApp""," + "\n" +
@"                ""department"": ""Design""," + "\n" +
@"                ""title"": ""Manager""" + "\n" +
@"            }," + "\n" +
@"            ""phones"": [" + "\n" +
@"                {" + "\n" +
@"                    ""phone"": ""+1 (650) 555-1234""," + "\n" +
@"                    ""type"": ""WORK""," + "\n" +
@"                    ""wa_id"": ""16505551234""" + "\n" +
@"                }" + "\n" +
@"            ]," + "\n" +
@"            ""urls"": [" + "\n" +
@"                {" + "\n" +
@"                    ""url"": ""https://www.facebook.com""," + "\n" +
@"                    ""type"": ""WORK""" + "\n" +
@"                }" + "\n" +
@"            ]" + "\n" +
@"        }" + "\n" +
@"    ]" + "\n" +
@"}";
request.AddStringBody(body, DataFormat.Json);
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n    \"to\": \"+90xxxxxxxxxx\",\n    \"contacts\": [\n        {\n            \"addresses\": [\n                {\n                    \"city\": \"Menlo Park\",\n                    \"country\": \"United States\",\n                    \"country_code\": \"us\",\n                    \"state\": \"CA\",\n                    \"street\": \"1 Hacker Way\",\n                    \"type\": \"HOME\",\n                    \"zip\": \"94025\"\n                }\n            ],\n            \"birthday\": \"2012-08-18\",\n            \"emails\": [\n                {\n                    \"email\": \"test@whatsapp.com\",\n                    \"type\": \"WORK\"\n                }\n            ],\n            \"name\": {\n                \"first_name\": \"John\",\n                \"formatted_name\": \"John Smith\",\n                \"last_name\": \"Smith\"\n            },\n            \"org\": {\n                \"company\": \"WhatsApp\",\n                \"department\": \"Design\",\n                \"title\": \"Manager\"\n            },\n            \"phones\": [\n                {\n                    \"phone\": \"+1 (650) 555-1234\",\n                    \"type\": \"WORK\",\n                    \"wa_id\": \"16505551234\"\n                }\n            ],\n            \"urls\": [\n                {\n                    \"url\": \"https://www.facebook.com\",\n                    \"type\": \"WORK\"\n                }\n            ]\n        }\n    ]\n}");
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/contacts")
  .method("POST", body)
  .addHeader("Content-Type", "application/json")
  .addHeader("Authorization", "Bearer YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');
let data = JSON.stringify({
  "to": "+90xxxxxxxxxx",
  "contacts": [
    {
      "addresses": [
        {
          "city": "Menlo Park",
          "country": "United States",
          "country_code": "us",
          "state": "CA",
          "street": "1 Hacker Way",
          "type": "HOME",
          "zip": "94025"
        }
      ],
      "birthday": "2012-08-18",
      "emails": [
        {
          "email": "test@whatsapp.com",
          "type": "WORK"
        }
      ],
      "name": {
        "first_name": "John",
        "formatted_name": "John Smith",
        "last_name": "Smith"
      },
      "org": {
        "company": "WhatsApp",
        "department": "Design",
        "title": "Manager"
      },
      "phones": [
        {
          "phone": "+1 (650) 555-1234",
          "type": "WORK",
          "wa_id": "16505551234"
        }
      ],
      "urls": [
        {
          "url": "https://www.facebook.com",
          "type": "WORK"
        }
      ]
    }
  ]
});

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/contacts',
  headers: { 
    'Content-Type': 'application/json', 
    'Authorization': 'Bearer YOUR_API_TOKEN'
  },
  data : data
};

axios.request(config)
.then((response) => {
  console.log(JSON.stringify(response.data));
})
.catch((error) => {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/contacts',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
    "to": "+90xxxxxxxxxx",
    "contacts": [
        {
            "addresses": [
                {
                    "city": "Menlo Park",
                    "country": "United States",
                    "country_code": "us",
                    "state": "CA",
                    "street": "1 Hacker Way",
                    "type": "HOME",
                    "zip": "94025"
                }
            ],
            "birthday": "2012-08-18",
            "emails": [
                {
                    "email": "test@whatsapp.com",
                    "type": "WORK"
                }
            ],
            "name": {
                "first_name": "John",
                "formatted_name": "John Smith",
                "last_name": "Smith"
            },
            "org": {
                "company": "WhatsApp",
                "department": "Design",
                "title": "Manager"
            },
            "phones": [
                {
                    "phone": "+1 (650) 555-1234",
                    "type": "WORK",
                    "wa_id": "16505551234"
                }
            ],
            "urls": [
                {
                    "url": "https://www.facebook.com",
                    "type": "WORK"
                }
            ]
        }
    ]
}',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'Authorization: Bearer YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests
import json

url = "https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/contacts"

payload = json.dumps({
  "to": "+90xxxxxxxxxx",
  "contacts": [
    {
      "addresses": [
        {
          "city": "Menlo Park",
          "country": "United States",
          "country_code": "us",
          "state": "CA",
          "street": "1 Hacker Way",
          "type": "HOME",
          "zip": "94025"
        }
      ],
      "birthday": "2012-08-18",
      "emails": [
        {
          "email": "test@whatsapp.com",
          "type": "WORK"
        }
      ],
      "name": {
        "first_name": "John",
        "formatted_name": "John Smith",
        "last_name": "Smith"
      },
      "org": {
        "company": "WhatsApp",
        "department": "Design",
        "title": "Manager"
      },
      "phones": [
        {
          "phone": "+1 (650) 555-1234",
          "type": "WORK",
          "wa_id": "16505551234"
        }
      ],
      "urls": [
        {
          "url": "https://www.facebook.com",
          "type": "WORK"
        }
      ]
    }
  ]
})
headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)

```

{% endtab %}
{% endtabs %}

### Send WhatsApp Media Message

<mark style="color:green;">`POST`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/medias`

Send media messages to an active WhatsApp number.

#### Path Parameters

| Name                                            | Type    | Description                |
| ----------------------------------------------- | ------- | -------------------------- |
| IntegrationId<mark style="color:red;">\*</mark> | Integer | The ID of your integration |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | string | Your API Token |

#### Request Body

| Name                                             | Type   | Description                                                                                       |
| ------------------------------------------------ | ------ | ------------------------------------------------------------------------------------------------- |
| to<mark style="color:red;">\*</mark>             | string | WhatsApp number to be sent. It should start with (+) and a country code.                          |
| attachments\[]<mark style="color:red;">\*</mark> | object | <p>Attachment for the message (Only allowed in form-data).</p><p>Max Count: 5, Max Size: 20MB</p> |

{% tabs %}
{% tab title="200 " %}

```json
{
    "medias": {
        "images": [
            {
                "url": "https://my-cdn.desk360.com/integrations/integrationId/attachments/bTARCYuscrcWU20t0dA8aesXufZKVuS0INd8rR5L.png",
                "name": "desk360.png",
                "type": "image",
                "aws": true,
                "content_type": "image/png",
                "message_id": "gBEGkFBXUQRnAgkEg3us4YW8UJE",
                "media_id": "cae26b43-1463-44f5-9a81-f4119afbf6d9"
            }
        ]
    }
}
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location --request POST 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/medias' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--form 'to="+90xxxxxxxxxx"' \
--form 'attachments[]=@"/path/to/file"'
```

{% endtab %}

{% tab title="C#" %}

```csharp
var options = new RestClientOptions("https://public-api.desk360.com")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("/v1/integrations/:integrationId/conversations/messages/medias", Method.Post);
request.AddHeader("Authorization", "Bearer YOUR_API_TOKEN");
request.AlwaysMultipartFormData = true;
request.AddParameter("to", "+90xxxxxxxxxx");
request.AddFile("attachments[]", "/path/to/file");
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
  .addFormDataPart("to","+90xxxxxxxxxx")
  .addFormDataPart("attachments[]","file",
    RequestBody.create(MediaType.parse("application/octet-stream"),
    new File("/path/to/file")))
  .build();
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/medias")
  .method("POST", body)
  .addHeader("Authorization", "Bearer YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
let data = new FormData();
data.append('to', '+90xxxxxxxxxx');
data.append('attachments[]', fs.createReadStream('/path/to/file'));

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/medias',
  headers: { 
    'Authorization': 'Bearer YOUR_API_TOKEN', 
    ...data.getHeaders()
  },
  data : data
};

axios.request(config)
.then((response) => {
  console.log(JSON.stringify(response.data));
})
.catch((error) => {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/medias',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => array('to' => '+90xxxxxxxxxx','attachments[]'=> new CURLFILE('/path/to/file')),
  CURLOPT_HTTPHEADER => array(
    'Authorization: Bearer YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/medias"

payload = {'to': '+90xxxxxxxxxx'}
files=[
  ('attachments[]',('file',open('/path/to/file','rb'),'application/octet-stream'))
]
headers = {
  'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)

```

{% endtab %}
{% endtabs %}

### Get WhatsApp Media

<mark style="color:blue;">`GET`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/medias/:mediaId`

Get whatsapp media by media id.

#### Path Parameters

| Name                                            | Type    | Description                |
| ----------------------------------------------- | ------- | -------------------------- |
| IntegrationId<mark style="color:red;">\*</mark> | Integer | The ID of your integration |
| MediaId<mark style="color:red;">\*</mark>       | String  | The ID of media            |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | string | Your API Token |

{% tabs %}
{% tab title="200 " %}

```json
{fileObject}
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location --request GET 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/medias/:mediaId' \
--header 'Authorization: Bearer YOUR_API_TOKEN'
```

{% endtab %}

{% tab title="C#" %}

```csharp
var options = new RestClientOptions("https://public-api.desk360.com")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("/v1/integrations/:integrationId/conversations/messages/medias/:mediaId", Method.Get);
request.AddHeader("Authorization", "Bearer YOUR_API_TOKEN");
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("text/plain");
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, "{}");
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/medias/:mediaId")
  .method("GET", body)
  .addHeader("Authorization", "Bearer YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');
const FormData = require('form-data');
let data = new FormData();

let config = {
  method: 'get',
  maxBodyLength: Infinity,
  url: 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/medias/:mediaId',
  headers: { 
    'Authorization': 'Bearer YOUR_API_TOKEN', 
    ...data.getHeaders()
  },
  data : data
};

axios.request(config)
.then((response) => {
  console.log(JSON.stringify(response.data));
})
.catch((error) => {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/medias/:mediaId',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HTTPHEADER => array(
    'Authorization: Bearer YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/medias/:mediaId"

payload = {}
files={}
headers = {
  'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.request("GET", url, headers=headers, data=payload, files=files)

print(response.text)

```

{% endtab %}
{% endtabs %}

### Send WhatsApp Interactive Message

<mark style="color:green;">`POST`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/interactive`

Send interactive message to an active WhatsApp number.

#### Path Parameters

| Name                                            | Type    | Description                |
| ----------------------------------------------- | ------- | -------------------------- |
| IntegrationId<mark style="color:red;">\*</mark> | Integer | The ID of your integration |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | string | Your API Token |

#### Request Body

| Name                                               | Type   | Description                                                                                                                                        |
| -------------------------------------------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| to<mark style="color:red;">\*</mark>               | String | WhatsApp number to be sent. It should start with (+) and a country code.                                                                           |
| body<mark style="color:red;">\*</mark>             | String | Message body. It must be max 1024 chars.                                                                                                           |
| buttons\[]<mark style="color:red;">\*</mark>       | Array  | Required parameters for the interactive message. It must be max 10 button object item.                                                             |
| buttons.\*.id<mark style="color:red;">\*</mark>    | String | Unique identifier for your button. This ID is returned in the webhook when the button is clicked by the user. Maximum length: 200 chars.           |
| buttons.\*.title<mark style="color:red;">\*</mark> | String | Button title. It cannot be an empty string and must be unique within the message. Emojis are supported, markdown is not. Maximum length: 20 chars. |
| header                                             | Object | An object with the header of the message.                                                                                                          |
| header.type                                        | String | Required if header is set. Supported values: text, image, video or document.                                                                       |
| header.text                                        | String | Required if header's type is text. It must be max 60 chars.                                                                                        |
| header.document.link                               | String | Required if header's type is document.                                                                                                             |
| header.document.filename                           | String | Header's document filename.                                                                                                                        |
| header.video.link                                  | String | Required if header's type is video.                                                                                                                |
| header.image.link                                  | String | Required if header's type is image.                                                                                                                |
| footer                                             | Object | An object with the footer of the message.                                                                                                          |
| footer.text                                        | String | Required if footer object. It must be max 60 chars.                                                                                                |

{% tabs %}
{% tab title="200 " %}

```json
{
    "message_id": "gBEGkFBXUQRnAglHuQTBEMHpUdo"
}
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location --request POST 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/interactive' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--data '{
    "to": "+90xxxxxxxxxx",
    "header": {
        "type": "image",
        "image": {
            "link": "https://fastly.picsum.photos/id/879/200/300.jpg?hmac=07llkorYxtpw0EwxaeqFKPC5woveWVLykQVnIOyiwd8"
        }
    },
    "body": "<p>Hello</p>",
    "footer": {
        "text": "<b>Bye</b>"
    },
    "buttons": [
        {
            "id": "ID 1.1",
            "title": "Button 1"
        },
        {
            "id": "ID 1.2",
            "title": "Button 2"
        },
        {
            "id": "ID 1.3",
            "title": "Button 3"
        }
    ]
}'
```

{% endtab %}

{% tab title="C#" %}

```csharp
var options = new RestClientOptions("https://public-api.desk360.com")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("/v1/integrations/:integrationId/conversations/messages/interactive", Method.Post);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer YOUR_API_TOKEN");
var body = @"{" + "\n" +
@"    ""to"": ""+90xxxxxxxxxx""," + "\n" +
@"    ""header"": {" + "\n" +
@"        ""type"": ""image""," + "\n" +
@"        ""image"": {" + "\n" +
@"            ""link"": ""https://fastly.picsum.photos/id/879/200/300.jpg?hmac=07llkorYxtpw0EwxaeqFKPC5woveWVLykQVnIOyiwd8""" + "\n" +
@"        }" + "\n" +
@"    }," + "\n" +
@"    ""body"": ""<p>Hello</p>""," + "\n" +
@"    ""footer"": {" + "\n" +
@"        ""text"": ""<b>Bye</b>""" + "\n" +
@"    }," + "\n" +
@"    ""buttons"": [" + "\n" +
@"        {" + "\n" +
@"            ""id"": ""ID 1.1""," + "\n" +
@"            ""title"": ""Button 1""" + "\n" +
@"        }," + "\n" +
@"        {" + "\n" +
@"            ""id"": ""ID 1.2""," + "\n" +
@"            ""title"": ""Button 2""" + "\n" +
@"        }," + "\n" +
@"        {" + "\n" +
@"            ""id"": ""ID 1.3""," + "\n" +
@"            ""title"": ""Button 3""" + "\n" +
@"        }" + "\n" +
@"    ]" + "\n" +
@"}";
request.AddStringBody(body, DataFormat.Json);
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n    \"to\": \"+90xxxxxxxxxx\",\n    \"header\": {\n        \"type\": \"image\",\n        \"image\": {\n            \"link\": \"https://fastly.picsum.photos/id/879/200/300.jpg?hmac=07llkorYxtpw0EwxaeqFKPC5woveWVLykQVnIOyiwd8\"\n        }\n    },\n    \"body\": \"<p>Hello</p>\",\n    \"footer\": {\n        \"text\": \"<b>Bye</b>\"\n    },\n    \"buttons\": [\n        {\n            \"id\": \"ID 1.1\",\n            \"title\": \"Button 1\"\n        },\n        {\n            \"id\": \"ID 1.2\",\n            \"title\": \"Button 2\"\n        },\n        {\n            \"id\": \"ID 1.3\",\n            \"title\": \"Button 3\"\n        }\n    ]\n}");
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/interactive")
  .method("POST", body)
  .addHeader("Content-Type", "application/json")
  .addHeader("Authorization", "Bearer YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');
let data = JSON.stringify({
  "to": "+90xxxxxxxxxx",
  "header": {
    "type": "image",
    "image": {
      "link": "https://fastly.picsum.photos/id/879/200/300.jpg?hmac=07llkorYxtpw0EwxaeqFKPC5woveWVLykQVnIOyiwd8"
    }
  },
  "body": "<p>Hello</p>",
  "footer": {
    "text": "<b>Bye</b>"
  },
  "buttons": [
    {
      "id": "ID 1.1",
      "title": "Button 1"
    },
    {
      "id": "ID 1.2",
      "title": "Button 2"
    },
    {
      "id": "ID 1.3",
      "title": "Button 3"
    }
  ]
});

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/interactive',
  headers: { 
    'Content-Type': 'application/json', 
    'Authorization': 'Bearer YOUR_API_TOKEN'
  },
  data : data
};

axios.request(config)
.then((response) => {
  console.log(JSON.stringify(response.data));
})
.catch((error) => {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/interactive',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
    "to": "+90xxxxxxxxxx",
    "header": {
        "type": "image",
        "image": {
            "link": "https://fastly.picsum.photos/id/879/200/300.jpg?hmac=07llkorYxtpw0EwxaeqFKPC5woveWVLykQVnIOyiwd8"
        }
    },
    "body": "<p>Hello</p>",
    "footer": {
        "text": "<b>Bye</b>"
    },
    "buttons": [
        {
            "id": "ID 1.1",
            "title": "Button 1"
        },
        {
            "id": "ID 1.2",
            "title": "Button 2"
        },
        {
            "id": "ID 1.3",
            "title": "Button 3"
        }
    ]
}',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'Authorization: Bearer YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests
import json

url = "https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/interactive"

payload = json.dumps({
  "to": "+90xxxxxxxxxx",
  "header": {
    "type": "image",
    "image": {
      "link": "https://fastly.picsum.photos/id/879/200/300.jpg?hmac=07llkorYxtpw0EwxaeqFKPC5woveWVLykQVnIOyiwd8"
    }
  },
  "body": "<p>Hello</p>",
  "footer": {
    "text": "<b>Bye</b>"
  },
  "buttons": [
    {
      "id": "ID 1.1",
      "title": "Button 1"
    },
    {
      "id": "ID 1.2",
      "title": "Button 2"
    },
    {
      "id": "ID 1.3",
      "title": "Button 3"
    }
  ]
})
headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)

```

{% endtab %}
{% endtabs %}

### Send WhatsApp Location Request Interactive Message

<mark style="color:green;">`POST`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/interactive/location-request`

Send location request interactive message to an active WhatsApp number.

#### Path Parameters

| Name                                            | Type    | Description                |
| ----------------------------------------------- | ------- | -------------------------- |
| IntegrationId<mark style="color:red;">\*</mark> | Integer | The ID of your integration |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | String | Your API Token |

#### Request Body

| Name                                   | Type   | Description                                                              |
| -------------------------------------- | ------ | ------------------------------------------------------------------------ |
| to<mark style="color:red;">\*</mark>   | String | WhatsApp number to be sent. It should start with (+) and a country code. |
| body<mark style="color:red;">\*</mark> | String | Message body. It must be max 1024 chars.                                 |

{% tabs %}
{% tab title="200 " %}

```json
{
    "message_id": "gBEGkFBXUQRnAgn6gWf5CzaF6Ko"
}
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location --request POST 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/interactive/location-request' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--data '{
    "to": "+90xxxxxxxxxx",
    "body": "<i>Send Location</i>"
}'
```

{% endtab %}

{% tab title="C#" %}

```csharp
var options = new RestClientOptions("https://public-api.desk360.com")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("/v1/integrations/:integrationId/conversations/messages/interactive/location-request", Method.Post);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer YOUR_API_TOKEN");
var body = @"{" + "\n" +
@"    ""to"": ""+90xxxxxxxxxx""," + "\n" +
@"    ""body"": ""<i>Send Location</i>""" + "\n" +
@"}";
request.AddStringBody(body, DataFormat.Json);
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n    \"to\": \"+90xxxxxxxxxx\",\n    \"body\": \"<i>Send Location</i>\"\n}");
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/interactive/location-request")
  .method("POST", body)
  .addHeader("Content-Type", "application/json")
  .addHeader("Authorization", "Bearer YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');
let data = JSON.stringify({
  "to": "+90xxxxxxxxxx",
  "body": "<i>Send Location</i>"
});

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/interactive/location-request',
  headers: { 
    'Content-Type': 'application/json', 
    'Authorization': 'Bearer YOUR_API_TOKEN'
  },
  data : data
};

axios.request(config)
.then((response) => {
  console.log(JSON.stringify(response.data));
})
.catch((error) => {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/interactive/location-request',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
    "to": "+90xxxxxxxxxx",
    "body": "<i>Send Location</i>"
}',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'Authorization: Bearer YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests
import json

url = "https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/interactive/location-request"

payload = json.dumps({
  "to": "+90xxxxxxxxxx",
  "body": "<i>Send Location</i>"
})
headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)

```

{% endtab %}
{% endtabs %}

### Read WhatsApp Message

<mark style="color:green;">`POST`</mark> `https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/reads`

Mark messages from webhook as read.

#### Path Parameters

| Name                                            | Type    | Description                |
| ----------------------------------------------- | ------- | -------------------------- |
| IntegrationId<mark style="color:red;">\*</mark> | Integer | The ID of your integration |

#### Headers

| Name                                             | Type   | Description    |
| ------------------------------------------------ | ------ | -------------- |
| Authorization <mark style="color:red;">\*</mark> | string | Your API Token |

#### Request Body

| Name                                              | Type   | Description                                                              |
| ------------------------------------------------- | ------ | ------------------------------------------------------------------------ |
| message\_ids\[]<mark style="color:red;">\*</mark> | object | Message ids to mark as read                                              |
| to<mark style="color:red;">\*</mark>              | String | WhatsApp number to be read. It should start with (+) and a country code. |

{% tabs %}
{% tab title="200 " %}

```json
{
    "message_ids": [
        "gBEGkFBXUQRnAgn6gWf5CzaF6Ko",
        "gBEGkFBXUQRnAglHuQTBEMHpUdo"
    ]
}
```

{% endtab %}
{% endtabs %}

**Code Samples**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location --request POST 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/reads' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--form 'to="+90xxxxxxxxxx"' \
--form 'message_ids[]="xxxxxxxxxxxxxxxx"'
```

{% endtab %}

{% tab title="C#" %}

```csharp
var options = new RestClientOptions("https://public-api.desk360.com")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("/v1/integrations/:integrationId/conversations/messages/reads", Method.Post);
request.AddHeader("Authorization", "Bearer YOUR_API_TOKEN");
request.AlwaysMultipartFormData = true;
request.AddParameter("to", "+90xxxxxxxxxx");
request.AddParameter("message_ids[]", "xxxxxxxxxxxxxxxx");
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
```

{% endtab %}

{% tab title="Java" %}

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
  .addFormDataPart("to","+90xxxxxxxxxx")
  .addFormDataPart("message_ids[]","xxxxxxxxxxxxxxxx")
  .build();
Request request = new Request.Builder()
  .url("https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/reads")
  .method("POST", body)
  .addHeader("Authorization", "Bearer YOUR_API_TOKEN")
  .build();
Response response = client.newCall(request).execute();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const axios = require('axios');
const FormData = require('form-data');
let data = new FormData();
data.append('to', '+90xxxxxxxxxx');
data.append('message_ids[]', 'xxxxxxxxxxxxxxxx');

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/reads',
  headers: { 
    'Authorization': 'Bearer YOUR_API_TOKEN', 
    ...data.getHeaders()
  },
  data : data
};

axios.request(config)
.then((response) => {
  console.log(JSON.stringify(response.data));
})
.catch((error) => {
  console.log(error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/reads',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => array('message_ids[]' => 'xxxxxxxxxxxxxxxx','to' => '+90xxxxxxxxxx'),
  CURLOPT_HTTPHEADER => array(
    'Authorization: Bearer YOUR_API_TOKEN'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://public-api.desk360.com/v1/integrations/:integrationId/conversations/messages/reads"

payload = {'message_ids[]': 'xxxxxxxxxxxxxxxx', 'to': '+90xxxxxxxxxx'}
files=[

]
headers = {
  'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)

```

{% endtab %}
{% endtabs %}

## WhatsApp Webhooks

Subscribe to Webhooks to be notified about messages and message status updates your business receives.

### Received Messages Examples <a href="#received-messages-examples" id="received-messages-examples"></a>

**Text Messages**

```json
{
  "messages": {
    "id": "ABEGkFMIcyRoAgo-sGaD-H6MgPEt",
    "text": "Hello",
    "from": "90xxxxxxxxxx",
    "timestamp": "1630913975",
    "name": "John Doe",
    "type": "text"
  }
}
```

**Location Messages**

```json
{
  "messages": {
    "id": "ABEGkFBXUQRnAgo6cHkZc1yy0dAx",
    "text": "Main Street Beach - Main Street Beach, Santa Cruz, CA, latitude: 38.9806263495, longitude: -131.9428612257",
    "from": "90xxxxxxxxxx",
    "timestamp": "1700052659",
    "name": "John Doe",
    "location": {
      "address": "Main Street Beach, Santa Cruz, CA",
      "latitude": 38.9806263495,
      "longitude": -131.9428612257,
      "name": "Main Street Beach"
    },
    "type": "location"
  }
}
```

**Contact Messages**

```json
{
  "messages": {
    "id": "ABEGkFBXUQRnAgo6PXn8aI1fmlOm",
    "from": "90xxxxxxxxxx",
    "timestamp": "1700052797",
    "name": "John Doe",
    "type": "contacts",
    "contacts": [
      {
        "addresses": [
          {
            "city": "Menlo Park",
            "country": "United States",
            "country_code": "us",
            "state": "CA",
            "street": "1 Hacker Way",
            "type": "WORK",
            "zip": "94025"
          }
        ],
        "birthday": "2012-08-18",
        "emails": [
          {
            "email": "kfish@fb.com",
            "type": "WORK"
          }
        ],
        "ims": [
          {
            "service": "AIM",
            "user_id": "kfish"
          }
        ],
        "name": {
          "first_name": "Kerry",
          "formatted_name": "Kerry Fisher",
          "last_name": "Fisher"
        },
        "org": {
          "company": "Meta",
          "department": "WhatsApp"
        },
        "phones": [
          {
            "phone": "+1 (650) 555-1234",
            "type": "WORK",
            "wa_id": "16505551234"
          }
        ],
        "urls": [
          {
            "url": "https://www.facebook.com",
            "type": "WORK"
          }
        ]
      }
    ]
  }
}
```

**Media Messages**

```json
{
  "messages": {
    "id": "ABEGkFBXUQRnAgo6xTEQCONO2nW9",
    "from": "90xxxxxxxxxx",
    "timestamp": "1689756449",
    "name": "John Doe",
    "image": {
      "message": null,
      "media_id": "83518734-56a9-4b51-8372-93f1432cfa9b",
      "mime_type": "image/jpeg",
      "sha": "7e18d97d50eea65a50d9fa93db26e1c689da7c7de64d829b22aad38c4f541510"
    },
    "attachments": {
      "images": [
        {
          "url": "https://path/to/file/9oCtWHWxkv4E0PQhtHA4uW4NRinIROKCO8NEae5p.jpeg",
          "name": "9oCtWHWxkv4E0PQhtHA4uW4NRinIROKCO8NEae5p.jpeg",
          "type": "image",
          "aws": true
        }
      ]
    },
    "type": "image"
  }
}
```

**Messages Triggered by WhatsApp Ads**

```json
{
  "messages": {
    "id": "wamid.HBgMOTA1MDU3NTExxxxxxxxxxxxxxx",
    "from": "90xxxxxxxxxx",
    "name": "John Doe",
    "text": "Hello",
    "type": "text",
    "referral": {
      "id": "AD_OR_POST_ID",
      "url": "AD_OR_POST_FB_URL",
      "body": "AD_OR_POST_DESCRIPTION",
      "type": "ad or post",
      "header": "AD_OR_POST_TITLE",
      "media_url": "RAW_MEDIA_URL",
      "media_type": "image or video",
      "thumbnail_url": "RAW_THUMBNAIL_URL"
    },
    "timestamp": "1741867567"
  }
}
```

### Status Updates <a href="#received-messages-examples" id="received-messages-examples"></a>

{% code fullWidth="false" %}

```json
{
  "statuses": {
    "id": "gBEGkFBXUQRnAglM82HET_hbwJs",
    "from": "90xxxxxxxxxx",
    "status": "delivered|read"
  }
}
```

{% endcode %}

&#x20;                                                     [<mark style="color:blue;">**Homepage**</mark>](https://desk360.com/)                                         [ ](https://desk360.com/pricing)[<mark style="color:blue;">**Pricing**</mark>](https://desk360.com/pricing)


# META Processes

#### Before you begin

* You must have a personal Facebook account. You'll use it to log into Meta Business Suite or Business Manager, where you can create your business portfolio.
* You can create up to 2 business portfolios. Note: This is not a limit on the number of portfolios you can belong to.
* [Business Manager](https://www.facebook.com/business/help/113163272211510) permissions override all others.

#### Create a business portfolio

1. Go to [business.facebook.com](https://business.facebook.com/) in a desktop browser. You will also use this address to log into Meta Business Suite or Business Manager. If you already have access to Meta Business Suite and Business Manager, you can also click the dropdown menu located at the top of the left navigation bar. Then skip to Step 4.
2. Click **Create an account.**
3. Log into your personal Facebook account. If you don’t have an account, click Create account to sign up for one.
4. Click **Create an account.**
5. Enter your business details.
   * **Business portfolio name.** It should match the public name of your business or organization, since it will be visible across Meta. It can't contain special characters.
   * **Your name.**
   * **Business email.** Meta will use this email to contact you about your business. It won't be visible to your customers.
6. Click **Submit** or **Create** to create your portfolio. You’ll get an email asking to confirm your business email address. Then, you can verify your work email through the email that has been sent to you.

&#x20;                                                     [<mark style="color:blue;">**Homepage**</mark>](https://desk360.com/)                                         [ ](https://desk360.com/pricing)[<mark style="color:blue;">**Pricing**</mark>](https://desk360.com/pricing)


# Data Import

This guide is designed to help you easily send template messages by uploading your customer number data to the Desk360 Panel.\
The feature allows you to upload customer data once and send messages using this data anytime you want.

#### How It Works?

1. **Go to “Upload Data”**

* Click on the *Upload Data* section in the left menu.

2. **Create New Data**

* Click the *New Data Upload* button in the top-right corner.

<figure><img src="/files/8rd3GrX2fLJoJRH0qm52" alt=""><figcaption></figcaption></figure>

3. **Enter a Category Name**

* Provide a name up to 60 characters long (e.g., *“September Campaign List”*).
* You can change this name later.

4. **Add Tags**

* Select tags from your existing list or create new ones.
* There is no limit to the number of tags you can add.

5. **Upload CSV File**

* Upload a CSV file containing phone numbers with country codes.
* After uploading, you can see the number of valid phone numbers.

6. **Save**

* Once you click *Save*, your list will be added to the category table.

<figure><img src="/files/vd32ykpcmU354vFutDPX" alt=""><figcaption></figcaption></figure>

#### Category List Screen

For each category, you can see the following details:

* **ID**
* **Category Name**
* **Number of Phone Numbers**
* **Tags** (if there are more than 5, hover to see them all)
* **Manage Button** (Edit / Duplicate)

<figure><img src="https://whatsapp-tr.desk360.com/~gitbook/image?url=https%3A%2F%2F2381022032-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F7BhQaSdEyNOSOcs0ZgNH%252Fuploads%252FxSX8bgVtnOnnO5OsU190%252FScreenshot%25202025-08-15%2520at%252016.40.34.png%3Falt%3Dmedia%26token%3Dcbb8b011-45be-47b4-9c3a-2d2f834385fb&#x26;width=768&#x26;dpr=4&#x26;quality=100&#x26;sign=dc3a4d00&#x26;sv=2" alt=""><figcaption></figcaption></figure>


