Messages
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 objectsprofileId— integerreactionType— integer (1is "🔥")
type— string, see Message typebody— object with Message contentsreplyToMessage— unknown ornulldynamic— boolean, unknown purpose, WIPchat1Type— string, see Message typereplyPreview— unknown ornull
Message type
"Album""AlbumContentReaction""AlbumContentReply""Audio""ExpiringAlbum""ExpiringAlbumV2""ExpiringImage""Video""Gaymoji""Generative""Giphy""Image""Location""PrivateVideo""ProfileLink""ProfilePhotoReply""Retract""Text""Unknown""NonExpiringVideo""VideoCall"
There also appears to be a related chat1Type, could be legacy type.
Possible values:
"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"
Message contents
Payload in body based on message's type, might be null for unsent messages.
"Album"
- everything from AlbumPreview
- everything from AlbumExpiration
coverUrl— AlbumCoverUrlownerProfileId— number ornullif album has expired or was lockedisViewable— booleanhasVideo— booleanhasPhoto— booleanviewableUntil— number ornull
"ExpiringAlbum"
- everything from "Album" message type
"ExpiringAlbumV2"
For AlbumExpirationType = ONCE but might have other values if expiration settings were changed later.
- everything from "ExpiringAlbum" message type
"AlbumContentReaction"
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
"AlbumContentReply"
- everything from "AlbumContentReaction" message type
albumContentReply— stringcontentType— string ornullif album has expired or was locked
"Audio"
mediaId— numbermediaHash— string 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
"Video"
mediaId— number ornullurl— string ornullfileCacheKey— stringcontentType— string ornulllength— numbermaxViews— integer ornulllooping— boolean ornull
Additionally, for expiring videos:
viewsRemaining— integer, capped at2147483647for "unlimited" views
"PrivateVideo"
- everything from "Video" message type
viewCount— integer
"NonExpiringVideo"
Unknown, WIP
"Gaymoji"
imageHash— string
"Generative"
Unknown, WIP
"Giphy"
URLs point at https://media0.giphy.com
id— stringurlPath— string, full URL to gif filestillPath— string, single frame, URL to gif filepreviewPath— stringwidth— integerheight— integerimageHash— string
"Image"
mediaId— numberurl— stringwidth— integer ornullheight— integer ornullimageHash— string
Additionally, only for regular images:
takenOnGrindr— boolean ornullcreatedAt— number ornull
"ChatImage"
mediaId— numberurl— stringexpiresAt— unix timestamp in millisecondstakenOnGrindr— booleancreatedTs— number
"ExpiringImage"
- everything from "Image" message type
viewsRemaining— number ornull
"Location"
lat— numberlon— number
"ProfileLink"
Unknown, WIP
"ProfilePhotoReply"
Unknown, WIP
imageHash— stringphotoContentReply— string
"Retract"
Unknown, WIP
targetMessageId— string
"Text"
text— string
"VideoCall"
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
"Unknown"
Empty type
Get messages in a conversation
Requires Authorization.
Invoking this endpoint does not mark messages as read.
GET /v5/chat/conversation/{conversationId}/messageQuery (optional):
pageKey— optional, return messages with IDs before specified valueprofile— boolean (profile=true|profile=+ any other value), optional
Response:
lastReadTimestamp— unix timestamp in millisecondsmessages— array of Messagemetadata— nested objecttranslate— booleanhasSharedAlbums— booleanisInAList— boolean
profile— object ifprofilequery parameter is set totrueornullprofileId— long integername— string, may be emptymediaHash— string ornull, see MediaonlineUntil— unknown ornulldistance— float ornullshowDistance— boolean
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.
See also: Send a message to a conversation via WS
POST /v4/chat/message/sendBody:
type— string, see Message typetarget— nested objecttype—Direct,Group,HumanWingmantargetId— integer
body— object with Message contents ornull
Additional body fields for websocket only:
replyToMessageId— string ornull, optional
When replyToMessageId is used in HTTP API appears to cause 400 Bad Request error.
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— stringmessageId— 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— stringmessageId— string
Response:
Empty.
Errors:
- 500 Internal Error if conversation or message was not found
Send typing indicator
Requires Authorization.
WIP, does not seem to work.
POST /v4/chatstatus/typingBody:
conversationId— stringstatus— 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— stringmessageId— stringreactionType— integer, (1is "🔥")
Response:
Empty.
Errors:
- 500 Internal Error if conversation or message was not found