Amazon Kindle Scraper
Pricing
from $2.99 / 1,000 kindle books
Amazon Kindle Scraper
Scrapes Amazon Kindle ebook listings including pricing, ratings, and metadata.
Pricing
from $2.99 / 1,000 kindle books
Rating
0.0
(0)
Developer
w3crawler
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
This existing local implementation is the maintained equivalent for the assigned Kindle Book Deals Scraper row (CSV rank 1569, store slug lucascode/kindle-book-deals-scraper). It was reused rather than creating a duplicate folder.
Search the public Amazon Kindle Store and return structured ebook listing records. The actor uses serialized direct HTTPS requests and a linkedom HTML parser. It does not use a browser, stealth fingerprinting, retries, proxies, CAPTCHA solving, sign-in, or paywalled content. If Amazon returns an access challenge or denial, the run stops and reports status and counts in OUTPUT_SUMMARY; failure details stay in the run logs.
Extracted fields
Listing records can include:
- ASIN, title, name, author, authors, and public author URLs
- Rating, rating-count text, normalized review count, publication date, price, price text, and currency
- Kindle Edition format, seller, availability, Kindle Unlimited eligibility, sponsored status, badges, and series text
- Stable product/canonical URLs, request/search-page URL, cover image URLs, and bounded source-card text
- Optional public detail metadata: description, publisher, publication date, language, file size, print length, ISBN-13, bestseller ranks, and additional image URLs
- Common evidence fields: direct transport, HTTP status, access/fetch status, field coverage, data-quality counts, and stable record IDs
The dataset contains source-backed Kindle listing rows only. Empty results complete with status: SUCCEEDED and dataStatus: NO_RESULTS; access blocks and genuine request or extraction failures produce status: FAILED and dataStatus: FAILED when no source rows were saved. Failure details stay in the run logs; no diagnostic dataset rows are written.
Input
| Field | Type | Default | Description |
|---|---|---|---|
| keyword | string, required | — | Book title, author, topic, or genre |
| country | string | us | Amazon marketplace: us, uk/gb, de, fr, it, in, ca, au, es, jp, or br |
| locale | string | marketplace locale | BCP 47 locale used for Accept-Language |
| maxItems | integer | 40 | Maximum listing records, from 1 to 500 |
| startPage | integer | 1 | 1-based search page to start from |
| maxPages | integer | 0 | Page limit; 0 derives a bounded limit from maxItems |
| sortBy | string | relevance | relevance, rating, newest, priceLowToHigh, priceHighToLow, or bestsellers |
| kindleUnlimitedOnly | boolean | false | Keep only cards marked Kindle Unlimited |
| minRating | number | — | Optional local minimum rating from 0 to 5 |
| dateRange | string | — | last30Days, last90Days, or comingSoon |
| minPrice / maxPrice | number | — | Optional displayed-price bounds |
| excludeSponsored | boolean | false | Drop cards visibly marked Sponsored |
| includeDetails | boolean | false | Fetch public product pages for detail metadata |
| maxDetailItems | integer | 10 | Maximum detail-page attempts |
| includeMedia | boolean | true | Include cover and responsive image URLs |
| dedupeBy | string | asin | asin, title, or none |
| requestDelayMs | integer | 1000 | Delay between serialized page and detail requests |
| requestTimeoutSecs | integer | 180 | Maximum direct HTTP request time |
The legacy pageRenderWaitMs, maxConcurrency, maxRequestRetries, navigationTimeoutSecs, and proxyConfiguration fields remain accepted for input compatibility, but are ignored by the direct-only runner. The older Amazon sort aliases are also accepted.
Example input
{"keyword": "science fiction","country": "us","maxItems": 20,"sortBy": "rating","kindleUnlimitedOnly": false,"includeDetails": true,"maxDetailItems": 5,"requestDelayMs": 1200}
Output
Listing records include position, asin, title, author, rating, reviewCount, price, currency, format, isKindleUnlimited, sourceUrl, imageUrl, keyword, country, and scrapedAt, plus optional public detail fields. Source labels, transport/access flags, fieldCoverage, dataQuality, and run metadata are removed from rows. See .actor/dataset_schema.json for the full contract.
Every run writes OUTPUT_SUMMARY to the declared key-value store. It includes request/page counts, candidate/filter/duplicate counts, detail outcomes, data availability, proxy usage (false), status, and failure counts. successfulItems counts source-backed dataset rows; diagnosticCount counts operational issues and never dataset rows; invalidSourceRecordCount counts candidates rejected before a Dataset write for missing listing identity fields.
Access and reliability
Amazon may vary markup, prices, availability, localization, and anti-bot behavior. Public search and detail pages may return a CAPTCHA, Akamai interstitial (bm-verify/_sec/verify), or other access challenge; the actor reports that state instead of attempting to bypass it. Requests are serialized and use a transparent actor user agent. A blocked request is fail-closed and is not retried.
Local development
Create local input at storage/key_value_stores/default/INPUT.json, then run:
apify run
Useful checks:
apify validate-schemanpm testnode validate-datasets.js
Local run output stays under storage/ and is not uploaded automatically.
Run summaries include the required status, runStatus, and dataStatus fields. status and runStatus are SUCCEEDED when source-backed rows were saved or a run completed cleanly with no matches; they are FAILED only when a real failure occurs before any rows are saved. dataStatus is COMPLETE, PARTIAL, NO_RESULTS, or FAILED. Failure details stay in the run logs; key-value summaries retain counts only.