Skip to content

Profiles ​

Profile tags ​

Requires Authorization.

GET /v1/tags

Response:

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:

Get multiple profiles by ID ​

Requires Authorization.

POST /v3/profiles

Body:

  • targetProfileIds — array of strings with numeric ids, max profiles number per one request is 150

Response:

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/profile

Body:

  • displayName — string, moderated free-text; persisted here (unlike PATCH) or null
  • aboutMe — string, moderated free-text; persisted here (unlike PATCH) or null
  • age — integer, server-derived from birth date; echoed back on a full replace
  • showAge — boolean
  • showDistance — boolean
  • showPosition — boolean
  • showTribes — boolean
  • approximateDistance — boolean
  • showOnMap — boolean, whether the profile is shown on the map, optional
  • nsfw — Accept NSFW pics
  • bodyType — Body type
  • ethnicity — Ethnicity
  • hivStatus — HIV status
  • lastTestedDate — unix timestamp in milliseconds
  • relationshipStatus — Relationship status
  • sexualPosition — Sexual position ID
  • height — number in centimeters
  • weight — number in grams
  • genders — array of gender IDs, see Get genders, max. length: 3. or null
  • pronouns — array of pronoun IDs, see Get pronouns, max. length: 3. or null
  • grindrTribes — array of Tribes or null
  • tribesImInto — array of Tribes or null
  • lookingFor — array of Looking for or null
  • meetAt — array of Meet at or null
  • vaccines — array of Vaccines or null
  • sexualHealth — array of Sexual health or null
  • profileTags — array of Profile tags or null
  • socialNetworks — object, Each network carries only { userId } on write (no site, unlike the read-side SocialNetwork). or null
    • twitter — object
      • userId — string or null
    • facebook — object
      • userId — string or null
    • instagram — object
      • userId — string or null

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/profile

Response:

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/profile

Body:

  • aboutMe — string, Silently ignored by PATCH, write using Update own profile (full). or null
  • nsfw — Accept NSFW pics or null
  • bodyType — Body type or null
  • displayName — string, Silently ignored by PATCH, write using Update own profile (full). or null
  • ethnicity — Ethnicity or null
  • genders — array of gender IDs, see Get genders, max. length: 3. As of June 22, 2026, submitting gender ID 62 ("Ask me") in filters causes a 500 Internal Server Error, no error for profile edit endpoint. or null
  • height — number in cm or null
  • hivStatus — HIV status or null
  • lastTestedDate — unix timestamp in milliseconds or null
  • lookingFor — array of Looking for or null
  • meetAt — array of Meet at or null
  • grindrTribes — array of Tribes or null
  • profileTags — array of Profile tags or null
  • pronouns — array of pronoun IDs, see Get pronouns, max. length: 3. or null
  • relationshipStatus — Relationship status or null
  • sexualHealth — array of Sexual health or null
  • sexualPosition — Sexual position ID or null
  • showAge — boolean or null
  • showDistance — boolean or null
  • showPosition — boolean or null
  • showTribes — boolean or null
  • socialNetworks — object, Each network carries only { userId } on write (no site, unlike the read-side SocialNetwork). Any network key may be omitted. or null
    • twitter — object
      • userId — string or null
    • facebook — object
      • userId — string or null
    • instagram — object
      • userId — string or null
  • tribesImInto — array of Tribes or null
  • vaccines — array of Vaccines or null
  • weight — number in grams or null

Profile tags suggestions, WIP ​

NOTE

This endpoint hasn't been researched yet

PUT /v4/profile-tags/suggestions

Profile tags translations, WIP ​

NOTE

This endpoint hasn't been researched yet

GET /v5/profile-tags/translations

Headers:

  • L-Locale — string

Upload media (legacy) ​

Requires Authorization.

thumbCoords must be square (y2 - y1 equals x2 - x1). A non-square thumbnail uploads without error, but Edit profile photos silently drops it.

A legacy POST /v3/me/profile/images also exists.

POST /v4/media/upload

Query:

  • thumbCoords — RectF
  • takenOnGrindr — boolean, Media captured with the in-app camera.

Body:

Binary file.

Response:

  • hash — string
  • imageSizes — array of objects
  • mediaId — integer

Errors:

  • 403 — Daily limit of new profile photos reached (ERR_EXCEED_PROFILE_IMAGE_DAILY_LIMIT, code 51).

Edit profile photos ​

Requires Authorization.

Both fields may be null. A primaryImageHash with secondaryImageHashes: null gets 400; send [] instead.

Photos without a square thumbnail are silently skipped; see Upload media (legacy).

A secondaryImageHashes entry equal to primaryImageHash is dropped. Repeated secondaryImageHashes entries are saved as sent.

PUT /v3/me/profile/images

Body:

  • primaryImageHash — string or null
  • secondaryImageHashes — array of strings, max. length: 5 or null

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/images

Body (yes, body, not query):

  • media_hashes — array of strings

Response:

Empty.

Get my profile photos ​

Requires Authorization.

GET /v3.1/me/profile/images

Query:

  • selected — boolean

Response:

Check if profiles are reachable, WIP ​

NOTE

This endpoint hasn't been researched yet

Requires Authorization.

POST /v4/profiles/reachable

Body:

  • profileIds — array of strings with numeric ids

Response:

  • profileIds — array of strings with numeric ids

Get similar profiles ​

Requires Authorization.

Profiles similar to targetProfileId.

GET /v1/similar-profiles

Query:

  • targetProfileId — long integer
  • geohash — string, optional

Response:

  • status — string, "Good", "SubscriptionRequired" or "ConsentRequired"
  • profiles — array of objects or null
    • profileId — long integer
    • displayName — string or null
    • imageUrl — URL or null
    • onlineUntil — unix timestamp in milliseconds or null
  • recommendationsUuid — string or null
  • source — string, e.g. "POPULAR"
  • entitlement — SimilarProfilesEntitlement or null

Unlock similar profile ​

Requires Authorization.

Unlocks targetProfileId against the similar-profiles allowance, see entitlement in Get similar profiles, and returns the updated allowance.

POST /v1/similar-profiles/unlock

Body:

  • targetProfileId — long integer

Response:

  • remaining — integer
  • usageCount — integer
  • resetTime — long integer, when the allowance resets, appears to be a unix timestamp in milliseconds, or null

Errors:

  • 402 — The allowance is used up.

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/pronouns

Response:

Array of Pronoun.

Get genders ​

GET /public/v2/genders

Response:

Array of Gender.

Get genders (v1 alias) ​

GET /public/v1/genders

Response:

Array of Gender.

Suggest gender or pronoun ​

Requires Authorization.

PUT /v4/genderpronoun/suggestions

Body:

  • category — string, either gender or pronoun
  • suggestedValue — 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/upload

Query:

  • thumbCoords — RectF
  • takenOnGrindr — boolean, Media captured with the in-app camera.

Headers:

  • X-Key-Id — base64url (no padding) SHA-256 of the device key SPKI — the keyId from Register device key.
  • X-Sig — base64url (no padding) DER ECDSA-P256-SHA256 signature over the UTF-8 string bodyHash|timestamp|userId|androidId|nonce. See Security headers -> Device-key upload signing.
  • X-Timestamp — Signing time as Unix epoch milliseconds (decimal string); must equal the timestamp inside the signed string.
  • X-Nonce — base64url (no padding) of 32 random bytes, unique per request; must equal the nonce inside the signed string.

Body:

Binary file.

Response:

  • hash — string
  • imageSizes — array of objects

Errors:

  • 4xx — Signature rejected. Body is an UploadSigningErrorResponse whose type contains timestamp_drift (with detail = server time as ISO-8601; resync and retry) or nonce_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 profile-insight opt-out status ​

Requires Authorization.

Per-insight opt-out state; sectionTitles is for deleted or pending insights without content.

GET /v3/profile-insights/opt-outs

Response:

  • insights — array of objects
    • insightKey — string
    • isOptedOut — boolean
    • hasData — boolean
    • sectionTitles — array of objects
      • key — string, translation key
      • default — string, fallback label when key is unknown

Opt out of profile insights ​

Requires Authorization.

PUT /v1/profile-insights/opt-outs

Body:

  • optOuts — array of objects
    • insight — string
    • insightValue — string

Undo profile-insight opt-outs ​

Requires Authorization.

DELETE /v1/profile-insights/opt-outs

Body:

  • optOuts — array of objects
    • insight — string
    • insightValue — string

Get own profile insight settings ​

Requires Authorization.

GET /v3/profile-insights/me/settings

Response:

SimilarProfilesEntitlement ​

Similar-profiles unlock allowance.

  • remaining — integer
  • usageCount — integer
  • resetTime — long integer, when the allowance resets, appears to be a unix timestamp in milliseconds, or null, optional

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.

ProfileMasked ​

Masked profile (extra fields revealed).

ProfileMin ​

Minimal profile fields.

  • profileId — string with numeric id
  • displayName — string or null
  • onlineUntil — unix timestamp in milliseconds or null, optional

ProfileMedia ​

ProfileShort ​

Short profile, combines ProfileMasked and ProfileMin.

  • everything from ProfileMasked
  • everything from ProfileMin
  • age — integer, may be 0 or null
  • showAge — boolean
  • showDistance — boolean
  • approximateDistance — boolean
  • lastChatTimestamp — number, may be 0 or null
  • isNew — boolean
  • lastUpdatedTime — unix timestamp in milliseconds, may be 0
  • medias — array of ProfileMedia

ProfileFields ​

Optional profile fields.

  • meetAt — array of Meet at, optional
  • vaccines — array of Vaccines, optional
  • genders — array of gender IDs, see Get genders. As of June 22, 2026, submitting gender ID 62 ("Ask me") causes a 500 Internal Server Error., optional
  • pronouns — array of integers, optional

ProfileRightNow ​

Right Now status info on a profile.

  • rightNowText — string or null
  • rightNowPosted — unix timestamp in milliseconds or null
  • rightNowDistance — long integer or null
  • rightNowThumbnailUrl — string or null
  • rightNowFullImageUrl — string or null

ProfileExtraFields ​

Extra profile fields.

  • nsfw — Accept NSFW pics or null
  • verifiedInstagramId — string or null
  • isBlockable — boolean or null
  • showTribes — boolean
  • showPosition — boolean

TravelPlanEmbedded ​

  • endDate — unix timestamp in milliseconds or null
  • geohash — Geohash
  • travelPlanId — long integer or null
  • locationName — string
  • showOnProfile — boolean or null
  • startDate — unix timestamp in milliseconds or null

RightNowMedia ​

  • mediaId — long integer
  • thumbnailUrl — string
  • fullImageUrl — string
  • contentType — string
  • isNsfw — boolean

Profile ​

Full profile object.

  • everything from ProfileShort
  • everything from ProfileFields
  • everything from ProfileRightNow
  • everything from ProfileExtraFields
  • aboutMe — string or null
  • created — long integer, profile creation timestamp; unit (ms vs s) unverified, optional
  • showUnlockReward — boolean, optional
  • ethnicity — Ethnicity or null
  • relationshipStatus — Relationship status or null
  • grindrTribes — array of Tribes
  • lookingFor — array of Looking for
  • bodyType — Body type or null
  • hivStatus — HIV status or null
  • lastTestedDate — unix timestamp in milliseconds or null
  • height — number in centimeters or null
  • weight — number in grams or null
  • socialNetworks — object
  • identity — object, Legacy self-identification container, superseded by the pronouns ID array. Read-only: it is returned on read but ignored by every profile-update endpoint (the official app never sends it). or null
    • pronouns — object or null
      • pronounsDisplay — string, free-text pronoun label shown next to the display name, e.g. he/him or null
      • pronounsCategory — integer, pronoun category ID; value set is undocumented
  • hashtags — array of strings
  • profileTags — array of Profile tags
  • tapped — boolean
  • tapType — Tap ID or null
  • lastReceivedTapTimestamp — unix timestamp in milliseconds or null
  • isTeleporting — boolean
  • isRoaming — boolean
  • arrivalDays — number or null
  • unreadCount — number, optional
  • lastThrobTimestamp — long integer, legacy timestamp, present in the API response but testing shows only null, units unverified
  • sexualHealth — array of Sexual health
  • isVisiting — boolean
  • travelPlans — array of TravelPlanEmbedded
  • isInAList — boolean
  • tribesImInto — array of Tribes
  • showVipBadge — boolean
  • rightNowShareLocation — RightNowShareLocation or null
  • rightNowMedias — 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). or null, optional
  • nsfw — Accept NSFW pics or null, optional
  • bodyType — Body type or null, optional
  • displayName — string, Silently ignored by PATCH, write using Update own profile (full). or null, optional
  • ethnicity — Ethnicity or null, optional
  • genders — array of gender IDs, see Get genders, max. length: 3. As of June 22, 2026, submitting gender ID 62 ("Ask me") in filters causes a 500 Internal Server Error, no error for profile edit endpoint. or null, optional
  • height — number in cm or null, optional
  • hivStatus — HIV status or null, optional
  • lastTestedDate — unix timestamp in milliseconds or null, optional
  • lookingFor — array of Looking for or null, optional
  • meetAt — array of Meet at or null, optional
  • grindrTribes — array of Tribes or null, optional
  • profileTags — array of Profile tags or null, optional
  • pronouns — array of pronoun IDs, see Get pronouns, max. length: 3. or null, optional
  • relationshipStatus — Relationship status or null, optional
  • sexualHealth — array of Sexual health or null, optional
  • sexualPosition — Sexual position ID or null, optional
  • showAge — boolean or null, optional
  • showDistance — boolean or null, optional
  • showPosition — boolean or null, optional
  • showTribes — boolean or null, optional
  • socialNetworks — object, Each network carries only { userId } on write (no site, unlike the read-side SocialNetwork). Any network key may be omitted. or null, optional
    • twitter — object
      • userId — string or null
    • facebook — object
      • userId — string or null
    • instagram — object
      • userId — string or null
  • tribesImInto — array of Tribes or null, optional
  • vaccines — array of Vaccines or null, optional
  • weight — number in grams or null, 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) or null, optional
  • aboutMe — string, moderated free-text; persisted here (unlike PATCH) or null, optional
  • age — integer, server-derived from birth date; echoed back on a full replace
  • showAge — boolean
  • showDistance — boolean
  • showPosition — boolean
  • showTribes — boolean
  • approximateDistance — boolean
  • showOnMap — boolean, whether the profile is shown on the map, optional
  • nsfw — Accept NSFW pics
  • bodyType — Body type
  • ethnicity — Ethnicity
  • hivStatus — HIV status
  • lastTestedDate — unix timestamp in milliseconds
  • relationshipStatus — Relationship status
  • sexualPosition — Sexual position ID
  • height — number in centimeters
  • weight — number in grams
  • genders — array of gender IDs, see Get genders, max. length: 3. or null, optional
  • pronouns — array of pronoun IDs, see Get pronouns, max. length: 3. or null, optional
  • grindrTribes — array of Tribes or null, optional
  • tribesImInto — array of Tribes or null, optional
  • lookingFor — array of Looking for or null, optional
  • meetAt — array of Meet at or null, optional
  • vaccines — array of Vaccines or null, optional
  • sexualHealth — array of Sexual health or null, optional
  • profileTags — array of Profile tags or null, optional
  • socialNetworks — object, Each network carries only { userId } on write (no site, unlike the read-side SocialNetwork). or null, optional
    • twitter — object
      • userId — string or null
    • facebook — object
      • userId — string or null
    • instagram — object
      • userId — string or null

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_terms for this response., optional
  • title — string, optional
  • status — integer, optional
  • traceId — string, optional
  • display_name — BannedTerms, Present when displayName was rejected. or null, optional
  • about_me — BannedTerms, Present when aboutMe was rejected. or null, optional
  • gender_display — BannedTerms, Present when the custom gender display text was rejected. or null, optional
  • pronouns_display — BannedTerms, Present when the custom pronoun display text was rejected. or null, optional

ProfileSummaryWithRightNow ​

SocialNetwork ​

Social network user reference.

  • userId — string, username or null
  • site — string, e.g. "twitter" | "facebook" | "instagram"

ProfileTagLanguage ​

  • language — string
  • categoryCollection — array of objects
    • text — string
    • possessiveText — string or null
    • tags — array of objects
      • tagId — integer
      • text — string
      • key — string

LegacyMediaUploadResponse ​

  • hash — string
  • imageSizes — array of objects
  • mediaId — integer

EditProfilePhotosRequest ​

  • primaryImageHash — string or null
  • secondaryImageHashes — array of strings, max. length: 5 or null

DeleteProfilePhotosRequest ​

  • media_hashes — array of strings

ProfileImageState ​

NOTE

This type hasn't been researched yet

Profile media state.

Pronoun ​

  • pronounId — integer
  • pronoun — string, e.g. "-" or "They/Them/Theirs"

Gender ​

  • genderId — integer
  • gender — string
  • displayGroup — integer
  • sortProfile — integer or null, optional
  • sortFilter — integer or null, optional
  • genderPlural — string, plural form of gender or null, optional
  • excludeOnProfileSelection — array of integers or null, optional
  • excludeOnFilterSelection — array of integers or null, optional
  • alsoClassifiedAs — array of integers; not in the official app's model, optional

GenderPronounSuggestionRequest ​

  • category — string, either gender or pronoun
  • suggestedValue — string

Sexual position ID ​

Sexual position ID.

  • 1 — Top
  • 2 — Bottom
  • 3 — Versatile
  • 4 — Vers Bottom
  • 5 — Vers Top
  • 6 — Side

Ethnicity ​

Ethnicity.

  • 1 — Asian
  • 2 — Black
  • 3 — Latino
  • 4 — Middle Eastern
  • 5 — Mixed
  • 6 — Native American
  • 7 — White
  • 8 — Other
  • 9 — South Asian

Relationship status ​

Relationship status.

  • 1 — Single
  • 2 — Dating
  • 3 — Exclusive
  • 4 — Committed
  • 5 — Partnered
  • 6 — Engaged
  • 7 — Married
  • 8 — Open Relationship

Body type ​

Body type.

  • 1 — Toned
  • 2 — Average
  • 3 — Large
  • 4 — Muscular
  • 5 — Slim
  • 6 — Stocky

HIV status ​

HIV status. Not to be confused with Sexual health.

  • 1 — Negative
  • 2 — Negative, on PrEP
  • 3 — Positive
  • 4 — Positive, undetectable
  • 5 — Prefer to discuss

Accept NSFW pics ​

Accept NSFW pics.

  • 1 — Never
  • 2 — Not At First
  • 3 — Yes Please

Meet at ​

Meet at preferences.

  • 1 — My Place
  • 2 — Your Place
  • 3 — Bar
  • 4 — Coffee Shop
  • 5 — 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 — Condoms
  • 2 — I'm on doxyPEP
  • 3 — I'm on PrEP
  • 4 — I'm HIV undetectable
  • 5 — Prefer to discuss

Looking for ​

Looking for.

  • 2 — Chat
  • 3 — Dates
  • 4 — Friends
  • 5 — Networking
  • 6 — Relationship
  • 7 — Hookups

Tribes ​

Tribe.

  • 1 — Bear
  • 2 — Clean-Cut
  • 3 — Daddy
  • 4 — Discreet
  • 5 — Geek
  • 6 — Jock
  • 7 — Leather
  • 8 — Otter
  • 9 — Poz
  • 10 — Rugged
  • 11 — Trans
  • 12 — Twink
  • 13 — Sober

Vaccines ​

Vaccine.

  • 1 — COVID-19
  • 2 — Monkeypox
  • 3 — Meningitis

UploadProfileImageResponse ​

  • hash — string
  • imageSizes — array of objects

ProfileInsightOptOutsRequest ​

  • optOuts — array of objects
    • insight — string
    • insightValue — string

ProfileInsightsStatus ​

  • "UNLOCKED"
  • "HIDDEN"
  • "UPSELL_MAX"
  • "UPSELL_PREMIUM"
  • "OPT_OUT_SELF"
  • "OPT_OUT_TARGET"
  • "FREEMIUM"

ProfileInsightsInferencesResponse ​

Open Grind is not affiliated with Grindr in any way.