List thread messages
curl --request GET \
--url https://api.notion.com/v1/threads/{thread_id}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Notion-Version: <notion-version>'import requests
url = "https://api.notion.com/v1/threads/{thread_id}/messages"
headers = {
"Notion-Version": "<notion-version>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'Notion-Version': '<notion-version>', Authorization: 'Bearer <token>'}
};
fetch('https://api.notion.com/v1/threads/{thread_id}/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.notion.com/v1/threads/{thread_id}/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>",
"Notion-Version: <notion-version>"
],
]);
$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.notion.com/v1/threads/{thread_id}/messages"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Notion-Version", "<notion-version>")
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.notion.com/v1/threads/{thread_id}/messages")
.header("Notion-Version", "<notion-version>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.notion.com/v1/threads/{thread_id}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Notion-Version"] = '<notion-version>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "list",
"type": "thread_message",
"results": [
{
"object": "thread_message",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"role": "user",
"content": "<string>",
"created_time": "2023-11-07T05:31:56Z",
"parent": {
"type": "thread",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"attachments": [
{
"name": "<string>",
"content_type": "<string>",
"url": "<string>",
"expiry_time": "2023-11-07T05:31:56Z"
}
],
"content_parts": [
{
"type": "text",
"text": "<string>"
}
],
"pending_user_actions": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "tool_confirmation",
"title": "<string>",
"requirements": [
{
"type": "general"
}
],
"options": [
{
"id": "approve",
"label": "<string>"
}
]
}
]
}
],
"has_more": true,
"next_cursor": "<string>"
}{
"object": "error",
"message": "<string>",
"code": "invalid_json",
"status": 400,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "unauthorized",
"status": 401,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "restricted_resource",
"status": 403,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "object_not_found",
"status": 404,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "row_limit_exceeded",
"status": 406,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "conflict_error",
"status": 409,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "rate_limited",
"status": 429,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "internal_server_error",
"status": 500,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "service_unavailable",
"status": 503,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "gateway_timeout",
"status": 504,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "service_overload",
"status": 529,
"additional_data": {}
}Internal Endpoints
List Thread Messages
deprecated
GET
/
v1
/
threads
/
{thread_id}
/
messages
List thread messages
curl --request GET \
--url https://api.notion.com/v1/threads/{thread_id}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Notion-Version: <notion-version>'import requests
url = "https://api.notion.com/v1/threads/{thread_id}/messages"
headers = {
"Notion-Version": "<notion-version>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'Notion-Version': '<notion-version>', Authorization: 'Bearer <token>'}
};
fetch('https://api.notion.com/v1/threads/{thread_id}/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.notion.com/v1/threads/{thread_id}/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>",
"Notion-Version: <notion-version>"
],
]);
$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.notion.com/v1/threads/{thread_id}/messages"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Notion-Version", "<notion-version>")
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.notion.com/v1/threads/{thread_id}/messages")
.header("Notion-Version", "<notion-version>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.notion.com/v1/threads/{thread_id}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Notion-Version"] = '<notion-version>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "list",
"type": "thread_message",
"results": [
{
"object": "thread_message",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"role": "user",
"content": "<string>",
"created_time": "2023-11-07T05:31:56Z",
"parent": {
"type": "thread",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"attachments": [
{
"name": "<string>",
"content_type": "<string>",
"url": "<string>",
"expiry_time": "2023-11-07T05:31:56Z"
}
],
"content_parts": [
{
"type": "text",
"text": "<string>"
}
],
"pending_user_actions": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "tool_confirmation",
"title": "<string>",
"requirements": [
{
"type": "general"
}
],
"options": [
{
"id": "approve",
"label": "<string>"
}
]
}
]
}
],
"has_more": true,
"next_cursor": "<string>"
}{
"object": "error",
"message": "<string>",
"code": "invalid_json",
"status": 400,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "unauthorized",
"status": 401,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "restricted_resource",
"status": 403,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "object_not_found",
"status": 404,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "row_limit_exceeded",
"status": 406,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "conflict_error",
"status": 409,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "rate_limited",
"status": 429,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "internal_server_error",
"status": 500,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "service_unavailable",
"status": 503,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "gateway_timeout",
"status": 504,
"additional_data": {}
}{
"object": "error",
"message": "<string>",
"code": "service_overload",
"status": 529,
"additional_data": {}
}This is an internal/undocumented endpoint. It is not part of the public API and may change without notice. Do not rely on this endpoint for production connections.
role: "agent", where the content field contains the error description.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
The API version to use for this request. The latest version is 2026-03-11.
Available options:
2026-03-11 Path Parameters
The ID of the thread.
Query Parameters
Whether to include agent thinking and structured message content parts. Defaults to false.
Filter messages by role (user or agent).
Available options:
user, agent If supplied, this endpoint will return a page of results starting after the cursor provided. If not supplied, this endpoint will return the first page of results.
The number of items from the full list desired in the response. Maximum: 100
Required range:
1 <= x <= 100