> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.biblioreads.eu.org/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.biblioreads.eu.org/_mcp/server.

# questions-scraper

POST https://biblioreads.eu.org/api/works/questions
Content-Type: application/json

## Questions Scraper

Scrapes community Q\&A questions for a book from its Goodreads questions page. Returns a list of questions and answers submitted by the Goodreads community.

***

## Request

**Method:** `POST`\
**URL:** `{{Instance Domain}}/api/works/questions`

### Headers

| Key          | Value            | Description                        |
| ------------ | ---------------- | ---------------------------------- |
| Content-Type | application/json | Indicates the request body is JSON |

### Body

| Field    | Type   | Required | Description                                                                                       |
| -------- | ------ | -------- | ------------------------------------------------------------------------------------------------- |
| queryURL | string | Yes      | The full Goodreads book questions page URL (e.g. `https://www.goodreads.com/book/5907/questions`) |

**Example Body:**

```json
{
  "queryURL": "https://www.goodreads.com/book/5907/questions"
}
```

***

## Response

### 200 Success

Returns a JSON object containing the scraped questions and answers.

```json
{
  "status": "Received",
  "statusCode": 200,
  "scrapeURL": "string",
  "questions": [
    {
      "question": "string",
      "askedBy": "string",
      "answers": [
        {
          "answer": "string",
          "answeredBy": "string",
          "likes": "string"
        }
      ]
    }
  ]
}
```

### Response Field Descriptions

| Field                              | Type   | Description                                   |
| ---------------------------------- | ------ | --------------------------------------------- |
| status                             | string | Human-readable status message                 |
| statusCode                         | number | HTTP status code of the scrape operation      |
| scrapeURL                          | string | The Goodreads URL that was scraped            |
| questions                          | array  | List of community questions for the book      |
| questions\[].question              | string | The question text                             |
| questions\[].askedBy               | string | Username of the person who asked the question |
| questions\[].answers               | array  | List of answers to the question               |
| questions\[].answers\[].answer     | string | The answer text                               |
| questions\[].answers\[].answeredBy | string | Username of the person who answered           |
| questions\[].answers\[].likes      | string | Number of likes on the answer                 |

Reference: https://docs.biblioreads.eu.org/api-endpoints/works/questions-scraper

## Request

### Body (application/json)

- `queryURL` (string, required)

## Response

### 200

OK

- `status` (string, required)
- `source` (string, required)
- `scrapeURL` (string, required)
- `image` (string, required)
- `book` (string, required)
- `bookURL` (string, required)
- `author` (string, required)
- `questions` (list of object, required)
  - `id` (integer, required)
  - `date` (string, required)
  - `avatar` (string, required)
  - `authorName` (string, required)
  - `authorURL` (string, required)
  - `question` (string, required)
  - `spoilerQuestion` (string, required)
  - `shortAnswer` (string, required)
  - `answer` (string, required)
  - `likes` (string, required)
- `unansweredQuestions` (list of object, required)
  - `id` (integer, required)
  - `question` (string, required)
  - `spoilerQuestion` (string, required)
- `lastScraped` (datetime, required)

## Examples

**Request**

```json
{
  "queryURL": "https://www.goodreads.com/book/5907/questions"
}
```

**Response**

```json
{
  "status": "Received",
  "source": "https://github.com/nesaku/biblioreads",
  "scrapeURL": "https://www.goodreads.com/book/5907/questions",
  "image": "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1546071216l/5907._SX98_.jpg",
  "book": "The Hobbit, or There and Back Again",
  "bookURL": "/book/show/5907.The_Hobbit_or_There_and_Back_Again",
  "author": "J.R.R. Tolkien",
  "questions": [
    {
      "id": 1,
      "date": "10 years ago",
      "avatar": "https://s.gr-assets.com/assets/nophoto/user/m_100x100-c7bfe730633c9983e27caaa66a8e244a.png",
      "authorName": "Jansen",
      "authorURL": "/user/show/46123170-jansen",
      "question": "Who else here was disappointed in the hobbit movies? I thought there was too much CGI and it strayed to much from the book. Reply if you think so too! :)",
      "spoilerQuestion": "",
      "shortAnswer": "\nI personally really enjoyed the films and the extrapolations they took from Tolkien's other works, besides The Hobbit. The Hobbit book, by itself, wou…moreI personally really enjoyed the films and the extrapolations they took from Tolkien's other works, besides The Hobbit. The Hobbit book, by itself, would not be possible to translate into a film without changing up and adding a few things to make it appeal to the mainstream audience. (\"All good stories deserve embellishment\") The Hobbit was a children's story, whereas LotR was written for adults. Therefore, the LotR films didn't need \"embellishment\", and since the filmmakers didn't want to make The Hobbit films for children, they changed things up, creating an engaging story with a deeper study into character and plot.(less)\n",
      "answer": "I personally really enjoyed the films and the extrapolations they took from Tolkien's other works, besides The Hobbit. The Hobbit book, by itself, would not be possible to translate into a film without changing up and adding a few things to make it appeal to the mainstream audience. (\"All good stories deserve embellishment\") The Hobbit was a children's story, whereas LotR was written for adults. Therefore, the LotR films didn't need \"embellishment\", and since the filmmakers didn't want to make The Hobbit films for children, they changed things up, creating an engaging story with a deeper study into character and plot.(less)",
      "likes": "100 likes"
    },
    {
      "id": 2,
      "date": "11 years ago",
      "avatar": "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/users/1551199732i/22084880._UY100_CR25,0,100,100_.jpg",
      "authorName": "Michael",
      "authorURL": "/user/show/22084880-michael",
      "question": "I've never really watched the Lord of the Rings movies or read the books (not for lack of interest, just haven't gotten around to it). Would you suggest I read The Hobbit before LotR?",
      "spoilerQuestion": "",
      "shortAnswer": "\nThe Hobbit can be sort of a \"gateway\" book, as it provides Tolkien's amazing fantasy and storytelling but without the (sometimes intimidating) detail …moreThe Hobbit can be sort of a \"gateway\" book, as it provides Tolkien's amazing fantasy and storytelling but without the (sometimes intimidating) detail and complexity of LOTR. The Hobbit will introduce Tolkien's world and mythology, so you will have some context when you read LOTR.(less)\n",
      "answer": "The Hobbit can be sort of a \"gateway\" book, as it provides Tolkien's amazing fantasy and storytelling but without the (sometimes intimidating) detail and complexity of LOTR. The Hobbit will introduce Tolkien's world and mythology, so you will have some context when you read LOTR.(less)",
      "likes": "39 likes"
    },
    {
      "id": 3,
      "date": "8 years ago",
      "avatar": "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/users/1349361546i/13379612._UX100_CR0,6,100,100_.jpg",
      "authorName": "Michael Chapman",
      "authorURL": "/user/show/13379612-michael-chapman",
      "question": "How could anyone read this book?",
      "spoilerQuestion": "",
      "shortAnswer": "\nBy opening at page 1, and starting from there...\n",
      "answer": "",
      "likes": "2 likes"
    },
    {
      "id": 4,
      "date": "10 years ago",
      "avatar": "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/users/1477779201i/52604380._UX100_CR0,0,100,100_.jpg",
      "authorName": "SummerLily",
      "authorURL": "/user/show/52604380-summerlily",
      "question": "My friends, I have on my shelf The story of Kullervo, The silmarillion, The children of Húrin, The hobbit, the trilogy of The lord of the rings and Unfinished tales of Númenor and Middle-Earth. In what order should I read them? Am I missing any book in the series?",
      "spoilerQuestion": "",
      "shortAnswer": "\nWell, quite frankly, The Silmarillion is really boring. I highly suggest you read The Hobbit and LOTR first, to see if you even like his writing style…moreWell, quite frankly, The Silmarillion is really boring. I highly suggest you read The Hobbit and LOTR first, to see if you even like his writing style. Then, if you decide you are interested enough in Middle earth, go ahead and tackle the rest ;) (less)\n",
      "answer": "Well, quite frankly, The Silmarillion is really boring. I highly suggest you read The Hobbit and LOTR first, to see if you even like his writing style. Then, if you decide you are interested enough in Middle earth, go ahead and tackle the rest ;) (less)",
      "likes": "2 likes"
    },
    {
      "id": 5,
      "date": "11 years ago",
      "avatar": "https://s.gr-assets.com/assets/nophoto/user/m_100x100-c7bfe730633c9983e27caaa66a8e244a.png",
      "authorName": "Eduardo Jimenez",
      "authorURL": "/user/show/34154133-eduardo-jimenez",
      "question": "Should I read the Hobbit first or The Children of Hurin?",
      "spoilerQuestion": "",
      "shortAnswer": "\nIf you are new to Tolkien's mythology read the Hobbit first, is a nice door into this world. If you like it but you want more mature content then you …moreIf you are new to Tolkien's mythology read the Hobbit first, is a nice door into this world. If you like it but you want more mature content then you can go for The Children of Hurin and other works by Tolkien :) (less)\n",
      "answer": "If you are new to Tolkien's mythology read the Hobbit first, is a nice door into this world. If you like it but you want more mature content then you can go for The Children of Hurin and other works by Tolkien :) (less)",
      "likes": "4 likes"
    }
  ],
  "unansweredQuestions": [
    {
      "id": 1,
      "question": "北京丰台区小姐上门服务（电话微信同步█：19911761741█提供高质量小姐上门服务，面到满意付款，真人真照，假图免费，无定金，诚信第一！网址91friends.com?",
      "spoilerQuestion": ""
    }
  ],
  "lastScraped": "2026-06-15T00:42:39Z"
}
```

**SDK Code**

```python
import requests

url = "https://biblioreads.eu.org/api/works/questions"

payload = { "queryURL": "https://www.goodreads.com/book/5907/questions" }
headers = {"Content-Type": "application/json"}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://biblioreads.eu.org/api/works/questions';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{"queryURL":"https://www.goodreads.com/book/5907/questions"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://biblioreads.eu.org/api/works/questions"

	payload := strings.NewReader("{\n  \"queryURL\": \"https://www.goodreads.com/book/5907/questions\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://biblioreads.eu.org/api/works/questions")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n  \"queryURL\": \"https://www.goodreads.com/book/5907/questions\"\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://biblioreads.eu.org/api/works/questions")
  .header("Content-Type", "application/json")
  .body("{\n  \"queryURL\": \"https://www.goodreads.com/book/5907/questions\"\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://biblioreads.eu.org/api/works/questions', [
  'body' => '{
  "queryURL": "https://www.goodreads.com/book/5907/questions"
}',
  'headers' => [
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://biblioreads.eu.org/api/works/questions");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"queryURL\": \"https://www.goodreads.com/book/5907/questions\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["Content-Type": "application/json"]
let parameters = ["queryURL": "https://www.goodreads.com/book/5907/questions"] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://biblioreads.eu.org/api/works/questions")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```