REST API and MCP server
Book series data for your app or AI agent
Free REST API and MCP server for book series reading orders, author series and book-to-series lookups. Register, get an API key and start in minutes.
- series
- 60,000+
- authors
- 15,000+
- books
- 500,000+
Quick start
GET. Send the key as Authorization: Bearer <key> or X-API-Key: <key>. Send it in a header only. Never put it in a query string, because query strings end up in access logs.export LOB_API_KEY="lob_your_key_here"Base URL: https://www.listofbooks.net/api/public/v1. Every 200 answer is { results, withheld, moreAt }.
results- The matches. An empty list means nothing matched.
results[].url- The listofbooks.net page the result came from. Link to it when you show the result.
withheld- Matches left out because the daily limit of distinct pages was reached.
moreAt- Where to keep browsing on listofbooks.net.
Search series
Find book series by name. Up to 5 matches, each with a link to its reading-order page.
queryRequired. 3 to 200 characters, with at least 3 letters or digits.
curl -G "https://www.listofbooks.net/api/public/v1/search-series" \
--data-urlencode "query=harry potter" \
-H "Authorization: Bearer $LOB_API_KEY"{
"results": [
{
"title": "Harry Potter",
"kind": "series",
"url": "https://www.listofbooks.net/series/harry-potter?utm_source=api&utm_medium=rest"
}
],
"withheld": 0,
"moreAt": "https://www.listofbooks.net/series?utm_source=api&utm_medium=rest"
}Search authors
Find authors by name. Up to 5 matches, each with a link to the author page.
queryRequired. 3 to 200 characters, with at least 3 letters or digits.
curl -G "https://www.listofbooks.net/api/public/v1/search-authors" \
--data-urlencode "query=rowling" \
-H "Authorization: Bearer $LOB_API_KEY"{
"results": [
{
"name": "J. K. Rowling",
"url": "https://www.listofbooks.net/authors/j-k-rowling?utm_source=api&utm_medium=rest"
}
],
"withheld": 0,
"moreAt": "https://www.listofbooks.net/series?utm_source=api&utm_medium=rest"
}Get a reading order
The books of the best-matching series, in reading order, or in publication order when the series has no separate reading order.
seriesRequired. 3 to 200 characters, with at least 3 letters or digits.
curl -G "https://www.listofbooks.net/api/public/v1/get-reading-order" \
--data-urlencode "series=harry potter" \
-H "Authorization: Bearer $LOB_API_KEY"{
"results": [
{
"title": "Harry Potter",
"url": "https://www.listofbooks.net/series/harry-potter?utm_source=api&utm_medium=rest",
"author": "J. K. Rowling",
"order": "publication",
"totalBooks": 7,
"books": [
{
"position": 1,
"title": "Harry Potter and the Philosopher's Stone",
"year": 1997
},
{
"position": 2,
"title": "Harry Potter and the Chamber of Secrets",
"year": 1998
},
{
"position": 3,
"title": "Harry Potter and the Prisoner of Azkaban",
"year": 1999
}
],
"booksOmitted": 0
}
],
"withheld": 0,
"moreAt": "https://www.listofbooks.net/series?utm_source=api&utm_medium=rest"
}Shortened here to 3 of the 7 books.
List an author's series
The best-matching author and the titles of the series they wrote, up to 25.
authorRequired. 3 to 200 characters, with at least 3 letters or digits.
curl -G "https://www.listofbooks.net/api/public/v1/get-author-series" \
--data-urlencode "author=rowling" \
-H "Authorization: Bearer $LOB_API_KEY"{
"results": [
{
"name": "J. K. Rowling",
"url": "https://www.listofbooks.net/authors/j-k-rowling?utm_source=api&utm_medium=rest",
"series": [
{
"title": "Harry Potter",
"bookCount": 7
}
],
"seriesOmitted": 0
}
],
"withheld": 0,
"moreAt": "https://www.listofbooks.net/series?utm_source=api&utm_medium=rest"
}Find the series of a book
The series a book belongs to, the position of the book in it, and the order of the series.
titleRequired. 1 to 200 characters, with at least one letter or digit.authorRequired. 1 to 200 characters, with at least one letter or digit.
curl -G "https://www.listofbooks.net/api/public/v1/find-series-for-book" \
--data-urlencode "title=Harry Potter and the Goblet of Fire" \
--data-urlencode "author=J. K. Rowling" \
-H "Authorization: Bearer $LOB_API_KEY"{
"results": [
{
"title": "Harry Potter",
"url": "https://www.listofbooks.net/series/harry-potter?utm_source=api&utm_medium=rest",
"order": "publication",
"position": 4,
"totalBooks": 7,
"books": [
{
"position": 3,
"title": "Harry Potter and the Prisoner of Azkaban",
"year": 1999,
"isCurrent": false
},
{
"position": 4,
"title": "Harry Potter and the Goblet of Fire",
"year": 2000,
"isCurrent": true
},
{
"position": 5,
"title": "Harry Potter and the Order of the Phoenix",
"year": 2003,
"isCurrent": false
}
],
"booksOmitted": 0
}
],
"withheld": 0,
"moreAt": "https://www.listofbooks.net/series?utm_source=api&utm_medium=rest"
}Shortened here to 3 of the 7 books.
MCP server
https://www.listofbooks.net/api/public/mcp. Listing the tools needs no key. Calling a tool needs Authorization: Bearer <key>.Cursor and other clients with custom headers
Add this to the MCP settings of a client that takes a server URL and headers, such as Cursor, and replace the key.
{
"mcpServers": {
"listofbooks": {
"url": "https://www.listofbooks.net/api/public/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}Claude Code
Run this once. It reads the key from the environment variable you set above.
claude mcp add --transport http listofbooks \
https://www.listofbooks.net/api/public/mcp \
--header "Authorization: Bearer $LOB_API_KEY"Claude Desktop
Claude Desktop does not send a key header to a remote server, so it connects through the mcp-remote bridge, which needs Node.js. Open Settings, Developer, Edit Config, add this to claude_desktop_config.json, replace the key and restart Claude Desktop.
{
"mcpServers": {
"listofbooks": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://www.listofbooks.net/api/public/mcp",
"--header",
"Authorization:${LOB_AUTH_HEADER}"
],
"env": {
"LOB_AUTH_HEADER": "Bearer YOUR_API_KEY"
}
}
}
}Tools
search_seriesFind book series by name. Up to 5 matches, each with a link to its reading-order page.Input: querysearch_authorsFind authors by name. Up to 5 matches, each with a link to the author page.Input: queryget_reading_orderThe books of the best-matching series, in reading order, or in publication order when the series has no separate reading order.Input: seriesget_author_seriesThe best-matching author and the titles of the series they wrote, up to 25.Input: authorfind_series_for_bookThe series a book belongs to, the position of the book in it, and the order of the series.Input: title, author
A missing or invalid key answers with a JSON-RPC error whose data holds the same error code as the REST API. A limit or a failure comes back as a tool result with isError.
Pricing
$0
- 10 calls per minute
- 60 calls per hour
- 200 calls per day
- 50 distinct series or author pages per day
- REST API and MCP server
Requires a visible link back to each result page
Custom
- Higher limits, agreed with you
- No attribution requirement
- Priority email support
- The same REST API and MCP server
Free compared with Paid
| Feature | Free | Paid |
|---|---|---|
API key | Included | Included |
REST API and MCP server | Included | Included |
Calls | 10/min, 60/hour, 200/day | Higher, agreed with you |
Distinct pages per day | 50 | Higher, agreed with you |
Link back to each result page | Required | Not required |
Support | Contact form | Priority email |
Errors and rate limits
{ "error": { "code", "message" } }. Switch on the code, not the message.{
"error": {
"code": "rate_limited",
"message": "Rate limit reached: 10 calls per minute. Retry after 2026-11-13T06:45:00.000Z. Do not retry sooner. Browse https://www.listofbooks.net/series?utm_source=api&utm_medium=rest for more."
}
}- Status 400
invalid_parametersA query parameter is missing, unknown, repeated or out of bounds.Fix the request. The message names the parameter. - Status 401
missing_api_keyThe request carries no API key.Send the key asAuthorization: Bearer <key>orX-API-Key. - Status 401
api_key_in_queryThe key was sent in the URL query string, which the API never reads.Move the key to theAuthorization: Bearer <key>orX-API-Keyheader. A URL is logged along the way, so replace a key that was sent in one. - Status 401
invalid_api_keyThe key is not valid, or it was revoked.Check the key, or create a new one in your account. - Status 403
forbiddenThe request did not come through the public API address.Call https://www.listofbooks.net. - Status 404
not_foundNo such endpoint.Use one of the endpoints listed above. - Status 429
rate_limitedThe member reached a per-minute, per-hour or per-day call limit.Wait for theRetry-Afterseconds. All keys of one member share the limits. - Status 429
page_limit_reachedThe member reached the daily limit of distinct series and author pages.Wait for theRetry-Afterseconds, or ask for higher limits. - Status 500
internal_errorThe lookup failed.Retry later. - Status 503
over_capacityThe API as a whole reached its capacity.Wait for theRetry-Afterseconds. - Status 503
busyThe service is busy.Wait for theRetry-Afterseconds. - Status 503
timed_outThe lookup took too long.Wait for theRetry-Afterseconds.
Rate limits
The free plan allows 10 calls per minute, 60 calls per hour, 200 calls per day, 50 distinct series or author pages per day. All keys of one account share these limits.
X-RateLimit-Limit- On 200 and 429 answers, the limit of the window closest to running out (minute, hour or day).
X-RateLimit-Remaining- On 200 and 429 answers, the calls left in that window.
X-RateLimit-Reset- On 200 and 429 answers, when that window resets, in Unix epoch seconds.
Retry-After- On 429 and 503, the seconds to wait before the next call.
What counts toward the limits
A call counts once the service has accepted it, before it looks anything up. These answers count: a 200, then page_limit_reached (429), internal_error (500) and timed_out (503). A 500 from the lookup itself, or a timeout, still uses a call. These do not count: invalid_parameters (400), missing_api_key (401), api_key_in_query (401), invalid_api_key (401), forbidden (403), not_found (404), rate_limited (429) and busy (503), and a 405 (any method but GET, HEAD included). An over_capacity answer counts only when the shared daily page budget raised it, after the call was accepted. When the API is switched off, every endpoint answers 404 with an empty body.
Parallel calls
The service handles 2 catalog calls at once per server process. Parallel calls from one key can therefore get busy (503) with a Retry-After header. A busy answer does not count. Call one at a time, or wait for Retry-After before you retry.
Terms of use
Link back to the result page
On the free plan, wherever you show a result, show a visible link to the listofbooks.net page it came from. Use the url field of that result as the link target.
No bulk copying
Use the API to answer a question or enrich a page. Do not crawl it to copy the catalog, build a competing dataset, or train a model on it. The limits exist to stop this, and a client that works around them can lose its key.
Keys can be revoked
We can revoke a key for abuse, for working around the limits, or for hiding the link back. Keep your key private. Anyone who has it uses your limits.
No warranty
The catalog is compiled from public sources and can contain mistakes. The API is provided as is, and the endpoints and limits can change. The site terms apply as well.
Frequently asked questions
Keys, limits and links.
Is the API free?
Yes. Register with an email address and a password, create a key in your account and call the API. The free plan allows 10 calls per minute, 60 per hour and 200 per day.
How do I get an API key?
Create a free account on the sign-up page, confirm your email address and open the API keys page in your account. You can have up to 2 keys. The key is shown once, so copy it when you create it.
What are the limits?
10 calls per minute, 60 per hour, 200 per day, and 50 distinct series or author pages per day. All keys of one account share them. Successful REST answers carry X-RateLimit headers, and 429 and 503 answers carry Retry-After.
What do I have to credit?
Show a visible link to the listofbooks.net page each result came from, using the url field of the result. Paid plans have no attribution requirement.
How do I get higher limits or priority support?
Contact us and tell us what you are building and how many calls you need. We agree higher limits with you, and paid plans include priority email support. There is no checkout.
Which MCP clients work?
Any client that supports Streamable HTTP servers with a custom header, such as Cursor, VS Code and Claude Code. Claude Desktop connects through the mcp-remote bridge, which the MCP section shows. Listing the tools needs no key. Calling a tool needs your key, sent as Authorization: Bearer or X-API-Key.
Is there a machine-readable description?
Yes. The OpenAPI 3.1 document is at https://www.listofbooks.net/openapi.json.