Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Query reading lists and book data from Hardcover.app via GraphQL API. Triggers when user mentions Hardcover, asks about their reading list/library, wants book progress, searches for books/authors/series, or references "currently reading", "want to read", or "books I've read". Also use for syncing reading data to other systems (Obsidian, etc.) or tracking reading goals.
Query reading lists and book data from Hardcover.app via GraphQL API. Triggers when user mentions Hardcover, asks about their reading list/library, wants book progress, searches for books/authors/series, or references "currently reading", "want to read", or "books I've read". Also use for syncing reading data to other systems (Obsidian, etc.) or tracking reading goals.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Query your reading library, book metadata, and search Hardcover's catalog.
Env variable: HARDCOVER_API_TOKEN from https://hardcover.app/settings Endpoint: https://api.hardcover.app/v1/graphql Rate limit: 60 req/min, 30s timeout, max 3 query depth
All queries require Authorization: Bearer {token} header (token from settings, add Bearer prefix): curl -X POST https://api.hardcover.app/v1/graphql \ -H "Authorization: Bearer $HARDCOVER_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"query": "query { me { id username } }"}'
Get user ID first โ most queries need it: query { me { id username } } Query by status โ use status_id filter: 1 = Want to Read 2 = Currently Reading 3 = Read 4 = Paused 5 = Did Not Finish Paginate large results โ use limit/offset, add distinct_on: book_id
query { me { user_books(where: { status_id: { _eq: 2 } }) { user_book_reads { progress_pages } book { title pages image { url } contributions { author { name } } } } } }
query ($userId: Int!, $status: Int!) { user_books( where: { user_id: { _eq: $userId }, status_id: { _eq: $status } } limit: 25 offset: 0 distinct_on: book_id ) { book { id title pages image { url } contributions { author { name } } } } }
query ($q: String!, $type: String!) { search(query: $q, query_type: $type, per_page: 10, page: 1) { results } } query_type: Book, Author, Series, Character, List, Publisher, User
query { editions(where: { title: { _eq: "Oathbringer" } }) { title pages isbn_13 edition_format publisher { name } book { slug contributions { author { name } } } } }
Read-only (no mutations yet) No text search operators (_like, _ilike, _regex) Access limited to: your data, public data, followed users' data Tokens expire after 1 year
For detailed field documentation on Books, Editions, Authors, Series, User Books, Activities, Lists, Goals, and other entities, see references/entities.md.
CodeMeaning200Success401Invalid/expired token429Rate limited
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.