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.
/api/ v1/ library/ seriesProgress 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.
Query
| Field | Type | Notes |
|---|---|---|
summary | integer | 1: summary of up to six series with two held parts. |
keys | string | Up to six comma-separated collection:id or franchise:id keys to load details. |
filter | string | all, progress or completed; counts are global. |
q | string | Series name, up to 200 characters. |
sort | string | progress (default) or name. |
page | integer | Page starting at 1, six series per page. |
/api/ v1/ library/ ignoredThe 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.
Query
| Field | Type | Notes |
|---|---|---|
games | string | Up to 200 comma-separated ids, for a page about to draw exactly those. Without it, the whole list answers. |
/api/ v1/ library/ ignoredIgnores 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.
Body
| Field | Type | Notes |
|---|---|---|
igdb_idrequired | integer | The game's catalog id. |
game_slugrequired | string | The game's slug. |
note | string | Why, 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. |
/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.
/api/ v1/ library/ poolThe caller's library with covers and names for game selection.
/api/ v1/ library/ cardsGame 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.
/api/ v1/ discovery/ libraryGames in progress and queued in the caller's library.
/api/ v1/ libraryThe owner's library, newest change first.
Query
| Field | Type | Notes |
|---|---|---|
page | integer | 1 to 1000. |
/api/ v1/ libraryAdd 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.
Body
| Field | Type | Notes |
|---|---|---|
igdb_idrequired | integer | The game's catalog id. |
game_slugrequired | string | The game's slug. |
status | string | BACKLOG, PLAYING, ON_HOLD, COMPLETED, DROPPED or WISHLIST. |
rating | integer | The 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_url | string | The 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. |
playing | boolean | Whether you are playing it right now. Independent of the status: a replay of a finished game is both at once. |
backlog | boolean | Quick flag. |
wishlist | boolean | Quick flag. |
liked | boolean | Quick flag. |
Example response
{
"data": {
"igdb_id": 14593,
"game_slug": "hollow-knight",
"status": "PLAYING",
"quick_rating": 90
}
}/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.
Body
| Field | Type | Notes |
|---|---|---|
cover_url | string | The 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). |
/api/ v1/ library/ {igdb_id}Take a game out of the library, with its rating and its flags.
/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.
Body
| Field | Type | Notes |
|---|---|---|
platform_id | integer | The platform's catalog id. |
platform_name | string | Up to 120 characters. |
storefront | string | The same list the collection's POST takes. |
ownership | string | OWNED, SUBSCRIPTION, BORROWED, RENTED, SHARED or PREVIOUSLY_OWNED. |
medium | string | PHYSICAL or DIGITAL. |
edition | string | Up to 120 characters. |
region | string | Up to 60 characters. |
note | string | Up to 300 characters. |
acquired_on | string | YYYY-MM-DD. |
/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.
/api/ v1/ library/ copiesThe 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.
Query
| Field | Type | Notes |
|---|---|---|
game | integer | Only that game's copies. |
games | integer | games=1 brings the catalog rows along, in the shape of /api/v1/games (type included), for anything drawing copies of several games at once. |
limit | integer | Copies per page: 1 to 100, 24 by default. It does not apply with game, which answers that one game's copies whole. |
cursor | string | The 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. |
sort | string | newest (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. |
platform | integer | Only 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. |
medium | string | PHYSICAL or DIGITAL. Filters combine with and, never or: medium and storefront together answer what matches both. |
ownership | string | OWNED, SUBSCRIPTION, BORROWED, RENTED, SHARED or PREVIOUSLY_OWNED. |
storefront | string | The same list the POST takes. A value outside it is ignored rather than refused, so a filter is never a value somebody typed. |
q | string | Searches the copies' title, edition and platform. It does not reach the catalog: the shelf answers. |
facets | integer | facets=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. |
group | string | platform, 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…"
}/api/ v1/ library/ copiesRecords 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.
Body
| Field | Type | Notes |
|---|---|---|
igdb_idrequired | integer | The game's catalog id. |
game_slugrequired | string | The game's slug. |
id | string | The copy to change. Without it, another is made. |
platform_id | integer | The platform's catalog id. |
platform_name | string | Up to 120 characters. |
storefront | string | STEAM, PLAYSTATION, NINTENDO, XBOX, GOG, EPIC, ITCH, NUUVEM, BATTLE_NET, UBISOFT, EA, AMAZON, HUMBLE, GOOGLE_PLAY, APP_STORE, RETAIL or OTHER. |
ownership | string | OWNED, SUBSCRIPTION, BORROWED, RENTED, SHARED or PREVIOUSLY_OWNED. |
medium | string | PHYSICAL or DIGITAL. |
edition | string | Up to 120 characters. |
region | string | Up to 60 characters. |
note | string | Up to 300 characters. |
acquired_on | string | YYYY-MM-DD. |