Profiles
Profile tags
Requires Authorization.
GET /v1/tagsResponse:
Array of ProfileTagLanguage.
Get a profile by ID
Requires Authorization.
Fetch a single profile by ID. When id is your own profile, the response carries no self-presence: both onlineUntil and seen are returned as null. Treat the authenticated user as online instead of rendering them as offline.
GET /v7/profiles/{id}Response:
profiles— array of Profile
Get multiple profiles by ID
Requires Authorization.
POST /v3/profilesBody:
targetProfileIds— array of strings with numeric ids, max profiles number per one request is 150
Response:
profiles— array of ProfileSummaryWithRightNow
Update own profile (full)
Requires Authorization.
ProfileFullUpdate object, fully replaces the current version. This is the only endpoint that persists the free-text fields displayName and aboutMe; the partial Update own profile (partial) endpoint ignores them.
Because the profile is replaced fully, every editable field must be sent on each request, including fields not exposed in the edit UI such as approximateDistance and profileTags.
displayName and aboutMe (plus custom gender/pronoun display text) are run through banned-terms moderation. A clean update answers 200 with an empty body. If a moderated field contains banned terms the request fails with a 400 BannedTermsResponse naming the offending fields; the update is rejected wholesale, so none of the submitted fields — not even the clean ones — are persisted. Only a 200 should be treated as success.
PUT /v3.1/me/profileBody:
displayName— string, moderated free-text; persisted here (unlike PATCH) ornullaboutMe— string, moderated free-text; persisted here (unlike PATCH) ornullage— integer, server-derived from birth date; echoed back on a full replaceshowAge— booleanshowDistance— booleanshowPosition— booleanshowTribes— booleanapproximateDistance— booleannsfw— Accept NSFW picsbodyType— Body typeethnicity— EthnicityhivStatus— HIV statuslastTestedDate— unix timestamp in millisecondsrelationshipStatus— Relationship statussexualPosition— Sexual position IDheight— number in centimetersweight— number in gramsgenders— array of gender IDs, see Get genders, max. length: 3. ornullpronouns— array of pronoun IDs, see Get pronouns, max. length: 3. ornullgrindrTribes— array of Tribes ornulltribesImInto— array of Tribes ornulllookingFor— array of Looking for ornullmeetAt— array of Meet at ornullvaccines— array of Vaccines ornullsexualHealth— array of Sexual health ornullprofileTags— array of Profile tags ornullsocialNetworks— object, Each network carries only{ userId }on write (nosite, unlike the read-side SocialNetwork). ornulltwitter— objectuserId— string ornull
facebook— objectuserId— string ornull
instagram— objectuserId— string ornull
Response:
The update was accepted. The response body is empty.
Errors:
400— A moderated free-text field contained banned terms. The body is a BannedTermsResponse (type=urn:gr:err:hit_banned_terms) naming the offending fields and their terms. The whole update is rejected — no field is persisted.
Get own profile
Requires Authorization.
Returns the authenticated user's own profile in the same single-element profiles envelope as Get a profile by ID, without taking an ID.
The official Android app does not use this endpoint.
GET /v4/me/profileResponse:
profiles— array of ProfileSummaryWithRightNow
Update own profile (partial)
Requires Authorization.
ProfilePatch object, only updates the specified keys. Applies structured fields only (e.g. genders, pronouns, grindrTribes, tribesImInto, profileTags, sexualPosition, and the showAge/showDistance/showPosition/showTribes flags).
The free-text fields displayName and aboutMe are silently ignored here even though ProfilePatch includes them — they are only persisted (and moderated) by Update own profile (full).
PATCH /v4/me/profileBody:
aboutMe— string, Silently ignored by PATCH, write using Update own profile (full). ornullnsfw— Accept NSFW pics ornullbodyType— Body type ornulldisplayName— string, Silently ignored by PATCH, write using Update own profile (full). ornullethnicity— Ethnicity ornullgenders— array of gender IDs, see Get genders, max. length: 3. As of June 22, 2026, submitting gender ID62("Ask me") in filters causes a500 Internal Server Error, no error for profile edit endpoint. ornullheight— number in cm ornullhivStatus— HIV status ornulllastTestedDate— unix timestamp in milliseconds ornulllookingFor— array of Looking for ornullmeetAt— array of Meet at ornullgrindrTribes— array of Tribes ornullprofileTags— array of Profile tags ornullpronouns— array of pronoun IDs, see Get pronouns, max. length: 3. ornullrelationshipStatus— Relationship status ornullsexualHealth— array of Sexual health ornullsexualPosition— Sexual position ID ornullshowAge— boolean ornullshowDistance— boolean ornullshowPosition— boolean ornullshowTribes— boolean ornullsocialNetworks— object, Each network carries only{ userId }on write (nosite, unlike the read-side SocialNetwork). Any network key may be omitted. ornulltwitter— objectuserId— string ornull
facebook— objectuserId— string ornull
instagram— objectuserId— string ornull
tribesImInto— array of Tribes ornullvaccines— array of Vaccines ornullweight— number in grams ornull
Profile tags suggestions, WIP
NOTE
This endpoint hasn't been researched yet
PUT /v4/profile-tags/suggestionsProfile tags translations, WIP
NOTE
This endpoint hasn't been researched yet
GET /v5/profile-tags/translationsHeaders:
L-Locale— string
Upload media (legacy)
Requires Authorization.
You must ensure thumbCoords's width and height dimensions are equal, i.e. y2-y1 must equal x2-x1. Submitting a non-square thumbnail won't trigger any errors and it will be uploaded to the CDN, however attempting to use such illegal thumbnail dimensions image in Edit profile photos will result in it being silently dropped/skipped.
Also there is a legacy POST /v3/me/profile/images.
POST /v4/media/uploadQuery:
thumbCoords— RectFtakenOnGrindr— boolean, Media captured with the in-app camera. The official client uses a signed upload endpoint only when this istrueand thetaken-on-grindr-signing-enabledflag is on.
Body:
Binary file.
Response:
hash— stringimageSizes— array of objectssize— integer ornullfullUrl— stringthumbnail— boolean ornullstate— stringmediaHash— string, See Media -> Public CDN files -> Profile ImagesrejectionReason— string ornull
mediaId— integer
Edit profile photos
Requires Authorization.
Setting both primaryImageHash and secondaryImageHashes to null works. But setting primaryImageHash to a hash value while setting secondaryImageHashes to null causes HTTP status 400 Bad Request error. It's recommended to just use [] for secondaryImageHashes rather than null.
Supplied images must have square thumbnails, otherwise they will be silently skipped. See Upload media (legacy).
Repeating primaryImageHash value in secondaryImageHashes array will result in secondaryImageHashes's entry being silently dropped from supplied request array. Repeating secondaryImageHashes values will result in successfully saving the array as-is to the server, however the official mobile client seems to drop repeating media when processing secondaryImageHashes response.
PUT /v3/me/profile/imagesBody:
primaryImageHash— string ornullsecondaryImageHashes— array of strings, max. length: 5 ornull
Response:
Empty.
Delete profile photos
Requires Authorization.
This endpoint removes the photo from your profile as well as deletes the media from the CDN.
DELETE /v3/me/profile/imagesBody (yes, body, not query):
media_hashes— array of strings
Response:
Empty.
Get my profile photos
Requires Authorization.
GET /v3.1/me/profile/imagesQuery:
selected— boolean
Response:
medias— array of ProfileImageState
Check if profiles are reachable, WIP
NOTE
This endpoint hasn't been researched yet
Requires Authorization.
POST /v4/profiles/reachableBody:
profileIds— array of strings with numeric ids
Response:
profileIds— array of strings with numeric ids
Get profile insights v1, WIP
NOTE
This endpoint hasn't been researched yet
GET /v1/profile-insights/{profileId}Get profile insights v2, WIP
NOTE
This endpoint hasn't been researched yet
GET /v2/profile-insights/{profileId}Get pronouns
Requires Authorization.
Gender and pronouns are managed fields — profile fields that aren't hardcoded but pulled dynamically from the server.
GET /v1/pronounsResponse:
Array of Pronoun.
Get genders
GET /public/v2/gendersResponse:
Array of Gender.
Get genders (v1 alias)
GET /public/v1/gendersResponse:
Array of Gender.
Suggest gender or pronoun
Requires Authorization.
PUT /v4/genderpronoun/suggestionsBody:
category— string, eithergenderorpronounsuggestedValue— string
Response:
Empty
Upload media (signed)
Requires Authorization.
Signed successor of Upload media (legacy). The request must carry a valid device-key signature over the raw request body; see Security headers -> Device-key upload signing. thumbCoords follows the same square-thumbnail rule as the legacy endpoint.
POST /v5/media/uploadQuery:
thumbCoords— RectFtakenOnGrindr— boolean, Media captured with the in-app camera. The official client uses a signed upload endpoint only when this istrueand thetaken-on-grindr-signing-enabledflag is on.
Headers:
X-Key-Id— base64url (no padding)SHA-256of the device key SPKI — thekeyIdfrom Register device key.X-Sig— base64url (no padding) DER ECDSA-P256-SHA256 signature over the UTF-8 stringbodyHash|timestamp|userId|androidId|nonce. See Security headers -> Device-key upload signing.X-Timestamp— Signing time as Unix epoch milliseconds (decimal string); must equal thetimestampinside the signed string.X-Nonce— base64url (no padding) of 32 random bytes, unique per request; must equal thenonceinside the signed string.
Body:
Binary file.
Response:
hash— stringimageSizes— array of objectsmediaHash— string, See Media -> Public CDN files -> Profile ImagesfullUrl— URLstate— string, Moderation state;nulluntil reviewed.thumbnail— booleansize— Pixel size of the longest edge.
Errors:
4xx— Signature rejected. Body is anUploadSigningErrorResponsewhosetypecontainstimestamp_drift(withdetail= server time as ISO-8601; resync and retry) ornonce_replayed(retry with a fresh nonce).
Get profile insights v3, WIP
NOTE
This endpoint hasn't been researched yet
Requires Authorization.
Response type: ProfileInsightsResponse (undocumented).
GET /v3/profile-insights/{profileId}Get own profile insight settings
Requires Authorization.
GET /v3/profile-insights/me/settingsResponse:
status— ProfileInsightsStatussettings— array of UndocumentedObject
RectF
Array of 4 floats or nulls: Bottom edge ("y2") in pixels, Left edge ("x1") in pixels, Right edge ("x2") in pixels, Top edge ("y1") in pixels. When used in query, stringified as follows: y2,x1,x2,y1.
ProfileMaskedMin
Minimal masked profile.
distance— number ornullprofileImageMediaHash— string, See Media -> Public CDN files -> Profile Images ornullisFavorite— boolean
ProfileMasked
Masked profile (extra fields revealed).
- everything from ProfileMaskedMin
lastViewed— number ornullseen— unix timestamp in milliseconds ornullrightNow— RightNowStatussexualPosition— Sexual position ID ornull, optionalfoundVia— ViewSourceEnum ornull, optional
ProfileMin
Minimal profile fields.
profileId— string with numeric iddisplayName— string ornullonlineUntil— unix timestamp in milliseconds ornull, optional
ProfileMedia
mediaHash— string, See Media -> Public CDN files -> Profile Imagestype— integerstate— integerreason— string ornulltakenOnGrindr— boolean ornullcreatedAt— unix timestamp in milliseconds ornull
ProfileShort
Short profile, combines ProfileMasked and ProfileMin.
- everything from ProfileMasked
- everything from ProfileMin
age— integer, may be0ornullshowAge— booleanshowDistance— booleanapproximateDistance— booleanlastChatTimestamp— number, may be0ornullisNew— booleanlastUpdatedTime— unix timestamp in milliseconds, may be0medias— array of ProfileMedia
ProfileFields
Optional profile fields.
meetAt— array of Meet at, optionalvaccines— array of Vaccines, optionalgenders— array of gender IDs, see Get genders. As of June 22, 2026, submitting gender ID62("Ask me") causes a500 Internal Server Error., optionalpronouns— array of integers, optional
ProfileRightNow
Right Now status info on a profile.
rightNowText— string ornullrightNowPosted— unix timestamp in milliseconds ornullrightNowDistance— long integer ornullrightNowThumbnailUrl— string ornullrightNowFullImageUrl— string ornull
ProfileExtraFields
Extra profile fields.
nsfw— Accept NSFW pics ornullverifiedInstagramId— string ornullisBlockable— boolean ornullshowTribes— booleanshowPosition— boolean
TravelPlanEmbedded
endDate— unix timestamp in milliseconds ornullgeohash— GeohashtravelPlanId— long integer ornulllocationName— stringshowOnProfile— boolean ornullstartDate— unix timestamp in milliseconds ornull
RightNowMedia
mediaId— long integerthumbnailUrl— stringfullImageUrl— stringcontentType— stringisNsfw— boolean
Profile
Full profile object.
- everything from ProfileShort
- everything from ProfileFields
- everything from ProfileRightNow
- everything from ProfileExtraFields
aboutMe— string ornullcreated— long integer, profile creation timestamp; unit (ms vs s) unverified, optionalshowUnlockReward— boolean, optionalethnicity— Ethnicity ornullrelationshipStatus— Relationship status ornullgrindrTribes— array of TribeslookingFor— array of Looking forbodyType— Body type ornullhivStatus— HIV status ornulllastTestedDate— unix timestamp in milliseconds ornullheight— number in centimeters ornullweight— number in grams ornullsocialNetworks— objecttwitter— SocialNetwork, may be absentfacebook— SocialNetwork, may be absentinstagram— SocialNetwork, may be absent
identity— object, Legacy self-identification container, superseded by thepronounsID array. Read-only: it is returned on read but ignored by every profile-update endpoint (the official app never sends it). ornullpronouns— object ornullpronounsDisplay— string, free-text pronoun label shown next to the display name, e.g.he/himornullpronounsCategory— integer, pronoun category ID; value set is undocumented
hashtags— array of stringsprofileTags— array of Profile tagstapped— booleantapType— Tap ID ornulllastReceivedTapTimestamp— unix timestamp in milliseconds ornullisTeleporting— booleanisRoaming— booleanarrivalDays— number ornullunreadCount— number, optionallastThrobTimestamp— long integer, legacy timestamp, present in the API response but testing shows onlynull, units unverifiedsexualHealth— array of Sexual healthisVisiting— booleantravelPlans— array of TravelPlanEmbeddedisInAList— booleantribesImInto— array of TribesshowVipBadge— booleanrightNowShareLocation— RightNowShareLocation ornullrightNowMedias— array of RightNowMedia
ProfilePatch
Partial profile update body for PATCH /v4/me/profile. Every key is optional; only the keys present in the request are updated (omit a key to leave it unchanged, do not send null to clear, send an empty array or the field's cleared value). Structured fields only. displayName and aboutMe are accepted by the schema but silently ignored by this endpoint — write them using Update own profile (full).
aboutMe— string, Silently ignored by PATCH, write using Update own profile (full). ornull, optionalnsfw— Accept NSFW pics ornull, optionalbodyType— Body type ornull, optionaldisplayName— string, Silently ignored by PATCH, write using Update own profile (full). ornull, optionalethnicity— Ethnicity ornull, optionalgenders— array of gender IDs, see Get genders, max. length: 3. As of June 22, 2026, submitting gender ID62("Ask me") in filters causes a500 Internal Server Error, no error for profile edit endpoint. ornull, optionalheight— number in cm ornull, optionalhivStatus— HIV status ornull, optionallastTestedDate— unix timestamp in milliseconds ornull, optionallookingFor— array of Looking for ornull, optionalmeetAt— array of Meet at ornull, optionalgrindrTribes— array of Tribes ornull, optionalprofileTags— array of Profile tags ornull, optionalpronouns— array of pronoun IDs, see Get pronouns, max. length: 3. ornull, optionalrelationshipStatus— Relationship status ornull, optionalsexualHealth— array of Sexual health ornull, optionalsexualPosition— Sexual position ID ornull, optionalshowAge— boolean ornull, optionalshowDistance— boolean ornull, optionalshowPosition— boolean ornull, optionalshowTribes— boolean ornull, optionalsocialNetworks— object, Each network carries only{ userId }on write (nosite, unlike the read-side SocialNetwork). Any network key may be omitted. ornull, optionaltwitter— objectuserId— string ornull
facebook— objectuserId— string ornull
instagram— objectuserId— string ornull
tribesImInto— array of Tribes ornull, optionalvaccines— array of Vaccines ornull, optionalweight— number in grams ornull, optional
ProfileFullUpdate
Full profile replacement body for PUT /v3.1/me/profile. Unlike ProfilePatch, this is a full replace: every editable field is sent on each request, and the enum scalars and show* flags are non-nullable. This is the only endpoint that persists displayName and aboutMe, both of which are moderated.
displayName— string, moderated free-text; persisted here (unlike PATCH) ornull, optionalaboutMe— string, moderated free-text; persisted here (unlike PATCH) ornull, optionalage— integer, server-derived from birth date; echoed back on a full replaceshowAge— booleanshowDistance— booleanshowPosition— booleanshowTribes— booleanapproximateDistance— booleannsfw— Accept NSFW picsbodyType— Body typeethnicity— EthnicityhivStatus— HIV statuslastTestedDate— unix timestamp in millisecondsrelationshipStatus— Relationship statussexualPosition— Sexual position IDheight— number in centimetersweight— number in gramsgenders— array of gender IDs, see Get genders, max. length: 3. ornull, optionalpronouns— array of pronoun IDs, see Get pronouns, max. length: 3. ornull, optionalgrindrTribes— array of Tribes ornull, optionaltribesImInto— array of Tribes ornull, optionallookingFor— array of Looking for ornull, optionalmeetAt— array of Meet at ornull, optionalvaccines— array of Vaccines ornull, optionalsexualHealth— array of Sexual health ornull, optionalprofileTags— array of Profile tags ornull, optionalsocialNetworks— object, Each network carries only{ userId }on write (nosite, unlike the read-side SocialNetwork). ornull, optionaltwitter— objectuserId— string ornull
facebook— objectuserId— string ornull
instagram— objectuserId— string ornull
BannedTerms
terms— array of strings, The banned terms that were detected in the submitted text.
BannedTermsResponse
Body of the 400 returned by Update own profile (full) when a moderated free-text field contained banned terms. Each present field key is a field that was rejected. The whole update is rejected — no field is persisted. A fully-accepted update instead answers 200 with an empty body.
type— string, Error type URN.urn:gr:err:hit_banned_termsfor this response., optionaltitle— string, optionalstatus— integer, optionaltraceId— string, optionaldisplay_name— BannedTerms, Present whendisplayNamewas rejected. ornull, optionalabout_me— BannedTerms, Present whenaboutMewas rejected. ornull, optionalgender_display— BannedTerms, Present when the custom gender display text was rejected. ornull, optionalpronouns_display— BannedTerms, Present when the custom pronoun display text was rejected. ornull, optional
ProfileSummaryWithRightNow
- everything from ProfileShort
- everything from ProfileRightNow
rightNowStatus— RightNowAttributionStatus, Right Now attribution status. Added in app 26.11.0 under keyrightNowStatus(distinct fromrightNow). ornull, optional
SocialNetwork
Social network user reference.
userId— string, username ornullsite— string, e.g."twitter"|"facebook"|"instagram"
ProfileTagLanguage
language— stringcategoryCollection— array of objectstext— stringpossessiveText— string ornulltags— array of objectstagId— integertext— stringkey— string
LegacyMediaUploadResponse
hash— stringimageSizes— array of objectssize— integer ornullfullUrl— stringthumbnail— boolean ornullstate— stringmediaHash— string, See Media -> Public CDN files -> Profile ImagesrejectionReason— string ornull
mediaId— integer
EditProfilePhotosRequest
primaryImageHash— string ornullsecondaryImageHashes— array of strings, max. length: 5 ornull
DeleteProfilePhotosRequest
media_hashes— array of strings
ProfileImageState
NOTE
This type hasn't been researched yet
Profile media state.
mediaHash— string, See Media -> Public CDN files -> Profile Imagestype— integerstate— integer
Pronoun
pronounId— integerpronoun— string, e.g."-"or"They/Them/Theirs"
Gender
genderId— integergender— stringdisplayGroup— integersortProfile— integer ornull, optionalsortFilter— integer ornull, optionalgenderPlural— string, plural form ofgenderornull, optionalexcludeOnProfileSelection— array of integers ornull, optionalexcludeOnFilterSelection— array of integers ornull, optionalalsoClassifiedAs— array of integers; not in the official app's model, optional
GenderPronounSuggestionRequest
category— string, eithergenderorpronounsuggestedValue— string
Sexual position ID
Sexual position ID.
1— Top2— Bottom3— Versatile4— Vers Bottom5— Vers Top6— Side
Ethnicity
Ethnicity.
1— Asian2— Black3— Latino4— Middle Eastern5— Mixed6— Native American7— White8— Other9— South Asian
Relationship status
Relationship status.
1— Single2— Dating3— Exclusive4— Committed5— Partnered6— Engaged7— Married8— Open Relationship
Body type
Body type.
1— Toned2— Average3— Large4— Muscular5— Slim6— Stocky
HIV status
HIV status. Not to be confused with Sexual health.
1— Negative2— Negative, on PrEP3— Positive4— Positive, undetectable
Accept NSFW pics
Accept NSFW pics.
1— Never2— Not At First3— Yes Please
Meet at
Meet at preferences.
1— My Place2— Your Place3— Bar4— Coffee Shop5— Restaurant
Sexual health
Sexual health (also "Health Practices"). Not to be confused with HIV status. The app also defines Sober (6) and Drug free (7) via UpdatedHealthStatus, gated behind the updated-sexual-health feature flag; as of the latest app/API version neither is accepted by the sexualHealth filter nor rendered, so they are omitted here and may be added in the future.
1— Condoms2— I'm on doxyPEP3— I'm on PrEP4— I'm HIV undetectable5— Prefer to discuss
Looking for
Looking for.
2— Chat3— Dates4— Friends5— Networking6— Relationship7— Hookups
Tribes
Tribe.
1— Bear2— Clean-Cut3— Daddy4— Discreet5— Geek6— Jock7— Leather8— Otter9— Poz10— Rugged11— Trans12— Twink13— Sober
Vaccines
Vaccine.
1— COVID-192— Monkeypox3— Meningitis
UploadProfileImageResponse
hash— stringimageSizes— array of objectsmediaHash— string, See Media -> Public CDN files -> Profile ImagesfullUrl— URLstate— string, Moderation state;nulluntil reviewed.thumbnail— booleansize— Pixel size of the longest edge.
ProfileInsightsStatus
"UNLOCKED""HIDDEN""UPSELL_MAX""UPSELL_PREMIUM""OPT_OUT_SELF""OPT_OUT_TARGET""FREEMIUM"
ProfileInsightsInferencesResponse
status— ProfileInsightsStatussettings— array of UndocumentedObject