Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the Estante Virtual API page →
E-commerce & Marketplaces

Estante Virtual API & Scraper

The Estante Virtual API returns estantevirtual.com.br — Brazil's largest marketplace for used and new books, where thousands of independent sebos and bookshops list their copies — as clean JSON in six actions: search, offers, book, offer, seller and shipping.

6 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

The site has two levels and the API keeps them apart. An EDITION (book_id, ending in -BK) is one ISBN; a COPY (offer_id) is one physical book offered by one sebo at its own price, in its own condition, with the seller's own description of that copy. search returns editions: the lowest price on offer, how many used and how many new copies exist, author, publisher, year, ISBN, language and synopsis, with filters for condition, author, publisher, year, the sebo's city, the sebo itself, category, language and a price range — every one measured against an unfiltered call in the same run (machado de assis: 32,562 hits; used only 26,839; Fortaleza 363; one sebo 141; English-language 79). offers lists every copy of an edition in one condition with its price, list price, discount, the seller's condition note, invoice and cover-photo flags and photo, sortable by price and filterable by city, sebo, year and price. The copy list does not name the sebo copy by copy — the site publishes that only on the copy's own page — so offers returns the edition's sebo and city breakdown with counts, and offer opens one copy for its sebo, the sebo's city and state, rating and since-date, weight and size, card price and installments. seller reads a sebo's public page: city, state, address, business contacts, the tax id the page carries (CNPJ for a company, CPF for an individual seller, with its type), shipping methods, rating, review count, percent recommended, latest reviews and its inventory forty copies at a time. shipping quotes one copy to one CEP: service, price, delivery days and dates. Values were checked against the site itself: the lowest price on an edition matched the cheapest copy on 6 of 6 editions, the cheapest copy per condition on 11 of 11, the copy price on its page and in its structured data on 7 of 7, the sebo's name on 7 of 7 and the sebo's city on 6 of 6. One ReefAPI key, no Estante Virtual account, and the standard { ok, data, meta, error } envelope.

Reference

Edition, copy, sebo — what each id opens

Estante Virtual groups copies under an edition. The API keeps the three levels apart. Example values are live readings from 2026-10-14 (Dom Casmurro, Moderna, ISBN 9788516096892).

idwhat it isexamplewhere it comes from
book_idan edition (one ISBN), ends with -BK57A-2294-000-BK: lowest price 19.00, 47 used + 10 new copiessearch rows; opens with book and offers
offer_idone copy offered by one seboTAP-0857-000: 19.00, used, 'páginas levemente amareladas, brochura; 247p.'offers rows, book's cheapest copy, seller inventory; opens with offer and shipping
seller (slug)one seboarmazem-do-livro-usado: Brasília/DF, 2,343 reviews, 98 % recommend, 72,069 copies listedoffer's seller.slug or offers facets; opens with seller

Prices are in BRL. The edition's lowest_price is the cheapest copy in any condition; book returns the cheapest copy for used and for new separately, with the sebo that sells it.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/estante-virtual/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "query": "machado de assis",
    "condition": "usado"
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "estante-virtual",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 2130.4,
    "record_count": 44,
    "bytes": 371653,
    "cache_hit": false,
    "total": 26840,
    "total_capped_by_window": true,
    "page": 1,
    "per_page": 44,
    "last_page": 228,
    "result_window": 10000,
    "has_more": true,
    "returned": 44,
    "sort": "relevance",
    "filters_applied": {
      "condition": "usado"
    },
    "filter_check": {
      "condition": {
        "rows": 44,
        "violations": 0
      }
    },
    "upstream_requests": 2,
    "charged_credits": 2,
    "version": "1.0.0",
    "request_id": "e577353aeb4e49ad",
    "queue_ms": 1.3,
    "fetched_at": "2026-10-14T18:57:21.917Z"
  },
  "data": {
    "books": [
      {
        "book_id": "0CT-9251-000-BK",
        "title": "Memórias póstumas de Brás Cubas",
        "authors": [],
        "publisher": null,
        "year": 2024,
        "isbn": "9788594318374",
        "language": "Português",
        "lowest_price": 10,
        "lowest_price_list": 10,
        "discount_percent": 0,
        "currency": "BRL",
        "offers_by_condition": {
          "usado": 71
        },
        "offer_count": 71,
        "synopsis": "Em um romance repleto de digressões filosóficas, o escritor se vale da posição privilegiada de Brás Cubas, como “defunto autor” ou “autor defunto”, para narrar as suas desventuras e revela as contradições da sociedade brasileira do século XIX, especialmente por meio da análise aprofundada da psicologia das personagens.",
        "image_url": "https://static.estantevirtual.com.br/book/00/0CT-9251-000/0CT-9251-000_detail1.jpg?ts=1775761850953",
        "url": "https://www.estantevirtual.com.br/livro/memorias-postumas-de-bras-cubas-0CT-9251-000-BK"
      },
      {
        "book_id": "57A-2294-000-BK",
        "title": "Dom Casmurro",
        "authors": [],
        "publisher": null,
        "year": 2024,
        "isbn": "9788516096892",
        "language": "Português",
        "lowest_price": 19,
        "lowest_price_list": 19,
        "discount_percent": 0,
        "currency": "BRL",
        "offers_by_condition": {
          "usado": 47
        },
        "offer_count": 47,
        "synopsis": "O romance Dom Casmurro é narrado em primeira pessoa por José Bento, o Bentinho (apelidado, na velhice, de Dom Casmurro, por viver recluso e solitário). Em retrospectiva, ele conta fatos de sua infância na casa da mãe viúva, D. Glória, ao lado do tio Cosme, da prima Justina, do agregado José Dias. Como vizinhos de fundo, Pádua e D. Fortunata, pais de Capitolina (apelidada Capitu), de condição social inferior. O objetivo do narrador-personagem é tentar reviver as emoções afetivas através da reconstituição do passado: \"Vou deitar ao papel as reminiscências que me vierem vindo. Deste modo, viverei",
        "image_url": "https://static.estantevirtual.com.br/book/00/57A-2294-000/57A-2294-000_detail1.png?ts=1712712452719",
        "url": "https://www.estantevirtual.com.br/livro/dom-casmurro-57A-2294-000-BK"
      },
      {
        "book_id": "FVT-7788-000-BK",
        "title": "Memórias quase póstumas de machado de assis",
        "authors": [
          "Gomes, Álvaro Cardoso"
        ],
        "publisher": "FTD",
        "year": null,
        "isbn": "9788532292841",
        "language": "Português",
        "lowest_price": 10,
        "lowest_price_list": 10,
        "discount_percent": 0,
        "currency": "BRL",
        "offers_by_condition": {
          "usado": 362
        },
        "offer_count": 362,
        "synopsis": "Sentindo que ia morrer logo, o escritor Machado de Assis decide registrar num caderno al-guns fatos relevantes de sua vida: a infância pobre, a relação com a família, a lenta ascensão social, o amor por Carolina, além de sua trajetória de escritor. Este foi o mote para a criação desta obra, na qual, entremeando fatos reais e ficcionais, Machado de Assis é mostrado na intimidade do dia a dia. Conta também sobre sua amizade com os escritores de seu tempo, como José de Alencar, Manuel Antônio de Almeida e Euclides da Cunha. Um dia, o escri-tor adota como secretário o filho da lavadeira da família",
        "image_url": "https://static.estantevirtual.com.br/book/00/FVT-7788-000/FVT-7788-000_detail1.jpg?ts=1734528763190",
        "url": "https://www.estantevirtual.com.br/livro/memorias-quase-postumas-de-machado-de-assis-FVT-7788-000-BK"
      }
    ],
    "facets": {
      "condition": [
        {
          "value": "usado",
          "label": "usado",
          "count": 36206
        }
      ],
      "authors": [
        {
          "value": "machado-de-assis",
          "label": "MACHADO DE ASSIS",
          "count": 24348
        },
        {
          "value": "machado-assis",
          "label": "Machado Assis",
          "count": 590
        },
        {
          "value": "machado-de-assis-e-outros",
          "label": "Machado de Assis e Outros",
          "count": 477
        }
      ],
      "publishers": [
        {
          "value": "atica",
          "label": "ATICA",
          "count": 3718
        },
        {
          "value": "pradense",
          "label": "Pradense",
          "count": 2376
        },
        {
          "value": "martin-claret",
          "label": "MARTIN CLARET",
          "count": 1437
        }
      ],
      "years": [
        {
          "value": "2008",
          "label": "2008",
          "count": 3512
        },
        {
          "value": "2025",
          "label": "2025",
          "count": 2192
        },
        {
          "value": "1997",
          "label": "1997",
          "count": 1800
        }
      ],
      "cities": [
        {
          "value": "sao-paulo",
          "label": "São Paulo",
          "count": 9083
        },
        {
          "value": "porto-alegre",
          "label": "Porto Alegre",
          "count": 4271
        },
        {
          "value": "belo-horizonte",
          "label": "Belo Horizonte",
          "count": 1770
        }
      ],
      "sellers": [
        {
          "value": "o-livro-disso",
          "label": "O Livro Disso",
          "count": 2731
        },
        {
          "value": "sebo-fulo",
          "label": "Sebo Fulô",
          "count": 2560
        },
        {
          "value": "o-sebo-cultural",
          "label": "O Sebo Cultural",
          "count": 802
        }
      ],
      "categories": [
        {
          "value": "literatura-brasileira",
          "label": "LITERATURA BRASILEIRA",
          "count": 19032
        },
        {
          "value": "infanto-juvenis",
          "label": "INFANTO JUVENIS",
          "count": 3905
        },
        {
          "value": "outros-assuntos",
          "label": "Outros Assuntos",
          "count": 2745
        }
      ],
      "languages": [
        {
          "value": "portugues",
          "label": "Português",
          "count": 34947
        },
        {
          "value": "ingles",
          "label": "Inglês",
          "count": 70
        },
        {
          "value": "espanhol",
          "label": "Espanhol",
          "count": 27
        }
      ]
    }
  }
}
Actions

What the Estante Virtual API does

ActionDescriptionConcrete use caseKey params
searchSearch 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.Pricing teams call search to search Estante Virtual's catalogue.query, isbn, condition, author, publisher, ...
offersEvery 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.Marketplace operators call offers to get every copy of one edition in one condition (used by default).book_id, book_id, condition, city, seller, ...
bookOne 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.Catalog enrichment teams call book to get one edition.book_id, book_id, facets_top
offerOne 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.Retail analysts call offer to get one copy as its page publishes it.offer_id, offer_id, include_seller
sellerOne 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.Pricing teams call seller to get one sebo's public page.seller, seller, page
shippingShipping 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).Marketplace operators call shipping to get shipping quote for one copy to one Brazilian CEP, as the copy page computes it.offer_id, cep, offer_id, cep
Code samples

Call search from your stack

curl -X POST https://api.reefapi.com/estante-virtual/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"machado de assis","condition":"usado"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.estante-virtual.search with {"query":"machado de assis","condition":"usado"}.
Use cases

Who uses this API and why

  • Price a used book in Brazil: search by ISBN, then list its used copies sorted by price with each seller's condition note.
  • Find a copy close to the buyer: filter offers or search by the sebo's city (Fortaleza, Belo Horizonte, São Paulo…) and quote shipping to the buyer's CEP.
  • Monitor a sebo: read its rating, review count and inventory total, and page through its listed copies forty at a time.
  • Build an out-of-print and rare-book tracker: search by author and year (machado de assis + 1899 returns 10 editions) and follow their copies and prices.
  • Compare used and new availability per edition: every search row and every book call carries the used and new copy counts and the cheapest copy in each condition.
FAQ

Questions developers ask before integrating

Does every copy come with the name of the sebo selling it?

Not in the copy list — the site itself only names the sebo on each copy's own page. offers returns, for the edition, every sebo and city that has a copy with its count, and lets you filter the list by city or by sebo. offer opens one copy and returns its sebo with id, name, slug, city, state, rating and since-date. On 7 of 7 copies checked the sebo name matched the page's own structured data, and on 6 of 6 the sebo's city matched the site's city filter.

How do I search by ISBN?

Pass isbn with an ISBN-13 or ISBN-10, dashes allowed. The site indexes the 13-digit form: a 10-digit ISBN returns nothing there, and a hyphenated one is split into hundreds of thousands of loose hits (928,684 measured). The API converts and cleans it first, so 978-85-16-09689-2 and 8516096890 both return the one edition.

Which filters work, and how much do they narrow?

All of the ones offered, each measured against an unfiltered call in the same run. On 'machado de assis' (32,562): condition used 26,839 · author 19,792 · publisher Moderna 349 · year 2015 163 · city Fortaleza 363 · one sebo 141 · category Literatura Brasileira 19,194 · language English 79 · price 10-20 BRL 17,908. On one edition's 47 used copies: city 7, one sebo 3, price 10-25 BRL 12, year 2025 12. An unknown parameter name is rejected, not ignored.

Why does an edition row sometimes show a different publisher or year than I filtered for?

Because the site prints one featured copy's details on the edition row, and sellers type those details themselves — often 'sem cadastro', which the API returns as null. A publisher or year filter matches any copy of the edition. The API reports this in meta.filter_check: 1 of 44 rows on a publisher filter and 2 of 10 on a year filter showed a different featured copy. The copy-level fields in offers are each copy's own.

How far can I page?

Search pages hold 44 editions and the site serves at most 10,000 rows per query, so page 228 is the last one; the API returns last_page and has_more and rejects pages beyond it. Copy lists take 1 to 40 per page: larger pages are not offered because the site silently drops copies above 40 (a 47-copy edition came back with 42).

Is the shipping quote for my address?

Yes — shipping takes the destination CEP and returns the site's own quote: service, price, delivery days and dates. The same copy quoted 17.20 BRL in 10 days to São Paulo (01310-100) and 17.20 BRL in 25 days to Manaus (69005-000). The site gives no quote without a CEP, so the CEP is required.

Are the prices the ones on the site?

Yes, read from the site and converted from cents to BRL. The edition's lowest price equalled the cheapest copy on 6 of 6 editions; the cheapest used and new copy per edition matched on 11 of 11; a copy's price matched its page and its structured data on 7 of 7. The copy list price trailed the copy page by one cent on 1 of those 7 (19.89 vs 19.90) — offer reads the live page. Search copy counts matched the copy list on 5 of 6 editions and were one copy ahead on the sixth.

What does the seller call return?

What the sebo's public page carries: name, description, city, state and address, business phone and e-mail as published, pickup points, shipping methods, the date it joined, the seller's tax id as the page carries it — tax_id with tax_id_type cnpj for a company or cpf for an individual seller (format 00.000.000/0000-00 or 000.000.000-00) — rating average, review count, percent recommended, the latest reviews, the inventory total and one page of 40 listed copies.

What is the Estante Virtual API?

Estante Virtual API is a ReefAPI endpoint group for brazil's largest used-book marketplace as json: search editions by isbn, author, city or sebo, list every copy with its price and condition note, see which sebo sells it and where, and quote shipping to any cep. It returns live JSON through POST requests under /estante-virtual/v1.

Is the Estante Virtual API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Estante Virtual calls use the same shared credit balance as every other ReefAPI engine.

Do I need an Estante Virtual login or account?

No login to Estante Virtual is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Estante Virtual data?

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Estante Virtual API use?

Estante Virtual actions currently cost 2-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.

Can I call Estante Virtual from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call estante-virtual actions with the same key, credit pool and JSON envelope used by normal REST requests.

docs / estante-virtual

Estante Virtual

Brazil's largest used-book marketplace as JSON: search editions by ISBN, author, city or sebo, list every copy with its price and condition note, see which sebo sells it and where, and quote shipping to any CEP.

base /estante-virtual/v16 endpoints
post/estante-virtual/v1/offers2 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.

ParameterAllowed / rangeDescription
book_idrequired—The `book_id` of a search row (an edition, ends with -BK), or its URL.
condition = usadooptionalusado · novoWhich copies to list: usado (used, default) or novo (new).
cityoptional—City of the selling sebo, or its slug from `facets.cities`.
selleroptional—One sebo, by its name or slug (see `facets.sellers`).
yearoptional1400–2100Publication year (exact).
min_priceoptional0–Minimum price in BRL.
max_priceoptional0–Maximum price in BRL.
sort = relevanceoptionalrelevance · lowest-first · highest-firstCopy order.
page = 1optional1–1-based page. Search pages hold 44 editions and the site serves at most 10,000 rows per query (last page 228).
per_page = 20optional1–40Copies per page, 1-40.
facets_top = 20optional0–100How many values per facet to return (0 = none).
include_pii = falseoptional—Accepted for gateway compatibility; nothing is masked.
Try in playground →
post/estante-virtual/v1/book3 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.

ParameterAllowed / rangeDescription
book_idrequired—The `book_id` of a search row (an edition, ends with -BK), or its URL.
facets_top = 20optional0–100How many values per facet to return (0 = none).
include_pii = falseoptional—Accepted for gateway compatibility; nothing is masked.
Try in playground →
post/estante-virtual/v1/offer3 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.

ParameterAllowed / rangeDescription
offer_idrequired—The `offer_id` of a copy (from `offers`, `book` or `seller`), or its URL.
include_seller = trueoptional—Also read the sebo's page for its city, state, rating and since-date (one more page). false = the copy only.
include_pii = falseoptional—Accepted for gateway compatibility; nothing is masked.
Try in playground →
post/estante-virtual/v1/seller3 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.

ParameterAllowed / rangeDescription
sellerrequired—The sebo's slug (`seller.slug` on an offer), its name or its URL.
page = 1optional1–1-based page. Search pages hold 44 editions and the site serves at most 10,000 rows per query (last page 228).
include_pii = falseoptional—Accepted for gateway compatibility; nothing is masked.
Try in playground →
post/estante-virtual/v1/shipping3 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).

ParameterAllowed / rangeDescription
offer_idrequired—The `offer_id` of a copy (from `offers`, `book` or `seller`), or its URL.
ceprequired—Brazilian destination CEP (8 digits, dash optional). The quote depends on it; the site gives no quote without one.
include_pii = falseoptional—Accepted for gateway compatibility; nothing is masked.
Try in playground →
Built for volume
5M+ requests a day

Measured at 60 requests a second across the fleet, with no central bottleneck. Volume pricing is on request, and per-key limits are raised for high-volume accounts.

Missing a source?
We build it

Tell us a site we do not cover yet and it becomes an engine. A customer asked for bestprice.gr on a Sunday and it was in the catalog the next day.

Support
2 minute median reply

Median time from a question in the live chat to the first answer, measured across every answered conversation. Setup help included, no support tier to buy.

One key, one balance
Every API included

No per-site plans and no separate subscriptions. One key and one credit pool across the whole catalog, so adding a source costs nothing up front.

Planning something large? Tell us the volume and the sources and we will come back with what it costs and what we would have to build.