curl --request GET \
--url https://api.hubapi.com/conversations/conversations/2026-09-beta/threads/{threadId}/messages \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.hubapi.com/conversations/conversations/2026-09-beta/threads/{threadId}/messages"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.hubapi.com/conversations/conversations/2026-09-beta/threads/{threadId}/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://api.hubapi.com/conversations/conversations/2026-09-beta/threads/{threadId}/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 => [
"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.hubapi.com/conversations/conversations/2026-09-beta/threads/{threadId}/messages"
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.hubapi.com/conversations/conversations/2026-09-beta/threads/{threadId}/messages")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hubapi.com/conversations/conversations/2026-09-beta/threads/{threadId}/messages")
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{
"results": [
{
"archived": true,
"attachments": [
{
"fileId": "<string>",
"type": "FILE",
"name": "<string>",
"url": "<string>"
}
],
"channelAccountId": "<string>",
"channelId": "<string>",
"client": {
"integrationAppId": 123
},
"conversationsThreadId": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"createdBy": "<string>",
"id": "<string>",
"recipients": [
{
"deliveryIdentifier": {
"value": "<string>"
},
"actorId": "<string>",
"name": "<string>",
"recipientField": "<string>"
}
],
"senders": [
{
"actorId": "<string>",
"deliveryIdentifier": {
"value": "<string>"
},
"name": "<string>",
"senderField": "<string>"
}
],
"text": "<string>",
"type": "MESSAGE",
"inReplyToId": "<string>",
"richText": "<string>",
"status": {
"failureDetails": {
"errorMessageTokens": {},
"errorMessage": "<string>"
}
},
"subject": "<string>",
"updatedAt": "2023-11-07T05:31:56Z"
}
],
"paging": {
"next": {
"after": "<string>",
"link": "<string>"
}
}
}{
"message": "Invalid input (details will vary based on the error)",
"correlationId": "aeb5f871-7f07-4993-9211-075dc63e7cbf",
"category": "VALIDATION_ERROR",
"links": {
"knowledge-base": "https://www.hubspot.com/products/service/knowledge-base"
}
}Retrieve messages
Retrieve messages from a specific conversation thread in your HubSpot account. This endpoint allows you to paginate through messages, sort them, and filter based on archival status. It is useful for accessing the message history of a conversation thread.
curl --request GET \
--url https://api.hubapi.com/conversations/conversations/2026-09-beta/threads/{threadId}/messages \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.hubapi.com/conversations/conversations/2026-09-beta/threads/{threadId}/messages"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.hubapi.com/conversations/conversations/2026-09-beta/threads/{threadId}/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://api.hubapi.com/conversations/conversations/2026-09-beta/threads/{threadId}/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 => [
"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.hubapi.com/conversations/conversations/2026-09-beta/threads/{threadId}/messages"
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.hubapi.com/conversations/conversations/2026-09-beta/threads/{threadId}/messages")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hubapi.com/conversations/conversations/2026-09-beta/threads/{threadId}/messages")
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{
"results": [
{
"archived": true,
"attachments": [
{
"fileId": "<string>",
"type": "FILE",
"name": "<string>",
"url": "<string>"
}
],
"channelAccountId": "<string>",
"channelId": "<string>",
"client": {
"integrationAppId": 123
},
"conversationsThreadId": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"createdBy": "<string>",
"id": "<string>",
"recipients": [
{
"deliveryIdentifier": {
"value": "<string>"
},
"actorId": "<string>",
"name": "<string>",
"recipientField": "<string>"
}
],
"senders": [
{
"actorId": "<string>",
"deliveryIdentifier": {
"value": "<string>"
},
"name": "<string>",
"senderField": "<string>"
}
],
"text": "<string>",
"type": "MESSAGE",
"inReplyToId": "<string>",
"richText": "<string>",
"status": {
"failureDetails": {
"errorMessageTokens": {},
"errorMessage": "<string>"
}
},
"subject": "<string>",
"updatedAt": "2023-11-07T05:31:56Z"
}
],
"paging": {
"next": {
"after": "<string>",
"link": "<string>"
}
}
}{
"message": "Invalid input (details will vary based on the error)",
"correlationId": "aeb5f871-7f07-4993-9211-075dc63e7cbf",
"category": "VALIDATION_ERROR",
"links": {
"knowledge-base": "https://www.hubspot.com/products/service/knowledge-base"
}
}Supported products
Supported products
Required Scopes
Required Scopes
Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Path Parameters
The unique ID of the thread.
Query Parameters
The paging cursor token of the last successfully read resource will be returned as the paging.next.after JSON property of a paged response containing more results.
Whether to return only results that have been archived.
The maximum number of results to display per page.
A specific property to include in the message response.
Sort direction. Valid options are createdAt (ascending), and -createdAt (descending, default)
Was this page helpful?