# viaLibri Books Scraper (`muhammadafzal/vialibri-books-scraper`) Actor

Search viaLibri for rare and used book listings, auctions, prices, sellers, descriptions, images, and marketplace links for research and collection workflows.

- **URL**: https://apify.com/muhammadafzal/vialibri-books-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** Developer tools, E-commerce, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 book listings

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## viaLibri Books Scraper

Search viaLibri for rare, antiquarian, used, and auction books. The Actor returns one dataset row per unique viaLibri listing, including title, author, description, seller, location, display price, marketplace, image, and outbound listing URL.

### Input

Use `searchQueries` for simple searches, or pass existing viaLibri `/searches` URLs in `startUrls` when you need advanced filters. `maxResults` caps the total output across all searches. `maxPagesPerQuery` controls pagination.

Example:

```json
{
  "searchQueries": ["Virginia Woolf first edition"],
  "listingTypes": ["used", "auction"],
  "currency": "USD",
  "maxResults": 50,
  "maxPagesPerQuery": 2,
  "sort": "price.asc"
}
```

The Actor uses viaLibri’s public search submission and its embedded structured result data. It does not log in, bypass access controls, or scrape seller pages. Prices are viaLibri’s converted display prices; auction rows may include current bid values.

### Pricing

This Actor uses pay-per-event pricing. Platform usage is passed through to the run owner.

| Event | Price | When charged |
|---|---:|---|
| Actor start | $0.005 | Once per run |
| Book listing | $0.003 | Each unique listing saved to the dataset |

Examples: a run returning 10 listings costs $0.035 in Actor events; a run returning 50 listings costs $0.155, plus platform usage.

# Actor input Schema

## `searchQueries` (type: `array`):

Queries matched against viaLibri title, author, and keyword search fields. At least one query or start URL is required.

## `startUrls` (type: `array`):

Existing viaLibri /searches URLs to scrape. Use this for advanced filters or a saved search.

## `maxResults` (type: `integer`):

Maximum unique listings returned across all queries and pages.

## `maxPagesPerQuery` (type: `integer`):

Maximum result pages fetched for each query. viaLibri displays up to 50 records per page.

## `listingTypes` (type: `array`):

Include used listings, auctions, or both.

## `currency` (type: `string`):

Currency used by viaLibri for returned display prices.

## `sort` (type: `string`):

viaLibri result ordering.

## Actor input object example

```json
{
  "searchQueries": [
    "Hamlet"
  ],
  "startUrls": [],
  "maxResults": 50,
  "maxPagesPerQuery": 2,
  "listingTypes": [
    "used",
    "auction"
  ],
  "currency": "USD",
  "sort": "year.asc"
}
```

# Actor output Schema

## `listings` (type: `string`):

Normalized viaLibri listings with title, author, listing type, price, seller, marketplace, and source URL fields.

## `summary` (type: `string`):

Run-level records, charged listings, queries, pages fetched, runtime, and warnings.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/vialibri-books-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/vialibri-books-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call muhammadafzal/vialibri-books-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammadafzal/vialibri-books-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ZXduCvcYZrvhoDgNT/builds/RKrQCoGdinQlojU16/openapi.json
