curl --request GET \
--url https://api.watx.in/v1/conversations \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.watx.in/v1/conversations"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.watx.in/v1/conversations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.watx.in/v1/conversations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.watx.in/v1/conversations"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.watx.in/v1/conversations")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.watx.in/v1/conversations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c5b1e77-90aa-4c0e-8f71-1d2a3b4c5d6e",
"channel": "whatsapp",
"contact_id": "7e2d9c01-55b4-4a3d-9c8e-0f1a2b3c4d5e",
"status": "open",
"assigned_agent_id": null,
"last_message_text": "Your order has been packed.",
"last_message_at": "2026-09-14T10:15:00.000Z",
"last_inbound_at": "2026-09-14T09:58:31.000Z",
"unread_count": 0,
"created_at": "2026-09-01T09:12:44.000Z",
"updated_at": "2026-09-14T10:15:00.000Z",
"contact": {
"id": "7e2d9c01-55b4-4a3d-9c8e-0f1a2b3c4d5e",
"phone": "+919876543210",
"instagram_username": null,
"name": "Priya Nair",
"email": "priya@example.com",
"company": "Acme Traders",
"tags": []
}
}
],
"meta": {
"next_cursor": null
}
}{
"error": {
"code": "invalid_request",
"message": "Unknown channel \"sms\". Valid values: whatsapp, instagram, web."
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key"
}
}{
"error": {
"code": "forbidden",
"message": "This API key is missing the 'messages:send' scope"
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded for this API key"
}
}List conversations
Lists conversations, newest first, with cursor pagination. Each row embeds its contact and that contact’s tags.
Every channel is returned unless you filter, so an integration written
before Instagram and the website widget existed keeps seeing everything
it saw before, plus threads it may not recognise. Each row carries
channel.
Requires the conversations:read scope.
curl --request GET \
--url https://api.watx.in/v1/conversations \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.watx.in/v1/conversations"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.watx.in/v1/conversations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.watx.in/v1/conversations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.watx.in/v1/conversations"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.watx.in/v1/conversations")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.watx.in/v1/conversations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c5b1e77-90aa-4c0e-8f71-1d2a3b4c5d6e",
"channel": "whatsapp",
"contact_id": "7e2d9c01-55b4-4a3d-9c8e-0f1a2b3c4d5e",
"status": "open",
"assigned_agent_id": null,
"last_message_text": "Your order has been packed.",
"last_message_at": "2026-09-14T10:15:00.000Z",
"last_inbound_at": "2026-09-14T09:58:31.000Z",
"unread_count": 0,
"created_at": "2026-09-01T09:12:44.000Z",
"updated_at": "2026-09-14T10:15:00.000Z",
"contact": {
"id": "7e2d9c01-55b4-4a3d-9c8e-0f1a2b3c4d5e",
"phone": "+919876543210",
"instagram_username": null,
"name": "Priya Nair",
"email": "priya@example.com",
"company": "Acme Traders",
"tags": []
}
}
],
"meta": {
"next_cursor": null
}
}{
"error": {
"code": "invalid_request",
"message": "Unknown channel \"sms\". Valid values: whatsapp, instagram, web."
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key"
}
}{
"error": {
"code": "forbidden",
"message": "This API key is missing the 'messages:send' scope"
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded for this API key"
}
}Authorizations
Your workspace API key, created in Settings → API keys, sent as
Authorization: Bearer <key>. New keys start with watx_live_; keys
issued before the rename start with converse360_live_ and still work.
Query Parameters
Page size. Default 50, maximum 100. An unusable value falls back to 50.
1 <= x <= 100The meta.next_cursor from the previous page, passed back verbatim. An
unreadable cursor is ignored and the first page is returned.
Filter by conversation status.
open, pending, closed Only this contact's conversations.
Only conversations on this channel. An unknown value is a 400.
whatsapp, instagram, web