If you work with the Brazilian car market - a dealership, a marketplace, a pricing model - you have probably hit the same wall I did: there is no clean public dataset of what cars actually cost right now. FIPE gives you a reference price, not the asking price. And the asking price is what the market is really doing.
So I pulled 100 live listings and looked at the gap.
The finding: the ad price is not the FIPE price, and the spread is the story
Webmotors publishes a fipePercent field on each listing - the asking price as a percentage of the FIPE reference. I pulled 100 listings for a single model search and put that column in a table. The result, measured:
-
88 of the 100 listings carried a
fipePercent. The other 12 leave it empty, which is worth knowing before you build anything that assumes the field is always there. - Median: 101%. Mean: 104%. So the typical ad asks slightly above the FIPE reference - the reference is a floor more often than a ceiling.
- 55% of listings (48 of 88) ask above 100% of FIPE. Asking over the reference is the norm, not the exception.
- The range is enormous: 73% to 156%. That spread - not the average - is the actual finding. Two cars the reference prices identically can be advertised 80 percentage points apart.
That last point is the useful one. A single reference number hides a distribution this wide, and the only way to see it is to pull the live ads and look.
One caveat on my own sample, since it matters: all 100 listings were PJ (dealers), zero PF (private sellers). So I cannot tell you from this data whether dealers price differently than private sellers - I would need a sample that actually contains both. If you have seen that comparison done properly, I would like to read it.
The annoying part: getting the data at all
Webmotors does not hand you a JSON file. Two things get in the way, and it is worth being precise about them because they determine your whole approach.
1. Datacenter IPs get blocked. This is the one that surprises people. The same request that works from your laptop returns 403 from a cloud function:
# from a datacenter IP
$ curl -s -o /dev/null -w "%{http_code}" "https://www.webmotors.com.br/api/search/car?..."
403
# same request, residential IP
200
So the naive "deploy a scraper to a VPS" plan dies immediately. You need residential egress, which means either a proxy budget or your own infrastructure.
2. TLS fingerprinting. Even from a good IP, a plain Python HTTP client gets flagged - the TLS handshake of requests/httpx does not look like a browser. The fix is impersonation:
from curl_cffi import requests
r = requests.get(url, impersonate="chrome", timeout=30)
That single argument is the difference between 403 and 200 more often than people expect.
What clean output looks like
Once through, the data is genuinely good. Prices as integers, not "R$ 89.900" strings:
{
"title": "MERCEDES-BENZ A 250 2.0 CGI GASOLINA SPORT 7G-DCT",
"make": "MERCEDES-BENZ",
"model": "A 250",
"yearFabrication": "2018",
"yearModel": 2019,
"odometer": 77000,
"transmission": "Automática",
"price": 170900,
"sellerType": "PJ",
"city": "Rio de Janeiro",
"fipePercent": 102
}
price and odometer as numbers means you can sort, filter and compute the moment the run finishes - no regex cleanup step.
Do it yourself, or don't
If you want to build this: curl_cffi with impersonate="chrome", residential egress, and a parser for the search API. Budget for maintenance - the payload shape changes without warning, and you will not find out until your numbers look wrong.
If you would rather skip that, I maintain a scraper on the Apify Store that does exactly this - Webmotors Scraper. It runs through residential IPs, returns the fields above as flat JSON, and is pay-per-use with no subscription. It is also how I pulled the 100 listings in this post.
What I would look at next
The interesting analysis is not a single snapshot - it is the same query run daily. Price cuts on individual listings are a leading indicator of what a segment is really worth, and they only show up in a time series.
If you are working on something similar in the Brazilian market, I am curious what you are seeing - especially on the FIPE spread by region.
Top comments (0)