Skip to content

Albums ​

Pressie albums are albums other profiles shared with you. POST /v3/pressie-albums/feed lists them in sharedAlbums; albumViewable: false marks a locked one, and POST /v3/pressie-albums/feed/paywall/ returns blurred previews of locked albums. profileFeeds holds new content from those albums, one entry per profile, with paywallStatus: PAYWALL on locked entries.

Get my albums ​

Requires Authorization.

GET /v1/albums

Response:

Get an album ​

Requires Authorization.

GET /v2/albums/{albumId}

Response:

AlbumDetailsResponse

Errors:

  • 403 — if you don't have access to album or it doesn't exist

Rename an album ​

Requires Authorization.

PUT /v2/albums/{albumId}

Body:

  • albumName — string or null

Response:

  • albumId — integer
  • albumName — string or null

Get an album media poster ​

Requires Authorization.

GET /v1/albums/{albumId}/content/{contentId}/poster

Response:

  • blurredPosterUrl — URL
  • posterUrl — URL

Record view of an album ​

GET /v3/albums/{albumId}/view

Response:

Empty.

Errors:

  • 403 — Repeated requests after invoking this endpoint on view ONCE albums cause HTTP status 403 Forbidden and Action not permitted error.

Record view of media in an album ​

Requires Authorization.

Repeated requests after reaching remainingViews=0 do not cause any errors.

POST /v1/albums/{albumId}/view/content/{contentId}

Response:

  • remainingViews — integer

Get info about profile's album ​

Requires Authorization.

POST /v2/albums/shares

Body:

  • profileId — long integer

Response:

  • profileId — long integer
  • hasAlbum — boolean
  • hasSharedWithMe — boolean

Get albums shared by a profile ​

Requires Authorization.

GET /v2/albums/shares/{profileId}

Response:

  • albums — array of objects
    • everything from AlbumMin
    • everything from AlbumExpiration
    • profileId — integer
    • content — AlbumContentMin, a single blurred preview content item
    • contentCount — object
      • imageCount — integer
      • videoCount — integer

Create an album ​

Requires Authorization.

POST /v2/albums

Body:

  • albumName — string or null

Response:

  • albumId — long integer
  • albumName — string or null

Errors:

Delete an album ​

Requires Authorization.

DELETE /v1/albums/{albumId}

Response:

Empty

Errors:

  • 403 — Repeated requests cause 403 Forbidden and Action not permitted error.

Upload media to an album ​

Requires Authorization.

New media is added at the start of the album's content. Uploading a photo byte-identical to one already in the album adds nothing and returns the existing contentId.

A newly uploaded video is transcoded before it is ready: until then its album item has statusId 3 and processing true, see Get album media processing status. Video bytes the server has already transcoded come back ready (statusId 1) immediately. A video the transcoder cannot handle keeps processing true indefinitely.

POST /v1/albums/{albumId}/content

Query (optional):

  • width — integer, not validated and doesn't affect the stored media, videos get 400 without it, optional
  • height — integer, not validated and doesn't affect the stored media, videos get 400 without it, optional
  • isFresh — boolean, effect unknown, WIP, optional

Body:

Content-Type: multipart/form-data

  • content — binary

Response:

  • contentId — long integer
  • contentUrl — string or null, null for photo and video uploads

Errors:

  • 400 — A video was uploaded without width or height.
  • 402 — The album already holds maxContentItemsPerAlbum photos, or the upload is a video and the album already holds maxVideosPerAlbum videos, see Get album limits. The check runs before photo de-duplication, so a duplicate photo gets 402 too. A video that is still processing does not count toward maxVideosPerAlbum. Empty body.
  • 413 — The whole multipart/form-data request body is larger than maxContentSize, see Get album limits. Empty body.

Reorder media in an album ​

Requires Authorization.

POST /v1/albums/{albumId}/content/order

Body:

  • contentIds — array of long integers, each Media file ID must appear exactly once

Errors:

  • 400 — contentIds doesn't list every media file in the album.

Delete media from an album ​

Requires Authorization.

Technically, this does not delete the media from CDN. All signed URLs will continue to work until expired. Uploading the same photo again assigns it the same contentId, uploading the same video again assigns a new one.

DELETE /v1/albums/{albumId}/content/{contentId}

Response:

Empty

Errors:

  • 400 — The media is still processing (processing is true). Empty body.

Get album media processing status ​

Requires Authorization.

GET /v1/albums/{albumId}/content/{contentId}/processing

Response:

  • processing — boolean, true while a video is being transcoded, always false for photos

Pics, WIP ​

NOTE

This endpoint hasn't been researched yet

GET /v1/pics/limited/status

Response:

  • available — integer
  • total — integer

Pics expiring, WIP ​

NOTE

This endpoint hasn't been researched yet

POST /v4/pics/expiring

Pics expiring status, WIP ​

NOTE

This endpoint hasn't been researched yet

GET /v4/pics/expiring/status

Videos expiring status, WIP ​

NOTE

This endpoint hasn't been researched yet

GET /v4/videos/expiring/status

Get album shares ​

Requires Authorization.

Returns profiles the album was shared with.

GET /v1/albums/{albumId}/shares

Response:

  • profileIds — array of integers

Share an album ​

Requires Authorization.

Automatically sends the shared album to chat with all listed profiles.

POST /v4/albums/{albumId}/shares

Body:

Response:

Empty

Unshare an album ​

Requires Authorization.

PUT /v1/albums/{albumId}/unshares

Body:

  • profiles — array of objects
    • profileId — long integer
    • shareId — string, not validated, the official client sends a random UUID v4

Response:

Empty

Unshare an album from everybody, WIP ​

NOTE

This endpoint hasn't been researched yet

Unknown, returns 403

PUT /v1/albums/{albumId}/shares/remove

Add drawer media to an album ​

Requires Authorization.

Copies media from the drawer into the album. ids are drawer media ids. A video id results in 400, even within maxVideoLength.

POST /v1/albums/{albumId}/content/chat/list-by-id

Query:

  • isFresh — boolean

Body:

  • ids — array of long integers

Response:

Empty.

Errors:

  • 402 — The album is full. Unlike Upload media to an album, its video counts toward maxContentItemsPerAlbum. Empty body.

Get album limits ​

Requires Authorization.

Interestingly, /v2/albums/storage appears to exist, though it is not used in the current version of the APK.

GET /v1/albums/storage

Response:

  • subscriptionType — string, e.g. FreeAlbums
  • maxAlbums — integer
  • maxContentItemsPerAlbum — integer, photos per album, videos don't count
  • maxShares — integer
  • maxViewableAlbums — integer
  • maxViewableVideos — integer
  • maxContentSize — long integer, size in bytes of the whole upload request body
  • maxContentSizeHumanReadable — string, incorrectly uses decimal multiples notation (MB) when it in fact calculates binary notation (MiB), so API's 120.00 MB is actually 120 MiB or 125.8291 MB
  • maxVideoLength — long integer, length in milliseconds (1/1000th of a second), not enforced by the server
  • minVideoLength — long integer, length in milliseconds (1/1000th of a second)
  • maxShareableAlbums — integer
  • maxVideosPerAlbum — integer, videos per album, counted separately from maxContentItemsPerAlbum, so a full album holds maxContentItemsPerAlbum photos plus maxVideosPerAlbum videos

Albums red dot, WIP ​

NOTE

This endpoint hasn't been researched yet

This may just be tracking but could also be related to something else

PUT /v1/albums/red-dot

Response:

Empty.

Gets albums shared with us ​

Requires Authorization.

POST /v3/pressie-albums/feed

Body (optional):

  • isFavorite — boolean, optional, only albums shared by favorite users
  • isOnline — boolean, optional, only albums shared by currently online users
  • onlyVideo — boolean, optional, only albums with at least one video
  • blur — boolean, optional, blur media urls in response

Response:

  • profileFeeds — array of objects
    • profileId — integer
    • paywallStatus — string, ALLOW or PAYWALL (locked)
    • seen — boolean
    • content — object
    • profile — PressieProfileMini
  • sharedAlbums — array of objects
    • everything from AlbumPreview
    • albumViewable — boolean
    • albumVersion — integer
    • expiresAt — unix timestamp in milliseconds or null
    • name — string or null
    • ownerProfileId — integer
    • imageCount — integer
    • videoCount — integer
    • coverContent — object
      • id — long integer
      • contentType — string
      • location — string, cover media location/URL
      • status — string
    • profile — PressieProfileMini
  • experimentStatus — integer or null
  • nonEmptyPersonalAlbumCount — integer
  • emptyAlbumId — long integer or null

Get previews of locked albums shared with us ​

POST /v3/pressie-albums/feed/paywall/

Body (optional):

  • counterpartyId — long integer, profile ID or null

Response:

Pressie albums feed profile ID, WIP ​

NOTE

This endpoint hasn't been researched yet

GET /v3/pressie-albums/feed/{profileId}

Pressie albums feed update read, WIP ​

NOTE

This endpoint hasn't been researched yet

POST /v3/pressie-albums/feed/update/read

Gets fresh albums shared with us ​

Requires Authorization.

POST /v3/pressie-albums/fresh-feed

Body:

  • isFavorite — boolean, optional, only albums shared by favorite users
  • isOnline — boolean, optional, only albums shared by currently online users
  • onlyVideo — boolean, optional, only albums with at least one video
  • blur — boolean, optional, blur media urls in response

Response:

  • profileFeeds — array of objects
    • profileId — integer
    • paywallStatus — string, ALLOW or PAYWALL (locked)
    • seen — boolean
    • content — object
    • profile — PressieProfileMini
  • sharedAlbums — array of objects
    • everything from AlbumPreview
    • albumViewable — boolean
    • albumVersion — integer
    • expiresAt — unix timestamp in milliseconds or null
    • name — string or null
    • ownerProfileId — integer
    • imageCount — integer
    • videoCount — integer
    • coverContent — object
      • id — long integer
      • contentType — string
      • location — string, cover media location/URL
      • status — string
    • profile — PressieProfileMini
  • experimentStatus — integer or null
  • nonEmptyPersonalAlbumCount — integer
  • emptyAlbumId — long integer or null

AlbumExpirationType ​

Album expiration type.

Previously shared albums in chat inherit new expirationType settings from newer sharings of the album.

  • "INDEFINITE" or 0 — "Indefinitely"
  • "ONCE" or 1 — "View Once", limited by 30 minutes from request
  • "TEN_MINUTES" or 2 — "For 10 Minutes"
  • "ONE_HOUR" or 3 — "For 60 Minutes"
  • "ONE_DAY" or 4 — "For 24 Hours"

AlbumPreview ​

  • albumId — long integer
  • albumNumber — integer or null if album has expired or was locked
  • totalAlbumsShared — integer or null if album has expired or was locked
  • hasUnseenContent — boolean

AlbumMin ​

  • everything from AlbumPreview
  • albumName — string, appears to always be null
  • profileId — integer
  • albumViewable — boolean

AlbumDetails ​

  • sharedCount — integer
  • createdAt — string, date formatted as ISO 8601, e.g. 2026-03-27T20:39:00
  • updatedAt — string, date formatted as ISO 8601, e.g. 2026-03-27T20:39:00

AlbumExpiration ​

  • expiresAt — unix timestamp in milliseconds or null
  • expirationType — AlbumExpirationType or null

AlbumContentMin ​

  • contentId — long integer
  • contentType — string
  • coverUrl — AlbumCoverUrl
  • statusId — integer, 1 ready, 3 processing, other values unknown

AlbumContent ​

  • everything from AlbumContentMin
  • thumbUrl — string, unblurred preview, see Media -> Signed CDN files
  • url — string, original file, see Media -> Signed CDN files, may be "" if remainingViews is 0
  • processing — boolean, true while the server transcodes an uploaded video; statusId is then 3, and coverUrl, thumbUrl and url all equal the placeholder https://d3w4wp6rol9nvz.cloudfront.net/https://d1weu1y74qn7ma.cloudfront.net/albums-video-loading.mp4
  • rejectionId — unknown or null

MyAlbum ​

AlbumContentWithHash ​

  • everything from AlbumContent
  • contentHash — string, lowercase hex SHA-256 of the uploaded bytes, optional

AlbumContentWithRemainingViews ​

  • everything from AlbumContent
  • remainingViews — integer, might be -1; absent if this is your own album, optional

AlbumDetailsResponse ​

AlbumShareInfo ​

  • profileId — long integer
  • hasAlbum — boolean
  • hasSharedWithMe — boolean

AlbumsSharedByProfileResponse ​

  • albums — array of objects
    • everything from AlbumMin
    • everything from AlbumExpiration
    • profileId — integer
    • content — AlbumContentMin, a single blurred preview content item
    • contentCount — object
      • imageCount — integer
      • videoCount — integer

Album name ​

String, may be empty ("") or null, non-string values are coerced into strings.

Maximum 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).

  • albumName — string or null

AlbumRenameResponse ​

  • albumId — integer
  • albumName — string or null

AlbumShareRequest ​

AlbumUnshareRequest ​

  • profiles — array of objects
    • profileId — long integer
    • shareId — string, not validated, the official client sends a random UUID v4

AlbumContentUploadResponse ​

  • contentId — long integer
  • contentUrl — string or null, null for photo and video uploads

AlbumContentProcessingResponse ​

  • processing — boolean, true while a video is being transcoded, always false for photos

AlbumStorageLimits ​

  • subscriptionType — string, e.g. FreeAlbums
  • maxAlbums — integer
  • maxContentItemsPerAlbum — integer, photos per album, videos don't count
  • maxShares — integer
  • maxViewableAlbums — integer
  • maxViewableVideos — integer
  • maxContentSize — long integer, size in bytes of the whole upload request body
  • maxContentSizeHumanReadable — string, incorrectly uses decimal multiples notation (MB) when it in fact calculates binary notation (MiB), so API's 120.00 MB is actually 120 MiB or 125.8291 MB
  • maxVideoLength — long integer, length in milliseconds (1/1000th of a second), not enforced by the server
  • minVideoLength — long integer, length in milliseconds (1/1000th of a second)
  • maxShareableAlbums — integer
  • maxVideosPerAlbum — integer, videos per album, counted separately from maxContentItemsPerAlbum, so a full album holds maxContentItemsPerAlbum photos plus maxVideosPerAlbum videos

PressieProfileMini ​

  • profileId — long integer, optional
  • name — string, optional
  • profileUrl — string or null, optional
  • onlineUntil — unix timestamp in milliseconds or null, optional
  • distanceKm — number or null, optional

PressieAlbumsFeedResponse ​

  • profileFeeds — array of objects
    • profileId — integer
    • paywallStatus — string, ALLOW or PAYWALL (locked)
    • seen — boolean
    • content — object
    • profile — PressieProfileMini
  • sharedAlbums — array of objects
    • everything from AlbumPreview
    • albumViewable — boolean
    • albumVersion — integer
    • expiresAt — unix timestamp in milliseconds or null
    • name — string or null
    • ownerProfileId — integer
    • imageCount — integer
    • videoCount — integer
    • coverContent — object
      • id — long integer
      • contentType — string
      • location — string, cover media location/URL
      • status — string
    • profile — PressieProfileMini
  • experimentStatus — integer or null, optional
  • nonEmptyPersonalAlbumCount — integer
  • emptyAlbumId — long integer or null, optional

PressieAlbumsPaywallResponse ​

AlbumCoverUrl ​

String with URL or null, blurred downscaled preview.

JPEG photo with the first frame of video in case of video files.

Becomes unavailable (AccessDenied) after album has expired.

See Media -> Signed CDN files.

Open Grind is not affiliated with Grindr in any way.