{"id":30653114,"url":"https://github.com/official-wizard/openlibrary-kotlin","last_synced_at":"2025-08-31T07:35:25.401Z","repository":{"id":254073025,"uuid":"845402175","full_name":"official-wizard/openlibrary-kotlin","owner":"official-wizard","description":"A client for accessing openlibrary.org to query books in their database!","archived":false,"fork":false,"pushed_at":"2024-12-31T06:46:42.000Z","size":485,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-23T09:22:30.341Z","etag":null,"topics":["openlibrary","openlibrary-api"],"latest_commit_sha":null,"homepage":"https://openlibrary.org","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/official-wizard.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-21T07:18:49.000Z","updated_at":"2025-05-21T22:44:00.000Z","dependencies_parsed_at":"2024-08-21T08:44:53.141Z","dependency_job_id":"10cd5e7c-9c79-411b-8e9b-975c135e1f69","html_url":"https://github.com/official-wizard/openlibrary-kotlin","commit_stats":null,"previous_names":["official-wizard/openlibrary-kotlin"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/official-wizard/openlibrary-kotlin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/official-wizard%2Fopenlibrary-kotlin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/official-wizard%2Fopenlibrary-kotlin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/official-wizard%2Fopenlibrary-kotlin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/official-wizard%2Fopenlibrary-kotlin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/official-wizard","download_url":"https://codeload.github.com/official-wizard/openlibrary-kotlin/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/official-wizard%2Fopenlibrary-kotlin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272953906,"owners_count":25021133,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-31T02:00:09.071Z","response_time":79,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["openlibrary","openlibrary-api"],"created_at":"2025-08-31T07:35:20.161Z","updated_at":"2025-08-31T07:35:25.369Z","avatar_url":"https://github.com/official-wizard.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003cp align=\"center\" dir=\"auto\"\u003e\n    \u003ca href=\"https://openlibrary.org/developers/api\" rel=\"nofollow\"\u003e\n        \u003cimg src=\"https://i.imgur.com/93jMMZa.png\" width=\"200\" alt=\"OpenLibrary API Icon\" style=\"max-width: 100%;\"/\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003e\u003ca href=\"https://openlibrary.org/developers/api\"\u003eOpenLibrary.org\u003c/a\u003e Client for Kotlin\u003c/h1\u003e\n\n## Installation\n\nTo begin, import the library using jitpack.io.\n\nYou can include jitpack in your `pom.xml` by adding the following jitpack repository:\n\n```xml\n\u003crepository\u003e\n    \u003cid\u003ejitpack.io\u003c/id\u003e\n    \u003curl\u003ehttps://www.jitpack.io\u003c/url\u003e\n\u003c/repository\u003e\n```\n\nThen add this `openlibrary-kotlin` dependency to your `pom.xml` project!\n\n```xml\n\u003cdependency\u003e    \n    \u003cgroupId\u003ecom.github.official-wizard\u003c/groupId\u003e    \n    \u003cartifactId\u003eopenlibrary-kotlin\u003c/artifactId\u003e    \n    \u003cversion\u003e1.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## Usage\n\n### Basic Usage\n\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryClient = OpenLibraryClient(identifier).api\n\n// access the api interface in `api`\n```\n\n### Authentication\nSome endpoints require you to be authenticated, e.g. the ones for creating lists.\nYou can easily authenticate your client by doing the following.\n\n```kotlin\n// create client instance\nval client = OpenLibraryClient(Identifier()).api\n\n// send the authentication request\nval authentication: NetworkResponse\u003cLogin.Response, Unit\u003e =\n    client.authenticate(username = \"\u003cemail\u003e\", password = \"\u003cpassword\u003e\")\n\n// an error occurred\nif (authentication !is NetworkResponse.Success) {\n\n    if (authentication is NetworkResponse.ServerError) {\n        // the credentials you provided are most likely invalid, refer to response code for further\n        // information\n    }\n\n    if (authentication is NetworkResponse.UnknownError) {\n        // an unknown error occurred while authenticating, handle [authentication] result\n    }\n\n    // ...\n\n    return\n}\n\nval authenticationResponse: Login.Response = authentication.body\nif (authenticationResponse.authenticated) {\n    // we've authenticated our [client], this only needs to be done once per instance\n}\n```\n\n## More Examples\n\n### Book Search\n\n\u003cdetails\u003e\n\u003csummary\u003eQuery\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name   | Type   | Description                                                     | Example               | required |\n|:-------|:-------|:----------------------------------------------------------------|:----------------------|----------|\n| query  | String | The query you'd like to search for.                             | The Lord of The Rings | yes      |\n| sort   | String | How you'd like to sort the query, by default it uses relevancy. | new                   | no       |\n| lang   | String | The users language as a two letter (ISO 639-1) language code.   | en                    | no       |\n| offset | Long   | offset the list by the provided amount.                         | 50                    | no       |\n| page   | Long   | The page you'd like to traverse to.                             | 0                     | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchBooks.Response, SearchBooks.Response\u003e\n    = api.searchBooksByQuery(query = \"The Lord of the Rings\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchBooks.Response = search.body\n    // handle [searchResult] as you wish\n}\n\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eTitle\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name   | Type   | Description                                                     | Example               | required |\n|:-------|:-------|:----------------------------------------------------------------|:----------------------|----------|\n| title  | String | The title you'd like to search for.                             | The Lord of The Rings | yes      |\n| sort   | String | How you'd like to sort the query, by default it uses relevancy. | new                   | no       |\n| lang   | String | The users language as a two letter (ISO 639-1) language code.   | en                    | no       |\n| offset | Long   | offset the list by the provided amount.                         | 50                    | no       |\n| page   | Long   | The page you'd like to traverse to.                             | 0                     | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchBooks.Response, SearchBooks.Response\u003e\n    = api.searchBooksByTitle(title = \"The Lord of the Rings\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchBooks.Response = search.body\n    // handle [searchResult] as you wish\n}\n\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eAuthor\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name   | Type   | Description                                                     | Example     | required |\n|:-------|:-------|:----------------------------------------------------------------|:------------|----------|\n| author | String | The author you'd like to search for.                            | J K Rowling | yes      |\n| sort   | String | How you'd like to sort the query, by default it uses relevancy. | new         | no       |\n| lang   | String | The users language as a two letter (ISO 639-1) language code.   | en          | no       |\n| offset | Long   | offset the list by the provided amount.                         | 50          | no       |\n| page   | Long   | The page you'd like to traverse to.                             | 0           | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchBooks.Response, SearchBooks.Response\u003e\n    = api.searchBooksByAuthor(author = \"J K Rowling\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchBooks.Response = search.body\n    // handle [searchResult] as you wish\n}\n\n```\n\n\u003c/details\u003e\n\n---\n\n### Profile Search (My)\n\n\u003cdetails\u003e\n\u003csummary\u003eWant To Read Books\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name     | Type   | Description                                                     | Example | required |\n|:---------|:-------|:----------------------------------------------------------------|:--------|----------|\n| username | String | The username you'd like to search for.                          | mokBot  | yes      |\n| sort     | String | How you'd like to sort the query, by default it uses relevancy. | new     | no       |\n| lang     | String | The users language as a two letter (ISO 639-1) language code.   | en      | no       |\n| offset   | Long   | offset the list by the provided amount.                         | 50      | no       |\n| page     | Long   | The page you'd like to traverse to.                             | 0       | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchMyBooks.Response, SearchMyBooks.Response\u003e\n    = api.searchMyWantToReadBooks(username = \"mokBot\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchMyBooks.Response = search.body\n    // handle [searchResult] as you wish\n}\n\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eCurrently Reading Books\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name     | Type   | Description                                                     | Example | required |\n|:---------|:-------|:----------------------------------------------------------------|:--------|----------|\n| username | String | The username you'd like to search for.                          | mokBot  | yes      |\n| sort     | String | How you'd like to sort the query, by default it uses relevancy. | new     | no       |\n| lang     | String | The users language as a two letter (ISO 639-1) language code.   | en      | no       |\n| offset   | Long   | offset the list by the provided amount.                         | 50      | no       |\n| page     | Long   | The page you'd like to traverse to.                             | 0       | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchMyBooks.Response, SearchMyBooks.Response\u003e\n    = api.searchMyCurrentlyReadingBooks(username = \"mokBot\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchMyBooks.Response = search.body\n    // handle [searchResult] as you wish\n}\n\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eAlready Read Books\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name     | Type   | Description                                                     | Example | required |\n|:---------|:-------|:----------------------------------------------------------------|:--------|----------|\n| username | String | The username you'd like to search for.                          | mokBot  | yes      |\n| sort     | String | How you'd like to sort the query, by default it uses relevancy. | new     | no       |\n| lang     | String | The users language as a two letter (ISO 639-1) language code.   | en      | no       |\n| offset   | Long   | offset the list by the provided amount.                         | 50      | no       |\n| page     | Long   | The page you'd like to traverse to.                             | 0       | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchMyBooks.Response, SearchMyBooks.Response\u003e\n    = api.searchMyAlreadyReadBooks(username = \"mokBot\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchMyBooks.Response = search.body\n    // handle [searchResult] as you wish\n}\n\n```\n\n\u003c/details\u003e\n\n---\n\n### Works Search\n\n\u003cdetails\u003e\n\u003csummary\u003eWorks\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name   | Type   | Description                             | Example | required |\n|:-------|:-------|:----------------------------------------|:--------|----------|\n| olid   | String | the OLID to the works.                  | OL01W   | yes      |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchWorks.Response, ErrorResponse.Response\u003e\n    = api.searchWorks(olid = \"OL01W\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchWorks.Response = search.body\n    // handle [searchResult] as you wish\n}\n\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eEditions\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name   | Type   | Description                             | Example | required |\n|:-------|:-------|:----------------------------------------|:--------|----------|\n| olid   | String | the OLID to the works.                  | OL01W   | yes      |\n| offset | Long   | offset the list by the provided amount. | 50      | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchWorksEditions.Response, ErrorResponse.Response\u003e\n    = api.searchWorksEditions(olid = \"OL01W\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchWorksEditions.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eBookshelves\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name   | Type   | Description                             | Example | required |\n|:-------|:-------|:----------------------------------------|:--------|----------|\n| olid   | String | the OLID to the works.                  | OL01W   | yes      |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchWorksBookshelves.Response, ErrorResponse.Response\u003e\n    = api.searchWorksBookshelves(olid = \"OL01W\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchWorksBookshelves.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eRatings\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name   | Type   | Description                             | Example | required |\n|:-------|:-------|:----------------------------------------|:--------|----------|\n| olid   | String | the OLID to the works.                  | OL01W   | yes      |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchWorksRatings.Response, ErrorResponse.Response\u003e\n    = api.searchWorksRatings(olid = \"OL01W\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchWorksRatings.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eIsbn\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name | Type   | Description            | Example | required |\n|:-----|:-------|:-----------------------|:--------|----------|\n| isbn | String | the isbn to the works. | 0000    | yes      |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchIsbn.Response, ErrorResponse.Response\u003e\n    = api.searchWorksIsbn(isbn = \"0000\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchIsbn.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\n\u003c/details\u003e\n\n---\n\n### Authors Search\n\n\u003cdetails\u003e\n\u003csummary\u003eAuthors\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name  | Type   | Description                             | Example     | required |\n|:------|:-------|:----------------------------------------|:------------|----------|\n| query | String | author's query you'd like to serch for. | J K Rowling | yes      |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchAuthors.Response, SearchAuthors.Response\u003e\n    = api.searchAuthors(query = \"\u003cauthor query\u003e\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchAuthors.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\n\u003c/details\u003e\n\n---\n\n\n### Subjects Search\n\n\u003cdetails\u003e\n\u003csummary\u003eSubject\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name             | Type    | Description                           | Example   | required |\n|:-----------------|:--------|:--------------------------------------|:----------|----------|\n| subject          | String  | The subject you'd like to search for. | Love      | yes      |\n| details          | Boolean | Include details about the subject.    | True      | no       |\n| publishedInRange | String  | Date range for punishments.           | 2008-2010 | no       |\n| limit            | Int     | Limit the amount of results to return | 50        | no       |\n| offset           | Int     | Offset the results to jump to.        | 0         | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchSubjects.Response, SearchSubjects.Response\u003e\n    = api.searchSubjects(subject = \"love\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchSubjects.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\n\u003c/details\u003e\n\n---\n\n### Partners Search\n\n\u003cdetails\u003e\n\u003csummary\u003ePartner\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name             | Type    | Description                           | Example      | required |\n|:-----------------|:--------|:--------------------------------------|:-------------|----------|\n| partner          | Partner | A supported partner to query with.    | Partner.isbn | yes      |\n| partnerId        | String  | The partner ID to query with.         | 01a0         | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchPartner.Response, SearchPartner.Response\u003e\n    = api.searchPartner(partner = Partner.isbn, partnerId = \"01s3\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchPartner.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003ePartners\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name        | Type   | Description                                       | Example                                           | required |\n|:------------|:-------|:--------------------------------------------------|:--------------------------------------------------|----------|\n| requestList | String | List of partners and the IDs you'd like to query. | id:1;lccn:50006784\\|olid:OL6179000M;lccn:55011330 | yes      |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchPartner.Response, SearchPartner.Response\u003e\n    = api.searchPartners(requestList = \"id:1;lccn:50006784|olid:OL6179000M;lccn:55011330\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: Map\u003cString, SearchPartner.Response\u003e \n        = search.body\n    // handle [searchResult] as you wish\n}\n```\n\u003c/details\u003e\n\n---\n\n### Changes Search\n\n\u003cdetails\u003e\n\u003csummary\u003eRecent\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name   | Type    | Description                           | Example | required |\n|:-------|:--------|:--------------------------------------|:--------|----------|\n| bot    | Boolean | Ignore changes made by bots.          | True    | no       |\n| limit  | Int     | Limit the amount of results to return | 50      | no       |\n| offset | Int     | Offset the results to jump to.        | 0       | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cList\u003cSearchChanges.Response\u003e, ErrorResponse.Response\u003e\n    = api.searchRecentChanges()\n\nif (search is NetworkResponse.Success) {\n    val searchResult: List\u003cSearchChanges.Response\u003e\n        = search.body\n    // handle [searchResult] as you wish\n}\n```\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003eType\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name   | Type               | Description                           | Example                         | required |\n|:-------|:-------------------|:--------------------------------------|:--------------------------------|----------|\n| query  | SearchChangesQuery | Change type.                          | SearchChangesQuery(year = 2008) | yes      |\n| bot    | Boolean            | Ignore changes made by bots.          | True                            | no       |\n| limit  | Int                | Limit the amount of results to return | 50                              | no       |\n| offset | Int                | Offset the results to jump to.        | 0                               | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cList\u003cSearchChanges.Response\u003e, ErrorResponse.Response\u003e\n    = api.searchChanges(query = SearchChangesQuery(year = 2008))\n\nif (search is NetworkResponse.Success) {\n    val searchResult: List\u003cSearchChanges.Response\u003e\n        = search.body\n    // handle [searchResult] as you wish\n}\n```\n\u003c/details\u003e\n\n---\n\n### Lists\n\n\u003cdetails\u003e\n\u003csummary\u003eUser\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name     | Type   | Description                           | Example | required |\n|:---------|:-------|:--------------------------------------|:--------|----------|\n| username | String | Open Library Username                 | mekBot  | yes      |\n| limit    | Int    | Limit the amount of results to return | 50      | no       |\n| offset   | Int    | Offset the results to jump to.        | 0       | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchUsersList.Response, ErrorResponse.Response\u003e\n    = api.searchUsersList(username = \"mekBot\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchUsersList.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eUser (OLID)\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name     | Type   | Description                           | Example | required |\n|:---------|:-------|:--------------------------------------|:--------|----------|\n| username | String | Open Library Username                 | mekBot  | yes      |\n| olid     | String | The OLID to query.                    | OL1AW   | yes      |\n| limit    | Int    | Limit the amount of results to return | 50      | no       |\n| offset   | Int    | Offset the results to jump to.        | 0       | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchUserOlidList.Response, ErrorResponse.Response\u003e\n    = api.searchUsersList(username = \"mekBot\", olid = \"OL01L\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchUserOlidList.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eSeeds\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name     | Type   | Description                           | Example | required |\n|:---------|:-------|:--------------------------------------|:--------|----------|\n| username | String | Open Library Username                 | mekBot  | yes      |\n| olid     | String | The OLID to query.                    | OL1AW   | yes      |\n| limit    | Int    | Limit the amount of results to return | 50      | no       |\n| offset   | Int    | Offset the results to jump to.        | 0       | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchUsersSeedList.Response, ErrorResponse.Response\u003e\n    = api.searchUsersSeedList(username = \"mekBot\", olid = \"OL01L\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchUsersSeedList.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eEditions\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name     | Type   | Description                           | Example | required |\n|:---------|:-------|:--------------------------------------|:--------|----------|\n| username | String | Open Library Username                 | mekBot  | yes      |\n| olid     | String | The OLID to query.                    | OL1AW   | yes      |\n| limit    | Int    | Limit the amount of results to return | 50      | no       |\n| offset   | Int    | Offset the results to jump to.        | 0       | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchUsersEditionList.Response, ErrorResponse.Response\u003e\n    = api.searchUsersEditionList(username = \"mekBot\", olid = \"OL01L\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchUsersEditionList.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eSubjects\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name     | Type   | Description                           | Example | required |\n|:---------|:-------|:--------------------------------------|:--------|----------|\n| username | String | Open Library Username                 | mekBot  | yes      |\n| olid     | String | The OLID to query.                    | OL1AW   | yes      |\n| limit    | Int    | Limit the amount of results to return | 50      | no       |\n| offset   | Int    | Offset the results to jump to.        | 0       | no       |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchUsersSubjectsList.Response, ErrorResponse.Response\u003e\n    = api.searchUsersSubjectsList(username = \"mekBot\", olid = \"OL01L\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchUsersSubjectsList.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eOLID Books\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name     | Type   | Description                           | Example | required |\n|:---------|:-------|:--------------------------------------|:--------|----------|\n| olid     | String | The OLID to query.                    | OL1AW   | yes      |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchUsersList.Response, ErrorResponse.Response\u003e\n    = api.searchOlidBooksList(olid = \"OL01L\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchUsersList.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eWorks\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name     | Type   | Description                           | Example | required |\n|:---------|:-------|:--------------------------------------|:--------|----------|\n| olid     | String | The OLID to query.                    | OL1AW   | yes      |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchUsersList.Response, ErrorResponse.Response\u003e\n    = api.searchOlidWorksList(olid = \"OL01L\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchUsersList.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eAuthors\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name     | Type   | Description                           | Example | required |\n|:---------|:-------|:--------------------------------------|:--------|----------|\n| olid     | String | The OLID to query.                    | OL1AW   | yes      |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchUsersList.Response, ErrorResponse.Response\u003e\n    = api.searchOlidAuthorsList(olid = \"OL01L\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchUsersList.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003ePlace (location)\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name     | Type   | Description                 | Example       | required |\n|:---------|:-------|:----------------------------|:--------------|----------|\n| location | String | The location to search for. | san_francisco | yes      |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchUsersList.Response, ErrorResponse.Response\u003e\n    = api.searchSubjectsPlaceList(location = \"san_francisco\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchUsersList.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eQuery\u003c/summary\u003e\n\u003cbr\u003e\n\n| Name  | Type   | Description              | Example | required |\n|:------|:-------|:-------------------------|:--------|----------|\n| query | String | The query to search for. | book    | yes      |\n\n**Example**\n```kotlin\nval identifier: Identifier = Identifier(\"\u003cclient user agent\u003e\")\nval api: OpenLibraryInterface = OpenLibraryClient(identifier).api\n\nval search: NetworkResponse\u003cSearchUsersList.Response, ErrorResponse.Response\u003e\n    = api.searchQueryList(query = \"book\")\n\nif (search is NetworkResponse.Success) {\n    val searchResult: SearchUsersList.Response = search.body\n    // handle [searchResult] as you wish\n}\n```\n\u003c/details\u003e\n\n### Update Lists\n\n\u003cdetails\u003e\n\u003csummary\u003eCreate List\u003c/summary\u003e\n\u003cbr\u003e\n\n\u003e A call to `createList` in this manner will will update a pre-existing list with the details provided!\n\n\u003e **NOTE** You must have the client authenticated to do this!\n\n**Available Parameters**\n\n| Name       | Type               | Description                                          | Example  |\n|:-----------|:-------------------|:-----------------------------------------------------|:---------|\n| username   | String             | The username authenticated for the session           | username |\n| olid       | String             | The OLID (Open Library ID) of the list               | OL01L    |\n| createList | CreateList.Request | The request object with details to create list with. | N/A      |\n\n**Example**\n```kotlin\n// create client instance\nval client = OpenLibraryClient(Identifier()).api\n\n// send the authentication request\nval authentication: NetworkResponse\u003cLogin.Response, Unit\u003e =\n    client.authenticate(username = \"\u003cemail\u003e\", password = \"\u003cpassword\u003e\")\n\n// an error occurred\nif (authentication !is NetworkResponse.Success) {\n\n    if (authentication is NetworkResponse.ServerError) {\n        // the credentials you provided are most likely invalid, refer to response code for further\n        // information\n    }\n\n    if (authentication is NetworkResponse.UnknownError) {\n        // an unknown error occurred while authenticating, handle [authentication] result\n    }\n\n    // ...\n\n    return\n}\n\nval authenticationResponse: Login.Response = authentication.body\nif (authenticationResponse.authenticated) {\n    // we've authenticated our [client], this only needs to be done once per instance\n\n    // make sure we have a valid username to work with\n    val username = authenticationResponse.username\n    if (username != null) {\n\n        // send request to server\n        val createList = client.createList(\n            username = username,\n            createList = CreateList.Request(\n                \"\u003cnew name\u003e\",\n                \"\u003cnew description\u003e\"\n            )\n        )\n\n        if (createList !is NetworkResponse.Success) {\n           // handle errors\n            return\n        }\n        \n        // handle our result\n        val result: CreateList.Response = createList.body\n    }\n}\n```\n\n\u003c/details\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fofficial-wizard%2Fopenlibrary-kotlin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fofficial-wizard%2Fopenlibrary-kotlin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fofficial-wizard%2Fopenlibrary-kotlin/lists"}