{
  "openapi": "3.0.1",
  "info": {
    "title": "Goodreads Book Scraper",
    "description": "Goodreads Book Scraper is an Apify Actor that extracts book details from Goodreads search results. It retrieves the title, author, rating, ratings count, published year, editions count, book URL, and cover image URL, outputting the data in structured JSON format.",
    "version": "0.1",
    "x-build-id": "5Agfb0kxHRYLSY0tW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/runtime~goodreads-book-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-runtime-goodreads-book-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/runtime~goodreads-book-scraper/runs": {
      "post": {
        "operationId": "runs-sync-runtime-goodreads-book-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/runtime~goodreads-book-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-runtime-goodreads-book-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "searchTerm"
        ],
        "properties": {
          "searchTerm": {
            "title": "Search Term",
            "type": "string",
            "description": "The term to search for in Goodreads books. For example: \"architecture\"",
            "default": "architecture"
          },
          "enableDetailedScraping": {
            "title": "Enable Detailed Scraping",
            "type": "boolean",
            "description": "When enabled, visits each book page individually to extract comprehensive details (pages, format, description, genres, author info). Slower but much more detailed data. Recommended: false for speed, true for comprehensive data.",
            "default": false
          },
          "startInSimpleMode": {
            "title": "Start in Simple Mode",
            "type": "boolean",
            "description": "When enabled, disables detailed scraping entirely and only extracts basic data from search results. Use this if you're experiencing blocking issues.",
            "default": false
          },
          "useApifyProxy": {
            "title": "Use Apify Proxy",
            "type": "boolean",
            "description": "Whether to use Apify Proxy",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Choose to use no proxy, Apify Proxy, or provide custom proxy URLs.",
            "default": {}
          },
          "delayBetweenRequests": {
            "title": "Delay Between Requests",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Delay in milliseconds between scraping requests (useful for rate limiting in Make.com workflows). Lower values = faster scraping.",
            "default": 300
          },
          "maxConcurrency": {
            "title": "Max Concurrency",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Maximum number of concurrent requests (higher values = faster scraping, but may trigger rate limits)",
            "default": 2
          },
          "timeout": {
            "title": "Request Timeout",
            "minimum": 10,
            "maximum": 1800,
            "type": "integer",
            "description": "Timeout in seconds for each request (important for Make.com workflow stability)",
            "default": 20
          },
          "navigationTimeout": {
            "title": "Navigation Timeout (ms)",
            "minimum": 5000,
            "maximum": 180000,
            "type": "integer",
            "description": "Timeout in milliseconds for loading Goodreads pages. Increase this if you see navigation timeouts or retries.",
            "default": 30000
          },
          "requestHandlerTimeout": {
            "title": "Request Handler Timeout (ms)",
            "minimum": 10000,
            "maximum": 600000,
            "type": "integer",
            "description": "Maximum time in milliseconds allowed for processing one search results page. Increase this if detailed scraping is enabled and the run retries the same page.",
            "default": 180000
          },
          "detailNavigationTimeoutMs": {
            "title": "Detail Page Navigation Timeout (ms)",
            "minimum": 5000,
            "maximum": 180000,
            "type": "integer",
            "description": "Timeout in milliseconds for loading individual book detail pages (only used when detailed scraping is enabled).",
            "default": 20000
          },
          "bookMax": {
            "title": "Maximum Books",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "The maximum number of books to scrape (will continue through pages until reached). Lower values recommended for faster completion.",
            "default": 20
          },
          "maxRuntime": {
            "title": "Maximum Runtime (seconds)",
            "minimum": 60,
            "maximum": 300,
            "type": "integer",
            "description": "Maximum runtime in seconds before stopping (prevents timeout issues). Leave buffer for cleanup. Recommended: 280 for detailed scraping, 250 for simple mode.",
            "default": 280
          },
          "stopOnNoResults": {
            "title": "Stop When No Results",
            "type": "boolean",
            "description": "When enabled, the actor will finish successfully if Goodreads returns no books for the query (e.g., an ISBN not in Goodreads) and will not keep paginating empty pages.",
            "default": true
          },
          "failOnSelectorNotFound": {
            "title": "Fail on Selector Not Found",
            "type": "boolean",
            "description": "When enabled, the actor will fail the run if Goodreads layout changes or book selectors cannot be found. When disabled (default), it will output a diagnostic dataset item and finish gracefully.",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}