uloggdDevelopers
Developer portaluloggd
Get startedResourcesArcade
Developer portaluloggdIdentityCatalogProfileLibraryReviewsJournalListsAwardsScreenshotsSocialAccountNotificationsCommentsLikesHistoryPeopleMineralsArcade

Library

What the owner is playing, has played, and wants to play.

The quick rating is the one-to-ten scale the cards show, stored ten times larger: 10 to 100 in steps of 10.

GET/api/v1/library/series

Progress for every series belonging to the caller. Compact global index and one page of details. Ignore changes the denominator; explicit variants count for the original game. No other owner can be requested.

Scope library.read · Counted against the read allowance

Query

FieldTypeNotes
summaryinteger1: summary of up to six series with two held parts.
keysstringUp to six comma-separated collection:id or franchise:id keys to load details.
filterstringall, progress or completed; counts are global.
qstringSeries name, up to 200 characters.
sortstringprogress (default) or name.
pageintegerPage starting at 1, six series per page.
GET/api/v1/library/ignored

The games the owner decided not to play. They leave the series counts and stay in the row: a 1997 satellite broadcast that no longer exists is a fact about the series, and counting it for ever would say somebody is behind on something nobody can reach. It is not DROPPED, which is about a game that was played, and it is not a wishlist upside down. The caller's own: there is no way to read another person's.

Scope library.read · Counted against the read allowance

Query

FieldTypeNotes
gamesstringUp to 200 comma-separated ids, for a page about to draw exactly those. Without it, the whole list answers.
POST/api/v1/library/ignored

Ignores a game, or changes the note on one already ignored. Pressing it twice means the same thing both times, so it is an upsert rather than a second row.

Scope library.write · Counted against the write allowance

Body

FieldTypeNotes
igdb_idrequiredintegerThe game's catalog id.
game_slugrequiredstringThe game's slug.
notestringWhy, in the writer's own words, up to 140 characters. The site offers no list of reasons because it would be wrong about the third one.
DELETE/api/v1/library/ignored/{id}

Counts the game again. Nothing else about it changes, because nothing else ever did: ignoring is a sentence about the progress bar, not about the library.

Scope library.write · Counted against the write allowance

GET/api/v1/library/pool

The caller's library with covers and names for game selection.

Scope library.read · Counted against the read allowance

GET/api/v1/library/cards

Game states in the caller's library and library counts. ids: 1 to 200 ids; with no ids, answers the counts alone; all=1 answers the whole library, up to three thousand rows, for the reads that are about the shelf rather than about a screenful of it.

Scope library.read · Counted against the read allowance

GET/api/v1/discovery/library

Games in progress and queued in the caller's library.

Scope library.read · Counted against the read allowance

GET/api/v1/library

The owner's library, newest change first.

Scope library.read · Counted against the read allowance

Query

FieldTypeNotes
pageinteger1 to 1000.
POST/api/v1/library

Add or change one game. At least one of status, clear_status, rating, cover or a flag is required. clear_status turns that status off and gives the game back what it was before.

Scope library.write · Counted against the write allowance

Body

FieldTypeNotes
igdb_idrequiredintegerThe game's catalog id.
game_slugrequiredstringThe game's slug.
statusstringBACKLOG, PLAYING, ON_HOLD, COMPLETED, DROPPED or WISHLIST.
ratingintegerThe quick rating, 10 to 100 in steps of 10. It is the one-to-ten scale the cards show, stored ten times larger. Send null to clear it.
cover_urlstringThe cover this game shows you: an IGDB image address as the site builds one, https://images.igdb.com/igdb/image/upload/t_{size}/{image_id}.jpg, where size is cover_big, 1080p, logo_med, thumb or original, image_id is 1 to 64 letters, digits, - or _, and the end is .jpg or .png. Spaces at either end are ignored; any other address, or one with a control character, answers 400 with reason invalid_cover_url. This is narrower than before, when any address under https://images.igdb.com/ of up to 2048 characters was accepted; covers already saved stay, except those that held a control character, which went back to the catalog cover. The game does not have to be in the library yet.
playingbooleanWhether you are playing it right now. Independent of the status: a replay of a finished game is both at once.
backlogbooleanQuick flag.
wishlistbooleanQuick flag.
likedbooleanQuick flag.

Example response

{
  "data": {
    "igdb_id": 14593,
    "game_slug": "hollow-knight",
    "status": "PLAYING",
    "quick_rating": 90
  }
}
PATCH/api/v1/library/{igdb_id}

Change a game already in the library. It takes the same fields as the POST, without game_slug: the row already says which game it is. A game that is not there yet answers 404, and goes in through the POST.

Scope library.write · Counted against the write allowance

Body

FieldTypeNotes
cover_urlstringThe cover chosen for this game, under the POST's rule: only an IGDB image address as the site builds one (https://images.igdb.com/igdb/image/upload/t_cover_big/{image_id}.jpg); anything else answers 400 with reason invalid_cover_url, a narrower rule than before (see the POST). A cover comes from the catalog rather than from anywhere. Others see it only if they chose to see other players' covers (custom_cover_scope EVERYONE on their own profile).
DELETE/api/v1/library/{igdb_id}

Take a game out of the library, with its rating and its flags.

Scope library.write · Counted against the write allowance

PATCH/api/v1/library/copies/{id}

Changes one copy. What the body leaves out stays as it is. The collection also takes an id on POST, and keeps taking it.

Scope library.write · Counted against the write allowance

Body

FieldTypeNotes
platform_idintegerThe platform's catalog id.
platform_namestringUp to 120 characters.
storefrontstringThe same list the collection's POST takes.
ownershipstringOWNED, SUBSCRIPTION, BORROWED, RENTED, SHARED or PREVIOUSLY_OWNED.
mediumstringPHYSICAL or DIGITAL.
editionstringUp to 120 characters.
regionstringUp to 60 characters.
notestringUp to 300 characters.
acquired_onstringYYYY-MM-DD.
DELETE/api/v1/library/copies/{id}

Forgets a copy. The runs played on it lose the recorded platform and keep their sessions: deleting the copy is not deleting the playing.

Scope library.write · Counted against the write allowance

GET/api/v1/library/copies

The owner's copies, a page at a time: what they own, or have access to. A run points at the copy it was played on. With game, it answers that one game's copies whole and without a cursor, which is what a game's page asks.

Scope library.read · Counted against the read allowance

Query

FieldTypeNotes
gameintegerOnly that game's copies.
gamesintegergames=1 brings the catalog rows along, in the shape of /api/v1/games (type included), for anything drawing copies of several games at once.
limitintegerCopies per page: 1 to 100, 24 by default. It does not apply with game, which answers that one game's copies whole.
cursorstringThe previous page's next_cursor. This collection walks by cursor rather than by page number, because a shelf changes while you walk it and an offset would repeat or skip rows. A cursor that makes no sense starts from the beginning.
sortstringnewest (the default), oldest, title or acquired. Under acquired the undated copies come last: somebody who never recorded when they got one is not somebody who got it first. The cursor belongs to the order, so changing sort starts again.
platformintegerOnly copies on that platform, by catalog id. The facet answers with the id in value and the name in label: the name is presentation, and filtering by it would mean filtering on something that gets spelled two ways.
mediumstringPHYSICAL or DIGITAL. Filters combine with and, never or: medium and storefront together answer what matches both.
ownershipstringOWNED, SUBSCRIPTION, BORROWED, RENTED, SHARED or PREVIOUSLY_OWNED.
storefrontstringThe same list the POST takes. A value outside it is ignored rather than refused, so a filter is never a value somebody typed.
qstringSearches the copies' title, edition and platform. It does not reach the catalog: the shelf answers.
facetsintegerfacets=1 brings the counts by platform, medium, ownership and storefront, and the totals. Each facet is counted with the other filters applied and its own ignored, so choosing a platform does not leave every other platform reading zero with no way back. The totals, by contrast, are about the filtered result, search included: a screen showing 22 Steam copies never says "of 100 games". They keep two similar questions apart: games owned more than once, and games owned on more than one platform. Somebody with two identical PS5 discs counts in the first and not in the second.
groupstringplatform, medium, ownership or storefront. Brings group_counts: how large each group is across the whole result rather than the page. A shelf of 40 Steam copies says 40 while the first 24 are on screen, and still says 40 after loading more. It respects every filter, including its own: under medium=PHYSICAL a Steam group of 5 physical copies says 5, not the 25 that exist.

Example response

{
  "data": [
    {
      "id": "0f0b8e2c-…",
      "igdb_id": 14593,
      "game_slug": "hollow-knight",
      "platform_name": "Nintendo Switch",
      "medium": "PHYSICAL",
      "acquired_on": "2024-03-02"
    }
  ],
  "page": { "size": 24, "has_more": true },
  "next_cursor": "WyIyMDI2LTA5LTI3…"
}
POST/api/v1/library/copies

Records a copy, or changes one by sending id. Everything but the game is optional: "I played it on PS5" is a row with a platform and nothing else. Answers 201.

Scope library.write · Counted against the write allowance

Body

FieldTypeNotes
igdb_idrequiredintegerThe game's catalog id.
game_slugrequiredstringThe game's slug.
idstringThe copy to change. Without it, another is made.
platform_idintegerThe platform's catalog id.
platform_namestringUp to 120 characters.
storefrontstringSTEAM, PLAYSTATION, NINTENDO, XBOX, GOG, EPIC, ITCH, NUUVEM, BATTLE_NET, UBISOFT, EA, AMAZON, HUMBLE, GOOGLE_PLAY, APP_STORE, RETAIL or OTHER.
ownershipstringOWNED, SUBSCRIPTION, BORROWED, RENTED, SHARED or PREVIOUSLY_OWNED.
mediumstringPHYSICAL or DIGITAL.
editionstringUp to 120 characters.
regionstringUp to 60 characters.
notestringUp to 300 characters.
acquired_onstringYYYY-MM-DD.

Profile

The owner's own profile.

Reviews

The owner's reviews.