curl --request GET \
--url https://app.livechatai.com/api/v2/contacts/{contactId}/conversations \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.livechatai.com/api/v2/contacts/{contactId}/conversations"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.livechatai.com/api/v2/contacts/{contactId}/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://app.livechatai.com/api/v2/contacts/{contactId}/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://app.livechatai.com/api/v2/contacts/{contactId}/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://app.livechatai.com/api/v2/contacts/{contactId}/conversations")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.livechatai.com/api/v2/contacts/{contactId}/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{
"status": "success",
"data": {
"conversations": [
{
"id": "chat_1234567890",
"isResolved": false,
"isStarred": false,
"isMuted": false,
"isAgent": false,
"integrationType": "WHATSAPP",
"contact": {
"id": "contact_1234567890",
"name": "John Doe",
"phone": "+1234567890",
"email": "john@example.com",
"distinctId": "user_12345",
"attributes": {
"planType": "premium"
}
},
"agent": {
"id": "agent_1234567890",
"name": "Jane Smith",
"email": "jane@company.com",
"avatar": "https://example.com/avatar.jpg"
},
"lastMessageDate": "2024-01-20T14:45:00Z",
"lastVisitorMessageDate": "2024-01-20T14:30:00Z",
"lastBotMessageDate": "2024-01-20T14:45:00Z",
"lastAgentMessageDate": "2024-01-19T10:00:00Z",
"resolution": {
"verdict": "UNRESOLVED",
"handledBy": "HUMAN_AGENT",
"reason": "The customer asked for a refund status, the agent promised to check and never replied.",
"confidence": 0.82,
"analyzedAt": "2024-01-20T15:00:00Z"
},
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-20T14:45:00Z"
}
],
"meta": {
"total": 12,
"perPage": 20,
"currentPage": 1,
"totalPages": 1
}
}
}List conversations for a contact
List conversations for a specific contact with pagination and filtering options. Mirrors the response shape of GET /api/v2/conversations, scoped to a single contact.
curl --request GET \
--url https://app.livechatai.com/api/v2/contacts/{contactId}/conversations \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.livechatai.com/api/v2/contacts/{contactId}/conversations"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.livechatai.com/api/v2/contacts/{contactId}/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://app.livechatai.com/api/v2/contacts/{contactId}/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://app.livechatai.com/api/v2/contacts/{contactId}/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://app.livechatai.com/api/v2/contacts/{contactId}/conversations")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.livechatai.com/api/v2/contacts/{contactId}/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{
"status": "success",
"data": {
"conversations": [
{
"id": "chat_1234567890",
"isResolved": false,
"isStarred": false,
"isMuted": false,
"isAgent": false,
"integrationType": "WHATSAPP",
"contact": {
"id": "contact_1234567890",
"name": "John Doe",
"phone": "+1234567890",
"email": "john@example.com",
"distinctId": "user_12345",
"attributes": {
"planType": "premium"
}
},
"agent": {
"id": "agent_1234567890",
"name": "Jane Smith",
"email": "jane@company.com",
"avatar": "https://example.com/avatar.jpg"
},
"lastMessageDate": "2024-01-20T14:45:00Z",
"lastVisitorMessageDate": "2024-01-20T14:30:00Z",
"lastBotMessageDate": "2024-01-20T14:45:00Z",
"lastAgentMessageDate": "2024-01-19T10:00:00Z",
"resolution": {
"verdict": "UNRESOLVED",
"handledBy": "HUMAN_AGENT",
"reason": "The customer asked for a refund status, the agent promised to check and never replied.",
"confidence": 0.82,
"analyzedAt": "2024-01-20T15:00:00Z"
},
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-20T14:45:00Z"
}
],
"meta": {
"total": 12,
"perPage": 20,
"currentPage": 1,
"totalPages": 1
}
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Unique identifier of the contact
"contact_1234567890"
Query Parameters
Page number for pagination
x >= 11
Number of records per page (max 100)
1 <= x <= 10020
Sort order for lastMessageDate
asc, desc "desc"
Filter by conversation status
open, close "open"
Filter by start date. Supports Unix timestamp in seconds (e.g., 1747196400) or ISO 8601 format (e.g., 2024-01-01)
"2024-01-01"
Filter by end date. Supports Unix timestamp in seconds (e.g., 1747200000) or ISO 8601 format (e.g., 2024-01-31)
"2024-01-31"
Filter by assigned agent ID. Use 'ai' for AI-handled conversations (no human agent assigned)
"user_1234567890"
Filter by conversation sentiment
POSITIVE, NEGATIVE, NEUTRAL, UNSPECIFIED "POSITIVE"
Filter by conversation topic name
"billing"
Filter by conversation channel (integration type or chat type)
WHATSAPP, SLACK, MESSENGER, FULLPAGE, INLINECHAT, PREVIEW, ONBOARDING "WHATSAPP"
Filter by resolution status
AIHelped, AIDidNotHelp, TalkToAgent "AIHelped"
Filter by the post-close resolution verdict: whether the customer's issue actually ended up solved. Comma-separated for several values (?resolutionVerdict=RESOLVED,UNRESOLVED); an unknown value returns 400. Requires the resolution analysis add-on. Conversations without a verdict (still open, reopened, or not yet analysed) are excluded.
RESOLVED, UNRESOLVED Filter by who actually carried the conversation to its end. NONE means nobody meaningfully engaged - for example the customer asked for a human and none ever replied. This is not the same as resolutionStatus=TalkToAgent, which only means a human was requested. Comma-separated for several values (?handledBy=AI,NONE); an unknown value returns 400. Requires the resolution analysis add-on.
AI, HUMAN_AGENT, NONE Filter using a saved inbox view ID. When provided, applies all filters configured in the inbox view. Other filters can be combined with viewId
"view_1234567890"

