zvab.com APIwww.zvab.com ↗
Search ZVAB.com by ISBN and retrieve used/antiquarian book listings with pricing, condition, seller details, and shipping rates via a simple REST API.
curl -X GET 'https://api.parse.bot/scraper/ebfd6eaa-6457-4cc9-8aa0-8a96dd325a14/search_by_isbn?isbn=9783518368541&page=1' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace zvab-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: ZVAB API — search antiquarian books by ISBN and inspect listings."""
from parse_apis.ZVAB_Book_Listings_API import Zvab, ListingNotFound
client = Zvab()
# Search for all listings of a specific ISBN (Homo Faber by Max Frisch)
for listing in client.search_results.search(isbn="9783518368541", limit=5):
print(listing.title, listing.author, f"{listing.price} {listing.currency}")
print(f" Seller: {listing.seller_name}, {listing.seller_location}")
print(f" Condition: {listing.condition}, Binding: {listing.binding}")
# Drill-down: get full detail for one listing
summary = client.search_results.search(isbn="9783518368541", limit=1).first()
if summary:
detail = summary.details()
print(f"\nFull detail for: {detail.title}")
print(f" ISBN-13: {detail.isbn13}, ISBN-10: {detail.isbn10}")
print(f" Publisher: {detail.publisher}, Year: {detail.year}")
print(f" Description: {detail.description[:120]}")
for rate in detail.shipping_rates:
print(f" Shipping to {rate.destination}: {rate.standard_cost} {rate.standard_currency}")
# Direct lookup by listing ID with error handling
try:
book = client.listings.get(listing_id="32374088414")
print(f"\nDirect lookup: {book.title} by {book.author} — {book.price} {book.currency}")
except ListingNotFound as exc:
print(f"Listing not found: {exc}")
print("\nexercised: search_results.search / listing.details / listings.get")
Search ZVAB for all active used/antiquarian book listings matching an ISBN-10 or ISBN-13. Returns paginated results (20 per page) sorted by relevance. Each listing includes title, author, publisher, year, price, condition, binding, seller details, and shipping cost to the configured destination. Results are auto-iterated across pages.
| Param | Type | Description |
|---|---|---|
| isbnrequired | string | ISBN-10 (10 digits) or ISBN-13 (13 digits). Hyphens are stripped automatically. |
| page | integer | Page number for pagination. Each page returns up to 20 listings. |
{
"type": "object",
"fields": {
"isbn": "searched ISBN string",
"page": "integer current page number",
"listings": "array of listing summary objects with listing_id, title, author, publisher, year, isbn13, isbn10, price, currency, condition, binding, seller_name, seller_location, shipping, description, listing_url",
"total_pages": "integer total number of pages",
"total_results": "integer total number of matching listings"
},
"sample": {
"data": {
"isbn": "9783518368541",
"page": 1,
"listings": [
{
"year": "1900",
"price": 4.46,
"title": "Homo Faber",
"author": "max-frisch",
"isbn10": "3518368540",
"isbn13": "9783518368541",
"binding": "Softcover",
"currency": "EUR",
"shipping": {
"cost": 0,
"text": "Versand nach gratis",
"currency": "EUR"
},
"condition": "Gebraucht - Ausreichend",
"publisher": "Suhrkamp Verlag (edition )",
"listing_id": "32374088414",
"description": "Paperback. Zustand: Fair. The item might be beaten up but readable.",
"listing_url": "https://www.zvab.com/Homo-Faber-max-frisch-Suhrkamp-Verlag-edition/32374088414/bd",
"seller_name": "BooksRun",
"seller_location": "Philadelphia, PA, USA"
}
],
"total_pages": 6,
"total_results": 102
},
"status": "success"
}
}About the zvab.com API
The ZVAB API gives developers access to used and antiquarian book listings from ZVAB.com (Zentrales Verzeichnis Antiquarischer Bücher) across 2 endpoints. Use search_by_isbn to retrieve paginated listings matching any ISBN-10 or ISBN-13, with each result including price, condition, binding, publisher, and seller details. A second endpoint, get_listing, returns the full detail record for any individual listing by its numeric ID or URL.
Endpoints
The search_by_isbn endpoint accepts an ISBN-10 or ISBN-13 (hyphens are stripped automatically) and returns paginated results with up to 20 listings per page. The response includes total_results and total_pages for iterating the full result set. Each listing object in the listings array carries listing_id, title, author, publisher, year, isbn13, isbn10, price, currency, condition, and binding.
Listing Detail
Once you have a listing_id from search results, pass it to get_listing to retrieve the complete record. The detail response adds seller name and location, a full condition description, and per-destination shipping rates — fields that the search summary omits. You can also pass a full ZVAB listing URL directly as the listing_id parameter if you already have one on hand.
Data Coverage
All prices are returned as a numeric price field alongside a currency code, which is typically EUR given ZVAB's German-market focus. The condition field is a free-text string as entered by the seller, so values vary across listings. The binding field is normalised to values such as Softcover or Hardcover. Pagination is controlled by the page integer parameter on search_by_isbn; if page exceeds total_pages, an empty listings array is returned.
The zvab.com API is a managed, monitored endpoint for www.zvab.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when www.zvab.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official www.zvab.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Compare used book prices across sellers on ZVAB for a given ISBN before purchasing
- Build a price-tracking tool that monitors listing prices and condition over time by ISBN
- Aggregate seller location and shipping rates to estimate landed cost for international buyers
- Check publication year and publisher fields to verify edition details for academic or library procurement
- Enrich an existing book catalogue with secondhand market pricing from ZVAB listings
- Alert users when a specific ISBN drops below a target price by polling search results
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does ZVAB have an official developer API?+
What does `get_listing` return that `search_by_isbn` does not?+
search_by_isbn returns summary fields per listing: title, author, publisher, year, ISBNs, price, currency, condition, and binding. get_listing adds the seller's name and geographic location, a full seller-written description, and itemised shipping rates to different destinations — detail that is not included in the search summary objects.Does the API cover seller reviews or ratings?+
get_listing, but seller ratings or review counts are not included in the response. You can fork the API on Parse and revise it to add a seller-review endpoint if that data is needed.Is there a limitation on how many results can be retrieved for a single ISBN?+
search_by_isbn returns up to 20 listings per page. The total_results and total_pages fields in the response tell you the full scope of matches, and you iterate by incrementing the page parameter. Very common ISBNs can have hundreds of listings across many pages, so callers should respect total_pages to avoid fetching beyond the available result set.Can I search by title, author, or keyword rather than ISBN?+
search_by_isbn. You can fork the API on Parse and revise it to add a title or author search endpoint to cover those discovery patterns.