List threads
curl --request GET \
--url https://prod.featherhq.com/api/v1/threads \
--header 'X-API-Key: <api-key>'import requests
url = "https://prod.featherhq.com/api/v1/threads"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://prod.featherhq.com/api/v1/threads', 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://prod.featherhq.com/api/v1/threads",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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://prod.featherhq.com/api/v1/threads"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://prod.featherhq.com/api/v1/threads")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod.featherhq.com/api/v1/threads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"threads": [
{
"id": "<string>",
"organizationId": "<string>",
"agentVersionId": "<string>",
"toPhoneNumber": "<string>",
"fromPhoneNumber": "<string>",
"fromPhoneNumberId": "<string>",
"leadId": "<string>",
"isActive": true,
"createdAt": "<string>",
"updatedAt": "<string>",
"closedAt": "<string>",
"closedReason": "<string>",
"agentId": "<string>",
"agentName": "<string>",
"agentDetails": {
"id": "<string>",
"name": "<string>",
"description": "<string>"
},
"agentVersionDetails": {
"id": "<string>",
"version": 123,
"name": "<string>",
"smsMaxTokens": 123,
"smsTemperature": 123,
"discardInboundSms": true
},
"metadata": {},
"variables": {}
}
],
"pagination": {
"limit": 10,
"nextCursor": "<string>"
}
}{
"status": 400,
"message": "Bad request",
"code": "BAD_REQUEST",
"success": false
}{
"status": 500,
"message": "Internal server error",
"code": "INTERNAL_SERVER_ERROR",
"success": false
}Chat Threads
List threads
List threads with cursor-based pagination and optional filters
GET
/
api
/
v1
/
threads
List threads
curl --request GET \
--url https://prod.featherhq.com/api/v1/threads \
--header 'X-API-Key: <api-key>'import requests
url = "https://prod.featherhq.com/api/v1/threads"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://prod.featherhq.com/api/v1/threads', 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://prod.featherhq.com/api/v1/threads",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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://prod.featherhq.com/api/v1/threads"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://prod.featherhq.com/api/v1/threads")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod.featherhq.com/api/v1/threads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"threads": [
{
"id": "<string>",
"organizationId": "<string>",
"agentVersionId": "<string>",
"toPhoneNumber": "<string>",
"fromPhoneNumber": "<string>",
"fromPhoneNumberId": "<string>",
"leadId": "<string>",
"isActive": true,
"createdAt": "<string>",
"updatedAt": "<string>",
"closedAt": "<string>",
"closedReason": "<string>",
"agentId": "<string>",
"agentName": "<string>",
"agentDetails": {
"id": "<string>",
"name": "<string>",
"description": "<string>"
},
"agentVersionDetails": {
"id": "<string>",
"version": 123,
"name": "<string>",
"smsMaxTokens": 123,
"smsTemperature": 123,
"discardInboundSms": true
},
"metadata": {},
"variables": {}
}
],
"pagination": {
"limit": 10,
"nextCursor": "<string>"
}
}{
"status": 400,
"message": "Bad request",
"code": "BAD_REQUEST",
"success": false
}{
"status": 500,
"message": "Internal server error",
"code": "INTERNAL_SERVER_ERROR",
"success": false
}Authorizations
Query Parameters
Number of items per page (default: 10, max: 100)
Cursor for pagination (ID of the last item in previous page)
Filter by agent ID
Filter by recipient phone number
Filter by active status
Filter by chat ended reason
Available options:
OPTED_OUT, DNC, FRAUD, CONTACT_AGAIN, WRONG_NUMBER, NOT_INTERESTED, APPOINTMENT_BOOKED, ENDED, WORKFLOW_ONE_OFF_TEXT, FILTERED_SPAM, FILTERED_OOO, FILTERED_AUTO_REPLY ⌘I