curl --request GET \
--url https://collectwiseapi.com/text/messages \
--header 'collectwise_key: <api-key>'import requests
url = "https://collectwiseapi.com/text/messages"
headers = {"collectwise_key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {collectwise_key: '<api-key>'}};
fetch('https://collectwiseapi.com/text/messages', 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://collectwiseapi.com/text/messages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"collectwise_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://collectwiseapi.com/text/messages"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("collectwise_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://collectwiseapi.com/text/messages")
.header("collectwise_key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://collectwiseapi.com/text/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["collectwise_key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"count": 2,
"messages": [
{
"messageId": "4d1a0b7c-9e2f-4c31-8a77-2b6f0d1e5c44",
"direction": "inbound",
"status": "Delivered",
"message": "when is my payment due",
"debtorId": "your-reference-number",
"destination": "+13313048434",
"conversationId": "conv_087b83bb525d4fceaaa01a4234b6b012",
"templateId": null,
"messageType": "sms",
"mediaUrls": null,
"createdAt": "2026-08-17T12:00:00.000Z",
"updatedAt": null
},
{
"messageId": "1b1f0a9e-6f4e-4f4b-9a2e-1f2d3c4b5a69",
"direction": "outbound",
"status": "Delivered",
"message": "Jane, this is Acme Recovery Group, a debt collector. Your balance is $430.10. Reply STOP to opt out.",
"debtorId": "your-reference-number",
"destination": "+13313048434",
"conversationId": "conv_087b83bb525d4fceaaa01a4234b6b012",
"templateId": 100,
"messageType": "sms",
"mediaUrls": null,
"createdAt": "2026-08-17T11:58:02.000Z",
"updatedAt": "2026-08-17T11:58:07.000Z"
}
]
}{
"error": "Provide messageId, debtorId, destination or since"
}{
"error": "Texting is not enabled for this organization"
}{
"error": "Message not found"
}{
"error": "Too many requests"
}{
"error": "Internal server error"
}List Text Messages
Returns the message thread for one of your recipients: your outbound sends and the consumer’s inbound replies, newest first. Use this to poll for replies if you do not want to run a webhook endpoint, or to backfill replies after a webhook outage. Results are always scoped to your organization. Provide at least one of messageId, debtorId, destination, or since.
curl --request GET \
--url https://collectwiseapi.com/text/messages \
--header 'collectwise_key: <api-key>'import requests
url = "https://collectwiseapi.com/text/messages"
headers = {"collectwise_key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {collectwise_key: '<api-key>'}};
fetch('https://collectwiseapi.com/text/messages', 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://collectwiseapi.com/text/messages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"collectwise_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://collectwiseapi.com/text/messages"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("collectwise_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://collectwiseapi.com/text/messages")
.header("collectwise_key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://collectwiseapi.com/text/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["collectwise_key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"count": 2,
"messages": [
{
"messageId": "4d1a0b7c-9e2f-4c31-8a77-2b6f0d1e5c44",
"direction": "inbound",
"status": "Delivered",
"message": "when is my payment due",
"debtorId": "your-reference-number",
"destination": "+13313048434",
"conversationId": "conv_087b83bb525d4fceaaa01a4234b6b012",
"templateId": null,
"messageType": "sms",
"mediaUrls": null,
"createdAt": "2026-08-17T12:00:00.000Z",
"updatedAt": null
},
{
"messageId": "1b1f0a9e-6f4e-4f4b-9a2e-1f2d3c4b5a69",
"direction": "outbound",
"status": "Delivered",
"message": "Jane, this is Acme Recovery Group, a debt collector. Your balance is $430.10. Reply STOP to opt out.",
"debtorId": "your-reference-number",
"destination": "+13313048434",
"conversationId": "conv_087b83bb525d4fceaaa01a4234b6b012",
"templateId": 100,
"messageType": "sms",
"mediaUrls": null,
"createdAt": "2026-08-17T11:58:02.000Z",
"updatedAt": "2026-08-17T11:58:07.000Z"
}
]
}{
"error": "Provide messageId, debtorId, destination or since"
}{
"error": "Texting is not enabled for this organization"
}{
"error": "Message not found"
}{
"error": "Too many requests"
}{
"error": "Internal server error"
}Authorizations
Active, unexpired API key belonging to an active organization. Optional organization/key signing and organization IP restrictions also apply; see API Access.
Headers
Required together with x-cw-signature when signing is enabled for this key or organization. POST /security/verify also requires signing whenever a usable secret exists. Canonical Unix seconds, within ±300 seconds. See API Access for CW1 signing.
^(0|[1-9][0-9]*)$CW1 HMAC-SHA256 signature: v1= followed by 64 lowercase hex digits. Use the decoded 32-byte signing secret and exact request bytes. See API Access.
^v1=[0-9a-f]{64}$Query Parameters
A messageId returned by the send endpoint. Returns that message's whole thread, in both directions. 404 if the id does not belong to your organization.
Your reference for the recipient, as sent on debtorId.
Recipient phone number, in any of the formats the send endpoint accepts.
Maximum number of messages to return.
1 <= x <= 200ISO 8601 timestamp. Returns only messages created at or after it. Valid on its own, so you can use it to backfill everything your organization received after a webhook outage.
