People
The little that is read about somebody else.
Connections, standing and verification. Nothing here says more than the profile page already shows to anyone who opens it.
/api/ v1/ profiles/ {username}/ socialRelationships and the profile conversation. The visitor wallet is returned only for its own session or key.
/api/ v1/ profiles/ {username}/ listsList previews and visible counts. Filters: visibility, mode, sort, limit (1 to 48), offset, before, q, folder. folder is a folder's public_id, or NONE for the ones in no folder, which is a different answer from not asking. sort is recent (the default), oldest, name, likes or size: size puts the lists with the most games first, counted as each preview's count (on a tier list, the ranked games its board still shows), and breaks ties by the most recent update. offset pages any order. before keeps only the lists updated before that instant, and is a cursor for recent alone.
/api/ v1/ profiles/ {username}/ lists/ foldersFolders for browsing a profile's lists. Owners receive all folders; visitors receive folders and counts for lists they may read, including follower-only lists when following the owner. Empty and exclusively private folders are not exposed. unfiled counts visible lists in no folder. Public read, subject to profile visibility; editing folders requires ownership.
/api/ v1/ activityVisible activity. Filters: profile, profiles, game, kinds, q, rating, spoilers, order, before, limit (1 to 180), offset (one kind). A capture carries imageUrl, the whole picture, and thumbnailUrl with thumbnailWidth and thumbnailHeight, a WebP of at most 640 pixels across, or null when it has none yet.
/api/ v1/ profiles/ {username}/ reviewsVisible reviews and sessions. Activity filters apply, with the author fixed by username.
/api/ v1/ profiles/ {username}/ screenshotsPaged gallery (48 per page), counts, games and interactions. Each capture carries contains_spoilers and sensitive (true when the author or the automatic check marked it: show it behind a warning), and thumbnail_url with thumbnail_width and thumbnail_height, a WebP of at most 640 pixels across for the grid, or null on a capture that has none yet, when image_url is the one to use. Whoever reads their own gallery also gets each capture's visibility. total, safe_count and spoiler_count count the whole gallery, and matching what the filters find; a capture moderation removed is in none of them. games is every game in the gallery, not only the page's, ordered by name, each with igdb_id, game_slug, name (the catalogue's, or null when the catalogue no longer knows the game) and count, how many of its captures the reader may see. Filters: page, q (in the description, the game's name or its slug, with spaces or hyphens), spoilers (all/safe/spoilers), sort (new/old), game (a game_slug). games=1 adds catalog, the catalogue entry of every game on the page.
/api/ v1/ discovery/ peopleFriends playing and people with similar taste, including levels.
/api/ v1/ search/ companiesCatalogue companies. q, role: publisher or developer, status=active, sort: relevance, catalog, name, oldest or newest; page: 1 to 100. Public.
/api/ v1/ search/ peopleVisible people, levels and relationships with the caller. q, verified=1, sort: relevance, newest or name; page: 1 to 100, 24 per page. A suspended account is left out, of the total too, for everyone but staff and itself.
/api/ v1/ search/ countsHow many results each search tab holds for q (games, reviews, lists, tier lists, awards, people, companies), counted by each tab's own criteria and capped at cap (1000). Without q, the visible total. Cached for 60 seconds.
/api/ v1/ profiles/ {username}Public profile and canonical username, including aliases.
/api/ v1/ profiles/ {username}/ summaryVisible counts and the visitor relationship. viewer_follows says whether the reader follows the profile, and follows_viewer whether the profile follows the reader (false signed out and on one's own profile). played, playing, backlog and wishlist count the library's shelves the way the library page filters them, within what the reader may see of it: played is the COMPLETED status, the Played shelf; playing and backlog are the flags; wishlist is the flag or the WISHLIST status. A game being replayed counts in both played and playing.
Example response
{
"data": {
"library": 42, "played": 18, "playing": 2, "backlog": 9, "wishlist": 7,
"lists": 3, "reviews": 12, "diary": 30, "journeys": 20,
"screenshots": 15, "screenshot_games": 6, "screenshot_spoilers": 1,
"followers": 10, "following": 8,
"viewer_follows": true, "follows_viewer": false
}
}/api/ v1/ profiles/ {username}/ layoutThe layout the profile is drawn with: the one its owner published in Profile Studio, or the default. Never the draft, not even for the owner. customized says whether it came from a published layout. A profile the reader may not see in full answers with the default, like a profile with no layout. media resolves, by id, only the images the published document names (url, width, height, animated); an image uploaded for the draft does not appear until it is published.
Example response
{
"data": {
"layout": { "schema": 2, "page": { ... }, "sections": [ ... ] },
"customized": true,
"media": {
"k3Jd8Qp2Lm": {
"url": "https://media.uloggd.com/layout/.../....avif",
"width": 1600, "height": 900, "animated": false
}
}
}
}/api/ v1/ profiles/ {username}/ libraryAnyone's library, by username, with your own key: it returns what that person shows you (everything for a public library, nothing for a private one, and a followers-only one only if you follow them). profile carries the current username, useful when the request used an old one. has_more signals another page.
Query
| Field | Type | Notes |
|---|---|---|
page | integer | 1 to 1000. |
limit | integer | 1 to 1000, default 100. |
status | string | One status only: COMPLETED, PLAYING, ON_HOLD, DROPPED, BACKLOG or WISHLIST. |
playing, backlog, wishlist, liked | boolean | true for only the games with that flag. They combine. |
sort | string | updated (default, most recent first) or rating (highest rating first). |
games | integer | 1 to include each game's name, cover and slug in games, in the same answer. |
Example response
curl "https://uloggd.com/api/v1/profiles/ada/library?playing=true&games=1" \
-H "Authorization: Bearer ulg_live_..."/api/ v1/ profiles/ {username}/ statsEverything the person has played, added up: totals, year by year, days of the week, the games with the most time, the copies' platforms and how the ratings fall. All counted in the database, and only what the reader can see is in it. taste carries the visible ids with each one's minutes, up to a thousand, because genre, studio and publisher are not in the database: anything wanting those counts asks the catalog once with those ids.
/api/ v1/ profiles/ {username}/ journeysThe person's visible runs, newest first, with the catalog rows beside them, in the shape of /api/v1/games. A run is one pass through a game: its state, dates, difficulty, how far it got and the copy it was played on. The visibility rule is the usual one: a run is as visible as what is inside it and always visible to its author, so a stranger sees the ones with something public in them and the totals of that public part.
Query
| Field | Type | Notes |
|---|---|---|
page | integer | 1 to 200. |
limit | integer | 1 to 48, 24 by default. |
/api/ v1/ profiles/ {username}/ year/ {year}Somebody's year, from 2000 through the current one, with what the reader may see: sessions, reviews, library, lists, screenshots, journeys and totals. library holds the library rows that moved in the year (finished, started, added or changed), each with added and played. played says whether it is a game played that year: finished or started in it, added in it already in a played state (PLAYING, COMPLETED, DROPPED, ON_HOLD), or still marked as being played and last changed in it. Wishlisting, backlogging, rating again or changing a cover moves a row but is not playing: count the year's games from the sessions and the rows with played.
/api/ v1/ profiles/ {username}/ mineralsPublic mineral balances and level, without the transfer ledger.
/api/ v1/ profiles/ {username}/ connectionsWho follows somebody, or who they follow. Paged on created_at rather than by offset: the list is being scrolled while accounts follow and unfollow, and an offset would skip or repeat a row every time the ones above it moved. The cursor is the created_at of the last item returned.
Query
| Field | Type | Notes |
|---|---|---|
tab | string | followers or following. The default is followers. |
before | string | The created_at of the last item on the previous page. |
limit | integer | 1 to 50. The default is 20. |
q | string | Filters by username or display name. |
/api/ v1/ profiles/ {username}/ verificationWho vouched for an account's badge, and when. No scope: the badge is already on the profile for anyone to see, and this only says what it means. An account that was never verified answers null rather than a refusal: "no" is an answer here, not a secret. It takes the username or the id, because one is what somebody reading a profile has and the other is what a page that already loaded the row has.
/api/ v1/ profiles/ levelsStanding for several accounts at once. A page renders many cards wanting the same thing about different people, and asking per card is how a list of twenty becomes twenty requests.
Query
| Field | Type | Notes |
|---|---|---|
idsrequired | string | 1 to 100 account ids, separated by commas. |
Profile, summary, layout, library, year, minerals, connections and levels can be read without a session. Database policies determine which rows are visible. A key still needs the listed scope, and an invalid key returns 401 even on a public read. Profile lookup accepts a current username or an alias from the last 30 days and returns the current username. Mineral balances exclude transfers.
People search leaves suspended accounts out for everyone but staff and the account itself, the same rule that hides what they posted.