# eCampus Textbook Price & Marketplace Vendor Scraper (`crawlerbros/ecampus-scraper`) Actor

Scrape eCampus.com's official bot-price APIs for textbook pricing: new/list/eBook prices plus a live list of third-party marketplace vendor offers (vendor name, rating, price, condition) per ISBN.

- **URL**: https://apify.com/crawlerbros/ecampus-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, E-commerce, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## eCampus Textbook Price & Marketplace Vendor Scraper

Look up live textbook pricing on eCampus.com by ISBN: the retailer's list/new price, the lowest third-party marketplace price, eBook rental pricing — and a full breakdown of every individual marketplace vendor offer (seller name, rating, price, condition, quantity, shipping) for a given ISBN. Built on eCampus.com's own public bot-price data feeds, so there's no login, no cookies, and no proxy required.

### What this actor does

- **Three modes:**
  - `priceSnapshot` (default) — one record per ISBN with list price, current new price, lowest marketplace price, and eBook price/duration
  - `marketplaceOffers` — one record **per third-party seller** for the ISBN (seller name, rating, price, condition, quantity, ships-from state, expedited shipping, item comments) — this is the closest thing to a multi-vendor price comparison for the title
  - `ebookOffers` — one record per available eBook access duration/price option
- **Batch by ISBN list** — pass any number of ISBN-10 / ISBN-13 strings; each is queried independently
- **Filters:** price range, vendor offer condition, minimum vendor rating
- **Sort:** order marketplace vendor offers / eBook options by price (low-to-high or high-to-low) or vendor rating (high-to-low), same as eCampus's own vendor comparison listing
- **Empty fields are omitted** — every record only contains data eCampus actually returned

### Output fields

#### `priceSnapshot`

- `title`, `author`, `isbn`
- `listPrice` — publisher list price (USD)
- `newPrice` — eCampus's current new-copy price
- `newAvailability` — stock/availability note when the title is limited or hard to find
- `usedPrice`, `usedAvailability` — eCampus's own used-copy price and stock note, when eCampus sells a used copy directly
- `marketplaceLowPrice` — lowest current price across all third-party marketplace sellers
- `rentalPrice`, `rentalDurationDays` — eCampus's primary physical-book rental price and rental length (days), when rental is offered
- `rentalOptions` — additional rental-length tiers beyond the primary one, each `{price, durationDays}` (e.g. shorter/cheaper rental windows)
- `buybackPrice` — eCampus's own buyback offer for the title, when available (surfaced directly in the sanctioned bot-price feed — not a separate crawl of the disallowed `/buyback/` pages)
- `ebookPrice`, `ebookDurationDays` — eBook rental price and access window
- `sourceUrl`, `recordType: "priceSnapshot"`, `scrapedAt`

#### `marketplaceOffers`

- `title`, `author`, `isbn`
- `vendorName` — third-party seller name
- `vendorRating`, `vendorRatingCount` — seller rating (1–5) and number of ratings, when the seller has any
- `shipsFrom` — seller's ship-from state
- `price`, `condition`, `quantity`
- `vendorItemId` — the seller's marketplace listing ID
- `expeditedShipping` — true/false
- `comments` — seller's condition notes
- `sourceUrl`, `recordType: "marketplaceOffer"`, `scrapedAt`

#### `ebookOffers`

- `title`, `author`, `isbn`
- `onlineDuration`, `downloadableDuration` — access windows for online vs. offline/downloadable reading
- `price`, `ebookSku`
- `sourceUrl`, `recordType: "ebookOffer"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `priceSnapshot` | `priceSnapshot` / `marketplaceOffers` / `ebookOffers` |
| `isbns` | array | `["9780134685991"]` | ISBN-10 or ISBN-13 strings to look up |
| `minPrice` | int | – | Drop records priced below this (USD) |
| `maxPrice` | int | – | Drop records priced above this (USD) |
| `condition` | string | `any` | (mode=marketplaceOffers) Only keep offers in this condition |
| `minVendorRating` | int | – | (mode=marketplaceOffers) Drop sellers rated below this (1–5); unrated sellers are always kept |
| `sortBy` | string | `default` | (mode=marketplaceOffers/ebookOffers) `default` / `priceAsc` / `priceDesc` / `ratingDesc` — orders offers within each ISBN |
| `maxItems` | int | `100` | Hard cap on emitted records (1–1000) |

#### Example: price snapshot for a list of ISBNs

```json
{
  "mode": "priceSnapshot",
  "isbns": ["9780134685991", "9780134444321", "9781260565420"]
}
```

#### Example: compare every marketplace seller for a title, only "Very Good" or better, rated 4+

```json
{
  "mode": "marketplaceOffers",
  "isbns": ["9780134444321"],
  "condition": "Very Good",
  "minVendorRating": 4
}
```

#### Example: eBook access options

```json
{
  "mode": "ebookOffers",
  "isbns": ["9780134685991"]
}
```

### Use cases

- **Textbook price comparison** — see eCampus's own price alongside every third-party marketplace seller in one pass
- **Deal/arbitrage monitoring** — track the lowest marketplace price and seller conditions over time
- **Reseller research** — see which sellers are active on a given ISBN, their ratings, and shipping terms
- **Course-material budgeting** — bulk-price an entire course's textbook list by ISBN
- **eBook vs. physical comparison** — compare rental duration/price options against physical new/used pricing

### FAQ

**Do I need an account, cookies, or a proxy?**  No. This actor calls eCampus.com's public bot-price data feeds directly — the same feeds eCampus's `robots.txt` publishes for AI/search crawlers to use instead of scraping HTML pages. No login, no cookies, no proxy configuration needed.

**Why isn't this a buyback/sell-price comparator?**  eCampus.com's `robots.txt` explicitly disallows crawling its dedicated `/buyback/` sell-quote pages. Other textbook buyback-comparison sites (BookScouter.com, CampusBooks.com, GetTextbooks.com) were evaluated and found to gate their price pages behind Cloudflare Turnstile / proof-of-work challenges that cannot be solved without paid CAPTCHA-solving or residential proxies — both out of scope for this actor. This actor instead exposes eCampus's sanctioned, multi-vendor **marketplace** (buy-side) price comparison, which surfaces the same kind of "many sellers, one ISBN" data. When eCampus's own sanctioned `priceSnapshot` feed happens to include a `buybackPrice` for a title (some titles carry a same-endpoint `Buyback available` value), it's passed through — but there's no separate buyback crawl or lookup mode.

**What if an ISBN has no current marketplace offers or isn't sold by eCampus?**  The ISBN is simply skipped for that mode — no error, no placeholder record. If none of your ISBNs return data, check the run's status message.

**Can I look up multiple ISBNs in a single request to eCampus?**  No — eCampus's feed only accepts one ISBN per request. This actor loops over your `isbns` list and issues one lookup per ISBN, so you can still batch as many ISBNs as you like in a single actor run.

**Is `vendorRating` always present?**  No — many marketplace sellers have no rating yet (too new / no ratings). Those records simply omit `vendorRating` and `vendorRatingCount` rather than showing `0` or `null`.

**What currency are prices in?**  USD — eCampus.com is a US textbook retailer.

**How fresh is the data?**  Live — every actor run queries eCampus's price feed in real time; there is no caching layer.

# Actor input Schema

## `mode` (type: `string`):

What to fetch for each ISBN.

## `isbns` (type: `array`):

ISBN-10 or ISBN-13 strings to look up. One ISBN = one lookup (batch ISBN lists are not supported by the upstream API).

## `minPrice` (type: `integer`):

Drop offers/records priced below this amount. Applies to the marketplace price (marketplaceOffers/priceSnapshot) or eBook price (ebookOffers).

## `maxPrice` (type: `integer`):

Drop offers/records priced above this amount.

## `condition` (type: `string`):

Only include marketplace vendor offers in this condition.

## `minVendorRating` (type: `integer`):

Drop marketplace vendor offers with a seller rating below this (1-5). Vendors without a rating yet are always kept.

## `sortBy` (type: `string`):

Order offers within each ISBN before emitting, same as eCampus's own vendor/eBook comparison listing. Ignored for mode=priceSnapshot (one record per ISBN).

## `maxItems` (type: `integer`):

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "priceSnapshot",
  "isbns": [
    "9780134685991"
  ],
  "condition": "any",
  "sortBy": "default",
  "maxItems": 100
}
```

# Actor output Schema

## `books` (type: `string`):

Dataset containing all scraped eCampus price / vendor-offer records.

# 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 = {
    "mode": "priceSnapshot",
    "isbns": [
        "9780134685991"
    ],
    "condition": "any",
    "sortBy": "default",
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/ecampus-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 = {
    "mode": "priceSnapshot",
    "isbns": ["9780134685991"],
    "condition": "any",
    "sortBy": "default",
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/ecampus-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 '{
  "mode": "priceSnapshot",
  "isbns": [
    "9780134685991"
  ],
  "condition": "any",
  "sortBy": "default",
  "maxItems": 100
}' |
apify call crawlerbros/ecampus-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/ecampus-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/iTLgxkT7rolAurRBb/builds/PhFTwxzDGl8lWLqW3/openapi.json
