Messages
Get messages in a conversation
Requires Authorization.
Invoking this endpoint does not mark messages as read.
GET /v5/chat/conversation/{conversationId}/messageQuery (optional):
pageKey— string, optional, return messages with IDs before specified value, optionalprofile— boolean (profile=true|profile=+ any other value), optional
Response:
lastReadTimestamp— unix timestamp of recipient's side in milliseconds ornull; is not affected by yours calls to mark messages as readmessages— array of Messagemetadata— objecttranslate— booleanhasSharedAlbums— booleanisInAList— boolean
profile— object ifprofilequery parameter is set totrueornull
Get a single message in a conversation
Requires Authorization.
GET /v4/chat/conversation/{conversationId}/message/{messageId}Response:
message— Message
Send a message to a conversation
Requires Authorization.
Please don't use this for spam. Be civil.
When replyToMessageId is used in HTTP API appears to cause 400 Bad Request error.
See also: Send a message to a conversation via ws
POST /v4/chat/message/sendBody:
type— Message typetarget— MessageTargetbody— object with Message contents ornullreplyToMessageId— string ornull
Response:
HTTP status 201. Message object.
Unsend a message
Requires Authorization.
Turns a message in chat into "This message was unsent."
Repeated requests are completed without errors.
POST /v4/chat/message/unsendBody:
conversationId— Conversation IDmessageId— string, must be sent by you
Response:
Empty.
Errors:
500— Internal Error if conversation or message was not found or if it wasn't sent by you
Delete a message
Requires Authorization.
Deletes a message on your side. Does not delete message for other chat participant.
Repeated requests are completed without errors.
POST /v4/chat/message/deleteBody:
conversationId— Conversation IDmessageId— string, must be sent by you
Response:
Empty.
Errors:
500— Internal Error if conversation or message was not found
Send typing indicator, WIP
This endpoint hasn't been researched yet
Requires Authorization.
WIP, does not seem to work.
POST /v4/chatstatus/typingBody:
conversationId— Conversation IDstatus— string, either"Typing"or"Cleared"
Response:
Empty.
Errors:
403— Action not permitted if conversation not found
React to a message
Requires Authorization.
There is no discovered way to undo the reaction as of yet.
Repeated requests are completed without errors.
POST /v4/chat/message/reactionBody:
conversationId— Conversation IDmessageId— stringreactionType— integer, (1is "🔥")
Response:
Empty.
Errors:
500— Internal Error if conversation or message was not found
MessageReaction
profileId— integerreactionType— integer, (1is "🔥")
Message type
Message type discriminator. There also appears to be a related chat1Type, could be legacy type.
"Album""AlbumContentReaction""AlbumContentReply""Audio""ExpiringAlbum""ExpiringAlbumV2""ExpiringImage""Video""Gaymoji""Generative""Giphy""Image""Location""PrivateVideo""ProfileLink""ProfilePhotoReply""Retract""Text""Unknown""NonExpiringVideo""VideoCall"
Chat1MessageType
Legacy message type.
"map""image""expiring_album""expiring_image""private_video""expiring_video""gaymoji""giphy""audio""video_call""video_call_v3""audio_call""text""unknown""retracted""retracted_location""album_share""album_react""album_content_reaction""album_content_reply"
AlbumMessageBody
Body for "Album" message type. Includes everything from AlbumPreview and AlbumExpiration.
- everything from AlbumPreview
- everything from AlbumExpiration
coverUrl— string ornullownerProfileId— number ornullif album has expired or was lockedisViewable— booleanhasVideo— booleanhasPhoto— booleanviewableUntil— number ornull
AlbumContentReactionBody
Body for "AlbumContentReaction" message type. Implies "🔥" reaction as there does not appear to be any choice.
albumId— integerownerProfileId— integer ornullif album has expired or was lockedalbumContentId— integerpreviewUrl— string ornullif album has expired or was locked, see Signed CDN files -> Chat mediaexpiresAt— unix timestamp in milliseconds ornullviewable— boolean
AlbumContentReplyBody
Body for "AlbumContentReply" message type. Extends AlbumContentReaction.
- everything from AlbumContentReactionBody
albumContentReply— stringcontentType— string ornullif album has expired or was locked
AudioMessageBody
Body for "Audio" message type.
mediaId— numbermediaHash— string, See Media ornullurl— string, see Signed CDN files -> Chat mediacontentType— string, e.g.audio/aaclength— number in milliseconds (1/1000th of a second) ornullexpiresAt— unix timestamp in milliseconds, 15 minutes
VideoMessageBody
Body for "Video" message type. Additionally, for expiring videos viewsRemaining is set; capped at 2147483647 for "unlimited" views.
mediaId— number ornullurl— string ornullfileCacheKey— stringcontentType— string ornulllength— numbermaxViews— integer ornulllooping— boolean ornullviewsRemaining— integer
PrivateVideoBody
Body for "PrivateVideo" message type. Extends Video.
- everything from VideoMessageBody
viewCount— integer
GaymojiBody
Body for "Gaymoji" message type.
imageHash— string
GiphyBody
Body for "Giphy" message type. URLs point at https://media0.giphy.com.
id— stringurlPath— full URL to gif filestillPath— single frame, URL to gif filepreviewPath— stringwidth— integerheight— integerimageHash— string
ImageMessageBody
Body for "Image" message type. Additional fields are present only for regular (non-expiring) images.
mediaId— numberwidth— integer ornullheight— integer ornullurl— stringimageHash— stringtakenOnGrindr— boolean ornullcreatedAt— unix timestamp in milliseconds ornull
ChatImageBody
"ChatImage" message body.
mediaId— numberurl— stringexpiresAt— unix timestamp in millisecondstakenOnGrindr— booleancreatedTs— unix timestamp in milliseconds
ExpiringImageBody
Body for "ExpiringImage" message type. Extends Image but with url set to null and additional viewsRemaining.
To get a single-use expiring image URL, you need to call Get a single message in a conversation. After one call, url in message body will be replaced with null and image will no longer be viewable.
- everything from ImageMessageBody
url— string ornullviewsRemaining— number ornull
LocationMessageBody
Body for "Location" message type.
lat— numberlon— number
ProfilePhotoReplyBody
Body for "ProfilePhotoReply" message type. Unknown, WIP.
imageHash— stringphotoContentReply— string
RetractMessageBody
Body for "Retract" message type. Unknown, WIP.
targetMessageId— string
TextMessageBody
Body for "Text" message type.
text— string
VideoCallMessageBody
Body for "VideoCall" message type. WIP. Only for "status" messages.
result— string ornull, appears to have the following values:SUCCESSFUL,Duration:,Busy,BUSY,Cancelled,Declined,DECLINED,Missed,AB_Unsupported,No_Answer,UNANSWERED,Lite_UnsupportvideoCallDuration— number ornull
UnknownMessageBody
Empty type.
Message contents
- AlbumMessageBody
- AlbumContentReactionBody
- AlbumContentReplyBody
- AudioMessageBody
- VideoMessageBody
- PrivateVideoBody
- GaymojiBody
- GiphyBody
- ImageMessageBody
- ChatImageBody
- ExpiringImageBody
- LocationMessageBody
- ProfilePhotoReplyBody
- RetractMessageBody
- TextMessageBody
- VideoCallMessageBody
- UnknownMessageBody
- ExpiringAlbumBody
- ExpiringAlbumV2Body
- NonExpiringVideoBody
- GenerativeBody
- ProfileLinkBody
Message
messageId— string, appears to be a unix timestamp in milliseconds and UUIDv4 separated by:, e.g."1774296692000:843daee8-1e93-47d6-bc7f-3d981925a393"conversationId— string, see ConversationsenderId— numbertimestamp— unix timestamp in milliseconds, appears to be same as inmessageIdunsent— boolean, if this is true,bodyis set tonullreactions— array of MessageReactiontype— string, see Message typebody— object with Message contents ornullreplyToMessage— unknown, unknown ornulldynamic— boolean, unknown purpose, WIPchat1Type— string, see Message typereplyPreview— unknown, unknown ornull
ConversationMessagesResponse
lastReadTimestamp— unix timestamp of recipient's side in milliseconds ornull; is not affected by yours calls to mark messages as readmessages— array of Messagemetadata— objecttranslate— booleanhasSharedAlbums— booleanisInAList— boolean
profile— object ifprofilequery parameter is set totrueornull
MessageTarget
type— string,Direct,Group,HumanWingmantargetId— integer
SendMessageRequest
type— Message typetarget— MessageTargetbody— object with Message contents ornullreplyToMessageId— string ornull
MessageMutationRequest
conversationId— Conversation IDmessageId— string, must be sent by you
TypingIndicatorRequest
conversationId— Conversation IDstatus— string, either"Typing"or"Cleared"
MessageReactionRequest
conversationId— Conversation IDmessageId— stringreactionType— integer, (1is "🔥")
ExpiringAlbumBody
Body for "ExpiringAlbum" message type. Extends Album.
- everything from AlbumMessageBody
ExpiringAlbumV2Body
Body for "ExpiringAlbumV2" message type. For AlbumExpirationType = ONCE but might have other values if expiration settings were changed later. Extends ExpiringAlbum.
- everything from ExpiringAlbumBody
NonExpiringVideoBody
This type hasn't been researched yet
Body for "NonExpiringVideo" message type. Unknown, WIP.
GenerativeBody
This type hasn't been researched yet
Body for "Generative" message type. Unknown, WIP.
ProfileLinkBody
This type hasn't been researched yet
Body for "ProfileLink" message type. Unknown, WIP.