Hardcover.app skill for tracking books you're reading, reading goal, and finding books you'd love to read
by @asaphko
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.
clawhub install hardcoverπ About This Skill
name: hardcover description: 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. homepage: https://hardcover.app metadata: { "openclaw": { "emoji": "π", "requires": { "env": ["HARDCOVER_API_TOKEN"] }, }, }
Hardcover GraphQL API
Query your reading library, book metadata, and search Hardcover's catalog.
Configuration
HARDCOVER_API_TOKEN from https://hardcover.app/settingshttps://api.hardcover.app/v1/graphqlAuthentication
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 } }"}'
Workflow
1. Get user ID first β most queries need it:
query { me { id username } }
2. Query by status β use status_id filter:
- 1 = Want to Read
- 2 = Currently Reading
- 3 = Read
- 4 = Paused
- 5 = Did Not Finish
3. Paginate large results β use limit/offset, add distinct_on: book_id
Common Queries
Currently Reading with Progress
query {
me {
user_books(where: { status_id: { _eq: 2 } }) {
user_book_reads { progress_pages }
book {
title
pages
image { url }
contributions { author { name } }
}
}
}
}
Library by Status
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 } }
}
}
}
Search Books/Authors/Series
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
Book Details by Title
query {
editions(where: { title: { _eq: "Oathbringer" } }) {
title
pages
isbn_13
edition_format
publisher { name }
book {
slug
contributions { author { name } }
}
}
}
Limitations
_like, _ilike, _regex)Entity Reference
For detailed field documentation on Books, Editions, Authors, Series, User Books, Activities, Lists, Goals, and other entities, see references/entities.md.
Response Codes
| Code | Meaning | |------|---------| | 200 | Success | | 401 | Invalid/expired token | | 429 | Rate limited |
βοΈ Configuration
HARDCOVER_API_TOKEN from https://hardcover.app/settingshttps://api.hardcover.app/v1/graphql