{
	"openapi": "3.0.3",
	"info": {
		"title": "Grindr API",
		"version": "2026-05-21"
	},
	"servers": [
		{
			"url": "https://grindr.mobi"
		},
		{
			"url": "https://cdns.grindr.com"
		},
		{
			"url": "https://d2wxe7lth7kp8g.cloudfront.net"
		},
		{
			"url": "wss://grindr.mobi"
		}
	],
	"tags": [
		{
			"name": "messaging"
		},
		{
			"name": "users"
		},
		{
			"name": "browse"
		},
		{
			"name": "analytics"
		},
		{
			"name": "media"
		},
		{
			"name": "interest"
		},
		{
			"name": "settings"
		},
		{
			"name": "third-party-integrations",
			"x-wip": true
		},
		{
			"name": "woodwork"
		},
		{
			"name": "authentication"
		},
		{
			"name": "bootstrap",
			"x-wip": true
		},
		{
			"name": "drawer",
			"x-wip": true
		},
		{
			"name": "notifications"
		},
		{
			"name": "ratings",
			"description": "Appears to be the \"rate the app in a store\" dialog."
		},
		{
			"name": "signal-share"
		},
		{
			"name": "access-requests",
			"x-wip": true
		},
		{
			"name": "boosting",
			"x-wip": true
		},
		{
			"name": "gifs",
			"x-wip": true
		},
		{
			"name": "grindrstore",
			"x-wip": true
		},
		{
			"name": "heatmap",
			"x-wip": true
		},
		{
			"name": "legal-agreements",
			"x-wip": true
		},
		{
			"name": "logging",
			"x-wip": true
		},
		{
			"name": "modal",
			"x-wip": true
		},
		{
			"name": "offers",
			"x-wip": true
		},
		{
			"name": "reports",
			"x-wip": true
		},
		{
			"name": "rewarded-ads"
		},
		{
			"name": "rewarded-chats",
			"x-wip": true
		},
		{
			"name": "right-now",
			"x-wip": true
		},
		{
			"name": "storeapirest",
			"x-wip": true
		},
		{
			"name": "top-picks",
			"x-wip": true
		},
		{
			"name": "videocalls",
			"x-wip": true
		},
		{
			"name": "vip",
			"x-wip": true
		},
		{
			"name": "warnings",
			"x-wip": true
		},
		{
			"name": "analytics/assignments",
			"description": "Assignments are used for feature flagging and A/B testing. They can be assigned to users based on their geohash, allowing for location-based feature rollouts and experiments."
		},
		{
			"name": "analytics/trackers"
		},
		{
			"name": "browse/age-verification",
			"x-wip": true,
			"x-wip-note": "Help needed."
		},
		{
			"name": "browse/blocks",
			"description": "Blocking a user automatically deletes the conversation for both of you."
		},
		{
			"name": "browse/discover",
			"x-wip": true,
			"x-wip-note": "Help needed."
		},
		{
			"name": "browse/entitlements"
		},
		{
			"name": "browse/grid",
			"description": "[Cascade](#get-cascade) returns stuff like advertisements, upsells and partial profiles, presumably ranking by algorithms or paid subscriptions. [Search](#search) returns full profiles, seemingly ranked simply by distance."
		},
		{
			"name": "browse/hides",
			"description": "Unknown how it's different from [blocks](/grindr-api/browse/blocks), WIP. Blocks API is preferred until this is figured out."
		},
		{
			"name": "browse/links",
			"x-wip": true,
			"x-wip-note": "Unknown, WIP"
		},
		{
			"name": "browse/location"
		},
		{
			"name": "browse/roam",
			"x-wip": true
		},
		{
			"name": "browse/social-events"
		},
		{
			"name": "browse/travels"
		},
		{
			"name": "interest/alist",
			"x-wip": true
		},
		{
			"name": "interest/taps",
			"description": "Cookie taps are essentially bubbles \"hi\" but your client can choose to render them as 🍪. There is no separate cookie tap type."
		},
		{
			"name": "interest/views"
		},
		{
			"name": "media/public-cdn-files",
			"description": "CDN files that are public are accessible directly using their hash, e.g. profile images.\n\nBase URL: `https://cdns.grindr.com`"
		},
		{
			"name": "media/signed-cdn-files",
			"description": "CDN files accessible via signed URLs signed with `Signature` query argument. New signed URLs are generated and populated in API responses when existing URL expires. `Expires` query argument holds expiration date in unix timestamp in seconds, 15 minutes.\n\nBase URL appears to be: `https://d2wxe7lth7kp8g.cloudfront.net/`\n\nAlthough it might change in the future, so it's best to pull full URL from `url` property on media object itself."
		},
		{
			"name": "messaging/albums",
			"description": "WIP. No idea what SpankBank, pressie albums and paywalled albums are."
		},
		{
			"name": "messaging/conversations"
		},
		{
			"name": "messaging/messages"
		},
		{
			"name": "messaging/misc"
		},
		{
			"name": "messaging/saved-phrases"
		},
		{
			"name": "settings/account"
		},
		{
			"name": "settings/sms-verification",
			"x-wip": true
		},
		{
			"name": "third-party-integrations/spotify",
			"x-wip": true
		},
		{
			"name": "users/favorites"
		},
		{
			"name": "users/profiles"
		},
		{
			"name": "websocket"
		},
		{
			"name": "reddot",
			"x-wip": true
		},
		{
			"name": "woodwork/random-promotion-images",
			"description": "[Woodwork](https://www.woodwork.com/) is a service by Grindr."
		}
	],
	"paths": {
		"/v8/sessions": {
			"post": {
				"tags": [
					"authentication"
				],
				"operationId": "signIn",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/SessionCreateRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AuthSessionResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Sign in",
				"description": "Make sure you're passing all [Security headers](/grindr-api/security-headers) or you might stumble upon `{\"code\":28,\"message\":\"ACCOUNT_BANNED\",\"profileId\":null,\"type\":1,\"reason\":null,\"isBanAutomated\":true,\"thirdPartyUserIdToShow\":null,\"banSubReason\":null}` — but don't fret — it's a fake error, your account isn't banned and API simply blocked your request, not account. Endpoint selection depends on the `recaptcha_first_party` [assignment](/grindr-api/analytics/assignments): when disabled (default) sign-in uses `/v8/sessions`; when enabled the client uses `POST /v9/sessions` with an extra `captchaToken`, sharing the same body otherwise.",
				"x-errors": {
					"ACCOUNT_BANNED": "could be malformed request",
					"INVALID_INPUT_PARAMETERS": "incorrect credentials"
				}
			}
		},
		"/v9/sessions": {
			"post": {
				"tags": [
					"authentication"
				],
				"operationId": "signInV9",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/SessionCreateRequestV9"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AuthSessionResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Sign in via reCAPTCHA",
				"description": "reCAPTCHA variant of `POST /v8/sessions`. The client uses this endpoint instead of `/v8/sessions` only when the `recaptcha_first_party` [assignment](/grindr-api/analytics/assignments) is enabled. That assignment is sent by server and resolved before login. The body is identical to `SessionCreateRequest` plus a `captchaToken` (a reCAPTCHA Enterprise token for the `login` action). The official client always populates `captchaToken` here and aborts locally if it can't obtain one, so a `null`/absent token never reaches this endpoint from the app.",
				"x-errors": {
					"ACCOUNT_BANNED": "could be malformed request",
					"INVALID_INPUT_PARAMETERS": "incorrect credentials; on this endpoint a rejected `captchaToken` (e.g. expired or low-score) is also a plausible cause — server behavior, not confirmed from the client"
				}
			}
		},
		"/v3/bootstrap": {
			"get": {
				"tags": [
					"bootstrap"
				],
				"operationId": "getBootstrap",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"allOf": [
										{
											"$ref": "#/components/schemas/UndocumentedObject"
										}
									],
									"x-original-type": "BootstrapResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get bootstrap",
				"x-wip": true
			}
		},
		"/v4/chat/media/drawer": {
			"get": {
				"tags": [
					"drawer"
				],
				"operationId": "getDrawerMedia",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/DrawerMedia"
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get media in drawer"
			}
		},
		"/v4/chat/media/drawer/{conversationId}": {
			"get": {
				"tags": [
					"drawer"
				],
				"operationId": "getDrawerMediaForConversation",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ConversationIdPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/DrawerMedia"
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get media in drawer for a conversation"
			}
		},
		"/v4/chat/media/drawer/{mediaId}": {
			"put": {
				"tags": [
					"drawer"
				],
				"operationId": "addDrawerMedia",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/MediaIdPath"
					}
				],
				"responses": {
					"200": {
						"description": "Empty."
					},
					"500": {
						"description": "Repeated requests cause 500 HTTP status \"Internal Error\"."
					}
				},
				"summary": "Add media to drawer",
				"description": "MediaId must be obtained through [uploading](/grindr-api/users/profiles#upload-media)."
			},
			"delete": {
				"tags": [
					"drawer"
				],
				"operationId": "deleteDrawerMedia",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/MediaIdPath"
					}
				],
				"responses": {
					"200": {
						"description": "Empty with HTTP status 202."
					},
					"202": {
						"description": "Accepted"
					}
				},
				"summary": "Delete media from drawer",
				"x-idempotent": true
			}
		},
		"/public/v1/notifications/ack": {
			"post": {
				"tags": [
					"notifications"
				],
				"operationId": "ackNotifications",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/NotificationsAckRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Acknowledge notifications",
				"x-wip": true
			}
		},
		"/v1/ratings/ack": {
			"post": {
				"tags": [
					"ratings"
				],
				"operationId": "ackRatingPrompt",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"acknowledgmentTime": {
											"description": "unix timestamp in milliseconds",
											"allOf": [
												{
													"$ref": "#/components/schemas/TimestampMs"
												}
											]
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Acknowledge rating"
			}
		},
		"/v1/signalshare": {
			"get": {
				"tags": [
					"signal-share"
				],
				"operationId": "getSignalShare",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"profileId": {
											"type": "integer",
											"format": "int64",
											"description": "long integer"
										},
										"sevenDayRevenue": {
											"type": "number",
											"format": "float",
											"description": "unknown, WIP"
										},
										"thirtyDayRevenue": {
											"type": "number",
											"format": "float",
											"description": "unknown, WIP"
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get signal share"
			}
		},
		"/v2/access-requests/codes": {
			"post": {
				"tags": [
					"access-requests"
				],
				"operationId": "createAccessRequestVerificationCodeV2",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "DataPortabilityVerificationCode"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v2/access-requests": {
			"get": {
				"tags": [
					"access-requests"
				],
				"operationId": "getAccessRequestsV2",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"allOf": [
										{
											"$ref": "#/components/schemas/UndocumentedObject"
										}
									],
									"x-original-type": "AccessPortabilityResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"post": {
				"tags": [
					"access-requests"
				],
				"operationId": "createAccessRequestV2",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "DataPortabilityRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/access-requests": {
			"get": {
				"tags": [
					"access-requests"
				],
				"operationId": "getAccessRequestsV1",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"allOf": [
										{
											"$ref": "#/components/schemas/UndocumentedObject"
										}
									],
									"x-original-type": "DataPortabilityResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"post": {
				"tags": [
					"access-requests"
				],
				"operationId": "createAccessRequestV1",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "DataPortabilityRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/access-requests/confirmations": {
			"post": {
				"tags": [
					"access-requests"
				],
				"operationId": "confirmAccessRequestV1",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v2/access-requests/confirm": {
			"post": {
				"tags": [
					"access-requests"
				],
				"operationId": "confirmAccessRequestV2",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/access-requests/codes": {
			"post": {
				"tags": [
					"access-requests"
				],
				"operationId": "createAccessRequestVerificationCodeV1",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "DataPortabilityVerificationCode"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v2/boost/sessions": {
			"get": {
				"tags": [
					"boosting"
				],
				"operationId": "getBoostSessions",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"allOf": [
										{
											"$ref": "#/components/schemas/UndocumentedObject"
										}
									],
									"x-original-type": "BoostSessionResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/consumables/redeem/boost": {
			"post": {
				"tags": [
					"boosting"
				],
				"operationId": "redeemBoost",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"allOf": [
										{
											"$ref": "#/components/schemas/UndocumentedObject"
										}
									],
									"x-original-type": "BoostRedeemedResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/boost/preferences/mega": {
			"post": {
				"tags": [
					"boosting"
				],
				"operationId": "setMegaBoostPreferences",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "SuperBoostPreferencesRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/boost/preferences/super": {
			"post": {
				"tags": [
					"boosting"
				],
				"operationId": "setSuperBoostPreferences",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "SuperBoostPreferencesRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/boost/preferences/standard": {
			"post": {
				"tags": [
					"boosting"
				],
				"operationId": "setStandardBoostPreferences",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "BoostPreferencesRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/consumables/inventory": {
			"get": {
				"tags": [
					"boosting"
				],
				"operationId": "getConsumablesInventory",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"allOf": [
										{
											"$ref": "#/components/schemas/UndocumentedObject"
										}
									],
									"x-original-type": "ConsumableInventoryResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/gifs/trending": {
			"get": {
				"tags": [
					"gifs"
				],
				"operationId": "getTrendingGifs",
				"parameters": [
					{
						"name": "limit",
						"in": "query",
						"schema": {
							"type": "integer"
						}
					},
					{
						"name": "rating",
						"in": "query",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/GiphyResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/gifs/search": {
			"get": {
				"tags": [
					"gifs"
				],
				"operationId": "searchGifs",
				"parameters": [
					{
						"name": "limit",
						"in": "query",
						"schema": {
							"type": "integer"
						}
					},
					{
						"name": "rating",
						"in": "query",
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "q",
						"in": "query",
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "offset",
						"in": "query",
						"schema": {
							"type": "integer"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/GiphyResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3.1/store/grindrstore/coupons": {
			"post": {
				"tags": [
					"grindrstore"
				],
				"operationId": "submitGrindrStoreCoupon",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "CouponRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/explore_heatmaps/all_locations": {
			"get": {
				"tags": [
					"heatmap"
				],
				"operationId": "getAllExploreHeatmaps",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"allOf": [
										{
											"$ref": "#/components/schemas/UndocumentedObject"
										}
									],
									"x-original-type": "ExploreHeatmapsResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/explore_heatmaps": {
			"post": {
				"tags": [
					"heatmap"
				],
				"operationId": "queryExploreHeatmaps",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "ExploreHeatmapsRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"allOf": [
										{
											"$ref": "#/components/schemas/UndocumentedObject"
										}
									],
									"x-original-type": "ExploreHeatmapsResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v5/legal-agreements/subscriber-sponsored-content": {
			"get": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "getSubscriberSponsoredContentAgreement",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"allOf": [
										{
											"$ref": "#/components/schemas/UndocumentedObject"
										}
									],
									"x-original-type": "SponsoredContentConsentAgreementResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"post": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "acceptSubscriberSponsoredContentAgreement",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "SponsoredContentAcceptConsentRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"delete": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "deleteSubscriberSponsoredContentAgreement",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "SponsoredContentAcceptConsentRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true,
				"x-notes": [
					"Note: this DELETE endpoint accepts a request body."
				]
			}
		},
		"/v1/agreements/ban": {
			"post": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "acceptBanAgreement",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "BanAgreementRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3/me/legal-agreements": {
			"get": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "getAcceptedLegalAgreements",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "AcceptedLegalAgreementsResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"put": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "acceptLegalAgreements",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "AcceptLegalAgreementsRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v5/legal-agreements/vip-matchmaker": {
			"get": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "getVipMatchmakerAgreement",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "VipMatchmakerConsentAgreementResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"post": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "acceptVipMatchmakerAgreement",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "VipMatchmakerAcceptConsentRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"delete": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "deleteVipMatchmakerAgreement",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "VipMatchmakerAcceptConsentRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v4/legal-agreements/top-picks": {
			"get": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "getTopPicksAgreementV4",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "TopPicksConsentAgreementResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"post": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "acceptTopPicksAgreementV4",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "TopPicksAcceptConsentRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"delete": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "deleteTopPicksAgreementV4",
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v5/legal-agreements/top-picks": {
			"get": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "getTopPicksAgreementV5",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "TopPicksConsentAgreementResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"delete": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "deleteTopPicksAgreementV5",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "TopPicksAcceptConsentRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v4/legal-agreements/right-now": {
			"get": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "getRightNowAgreement",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "RightNowConsentAgreementResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"post": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "acceptRightNowAgreement",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "RightNowAcceptConsentRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3/legal-agreements": {
			"get": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "getLegalAgreementsInfo",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "LegalAgreementsInfo"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/opt-out": {
			"put": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "setOptOutConsent",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "ConsentRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"delete": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "deleteOptOutConsent",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "ConsentRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"post": {
				"tags": [
					"legal-agreements"
				],
				"operationId": "createOptOutConsent",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "ConsentRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "ConsentOptStatusResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3/logging/mobile/logs": {
			"post": {
				"tags": [
					"logging"
				],
				"operationId": "uploadMobileLogs",
				"requestBody": {
					"required": true,
					"content": {
						"application/octet-stream": {
							"schema": {
								"type": "string",
								"format": "binary"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/uxevent": {
			"post": {
				"tags": [
					"logging"
				],
				"operationId": "submitUxEvent",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "UxEventRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/modal": {
			"get": {
				"tags": [
					"modal"
				],
				"operationId": "getModal",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/modal/{modalName}": {
			"post": {
				"tags": [
					"modal"
				],
				"operationId": "submitModalAction",
				"parameters": [
					{
						"name": "modalName",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v2/offers": {
			"get": {
				"tags": [
					"offers"
				],
				"operationId": "getOffers",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "Offer"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"post": {
				"tags": [
					"offers"
				],
				"operationId": "createOffer",
				"parameters": [
					{
						"name": "offerType",
						"in": "query",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "Offer"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v2/offers/eligible": {
			"get": {
				"tags": [
					"offers"
				],
				"operationId": "getEligibleOffers",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "EligibleOffers"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v4/flags/{id}": {
			"get": {
				"tags": [
					"reports"
				],
				"operationId": "getReportV4",
				"parameters": [
					{
						"$ref": "#/components/parameters/GenericIdPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "ReportProfileResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"post": {
				"tags": [
					"reports"
				],
				"operationId": "submitReportV4",
				"parameters": [
					{
						"$ref": "#/components/parameters/GenericIdPath"
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "ReportProfileRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3.1/flags/{id}": {
			"get": {
				"tags": [
					"reports"
				],
				"operationId": "getReportV31",
				"parameters": [
					{
						"$ref": "#/components/parameters/GenericIdPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "ReportProfileResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"post": {
				"tags": [
					"reports"
				],
				"operationId": "submitReportV31",
				"parameters": [
					{
						"$ref": "#/components/parameters/GenericIdPath"
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "ReportProfileRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/rewarded-ads/consumption": {
			"put": {
				"tags": [
					"rewarded-ads"
				],
				"operationId": "updateRewardedAdConsumption",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"summary": "Report rewarded ad consumption",
				"description": "Reports status of a rewarded ad watch. Send `STARTED` when the ad begins and `COMPLETED` when it finishes. A `COMPLETED` report grants the reward identified by `type` (e.g. `READ_RECEIPTS`).",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"required": [
									"source",
									"status",
									"type",
									"adId"
								],
								"properties": {
									"source": {
										"type": "string",
										"description": "Ad mediation network that served the ad, e.g. `APPLOVIN`."
									},
									"status": {
										"description": "Lifecycle status being reported.",
										"allOf": [
											{
												"$ref": "#/components/schemas/RewardedAdConsumptionStatus"
											}
										]
									},
									"type": {
										"description": "Reward being consumed.",
										"allOf": [
											{
												"$ref": "#/components/schemas/RewardedAdType"
											}
										]
									},
									"adId": {
										"type": "string",
										"description": "Identifier of the ad instance, as reported by the ad SDK."
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				}
			}
		},
		"/v1/rewarded-ads/rewards/restriction": {
			"put": {
				"tags": [
					"rewarded-ads"
				],
				"operationId": "updateRewardedAdRewardRestriction",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"summary": "Restrict a rewarded ad reward",
				"description": "Updates the restriction for the given rewarded ad reward `type`, sent by the client when a reward should no longer be offered.",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"required": [
									"type"
								],
								"properties": {
									"type": {
										"description": "Reward to restrict.",
										"allOf": [
											{
												"$ref": "#/components/schemas/RewardedAdType"
											}
										]
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				}
			}
		},
		"/v1/rewarded-ads/rewards": {
			"get": {
				"tags": [
					"rewarded-ads"
				],
				"operationId": "getRewardedAdRewards",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"summary": "List rewarded ad rewards",
				"description": "Returns the rewarded ad rewards available to the current user and their state. Watching an ad for an `ELIGIBLE` reward temporarily unlocks the corresponding feature (for example `READ_RECEIPTS`).",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"required": [
										"rewards"
									],
									"properties": {
										"rewards": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/RewardedAdReward"
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				}
			}
		},
		"/{version}/rewarded-chats": {
			"get": {
				"tags": [
					"rewarded-chats"
				],
				"operationId": "getRewardedChats",
				"parameters": [
					{
						"$ref": "#/components/parameters/VersionPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "ExploreFreeChatsResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"post": {
				"tags": [
					"rewarded-chats"
				],
				"operationId": "createRewardedChatAction",
				"parameters": [
					{
						"$ref": "#/components/parameters/VersionPath"
					}
				],
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3/rightnow/active-post": {
			"get": {
				"tags": [
					"right-now"
				],
				"operationId": "getActiveRightNowPost",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "RightNowGetActivePostResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3/rightnow/profiles/{profileId}": {
			"get": {
				"tags": [
					"right-now"
				],
				"operationId": "getOtherUserRightNowPost",
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "RightNowGetOtherUserPostResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/{version}/rightnow/posts/{postId}": {
			"patch": {
				"tags": [
					"right-now"
				],
				"operationId": "updateRightNowPost",
				"parameters": [
					{
						"$ref": "#/components/parameters/VersionPath"
					},
					{
						"name": "postId",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "UpdatePostRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v4/rightnow/posts": {
			"post": {
				"tags": [
					"right-now"
				],
				"operationId": "createRightNowPostV4",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "CreatePostRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "RightNowCreatePostResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3/rightnow/posts": {
			"post": {
				"tags": [
					"right-now"
				],
				"operationId": "createRightNowPostV3",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "CreatePostRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "RightNowCreatePostResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/rightnow/posts/{postId}/settings": {
			"patch": {
				"tags": [
					"right-now"
				],
				"operationId": "updateRightNowPostSettings",
				"parameters": [
					{
						"name": "postId",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "UpdatePostSettingsRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v5/rightnow/feed": {
			"get": {
				"tags": [
					"right-now"
				],
				"operationId": "getRightNowFeed",
				"parameters": [
					{
						"name": "sort",
						"in": "query",
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "hosting",
						"in": "query",
						"schema": {
							"type": "boolean"
						}
					},
					{
						"name": "ageMin",
						"in": "query",
						"schema": {
							"type": "integer"
						}
					},
					{
						"name": "ageMax",
						"in": "query",
						"schema": {
							"type": "integer"
						}
					},
					{
						"name": "sexualPositions",
						"in": "query",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "RightNowGetFeedResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/media/upload": {
			"post": {
				"tags": [
					"right-now"
				],
				"operationId": "uploadRightNowMedia",
				"parameters": [
					{
						"name": "img_1_bottom",
						"in": "query",
						"schema": {
							"type": "integer"
						}
					},
					{
						"name": "img_1_left",
						"in": "query",
						"schema": {
							"type": "integer"
						}
					},
					{
						"name": "img_1_right",
						"in": "query",
						"schema": {
							"type": "integer"
						}
					},
					{
						"name": "img_1_top",
						"in": "query",
						"schema": {
							"type": "integer"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/octet-stream": {
							"schema": {
								"type": "string",
								"format": "binary"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "RightNowMediaUploadResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/rightnow/googleplay/sku": {
			"get": {
				"tags": [
					"right-now"
				],
				"operationId": "getRightNowGooglePlaySku",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "RightNowSkuResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/rightnow/requests": {
			"post": {
				"tags": [
					"right-now"
				],
				"operationId": "createRightNowRequest",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "RightNowCreateRequestData"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3/store/googleplay/products/store": {
			"get": {
				"tags": [
					"storeapirest"
				],
				"operationId": "getStoreProductsStore",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "StoreResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/consumables/attribution/tokens": {
			"post": {
				"tags": [
					"storeapirest"
				],
				"operationId": "submitConsumablesAttributionToken",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "PaymentTokenRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "PaymentTokenResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/store/googleplay/products/consumables": {
			"get": {
				"tags": [
					"storeapirest"
				],
				"operationId": "getConsumableProducts",
				"deprecated": true,
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "ConsumableProductsResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/shop/googleplay/products/explore": {
			"get": {
				"tags": [
					"storeapirest"
				],
				"operationId": "getExploreShopProducts",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "StoreInProfileResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v2/store/googleplay/products/{oneStopShopCategory}": {
			"get": {
				"tags": [
					"storeapirest"
				],
				"operationId": "getProductsByOneStopShopCategory",
				"parameters": [
					{
						"name": "oneStopShopCategory",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "StoreResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/store/attribution/tokens": {
			"post": {
				"tags": [
					"storeapirest"
				],
				"operationId": "submitStoreAttributionToken",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "PaymentTokenRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "PaymentTokenResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v4/store/products/{productId}": {
			"get": {
				"tags": [
					"storeapirest"
				],
				"operationId": "getStoreProductById",
				"parameters": [
					{
						"name": "productId",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "Product"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/shop/googleplay/products/profile_drawer": {
			"get": {
				"tags": [
					"storeapirest"
				],
				"operationId": "getProfileDrawerShopProducts",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "StoreInProfileResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3.1/store/googleplay/purchases": {
			"post": {
				"tags": [
					"storeapirest"
				],
				"operationId": "submitGooglePlayPurchase",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "PurchaseData"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3.1/store/googleplay/purchases/restorations": {
			"post": {
				"tags": [
					"storeapirest"
				],
				"operationId": "restoreGooglePlayPurchases",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "array",
								"items": {
									"allOf": [
										{
											"$ref": "#/components/schemas/UndocumentedObject"
										}
									]
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/store/googleplay/consumables/purchases": {
			"post": {
				"tags": [
					"storeapirest"
				],
				"operationId": "submitConsumablePurchaseToken",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "ConsumableTokenRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/store/googleplay/subscriptions/purchases": {
			"post": {
				"tags": [
					"storeapirest"
				],
				"operationId": "submitSubscriptionPurchaseToken",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "SubscriptionTokenRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/store/googleplay/subscriptions/restorations": {
			"post": {
				"tags": [
					"storeapirest"
				],
				"operationId": "restoreSubscriptions",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "SubscriptionRestorationRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "SubscriptionRestorationResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3/me/subscriptions": {
			"get": {
				"tags": [
					"storeapirest"
				],
				"operationId": "getSubscriptions",
				"parameters": [
					{
						"name": "status",
						"in": "query",
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "platform",
						"in": "query",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "SubscriptionResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/toppicks/entitlements/messaging/{profileId}": {
			"get": {
				"tags": [
					"top-picks"
				],
				"operationId": "getTopPicksMessagingEntitlement",
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "TopPicksEntitlementResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"post": {
				"tags": [
					"top-picks"
				],
				"operationId": "createTopPicksMessagingEntitlement",
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/toppicks/passed/{passedProfileId}": {
			"put": {
				"tags": [
					"top-picks"
				],
				"operationId": "markTopPickPassed",
				"parameters": [
					{
						"name": "passedProfileId",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int64"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3/video-call": {
			"get": {
				"tags": [
					"videocalls"
				],
				"operationId": "getVideoCallInfo",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "VideoCallInfoResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/video-call": {
			"post": {
				"tags": [
					"videocalls"
				],
				"operationId": "createVideoCall",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "CreateVideoCallRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "CreateVideoCallResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"patch": {
				"tags": [
					"videocalls"
				],
				"operationId": "renewVideoCall",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "RenewVideoCallResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/video-call/join": {
			"patch": {
				"tags": [
					"videocalls"
				],
				"operationId": "joinVideoCall",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "JoinVideoCallRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "JoinVideoCallResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/video-call/leave": {
			"patch": {
				"tags": [
					"videocalls"
				],
				"operationId": "leaveVideoCall",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "LeaveVideoCallRequestChatV3"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/vip/passed/{passedProfileId}": {
			"put": {
				"tags": [
					"vip"
				],
				"operationId": "markVipProfilePassed",
				"parameters": [
					{
						"name": "passedProfileId",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int64"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/vip-profiles": {
			"get": {
				"tags": [
					"vip"
				],
				"operationId": "getVipProfiles",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "StarProfilesResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/warnings": {
			"put": {
				"tags": [
					"warnings"
				],
				"operationId": "ackWarnings",
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v2/warnings": {
			"get": {
				"tags": [
					"warnings"
				],
				"operationId": "getWarnings",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "BannedWarningList"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/public/v1/public-features": {
			"get": {
				"tags": [
					"analytics/assignments"
				],
				"operationId": "getPublicAssignments",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"assignments": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/Assignment"
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get public assignments"
			}
		},
		"/v3/assignment": {
			"get": {
				"tags": [
					"analytics/assignments"
				],
				"operationId": "getAssignments",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "geohash",
						"in": "query",
						"schema": {
							"$ref": "#/components/schemas/Geohash"
						},
						"required": true
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"assignments": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/Assignment"
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get assignments"
			}
		},
		"/v2/bulk-exposure": {
			"post": {
				"tags": [
					"analytics/trackers"
				],
				"operationId": "submitBulkExposure",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"required": [
									"exposures"
								],
								"properties": {
									"exposures": {
										"type": "array",
										"items": {
											"type": "object",
											"properties": {
												"key": {
													"type": "string"
												},
												"geohash": {
													"$ref": "#/components/schemas/Geohash"
												}
											}
										}
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Bulk exposure"
			}
		},
		"/v1/age-verification/verify/document": {
			"post": {
				"tags": [
					"browse/age-verification"
				],
				"operationId": "verifyAgeDocument",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "AgeVerificationPhotoIdMatchRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "AgeVerificationFaceTecResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/age-verification/session": {
			"post": {
				"tags": [
					"browse/age-verification"
				],
				"operationId": "createAgeVerificationSession",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "AgeVerificationSessionResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/age-verification/verify/enrollment": {
			"post": {
				"tags": [
					"browse/age-verification"
				],
				"operationId": "verifyAgeEnrollment",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "AgeVerificationFaceTecResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/age-verification/verify/liveness3d": {
			"post": {
				"tags": [
					"browse/age-verification"
				],
				"operationId": "verifyAgeLiveness3d",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "AgeVerificationFaceTecRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "AgeVerificationFaceTecResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/age-verification/options": {
			"get": {
				"tags": [
					"browse/age-verification"
				],
				"operationId": "getAgeVerificationOptions",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "AgeVerificationOptionsResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3.1/me/blocks": {
			"get": {
				"tags": [
					"browse/blocks"
				],
				"summary": "Get blocked users",
				"operationId": "getBlockedUsers",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"blocking": {
											"type": "array",
											"items": {
												"type": "object",
												"properties": {
													"profileId": {
														"type": "integer",
														"format": "int64"
													},
													"blockedTime": {
														"type": "integer",
														"format": "int64",
														"description": "appears to be `0`"
													}
												}
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				}
			}
		},
		"/v3/me/blocks/{profileId}": {
			"post": {
				"tags": [
					"browse/blocks"
				],
				"summary": "Block a user",
				"operationId": "blockUser",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"x-idempotent": true,
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"updateTime": {
											"type": "integer",
											"format": "int64",
											"description": "appears to be `0`"
										}
									}
								}
							}
						},
						"description": "OK"
					}
				}
			}
		},
		"/v3/me/blocks/{targetProfileId}": {
			"delete": {
				"tags": [
					"browse/blocks"
				],
				"summary": "Unblock a user",
				"operationId": "unblockUser",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "targetProfileId",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int64"
						}
					}
				],
				"x-idempotent": true,
				"responses": {
					"200": {
						"description": "Empty."
					}
				}
			}
		},
		"/v3/me/blocks": {
			"delete": {
				"tags": [
					"browse/blocks"
				],
				"summary": "Unblock all users",
				"operationId": "unblockAllUsers",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"x-idempotent": true,
				"responses": {
					"200": {
						"description": "Empty."
					}
				}
			}
		},
		"/v3/discover": {
			"get": {
				"tags": [
					"browse/discover"
				],
				"operationId": "getDiscoverProfilesV3",
				"parameters": [
					{
						"name": "geohash",
						"in": "query",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Geohash"
						}
					},
					{
						"name": "previewedProfiles",
						"in": "query",
						"schema": {
							"type": "array",
							"items": {
								"type": "integer",
								"format": "int64"
							}
						},
						"style": "form",
						"explode": true,
						"required": true
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DiscoverResponse"
								}
							}
						},
						"description": "If subscription is purchased,\n\nUnknown, WIP.\n\nIf subscription is not purchased,\n\n- `status` — string, `\"SubscriptionRequired\"`\n- `body` — object\n  - `upsell` — string, `\"Unknown\"`\n  - `profiles` — array, unknown"
					}
				},
				"summary": "Get discover profiles",
				"x-wip": true
			}
		},
		"/v2/discover": {
			"get": {
				"tags": [
					"browse/discover"
				],
				"operationId": "getDiscoverProfilesV2",
				"parameters": [
					{
						"name": "geohash",
						"in": "query",
						"schema": {
							"$ref": "#/components/schemas/Geohash"
						},
						"required": true
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DiscoverResponse"
								}
							}
						},
						"description": "If subscription is purchased,\n\nUnknown, WIP.\n\nIf subscription is not purchased,\n\n- `status` — string, `\"SubscriptionRequired\"`\n- `body` — object\n  - `upsell` — string, `\"Unknown\"`"
					}
				},
				"summary": "Get discover profiles (legacy)",
				"x-wip": true,
				"x-legacy": true
			}
		},
		"/v1/me/pass/{profileId}": {
			"post": {
				"tags": [
					"browse/discover"
				],
				"operationId": "passDiscoverProfile",
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "Post a pass",
				"x-wip": true
			}
		},
		"/v1/entitlements": {
			"get": {
				"tags": [
					"browse/entitlements"
				],
				"operationId": "getEntitlements",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"rightNow": {
											"type": "integer"
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get entitlements"
			}
		},
		"/v4/cascade": {
			"get": {
				"tags": [
					"browse/grid"
				],
				"operationId": "getCascadeV4",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/NearbyGeoHashQuery"
					},
					{
						"$ref": "#/components/parameters/ExploreGeoHashQuery"
					},
					{
						"$ref": "#/components/parameters/GridPhotoOnlyQuery"
					},
					{
						"$ref": "#/components/parameters/GridFaceOnlyQuery"
					},
					{
						"$ref": "#/components/parameters/GridNotRecentlyChattedQuery"
					},
					{
						"$ref": "#/components/parameters/GridHasAlbumQuery"
					},
					{
						"$ref": "#/components/parameters/GridFreshQuery"
					},
					{
						"$ref": "#/components/parameters/GridGendersQuery"
					},
					{
						"$ref": "#/components/parameters/GridPageNumberQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeOnlineOnlyQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeAgeMinQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeAgeMaxQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeHeightCmMinQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeHeightCmMaxQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeWeightGramsMinQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeWeightGramsMaxQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeTribesQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeLookingForQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeRelationshipStatusesQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeBodyTypesQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeSexualPositionsQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeMeetAtQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeNsfwPicsQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeTagsQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeRightNowQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeFavoritesQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeShowSponsoredProfilesQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeShuffleQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeHotQuery"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CascadeResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get Cascade",
				"x-query-groups": [
					"CascadeQuery"
				]
			}
		},
		"/v3/cascade": {
			"get": {
				"tags": [
					"browse/grid"
				],
				"operationId": "getCascadeV3",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/NearbyGeoHashQuery"
					},
					{
						"$ref": "#/components/parameters/ExploreGeoHashQuery"
					},
					{
						"$ref": "#/components/parameters/GridPhotoOnlyQuery"
					},
					{
						"$ref": "#/components/parameters/GridFaceOnlyQuery"
					},
					{
						"$ref": "#/components/parameters/GridNotRecentlyChattedQuery"
					},
					{
						"$ref": "#/components/parameters/GridHasAlbumQuery"
					},
					{
						"$ref": "#/components/parameters/GridFreshQuery"
					},
					{
						"$ref": "#/components/parameters/GridGendersQuery"
					},
					{
						"$ref": "#/components/parameters/GridPageNumberQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeOnlineOnlyQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeAgeMinQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeAgeMaxQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeHeightCmMinQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeHeightCmMaxQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeWeightGramsMinQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeWeightGramsMaxQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeTribesQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeLookingForQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeRelationshipStatusesQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeBodyTypesQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeSexualPositionsQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeMeetAtQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeNsfwPicsQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeTagsQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeRightNowQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeFavoritesQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeShowSponsoredProfilesQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeShuffleQuery"
					},
					{
						"$ref": "#/components/parameters/CascadeHotQuery"
					},
					{
						"name": "exploreUuid",
						"in": "query",
						"schema": {
							"type": "string"
						},
						"description": "unknown, WIP"
					},
					{
						"name": "sexualHealth",
						"in": "query",
						"schema": {
							"type": "string"
						},
						"description": "see [Sexual health](/grindr-api/users/profiles#sexual-health)"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CascadeResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get Cascade (legacy)",
				"x-legacy": true,
				"x-query-groups": [
					"CascadeQuery"
				]
			}
		},
		"/v7/search": {
			"get": {
				"tags": [
					"browse/grid"
				],
				"operationId": "searchProfiles",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/NearbyGeoHashQuery"
					},
					{
						"$ref": "#/components/parameters/ExploreGeoHashQuery"
					},
					{
						"$ref": "#/components/parameters/GridPhotoOnlyQuery"
					},
					{
						"$ref": "#/components/parameters/GridFaceOnlyQuery"
					},
					{
						"$ref": "#/components/parameters/GridNotRecentlyChattedQuery"
					},
					{
						"$ref": "#/components/parameters/GridHasAlbumQuery"
					},
					{
						"$ref": "#/components/parameters/GridFreshQuery"
					},
					{
						"$ref": "#/components/parameters/GridGendersQuery"
					},
					{
						"$ref": "#/components/parameters/GridPageNumberQuery"
					},
					{
						"name": "online",
						"in": "query",
						"schema": {
							"type": "boolean"
						}
					},
					{
						"name": "ageMinimum",
						"in": "query",
						"schema": {
							"type": "integer"
						}
					},
					{
						"name": "ageMaximum",
						"in": "query",
						"schema": {
							"type": "integer"
						}
					},
					{
						"name": "heightMinimum",
						"in": "query",
						"schema": {
							"type": "number",
							"format": "float"
						}
					},
					{
						"name": "heightMaximum",
						"in": "query",
						"schema": {
							"type": "number",
							"format": "float"
						}
					},
					{
						"name": "weightMinimum",
						"in": "query",
						"schema": {
							"type": "number",
							"format": "float"
						}
					},
					{
						"name": "weightMaximum",
						"in": "query",
						"schema": {
							"type": "number",
							"format": "float"
						}
					},
					{
						"name": "grindrTribesIds",
						"in": "query",
						"schema": {
							"type": "string",
							"description": "array of integers concatenated with a `,`, `-1` means \"Not Specified\", see [Tribes](/grindr-api/users/profiles#tribes)"
						}
					},
					{
						"name": "lookingForIds",
						"in": "query",
						"schema": {
							"type": "string",
							"description": "array of integers concatenated with a `,`, `-1` means \"Not Specified\", see [Looking for](/grindr-api/users/profiles#looking-for)"
						}
					},
					{
						"name": "relationshipStatusIds",
						"in": "query",
						"schema": {
							"type": "string",
							"description": "array of integers concatenated with a `,`, `-1` means \"Not Specified\", see [Relationship status](/grindr-api/users/profiles#relationship-status)"
						}
					},
					{
						"name": "bodyTypeIds",
						"in": "query",
						"schema": {
							"type": "string",
							"description": "string, see [Body type](/grindr-api/users/profiles#body-type)"
						}
					},
					{
						"name": "sexualPositionIds",
						"in": "query",
						"schema": {
							"type": "string",
							"description": "array of integers concatenated with a `,`, `-1` means \"Not Specified\", see [Sexual position](/grindr-api/users/profiles#sexual-position-id)"
						}
					},
					{
						"name": "meetAtIds",
						"in": "query",
						"schema": {
							"type": "string",
							"description": "array of integers concatenated with a `,`, `-1` means \"Not Specified\", see [Meet at](/grindr-api/users/profiles#meet-at)"
						}
					},
					{
						"name": "nsfwIds",
						"in": "query",
						"schema": {
							"type": "string",
							"description": "array of integers concatenated with a `,`, `-1` means \"Not Specified\", see [Accept NSFW pics](/grindr-api/users/profiles#accept-nsfw-pics)"
						}
					},
					{
						"name": "profileTags",
						"in": "query",
						"schema": {
							"type": "string",
							"description": "string, see [Profile tags](/grindr-api/users/profiles#profile-tags)"
						}
					},
					{
						"name": "searchAfterDistance",
						"in": "query",
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "searchAfterProfileId",
						"in": "query",
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "freeFilter",
						"in": "query",
						"schema": {
							"type": "boolean"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SearchProfilesResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Search",
				"description": "Results array appears to be capped to 600 per page. Use `searchAfterProfileId` or `searchAfterDistance` for pagination.",
				"x-query-groups": [
					"GridQuery"
				]
			}
		},
		"/v1/hides": {
			"get": {
				"tags": [
					"browse/hides"
				],
				"operationId": "getHiddenUsers",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"hides": {
											"type": "array",
											"items": {
												"type": "object",
												"properties": {
													"profileId": {
														"type": "integer",
														"format": "int64"
													},
													"displayName": {
														"type": "string"
													},
													"mediaHash": {
														"type": "string",
														"description": "appears to be just `\"hash\"`"
													}
												}
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get hidden users"
			},
			"delete": {
				"tags": [
					"browse/hides"
				],
				"operationId": "unhideAllUsers",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Unhide all hidden users",
				"x-idempotent": true
			}
		},
		"/v1/me/hides/{profileId}": {
			"post": {
				"tags": [
					"browse/hides"
				],
				"operationId": "hideUser",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"updateTime": {
											"type": "integer",
											"format": "int64",
											"description": "appears to be `0`"
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Hide a user",
				"x-idempotent": true
			}
		},
		"/v1/hides/{profileId}": {
			"delete": {
				"tags": [
					"browse/hides"
				],
				"operationId": "unhideUser",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Unhide a user",
				"x-idempotent": true
			}
		},
		"/v4/links/{key}": {
			"get": {
				"tags": [
					"browse/links"
				],
				"operationId": "resolveLinkKey",
				"parameters": [
					{
						"name": "key",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"destination": {
											"type": "string",
											"format": "uri"
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get link",
				"x-wip": true
			}
		},
		"/v3/places/search": {
			"get": {
				"tags": [
					"browse/location"
				],
				"operationId": "searchPlaces",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "placeName",
						"in": "query",
						"required": true,
						"schema": {
							"type": "string",
							"description": "e.g. `Paris`"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"places": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/Place"
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Search places by name"
			}
		},
		"/v4/location": {
			"put": {
				"tags": [
					"browse/location"
				],
				"operationId": "updateLocation",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/LocationUpdateRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Update location"
			}
		},
		"/v1/location/neighborhood/{geohash}": {
			"get": {
				"tags": [
					"browse/roam"
				],
				"operationId": "getNeighborhoodByGeohash",
				"parameters": [
					{
						"name": "geohash",
						"in": "path",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Geohash"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/roam/location": {
			"put": {
				"tags": [
					"browse/roam"
				],
				"operationId": "updateRoamLocation",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "RoamPutLocationRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/roam": {
			"get": {
				"tags": [
					"browse/roam"
				],
				"operationId": "getRoamSession",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "RoamSession"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/roam/status/{location}": {
			"put": {
				"tags": [
					"browse/roam"
				],
				"operationId": "updateRoamStatus",
				"parameters": [
					{
						"name": "location",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/roam/arrival/{days}": {
			"put": {
				"tags": [
					"browse/roam"
				],
				"operationId": "updateRoamArrivalDays",
				"parameters": [
					{
						"name": "days",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/social-events": {
			"get": {
				"tags": [
					"browse/social-events"
				],
				"operationId": "getSocialEvents",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "geohash",
						"in": "query",
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "sort",
						"in": "query",
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "region",
						"in": "query",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"events": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/SocialEvent"
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get social events"
			}
		},
		"/v6/profiles/travel/{profileId}": {
			"get": {
				"tags": [
					"browse/travels"
				],
				"operationId": "getTravelPlans",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"travelPlans": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/TravelPlanMutation"
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get travel plans"
			}
		},
		"/v6/profiles/travel": {
			"post": {
				"tags": [
					"browse/travels"
				],
				"operationId": "createTravelPlan",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TravelPlanMutation"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Create travel plans"
			}
		},
		"/v6/profiles/travel/update": {
			"post": {
				"tags": [
					"browse/travels"
				],
				"operationId": "updateTravelPlan",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TravelPlanMutation"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Update travel plans"
			}
		},
		"/v6/profiles/travel/{travelPlanId}": {
			"delete": {
				"tags": [
					"browse/travels"
				],
				"operationId": "deleteTravelPlanById",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "travelPlanId",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int64"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Delete travel plans",
				"x-idempotent": true
			}
		},
		"/v1/alist/profiles/{profileId}": {
			"get": {
				"tags": [
					"interest/alist"
				],
				"operationId": "getAListProfile",
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "AListFullProfileApiResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			},
			"delete": {
				"tags": [
					"interest/alist"
				],
				"operationId": "deleteAListProfile",
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/alist/updates": {
			"get": {
				"tags": [
					"interest/alist"
				],
				"operationId": "getAListUpdates",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "AListUpdatesApiResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/alist/feedback/{conversationId}": {
			"post": {
				"tags": [
					"interest/alist"
				],
				"operationId": "submitAListFeedback",
				"parameters": [
					{
						"$ref": "#/components/parameters/ConversationIdPath"
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "AListFeedback"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3/alist/profiles": {
			"get": {
				"tags": [
					"interest/alist"
				],
				"operationId": "getAListProfiles",
				"parameters": [
					{
						"name": "filter",
						"in": "query",
						"schema": {
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						"style": "form",
						"explode": true
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "AListProfilesResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v2/taps/received": {
			"get": {
				"tags": [
					"interest/taps"
				],
				"operationId": "getReceivedTaps",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"profiles": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/TapProfile"
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get received taps"
			}
		},
		"/v2/taps/add": {
			"post": {
				"tags": [
					"interest/taps"
				],
				"operationId": "sendTap",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"required": [
									"recipientId",
									"tapType"
								],
								"properties": {
									"recipientId": {
										"type": "integer",
										"format": "int64",
										"description": "[profile id](/grindr-api/users/profiles#profile)"
									},
									"tapType": {
										"description": "[Tap ID](/grindr-api/interest/taps#tap-id), invalid or nonexistent Tap IDs are still recorded as successfull",
										"allOf": [
											{
												"$ref": "#/components/schemas/TapType"
											}
										]
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"isMutual": {
											"type": "boolean"
										}
									}
								}
							}
						},
						"description": "OK"
					},
					"400": {
						"description": "Repeated requests result in `Invalid request` error and HTTP status 400."
					}
				},
				"summary": "Send a tap"
			}
		},
		"/v1/interactions/taps/sent": {
			"get": {
				"tags": [
					"interest/taps"
				],
				"operationId": "getSentTaps",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"type": "object",
										"properties": {
											"senderId": {
												"type": "integer"
											},
											"receiverId": {
												"type": "integer"
											},
											"tapType": {
												"$ref": "#/components/schemas/TapType"
											},
											"sentOn": {
												"description": "unix timestamp in milliseconds",
												"allOf": [
													{
														"$ref": "#/components/schemas/TimestampMs"
													}
												]
											},
											"deleted": {
												"type": "boolean"
											},
											"readOn": {
												"type": "integer",
												"format": "int64",
												"nullable": true,
												"description": "unknown or `null`"
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get sent taps"
			}
		},
		"/v6/views/eyeball": {
			"get": {
				"tags": [
					"interest/views"
				],
				"operationId": "getViewsCount",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ViewsEyeballResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get views number"
			}
		},
		"/v7/views/list": {
			"get": {
				"tags": [
					"interest/views"
				],
				"operationId": "getViewersList",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ViewsListResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get viewers list"
			}
		},
		"/v4/views": {
			"post": {
				"tags": [
					"interest/views"
				],
				"operationId": "recordProfileViewsBatch",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"properties": {
									"viewedProfileIds": {
										"type": "array",
										"items": {
											"type": "string",
											"pattern": "^[0-9]+$"
										},
										"description": "array of strings with numeric profile IDs"
									},
									"foundVia": {
										"allOf": [
											{
												"$ref": "#/components/schemas/ViewSourceEnum"
											}
										],
										"nullable": true
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "Record profile views (batch)",
				"x-wip": true
			}
		},
		"/v4/views/{profileId}": {
			"post": {
				"tags": [
					"interest/views"
				],
				"operationId": "recordProfileViewV4",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdStringPath"
					}
				],
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "Record single profile view",
				"x-wip": true
			}
		},
		"/v5/views/{profileId}": {
			"post": {
				"tags": [
					"interest/views"
				],
				"operationId": "recordProfileViewV5",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdStringPath"
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"properties": {
									"foundVia": {
										"allOf": [
											{
												"$ref": "#/components/schemas/ViewSourceEnum"
											}
										],
										"nullable": true
									},
									"source": {
										"$ref": "#/components/schemas/ViewSourceEnum"
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "Record profile view v2",
				"x-wip": true
			}
		},
		"/grindr/chat/gaymoji": {
			"get": {
				"tags": [
					"media/public-cdn-files"
				],
				"operationId": "listGaymoji",
				"servers": [
					{
						"url": "https://cdns.grindr.com"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/GaymojiManifest"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Grindr Gaymoji"
			}
		},
		"/grindr/chat/gaymoji/{id}": {
			"get": {
				"tags": [
					"media/public-cdn-files"
				],
				"operationId": "getGaymojiAsset",
				"servers": [
					{
						"url": "https://cdns.grindr.com"
					}
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"image/png": {
								"schema": {
									"type": "string",
									"format": "binary"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get gaymoji asset",
				"x-notes": [
					"ID must include file extension (e.g. `name.png`)."
				]
			}
		},
		"/images/profile/{size}/{mediaHash}": {
			"get": {
				"tags": [
					"media/public-cdn-files"
				],
				"operationId": "getPublicProfileImage",
				"description": "One side will always be the requested size and another will be less or equal to the requested size.\n\nAvailable sizes for `{size}` parameter:\n\n- `2048x2048` (might be unavailable)\n- `1024x1024`\n- `480x480`\n- `320x320`",
				"servers": [
					{
						"url": "https://cdns.grindr.com"
					}
				],
				"parameters": [
					{
						"name": "size",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string",
							"enum": [
								"2048x2048",
								"1024x1024",
								"480x480",
								"320x320"
							],
							"description": "`2048x2048` might be unavailable."
						}
					},
					{
						"name": "mediaHash",
						"in": "path",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/MediaHash"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"image/jpeg": {
								"schema": {
									"type": "string",
									"format": "binary"
								}
							},
							"image/png": {
								"schema": {
									"type": "string",
									"format": "binary"
								}
							},
							"image/webp": {
								"schema": {
									"type": "string",
									"format": "binary"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Profile images"
			}
		},
		"/images/thumb/{size}/{mediaHash}": {
			"get": {
				"tags": [
					"media/public-cdn-files"
				],
				"operationId": "getPublicThumbnailImage",
				"description": "Image will be cropped at center and both sides will be exactly the requested size.\n\nAvailable sizes for `{size}` parameter:\n- `480x480` (might be unavailable)\n- `320x320`\n- `75x75`",
				"servers": [
					{
						"url": "https://cdns.grindr.com"
					}
				],
				"parameters": [
					{
						"name": "size",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string",
							"enum": [
								"480x480",
								"320x320",
								"75x75"
							],
							"description": "`480x480` might be unavailable."
						}
					},
					{
						"name": "mediaHash",
						"in": "path",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/MediaHash"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"image/jpeg": {
								"schema": {
									"type": "string",
									"format": "binary"
								}
							},
							"image/png": {
								"schema": {
									"type": "string",
									"format": "binary"
								}
							},
							"image/webp": {
								"schema": {
									"type": "string",
									"format": "binary"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Thumbnails images"
			}
		},
		"/{uploaderProfileId}/{mediaHash}": {
			"get": {
				"tags": [
					"media/signed-cdn-files"
				],
				"operationId": "getSignedChatMedia",
				"servers": [
					{
						"url": "https://d2wxe7lth7kp8g.cloudfront.net"
					}
				],
				"parameters": [
					{
						"name": "uploaderProfileId",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "mediaHash",
						"in": "path",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/MediaHash"
						}
					},
					{
						"name": "Expires",
						"in": "query",
						"required": true,
						"schema": {
							"type": "integer"
						}
					},
					{
						"name": "Signature",
						"in": "query",
						"required": true,
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "Key-Pair-Id",
						"in": "query",
						"required": true,
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/octet-stream": {
								"schema": {
									"type": "string",
									"format": "binary"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Chat media"
			}
		},
		"/v1/albums": {
			"get": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "getMyAlbums",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"albums": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/MyAlbum"
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get my albums"
			}
		},
		"/v2/albums/{albumId}": {
			"get": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "getAlbum",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/AlbumIdPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AlbumDetailsResponse"
								}
							}
						},
						"description": "OK"
					},
					"403": {
						"description": "if you don't have access to album or it doesn't exist"
					}
				},
				"summary": "Get an album"
			},
			"put": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "renameAlbum",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/AlbumIdPath"
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/AlbumNameRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AlbumRenameResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Rename an album"
			}
		},
		"/v1/albums/{albumId}/content/{contentId}/poster": {
			"get": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "getAlbumMediaPoster",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/AlbumIdPath"
					},
					{
						"$ref": "#/components/parameters/ContentIdPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"blurredPosterUrl": {
											"type": "string",
											"format": "uri"
										},
										"posterUrl": {
											"type": "string",
											"format": "uri"
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get an album media poster"
			}
		},
		"/v3/albums/{albumId}/view": {
			"get": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "recordAlbumView",
				"parameters": [
					{
						"$ref": "#/components/parameters/AlbumIdPath"
					}
				],
				"responses": {
					"200": {
						"description": "Empty."
					},
					"403": {
						"description": "Repeated requests after invoking this endpoint on view ONCE albums cause HTTP status 403 Forbidden and `Action not permitted` error."
					}
				},
				"summary": "Record view of an album"
			}
		},
		"/v1/albums/{albumId}/view/content/{contentId}": {
			"post": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "recordAlbumContentView",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/AlbumIdPath"
					},
					{
						"$ref": "#/components/parameters/ContentIdPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"remainingViews": {
											"type": "integer"
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Record view of media in an album",
				"description": "Repeated requests after reaching remainingViews=0 do not cause any errors."
			}
		},
		"/v2/albums/shares": {
			"post": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "getAlbumShareInfo",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"required": [
									"profileId"
								],
								"properties": {
									"profileId": {
										"type": "integer",
										"format": "int64"
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AlbumShareInfo"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get info about profile's album"
			}
		},
		"/v2/albums/shares/{profileId}": {
			"get": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "getAlbumsSharedByProfile",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AlbumsSharedByProfileResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get albums shared by a profile"
			}
		},
		"/v2/albums": {
			"post": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "createAlbum",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/AlbumNameRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"albumId": {
											"type": "integer",
											"format": "int64"
										}
									}
								}
							}
						},
						"description": "OK"
					},
					"402": {
						"description": "Payment required if you reached [limit](/grindr-api/messaging/albums#get-album-limits) for number of created albums"
					}
				},
				"summary": "Create an album"
			}
		},
		"/v1/albums/{albumId}": {
			"delete": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "deleteAlbum",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/AlbumIdPath"
					}
				],
				"responses": {
					"200": {
						"description": "Empty"
					},
					"403": {
						"description": "Repeated requests cause 403 Forbidden and `Action not permitted` error."
					}
				},
				"summary": "Delete an album"
			}
		},
		"/v1/albums/{albumId}/content": {
			"post": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "uploadAlbumContent",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/AlbumIdPath"
					},
					{
						"name": "width",
						"in": "query",
						"schema": {
							"type": "number",
							"description": "number, optional, doesn't affect the resulting image"
						}
					},
					{
						"name": "height",
						"in": "query",
						"schema": {
							"type": "number",
							"description": "number, optional, doesn't affect the resulting image"
						}
					},
					{
						"name": "isFresh",
						"in": "query",
						"schema": {
							"type": "boolean",
							"description": "boolean, optional, unknown how it affects the resulting image, WIP"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"multipart/form-data": {
							"schema": {
								"type": "object",
								"required": [
									"content"
								],
								"properties": {
									"content": {
										"type": "string",
										"format": "binary"
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"contentId": {
											"type": "integer",
											"format": "int64"
										},
										"contentUrl": {
											"type": "string",
											"nullable": true
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Upload media to an album",
				"description": "Repeated requests with the same file (its contents) are skipped and a cached result from the first upload request is returned."
			}
		},
		"/v1/albums/{albumId}/content/order": {
			"post": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "reorderAlbumContent",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/AlbumIdPath"
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"properties": {
									"contentIds": {
										"type": "array",
										"items": {
											"type": "integer",
											"format": "int64"
										},
										"description": "array of long integers, each Media file ID must appear exactly once"
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "Reorder media in an album"
			}
		},
		"/v1/albums/{albumId}/content/{contentId}": {
			"delete": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "deleteAlbumContent",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/AlbumIdPath"
					},
					{
						"$ref": "#/components/parameters/ContentIdPath"
					}
				],
				"responses": {
					"200": {
						"description": "Empty"
					}
				},
				"summary": "Delete media from an album",
				"description": "Technically, this does not delete the media from CDN. All signed URLs will continue to work until expired. Uploading same file will result in getting it assigned the same `contentId`."
			}
		},
		"/v1/albums/{albumId}/content/{contentId}/processing": {
			"get": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "getAlbumContentProcessing",
				"parameters": [
					{
						"$ref": "#/components/parameters/AlbumIdPath"
					},
					{
						"$ref": "#/components/parameters/ContentIdPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"processing": {
											"type": "boolean"
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Albums content processing",
				"x-wip": true
			}
		},
		"/v1/pics/limited/status": {
			"get": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "getLimitedPicsStatus",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"available": {
											"type": "integer"
										},
										"total": {
											"type": "integer"
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Pics, WIP",
				"x-wip": true
			}
		},
		"/v4/pics/expiring": {
			"post": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "reportExpiringPicture",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								]
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Pics expiring",
				"x-wip": true
			}
		},
		"/v4/pics/expiring/status": {
			"get": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "getExpiringPictureStatus",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Pics expiring status",
				"x-wip": true
			}
		},
		"/v4/videos/expiring/status": {
			"get": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "getExpiringVideoStatus",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Videos expiring status",
				"x-wip": true
			}
		},
		"/v1/albums/{albumId}/shares": {
			"get": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "getAlbumShares",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/AlbumIdPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"profileIds": {
											"type": "array",
											"items": {
												"type": "integer"
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get album shares",
				"description": "Returns profiles the album was shared with."
			}
		},
		"/v4/albums/{albumId}/shares": {
			"post": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "shareAlbum",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/AlbumIdPath"
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/AlbumShareRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty"
					}
				},
				"summary": "Share an album",
				"description": "Automatically sends the shared album to chat with all listed profiles."
			}
		},
		"/v1/albums/{albumId}/unshares": {
			"put": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "unshareAlbum",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/AlbumIdPath"
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/AlbumUnshareRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty"
					}
				},
				"summary": "Unshare an album"
			}
		},
		"/v1/albums/{albumId}/shares/remove": {
			"put": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "removeAllAlbumShares",
				"parameters": [
					{
						"$ref": "#/components/parameters/AlbumIdPath"
					}
				],
				"responses": {
					"200": {
						"description": "OK"
					},
					"403": {
						"description": ""
					}
				},
				"summary": "Unshare an album from everybody",
				"description": "Unknown, returns 403",
				"x-wip": true
			}
		},
		"/v1/albums/{albumId}/content/chat/list-by-id": {
			"post": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "listAlbumContentByChatIds",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/AlbumIdPath"
					},
					{
						"name": "isFresh",
						"in": "query",
						"schema": {
							"type": "boolean"
						},
						"required": true
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"properties": {
									"ids": {
										"type": "array",
										"items": {
											"type": "integer",
											"format": "int64"
										}
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Albums content chat list-by-id",
				"description": "Unknown, `{\"ids\":[852120758]}` returns 400",
				"x-wip": true
			}
		},
		"/v1/albums/storage": {
			"get": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "getAlbumStorageLimits",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AlbumStorageLimits"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get album limits",
				"description": "Interestingly, /v2/albums/storage appears to exist, though not used in current version of APK."
			}
		},
		"/v1/albums/red-dot": {
			"put": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "ackAlbumRedDot",
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Albums red dot",
				"description": "This may just be tracking but could also be related to something else",
				"x-wip": true
			}
		},
		"/v3/pressie-albums/feed": {
			"post": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "getPressieAlbumsFeed",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": false,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"properties": {
									"isFavorite": {
										"type": "boolean",
										"description": "boolean, optional, only albums shared by [favorite](/grindr-api/users/favorites) users"
									},
									"isOnline": {
										"type": "boolean",
										"description": "boolean, optional, only albums shared by currently online users"
									},
									"onlyVideo": {
										"type": "boolean",
										"description": "boolean, optional, only albums with at least one video"
									},
									"blur": {
										"type": "boolean",
										"description": "boolean, optional, blur media urls in response"
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PressieAlbumsFeedResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Gets albums shared with us"
			}
		},
		"/v3/pressie-albums/feed/paywall/": {
			"post": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "getPressieAlbumsFeedPaywall",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PressieAlbumsPaywallResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Pressie albums feed paywall"
			}
		},
		"/v3/pressie-albums/feed/{profileId}": {
			"get": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "getPressieAlbumsFeedForProfile",
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Pressie albums feed profile ID",
				"x-wip": true
			}
		},
		"/v3/pressie-albums/feed/update/read": {
			"post": {
				"tags": [
					"messaging/albums"
				],
				"operationId": "updatePressieAlbumsFeedRead",
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "Pressie albums feed update read",
				"x-wip": true
			}
		},
		"/v4/inbox": {
			"post": {
				"tags": [
					"messaging/conversations"
				],
				"operationId": "getConversations",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "page",
						"in": "query",
						"schema": {
							"type": "integer"
						},
						"description": "1-based number, pagination"
					}
				],
				"requestBody": {
					"required": false,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/InboxFilterRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/InboxResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get conversations",
				"description": "*Also `POST /v3/inbox`, seems to be aliased to v4 now*"
			}
		},
		"/v3/inbox": {
			"post": {
				"tags": [
					"messaging/conversations"
				],
				"operationId": "getConversationsV3Alias",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "page",
						"in": "query",
						"schema": {
							"type": "integer"
						},
						"description": "1-based number, pagination"
					}
				],
				"requestBody": {
					"required": false,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/InboxFilterRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/InboxResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get conversations (v3 alias)",
				"x-legacy": true
			}
		},
		"/v1/inbox/conversation": {
			"post": {
				"tags": [
					"messaging/conversations"
				],
				"operationId": "getConversationsById",
				"x-notes": [
					"Note: in this v1 endpoint, each `participants` item only includes `profileId`, `primaryMediaHash`, `lastOnline`, and `distanceMetres`. Fields `onlineUntil`, `position`, `isInAList`, and `hasDatingPotential` are absent."
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "array",
								"items": {
									"$ref": "#/components/schemas/ConversationId"
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/ConversationData"
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get conversations by IDs"
			}
		},
		"/v4/chat/conversation/{conversationId}": {
			"delete": {
				"tags": [
					"messaging/conversations"
				],
				"operationId": "deleteConversation",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ConversationIdPath"
					}
				],
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Delete a conversation",
				"description": "Deletes the conversation on your side. Does not delete the conversation for other chat's participant.",
				"x-idempotent": true
			}
		},
		"/v4/chat/conversation/{conversationId}/pin": {
			"post": {
				"tags": [
					"messaging/conversations"
				],
				"operationId": "pinConversation",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ConversationIdPath"
					}
				],
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Pin a conversation",
				"description": "Affects sorting position in [get conversations](/grindr-api/messaging/conversations#get-conversations) endpoint response.",
				"x-notes": [
					"Requests on nonexistent conversations seem to be affecting them after they have been created."
				],
				"x-idempotent": true
			}
		},
		"/v4/chat/conversation/{conversationId}/unpin": {
			"post": {
				"tags": [
					"messaging/conversations"
				],
				"operationId": "unpinConversation",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ConversationIdPath"
					}
				],
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Unpin a conversation",
				"description": "Affects sorting position in [get conversations](/grindr-api/messaging/conversations#get-conversations) endpoint response. Requests on nonexistent conversations seem to be affecting them after they have been created.",
				"x-idempotent": true
			}
		},
		"/v1/push/conversation/{conversationId}/mute": {
			"post": {
				"tags": [
					"messaging/conversations"
				],
				"operationId": "muteConversation",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ConversationIdPath"
					}
				],
				"responses": {
					"200": {
						"description": "Empty"
					}
				},
				"summary": "Mute a conversation",
				"description": "Requests on nonexistent conversations seem to be affecting them after they have been created.",
				"x-idempotent": true
			}
		},
		"/v1/push/conversation/{conversationId}/unmute": {
			"post": {
				"tags": [
					"messaging/conversations"
				],
				"operationId": "unmuteConversation",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ConversationIdPath"
					}
				],
				"responses": {
					"200": {
						"description": "Empty"
					}
				},
				"summary": "Unmute a conversation",
				"description": "Requests on nonexistent conversations seem to be affecting them after they have been created.",
				"x-idempotent": true
			}
		},
		"/v5/chat/media/shared/images/with-me/{conversationId}": {
			"get": {
				"tags": [
					"messaging/conversations"
				],
				"operationId": "getSharedConversationMedia",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ConversationIdPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"images": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/ChatImageBody"
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get shared media in conversation"
			}
		},
		"/v4/chat/conversation/{conversationId}/message-by-id": {
			"post": {
				"tags": [
					"messaging/conversations"
				],
				"operationId": "refreshMessagesById",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ConversationIdPath"
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"properties": {
									"messageIds": {
										"type": "array",
										"items": {
											"type": "string"
										}
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"messages": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/Message"
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Refresh messages",
				"description": "Requests the messages from the message id"
			}
		},
		"/v4/chat/conversation/{conversationId}/read/{messageId}": {
			"post": {
				"tags": [
					"messaging/conversations"
				],
				"operationId": "markMessagesAsRead",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ConversationIdPath"
					},
					{
						"$ref": "#/components/parameters/MessageIdPath"
					}
				],
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Mark messages as read",
				"description": "Regardless of messageId passed, the whole conversation's [`unreadCount`](/grindr-api/messaging/conversations#conversation) will be reset to 0. messageId is taken into account to present the \"Read\" label to sender.\n\nIf you'd like to mark conversation as read but don't show it to other participant, you could pass a valid but nonexistent messageId, such as `0:00000000-0000-0000-0000-000000000000`.\n\nInvalid messageIds will cause HTTP status 400 Bad Request errors."
			}
		},
		"/v1/chat/suggestions": {
			"get": {
				"tags": [
					"messaging/conversations"
				],
				"operationId": "getChatSuggestions",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "conversationId",
						"in": "query",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/ConversationId"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ChatSuggestionsResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "AI chat suggestions"
			}
		},
		"/v1/chat/summary/feedback": {
			"post": {
				"tags": [
					"messaging/conversations"
				],
				"operationId": "submitChatSummaryFeedback",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								]
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "Chat AI summary feedback",
				"x-wip": true
			}
		},
		"/v5/chat/conversation/{conversationId}/message": {
			"get": {
				"tags": [
					"messaging/messages"
				],
				"operationId": "getConversationMessages",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ConversationIdPath"
					},
					{
						"name": "pageKey",
						"in": "query",
						"schema": {
							"type": "string",
							"description": "optional, return messages with IDs before specified value"
						}
					},
					{
						"name": "profile",
						"in": "query",
						"schema": {
							"type": "boolean",
							"description": "boolean (`profile=true` | `profile=` + any other value), optional"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConversationMessagesResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get messages in a conversation",
				"description": "Invoking this endpoint does not [mark messages as read](/grindr-api/messaging/conversations#mark-messages-as-read)."
			}
		},
		"/v4/chat/conversation/{conversationId}/message/{messageId}": {
			"get": {
				"tags": [
					"messaging/messages"
				],
				"operationId": "getConversationMessage",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ConversationIdPath"
					},
					{
						"$ref": "#/components/parameters/MessageIdPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"message": {
											"$ref": "#/components/schemas/Message"
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get a single message in a conversation"
			}
		},
		"/v4/chat/message/send": {
			"post": {
				"tags": [
					"messaging/messages"
				],
				"operationId": "sendMessage",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/SendMessageRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "HTTP status 201. [Message](/grindr-api/messaging/messages#message) object."
					},
					"201": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Message"
								}
							}
						},
						"description": "Created"
					}
				},
				"summary": "Send a message to a conversation",
				"description": "Please don't use this for spam. Be civil.\n\nWhen `replyToMessageId` is used in HTTP API appears to cause 400 Bad Request error.",
				"x-see-also": [
					"/grindr-api/websocket/commands#send-a-message-to-a-conversation-via-ws"
				]
			}
		},
		"/v4/chat/message/unsend": {
			"post": {
				"tags": [
					"messaging/messages"
				],
				"operationId": "unsendMessage",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/MessageMutationRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty."
					},
					"500": {
						"description": "Internal Error if conversation or message was not found or if it wasn't sent by you"
					}
				},
				"summary": "Unsend a message",
				"description": "Turns a message in chat into \"This message was unsent.\"",
				"x-idempotent": true
			}
		},
		"/v4/chat/message/delete": {
			"post": {
				"tags": [
					"messaging/messages"
				],
				"operationId": "deleteMessage",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/MessageMutationRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty."
					},
					"500": {
						"description": "Internal Error if conversation or message was not found"
					}
				},
				"summary": "Delete a message",
				"description": "Deletes a message on your side. Does not delete message for other chat participant.",
				"x-idempotent": true
			}
		},
		"/v4/chatstatus/typing": {
			"post": {
				"tags": [
					"messaging/messages"
				],
				"operationId": "sendTypingIndicator",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TypingIndicatorRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty."
					},
					"403": {
						"description": "Action not permitted if conversation not found"
					}
				},
				"summary": "Send typing indicator",
				"description": "WIP, does not seem to work.",
				"x-wip": true
			}
		},
		"/v4/chat/message/reaction": {
			"post": {
				"tags": [
					"messaging/messages"
				],
				"operationId": "reactToMessage",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/MessageReactionRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty."
					},
					"500": {
						"description": "Internal Error if conversation or message was not found"
					}
				},
				"summary": "React to a message",
				"description": "There is no discovered way to undo the reaction as of yet.",
				"x-idempotent": true
			}
		},
		"/v5/chat/translate": {
			"post": {
				"tags": [
					"messaging/misc"
				],
				"operationId": "translateMessage",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TranslateMessageRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"translatedText": {
											"type": "string"
										}
									}
								}
							}
						},
						"description": "OK"
					},
					"402": {
						"description": "`User has reached their entitlement limits`"
					}
				},
				"summary": "Translate a message",
				"x-paid": true
			}
		},
		"/v5/recognition/chat": {
			"post": {
				"tags": [
					"messaging/misc"
				],
				"operationId": "submitChatRecognition",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "OCR recognition in chat",
				"description": "Appears to be a submitting endpoint rather than a retrieving one.",
				"x-wip": true
			}
		},
		"/v1/wingman/feedback": {
			"post": {
				"tags": [
					"messaging/misc"
				],
				"operationId": "submitWingmanFeedback",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/WingmanFeedbackRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"additionalProperties": false
								}
							}
						},
						"description": "Empty object (`{}`)."
					},
					"400": {
						"description": "bad request"
					}
				},
				"summary": "Rate an AI message suggestion",
				"x-wip": true
			}
		},
		"/v1/chat/phrases": {
			"get": {
				"tags": [
					"messaging/saved-phrases"
				],
				"operationId": "getSavedPhrases",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SavedPhrasesResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get saved phrases"
			},
			"post": {
				"tags": [
					"messaging/saved-phrases"
				],
				"operationId": "createSavedPhrase",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"required": [
									"text"
								],
								"properties": {
									"text": {
										"type": "string"
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"phrase": {
											"$ref": "#/components/schemas/SavedPhrase"
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Add a saved phrase"
			}
		},
		"/v3/me/prefs": {
			"get": {
				"tags": [
					"messaging/saved-phrases"
				],
				"operationId": "getSavedPhrasesLegacy",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/LegacyPrefsResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get saved phrases (legacy)",
				"x-legacy": true
			}
		},
		"/v3/me/prefs/phrases": {
			"post": {
				"tags": [
					"messaging/saved-phrases"
				],
				"operationId": "createSavedPhraseLegacy",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"properties": {
									"phrase": {
										"type": "string"
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"phrase": {
											"$ref": "#/components/schemas/SavedPhrase"
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Add a saved phrase (legacy)",
				"description": "This endpoint is somewhat broken and sometimes throws 500 ISE error or .",
				"x-legacy": true
			}
		},
		"/v3/me/prefs/phrases/{id}": {
			"delete": {
				"tags": [
					"messaging/saved-phrases"
				],
				"operationId": "deleteSavedPhrase",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Delete a saved phrase"
			}
		},
		"/v4/phrases/frequency/{id}": {
			"post": {
				"tags": [
					"messaging/saved-phrases"
				],
				"operationId": "trackSavedPhraseUsageFrequency",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Track phrase usage frequency",
				"description": "Doesn't appear to influence the phrase's sorting position in [Get saved phrases](/grindr-api/messaging/saved-phrases#get-saved-phrases) response. Increments value in [Get saved phrases (legacy)](/grindr-api/messaging/saved-phrases#get-saved-phrases-legacy) endpoint."
			}
		},
		"/v?/users/registration/email": {
			"post": {
				"tags": [
					"settings/account"
				],
				"operationId": "createAccountEmail",
				"summary": "Create account via email",
				"x-wip": true,
				"x-wip-note": "URL is dynamic and currently unknown.",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "CreateAccountEmailRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "FirstPartyCreateAccountResponse"
								}
							}
						},
						"description": "OK"
					}
				}
			}
		},
		"/v8/sessions/thirdparty": {
			"post": {
				"tags": [
					"authentication"
				],
				"operationId": "loginThirdParty",
				"summary": "Login via third party",
				"x-wip": true,
				"description": "Single endpoint used for both **initial third-party sign-in** and **third-party session refresh**, distinguished by the request body shape (`oneOf`).\n\n**Google (vendor `2`):** the app obtains a Google *server auth code* on-device (`GoogleSignInOptions.requestServerAuthCode(...)`), exchanges it for a Google `access_token` via [Exchange Google auth code](#exchange-google-auth-code) (`POST /v3/users/thirdparty/exchange`), then sends that token here as `thirdPartyToken` (`ThirdPartyRequest`). **Facebook (vendor `1`)** sends its access token directly.\n\nWhen `registered` is `true`, `authenticationResponse` carries the session and the client stores `authToken`, `sessionId` (JWT), `profileId`, `thirdPartyUserId` and `thirdPartyUserIdToShow`. When `registered` is `false`, the identity has no account yet and the client continues to [Create third party account](#create-third-party-account).\n\n**Session refresh** reuses this same URL with `ThirdPartySessionRequest` (`{ thirdPartyUserId, authToken, geohash }`): the provider token is **not** re-sent — only the stable `thirdPartyUserId` and the rolling Grindr `authToken`. The response is the same `ThirdPartyAuthResponse`, yielding a fresh `sessionId` (JWT) and a rotated `authToken`.",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"oneOf": [
									{
										"$ref": "#/components/schemas/ThirdPartyRequest"
									},
									{
										"$ref": "#/components/schemas/ThirdPartySessionRequest"
									}
								]
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ThirdPartyAuthResponse"
								}
							}
						},
						"description": "OK"
					}
				}
			}
		},
		"/v3/users/password-validation": {
			"post": {
				"tags": [
					"settings/account"
				],
				"operationId": "validatePasswordComplexity",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "ValidatePasswordComplexityRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Validate password complexity",
				"x-wip": true
			}
		},
		"/v3/gcm-push-tokens": {
			"post": {
				"tags": [
					"settings/account"
				],
				"operationId": "registerFcmPushToken",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "FcmPushRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "Register FCM push token",
				"x-wip": true
			}
		},
		"/v3/users/update-password": {
			"post": {
				"tags": [
					"settings/account"
				],
				"operationId": "updatePassword",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "ChangePasswordRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "ChangePasswordResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Update password",
				"x-wip": true
			}
		},
		"/v3/users/email": {
			"post": {
				"tags": [
					"settings/account"
				],
				"operationId": "updateAccountEmail",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "UpdateEmailRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AuthSessionResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Update account email",
				"x-wip": true
			}
		},
		"/v4/sms/users/update-password": {
			"post": {
				"tags": [
					"settings/account"
				],
				"operationId": "updatePasswordPhone",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "ChangePasswordPhoneRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "ChangePasswordResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Update password via phone",
				"x-wip": true
			}
		},
		"/v7/users/thirdparty": {
			"post": {
				"tags": [
					"settings/account"
				],
				"operationId": "createThirdPartyAccount",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "CreateThirdPartyAccountRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "ThirdPartyCreateAccountResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Create third party account",
				"x-wip": true,
				"description": "Creates a Grindr account for a third-party identity, used when [Login via third party](#login-via-third-party) returns `registered: false`. The endpoint version is chosen from the first-party reCAPTCHA [assignment](/grindr-api/analytics/assignments): reCAPTCHA disabled → `POST /v7/users/thirdparty` (this endpoint); reCAPTCHA enabled → `POST /v8/users/thirdparty`, or `POST /v8/dev/users/thirdparty` when a dummy captcha token is used. The body is `CreateThirdPartyAccountRequest` in all variants."
			}
		},
		"/v3/users/forgot-password": {
			"post": {
				"tags": [
					"settings/account"
				],
				"operationId": "forgotPassword",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "ForgotPwdEmailRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "ForgotPwdEmailResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Forgot password",
				"x-wip": true
			}
		},
		"/v3/users/thirdparty/exchange": {
			"post": {
				"tags": [
					"authentication"
				],
				"operationId": "exchangeGoogleAccessToken",
				"summary": "Exchange Google auth code",
				"x-wip": true,
				"description": "First step of the **Google** sign-in flow. The app sends the Google *server auth code* (`serverAuthCode` from the native Google Sign-In result, requested against server client id `1036042917246-68g7siev1clho9lhqevahao9hlbpvssf.apps.googleusercontent.com`). The backend holds the matching web-client secret, performs the authorization-code → token exchange with Google, and returns the Google OAuth tokens. The client keeps `access_token` and passes it as `thirdPartyToken` to [Login via third party](#login-via-third-party). Session refreshes do not repeat this step.",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/GoogleAccessTokenRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/GoogleAccessTokenResponse"
								}
							}
						},
						"description": "OK"
					}
				}
			}
		},
		"/v4/sms/sessions": {
			"post": {
				"tags": [
					"settings/account"
				],
				"operationId": "createPhoneSession",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "LoginPhoneRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AuthSessionResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Create phone session",
				"x-wip": true
			}
		},
		"/v3/me/prefs/settings": {
			"get": {
				"tags": [
					"settings/account"
				],
				"operationId": "getAccountPreferences",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AccountPreferences"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get preferences"
			},
			"put": {
				"tags": [
					"settings/account"
				],
				"operationId": "setAccountPreferences",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/AccountPreferencesUpdate"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Set preferences"
			}
		},
		"/v1/visiting/settings": {
			"get": {
				"tags": [
					"settings/account"
				],
				"operationId": "getVisitingSettings",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/VisitingSettings"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get visiting settings"
			},
			"put": {
				"tags": [
					"settings/account"
				],
				"operationId": "setVisitingSettings",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/VisitingSettings"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Set visiting settings"
			}
		},
		"/v1/visiting/home": {
			"get": {
				"tags": [
					"settings/account"
				],
				"operationId": "getHomeLocation",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/HomeLocation"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get home location"
			},
			"put": {
				"tags": [
					"settings/account"
				],
				"operationId": "setHomeLocation",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/HomeLocationMutation"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/HomeLocation"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Set home location"
			}
		},
		"/v4/sms/verification/{profileId}/sendcode": {
			"post": {
				"tags": [
					"settings/sms-verification"
				],
				"operationId": "sendSmsVerificationCode",
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/SmsSendCodeRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SmsCodeResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Send SMS code"
			}
		},
		"/v4/sms/verification/{profileId}/verifycode": {
			"post": {
				"tags": [
					"settings/sms-verification"
				],
				"operationId": "verifySmsVerificationCode",
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"requestBody": {
					"required": false,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								]
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SmsCodeResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Verify SMS code"
			}
		},
		"/v4/sms/users/update-password/sendcode": {
			"post": {
				"tags": [
					"settings/sms-verification"
				],
				"operationId": "sendPasswordChangeSmsCode",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/SmsSendCodeRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "Request SMS code for password change"
			}
		},
		"/v4/sms/sendcode": {
			"post": {
				"tags": [
					"settings/sms-verification"
				],
				"operationId": "sendLegacySmsCode",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/SmsSendCodeRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "Send SMS code (legacy)",
				"x-wip": true,
				"x-legacy": true
			}
		},
		"/v4/sms/verifycode": {
			"post": {
				"tags": [
					"settings/sms-verification"
				],
				"operationId": "verifyLegacySmsCode",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/SmsVerifyCodeLegacyRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Verify SMS code (legacy)",
				"x-legacy": true
			}
		},
		"/v4/recognition/face": {
			"post": {
				"tags": [
					"settings/sms-verification"
				],
				"operationId": "submitFaceRecognition",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Face recognition",
				"x-wip": true
			}
		},
		"/api/token": {
			"post": {
				"tags": [
					"settings/sms-verification",
					"third-party-integrations/spotify"
				],
				"operationId": "requestSpotifyToken",
				"requestBody": {
					"required": true,
					"content": {
						"application/x-www-form-urlencoded": {
							"schema": {
								"type": "object",
								"additionalProperties": {
									"type": "string"
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "SpotifyAuthResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true,
				"summary": "Spotify token",
				"x-notes": [
					"Body is URL-encoded (grant_type=authorization_code&code=...&redirect_uri=... or grant_type=refresh_token&refresh_token=... or grant_type=client_credentials)."
				]
			}
		},
		"/v3/me/profile": {
			"delete": {
				"tags": [
					"settings/sms-verification"
				],
				"operationId": "deleteAccount",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "Delete account",
				"x-wip": true
			}
		},
		"/v4/spotify/favorites/{profileId}": {
			"get": {
				"tags": [
					"third-party-integrations/spotify"
				],
				"operationId": "getSpotifyFavorites",
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "SpotifyBackendResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v4/spotify/favorites": {
			"post": {
				"tags": [
					"third-party-integrations/spotify"
				],
				"operationId": "postSpotifyFavorites",
				"requestBody": {
					"required": false,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								],
								"x-original-type": "SpotifyPostRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/search": {
			"get": {
				"tags": [
					"third-party-integrations/spotify"
				],
				"operationId": "searchSpotifyTracks",
				"parameters": [
					{
						"name": "q",
						"in": "query",
						"schema": {
							"type": "string"
						}
					},
					{
						"name": "type",
						"in": "query",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "SpotifySearchTrackResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/tracks": {
			"get": {
				"tags": [
					"third-party-integrations/spotify"
				],
				"operationId": "getSpotifyTracks",
				"parameters": [
					{
						"name": "ids",
						"in": "query",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "SpotifyGetTrackResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/me/player/recently-played": {
			"get": {
				"tags": [
					"third-party-integrations/spotify"
				],
				"operationId": "getSpotifyRecentlyPlayed",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "SpotifyRecentlyPlayedResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v3/me/favorites/{profileId}": {
			"post": {
				"tags": [
					"users/favorites"
				],
				"operationId": "addFavorite",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"additionalProperties": false
								}
							}
						},
						"description": "Empty object (`{}`)."
					}
				},
				"summary": "Add favorite"
			},
			"delete": {
				"tags": [
					"users/favorites"
				],
				"operationId": "removeFavorite",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"additionalProperties": false
								}
							}
						},
						"description": "Empty object (`{}`)."
					}
				},
				"summary": "Remove favorite"
			}
		},
		"/v1/favorites/notes": {
			"get": {
				"tags": [
					"users/favorites"
				],
				"operationId": "getFavoriteNotes",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/FavoriteNoteWithCounterparty"
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get all notes"
			}
		},
		"/v1/favorites/notes/{targetProfileId}": {
			"get": {
				"tags": [
					"users/favorites"
				],
				"operationId": "getFavoriteNote",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "targetProfileId",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int64"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FavoriteNote"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get note"
			},
			"put": {
				"tags": [
					"users/favorites"
				],
				"operationId": "putFavoriteNote",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "targetProfileId",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int64"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/FavoriteNote"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty, HTTP status 204."
					},
					"204": {
						"description": "No Content"
					}
				},
				"summary": "Add note",
				"description": "The `counterpartyId` parameter seems to be ignored, it's unknown what its purpose is."
			},
			"delete": {
				"tags": [
					"users/favorites"
				],
				"operationId": "deleteFavoriteNote",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "targetProfileId",
						"in": "path",
						"required": true,
						"schema": {
							"type": "integer",
							"format": "int64"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "Delete note",
				"description": "Essentially equivalent to [Add note](/grindr-api/users/favorites#add-note) with `notes` set to `\"\"`."
			}
		},
		"/v1/tags": {
			"get": {
				"tags": [
					"users/profiles"
				],
				"operationId": "getProfileTags",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/ProfileTagLanguage"
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Profile tags"
			}
		},
		"/v7/profiles/{id}": {
			"get": {
				"tags": [
					"users/profiles"
				],
				"operationId": "getProfileById",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string",
							"pattern": "^[0-9]+$"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"profiles": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/Profile"
											},
											"minItems": 1,
											"maxItems": 1
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get a profile by ID"
			}
		},
		"/v3/profiles": {
			"post": {
				"tags": [
					"users/profiles"
				],
				"operationId": "getProfilesById",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"properties": {
									"targetProfileIds": {
										"type": "array",
										"items": {
											"type": "string",
											"pattern": "^[0-9]+$"
										},
										"maxItems": 150,
										"description": "array of strings with numeric ids, max profiles number per one request is 150"
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"profiles": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/ProfileSummaryWithRightNow"
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get multiple profiles by ID"
			}
		},
		"/v3.1/me/profile": {
			"put": {
				"tags": [
					"users/profiles"
				],
				"operationId": "replaceOwnProfile",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/Profile"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "Update own profile (full)",
				"description": "[Profile](/grindr-api/users/profiles#profile) object, fully replaces current version.",
				"x-wip": true
			}
		},
		"/v4/me/profile": {
			"patch": {
				"tags": [
					"users/profiles"
				],
				"operationId": "patchOwnProfile",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ProfilePatch"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "Update own profile (partial)",
				"description": "[Profile](/grindr-api/users/profiles#profile) object, only updates specified keys.",
				"x-wip": true
			}
		},
		"/v4/profile-tags/suggestions": {
			"put": {
				"tags": [
					"users/profiles"
				],
				"operationId": "suggestProfileTag",
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"allOf": [
									{
										"$ref": "#/components/schemas/UndocumentedObject"
									}
								]
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"summary": "Profile tags suggestions",
				"x-wip": true
			}
		},
		"/v5/profile-tags/translations": {
			"get": {
				"tags": [
					"users/profiles"
				],
				"operationId": "getProfileTagTranslations",
				"parameters": [
					{
						"$ref": "#/components/parameters/LocaleHeader"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Profile tags translations",
				"x-wip": true
			}
		},
		"/v5/chat/media/upload": {
			"post": {
				"tags": [
					"users/profiles"
				],
				"operationId": "uploadChatMedia",
				"parameters": [
					{
						"name": "length",
						"in": "query",
						"schema": {
							"type": "integer",
							"format": "int64"
						},
						"required": true
					},
					{
						"name": "looping",
						"in": "query",
						"schema": {
							"type": "boolean"
						},
						"required": true
					},
					{
						"name": "takenOnGrindr",
						"in": "query",
						"schema": {
							"type": "boolean"
						},
						"required": true
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/octet-stream": {
							"schema": {
								"type": "string",
								"format": "binary"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ChatMediaUploadResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Upload media",
				"description": "Correct request's `Content-Type` header is required."
			}
		},
		"/v4/media/upload": {
			"post": {
				"tags": [
					"users/profiles"
				],
				"operationId": "uploadProfileMedia",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "thumbCoords",
						"in": "query",
						"schema": {
							"$ref": "#/components/schemas/RectFString"
						},
						"required": true
					},
					{
						"name": "takenOnGrindr",
						"in": "query",
						"schema": {
							"type": "boolean"
						},
						"required": true
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/octet-stream": {
							"schema": {
								"type": "string",
								"format": "binary"
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/LegacyMediaUploadResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Upload media (legacy)",
				"description": "You must ensure thumbCoords's width and height dimensions are equal, i.e. y2-y1 must equal to x2-x1. Submitting non-square thumbnail won't trigger any errors and it will be uploaded to CDN, however attempting to use such illegal thumbnail dimensions image in [Edit profile photos](/grindr-api/users/profiles#edit-profile-photos) will result in it being silently dropped/skipped.\n\nAlso there is a legacy `POST /v3/me/profile/images`.",
				"x-legacy": true
			}
		},
		"/v3/me/profile/images": {
			"put": {
				"tags": [
					"users/profiles"
				],
				"operationId": "editProfilePhotos",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/EditProfilePhotosRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Edit profile photos",
				"description": "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`.\n\nSupplied images must have square thumbnails, otherwise they will be silently skipped. See [Upload media](/grindr-api/users/profiles#upload-media).\n\nRepeating `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 official mobile client seems to drop repeating media when processing `secondaryImageHashes` response."
			},
			"delete": {
				"tags": [
					"users/profiles"
				],
				"operationId": "deleteProfilePhotos",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/DeleteProfilePhotosRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty."
					}
				},
				"summary": "Delete profile photos",
				"description": "This endpoint removes photo from your profile as well as deletes the media from CDN.",
				"x-body-label": "Body (yes, body, not query):"
			}
		},
		"/v3.1/me/profile/images": {
			"get": {
				"tags": [
					"users/profiles"
				],
				"operationId": "getMyProfilePhotos",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"medias": {
											"type": "array",
											"items": {
												"$ref": "#/components/schemas/ProfileImageState"
											}
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get my profile photos"
			}
		},
		"/v4/profiles/reachable": {
			"post": {
				"tags": [
					"users/profiles"
				],
				"operationId": "checkProfilesReachable",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"properties": {
									"profileIds": {
										"type": "array",
										"items": {
											"type": "string",
											"pattern": "^[0-9]+$"
										},
										"description": "array of strings with numeric ids"
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"profileIds": {
											"type": "array",
											"items": {
												"type": "string",
												"pattern": "^[0-9]+$"
											},
											"description": "array of strings with numeric ids"
										}
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Check if profiles are reachable",
				"x-wip": true
			}
		},
		"/v1/profile-insights/{profileId}": {
			"get": {
				"tags": [
					"users/profiles"
				],
				"operationId": "getProfileInsightsV1",
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get profile insights v1",
				"x-wip": true
			}
		},
		"/v2/profile-insights/{profileId}": {
			"get": {
				"tags": [
					"users/profiles"
				],
				"operationId": "getProfileInsightsV2",
				"parameters": [
					{
						"$ref": "#/components/parameters/ProfileIdIntegerPath"
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get profile insights v2",
				"x-wip": true
			}
		},
		"/v1/pronouns": {
			"get": {
				"tags": [
					"users/profiles"
				],
				"operationId": "getPronouns",
				"x-notes": [
					"Gender and pronouns are **managed fields** — profile fields that aren't hardcoded but pulled dynamically from the server."
				],
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/Pronoun"
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get pronouns"
			}
		},
		"/public/v2/genders": {
			"get": {
				"tags": [
					"users/profiles"
				],
				"operationId": "getGendersV2",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/Gender"
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get genders"
			}
		},
		"/public/v1/genders": {
			"get": {
				"tags": [
					"users/profiles"
				],
				"operationId": "getGendersV1Alias",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"type": "array",
									"items": {
										"$ref": "#/components/schemas/Gender"
									}
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get genders (v1 alias)",
				"x-legacy": true
			}
		},
		"/v4/genderpronoun/suggestions": {
			"put": {
				"tags": [
					"users/profiles"
				],
				"operationId": "suggestGenderOrPronoun",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/GenderPronounSuggestionRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Empty"
					}
				},
				"summary": "Suggest gender or pronoun"
			}
		},
		"/v1/random-images/foryou": {
			"get": {
				"tags": [
					"woodwork/random-promotion-images"
				],
				"operationId": "getRandomForYouImages",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "count",
						"in": "query",
						"schema": {
							"type": "integer",
							"minimum": 1,
							"maximum": 4,
							"description": "capped in range [1, 4]"
						}
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/RandomPromotionImagesResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"summary": "Get a random \"For You\" collection image"
			}
		},
		"/v1/ws": {
			"get": {
				"tags": [
					"websocket"
				],
				"operationId": "openWebSocketConnection",
				"servers": [
					{
						"url": "wss://grindr.mobi"
					}
				],
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"101": {
						"description": "Switching Protocols"
					}
				}
			}
		},
		"/v1/store/googleplay/products/profile_drawer": {
			"get": {
				"tags": [
					"storeapirest"
				],
				"operationId": "getStoreProductsProfileDrawer",
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UndocumentedObject",
									"x-original-type": "StoreResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/reddot": {
			"get": {
				"tags": [
					"reddot"
				],
				"operationId": "getRedDot",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"responses": {
					"200": {
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/RedDotListResponse"
								}
							}
						},
						"description": "OK"
					}
				},
				"x-wip": true
			}
		},
		"/v1/reddot/{type}": {
			"post": {
				"tags": [
					"reddot"
				],
				"operationId": "markRedDot",
				"security": [
					{
						"Grindr3Auth": []
					}
				],
				"parameters": [
					{
						"name": "type",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "OK"
					}
				},
				"x-wip": true
			}
		}
	},
	"components": {
		"securitySchemes": {
			"Grindr3Auth": {
				"type": "apiKey",
				"in": "header",
				"name": "Authorization"
			}
		},
		"parameters": {
			"LocaleHeader": {
				"name": "L-Locale",
				"in": "header",
				"required": true,
				"schema": {
					"type": "string"
				}
			},
			"GenericIdPath": {
				"name": "id",
				"in": "path",
				"required": true,
				"schema": {
					"type": "string"
				}
			},
			"VersionPath": {
				"name": "version",
				"in": "path",
				"required": true,
				"schema": {
					"type": "string"
				}
			},
			"ProfileIdIntegerPath": {
				"name": "profileId",
				"in": "path",
				"required": true,
				"schema": {
					"type": "integer",
					"format": "int64"
				}
			},
			"ProfileIdStringPath": {
				"name": "profileId",
				"in": "path",
				"required": true,
				"schema": {
					"type": "string",
					"pattern": "^[0-9]+$"
				}
			},
			"ConversationIdPath": {
				"name": "conversationId",
				"in": "path",
				"required": true,
				"schema": {
					"$ref": "#/components/schemas/ConversationId"
				}
			},
			"MessageIdPath": {
				"name": "messageId",
				"in": "path",
				"required": true,
				"schema": {
					"type": "string"
				}
			},
			"AlbumIdPath": {
				"name": "albumId",
				"in": "path",
				"required": true,
				"schema": {
					"type": "integer",
					"format": "int64"
				}
			},
			"ContentIdPath": {
				"name": "contentId",
				"in": "path",
				"required": true,
				"schema": {
					"type": "integer",
					"format": "int64"
				}
			},
			"MediaIdPath": {
				"name": "mediaId",
				"in": "path",
				"required": true,
				"schema": {
					"type": "integer",
					"format": "int64"
				}
			},
			"NearbyGeoHashQuery": {
				"name": "nearbyGeoHash",
				"in": "query",
				"schema": {
					"$ref": "#/components/schemas/Geohash"
				},
				"required": true
			},
			"ExploreGeoHashQuery": {
				"name": "exploreGeoHash",
				"in": "query",
				"schema": {
					"$ref": "#/components/schemas/Geohash"
				}
			},
			"GridPhotoOnlyQuery": {
				"name": "photoOnly",
				"in": "query",
				"schema": {
					"type": "boolean"
				}
			},
			"GridFaceOnlyQuery": {
				"name": "faceOnly",
				"in": "query",
				"schema": {
					"type": "boolean"
				}
			},
			"GridNotRecentlyChattedQuery": {
				"name": "notRecentlyChatted",
				"in": "query",
				"schema": {
					"type": "boolean"
				}
			},
			"GridHasAlbumQuery": {
				"name": "hasAlbum",
				"in": "query",
				"schema": {
					"type": "boolean"
				}
			},
			"GridFreshQuery": {
				"name": "fresh",
				"in": "query",
				"schema": {
					"type": "boolean"
				}
			},
			"GridGendersQuery": {
				"name": "genders",
				"in": "query",
				"schema": {
					"type": "string",
					"description": "string, see [Get genders](/grindr-api/users/profiles#get-genders)"
				}
			},
			"GridPageNumberQuery": {
				"name": "pageNumber",
				"in": "query",
				"schema": {
					"type": "integer"
				}
			},
			"CascadeOnlineOnlyQuery": {
				"name": "onlineOnly",
				"in": "query",
				"schema": {
					"type": "boolean"
				}
			},
			"CascadeAgeMinQuery": {
				"name": "ageMin",
				"in": "query",
				"schema": {
					"type": "integer"
				}
			},
			"CascadeAgeMaxQuery": {
				"name": "ageMax",
				"in": "query",
				"schema": {
					"type": "integer"
				}
			},
			"CascadeHeightCmMinQuery": {
				"name": "heightCmMin",
				"in": "query",
				"schema": {
					"type": "number",
					"format": "float"
				}
			},
			"CascadeHeightCmMaxQuery": {
				"name": "heightCmMax",
				"in": "query",
				"schema": {
					"type": "number",
					"format": "float"
				}
			},
			"CascadeWeightGramsMinQuery": {
				"name": "weightGramsMin",
				"in": "query",
				"schema": {
					"type": "number",
					"format": "float"
				}
			},
			"CascadeWeightGramsMaxQuery": {
				"name": "weightGramsMax",
				"in": "query",
				"schema": {
					"type": "number",
					"format": "float"
				}
			},
			"CascadeTribesQuery": {
				"name": "tribes",
				"in": "query",
				"schema": {
					"type": "string",
					"description": "string, see [Tribes](/grindr-api/users/profiles#tribes)"
				}
			},
			"CascadeLookingForQuery": {
				"name": "lookingFor",
				"in": "query",
				"schema": {
					"type": "string",
					"description": "string, see [Looking for](/grindr-api/users/profiles#looking-for)"
				}
			},
			"CascadeRelationshipStatusesQuery": {
				"name": "relationshipStatuses",
				"in": "query",
				"schema": {
					"type": "string",
					"description": "string, see [Relationship status](/grindr-api/users/profiles#relationship-status)"
				}
			},
			"CascadeBodyTypesQuery": {
				"name": "bodyTypes",
				"in": "query",
				"schema": {
					"type": "string",
					"description": "string, see [Body type](/grindr-api/users/profiles#body-type)"
				}
			},
			"CascadeSexualPositionsQuery": {
				"name": "sexualPositions",
				"in": "query",
				"schema": {
					"type": "string",
					"description": "array of integers concatenated with a `,`, see [Sexual position ID](/grindr-api/users/profiles#sexual-position-id)"
				}
			},
			"CascadeMeetAtQuery": {
				"name": "meetAt",
				"in": "query",
				"schema": {
					"type": "string",
					"description": "string, see [Meet at](/grindr-api/users/profiles#meet-at)"
				}
			},
			"CascadeNsfwPicsQuery": {
				"name": "nsfwPics",
				"in": "query",
				"schema": {
					"type": "string",
					"description": "string, see [Accept NSFW pics](/grindr-api/users/profiles#accept-nsfw-pics)"
				}
			},
			"CascadeTagsQuery": {
				"name": "tags",
				"in": "query",
				"schema": {
					"type": "string",
					"description": "string, see [Profile tags](/grindr-api/users/profiles#profile-tags)"
				}
			},
			"CascadeRightNowQuery": {
				"name": "rightNow",
				"in": "query",
				"schema": {
					"type": "boolean"
				}
			},
			"CascadeFavoritesQuery": {
				"name": "favorites",
				"in": "query",
				"schema": {
					"type": "boolean"
				}
			},
			"CascadeShowSponsoredProfilesQuery": {
				"name": "showSponsoredProfiles",
				"in": "query",
				"schema": {
					"type": "boolean"
				}
			},
			"CascadeShuffleQuery": {
				"name": "shuffle",
				"in": "query",
				"schema": {
					"type": "boolean"
				}
			},
			"CascadeHotQuery": {
				"name": "hot",
				"in": "query",
				"schema": {
					"type": "boolean"
				}
			}
		},
		"schemas": {
			"UndocumentedObject": {
				"type": "object",
				"additionalProperties": true,
				"description": "Placeholder for a response or request body whose shape has not yet been documented.",
				"x-wip": true,
				"x-render-on-tag": "shared-types",
				"x-exclude-from-markdown": true
			},
			"TimestampMs": {
				"type": "integer",
				"format": "int64",
				"description": "unix timestamp in milliseconds"
			},
			"Geohash": {
				"type": "string",
				"minLength": 12,
				"maxLength": 12,
				"description": "Grindr requires geohash to be exactly 12 characters long. <https://en.wikipedia.org/wiki/Geohash>\n\nExample: `ezjmgyern222` (Madrid, Spain)\n\n> [!WARNING]\n>\n> Setting geohash inside of United Kingdom will lead to the account being locked and resetting geohash being impossible until you submit legal documents for age verification.\n\nGeohash explorer: <https://geohash.softeng.co/>",
				"x-render-on-tag": "browse/location"
			},
			"ConversationId": {
				"type": "string",
				"pattern": "^[0-9]+:[0-9]+$",
				"description": "String with two long integers separated by `:`, e.g. `\"12345678:23456789\"`. Long integers are IDs of [Profile](/grindr-api/users/profiles#profile). The order of these IDs is always from smaller ID to higher ID, regardless of who started the chat.",
				"x-render-on-tag": "messaging/conversations",
				"x-display-name": "Conversation ID"
			},
			"RectFString": {
				"type": "string",
				"description": "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`.",
				"x-render-on-tag": "users/profiles",
				"x-display-name": "RectF"
			},
			"RightNowStatus": {
				"type": "string",
				"enum": [
					"NOT_ACTIVE",
					"HOSTING",
					"NOT_HOSTING"
				],
				"x-render-on-tag": "right-now"
			},
			"ViewSourceEnum": {
				"type": "string",
				"enum": [
					"DISCOVER",
					"FOR_YOU",
					"UNKNOWN"
				],
				"description": "View source.",
				"x-enum-labels": {
					"DISCOVER": "DISCOVER",
					"FOR_YOU": "FOR_YOU",
					"UNKNOWN": "(fallback)"
				},
				"x-render-on-tag": "interest/views"
			},
			"TapType": {
				"type": "integer",
				"enum": [
					0,
					1,
					2,
					3
				],
				"description": "Tap ID.",
				"x-enum-labels": {
					"0": "FRIENDLY (\"hi\" or 🍪 based on client's rendering settings)",
					"1": "HOT (🔥)",
					"2": "LOOKING (😈)",
					"3": "NONE"
				},
				"x-render-on-tag": "interest/taps",
				"x-display-name": "Tap ID"
			},
			"SessionCreateRequest": {
				"type": "object",
				"properties": {
					"email": {
						"type": "string",
						"format": "email",
						"description": "string with email"
					},
					"password": {
						"type": "string",
						"description": "string with password, don't specify if using `authToken`"
					},
					"authToken": {
						"type": "string",
						"nullable": true,
						"description": "string obtained from login+password flow or `null`"
					},
					"token": {
						"type": "string",
						"nullable": true,
						"description": "FCM (push service) string or `null`"
					},
					"geohash": {
						"nullable": true,
						"description": "[geohash](/grindr-api/browse/location#geohash) string or `null`",
						"allOf": [
							{
								"$ref": "#/components/schemas/Geohash"
							}
						]
					}
				},
				"x-render-on-tag": "authentication",
				"required": [
					"email",
					"password",
					"authToken",
					"token",
					"geohash"
				]
			},
			"SessionCreateRequestV9": {
				"description": "Request body for [Sign in via reCAPTCHA](#sign-in-via-recaptcha) (`POST /v9/sessions`). Identical to `SessionCreateRequest` plus one extra field, `captchaToken`. The client uses this shape only when the `recaptcha_first_party` [assignment](/grindr-api/analytics/assignments) is enabled for the device.",
				"allOf": [
					{
						"$ref": "#/components/schemas/SessionCreateRequest"
					},
					{
						"type": "object",
						"properties": {
							"captchaToken": {
								"type": "string",
								"nullable": true,
								"description": "reCAPTCHA Enterprise token for the `FirstPartyLogin` action. Non-null for the email + password sign-in; `null` for the `authToken` session-refresh flow. The token is only fetched by device when the `recaptcha_first_party` assignment is enabled."
							}
						}
					}
				],
				"x-render-on-tag": "authentication",
				"required": [
					"captchaToken"
				]
			},
			"AuthSessionResponse": {
				"type": "object",
				"properties": {
					"profileId": {
						"type": "string",
						"pattern": "^[0-9]+$",
						"description": "string with numbers, account's ID"
					},
					"sessionId": {
						"$ref": "#/components/schemas/SessionId"
					},
					"authToken": {
						"type": "string",
						"description": "Auth token for session refresh"
					}
				},
				"x-render-on-tag": "authentication",
				"required": [
					"profileId",
					"sessionId",
					"authToken"
				]
			},
			"GoogleAccessTokenRequest": {
				"type": "object",
				"description": "Request body for [Exchange Google auth code](#exchange-google-auth-code) (`POST /v3/users/thirdparty/exchange`). Wraps the Google *server auth code* obtained on-device from native Google Sign-In.",
				"properties": {
					"code": {
						"type": "string",
						"description": "Google OAuth 2.0 server auth code (`serverAuthCode` from the Google Sign-In result)."
					}
				},
				"required": [
					"code"
				],
				"x-render-on-tag": "authentication"
			},
			"GoogleAccessTokenResponse": {
				"type": "object",
				"description": "Response from [Exchange Google auth code](#exchange-google-auth-code). Standard Google OAuth 2.0 token payload returned after the backend exchanges the server auth code. The client keeps only `access_token`, which it passes as `thirdPartyToken` to [Login via third party](#login-via-third-party).",
				"properties": {
					"access_token": {
						"type": "string",
						"description": "Google OAuth access token. Used as `thirdPartyToken` in `POST /v8/sessions/thirdparty`."
					},
					"token_type": {
						"type": "string",
						"description": "OAuth token type, e.g. `\"Bearer\"`."
					},
					"id_token": {
						"type": "string",
						"description": "Google OpenID Connect ID token (JWT)."
					},
					"expires_in": {
						"type": "integer",
						"format": "int64",
						"description": "Access token lifetime in seconds."
					}
				},
				"required": [
					"access_token",
					"token_type",
					"id_token",
					"expires_in"
				],
				"x-render-on-tag": "authentication"
			},
			"ThirdPartyRequest": {
				"type": "object",
				"description": "Request body for the **initial** [Login via third party](#login-via-third-party) (`POST /v8/sessions/thirdparty`). For Google, `thirdPartyToken` is the `access_token` from [Exchange Google auth code](#exchange-google-auth-code); for Facebook it is the Facebook access token.",
				"properties": {
					"thirdPartyVendor": {
						"type": "integer",
						"enum": [
							1,
							2
						],
						"description": "`1` — Facebook, `2` — Google",
						"x-enum-labels": {
							"1": "Facebook",
							"2": "Google"
						}
					},
					"thirdPartyToken": {
						"type": "string",
						"description": "Provider access token (Google `access_token` / Facebook token)."
					},
					"geohash": {
						"nullable": true,
						"description": "[geohash](/grindr-api/browse/location#geohash) string or `null`",
						"allOf": [
							{
								"$ref": "#/components/schemas/Geohash"
							}
						]
					}
				},
				"required": [
					"thirdPartyVendor",
					"thirdPartyToken"
				],
				"x-render-on-tag": "authentication"
			},
			"ThirdPartySessionRequest": {
				"type": "object",
				"description": "Request body for **session refresh** via third party, sent to the same `POST /v8/sessions/thirdparty` endpoint as the initial login. Used once a `thirdPartyUserId` is stored (account created/logged in via Google or Facebook). The provider token is **not** re-sent — only the stable `thirdPartyUserId` plus the stored Grindr `authToken`.",
				"properties": {
					"thirdPartyUserId": {
						"type": "string",
						"description": "Stable provider user id from the previous login (`authenticationResponse.thirdPartyUserId`)."
					},
					"authToken": {
						"type": "string",
						"description": "Grindr `authToken` from the previous session (rotated on every refresh)."
					},
					"geohash": {
						"nullable": true,
						"description": "[geohash](/grindr-api/browse/location#geohash) string or `null`",
						"allOf": [
							{
								"$ref": "#/components/schemas/Geohash"
							}
						]
					}
				},
				"required": [
					"thirdPartyUserId",
					"authToken"
				],
				"x-render-on-tag": "authentication"
			},
			"ThirdPartyAuthenticationResponse": {
				"type": "object",
				"description": "Session payload nested in `ThirdPartyAuthResponse.authenticationResponse`; present when `registered` is `true`. `sessionId` is the same JWT as in `AuthSessionResponse`.",
				"properties": {
					"profileId": {
						"type": "string",
						"pattern": "^[0-9]+$",
						"description": "Account ID."
					},
					"sessionId": {
						"$ref": "#/components/schemas/SessionId"
					},
					"authToken": {
						"type": "string",
						"description": "Auth token used for session refresh."
					},
					"thirdPartyUserId": {
						"type": "string",
						"description": "Stable provider user id; persisted and re-sent as `thirdPartyUserId` on refresh."
					},
					"thirdPartyUserIdToShow": {
						"type": "string",
						"description": "Display variant of the provider user id (e.g. email/handle)."
					}
				},
				"required": [
					"profileId",
					"sessionId",
					"authToken",
					"thirdPartyUserId",
					"thirdPartyUserIdToShow"
				],
				"x-render-on-tag": "authentication"
			},
			"ThirdPartyAuthResponse": {
				"type": "object",
				"description": "Response from [Login via third party](#login-via-third-party) and from third-party session refresh. When `registered` is `true`, `authenticationResponse` carries the session. When `registered` is `false`, no account is linked yet and the client proceeds to [Create third party account](#create-third-party-account) using `thirdPartyUserInfo`.",
				"properties": {
					"registered": {
						"type": "boolean",
						"description": "`true` if a Grindr account is already linked to this provider identity."
					},
					"thirdPartyUserInfo": {
						"nullable": true,
						"description": "Provider profile info used to pre-fill account creation when `registered` is `false`.",
						"allOf": [
							{
								"$ref": "#/components/schemas/UndocumentedObject"
							}
						]
					},
					"authenticationResponse": {
						"nullable": true,
						"description": "Session payload, present when `registered` is `true`.",
						"allOf": [
							{
								"$ref": "#/components/schemas/ThirdPartyAuthenticationResponse"
							}
						]
					}
				},
				"required": [
					"registered"
				],
				"x-render-on-tag": "authentication"
			},
			"NotificationsAckRequest": {
				"type": "object",
				"properties": {
					"notificationId": {
						"type": "string"
					},
					"source": {
						"type": "string",
						"enum": [
							"WEBSOCKET",
							"PUSH"
						],
						"description": "`\"WEBSOCKET\"` | `\"PUSH\"`, optional"
					}
				},
				"required": [
					"notificationId"
				],
				"x-render-on-tag": "notifications"
			},
			"Assignment": {
				"type": "object",
				"properties": {
					"key": {
						"type": "string",
						"description": "e.g. `\"ai-consent-2026\"`"
					},
					"value": {
						"type": "string",
						"description": "e.g. `\"off\"` or `\"on\"` or `\"Test\"`"
					},
					"payload": {
						"type": "object",
						"additionalProperties": true,
						"description": "arbitrary data object"
					},
					"type": {
						"type": "string",
						"description": "e.g. `\"FEATURE_FLAG\"` or `\"EXPERIMENT\"`"
					}
				},
				"x-render-on-tag": "analytics/assignments",
				"required": [
					"key",
					"value",
					"payload",
					"type"
				]
			},
			"DrawerMedia": {
				"type": "object",
				"properties": {
					"id": {
						"type": "integer",
						"format": "int64",
						"description": "long integer"
					},
					"url": {
						"type": "string",
						"format": "uri",
						"description": "URL"
					},
					"contentType": {
						"type": "string",
						"description": "string"
					},
					"createdTs": {
						"description": "unix timestamp in milliseconds",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"used": {
						"type": "boolean",
						"description": "boolean"
					},
					"takenOnGrindr": {
						"type": "boolean",
						"description": "boolean"
					}
				},
				"x-render-on-tag": "drawer",
				"required": [
					"id",
					"url",
					"contentType",
					"createdTs",
					"used",
					"takenOnGrindr"
				]
			},
			"Place": {
				"type": "object",
				"properties": {
					"name": {
						"type": "string"
					},
					"address": {
						"type": "string",
						"nullable": true,
						"description": "string or `null`"
					},
					"lat": {
						"type": "number"
					},
					"lon": {
						"type": "number"
					},
					"placeId": {
						"type": "string",
						"description": "string with number"
					},
					"importance": {
						"type": "number",
						"format": "float"
					}
				},
				"x-render-on-tag": "browse/location",
				"required": [
					"name",
					"address",
					"lat",
					"lon",
					"placeId",
					"importance"
				]
			},
			"LocationUpdateRequest": {
				"type": "object",
				"required": [
					"geohash"
				],
				"properties": {
					"geohash": {
						"$ref": "#/components/schemas/Geohash"
					}
				},
				"x-render-on-tag": "browse/location",
				"x-exclude-from-markdown": true
			},
			"SocialEvent": {
				"type": "object",
				"properties": {
					"socialEventId": {
						"type": "integer",
						"format": "int64"
					},
					"name": {
						"type": "string"
					},
					"location": {
						"type": "string"
					},
					"startTime": {
						"description": "unix timestamp in milliseconds",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"endTime": {
						"description": "unix timestamp in milliseconds",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"eventType": {
						"type": "string",
						"description": "e.g. `FESTIVAL` | `KINK` | `PRIDE`"
					},
					"eventImageUrl": {
						"type": "string",
						"format": "uri"
					},
					"imageSource": {
						"type": "string"
					},
					"region": {
						"type": "string"
					},
					"attendeesPreview": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"profileId": {
									"type": "integer",
									"format": "int64"
								},
								"profileImageUrl": {
									"type": "string",
									"description": "may be empty"
								}
							}
						}
					},
					"timezone": {
						"type": "string"
					},
					"isAttending": {
						"type": "boolean"
					}
				},
				"x-render-on-tag": "browse/social-events",
				"required": [
					"socialEventId",
					"name",
					"location",
					"startTime",
					"endTime",
					"eventType",
					"eventImageUrl",
					"imageSource",
					"region",
					"attendeesPreview",
					"timezone",
					"isAttending"
				]
			},
			"TravelPlanMutation": {
				"type": "object",
				"properties": {
					"travelPlanId": {
						"type": "integer",
						"format": "int64",
						"description": "required for update, ignored for create"
					},
					"profileId": {
						"type": "integer",
						"format": "int64"
					},
					"geohash": {
						"$ref": "#/components/schemas/Geohash"
					},
					"startDate": {
						"description": "unix timestamp in milliseconds",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"endDate": {
						"description": "unix timestamp in milliseconds",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"showOnProfile": {
						"type": "boolean"
					},
					"notes": {
						"type": "string"
					}
				},
				"x-render-on-tag": "browse/travels",
				"required": [
					"travelPlanId",
					"profileId",
					"geohash",
					"startDate",
					"endDate",
					"showOnProfile",
					"notes"
				]
			},
			"ProfileMaskedMin": {
				"type": "object",
				"properties": {
					"distance": {
						"type": "number",
						"nullable": true
					},
					"profileImageMediaHash": {
						"allOf": [
							{
								"$ref": "#/components/schemas/MediaHash"
							}
						],
						"nullable": true
					},
					"isFavorite": {
						"type": "boolean"
					}
				},
				"description": "Minimal masked profile.",
				"x-render-on-tag": "users/profiles",
				"required": [
					"distance",
					"profileImageMediaHash",
					"isFavorite"
				]
			},
			"ProfileMasked": {
				"allOf": [
					{
						"$ref": "#/components/schemas/ProfileMaskedMin"
					},
					{
						"type": "object",
						"properties": {
							"lastViewed": {
								"type": "number",
								"nullable": true
							},
							"seen": {
								"allOf": [
									{
										"$ref": "#/components/schemas/TimestampMs"
									}
								],
								"nullable": true
							},
							"rightNow": {
								"$ref": "#/components/schemas/RightNowStatus"
							},
							"sexualPosition": {
								"type": "integer",
								"nullable": true
							},
							"foundVia": {
								"allOf": [
									{
										"$ref": "#/components/schemas/ViewSourceEnum"
									}
								],
								"nullable": true
							}
						}
					}
				],
				"description": "Masked profile (extra fields revealed).",
				"x-render-on-tag": "users/profiles",
				"required": [
					"lastViewed",
					"seen",
					"rightNow"
				]
			},
			"ProfileMin": {
				"type": "object",
				"properties": {
					"profileId": {
						"type": "string",
						"pattern": "^[0-9]+$",
						"description": "string with numeric id"
					},
					"displayName": {
						"type": "string",
						"nullable": true
					},
					"onlineUntil": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						],
						"nullable": true
					}
				},
				"description": "Minimal profile fields.",
				"x-render-on-tag": "users/profiles",
				"required": [
					"profileId",
					"displayName"
				]
			},
			"ProfileMedia": {
				"type": "object",
				"properties": {
					"mediaHash": {
						"$ref": "#/components/schemas/MediaHash"
					},
					"type": {
						"type": "integer"
					},
					"state": {
						"type": "integer"
					},
					"reason": {
						"type": "string",
						"nullable": true
					},
					"takenOnGrindr": {
						"type": "boolean",
						"nullable": true
					},
					"createdAt": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						],
						"nullable": true
					}
				},
				"x-render-on-tag": "users/profiles",
				"required": [
					"mediaHash",
					"type",
					"state",
					"reason",
					"takenOnGrindr",
					"createdAt"
				]
			},
			"ProfileShort": {
				"allOf": [
					{
						"$ref": "#/components/schemas/ProfileMasked"
					},
					{
						"$ref": "#/components/schemas/ProfileMin"
					},
					{
						"type": "object",
						"properties": {
							"age": {
								"type": "integer",
								"nullable": true,
								"description": "may be `0`"
							},
							"showAge": {
								"type": "boolean"
							},
							"showDistance": {
								"type": "boolean"
							},
							"approximateDistance": {
								"type": "boolean"
							},
							"lastChatTimestamp": {
								"type": "number",
								"nullable": true,
								"description": "may be `0`"
							},
							"isNew": {
								"type": "boolean"
							},
							"lastUpdatedTime": {
								"type": "integer",
								"format": "int64",
								"description": "unix timestamp in milliseconds, may be `0`"
							},
							"medias": {
								"type": "array",
								"items": {
									"$ref": "#/components/schemas/ProfileMedia"
								}
							}
						}
					}
				],
				"description": "Short profile, combines ProfileMasked and ProfileMin.",
				"x-render-on-tag": "users/profiles",
				"required": [
					"age",
					"showAge",
					"showDistance",
					"approximateDistance",
					"lastChatTimestamp",
					"isNew",
					"lastUpdatedTime",
					"medias"
				]
			},
			"ProfileFields": {
				"type": "object",
				"properties": {
					"meetAt": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/MeetAt"
						}
					},
					"vaccines": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/Vaccine"
						}
					},
					"genders": {
						"type": "array",
						"items": {
							"type": "integer"
						}
					},
					"pronouns": {
						"type": "array",
						"items": {
							"type": "integer"
						}
					}
				},
				"description": "Optional profile fields.",
				"x-render-on-tag": "users/profiles"
			},
			"ProfileRightNow": {
				"type": "object",
				"properties": {
					"rightNowText": {
						"type": "string",
						"nullable": true
					},
					"rightNowPosted": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						],
						"nullable": true
					},
					"rightNowDistance": {
						"type": "integer",
						"format": "int64",
						"nullable": true
					},
					"rightNowThumbnailUrl": {
						"type": "string",
						"nullable": true
					},
					"rightNowFullImageUrl": {
						"type": "string",
						"nullable": true
					}
				},
				"description": "Right Now status info on a profile.",
				"x-render-on-tag": "users/profiles",
				"required": [
					"rightNowText",
					"rightNowPosted",
					"rightNowDistance",
					"rightNowThumbnailUrl",
					"rightNowFullImageUrl"
				]
			},
			"ProfileExtraFields": {
				"type": "object",
				"properties": {
					"nsfw": {
						"allOf": [
							{
								"$ref": "#/components/schemas/AcceptNsfwPics"
							}
						],
						"nullable": true
					},
					"verifiedInstagramId": {
						"type": "string",
						"nullable": true
					},
					"isBlockable": {
						"type": "boolean",
						"nullable": true
					},
					"showTribes": {
						"type": "boolean"
					},
					"showPosition": {
						"type": "boolean"
					}
				},
				"description": "Extra profile fields.",
				"x-render-on-tag": "users/profiles",
				"required": [
					"nsfw",
					"verifiedInstagramId",
					"isBlockable",
					"showTribes",
					"showPosition"
				]
			},
			"TravelPlanEmbedded": {
				"type": "object",
				"properties": {
					"endDate": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						],
						"nullable": true
					},
					"geohash": {
						"$ref": "#/components/schemas/Geohash"
					},
					"travelPlanId": {
						"type": "integer",
						"format": "int64",
						"nullable": true
					},
					"locationName": {
						"type": "string"
					},
					"showOnProfile": {
						"type": "boolean",
						"nullable": true
					},
					"startDate": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						],
						"nullable": true
					}
				},
				"x-render-on-tag": "users/profiles",
				"required": [
					"endDate",
					"geohash",
					"travelPlanId",
					"locationName",
					"showOnProfile",
					"startDate"
				]
			},
			"RightNowMedia": {
				"type": "object",
				"properties": {
					"mediaId": {
						"type": "integer",
						"format": "int64",
						"nullable": true
					},
					"thumbnailUrl": {
						"type": "string"
					},
					"fullImageUrl": {
						"type": "string"
					},
					"contentType": {
						"type": "string"
					},
					"isNsfw": {
						"type": "boolean",
						"nullable": true
					}
				},
				"x-render-on-tag": "users/profiles",
				"required": [
					"mediaId",
					"thumbnailUrl",
					"fullImageUrl",
					"contentType",
					"isNsfw"
				]
			},
			"Profile": {
				"allOf": [
					{
						"$ref": "#/components/schemas/ProfileShort"
					},
					{
						"$ref": "#/components/schemas/ProfileFields"
					},
					{
						"$ref": "#/components/schemas/ProfileRightNow"
					},
					{
						"$ref": "#/components/schemas/ProfileExtraFields"
					},
					{
						"type": "object",
						"properties": {
							"aboutMe": {
								"type": "string",
								"nullable": true
							},
							"ethnicity": {
								"allOf": [
									{
										"$ref": "#/components/schemas/Ethnicity"
									}
								],
								"nullable": true
							},
							"relationshipStatus": {
								"allOf": [
									{
										"$ref": "#/components/schemas/RelationshipStatus"
									}
								],
								"nullable": true
							},
							"grindrTribes": {
								"type": "array",
								"items": {
									"$ref": "#/components/schemas/Tribe"
								}
							},
							"lookingFor": {
								"type": "array",
								"items": {
									"$ref": "#/components/schemas/LookingFor"
								}
							},
							"bodyType": {
								"allOf": [
									{
										"$ref": "#/components/schemas/BodyType"
									}
								],
								"nullable": true
							},
							"hivStatus": {
								"allOf": [
									{
										"$ref": "#/components/schemas/HivStatus"
									}
								],
								"nullable": true
							},
							"lastTestedDate": {
								"allOf": [
									{
										"$ref": "#/components/schemas/TimestampMs"
									}
								],
								"nullable": true
							},
							"height": {
								"type": "number",
								"nullable": true,
								"description": "number in centimeters"
							},
							"weight": {
								"type": "number",
								"nullable": true,
								"description": "number in grams"
							},
							"socialNetworks": {
								"type": "object",
								"properties": {
									"twitter": {
										"allOf": [
											{
												"$ref": "#/components/schemas/SocialUserId"
											}
										],
										"description": "may be absent"
									},
									"facebook": {
										"allOf": [
											{
												"$ref": "#/components/schemas/SocialUserId"
											}
										],
										"description": "may be absent"
									},
									"instagram": {
										"allOf": [
											{
												"$ref": "#/components/schemas/SocialUserId"
											}
										],
										"description": "may be absent"
									}
								}
							},
							"identity": {
								"nullable": true
							},
							"hashtags": {
								"type": "array",
								"items": {}
							},
							"profileTags": {
								"type": "array",
								"items": {
									"type": "string"
								},
								"description": "array of [Profile tags](/grindr-api/users/profiles#profile-tags)"
							},
							"tapped": {
								"type": "boolean"
							},
							"tapType": {
								"nullable": true,
								"allOf": [
									{
										"$ref": "#/components/schemas/TapType"
									}
								]
							},
							"lastReceivedTapTimestamp": {
								"allOf": [
									{
										"$ref": "#/components/schemas/TimestampMs"
									}
								],
								"nullable": true
							},
							"isTeleporting": {
								"type": "boolean"
							},
							"isRoaming": {
								"type": "boolean"
							},
							"arrivalDays": {
								"type": "number",
								"nullable": true
							},
							"unreadCount": {
								"type": "number",
								"description": "number, may be absent"
							},
							"lastThrobTimestamp": {},
							"sexualHealth": {
								"type": "array",
								"items": {
									"$ref": "#/components/schemas/SexualHealth"
								}
							},
							"isVisiting": {
								"type": "boolean"
							},
							"travelPlans": {
								"type": "array",
								"items": {
									"$ref": "#/components/schemas/TravelPlanEmbedded"
								}
							},
							"isInAList": {
								"type": "boolean"
							},
							"tribesImInto": {
								"type": "array",
								"items": {
									"$ref": "#/components/schemas/Tribe"
								}
							},
							"showVipBadge": {
								"type": "boolean"
							},
							"rightNowShareLocation": {
								"type": "string",
								"nullable": true,
								"description": "`\"NONE\"` or `null`"
							},
							"rightNowMedias": {
								"type": "array",
								"items": {
									"$ref": "#/components/schemas/RightNowMedia"
								}
							}
						}
					}
				],
				"description": "Full profile object.",
				"x-render-on-tag": "users/profiles",
				"required": [
					"aboutMe",
					"ethnicity",
					"relationshipStatus",
					"grindrTribes",
					"lookingFor",
					"bodyType",
					"hivStatus",
					"lastTestedDate",
					"height",
					"weight",
					"socialNetworks",
					"identity",
					"hashtags",
					"profileTags",
					"tapped",
					"tapType",
					"lastReceivedTapTimestamp",
					"isTeleporting",
					"isRoaming",
					"arrivalDays",
					"lastThrobTimestamp",
					"sexualHealth",
					"isVisiting",
					"travelPlans",
					"isInAList",
					"tribesImInto",
					"showVipBadge",
					"rightNowShareLocation",
					"rightNowMedias"
				]
			},
			"ProfilePatch": {
				"allOf": [
					{
						"$ref": "#/components/schemas/Profile"
					}
				],
				"x-render-on-tag": "users/profiles"
			},
			"ProfileSummaryWithRightNow": {
				"allOf": [
					{
						"$ref": "#/components/schemas/ProfileShort"
					},
					{
						"$ref": "#/components/schemas/ProfileRightNow"
					}
				],
				"x-render-on-tag": "users/profiles",
				"required": [
					"distance",
					"profileImageMediaHash",
					"isFavorite",
					"lastViewed",
					"seen",
					"rightNow",
					"profileId",
					"displayName",
					"age",
					"showAge",
					"showDistance",
					"approximateDistance",
					"lastChatTimestamp",
					"isNew",
					"lastUpdatedTime",
					"medias",
					"rightNowText",
					"rightNowPosted",
					"rightNowDistance",
					"rightNowThumbnailUrl",
					"rightNowFullImageUrl"
				]
			},
			"SocialUserId": {
				"type": "object",
				"properties": {
					"userId": {
						"type": "string",
						"nullable": true,
						"description": "string, username"
					},
					"site": {
						"description": "e.g. `\"twitter\"` | `\"facebook\"` | `\"instagram\"`"
					}
				},
				"description": "Social network user reference.",
				"x-render-on-tag": "users/profiles",
				"x-display-name": "SocialNetwork",
				"required": [
					"site",
					"userId"
				]
			},
			"ProfileTagLanguage": {
				"type": "object",
				"properties": {
					"language": {
						"type": "string"
					},
					"categoryCollection": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"text": {
									"type": "string"
								},
								"possessiveText": {
									"type": "string",
									"nullable": true
								},
								"tags": {
									"type": "array",
									"items": {
										"type": "object",
										"properties": {
											"tagId": {
												"type": "integer"
											},
											"text": {
												"type": "string"
											},
											"key": {
												"type": "string"
											}
										}
									}
								}
							}
						}
					}
				},
				"x-render-on-tag": "users/profiles",
				"required": [
					"language",
					"categoryCollection"
				]
			},
			"ChatMediaUploadResponse": {
				"type": "object",
				"properties": {
					"mediaId": {
						"type": "integer",
						"format": "int64"
					},
					"mediaHash": {
						"$ref": "#/components/schemas/MediaHash"
					},
					"url": {
						"type": "string",
						"format": "uri"
					}
				},
				"x-render-on-tag": "users/profiles",
				"required": [
					"mediaId",
					"mediaHash",
					"url"
				]
			},
			"LegacyMediaUploadResponse": {
				"type": "object",
				"properties": {
					"hash": {
						"type": "string"
					},
					"imageSizes": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"size": {
									"type": "integer",
									"nullable": true
								},
								"fullUrl": {
									"type": "string"
								},
								"thumbnail": {
									"type": "boolean",
									"nullable": true
								},
								"state": {
									"type": "string"
								},
								"mediaHash": {
									"$ref": "#/components/schemas/MediaHash"
								},
								"rejectionReason": {
									"type": "string",
									"nullable": true
								}
							}
						}
					},
					"mediaId": {
						"type": "integer"
					}
				},
				"x-render-on-tag": "users/profiles",
				"required": [
					"hash",
					"imageSizes",
					"mediaId"
				]
			},
			"EditProfilePhotosRequest": {
				"type": "object",
				"properties": {
					"primaryImageHash": {
						"type": "string",
						"nullable": true
					},
					"secondaryImageHashes": {
						"type": "array",
						"items": {
							"type": "string"
						},
						"nullable": true,
						"description": "max. length: 5"
					}
				},
				"x-render-on-tag": "users/profiles",
				"required": [
					"primaryImageHash",
					"secondaryImageHashes"
				]
			},
			"DeleteProfilePhotosRequest": {
				"type": "object",
				"required": [
					"media_hashes"
				],
				"properties": {
					"media_hashes": {
						"type": "array",
						"items": {
							"type": "string"
						}
					}
				},
				"x-render-on-tag": "users/profiles"
			},
			"ProfileImageState": {
				"type": "object",
				"properties": {
					"mediaHash": {
						"$ref": "#/components/schemas/MediaHash"
					},
					"type": {
						"type": "integer"
					},
					"state": {
						"type": "integer"
					}
				},
				"description": "Profile media state.",
				"x-wip": true,
				"x-render-on-tag": "users/profiles",
				"required": [
					"mediaHash",
					"type",
					"state"
				]
			},
			"Pronoun": {
				"type": "object",
				"properties": {
					"pronounId": {
						"type": "integer"
					},
					"pronoun": {
						"type": "string",
						"description": "e.g. `\"-\"` or `\"They/Them/Theirs\"`"
					}
				},
				"x-render-on-tag": "users/profiles",
				"required": [
					"pronounId",
					"pronoun"
				]
			},
			"Gender": {
				"type": "object",
				"properties": {
					"genderId": {
						"type": "integer"
					},
					"gender": {
						"type": "string"
					},
					"displayGroup": {
						"type": "integer"
					},
					"sortProfile": {
						"type": "integer",
						"nullable": true
					},
					"sortFilter": {
						"type": "integer",
						"nullable": true
					},
					"genderPlural": {
						"type": "string",
						"nullable": true
					},
					"excludeOnProfileSelection": {
						"type": "array",
						"items": {
							"type": "integer"
						},
						"nullable": true
					},
					"excludeOnFilterSelection": {
						"type": "array",
						"items": {
							"type": "integer"
						},
						"nullable": true
					},
					"alsoClassifiedAs": {
						"type": "array",
						"items": {
							"type": "integer"
						}
					}
				},
				"x-render-on-tag": "users/profiles",
				"required": [
					"genderId",
					"gender",
					"displayGroup",
					"sortProfile",
					"sortFilter",
					"genderPlural",
					"excludeOnProfileSelection",
					"excludeOnFilterSelection",
					"alsoClassifiedAs"
				]
			},
			"GenderPronounSuggestionRequest": {
				"type": "object",
				"required": [
					"category",
					"suggestedValue"
				],
				"properties": {
					"category": {
						"type": "string",
						"enum": [
							"gender",
							"pronoun"
						],
						"description": "string, either `gender` or `pronoun`"
					},
					"suggestedValue": {
						"type": "string"
					}
				},
				"x-render-on-tag": "users/profiles"
			},
			"AccountPreferences": {
				"type": "object",
				"properties": {
					"profileId": {
						"type": "integer"
					},
					"locationSearchOptOut": {
						"type": "boolean"
					},
					"incognito": {
						"type": "boolean"
					},
					"hideViewedMe": {
						"type": "boolean"
					},
					"approximateDistance": {
						"type": "boolean"
					},
					"viewRightNowNsfw": {
						"type": "boolean"
					}
				},
				"x-render-on-tag": "settings/account",
				"required": [
					"profileId",
					"locationSearchOptOut",
					"incognito",
					"hideViewedMe",
					"approximateDistance",
					"viewRightNowNsfw"
				]
			},
			"AccountPreferencesUpdate": {
				"type": "object",
				"properties": {
					"locationSearchOptOut": {
						"type": "boolean"
					},
					"incognito": {
						"type": "boolean"
					},
					"hideViewedMe": {
						"type": "boolean"
					},
					"approximateDistance": {
						"type": "boolean"
					},
					"viewRightNowNsfw": {
						"type": "boolean"
					}
				},
				"x-render-on-tag": "settings/account",
				"required": [
					"locationSearchOptOut",
					"incognito",
					"hideViewedMe",
					"approximateDistance",
					"viewRightNowNsfw"
				]
			},
			"VisitingSettings": {
				"type": "object",
				"properties": {
					"setting": {
						"type": "string",
						"description": "`\"AUTO\"`, WIP"
					}
				},
				"x-render-on-tag": "settings/account",
				"required": [
					"setting"
				]
			},
			"HomeLocation": {
				"type": "object",
				"properties": {
					"name": {
						"type": "string",
						"description": "string, [human-readable name](/grindr-api/browse/location#search-places-by-name) of location"
					},
					"lat": {
						"type": "number",
						"format": "float"
					},
					"lon": {
						"type": "number",
						"format": "float"
					}
				},
				"x-render-on-tag": "settings/account",
				"required": [
					"name",
					"lat",
					"lon"
				]
			},
			"HomeLocationMutation": {
				"type": "object",
				"required": [
					"lat",
					"lon"
				],
				"properties": {
					"lat": {
						"type": "number",
						"format": "float"
					},
					"lon": {
						"type": "number",
						"format": "float"
					}
				},
				"x-render-on-tag": "settings/account"
			},
			"SmsSendCodeRequest": {
				"type": "object",
				"required": [
					"country_code",
					"phone_number"
				],
				"properties": {
					"country_code": {
						"type": "string"
					},
					"phone_number": {
						"type": "string"
					}
				},
				"x-render-on-tag": "settings/sms-verification"
			},
			"SmsCodeResponse": {
				"type": "object",
				"properties": {
					"code": {
						"type": "number",
						"nullable": true
					},
					"message": {
						"type": "string",
						"description": "e.g. `\"Profile is not verification required\"` or `\"Profile is already verified\"`"
					}
				},
				"x-render-on-tag": "settings/sms-verification",
				"required": [
					"code",
					"message"
				]
			},
			"SmsVerifyCodeLegacyRequest": {
				"type": "object",
				"properties": {
					"country_code": {
						"type": "string"
					},
					"phone_number": {
						"type": "string"
					},
					"code": {
						"type": "string"
					}
				},
				"x-render-on-tag": "settings/sms-verification",
				"required": [
					"country_code",
					"phone_number",
					"code"
				]
			},
			"FavoriteNote": {
				"type": "object",
				"properties": {
					"notes": {
						"type": "string",
						"description": "empty for nonexistent notes"
					},
					"phoneNumber": {
						"type": "string",
						"description": "might be empty"
					}
				},
				"x-render-on-tag": "users/favorites",
				"required": [
					"notes",
					"phoneNumber"
				]
			},
			"FavoriteNoteWithCounterparty": {
				"allOf": [
					{
						"$ref": "#/components/schemas/FavoriteNote"
					},
					{
						"type": "object",
						"properties": {
							"counterpartyId": {
								"type": "integer",
								"format": "int64"
							}
						}
					}
				],
				"properties": {
					"counterpartyId": {
						"description": "profile ID"
					}
				},
				"x-render-on-tag": "users/favorites",
				"required": [
					"counterpartyId"
				]
			},
			"AlbumExpirationType": {
				"oneOf": [
					{
						"type": "string",
						"enum": [
							"INDEFINITE",
							"ONCE",
							"TEN_MINUTES",
							"ONE_HOUR",
							"ONE_DAY"
						]
					},
					{
						"type": "integer",
						"enum": [
							0,
							1,
							2,
							3,
							4
						]
					}
				],
				"description": "Album expiration type.\n\nPreviously shared [albums in chat](/grindr-api/messaging/messages#albummessagebody) inherit new `expirationType` settings from newer sharings of the album.",
				"x-enum-labels": {
					"INDEFINITE": "\"Indefinitely\"",
					"ONCE": "\"View Once\", limited by 30 minutes from request",
					"TEN_MINUTES": "\"For 10 Minutes\"",
					"ONE_HOUR": "\"For 60 Minutes\"",
					"ONE_DAY": "\"For 24 Hours\""
				},
				"x-render-on-tag": "messaging/albums"
			},
			"AlbumPreview": {
				"type": "object",
				"properties": {
					"albumId": {
						"type": "integer",
						"format": "int64"
					},
					"albumNumber": {
						"type": "integer",
						"nullable": true,
						"description": "integer or `null` if album has expired or was locked"
					},
					"totalAlbumsShared": {
						"type": "integer",
						"nullable": true,
						"description": "integer or `null` if album has expired or was locked"
					},
					"hasUnseenContent": {
						"type": "boolean"
					}
				},
				"x-render-on-tag": "messaging/albums",
				"required": [
					"albumId",
					"albumNumber",
					"totalAlbumsShared",
					"hasUnseenContent"
				]
			},
			"AlbumMin": {
				"allOf": [
					{
						"$ref": "#/components/schemas/AlbumPreview"
					},
					{
						"type": "object",
						"properties": {
							"albumName": {
								"type": "string",
								"nullable": true
							},
							"profileId": {
								"type": "integer"
							},
							"albumViewable": {
								"type": "boolean"
							}
						}
					}
				],
				"properties": {
					"albumName": {
						"description": "appears to always be `null`"
					}
				},
				"x-render-on-tag": "messaging/albums",
				"required": [
					"albumName",
					"profileId",
					"albumViewable"
				]
			},
			"AlbumDetails": {
				"type": "object",
				"properties": {
					"sharedCount": {
						"type": "integer"
					},
					"createdAt": {
						"type": "string",
						"format": "date-time",
						"description": "string, date formatted as ISO 8601, e.g. `2026-03-27T20:39:00`"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time",
						"description": "string, date formatted as ISO 8601, e.g. `2026-03-27T20:39:00`"
					}
				},
				"x-render-on-tag": "messaging/albums",
				"required": [
					"sharedCount",
					"createdAt",
					"updatedAt"
				]
			},
			"AlbumExpiration": {
				"type": "object",
				"properties": {
					"expiresAt": {
						"nullable": true,
						"description": "unix timestamp in milliseconds or `null`",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"expirationType": {
						"nullable": true,
						"allOf": [
							{
								"$ref": "#/components/schemas/AlbumExpirationType"
							}
						]
					}
				},
				"x-render-on-tag": "messaging/albums",
				"required": [
					"expiresAt",
					"expirationType"
				]
			},
			"AlbumContentMin": {
				"type": "object",
				"properties": {
					"contentId": {
						"type": "integer",
						"format": "int64"
					},
					"contentType": {
						"type": "string"
					},
					"coverUrl": {
						"$ref": "#/components/schemas/AlbumCoverUrl"
					},
					"statusId": {
						"description": "unknown integer, WIP"
					}
				},
				"x-render-on-tag": "messaging/albums",
				"required": [
					"contentId",
					"contentType",
					"coverUrl",
					"statusId"
				]
			},
			"AlbumContent": {
				"allOf": [
					{
						"$ref": "#/components/schemas/AlbumContentMin"
					},
					{
						"type": "object",
						"properties": {
							"thumbUrl": {
								"type": "string"
							},
							"url": {
								"type": "string"
							},
							"processing": {
								"type": "boolean"
							},
							"rejectionId": {
								"nullable": true
							}
						}
					}
				],
				"properties": {
					"thumbUrl": {
						"description": "string, unblurred preview, see [Media -> Signed CDN files](/grindr-api/media/signed-cdn-files)"
					},
					"url": {
						"description": "string, original file, see [Media -> Signed CDN files](/grindr-api/media/signed-cdn-files), may be `\"\"` if `remainingViews` is 0"
					},
					"rejectionId": {
						"description": "unknown or `null`"
					}
				},
				"x-render-on-tag": "messaging/albums",
				"required": [
					"thumbUrl",
					"url",
					"processing",
					"rejectionId"
				]
			},
			"MyAlbum": {
				"allOf": [
					{
						"$ref": "#/components/schemas/AlbumDetails"
					},
					{
						"type": "object",
						"properties": {
							"albumId": {
								"type": "integer",
								"format": "int64"
							},
							"albumName": {
								"type": "string",
								"nullable": true
							},
							"profileId": {
								"type": "integer"
							},
							"version": {
								"type": "integer"
							},
							"content": {
								"$ref": "#/components/schemas/AlbumContent"
							},
							"isShareable": {
								"type": "boolean"
							}
						},
						"required": [
							"albumId",
							"profileId",
							"version",
							"content",
							"isShareable"
						]
					}
				],
				"x-render-on-tag": "messaging/albums",
				"properties": {
					"albumName": {
						"description": "see [Album name](/grindr-api/messaging/albums#album-name)"
					}
				},
				"required": [
					"albumName"
				]
			},
			"AlbumContentWithRemainingViews": {
				"allOf": [
					{
						"$ref": "#/components/schemas/AlbumContent"
					},
					{
						"type": "object",
						"properties": {
							"remainingViews": {
								"type": "integer",
								"description": "might be -1; absent if this is your own album"
							}
						}
					}
				],
				"x-render-on-tag": "messaging/albums",
				"required": [
					"contentId",
					"contentType",
					"coverUrl",
					"statusId",
					"thumbUrl",
					"url",
					"processing",
					"rejectionId"
				]
			},
			"AlbumDetailsResponse": {
				"allOf": [
					{
						"$ref": "#/components/schemas/AlbumMin"
					},
					{
						"$ref": "#/components/schemas/AlbumDetails"
					},
					{
						"type": "object",
						"properties": {
							"content": {
								"type": "array",
								"items": {
									"$ref": "#/components/schemas/AlbumContentWithRemainingViews"
								}
							}
						}
					}
				],
				"x-render-on-tag": "messaging/albums",
				"required": [
					"albumName",
					"albumId",
					"albumNumber",
					"totalAlbumsShared",
					"hasUnseenContent",
					"profileId",
					"albumViewable",
					"sharedCount",
					"createdAt",
					"updatedAt",
					"content"
				]
			},
			"AlbumShareInfo": {
				"type": "object",
				"properties": {
					"profileId": {
						"type": "integer",
						"format": "int64"
					},
					"hasAlbum": {
						"type": "boolean"
					},
					"hasSharedWithMe": {
						"type": "boolean"
					}
				},
				"x-render-on-tag": "messaging/albums",
				"required": [
					"profileId",
					"hasAlbum",
					"hasSharedWithMe"
				]
			},
			"AlbumsSharedByProfileResponse": {
				"type": "object",
				"properties": {
					"albums": {
						"type": "array",
						"items": {
							"allOf": [
								{
									"$ref": "#/components/schemas/AlbumMin"
								},
								{
									"$ref": "#/components/schemas/AlbumExpiration"
								},
								{
									"type": "object",
									"properties": {
										"content": {
											"allOf": [
												{
													"$ref": "#/components/schemas/AlbumContentMin"
												}
											],
											"description": "a single blurred preview content item"
										},
										"contentCount": {
											"type": "object",
											"properties": {
												"imageCount": {
													"type": "integer"
												},
												"videoCount": {
													"type": "integer"
												}
											}
										}
									}
								}
							]
						}
					}
				},
				"x-render-on-tag": "messaging/albums",
				"required": [
					"albums"
				]
			},
			"AlbumNameRequest": {
				"type": "object",
				"properties": {
					"albumName": {
						"type": "string",
						"nullable": true,
						"maxLength": 255
					}
				},
				"x-render-on-tag": "messaging/albums",
				"x-display-name": "Album name",
				"description": "String, may be empty (`\"\"`) or `null`, non-string values are coerced into string.\n\nMaximum length: 255 UTF-8 bytes, which is 255 characters for ASCII strings (1 ASCII character is encoded as 1 byte) but less if you include emojis or non-ascii characters (2+ bytes/one codepoint).",
				"required": [
					"albumName"
				]
			},
			"AlbumRenameResponse": {
				"type": "object",
				"properties": {
					"albumId": {
						"type": "integer"
					},
					"albumName": {
						"type": "string",
						"nullable": true
					}
				},
				"x-render-on-tag": "messaging/albums",
				"required": [
					"albumId",
					"albumName"
				]
			},
			"AlbumShareRequest": {
				"type": "object",
				"properties": {
					"profiles": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"expirationType": {
									"$ref": "#/components/schemas/AlbumExpirationType"
								},
								"profileId": {
									"type": "integer"
								}
							}
						}
					}
				},
				"x-render-on-tag": "messaging/albums",
				"required": [
					"profiles"
				]
			},
			"AlbumUnshareRequest": {
				"type": "object",
				"properties": {
					"profiles": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"profileId": {
									"type": "integer",
									"format": "int64"
								},
								"shareId": {
									"type": "integer",
									"description": "can be `0`"
								}
							}
						}
					}
				},
				"x-render-on-tag": "messaging/albums",
				"required": [
					"profiles"
				]
			},
			"AlbumStorageLimits": {
				"type": "object",
				"properties": {
					"subscriptionType": {
						"type": "string",
						"description": "string, e.g. `FreeAlbums`"
					},
					"maxAlbums": {
						"type": "integer"
					},
					"maxContentItemsPerAlbum": {
						"type": "integer"
					},
					"maxShares": {
						"type": "integer"
					},
					"maxViewableAlbums": {
						"type": "integer"
					},
					"maxViewableVideos": {
						"type": "integer"
					},
					"maxContentSize": {
						"type": "integer",
						"format": "int64",
						"description": "long integer, size in bytes"
					},
					"maxContentSizeHumanReadable": {
						"type": "string",
						"description": "string, incorrectly uses decimal multiples notation (MB) when in fact calculates binary notation (MiB), so API's `120.00 MB` is actually 120 MiB or 125.8291 MB"
					},
					"maxVideoLength": {
						"type": "integer",
						"format": "int64",
						"description": "long integer, length in milliseconds (1/1000th of a second)"
					},
					"minVideoLength": {
						"type": "integer",
						"format": "int64",
						"description": "long integer, length in milliseconds (1/1000th of a second)"
					},
					"maxShareableAlbums": {
						"type": "integer"
					},
					"maxVideosPerAlbum": {
						"type": "integer"
					}
				},
				"x-render-on-tag": "messaging/albums",
				"required": [
					"subscriptionType",
					"maxAlbums",
					"maxContentItemsPerAlbum",
					"maxShares",
					"maxViewableAlbums",
					"maxViewableVideos",
					"maxContentSize",
					"maxContentSizeHumanReadable",
					"maxVideoLength",
					"minVideoLength",
					"maxShareableAlbums",
					"maxVideosPerAlbum"
				]
			},
			"PressieProfileMini": {
				"type": "object",
				"properties": {
					"profileId": {
						"type": "integer",
						"format": "int64"
					},
					"name": {
						"type": "string"
					},
					"profileUrl": {
						"type": "string",
						"nullable": true
					},
					"onlineUntil": {
						"nullable": true
					},
					"distanceKm": {
						"type": "number",
						"nullable": true
					}
				},
				"x-render-on-tag": "messaging/albums"
			},
			"PressieAlbumsFeedResponse": {
				"type": "object",
				"properties": {
					"profileFeeds": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"profileId": {
									"type": "integer"
								},
								"paywallStatus": {
									"type": "string",
									"description": "e.g. `ALLOW`"
								},
								"seen": {
									"type": "boolean"
								},
								"content": {
									"type": "object",
									"additionalProperties": true
								},
								"profile": {
									"$ref": "#/components/schemas/PressieProfileMini"
								}
							}
						}
					},
					"sharedAlbums": {
						"type": "array",
						"items": {
							"allOf": [
								{
									"$ref": "#/components/schemas/AlbumPreview"
								},
								{
									"type": "object",
									"properties": {
										"albumViewable": {
											"type": "boolean"
										},
										"albumVersion": {
											"type": "integer"
										},
										"expiresat": {
											"allOf": [
												{
													"$ref": "#/components/schemas/TimestampMs"
												}
											],
											"nullable": true,
											"description": "unix timestamp in milliseconds; note: observed key spelling, may also appear as `expiresAt`"
										},
										"name": {
											"type": "string",
											"nullable": true
										},
										"ownerProfileId": {
											"type": "integer"
										},
										"imageCount": {
											"type": "integer"
										},
										"videoCount": {
											"type": "integer"
										},
										"coverContent": {
											"type": "object",
											"properties": {
												"id": {
													"type": "integer",
													"format": "int64"
												},
												"contentType": {
													"type": "string"
												},
												"coverContent": {
													"type": "string",
													"nullable": true
												},
												"status": {
													"type": "string"
												}
											}
										},
										"profile": {
											"$ref": "#/components/schemas/PressieProfileMini"
										}
									}
								}
							]
						}
					},
					"experimentStatus": {
						"type": "number"
					},
					"nonEmptyPersonalAlbumCount": {
						"type": "number"
					},
					"emptyAlbumId": {
						"nullable": true
					}
				},
				"x-render-on-tag": "messaging/albums",
				"required": [
					"profileFeeds",
					"sharedAlbums",
					"experimentStatus",
					"nonEmptyPersonalAlbumCount",
					"emptyAlbumId"
				]
			},
			"PressieAlbumsPaywallResponse": {
				"type": "object",
				"properties": {
					"albumPaywallContent": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"albumId": {
									"type": "integer",
									"format": "int64"
								},
								"profile": {
									"$ref": "#/components/schemas/PressieProfileMini"
								},
								"paywallCoverUrl": {
									"type": "string",
									"description": "see [Media -> Signed CDN files](/grindr-api/media/signed-cdn-files)"
								},
								"paywallUrls": {
									"type": "array",
									"items": {
										"type": "string"
									},
									"description": "see [Media -> Signed CDN files](/grindr-api/media/signed-cdn-files)"
								},
								"albumsItemCount": {
									"type": "integer"
								}
							}
						}
					}
				},
				"x-render-on-tag": "messaging/albums",
				"required": [
					"albumPaywallContent"
				]
			},
			"ConversationParticipant": {
				"type": "object",
				"properties": {
					"profileId": {
						"type": "integer",
						"description": "integer, [Profile ID](/grindr-api/users/profiles#profilemin)"
					},
					"primaryMediaHash": {
						"allOf": [
							{
								"$ref": "#/components/schemas/MediaHash"
							}
						],
						"nullable": true,
						"description": "string or `null`, see [Media -> Public CDN files](/grindr-api/media/public-cdn-files)"
					},
					"lastOnline": {
						"nullable": true,
						"description": "unix timestamp in milliseconds or `null`",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"onlineUntil": {
						"nullable": true,
						"description": "unix timestamp in milliseconds or `null`",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"distanceMetres": {
						"type": "number",
						"nullable": true,
						"description": "float number or `null`"
					},
					"position": {
						"allOf": [
							{
								"$ref": "#/components/schemas/SexualPositionId"
							}
						],
						"nullable": true,
						"description": "[Sexual position ID](/grindr-api/users/profiles#sexual-position-id) or `null`"
					},
					"isInAList": {
						"type": "boolean"
					},
					"hasDatingPotential": {
						"type": "boolean"
					}
				},
				"x-render-on-tag": "messaging/conversations",
				"required": [
					"profileId",
					"primaryMediaHash",
					"lastOnline",
					"onlineUntil",
					"distanceMetres",
					"position",
					"isInAList",
					"hasDatingPotential"
				]
			},
			"ConversationPreview": {
				"type": "object",
				"properties": {
					"conversationId": {
						"type": "object",
						"properties": {
							"value": {
								"$ref": "#/components/schemas/ConversationId"
							}
						}
					},
					"messageId": {
						"type": "string",
						"description": "see [Message](/grindr-api/messaging/messages#message) for format"
					},
					"chat1MessageId": {
						"type": "string",
						"description": "string with UUIDv4, second part of `messageId`"
					},
					"senderId": {
						"type": "integer",
						"description": "[Profile ID](/grindr-api/users/profiles#profilemin)"
					},
					"type": {
						"$ref": "#/components/schemas/MessageType"
					},
					"chat1Type": {
						"$ref": "#/components/schemas/Chat1MessageType"
					},
					"text": {
						"type": "string",
						"nullable": true
					},
					"url": {
						"nullable": true,
						"description": "appears to be null"
					},
					"lat": {
						"nullable": true,
						"description": "appears to be null"
					},
					"lon": {
						"nullable": true,
						"description": "appears to be null"
					},
					"albumId": {
						"type": "integer",
						"nullable": true,
						"description": "appears to be null"
					},
					"albumContentId": {
						"nullable": true,
						"description": "appears to be null"
					},
					"albumContentReply": {
						"nullable": true,
						"description": "appears to be null"
					},
					"duration": {
						"nullable": true,
						"description": "appears to be null"
					},
					"imageHash": {
						"type": "string",
						"nullable": true
					},
					"photoContentReply": {
						"nullable": true,
						"description": "appears to be null"
					}
				},
				"x-render-on-tag": "messaging/conversations",
				"required": [
					"conversationId",
					"messageId",
					"chat1MessageId",
					"senderId",
					"type",
					"chat1Type",
					"text",
					"url",
					"lat",
					"lon",
					"albumId",
					"albumContentId",
					"albumContentReply",
					"duration",
					"imageHash",
					"photoContentReply"
				]
			},
			"ConversationData": {
				"type": "object",
				"properties": {
					"conversationId": {
						"$ref": "#/components/schemas/ConversationId"
					},
					"name": {
						"type": "string",
						"description": "string, profile name, may be an empty string, e.g. `\"\"`"
					},
					"participants": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/ConversationParticipant"
						}
					},
					"lastActivityTimestamp": {
						"description": "unix timestamp in milliseconds",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"unreadCount": {
						"type": "integer"
					},
					"preview": {
						"$ref": "#/components/schemas/ConversationPreview"
					},
					"muted": {
						"type": "boolean"
					},
					"pinned": {
						"type": "boolean"
					},
					"favorite": {
						"type": "boolean"
					},
					"context": {
						"nullable": true
					},
					"onlineUntil": {
						"nullable": true,
						"description": "`null` on the conversation; use [ConversationParticipant](/grindr-api/messaging/conversations#conversationparticipant)'s `onlineUntil` instead."
					},
					"translatable": {
						"type": "boolean"
					},
					"rightNow": {
						"description": "string, e.g. `\"NOT_ACTIVE\"`",
						"allOf": [
							{
								"$ref": "#/components/schemas/RightNowStatus"
							}
						]
					},
					"hasUnreadThrob": {
						"type": "boolean"
					}
				},
				"x-render-on-tag": "messaging/conversations",
				"required": [
					"conversationId",
					"name",
					"participants",
					"lastActivityTimestamp",
					"unreadCount",
					"preview",
					"muted",
					"pinned",
					"favorite",
					"context",
					"onlineUntil",
					"translatable",
					"rightNow",
					"hasUnreadThrob"
				]
			},
			"Conversation": {
				"type": "object",
				"properties": {
					"type": {
						"type": "string",
						"description": "e.g. `\"full_conversation_v1\"`"
					},
					"data": {
						"$ref": "#/components/schemas/ConversationData"
					}
				},
				"description": "Conversation object.",
				"x-render-on-tag": "messaging/conversations",
				"required": [
					"type",
					"data"
				]
			},
			"InboxFilterRequest": {
				"type": "object",
				"properties": {
					"unreadOnly": {
						"type": "boolean"
					},
					"chemistryOnly": {
						"type": "boolean"
					},
					"favoritesOnly": {
						"type": "boolean"
					},
					"rightNowOnly": {
						"type": "boolean"
					},
					"onlineNowOnly": {
						"type": "boolean"
					},
					"distanceMeters": {
						"type": "number",
						"nullable": true,
						"description": "\"double\" number value or `null`"
					},
					"positions": {
						"type": "array",
						"items": {
							"type": "integer"
						},
						"description": "array of integers, [sexual position IDs](/grindr-api/users/profiles#sexual-position-id)"
					}
				},
				"x-render-on-tag": "messaging/conversations",
				"required": [
					"unreadOnly",
					"chemistryOnly",
					"favoritesOnly",
					"rightNowOnly",
					"onlineNowOnly",
					"distanceMeters",
					"positions"
				]
			},
			"InboxResponse": {
				"type": "object",
				"properties": {
					"entries": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/Conversation"
						}
					},
					"showsFreeHeaderLabel": {
						"type": "boolean"
					},
					"totalFullConversations": {
						"type": "number",
						"description": "number, e.g. `\"5\"`"
					},
					"totalPartialConversations": {
						"type": "number",
						"description": "number, e.g. `0`"
					},
					"maxDisplayLockCount": {
						"type": "number",
						"description": "number, e.g. `99`"
					},
					"nextPage": {
						"type": "integer",
						"description": "integer, e.g. `2`"
					}
				},
				"x-render-on-tag": "messaging/conversations",
				"required": [
					"entries",
					"showsFreeHeaderLabel",
					"totalFullConversations",
					"totalPartialConversations",
					"maxDisplayLockCount",
					"nextPage"
				]
			},
			"MessageReaction": {
				"type": "object",
				"properties": {
					"profileId": {
						"type": "integer",
						"description": "integer"
					},
					"reactionType": {
						"type": "integer",
						"description": "(`1` is \"🔥\")"
					}
				},
				"x-render-on-tag": "messaging/messages",
				"required": [
					"profileId",
					"reactionType"
				]
			},
			"MessageType": {
				"type": "string",
				"enum": [
					"Album",
					"AlbumContentReaction",
					"AlbumContentReply",
					"Audio",
					"ExpiringAlbum",
					"ExpiringAlbumV2",
					"ExpiringImage",
					"Video",
					"Gaymoji",
					"Generative",
					"Giphy",
					"Image",
					"Location",
					"PrivateVideo",
					"ProfileLink",
					"ProfilePhotoReply",
					"Retract",
					"Text",
					"Unknown",
					"NonExpiringVideo",
					"VideoCall"
				],
				"description": "Message type discriminator. There also appears to be a related `chat1Type`, could be legacy type.",
				"x-render-on-tag": "messaging/messages",
				"x-display-name": "Message type"
			},
			"Chat1MessageType": {
				"type": "string",
				"enum": [
					"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"
				],
				"description": "Legacy message type.",
				"x-render-on-tag": "messaging/messages"
			},
			"AlbumMessageBody": {
				"allOf": [
					{
						"$ref": "#/components/schemas/AlbumPreview"
					},
					{
						"$ref": "#/components/schemas/AlbumExpiration"
					},
					{
						"type": "object",
						"properties": {
							"coverUrl": {
								"type": "string",
								"nullable": true
							},
							"ownerProfileId": {
								"type": "number",
								"nullable": true
							},
							"isViewable": {
								"type": "boolean"
							},
							"hasVideo": {
								"type": "boolean"
							},
							"hasPhoto": {
								"type": "boolean"
							},
							"viewableUntil": {
								"type": "number",
								"nullable": true
							}
						}
					}
				],
				"description": "Body for `\"Album\"` message type. Includes everything from AlbumPreview and AlbumExpiration.",
				"properties": {
					"ownerProfileId": {
						"description": "number or `null` if album has expired or was locked"
					}
				},
				"x-render-on-tag": "messaging/messages",
				"required": [
					"coverUrl",
					"ownerProfileId",
					"isViewable",
					"hasVideo",
					"hasPhoto",
					"viewableUntil"
				]
			},
			"AlbumContentReactionBody": {
				"type": "object",
				"properties": {
					"albumId": {
						"type": "integer"
					},
					"ownerProfileId": {
						"type": "integer",
						"nullable": true,
						"description": "integer or `null` if album has expired or was locked"
					},
					"albumContentId": {
						"type": "integer"
					},
					"previewUrl": {
						"type": "string",
						"nullable": true,
						"description": "string or `null` if album has expired or was locked, see [Signed CDN files -> Chat media](/grindr-api/media/signed-cdn-files#chat-media)"
					},
					"expiresAt": {
						"nullable": true,
						"description": "unix timestamp in milliseconds or `null`",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"viewable": {
						"type": "boolean"
					}
				},
				"description": "Body for `\"AlbumContentReaction\"` message type. Implies \"🔥\" reaction as there does not appear to be any choice.",
				"x-render-on-tag": "messaging/messages",
				"required": [
					"albumId",
					"ownerProfileId",
					"albumContentId",
					"previewUrl",
					"expiresAt",
					"viewable"
				]
			},
			"AlbumContentReplyBody": {
				"allOf": [
					{
						"$ref": "#/components/schemas/AlbumContentReactionBody"
					},
					{
						"type": "object",
						"properties": {
							"albumContentReply": {
								"type": "string"
							},
							"contentType": {
								"type": "string",
								"nullable": true
							}
						}
					}
				],
				"description": "Body for `\"AlbumContentReply\"` message type. Extends AlbumContentReaction.",
				"properties": {
					"contentType": {
						"description": "string or `null` if album has expired or was locked"
					}
				},
				"x-render-on-tag": "messaging/messages",
				"required": [
					"albumContentReply",
					"contentType"
				]
			},
			"AudioMessageBody": {
				"type": "object",
				"properties": {
					"mediaId": {
						"type": "number",
						"description": "number"
					},
					"mediaHash": {
						"allOf": [
							{
								"$ref": "#/components/schemas/MediaHash"
							}
						],
						"nullable": true
					},
					"url": {
						"type": "string",
						"description": "string, see [Signed CDN files -> Chat media](/grindr-api/media/signed-cdn-files#chat-media)"
					},
					"contentType": {
						"type": "string",
						"description": "string, e.g. `audio/aac`"
					},
					"length": {
						"type": "number",
						"nullable": true,
						"description": "number in milliseconds (1/1000th of a second) or `null`"
					},
					"expiresAt": {
						"description": "unix timestamp in milliseconds, 15 minutes",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					}
				},
				"description": "Body for `\"Audio\"` message type.",
				"x-render-on-tag": "messaging/messages",
				"required": [
					"mediaId",
					"mediaHash",
					"url",
					"contentType",
					"length",
					"expiresAt"
				]
			},
			"VideoMessageBody": {
				"type": "object",
				"properties": {
					"mediaId": {
						"type": "number",
						"nullable": true
					},
					"url": {
						"type": "string",
						"nullable": true
					},
					"fileCacheKey": {
						"type": "string"
					},
					"contentType": {
						"type": "string",
						"nullable": true
					},
					"length": {
						"type": "number"
					},
					"maxViews": {
						"type": "integer",
						"nullable": true
					},
					"looping": {
						"type": "boolean",
						"nullable": true
					},
					"viewsRemaining": {
						"type": "integer"
					}
				},
				"description": "Body for `\"Video\"` message type. Additionally, for expiring videos `viewsRemaining` is set; capped at `2147483647` for \"unlimited\" views.",
				"x-render-on-tag": "messaging/messages",
				"required": [
					"mediaId",
					"url",
					"fileCacheKey",
					"contentType",
					"length",
					"maxViews",
					"looping"
				]
			},
			"PrivateVideoBody": {
				"allOf": [
					{
						"$ref": "#/components/schemas/VideoMessageBody"
					},
					{
						"type": "object",
						"properties": {
							"viewCount": {
								"type": "integer"
							}
						}
					}
				],
				"description": "Body for `\"PrivateVideo\"` message type. Extends [Video](#video).",
				"x-render-on-tag": "messaging/messages",
				"required": [
					"viewCount"
				]
			},
			"GaymojiBody": {
				"type": "object",
				"properties": {
					"imageHash": {
						"type": "string"
					}
				},
				"description": "Body for `\"Gaymoji\"` message type.",
				"x-render-on-tag": "messaging/messages",
				"required": [
					"imageHash"
				]
			},
			"GiphyBody": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string"
					},
					"urlPath": {
						"type": "string",
						"description": "full URL to gif file"
					},
					"stillPath": {
						"type": "string",
						"description": "single frame, URL to gif file"
					},
					"previewPath": {
						"type": "string"
					},
					"width": {
						"type": "integer"
					},
					"height": {
						"type": "integer"
					},
					"imageHash": {
						"type": "string"
					}
				},
				"description": "Body for `\"Giphy\"` message type. URLs point at `https://media0.giphy.com`.",
				"x-render-on-tag": "messaging/messages",
				"required": [
					"id",
					"urlPath",
					"stillPath",
					"previewPath",
					"width",
					"height",
					"imageHash"
				]
			},
			"ImageMessageBody": {
				"type": "object",
				"properties": {
					"mediaId": {
						"type": "number"
					},
					"width": {
						"type": "integer",
						"nullable": true
					},
					"height": {
						"type": "integer",
						"nullable": true
					},
					"url": {
						"type": "string"
					},
					"imageHash": {
						"type": "string"
					},
					"takenOnGrindr": {
						"type": "boolean",
						"nullable": true
					},
					"createdAt": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						],
						"nullable": true
					}
				},
				"description": "Body for `\"Image\"` message type. Additional fields are present only for regular (non-expiring) images.",
				"x-render-on-tag": "messaging/messages",
				"required": [
					"mediaId",
					"width",
					"height",
					"url",
					"imageHash",
					"takenOnGrindr",
					"createdAt"
				]
			},
			"ChatImageBody": {
				"type": "object",
				"properties": {
					"mediaId": {
						"type": "number"
					},
					"url": {
						"type": "string"
					},
					"expiresAt": {
						"description": "unix timestamp in milliseconds",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"takenOnGrindr": {
						"type": "boolean"
					},
					"createdTs": {
						"$ref": "#/components/schemas/TimestampMs"
					}
				},
				"description": "\"ChatImage\" message body.",
				"x-render-on-tag": "messaging/messages",
				"required": [
					"mediaId",
					"url",
					"expiresAt",
					"takenOnGrindr",
					"createdTs"
				]
			},
			"ExpiringImageBody": {
				"allOf": [
					{
						"$ref": "#/components/schemas/ImageMessageBody"
					},
					{
						"type": "object",
						"properties": {
							"url": {
								"type": "string",
								"nullable": true
							},
							"viewsRemaining": {
								"type": "number",
								"nullable": true
							}
						}
					}
				],
				"description": "Body for `\"ExpiringImage\"` message type. Extends [Image](#image) but with `url` set to `null` and additional `viewsRemaining`.\n\nTo get a single-use expiring image URL, you need to call [Get a single message in a conversation](/grindr-api/messaging/messages#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.",
				"x-render-on-tag": "messaging/messages",
				"required": [
					"url",
					"viewsRemaining"
				]
			},
			"LocationMessageBody": {
				"type": "object",
				"properties": {
					"lat": {
						"type": "number"
					},
					"lon": {
						"type": "number"
					}
				},
				"description": "Body for `\"Location\"` message type.",
				"x-render-on-tag": "messaging/messages",
				"required": [
					"lat",
					"lon"
				]
			},
			"ProfilePhotoReplyBody": {
				"type": "object",
				"properties": {
					"imageHash": {
						"type": "string"
					},
					"photoContentReply": {
						"type": "string"
					}
				},
				"description": "Body for `\"ProfilePhotoReply\"` message type. Unknown, WIP.",
				"x-render-on-tag": "messaging/messages",
				"required": [
					"imageHash",
					"photoContentReply"
				]
			},
			"RetractMessageBody": {
				"type": "object",
				"properties": {
					"targetMessageId": {
						"type": "string"
					}
				},
				"description": "Body for `\"Retract\"` message type. Unknown, WIP.",
				"x-render-on-tag": "messaging/messages",
				"required": [
					"targetMessageId"
				]
			},
			"TextMessageBody": {
				"type": "object",
				"properties": {
					"text": {
						"type": "string"
					}
				},
				"description": "Body for `\"Text\"` message type.",
				"x-render-on-tag": "messaging/messages",
				"required": [
					"text"
				]
			},
			"VideoCallMessageBody": {
				"type": "object",
				"properties": {
					"result": {
						"type": "string",
						"nullable": true,
						"description": "string or `null`, appears to have the following values: `SUCCESSFUL`, `Duration:`, `Busy`, `BUSY`, `Cancelled`, `Declined`, `DECLINED`, `Missed`, `AB_Unsupported`, `No_Answer`, `UNANSWERED`, `Lite_Unsupport`"
					},
					"videoCallDuration": {
						"type": "number",
						"nullable": true
					}
				},
				"description": "Body for `\"VideoCall\"` message type. WIP. Only for \"status\" messages.",
				"x-render-on-tag": "messaging/messages",
				"required": [
					"result",
					"videoCallDuration"
				]
			},
			"UnknownMessageBody": {
				"type": "object",
				"additionalProperties": true,
				"description": "Empty type.",
				"x-render-on-tag": "messaging/messages"
			},
			"MessageBody": {
				"oneOf": [
					{
						"$ref": "#/components/schemas/AlbumMessageBody"
					},
					{
						"$ref": "#/components/schemas/AlbumContentReactionBody"
					},
					{
						"$ref": "#/components/schemas/AlbumContentReplyBody"
					},
					{
						"$ref": "#/components/schemas/AudioMessageBody"
					},
					{
						"$ref": "#/components/schemas/VideoMessageBody"
					},
					{
						"$ref": "#/components/schemas/PrivateVideoBody"
					},
					{
						"$ref": "#/components/schemas/GaymojiBody"
					},
					{
						"$ref": "#/components/schemas/GiphyBody"
					},
					{
						"$ref": "#/components/schemas/ImageMessageBody"
					},
					{
						"$ref": "#/components/schemas/ChatImageBody"
					},
					{
						"$ref": "#/components/schemas/ExpiringImageBody"
					},
					{
						"$ref": "#/components/schemas/LocationMessageBody"
					},
					{
						"$ref": "#/components/schemas/ProfilePhotoReplyBody"
					},
					{
						"$ref": "#/components/schemas/RetractMessageBody"
					},
					{
						"$ref": "#/components/schemas/TextMessageBody"
					},
					{
						"$ref": "#/components/schemas/VideoCallMessageBody"
					},
					{
						"$ref": "#/components/schemas/UnknownMessageBody"
					},
					{
						"$ref": "#/components/schemas/ExpiringAlbumBody"
					},
					{
						"$ref": "#/components/schemas/ExpiringAlbumV2Body"
					},
					{
						"$ref": "#/components/schemas/NonExpiringVideoBody"
					},
					{
						"$ref": "#/components/schemas/GenerativeBody"
					},
					{
						"$ref": "#/components/schemas/ProfileLinkBody"
					}
				],
				"x-render-on-tag": "messaging/messages",
				"x-display-name": "Message contents"
			},
			"Message": {
				"type": "object",
				"properties": {
					"messageId": {
						"type": "string",
						"description": "string, appears to be a unix timestamp in milliseconds and UUIDv4 separated by `:`, e.g. `\"1774296692000:843daee8-1e93-47d6-bc7f-3d981925a393\"`"
					},
					"conversationId": {
						"description": "string, see [Conversation](/grindr-api/messaging/conversations#conversation)",
						"allOf": [
							{
								"$ref": "#/components/schemas/ConversationId"
							}
						]
					},
					"senderId": {
						"type": "number",
						"description": "number"
					},
					"timestamp": {
						"description": "unix timestamp in milliseconds, appears to be same as in `messageId`",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"unsent": {
						"type": "boolean",
						"description": "boolean, if this is true, `body` is set to `null`"
					},
					"reactions": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/MessageReaction"
						}
					},
					"type": {
						"description": "string, see [Message type](/grindr-api/messaging/messages#message-type)",
						"allOf": [
							{
								"$ref": "#/components/schemas/MessageType"
							}
						]
					},
					"body": {
						"nullable": true,
						"description": "object with [Message contents](/grindr-api/messaging/messages#message-contents)",
						"allOf": [
							{
								"$ref": "#/components/schemas/MessageBody"
							}
						]
					},
					"replyToMessage": {
						"nullable": true,
						"description": "unknown or `null`"
					},
					"dynamic": {
						"type": "boolean",
						"description": "boolean, unknown purpose, WIP"
					},
					"chat1Type": {
						"description": "string, see [Message type](/grindr-api/messaging/messages#message-type)",
						"allOf": [
							{
								"$ref": "#/components/schemas/Chat1MessageType"
							}
						]
					},
					"replyPreview": {
						"nullable": true,
						"description": "unknown or `null`"
					}
				},
				"x-render-on-tag": "messaging/messages",
				"required": [
					"messageId",
					"conversationId",
					"senderId",
					"timestamp",
					"unsent",
					"reactions",
					"type",
					"body",
					"replyToMessage",
					"dynamic",
					"chat1Type",
					"replyPreview"
				]
			},
			"ConversationProfileMini": {
				"type": "object",
				"properties": {
					"profileId": {
						"type": "integer",
						"format": "int64"
					},
					"name": {
						"type": "string"
					},
					"mediaHash": {
						"allOf": [
							{
								"$ref": "#/components/schemas/MediaHash"
							}
						],
						"nullable": true
					},
					"onlineUntil": {
						"nullable": true
					},
					"distance": {
						"type": "number",
						"nullable": true
					},
					"showDistance": {
						"type": "boolean"
					}
				},
				"x-render-on-tag": "messaging/conversations",
				"required": [
					"profileId",
					"name",
					"mediaHash",
					"onlineUntil",
					"distance",
					"showDistance"
				]
			},
			"ConversationMessagesResponse": {
				"type": "object",
				"properties": {
					"lastReadTimestamp": {
						"nullable": true,
						"description": "unix timestamp of recipient's side in milliseconds or `null`; is not affected by yours calls to [mark messages as read](/grindr-api/messaging/conversations#mark-messages-as-read)",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"messages": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/Message"
						}
					},
					"metadata": {
						"type": "object",
						"properties": {
							"translate": {
								"type": "boolean"
							},
							"hasSharedAlbums": {
								"type": "boolean"
							},
							"isInAList": {
								"type": "boolean"
							}
						}
					},
					"profile": {
						"nullable": true,
						"description": "object if `profile` query parameter is set to `true` or `null`",
						"allOf": [
							{
								"$ref": "#/components/schemas/ConversationProfileMini"
							}
						]
					}
				},
				"x-render-on-tag": "messaging/messages",
				"required": [
					"lastReadTimestamp",
					"messages",
					"metadata",
					"profile"
				]
			},
			"MessageTarget": {
				"type": "object",
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"Direct",
							"Group",
							"HumanWingman"
						],
						"description": "`Direct`, `Group`, `HumanWingman`"
					},
					"targetId": {
						"type": "integer"
					}
				},
				"x-render-on-tag": "messaging/messages",
				"required": [
					"type",
					"targetId"
				]
			},
			"SendMessageRequest": {
				"type": "object",
				"properties": {
					"type": {
						"$ref": "#/components/schemas/MessageType"
					},
					"target": {
						"$ref": "#/components/schemas/MessageTarget"
					},
					"body": {
						"nullable": true,
						"description": "object with [Message contents](/grindr-api/messaging/messages#message-contents) or `null`",
						"allOf": [
							{
								"$ref": "#/components/schemas/MessageBody"
							}
						]
					}
				},
				"x-render-on-tag": "messaging/messages",
				"required": [
					"type",
					"target",
					"body"
				],
				"x-property-groups": [
					{
						"heading": "Additional body fields for websocket only:",
						"properties": {
							"replyToMessageId": {
								"type": "string",
								"nullable": true
							}
						}
					}
				]
			},
			"MessageMutationRequest": {
				"type": "object",
				"required": [
					"conversationId",
					"messageId"
				],
				"properties": {
					"conversationId": {
						"$ref": "#/components/schemas/ConversationId"
					},
					"messageId": {
						"type": "string",
						"description": "string, must be sent by you"
					}
				},
				"x-render-on-tag": "messaging/messages"
			},
			"TypingIndicatorRequest": {
				"type": "object",
				"properties": {
					"conversationId": {
						"$ref": "#/components/schemas/ConversationId"
					},
					"status": {
						"type": "string",
						"enum": [
							"Typing",
							"Cleared"
						],
						"description": "either `\"Typing\"` or `\"Cleared\"`"
					}
				},
				"x-render-on-tag": "messaging/messages",
				"required": [
					"conversationId",
					"status"
				]
			},
			"MessageReactionRequest": {
				"type": "object",
				"properties": {
					"conversationId": {
						"$ref": "#/components/schemas/ConversationId"
					},
					"messageId": {
						"type": "string"
					},
					"reactionType": {
						"type": "integer",
						"description": "(`1` is \"🔥\")"
					}
				},
				"x-render-on-tag": "messaging/messages",
				"required": [
					"conversationId",
					"messageId",
					"reactionType"
				]
			},
			"TranslateMessageRequest": {
				"type": "object",
				"properties": {
					"conversationId": {
						"$ref": "#/components/schemas/ConversationId"
					},
					"messageId": {
						"type": "string"
					},
					"targetLanguageCode": {
						"type": "string",
						"description": "e.g. `en`"
					}
				},
				"x-render-on-tag": "messaging/misc",
				"required": [
					"conversationId",
					"messageId",
					"targetLanguageCode"
				]
			},
			"WingmanFeedbackRequest": {
				"type": "object",
				"properties": {
					"message_id": {
						"type": "string"
					},
					"prompt_id": {
						"type": "string"
					},
					"rating": {
						"type": "number",
						"description": "e.g. `1`"
					},
					"text": {
						"type": "string",
						"description": "feedback text"
					},
					"timestamp": {
						"description": "unix timestamp in milliseconds",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					}
				},
				"x-render-on-tag": "messaging/misc",
				"required": [
					"message_id",
					"prompt_id",
					"rating",
					"text",
					"timestamp"
				]
			},
			"SavedPhrase": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"description": "string"
					},
					"text": {
						"type": "string"
					},
					"type": {
						"type": "string",
						"description": "e.g. `\"user\"`"
					}
				},
				"x-render-on-tag": "messaging/saved-phrases",
				"required": [
					"id",
					"text",
					"type"
				]
			},
			"SavedPhrasesResponse": {
				"type": "object",
				"properties": {
					"phrases": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/SavedPhrase"
						}
					}
				},
				"x-render-on-tag": "messaging/saved-phrases",
				"required": [
					"phrases"
				]
			},
			"LegacyPrefsResponse": {
				"type": "object",
				"properties": {
					"phrases": {
						"type": "object",
						"additionalProperties": {
							"type": "object",
							"properties": {
								"phraseId": {
									"type": "string",
									"description": "string, uuid"
								},
								"phraseText": {
									"type": "string"
								},
								"timestamp": {
									"$ref": "#/components/schemas/TimestampMs"
								},
								"frequency": {
									"type": "integer",
									"description": "integer, see [Track phrase usage frequency](/grindr-api/messaging/saved-phrases#track-phrase-usage-frequency)"
								}
							}
						},
						"x-key-description": "phrase ID (uuid)"
					}
				},
				"x-render-on-tag": "messaging/saved-phrases",
				"required": [
					"phrases"
				]
			},
			"TapProfile": {
				"allOf": [
					{
						"$ref": "#/components/schemas/ProfileMaskedMin"
					},
					{
						"$ref": "#/components/schemas/ProfileMin"
					},
					{
						"type": "object",
						"properties": {
							"timestamp": {
								"$ref": "#/components/schemas/TimestampMs"
							},
							"tapType": {
								"$ref": "#/components/schemas/TapType"
							},
							"lastOnline": {
								"$ref": "#/components/schemas/TimestampMs"
							},
							"isBoosting": {
								"type": "boolean"
							},
							"isMutual": {
								"type": "boolean"
							},
							"rightNowType": {
								"type": "string"
							},
							"isViewable": {
								"type": "boolean"
							}
						}
					}
				],
				"x-render-on-tag": "interest/taps",
				"required": [
					"distance",
					"profileImageMediaHash",
					"isFavorite",
					"profileId",
					"displayName",
					"timestamp",
					"tapType",
					"lastOnline",
					"isBoosting",
					"isMutual",
					"rightNowType",
					"isViewable"
				]
			},
			"ViewsEyeballResponse": {
				"type": "object",
				"properties": {
					"viewedCount": {
						"type": "number",
						"nullable": true
					},
					"mostRecent": {
						"type": "object",
						"nullable": true,
						"properties": {
							"profileId": {
								"type": "string",
								"pattern": "^[0-9]+$",
								"description": "string with number"
							},
							"photoHash": {
								"$ref": "#/components/schemas/MediaHash"
							},
							"timestamp": {
								"description": "unix timestamp in milliseconds",
								"allOf": [
									{
										"$ref": "#/components/schemas/TimestampMs"
									}
								]
							}
						}
					}
				},
				"x-render-on-tag": "interest/views",
				"required": [
					"viewedCount",
					"mostRecent"
				]
			},
			"ViewPreview": {
				"allOf": [
					{
						"$ref": "#/components/schemas/ProfileMasked"
					},
					{
						"type": "object",
						"properties": {
							"isInBadNeighborhood": {
								"type": "boolean"
							},
							"isViewedMeFreshFace": {
								"type": "boolean"
							},
							"isSecretAdmirer": {
								"type": "boolean"
							},
							"viewedCount": {
								"type": "object",
								"properties": {
									"totalCount": {
										"type": "integer"
									},
									"maxDisplayCount": {
										"type": "integer"
									}
								}
							}
						}
					}
				],
				"x-render-on-tag": "interest/views",
				"required": [
					"distance",
					"profileImageMediaHash",
					"isFavorite",
					"lastViewed",
					"seen",
					"rightNow",
					"isInBadNeighborhood",
					"isViewedMeFreshFace",
					"isSecretAdmirer",
					"viewedCount"
				]
			},
			"ViewerProfile": {
				"allOf": [
					{
						"$ref": "#/components/schemas/ViewPreview"
					},
					{
						"$ref": "#/components/schemas/ProfileShort"
					},
					{
						"type": "object",
						"properties": {
							"hasFaceRecognition": {
								"type": "boolean"
							},
							"isIncognito": {
								"type": "boolean"
							},
							"boosting": {
								"type": "boolean"
							},
							"showUnlockReward": {
								"type": "boolean"
							},
							"unreadMessageCount": {
								"type": "integer"
							},
							"hasChatted": {
								"type": "boolean"
							}
						}
					}
				],
				"x-render-on-tag": "interest/views",
				"required": [
					"distance",
					"profileImageMediaHash",
					"isFavorite",
					"lastViewed",
					"seen",
					"rightNow",
					"isInBadNeighborhood",
					"isViewedMeFreshFace",
					"isSecretAdmirer",
					"viewedCount",
					"profileId",
					"displayName",
					"age",
					"showAge",
					"showDistance",
					"approximateDistance",
					"lastChatTimestamp",
					"isNew",
					"lastUpdatedTime",
					"medias",
					"hasFaceRecognition",
					"isIncognito",
					"boosting",
					"showUnlockReward",
					"unreadMessageCount",
					"hasChatted"
				]
			},
			"ViewsListResponse": {
				"type": "object",
				"properties": {
					"totalViewers": {
						"type": "integer"
					},
					"previews": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/ViewPreview"
						}
					},
					"profiles": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/ViewerProfile"
						}
					}
				},
				"x-render-on-tag": "interest/views",
				"required": [
					"totalViewers",
					"previews",
					"profiles"
				]
			},
			"CascadeItem": {
				"type": "object",
				"properties": {
					"type": {
						"type": "string"
					},
					"data": {
						"type": "object",
						"additionalProperties": true,
						"description": "object, shape depends on `type` — [full_profile_v1](/grindr-api/browse/grid#full_profile_v1), [partial_profile_v1](/grindr-api/browse/grid#partial_profile_v1), [advert_v1](/grindr-api/browse/grid#advert_v1), [top_picks_v1](/grindr-api/browse/grid#top_picks_v1), [explore_aggregation_v1](/grindr-api/browse/grid#explore_aggregation_v1), [boost_upsell_v1](/grindr-api/browse/grid#boost_upsell_v1), [unlimited_mpu_v1](/grindr-api/browse/grid#unlimited_mpu_v1), [xtra_mpu_v1](/grindr-api/browse/grid#xtra_mpu_v1), [fav_header_v1](/grindr-api/browse/grid#fav_header_v1), [hidden_profile_v1](/grindr-api/browse/grid#hidden_profile_v1), [smart_boost_profile_v1](/grindr-api/browse/grid#smart_boost_profile_v1), [sponsored_profile_v1](/grindr-api/browse/grid#sponsored_profile_v1), [braze_event_profile_v1](/grindr-api/browse/grid#braze_event_profile_v1), [favs_xtra_upsell_v1](/grindr-api/browse/grid#favs_xtra_upsell_v1), [favs_unlimited_upsell_v1](/grindr-api/browse/grid#favs_unlimited_upsell_v1), [favorites_header_no_free_results_v1](/grindr-api/browse/grid#favorites_header_no_free_results_v1), [favorites_header_no_xtra_results_v1](/grindr-api/browse/grid#favorites_header_no_xtra_results_v1), [profile_hide_status](/grindr-api/browse/grid#profile_hide_status). For `profile_hide_status`, `count` is on the item itself, not under `data`."
					}
				},
				"x-render-on-tag": "browse/grid",
				"required": [
					"type",
					"data"
				]
			},
			"CascadeResponse": {
				"type": "object",
				"properties": {
					"items": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/CascadeItem"
						}
					},
					"nextPage": {
						"type": "integer"
					},
					"shuffled": {
						"type": "boolean"
					},
					"hiddenProfiles": {},
					"hiddenProfileInfo": {}
				},
				"x-render-on-tag": "browse/grid",
				"required": [
					"items",
					"nextPage",
					"shuffled",
					"hiddenProfiles",
					"hiddenProfileInfo"
				]
			},
			"FullProfileV1": {
				"type": "object",
				"allOf": [
					{
						"$ref": "#/components/schemas/CascadeResponseProfile"
					}
				],
				"x-render-on-tag": "browse/grid",
				"x-display-name": "full_profile_v1",
				"x-property-groups": [
					{
						"heading": "Only for [v3/cascade](/grindr-api/browse/grid#get-cascade-legacy):",
						"allOf": [
							{
								"$ref": "#/components/schemas/ProfileFields"
							}
						],
						"properties": {
							"@type": {
								"type": "string",
								"description": "string, `\"CascadeItemData$FullProfileV1\"`"
							},
							"tribes": {
								"type": "array",
								"items": {
									"type": "integer"
								},
								"description": "array of integers, see [Tribes](/grindr-api/users/profiles#tribes)"
							},
							"socialNetworks": {
								"type": "array",
								"description": "array of [SocialNetwork](/grindr-api/users/profiles#socialnetwork)"
							},
							"takenOnGrindrMetadata": {
								"type": "object",
								"x-key-description": "[Media hash](/grindr-api/media/index#media)",
								"additionalProperties": {
									"type": "object",
									"properties": {
										"takenOnGrindr": {
											"type": "boolean"
										},
										"createdAt": {
											"description": "unix timestamp in milliseconds",
											"allOf": [
												{
													"$ref": "#/components/schemas/TimestampMs"
												}
											]
										}
									}
								}
							}
						},
						"required": [
							"@type",
							"tribes",
							"socialNetworks",
							"takenOnGrindrMetadata"
						]
					},
					{
						"heading": "Only for [v4/cascade](/grindr-api/browse/grid#get-cascade):",
						"properties": {
							"age": {
								"type": "integer",
								"description": "integer, optional"
							},
							"heightCm": {
								"type": "integer",
								"description": "integer, optional"
							},
							"weightGrams": {
								"type": "integer",
								"description": "integer, optional"
							},
							"bodyType": {
								"type": "integer",
								"description": "integer, see [Body type](/grindr-api/users/profiles#body-type)"
							}
						},
						"required": [
							"bodyType"
						]
					}
				]
			},
			"PartialProfileV1": {
				"type": "object",
				"allOf": [
					{
						"$ref": "#/components/schemas/CascadeResponseProfile"
					}
				],
				"properties": {
					"upsellItemType": {
						"type": "string",
						"description": "string, e.g. `\"xtra_mpu_v1\"`"
					}
				},
				"x-render-on-tag": "browse/grid",
				"x-display-name": "partial_profile_v1",
				"x-property-groups": [
					{
						"heading": "Only for [v3/cascade](/grindr-api/browse/grid#get-cascade-legacy):",
						"properties": {
							"@type": {
								"type": "string",
								"description": "string, `\"CascadeItemData$PartialProfileV1\"`"
							}
						}
					}
				],
				"required": [
					"upsellItemType"
				]
			},
			"AdvertV1": {
				"type": "object",
				"properties": {
					"cascadePlacementName": {
						"type": "string",
						"description": "string, e.g. `\"mrec-cascade-first\"`"
					}
				},
				"x-render-on-tag": "browse/grid",
				"x-display-name": "advert_v1",
				"x-property-groups": [
					{
						"heading": "Only for [v3/cascade](/grindr-api/browse/grid#get-cascade-legacy):",
						"properties": {
							"@type": {
								"type": "string",
								"description": "string, `\"CascadeItemData$Advert\"`"
							}
						}
					}
				],
				"required": [
					"cascadePlacementName"
				]
			},
			"TopPicksV1": {
				"type": "object",
				"description": "Empty for [v4/cascade](/grindr-api/browse/grid#get-cascade).",
				"x-render-on-tag": "browse/grid",
				"x-display-name": "top_picks_v1",
				"x-property-groups": [
					{
						"heading": "Only for [v3/cascade](/grindr-api/browse/grid#get-cascade-legacy):",
						"properties": {
							"@type": {
								"type": "string",
								"description": "string, `\"CascadeItemData$TopPicksV1\"`"
							}
						}
					}
				]
			},
			"ExploreAggregationV1": {
				"type": "object",
				"properties": {
					"uuid": {
						"type": "string",
						"description": "string, UUIDv4"
					},
					"headerName": {
						"type": "string",
						"description": "string, e.g. `\"🌎 Explore\"`"
					},
					"source": {
						"type": "string",
						"description": "string, e.g. `\"cascade\"`"
					},
					"items": {
						"type": "array",
						"description": "array of objects. `@type` determines contents: *`\"ExploreAggregationItem$Location\"`*: `data.onlineCount` (integer), `data.uuid` (UUIDv3 string), `data.location` (`id` integer, `name` string e.g. `\"Minneapolis\"`, `suffix` string e.g. `\"🇺🇸\"`, `lat` float, `lon` float), `data.profiles` (array of objects with `profileImageUrl` URL string). *`\"ExploreAggregationItem$Cta\"`*: empty."
					}
				},
				"x-render-on-tag": "browse/grid",
				"x-display-name": "explore_aggregation_v1",
				"x-property-groups": [
					{
						"heading": "Only for [v3/cascade](/grindr-api/browse/grid#get-cascade-legacy):",
						"properties": {
							"@type": {
								"type": "string",
								"description": "string, `\"CascadeItemData$ExploreAggregationV1\"`"
							}
						}
					}
				],
				"required": [
					"uuid",
					"headerName",
					"source",
					"items"
				]
			},
			"BoostUpsellV1": {
				"type": "object",
				"description": "Empty for [v4/cascade](/grindr-api/browse/grid#get-cascade).",
				"x-render-on-tag": "browse/grid",
				"x-display-name": "boost_upsell_v1",
				"x-property-groups": [
					{
						"heading": "Only for [v3/cascade](/grindr-api/browse/grid#get-cascade-legacy):",
						"properties": {
							"@type": {
								"type": "string",
								"description": "string, `\"CascadeItemData$BoostUpsellV1\"`"
							}
						}
					}
				]
			},
			"UnlimitedMpuV1": {
				"type": "object",
				"description": "Empty for [v4/cascade](/grindr-api/browse/grid#get-cascade).",
				"x-render-on-tag": "browse/grid",
				"x-display-name": "unlimited_mpu_v1",
				"x-property-groups": [
					{
						"heading": "Only for [v3/cascade](/grindr-api/browse/grid#get-cascade-legacy):",
						"properties": {
							"@type": {
								"type": "string",
								"description": "string, `\"CascadeItemData$UnlimitedMpuV1\"`"
							}
						}
					}
				]
			},
			"XtraMpuV1": {
				"type": "object",
				"description": "Empty for [v4/cascade](/grindr-api/browse/grid#get-cascade).",
				"x-render-on-tag": "browse/grid",
				"x-display-name": "xtra_mpu_v1",
				"x-property-groups": [
					{
						"heading": "Only for [v3/cascade](/grindr-api/browse/grid#get-cascade-legacy):",
						"properties": {
							"@type": {
								"type": "string",
								"description": "string, `\"CascadeItemData$XtraMpuV1\"`"
							}
						}
					}
				]
			},
			"FavHeaderV1": {
				"type": "object",
				"properties": {
					"available": {
						"type": "integer"
					},
					"displayed": {
						"type": "integer"
					},
					"total": {
						"type": "integer"
					}
				},
				"x-render-on-tag": "browse/grid",
				"x-display-name": "fav_header_v1",
				"x-property-groups": [
					{
						"heading": "Only for [v3/cascade](/grindr-api/browse/grid#get-cascade-legacy):",
						"properties": {
							"@type": {
								"type": "string",
								"description": "string, `\"CascadeItemData$FavHeaderV1\"`"
							}
						}
					}
				],
				"required": [
					"available",
					"displayed",
					"total"
				]
			},
			"HiddenProfileV1": {
				"type": "object",
				"description": "Hidden profile. Same shape as [full_profile_v1](/grindr-api/browse/grid#full_profile_v1).",
				"allOf": [
					{
						"$ref": "#/components/schemas/CascadeResponseProfile"
					}
				],
				"x-render-on-tag": "browse/grid",
				"x-display-name": "hidden_profile_v1",
				"x-property-groups": [
					{
						"heading": "Only for [v4/cascade](/grindr-api/browse/grid#get-cascade):",
						"properties": {
							"age": {
								"type": "integer",
								"description": "integer, optional"
							},
							"heightCm": {
								"type": "integer",
								"description": "integer, optional"
							},
							"weightGrams": {
								"type": "integer",
								"description": "integer, optional"
							},
							"bodyType": {
								"type": "integer",
								"description": "integer, see [Body type](/grindr-api/users/profiles#body-type)"
							}
						},
						"required": [
							"bodyType"
						]
					}
				]
			},
			"SmartBoostProfileV1": {
				"type": "object",
				"description": "Smart boost profile. Same shape as [full_profile_v1](/grindr-api/browse/grid#full_profile_v1).",
				"allOf": [
					{
						"$ref": "#/components/schemas/CascadeResponseProfile"
					}
				],
				"x-render-on-tag": "browse/grid",
				"x-display-name": "smart_boost_profile_v1",
				"x-property-groups": [
					{
						"heading": "Only for [v4/cascade](/grindr-api/browse/grid#get-cascade):",
						"properties": {
							"age": {
								"type": "integer",
								"description": "integer, optional"
							},
							"heightCm": {
								"type": "integer",
								"description": "integer, optional"
							},
							"weightGrams": {
								"type": "integer",
								"description": "integer, optional"
							},
							"bodyType": {
								"type": "integer",
								"description": "integer, see [Body type](/grindr-api/users/profiles#body-type)"
							}
						},
						"required": [
							"bodyType"
						]
					}
				]
			},
			"SponsoredProfileV1": {
				"type": "object",
				"properties": {
					"cascadePlacementName": {
						"type": "string"
					},
					"alternativeProfile": {
						"description": "Fallback [full_profile_v1](/grindr-api/browse/grid#full_profile_v1) shape, shown when the sponsored ad is unavailable.",
						"allOf": [
							{
								"$ref": "#/components/schemas/CascadeResponseProfile"
							}
						]
					}
				},
				"x-render-on-tag": "browse/grid",
				"x-display-name": "sponsored_profile_v1",
				"required": [
					"cascadePlacementName",
					"alternativeProfile"
				]
			},
			"BrazeEventProfileV1": {
				"type": "object",
				"properties": {
					"profileId": {
						"type": "integer"
					},
					"onlineUntil": {
						"description": "unix timestamp in milliseconds, may be absent",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"displayName": {
						"type": "string",
						"description": "string, may be absent"
					},
					"primaryImageUrl": {
						"type": "string",
						"description": "string, URL, may be absent"
					},
					"eventName": {
						"type": "string",
						"description": "string, Braze event name"
					}
				},
				"x-render-on-tag": "browse/grid",
				"x-display-name": "braze_event_profile_v1",
				"required": [
					"profileId",
					"eventName"
				]
			},
			"FavsXtraUpsellV1": {
				"type": "object",
				"properties": {
					"available": {
						"type": "integer"
					}
				},
				"x-render-on-tag": "browse/grid",
				"x-display-name": "favs_xtra_upsell_v1",
				"required": [
					"available"
				]
			},
			"FavsUnlimitedUpsellV1": {
				"type": "object",
				"description": "Empty.",
				"x-render-on-tag": "browse/grid",
				"x-display-name": "favs_unlimited_upsell_v1"
			},
			"FavoritesHeaderNoFreeResultsV1": {
				"type": "object",
				"description": "Empty.",
				"x-render-on-tag": "browse/grid",
				"x-display-name": "favorites_header_no_free_results_v1"
			},
			"FavoritesHeaderNoXtraResultsV1": {
				"type": "object",
				"description": "Empty.",
				"x-render-on-tag": "browse/grid",
				"x-display-name": "favorites_header_no_xtra_results_v1"
			},
			"ProfileHideStatus": {
				"type": "object",
				"description": "Unlike other cascade items, `count` sits directly on the item alongside `type`, not under `data`.",
				"properties": {
					"count": {
						"type": "integer"
					}
				},
				"x-render-on-tag": "browse/grid",
				"x-display-name": "profile_hide_status",
				"required": [
					"count"
				]
			},
			"SearchProfileResult": {
				"type": "object",
				"properties": {
					"age": {
						"type": "integer",
						"nullable": true
					},
					"displayName": {
						"type": "string"
					},
					"distance": {
						"type": "number",
						"format": "float"
					},
					"hasFaceRecognition": {
						"type": "boolean"
					},
					"isFavorite": {
						"type": "boolean"
					},
					"new": {
						"type": "boolean"
					},
					"lastChatTimestamp": {
						"type": "number",
						"description": "may be `0`"
					},
					"lastViewed": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						],
						"nullable": true
					},
					"lastUpdatedTime": {
						"$ref": "#/components/schemas/TimestampMs"
					},
					"medias": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/ProfileMedia"
						},
						"nullable": true
					},
					"profileId": {
						"type": "integer"
					},
					"profileImageMediaHash": {
						"allOf": [
							{
								"$ref": "#/components/schemas/MediaHash"
							}
						],
						"nullable": true
					},
					"profileTags": {
						"type": "array",
						"items": {
							"type": "string"
						},
						"description": "array of [Profile tags](/grindr-api/users/profiles#profile-tags)"
					},
					"seen": {
						"$ref": "#/components/schemas/TimestampMs"
					},
					"showAge": {
						"type": "boolean"
					},
					"showDistance": {
						"type": "boolean"
					},
					"approximateDistance": {
						"type": "boolean"
					},
					"boosting": {
						"type": "boolean"
					},
					"hasAlbum": {
						"type": "boolean"
					},
					"gender": {
						"type": "array",
						"items": {
							"type": "integer"
						},
						"description": "array of integers or `[-1]`, see [Get genders](/grindr-api/users/profiles#get-genders)"
					}
				},
				"x-render-on-tag": "browse/grid",
				"required": [
					"age",
					"displayName",
					"distance",
					"hasFaceRecognition",
					"isFavorite",
					"new",
					"lastChatTimestamp",
					"lastViewed",
					"lastUpdatedTime",
					"medias",
					"profileId",
					"profileImageMediaHash",
					"profileTags",
					"seen",
					"showAge",
					"showDistance",
					"approximateDistance",
					"boosting",
					"hasAlbum",
					"gender"
				]
			},
			"SearchProfilesResponse": {
				"type": "object",
				"properties": {
					"profiles": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/SearchProfileResult"
						}
					},
					"lastDistanceInKm": {
						"type": "number",
						"format": "float"
					},
					"lastProfileId": {
						"type": "integer"
					},
					"inserts": {
						"type": "object",
						"properties": {
							"mpuFree": {
								"type": "integer"
							},
							"mpuXtra": {
								"type": "integer"
							},
							"boostUpsell": {
								"type": "array",
								"items": {
									"type": "integer"
								}
							},
							"mrecCascadeFirst": {
								"type": "integer"
							},
							"mrecCascadeSecond": {
								"type": "integer"
							},
							"mrecCascadeThird": {
								"type": "integer"
							}
						}
					}
				},
				"x-render-on-tag": "browse/grid",
				"required": [
					"profiles",
					"lastDistanceInKm",
					"lastProfileId",
					"inserts"
				]
			},
			"DiscoverResponse": {
				"type": "object",
				"additionalProperties": true,
				"x-render-on-tag": "browse/discover",
				"x-exclude-from-markdown": true
			},
			"ChatSuggestionsResponse": {
				"type": "object",
				"properties": {
					"suggestions": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"id": {
									"type": "string",
									"description": "UUIDv3"
								},
								"text": {
									"type": "string"
								},
								"type": {
									"type": "string",
									"enum": [
										"SAVED_PHRASE",
										"SMART_PHRASE"
									],
									"description": "`SAVED_PHRASE` | `SMART_PHRASE`"
								}
							}
						}
					}
				},
				"x-render-on-tag": "messaging/conversations",
				"required": [
					"suggestions"
				]
			},
			"GaymojiManifest": {
				"type": "object",
				"properties": {
					"lastUpdateTime": {
						"description": "unix timestamp in milliseconds",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"gaymoji": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"name": {
									"type": "string",
									"description": "unique identifier consisting of alphanumeric characters, hyphens and underscores"
								},
								"id": {
									"type": "string",
									"description": "same as `name` + `.png`"
								},
								"category": {
									"$ref": "#/components/schemas/GaymojiCategory"
								}
							}
						}
					},
					"category": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"name": {
									"$ref": "#/components/schemas/GaymojiCategory"
								},
								"expiredTime": {
									"allOf": [
										{
											"$ref": "#/components/schemas/TimestampMs"
										}
									],
									"description": "unix timestamp in milliseconds, may be `0`"
								}
							}
						}
					}
				},
				"x-render-on-tag": "media/public-cdn-files",
				"x-exclude-from-markdown": true,
				"required": [
					"lastUpdateTime",
					"gaymoji",
					"category"
				]
			},
			"GaymojiCategory": {
				"type": "string",
				"enum": [
					"body",
					"dating+sex",
					"featured",
					"holiday",
					"mood",
					"objects",
					"profile",
					"wen_ching_taiwan_stickers"
				],
				"x-render-on-tag": "media/public-cdn-files"
			},
			"GiphyResponse": {
				"type": "object",
				"additionalProperties": true,
				"x-render-on-tag": "gifs",
				"x-exclude-from-markdown": true
			},
			"RandomPromotionImagesResponse": {
				"type": "object",
				"properties": {
					"images": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"url": {
									"type": "string",
									"format": "uri"
								},
								"id": {
									"type": "string",
									"description": "e.g. `\"WoodworkImage1\"`"
								}
							}
						},
						"description": "array of objects with length `count`"
					},
					"collection": {
						"type": "string",
						"description": "always `foryou`"
					}
				},
				"x-render-on-tag": "woodwork/random-promotion-images",
				"x-exclude-from-markdown": true,
				"required": [
					"images",
					"collection"
				]
			},
			"RedDotListResponse": {
				"type": "object",
				"additionalProperties": true,
				"x-render-on-tag": "reddot"
			},
			"SexualPositionId": {
				"type": "object",
				"description": "Sexual position ID.",
				"x-enum-labels": {
					"1": "Top",
					"2": "Bottom",
					"3": "Versatile",
					"4": "Vers Bottom",
					"5": "Vers Top",
					"6": "Side"
				},
				"x-render-on-tag": "users/profiles",
				"x-display-name": "Sexual position ID"
			},
			"Ethnicity": {
				"type": "object",
				"description": "Ethnicity.",
				"x-enum-labels": {
					"1": "Asian",
					"2": "Black",
					"3": "Latino",
					"4": "Middle Eastern",
					"5": "Mixed",
					"6": "Native American",
					"7": "White",
					"8": "Other",
					"9": "South Asian"
				},
				"x-render-on-tag": "users/profiles"
			},
			"RelationshipStatus": {
				"type": "object",
				"description": "Relationship status.",
				"x-enum-labels": {
					"1": "Single",
					"2": "Dating",
					"3": "Exclusive",
					"4": "Committed",
					"5": "Partnered",
					"6": "Engaged",
					"7": "Married",
					"8": "Open Relationship"
				},
				"x-render-on-tag": "users/profiles",
				"x-display-name": "Relationship status"
			},
			"BodyType": {
				"type": "object",
				"description": "Body type.",
				"x-enum-labels": {
					"1": "Toned",
					"2": "Average",
					"3": "Large",
					"4": "Muscular",
					"5": "Slim",
					"6": "Stocky"
				},
				"x-render-on-tag": "users/profiles",
				"x-display-name": "Body type"
			},
			"HivStatus": {
				"type": "object",
				"description": "HIV status. Not to be confused with [Sexual health](/grindr-api/users/profiles#sexual-health).",
				"x-enum-labels": {
					"1": "Negative",
					"2": "Negative, on PrEP",
					"3": "Positive",
					"4": "Positive, undetectable"
				},
				"x-render-on-tag": "users/profiles",
				"x-display-name": "HIV status"
			},
			"AcceptNsfwPics": {
				"type": "object",
				"description": "Accept NSFW pics.",
				"x-enum-labels": {
					"1": "Never",
					"2": "Not At First",
					"3": "Yes Please"
				},
				"x-render-on-tag": "users/profiles",
				"x-display-name": "Accept NSFW pics"
			},
			"MeetAt": {
				"type": "object",
				"description": "Meet at preferences.",
				"x-enum-labels": {
					"1": "My Place",
					"2": "Your Place",
					"3": "Bar",
					"4": "Coffee Shop",
					"5": "Restaurant"
				},
				"x-render-on-tag": "users/profiles",
				"x-display-name": "Meet at"
			},
			"SexualHealth": {
				"type": "object",
				"description": "Sexual health (also \"Health Practices\"). Not to be confused with [HIV status](/grindr-api/users/profiles#hiv-status).",
				"x-enum-labels": {
					"1": "Condoms",
					"2": "I'm on doxyPEP",
					"3": "I'm on PrEP",
					"4": "I'm HIV undetectable",
					"5": "Prefer to discuss"
				},
				"x-render-on-tag": "users/profiles",
				"x-display-name": "Sexual health"
			},
			"LookingFor": {
				"type": "object",
				"description": "Looking for.",
				"x-enum-labels": {
					"2": "Chat",
					"3": "Dates",
					"4": "Friends",
					"5": "Networking",
					"6": "Relationship",
					"7": "Hookups"
				},
				"x-render-on-tag": "users/profiles",
				"x-display-name": "Looking for"
			},
			"Tribe": {
				"type": "object",
				"description": "Tribe.",
				"x-enum-labels": {
					"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"
				},
				"x-render-on-tag": "users/profiles",
				"x-display-name": "Tribes"
			},
			"Vaccine": {
				"type": "object",
				"description": "Vaccine.",
				"x-enum-labels": {
					"1": "COVID-19",
					"2": "Monkeypox",
					"3": "Meningitis"
				},
				"x-render-on-tag": "users/profiles",
				"x-display-name": "Vaccines"
			},
			"SessionId": {
				"type": "object",
				"description": "JWT obtained from authentication flow. Decoded JWT content:\n\nHeaders claims structure:\n\n- `kid` — key ID\n- `alg` — `\"RS256\"`\n- `typ` — `\"JWT\"`\n\nPayload claims:\n\n- `exp` — number, unix timestamp in seconds defining token expiration date\n- `profileId` — string with numbers, account's ID\n- `roles` — unknown array, appears to be empty\n- `features` — array of strings, e.g. `\"HidePremiumStore\"`, `\"CreateVideoCall\"`, `\"VideoCallDailyFree\"`\n- `featureFlags` — array of strings, e.g. `\"profile-insights\"`, `\"online-until-updates\"`, `\"enable-account-filters-bulk-exposure\"`, `\"a-list-v3\"`, `\"discover-v2\"`, `\"boost_purchase_fixes\"`, `\"discover-studfinder-upsell\"`\n- `experiments` — object with experiment name → variant string, known keys:\n  - `explore-paywall-profiles` — string, e.g. `\"test\"`\n  - `limiting_chat_credits_from_unlimited_to_5_for_xtra_users_in_explore` — string, e.g. `\"treatment\"`\n  - `validation-aa-backend-profileid` — string, e.g. `\"test\"`\n  - `grindr-core-day-pass` — string, e.g. `\"control\"`\n  - `llm-age-verification-methods` — string, e.g. `\"variant_b\"`\n  - `trans_tribe_filtering_changes` — string, e.g. `\"Test\"`\n  - `green_dot_v2` — string, e.g. `\"treatment-1\"`\n  - `sponsored-profiles-cascade-selection-mode` — string, e.g. `\"treatment\"`\n  - `read-receipt-ad-reward` — string, e.g. `\"variant_2\"`\n  - `taps-paywall` — string, e.g. `\"treatment-1\"`\n  - `explore-insertables-v1` — string, e.g. `\"treatment-insertables-below-mpu\"`\n  - `reduce_number_of_free_profiles_from_99_to_90` — string, e.g. `\"test\"`\n  - `cascade-mpu-explore-studfinder-2026-03-12` — string, e.g. `\"control\"`\n  - `reduce_number_of_results_with_age_filter_for_free_users` — string, e.g. `\"test\"`\n  - `mpu-heuristic-algorithm-optimizations-q125` — string, e.g. `\"control\"`\n  - `ships_in_the_night_v3` — string, e.g. `\"treatment\"`\n  - `cascade-mpu-disable-poc-heuristic-2026-03-02` — string, e.g. `\"treatment\"`\n  - `for-you-recsys-v1_1` — string, e.g. `\"control\"`\n  - `cascade-mpu-studfinder-profile-limit-2026-03-12` — string, e.g. `\"treatment\"`\n  - `reduce_free_user_results_with_any_filter` — string, e.g. `\"control\"`\n  - `cascade-mpu-studfinder-unlimited-2026-02-02` — string, e.g. `\"treatment\"`\n  - `mpu-rest-of-world` — string, e.g. `\"treatment\"`\n  - `top_18_mpu_profiles_are_online_in_extended_cascade_and_explore` — string, e.g. `\"control\"`\n  - `for-you-v2` — string, e.g. `\"Test\"`\n  - `rewarded-ads-viewed-me-v2` — string, e.g. `\"variant_1\"`\n  - `mega-boost-v1` — string, e.g. `\"mega-boost-low\"`\n- `systemTime` — unix timestamp in milliseconds\n- `upsells` — unknown object, appears to be empty\n- `restrictionReason` — unknown value, appears to be `null`\n- `grit` — unknown UUIDv4 string",
				"x-render-on-tag": "authentication",
				"x-display-name": "Session ID"
			},
			"MediaState": {
				"type": "string",
				"description": "Public media in Grindr undergo through an automated moderation check before they appear in profile. State can be either `null` for medias uploaded privately ([chats](/grindr-api/messaging/albums#upload-media-to-an-album)) or one of the below for public-facing media.",
				"enum": [
					"Pending"
				],
				"x-render-on-tag": "media/signed-cdn-files",
				"x-display-name": "MediaState",
				"x-wip": true
			},
			"AlbumCoverUrl": {
				"type": "string",
				"nullable": true,
				"description": "String with URL or `null`, blurred downscaled preview.\n\nJPEG photo with the first frame of video in case of video files.\n\nBecomes unavailable (`AccessDenied`) after album has expired.\n\nSee [Media -> Signed CDN files](/grindr-api/media/signed-cdn-files).",
				"x-render-on-tag": "messaging/albums",
				"x-display-name": "AlbumCoverUrl"
			},
			"CascadeResponseProfile": {
				"type": "object",
				"description": "Profile data returned in cascade items.",
				"properties": {
					"profileId": {
						"type": "integer"
					},
					"onlineUntil": {
						"description": "unix timestamp in milliseconds",
						"allOf": [
							{
								"$ref": "#/components/schemas/TimestampMs"
							}
						]
					},
					"displayName": {
						"type": "string"
					},
					"distanceMeters": {
						"type": "integer",
						"description": "integer, may be absent"
					},
					"rightNow": {
						"$ref": "#/components/schemas/RightNowStatus"
					},
					"unreadCount": {
						"type": "integer"
					},
					"isVisiting": {
						"type": "boolean"
					},
					"isPopular": {
						"type": "boolean"
					}
				},
				"x-render-on-tag": "browse/grid",
				"x-display-name": "CascadeResponseProfile",
				"x-property-groups": [
					{
						"heading": "Only for [v3/cascade](/grindr-api/browse/grid#get-cascade-legacy):",
						"properties": {
							"lastOnline": {
								"description": "unix timestamp in milliseconds",
								"allOf": [
									{
										"$ref": "#/components/schemas/TimestampMs"
									}
								]
							},
							"photoMediaHashes": {
								"type": "array",
								"items": {
									"type": "string"
								},
								"description": "array of strings, see [Media](/grindr-api/media/index#media)"
							},
							"lookingFor": {
								"type": "array",
								"items": {
									"type": "integer"
								},
								"description": "array of integers, see [Looking for](/grindr-api/users/profiles#looking-for)"
							},
							"sexualPosition": {
								"type": "integer",
								"description": "integer, see [Sexual position ID](/grindr-api/users/profiles#sexual-position-id), may be absent"
							},
							"approximateDistance": {
								"type": "boolean"
							},
							"isFavorite": {
								"type": "boolean"
							},
							"isBoosting": {
								"type": "boolean"
							},
							"hasChattedInLast24Hrs": {
								"type": "boolean"
							},
							"hasUnviewedSpark": {
								"type": "boolean"
							},
							"isTeleporting": {
								"type": "boolean"
							},
							"isRoaming": {
								"type": "boolean"
							},
							"isRightNow": {
								"type": "boolean"
							},
							"hasUnreadThrob": {
								"type": "boolean"
							},
							"isBlockable": {
								"type": "boolean",
								"description": "boolean, optional"
							},
							"isBoostingSomewhereElse": {
								"type": "boolean"
							}
						},
						"required": [
							"lastOnline",
							"photoMediaHashes",
							"lookingFor",
							"approximateDistance",
							"isFavorite",
							"isBoosting",
							"hasChattedInLast24Hrs",
							"hasUnviewedSpark",
							"isTeleporting",
							"isRoaming",
							"isRightNow",
							"hasUnreadThrob",
							"isBoostingSomewhereElse"
						]
					},
					{
						"heading": "Only for [v4/cascade](/grindr-api/browse/grid#get-cascade):",
						"properties": {
							"primaryImageUrl": {
								"type": "string",
								"description": "string, URL"
							},
							"favorite": {
								"type": "boolean"
							},
							"viewed": {
								"type": "boolean"
							},
							"chatted": {
								"type": "boolean"
							},
							"roaming": {
								"type": "boolean"
							}
						}
					}
				],
				"required": [
					"profileId",
					"onlineUntil",
					"displayName",
					"rightNow",
					"unreadCount",
					"isVisiting",
					"isPopular"
				]
			},
			"ExpiringAlbumBody": {
				"allOf": [
					{
						"$ref": "#/components/schemas/AlbumMessageBody"
					}
				],
				"description": "Body for `\"ExpiringAlbum\"` message type. Extends [Album](#album-message-body).",
				"x-render-on-tag": "messaging/messages",
				"x-display-name": "ExpiringAlbumBody",
				"required": [
					"ownerProfileId",
					"albumId",
					"albumNumber",
					"totalAlbumsShared",
					"hasUnseenContent",
					"expiresAt",
					"expirationType",
					"coverUrl",
					"isViewable",
					"hasVideo",
					"hasPhoto",
					"viewableUntil"
				]
			},
			"ExpiringAlbumV2Body": {
				"allOf": [
					{
						"$ref": "#/components/schemas/ExpiringAlbumBody"
					}
				],
				"description": "Body for `\"ExpiringAlbumV2\"` message type. For [AlbumExpirationType](/grindr-api/messaging/albums#albumexpirationtype) = `ONCE` but might have other values if expiration settings were changed later. Extends [ExpiringAlbum](#expiring-album-body).",
				"x-render-on-tag": "messaging/messages",
				"x-display-name": "ExpiringAlbumV2Body",
				"required": [
					"ownerProfileId",
					"albumId",
					"albumNumber",
					"totalAlbumsShared",
					"hasUnseenContent",
					"expiresAt",
					"expirationType",
					"coverUrl",
					"isViewable",
					"hasVideo",
					"hasPhoto",
					"viewableUntil"
				]
			},
			"NonExpiringVideoBody": {
				"type": "object",
				"description": "Body for `\"NonExpiringVideo\"` message type. Unknown, WIP.",
				"x-render-on-tag": "messaging/messages",
				"x-display-name": "NonExpiringVideoBody",
				"x-wip": true
			},
			"GenerativeBody": {
				"type": "object",
				"description": "Body for `\"Generative\"` message type. Unknown, WIP.",
				"x-render-on-tag": "messaging/messages",
				"x-display-name": "GenerativeBody",
				"x-wip": true
			},
			"ProfileLinkBody": {
				"type": "object",
				"description": "Body for `\"ProfileLink\"` message type. Unknown, WIP.",
				"x-render-on-tag": "messaging/messages",
				"x-display-name": "ProfileLinkBody",
				"x-wip": true
			},
			"MediaHash": {
				"type": "string",
				"description": "See [Media -> Public CDN files -> Profile Images](/grindr-api/media/public-cdn-files#profile-images)"
			},
			"RewardedAdType": {
				"type": "string",
				"enum": [
					"LAST_VIEWED_ME_PROFILE",
					"ADS_FREE_SESSION",
					"READ_RECEIPTS",
					"CASCADE_PROFILES_UNLOCK",
					"TAPS_RECEIVED_UNLOCK"
				],
				"description": "Feature that can be temporarily unlocked by watching a rewarded ad.",
				"x-enum-labels": {
					"LAST_VIEWED_ME_PROFILE": "Reveal the most recent profile that viewed you",
					"ADS_FREE_SESSION": "Temporarily remove ads",
					"READ_RECEIPTS": "Temporarily enable message read receipts",
					"CASCADE_PROFILES_UNLOCK": "Unlock additional cascade (grid) profiles",
					"TAPS_RECEIVED_UNLOCK": "Reveal taps you have received"
				},
				"x-render-on-tag": "rewarded-ads",
				"x-display-name": "Rewarded Ad Type"
			},
			"RewardedAdRewardStatus": {
				"type": "string",
				"enum": [
					"ELIGIBLE",
					"ACTIVE",
					"EXHAUSTED"
				],
				"description": "Current state of a rewarded ad reward for the requesting user.",
				"x-enum-labels": {
					"ELIGIBLE": "The user may watch an ad to activate this reward",
					"ACTIVE": "The reward is currently unlocked; see `remainingTime`",
					"EXHAUSTED": "The reward has been used and is not currently available"
				},
				"x-render-on-tag": "rewarded-ads",
				"x-display-name": "Rewarded Ad Reward Status"
			},
			"RewardedAdInterval": {
				"type": "string",
				"enum": [
					"DAYS",
					"HOURS",
					"MINUTES"
				],
				"description": "Unit of time that `duration` is measured in.",
				"x-render-on-tag": "rewarded-ads",
				"x-display-name": "Rewarded Ad Interval"
			},
			"RewardedAdConsumptionStatus": {
				"type": "string",
				"enum": [
					"STARTED",
					"COMPLETED"
				],
				"description": "Lifecycle status reported while consuming a rewarded ad.",
				"x-enum-labels": {
					"STARTED": "The ad began playing",
					"COMPLETED": "The ad finished and the reward should be granted"
				},
				"x-render-on-tag": "rewarded-ads",
				"x-display-name": "Rewarded Ad Consumption Status"
			},
			"RewardedAdReward": {
				"type": "object",
				"description": "State of a single rewarded ad reward. All fields are nullable.",
				"properties": {
					"type": {
						"description": "Feature this reward unlocks.",
						"allOf": [
							{
								"$ref": "#/components/schemas/RewardedAdType"
							}
						]
					},
					"status": {
						"description": "Current state of the reward.",
						"allOf": [
							{
								"$ref": "#/components/schemas/RewardedAdRewardStatus"
							}
						]
					},
					"duration": {
						"type": "integer",
						"format": "int64",
						"description": "Length of the unlock window, measured in `interval` units (e.g. `1` with interval `HOURS`)."
					},
					"interval": {
						"description": "Unit for `duration`.",
						"allOf": [
							{
								"$ref": "#/components/schemas/RewardedAdInterval"
							}
						]
					},
					"remainingTime": {
						"type": "integer",
						"format": "int64",
						"description": "Time remaining before an `ACTIVE` reward expires. `null` unless the reward is active."
					},
					"countdownTime": {
						"type": "integer",
						"format": "int64",
						"description": "Time remaining before an `EXHAUSTED` reward becomes `ELIGIBLE` again. `null` unless applicable."
					}
				},
				"x-render-on-tag": "rewarded-ads",
				"x-display-name": "Rewarded Ad Reward"
			}
		}
	},
	"x-sidebar-order": [
		"authentication",
		"bootstrap",
		{
			"group": "messaging",
			"items": [
				"messaging/conversations",
				"messaging/saved-phrases",
				"messaging/messages",
				"messaging/albums",
				"messaging/misc"
			]
		},
		{
			"group": "users",
			"items": [
				"users/profiles",
				"users/favorites"
			]
		},
		"reports",
		{
			"group": "browse",
			"items": [
				"browse/location",
				"browse/grid",
				"browse/social-events",
				"browse/entitlements",
				"browse/links",
				"browse/travels",
				"browse/roam",
				"browse/age-verification",
				"browse/blocks",
				"browse/hides",
				"browse/discover"
			]
		},
		{
			"group": "analytics",
			"items": [
				"analytics/assignments",
				"analytics/trackers"
			]
		},
		{
			"group": "media",
			"items": [
				"media/public-cdn-files",
				"media/signed-cdn-files"
			]
		},
		{
			"group": "interest",
			"items": [
				"interest/views",
				"interest/taps",
				"interest/alist"
			]
		},
		"right-now",
		{
			"group": "settings",
			"items": [
				"settings/account",
				"settings/sms-verification"
			]
		},
		{
			"group": "third-party-integrations",
			"items": [
				"third-party-integrations/spotify"
			]
		},
		"storeapirest",
		"notifications",
		{
			"group": "woodwork",
			"items": [
				"woodwork/random-promotion-images"
			]
		},
		"ratings",
		"top-picks",
		"signal-share",
		"drawer",
		"legal-agreements",
		"grindrstore",
		"heatmap",
		"reddot",
		"videocalls",
		"modal",
		"warnings",
		"logging",
		"rewarded-chats",
		"rewarded-ads",
		"boosting",
		"gifs",
		"access-requests",
		"offers",
		"vip",
		"websocket"
	],
	"x-parameter-groups": {
		"GridQuery": {
			"x-render-on-tag": "browse/grid",
			"parameters": [
				{
					"$ref": "#/components/parameters/NearbyGeoHashQuery"
				},
				{
					"$ref": "#/components/parameters/ExploreGeoHashQuery"
				},
				{
					"$ref": "#/components/parameters/GridPhotoOnlyQuery"
				},
				{
					"$ref": "#/components/parameters/GridFaceOnlyQuery"
				},
				{
					"$ref": "#/components/parameters/GridNotRecentlyChattedQuery"
				},
				{
					"$ref": "#/components/parameters/GridHasAlbumQuery"
				},
				{
					"$ref": "#/components/parameters/GridFreshQuery"
				},
				{
					"$ref": "#/components/parameters/GridGendersQuery"
				},
				{
					"$ref": "#/components/parameters/GridPageNumberQuery"
				}
			]
		},
		"CascadeQuery": {
			"x-render-on-tag": "browse/grid",
			"x-inherits": "GridQuery",
			"parameters": [
				{
					"$ref": "#/components/parameters/CascadeOnlineOnlyQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeAgeMinQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeAgeMaxQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeHeightCmMinQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeHeightCmMaxQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeWeightGramsMinQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeWeightGramsMaxQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeTribesQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeLookingForQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeRelationshipStatusesQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeBodyTypesQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeSexualPositionsQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeMeetAtQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeNsfwPicsQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeTagsQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeRightNowQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeFavoritesQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeShowSponsoredProfilesQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeShuffleQuery"
				},
				{
					"$ref": "#/components/parameters/CascadeHotQuery"
				}
			]
		}
	}
}
