curl --request GET \
--url https://api.fanvue.com/v1/chats/{userUuid}/messages \
--header 'Authorization: Bearer <token>' \
--header 'X-Fanvue-API-Version: <x-fanvue-api-version>'import requests
url = "https://api.fanvue.com/v1/chats/{userUuid}/messages"
headers = {
"X-Fanvue-API-Version": "<x-fanvue-api-version>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'X-Fanvue-API-Version': '<x-fanvue-api-version>',
Authorization: 'Bearer <token>'
}
};
fetch('https://api.fanvue.com/v1/chats/{userUuid}/messages', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": [
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"text": "Hey there! How are you doing?",
"gif": null,
"sentAt": "2024-01-10T12:00:00.000Z",
"sender": {
"uuid": "550e8400-e29b-41d4-a716-446655440001",
"handle": "sarah"
},
"recipient": {
"uuid": "550e8400-e29b-41d4-a716-446655440002",
"handle": "johnny"
},
"type": "TEXT",
"status": "SENT",
"isRead": true,
"isSubscribed": true,
"isFollowing": false,
"followForFreeEnabled": false,
"repliedMessage": null,
"sentByUserId": null,
"appUuid": "f6a7b8c9-0123-4567-89ab-cdef01234567"
},
{
"uuid": "660e8400-e29b-41d4-a716-446655440001",
"text": "I'm doing great! Thanks for asking.",
"gif": null,
"sentAt": "2024-01-10T11:59:00.000Z",
"sender": {
"uuid": "550e8400-e29b-41d4-a716-446655440002",
"handle": "johnny"
},
"recipient": {
"uuid": "550e8400-e29b-41d4-a716-446655440001",
"handle": "sarah"
},
"type": "TEXT",
"status": "SENT",
"isRead": true,
"isSubscribed": true,
"isFollowing": false,
"followForFreeEnabled": false,
"repliedMessage": null,
"sentByUserId": null,
"appUuid": null
},
{
"uuid": "770e8400-e29b-41d4-a716-446655440002",
"text": null,
"gif": {
"id": "excited-happy-dance-xY7bQ",
"format": "WEBP",
"title": "excited happy dance",
"url": "https://cdn.klipy.com/excited-happy-dance-xY7bQ/md.webp",
"width": 480,
"height": 360
},
"sentAt": "2024-01-10T11:58:00.000Z",
"sender": {
"uuid": "550e8400-e29b-41d4-a716-446655440002",
"handle": "johnny"
},
"recipient": {
"uuid": "550e8400-e29b-41d4-a716-446655440001",
"handle": "sarah"
},
"type": "TEXT",
"status": "SENT",
"isRead": true,
"isSubscribed": true,
"isFollowing": false,
"followForFreeEnabled": false,
"repliedMessage": null,
"sentByUserId": null,
"appUuid": null
}
],
"dateFilter": {
"sentBefore": "2024-01-10T12:00:00.000Z",
"receivedBefore": "2024-01-10T11:59:00.000Z"
}
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"message": "<string>"
}{
"error": "<string>",
"message": "<string>",
"nextVersion": "<string>"
}{
"error": "<string>"
}Get messages from a chat
Returns a date-based list of text messages between the authenticated user and the specified user. Messages are ordered by date (newest first).
The thread includes mass (broadcast) messages the creator sent that reached this user, interleaved with the 1:1 messages by publish date. POST /chats/messages/batch returns direct messages only, so the two endpoints return different messages for the same chat.
v1-experimental Breaking Change: Switched from offset-based pagination (page/size) to date-based pagination with separate filters for sent and received messages.
Pagination Flow:
- First request: No date filters needed, returns first 20 messages (or specified limit)
- Subsequent requests: Use the date filters from the previous response
- End of results: date filters will be
null
Partial Filters Supported: You can provide:
- Both
sentBeforeandreceivedBeforefor standard pagination - Only
sentBeforeto filter messages sent by the user - Only
receivedBeforeto filter messages received from the user - Neither filter for the first request
Date Filter Structure: The response contains two date filters:
{
// Date filter for messages sent by user (use for next request)
"sentBefore": "2024-01-10T12:00:00Z",
// Date filter for messages received by user (use for next request)
"receivedBefore": "2024-01-10T11:00:00Z"
}
Both filters can be null if messages only flow in one direction.
Polling for real-time updates? Use a webhook instead.
If you are calling this endpoint on a schedule to detect new activity, subscribe to the creator.message.received, creator.message.sent, creator.message.deleted, creator.message.reaction webhook events instead — you’ll get pushed updates in real time without polling. See the webhook documentation.
curl --request GET \
--url https://api.fanvue.com/v1/chats/{userUuid}/messages \
--header 'Authorization: Bearer <token>' \
--header 'X-Fanvue-API-Version: <x-fanvue-api-version>'import requests
url = "https://api.fanvue.com/v1/chats/{userUuid}/messages"
headers = {
"X-Fanvue-API-Version": "<x-fanvue-api-version>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'X-Fanvue-API-Version': '<x-fanvue-api-version>',
Authorization: 'Bearer <token>'
}
};
fetch('https://api.fanvue.com/v1/chats/{userUuid}/messages', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": [
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"text": "Hey there! How are you doing?",
"gif": null,
"sentAt": "2024-01-10T12:00:00.000Z",
"sender": {
"uuid": "550e8400-e29b-41d4-a716-446655440001",
"handle": "sarah"
},
"recipient": {
"uuid": "550e8400-e29b-41d4-a716-446655440002",
"handle": "johnny"
},
"type": "TEXT",
"status": "SENT",
"isRead": true,
"isSubscribed": true,
"isFollowing": false,
"followForFreeEnabled": false,
"repliedMessage": null,
"sentByUserId": null,
"appUuid": "f6a7b8c9-0123-4567-89ab-cdef01234567"
},
{
"uuid": "660e8400-e29b-41d4-a716-446655440001",
"text": "I'm doing great! Thanks for asking.",
"gif": null,
"sentAt": "2024-01-10T11:59:00.000Z",
"sender": {
"uuid": "550e8400-e29b-41d4-a716-446655440002",
"handle": "johnny"
},
"recipient": {
"uuid": "550e8400-e29b-41d4-a716-446655440001",
"handle": "sarah"
},
"type": "TEXT",
"status": "SENT",
"isRead": true,
"isSubscribed": true,
"isFollowing": false,
"followForFreeEnabled": false,
"repliedMessage": null,
"sentByUserId": null,
"appUuid": null
},
{
"uuid": "770e8400-e29b-41d4-a716-446655440002",
"text": null,
"gif": {
"id": "excited-happy-dance-xY7bQ",
"format": "WEBP",
"title": "excited happy dance",
"url": "https://cdn.klipy.com/excited-happy-dance-xY7bQ/md.webp",
"width": 480,
"height": 360
},
"sentAt": "2024-01-10T11:58:00.000Z",
"sender": {
"uuid": "550e8400-e29b-41d4-a716-446655440002",
"handle": "johnny"
},
"recipient": {
"uuid": "550e8400-e29b-41d4-a716-446655440001",
"handle": "sarah"
},
"type": "TEXT",
"status": "SENT",
"isRead": true,
"isSubscribed": true,
"isFollowing": false,
"followForFreeEnabled": false,
"repliedMessage": null,
"sentByUserId": null,
"appUuid": null
}
],
"dateFilter": {
"sentBefore": "2024-01-10T12:00:00.000Z",
"receivedBefore": "2024-01-10T11:59:00.000Z"
}
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"message": "<string>"
}{
"error": "<string>",
"message": "<string>",
"nextVersion": "<string>"
}{
"error": "<string>"
}read:chat— Read chat conversations, messages, and chat-related data. This includes viewing chat lists and message history.
Authorizations
OAuth 2.0 access token, presented as a JWT bearer token in the Authorization header. Obtain a token via the authorization-code flow; the scopes granted to the token determine which operations it may call.
Headers
API version to use for the request
"2025-06-26"
Path Parameters
Query Parameters
Fetch messages sent before this date
Fetch messages received before this date
Number of messages to return (1-50, default: 20)
1 <= x <= 50Whether to mark the chat as read after retrieving messages
true, false Was this page helpful?