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).
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?