ISBN Decoder API avatar

ISBN Decoder API

Pricing

Pay per event

Go to Apify Store
ISBN Decoder API

ISBN Decoder API

Resolve any book title and/or author into every published edition with canonical ISBN-13, matching ISBN-10, retailer source attribution, and a confidence tier. Harvested from Amazon, Goodreads, OpenLibrary, WorldCat, Bol, AbeBooks.

Pricing

Pay per event

Rating

0.0

(0)

Developer

SR

SR

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

ISBN Decoder API — by ISBN, OLID, title, or author

A book ISBN lookup API that takes whatever bibliographic input you have — a 13-digit ISBN, an Open Library identifier (OL29832788M), a book title, or an author name — and returns the canonical edition(s) with publisher, year, page count, language, cover, and Goodreads rating. Stitched from three free, no-auth, no-captcha public sources (Open Library, Goodreads autocomplete, Google SERP retailer harvest) routed through one of four input-shaped paths.

Different inputs take different paths automatically:

  • ISBN input → direct Open Library lookup (Path A — captcha-immune, 1-8s)
  • OLID input → direct Open Library by OLID (Path B — single API hit)
  • Title or author → Google SERP retailer harvest (Path C) → Open Library search rescue if captchas (Path D)
  • Every path → Goodreads autocomplete runs in parallel for the canonical "what you probably meant" hint with cover + rating

One actor call returns up to 10 editions for popular books, grouped per ISBN-13, deduplicated across retailers, ranked by source count, enriched with Open Library bibliographic data.

What you get

  • Multi-edition coverage — paperback, hardcover, deluxe, audiobook, regional translations all surface as separate editions with their own ISBN-13
  • Both identifiers — ISBN-13 (canonical, checksum-validated) and the matching ISBN-10 (auto-converted from 978-prefix ISBN-13; null for 979-prefix audiobooks)
  • Open Library bibliographic data — publisher, publish_date (raw), publish_year (extracted), pages, openlibrary_id, languages (ISO 639-3)
  • Cleaned title — extracted from the strongest retailer snippet, with format suffixes and retailer-name tails stripped
  • Normalized author — resolved via Open Library's author key chase or extracted from SERP retailer patterns
  • Source attribution — bare hostnames of every retailer + Open Library + Goodreads that confirmed the ISBN
  • Confidence tierhigh when 2+ independent sources confirm; medium for single-source hits
  • Goodreads top hint — separate per-run field with title/author/cover/rating/ratings_count from Goodreads autocomplete
  • Path attributionpath: A|B|C|D tells you which route resolved each edition

Why use this book ISBN lookup

Most ISBN lookup APIs accept only one input shape. Either you have an ISBN and want the metadata, OR you have a title and want the ISBNs. This actor routes intelligently based on input shape — feed it whatever you have.

The official ISBN registry at isbn-international.org is paid. Bowker's Books in Print is enterprise pricing. Open Library's direct API requires you to write the dispatch logic yourself (ISBN vs OLID vs search) and doesn't include cross-retailer SERP harvesting. Library APIs (Library of Congress, OpenLibrary direct) need OAuth for catalogs and miss every retail edition. Naive retailer scraping breaks on the 30% of book pages that render ISBNs as images.

This actor stitches Open Library's free no-auth API, Goodreads' autocomplete endpoint, and Google SERP retailer-page harvest into a single call with auto-dispatch. The Path D fallback handles SERP captcha — when Google blocks the retailer harvest, OpenLibrary search rescues automatically and the caller sees editions either way.

Input

FieldTypeRequiredDefaultNotes
titlestringone-ofSapiensBook title (wrapped in quotes for exact-match SERP)
authorstringone-ofYuval Noah HarariAuthor name (wrapped in quotes); combine with title for best precision
qstringone-ofFree-form query. If valid ISBN-10/13, short-circuits to Path A (direct OL)
olidstringone-ofOpen Library identifier like OL29832788M or full URL like https://openlibrary.org/books/OL29832788M/Beach_Read. Short-circuits to Path B
countrystringnousGoogle geo (gl). Affects which Amazon TLDs dominate the SERP on Path C
languagestringnoenGoogle UI language (hl)
enrichbooleannotrueWhen false, skip Goodreads autocomplete and OL per-edition enrichment. Restores legacy SERP-only behavior
hitsbooleannofalseInclude raw SERP results in the first dataset item for debugging

At least one of title, author, q, or olid is required.

Output

One dataset item per edition. Multi-edition books produce multiple items per run. Example for title=Sapiens, author=Yuval Noah Harari (Path C):

{
"query": {"title": "Sapiens", "author": "Yuval Noah Harari"},
"country": "us",
"language": "en",
"path": "C",
"title": "Sapiens: A Brief History of Humankind",
"author": "Yuval Noah Harari",
"isbn13": "9780062316097",
"isbn10": "0062316095",
"publisher": "Harper",
"publish_date": "2015",
"publish_year": 2015,
"pages": 443,
"openlibrary_id": "OL27000666M",
"languages": ["eng"],
"sources": ["amazon.com", "openlibrary.org"],
"source_count": 2,
"confidence": "high",
"goodreads_top": {
"title": "Sapiens: A Brief History of Humankind",
"author": "Yuval Noah Harari",
"book_id": "23692271",
"book_url": "https://www.goodreads.com/book/show/23692271-sapiens",
"cover_url": "https://i.gr-assets.com/.../23692271._SX50_.jpg",
"pages": 443,
"avg_rating": "4.41",
"ratings_count": 893421
},
"edition_rank": 1,
"total_results": 10,
"duration_seconds": 4.39,
"errors": []
}

goodreads_top is denormalized on every edition item in the same run (Apify pattern — one record per dataset row). The Goodreads hint represents "what Goodreads thinks the query was about" and is NOT joined to specific ISBNs — it's diagnostic, not authoritative.

Path dispatch — how input shape decides the route

┌───────────────────────────────────────┐
│ q / title contains a valid ISBN? │── yes ─► PATH A
└─────────────────┬─────────────────────┘ direct OL by ISBN
│ no + Goodreads (parallel)
┌───────────────────────────────────────┐
│ olid contains a valid OL...M token? │── yes ─► PATH B
└─────────────────┬─────────────────────┘ direct OL by OLID
│ no + author chase
┌───────────────────────────────────────┐
│ title and/or author provided? │── yes ─► PATH C
└─────────────────┬─────────────────────┘ Google SERP + Goodreads
+ OL per-edition enrichment
│ │
│ │ 0 editions?
│ ▼
PATH D
│ Open Library search rescue
│ no
HTTP 400

Use cases

Book inventory and catalog systems. When a librarian or used-bookstore operator scans a barcode that returns ISBN-10 only (pre-2007 books), pass it as q=<ISBN10> to hit Path A. The actor validates the check digit, converts to ISBN-13, fetches the Open Library record, resolves the author key chain, and returns publisher + year + pages + language. One call replaces N retailer-specific lookups.

Author bibliography enrichment. For a book-blog or review-site backend, call with author=Stephen King for Path C → D. Path C tries Google SERP for retailer-indexed ISBNs; if SERP captchas, Path D rescues with Open Library search and returns 8-10 editions with publisher/year/pages already filled in. The Amazon URL-slug fallback recovers titles for SERP results where Google truncated the snippet.

Cross-locale price comparison. A Dutch-language book might be priced at €19.95 on Bol.com but €14.50 on Amazon.nl. To compare, you first need the same ISBN-13 across both retailers. This actor's per-edition sources array explicitly tells you which retailer carries which ISBN — feed the resulting ISBN-13 to your price-comparison logic. For Dutch books, call with country=nl&language=nl so Bol-dominated results dominate the Path C SERP.

Edition validation from a publisher feed. When a publisher sends you a list of ISBNs and you want to confirm each one resolves to a real cataloged book, pass each q=<ISBN> to Path A. The actor returns the canonical edition with publisher/year/pages, OR fails soft with path=A, isbn13=null for unmapped ISBNs. The confidence field tells you whether multiple sources agreed.

How it compares

SourceCoverageInputs acceptedAuth
ISBN-International registryAuthoritative; every published bookISBN onlyPaid subscription
Open Library direct APILibrary-cataloguedISBN, OLID, searchNone, but you write the dispatch
Goodreads autocomplete directGoodreads-indexedFree text onlyNone, but no ISBN in response
Retailer-specific scrapersOne retailer at a timeSearch queryOften blocked / rate-limited
This actorOpen Library + Goodreads + 10 retailers via SERP, auto-dispatchedISBN, OLID, title, author, free textNone

This actor is for when you want INPUT-FLEXIBLE bibliographic resolution. The four-path dispatch means callers don't pre-classify inputs; you can pipe a barcode scan, a fuzzy title, or an OL identifier into the same endpoint.

Pricing

Pay-per-event — one charge per edition successfully extracted. Path A returns 1 edition for 1 charge. Path C can return 3-10 editions, each charged separately. A run with zero matches (bad ISBN, captcha + no rescue) charges only the symbolic actor-start fee. No actor-start fee on result-only billing.

Limits and gotchas

  • Synthetic / invalid ISBNs fall through to SERP (Path C). The ISBN detector validates check digits before short-circuiting to Path A — bad check digits don't pollute the captcha-immune path with wrong matches.
  • Localized first edition — Open Library's isbn array per record is not language-sorted, so the FIRST valid ISBN for title=Sapiens may be the French (Albin Michel 2022), Polish, or Thai edition rather than the English original. The languages field tells you which.
  • Goodreads ≠ editions. goodreads_top represents what Goodreads' autocomplete returned for the query string. It is NOT joined to specific ISBNs — never assume goodreads_top.title describes any particular edition in the dataset. They can disagree (and that's diagnostic, not a bug).
  • SERP captcha — Google captchas the underlying /serp endpoint fairly often. Path D (OL search rescue) handles this transparently but adds 15-25s of latency.
  • Path C OL enrichment is fail-soft — when Open Library returns 5xx for a specific ISBN, that edition keeps its SERP-extracted title/author but loses the publisher/year/pages enrichment. Other editions in the same run are unaffected.
  • AbeBooks titles drop hyphensDesigning Data-Intensive Applications becomes Designing Data Intensive Applications. The source-rank algorithm correctly prefers Amazon's cleaner snippet when both retailers surface the same ISBN.
  • 979-prefix audiobooks have no ISBN-10. The conversion only works for 978-prefix codes. Customers correctly see isbn10: null for audiobook-only editions.
  • OLID input bypasses Goodreads when no title is resolved. Path B short-circuits to OL alone; Goodreads only fires after the OL record's title is known.

FAQ

Can I look up an ISBN without an API key? Yes. Pass q=9780374533557 and the actor takes Path A — direct Open Library lookup, no captchas, no third-party keys. Returns 1 edition with publisher/year/pages from OL plus the Goodreads autocomplete hint.

Does it work for Open Library identifiers? Yes — pass olid=OL29832788M (bare) or olid=https://openlibrary.org/books/OL29832788M/Beach_Read (full URL). Both forms work via Path B's regex extractor.

What happens when Google captchas the SERP path? Path D auto-rescues. The actor calls Open Library's /search.json with title + author, picks the first valid ISBN-13 from each returned work, and emits the editions with path=D. Total latency goes from 4-10s (Path C happy) to 18-35s (C → D rescue). The caller sees editions either way.

Why is author null on some Path A returns? Open Library stores authors as key references (/authors/OL7410858A). The actor chases the first author key into /authors/{KEY}.json to resolve the name. When OL returns 5xx for the author endpoint (which happens occasionally), the field stays null. The publisher/year/pages still populate from the main record.

What's the difference between Path C and Path D? Path C harvests ISBNs from retailer-indexed Google SERP results (Amazon, Goodreads, Bol, AbeBooks, etc.) and cross-confirms across multiple sources. Path D bypasses Google entirely and searches Open Library directly — fewer cross-source confirmations but immune to captchas. The actor picks C first and rescues with D only when C returns zero editions.

How do I get just the SERP data without Open Library enrichment? Pass enrich=false. This restores the legacy SERP-only behavior — Path C runs without the Open Library per-edition fan-out and without Goodreads autocomplete. Faster (~80ms cached) but no publisher/year/pages/languages fields populated.