Albums
WIP. No idea what SpankBank, pressie albums and paywalled albums are.
AlbumExpirationType
"INDEFINITE"or0— "Indefinitely""ONCE"or1— "View Once", limited by 30 minutes from request"TEN_MINUTES"or2— "For 10 Minutes""ONE_HOUR"or3— "For 60 Minutes""ONE_DAY"or4— "For 24 Hours"
Previously shared albums in chat inherit new expirationType settings from newer sharings of the album.
AlbumPreview
albumId— long integeralbumNumber— integer ornullif album has expired or was lockedtotalAlbumsShared— integer ornullif album has expired or was lockedhasUnseenContent— boolean
AlbumMin
- everything from AlbumPreview
albumName— appears to always benullprofileId— integeralbumViewable— boolean
AlbumDetails
sharedCount— integercreatedAt— string, date formatted as ISO 8601, e.g.2026-03-27T20:39:00updatedAt— string, date formatted as ISO 8601, e.g.2026-03-27T20:39:00
AlbumExpiration
expiresAt— unix timestamp in milliseconds ornullexpirationType— AlbumExpirationType
AlbumContentMin
contentId— long integercontentType— stringcoverUrl— AlbumCoverUrlstatusId— unknown integer, WIP
AlbumContent
- everything from AlbumContentMin
thumbUrl— string, unblurred preview, see Media -> Signed CDN filesurl— string, original file, see Media -> Signed CDN files, may be""ifremainingViewsis 0processing— booleanrejectionId- unknown ornull
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.
Album name
String, may be empty ("") or null, non-string values are coerced into string.
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 codepoit).
Get my albums
Requires Authorization.
GET /v1/albumsResponse:
albums— array of objects- everything from AlbumDetails
albumId— long integeralbumName— Album nameprofileId— integerversion— integercontent— AlbumContentisShareable— boolean
Get an album
Requires Authorization.
GET /v2/albums/{albumId}Response:
- everything from AlbumMin
- everything from AlbumDetails
content— array of objects- everything from AlbumContent
remainingViews— integer, might be -1; absent if this is your album
Errors:
- HTTP status 403 — if you don't have access to album or it doesn't exist
Get an album media poster
Requires Authorization.
GET /v1/albums/{albumId}/content/{contentId}/posterResponse:
blurredPosterUrl— string, see Media -> Signed CDN filesposterUrl— string, see Media -> Signed CDN files
Record view of an album
Repeated requests after invoking this endpoint on view ONCE albums cause HTTP status 403 Forbidden and Action not permitted error.
GET /v3/albums/{albumId}/viewResponse:
Empty
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/sharesBody:
profileId— integer
Response:
profileId— long integerhasAlbum— booleanhasSharedWithMe— 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
content— a single AlbumContentMin, a blurred previewcontentCount— objectimageCount— integervideoCount— integer
Create an album
Requires Authorization.
POST /v2/albumsBody:
albumName— Album name
Response:
albumId— long integer
Error:
- HTTP status 402 Payment required if you reached limit for number of created albums
Rename an album
Requires Authorization.
PUT /v2/albums/{albumId}Body:
albumName— Album name
Response:
albumId— integeralbumName— Album name
Delete an album
Requires Authorization.
Repeated requests cause 403 Forbidden and Action not permitted error.
DELETE /v1/albums/{albumId}Response:
Empty
Upload media to an album
Requires Authorization.
Repeated requests with the same file (its contents) are skipped and a cached result from the first upload request is returned.
POST /v1/albums/{albumId}/contentQuery:
width— number, optional, doesn't affect the resulting imageheight— number, optional, doesn't affect the resulting imageisFresh— boolean, optional, unknown how it affects the resulting image, WIP
Body:
Content-Type: multipart/form-data
content— file to upload
Response:
contentId— Media file IDcontentUrl—null
Reorder media in an album
Requires Authorization.
POST /v1/albums/{albumId}/content/orderBody:
contentIds— array of long integers, each Media file ID must appear exactly once
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 same file will result in getting it assigned the same contentId.
DELETE /v1/albums/{albumId}/content/{contentId}Response:
Empty
Albums content processing, WIP
WIP
GET /v1/albums/{albumId}/content/{contentId}/processingResponse:
processing— boolean
Pics, WIP
- GET /v1/pics/limited/status . UnlimitedPhotoStatusResponse
Response:
- available — integer
- total — integer
Pics expiring, WIP
- POST /v4/pics/expiring ExpiringPhotoReportSentRequest ExpiringPhotoStatusResponse
Pics expiring status, WIP
- GET /v4/pics/expiring/status . ExpiringPhotoStatusResponse
Videos expiring status, WIP
- GET /v4/videos/expiring/status . PrivateVideoStatusResponse
Get album shares
Requires Authorization.
Returns profiles the album was shared with.
GET /v1/albums/{albumId}/sharesResponse:
profileIds— array of integers
Share an album
Requires Authorization.
Automatically sends the shared album to chat with all listed profiles.
POST /v4/albums/{albumId}/sharesBody:
profiles— array of objectsexpirationType— AlbumExpirationTypeprofileId— integer
Response:
Empty
Unshare an album
Requires Authorization.
PUT /v1/albums/{albumId}/unsharesBody:
profiles— array of objectsprofileId— long integershareId— unknown integer, can be0
Response:
Empty
Unshare an album from everybody
WIP
Unknown, returns 403
PUT /v1/albums/{albumId}/shares/removeAlbums content chat list-by-id, WIP
WIP
Unknown, {"ids":[852120758]} returns 400
POST /v1/albums/{albumId}/content/chat/list-by-idQuery:
isFresh— boolean
Body:
ids— array of long integers
Get album limits
Requires Authorization.
GET /v1/albums/storageInterestingly, /v2/albums/storage appears to exist, though not used in current version of APK.
Response:
subscriptionType— string, e.g.FreeAlbumsmaxAlbums— integermaxContentItemsPerAlbum— integermaxShares— integermaxViewableAlbums— integermaxViewableVideos— integermaxContentSize— long integer, size in bytesmaxContentSizeHumanReadable— string, incorrectly uses decimal multiples notation (MB) when in fact calculates binary notation (MiB), so API's120.00 MBis actually 120 MiB or 125.8291 MBmaxVideoLength— long integer, length in milliseconds (1/1000th of a second)minVideoLength— long integer, length in milliseconds (1/1000th of a second)maxShareableAlbums— integermaxVideosPerAlbum— integer
Albums red dot, WIP
This may just be tracking but could also be related to something else
PUT /v1/albums/red-dotResponse:
Empty.
Gets albums shared with us
Requires Authorization.
POST /v3/pressie-albums/feedBody:
isFavorite— boolean, optional, only albums shared by favorite usersisOnline— boolean, optional, only albums shared by currently online usersonlyVideo— boolean, optional, only albums with at least one videoblur— boolean, optional, blur media urls in response
Response:
profileFeeds- array of objectsprofileId— integerpaywallStatus— string, e.g.ALLOWseen- booleancontent— objectprofile— objectprofileId— long integername— string, may be emptyprofileUrl— string ornullonlineUntil— unknown ornulldistanceKm— float ornull
sharedAlbums- array of objects- everything from AlbumPreview
albumViewable— booleanalbumVersion— integerexpiresat— unix timestamp in milliseconds ornull(observed key spelling; may also appear asexpiresAt)name— Album nameownerProfileId— integerimageCount— integervideoCount— integercoverContent— objectid— long integercontentType— stringcoverContent— AlbumCoverUrlstatus— string, e.g.ACTIVE
profile— objectprofileId— long integername— string, may be emptyprofileUrl— string ornullonlineUntil— unknown ornulldistanceKm— float ornull
experimentStatus- numbernonEmptyPersonalAlbumCount- numberemptyAlbumId-null
Pressie albums feed paywall
POST /v3/pressie-albums/feed/paywall/No body.
Response:
albumPaywallContent- array of objectsalbumId— long integerprofile— objectprofileId— long integername— string, may be emptyprofileUrl— string ornullonlineUntil— unknown ornulldistanceKm— float ornull
paywallCoverUrl— string, see Media -> Signed CDN filespaywallUrls— array of strings, see Media -> Signed CDN filesalbumsItemCount— integer
Pressie albums feed profile ID, WIP
WIP
GET /v3/pressie-albums/feed/{profileId}Pressie albums feed update read, WIP
WIP
POST /v3/pressie-albums/feed/update/read