# Estante Virtual API — live data from estantevirtual.com.br, Brazil's largest marketplace for used and new books, sold by thousands of independent sebos. Search editions by keyword, ISBN, author, publisher, year, city, sebo, category, language and price; list every copy of an edition with its price, condition and the seller's own condition note; open one copy for its sebo, weight and size; read a sebo's profile, city, rating and inventory; quote shipping to any Brazilian CEP. Prices in BRL. No login, no API key.

> Search Estante Virtual's catalogue. One row per EDITION (copies grouped by ISBN) with the lowest price on offer, how many used and new copies exist, author, publisher, year, ISBN, language and synopsis. Filters: condition, author, publisher, year, city of the sebo, sebo, category, language, price range; every one was measured to change the total. Facets give the exact values each filter takes. 44 editions per page; the site serves at most 10,000 rows per query and the engine says where that ends. Give query, isbn or at least one filter.
> ReefAPI engine `estante-virtual` · 6 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/estante-virtual/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/estante-virtual/v1/search — 2 credits
Search Estante Virtual's catalogue. One row per EDITION (copies grouped by ISBN) with the lowest price on offer, how many used and new copies exist, author, publisher, year, ISBN, language and synopsis. Filters: condition, author, publisher, year, city of the sebo, sebo, category, language, price range; every one was measured to change the total. Facets give the exact values each filter takes. 44 editions per page; the site serves at most 10,000 rows per query and the engine says where that ends. Give query, isbn or at least one filter.

**Parameters:**
- `query` (string, optional) — Free text over title, author and publisher, matched the way the site's own search box matches it. A hyphenated ISBN is reduced to its digits first (the site otherwise splits it into hundreds of thousands of hits). Give `query`, `isbn` or at least one filter.
- `isbn` (string, optional) — ISBN-13 or ISBN-10, dashes allowed. ISBN-10 is converted to the ISBN-13 the site indexes (it answers 0 for the 10-digit form).
- `condition` (enum, optional) — usado = used copies, novo = new copies. [one of: usado, novo]
- `author` (string, optional) — Author as the catalogue spells it, or its slug from `facets.authors`.
- `publisher` (string, optional) — Publisher, or its slug from `facets.publishers`.
- `year` (integer, optional) — Publication year (exact).
- `city` (string, optional) — City of the selling sebo, or its slug from `facets.cities`.
- `seller` (string, optional) — One sebo, by its name or slug (see `facets.sellers`).
- `category` (string, optional) — Site category, or its slug from `facets.categories`.
- `language` (string, optional) — Language, or its slug from `facets.languages` (e.g. ingles, espanhol).
- `min_price` (number, optional) — Minimum price in BRL.
- `max_price` (number, optional) — Maximum price in BRL.
- `sort` (enum, optional, default "relevance") — Result order. [one of: relevance, lowest-first, highest-first, new-releases]
- `page` (integer, optional, default 1) — 1-based page. Search pages hold 44 editions and the site serves at most 10,000 rows per query (last page 228).
- `facets_top` (integer, optional, default 20) — How many values per facet to return (0 = none).
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility; nothing is masked.

**Returns:** books[]{book_id, title, authors[], publisher, year, isbn, language, lowest_price, lowest_price_list, discount_percent, currency, offers_by_condition{usado,novo}, offer_count, synopsis, image_url, url} + facets{condition, authors, publishers, years, cities, sellers, categories, languages}[]{value, label, count} + meta{total, page, per_page, last_page, has_more, result_window, filters_applied, filter_check, empty_verified}

**Example request body:**
```json
{
  "query": "machado de assis",
  "condition": "usado"
}
```

### POST https://api.reefapi.com/estante-virtual/v1/offers — 2 credits
Every copy of one edition in one condition (used by default): price, list price, discount, the seller's own condition note, publisher, year, invoice and cover-photo flags, promo labels, photo. Filter by the sebo's city, the sebo, year and price; sort by price. The site's copy list does not name the sebo per copy; it publishes the edition's sebo and city breakdown (name + count), returned as facets — `offer` names the sebo of one copy.

**Parameters:**
- `book_id` (string, required) — The `book_id` of a search row (an edition, ends with -BK), or its URL.
- `condition` (enum, optional, default "usado") — Which copies to list: usado (used, default) or novo (new). [one of: usado, novo]
- `city` (string, optional) — City of the selling sebo, or its slug from `facets.cities`.
- `seller` (string, optional) — One sebo, by its name or slug (see `facets.sellers`).
- `year` (integer, optional) — Publication year (exact).
- `min_price` (number, optional) — Minimum price in BRL.
- `max_price` (number, optional) — Maximum price in BRL.
- `sort` (enum, optional, default "relevance") — Copy order. [one of: relevance, lowest-first, highest-first]
- `page` (integer, optional, default 1) — 1-based page. Search pages hold 44 editions and the site serves at most 10,000 rows per query (last page 228).
- `per_page` (integer, optional, default 20) — Copies per page, 1-40.
- `facets_top` (integer, optional, default 20) — How many values per facet to return (0 = none).
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility; nothing is masked.

**Returns:** offers[]{offer_id, sku, book_id, title, condition, condition_note, price, list_price, discount_percent, currency, available, authors[], publisher, year, isbn, language, category, has_invoice, has_cover_photo, promo_labels[], image_url, url} + facets{sellers, cities, years, ...} + meta{total, page, per_page, last_page, has_more, filters_applied, filter_check}

**Example request body:**
```json
{
  "book_id": "57A-2294-000-BK",
  "condition": "usado",
  "per_page": 20
}
```

### POST https://api.reefapi.com/estante-virtual/v1/book — 3 credits
One edition: title, authors, publisher, year, ISBN, language, synopsis, cover, and for each condition the cheapest copy (price, sebo, condition note, weight) plus how many copies and how many different sebos and cities offer it.

**Parameters:**
- `book_id` (string, required) — The `book_id` of a search row (an edition, ends with -BK), or its URL.
- `facets_top` (integer, optional, default 20) — How many values per facet to return (0 = none).
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility; nothing is masked.

**Returns:** book_id, title, authors[], publisher, year, isbn, language, synopsis, image_url, listed_since, cheapest_by_condition{usado,novo}{offer_id, price, list_price, condition_note, seller{id,name}, weight_g, ...}, offer_counts{usado,novo}, sellers{usado,novo}[], cities{usado,novo}[], url

**Example request body:**
```json
{
  "book_id": "57A-2294-000-BK"
}
```

### POST https://api.reefapi.com/estante-virtual/v1/offer — 3 credits
One copy as its page publishes it: the sebo (id, name, slug, and with include_seller its city, state, rating and since-date), price, list price, card price, installments, free-shipping flag, condition and the seller's condition note, weight and size, listing date, photos, availability, and the page's ld+json price as a cross-check.

**Parameters:**
- `offer_id` (string, required) — The `offer_id` of a copy (from `offers`, `book` or `seller`), or its URL.
- `include_seller` (boolean, optional, default true) — Also read the sebo's page for its city, state, rating and since-date (one more page). false = the copy only.
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility; nothing is masked.

**Returns:** offer_id, sku, book_id, title, authors[], publisher, year, isbn, language, condition, condition_note, category, has_invoice, has_cover_photo, price, list_price, card_price, max_installments, installment_amount, free_shipping, available, listed_at, weight_g, height_cm, width_cm, depth_cm, seller{id, name, slug, url, city, state, rating_average, review_count, percent_recommended, on_estante_virtual_since}, image_urls[], ld_json_price, price_disagreements[], url

**Example request body:**
```json
{
  "offer_id": "TAP-0857-000"
}
```

### POST https://api.reefapi.com/estante-virtual/v1/seller — 3 credits
One sebo's public page: name, description, city, state and address, business contacts, pickup points, shipping methods, on-site since, tax id as the page carries it (CNPJ for a company, CPF for an individual seller, with its type), rating, review count, percent recommended and the latest reviews, plus one page (40 copies) of its inventory with the total.

**Parameters:**
- `seller` (string, required) — The sebo's slug (`seller.slug` on an offer), its name or its URL.
- `page` (integer, optional, default 1) — 1-based page. Search pages hold 44 editions and the site serves at most 10,000 rows per query (last page 228).
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility; nothing is masked.

**Returns:** seller_id, slug, name, description, city, state, address{}, contacts[], pickup_points[], shipping_methods[], on_estante_virtual_since, seller_type, tax_id, tax_id_type, rating_average, review_count, percent_recommended, latest_reviews[], inventory_total, inventory_last_page, inventory[]{offer_id, sku, book_id, title, condition, condition_note, price, list_price, discount_percent, currency, available, authors[], publisher, year, isbn, language, category, has_invoice, has_cover_photo, promo_labels[], image_url, url}, url

**Example request body:**
```json
{
  "seller": "armazem-do-livro-usado"
}
```

### POST https://api.reefapi.com/estante-virtual/v1/shipping — 3 credits
Shipping quote for one copy to one Brazilian CEP, as the copy page computes it: service, price, delivery days and dates, free-shipping flag. The quote depends on the destination CEP and the sebo, not on where the request comes from (measured).

**Parameters:**
- `offer_id` (string, required) — The `offer_id` of a copy (from `offers`, `book` or `seller`), or its URL.
- `cep` (string, required) — Brazilian destination CEP (8 digits, dash optional). The quote depends on it; the site gives no quote without one.
- `include_pii` (boolean, optional, default false) — Accepted for gateway compatibility; nothing is masked.

**Returns:** offer_id, cep, seller{id, name}, price, options[]{service, price, free_shipping, min_days, max_days, min_date, max_date, currency}

**Example request body:**
```json
{
  "offer_id": "TAP-0857-000",
  "cep": "01310-100"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=estante-virtual
- Human docs page: https://reefapi.com/docs/estante-virtual
- Overview page: https://reefapi.com/estante-virtual-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
