Wallapop API: anúncios de segunda mão em Portugal, em JSON
Para programadores, o Wallapop não disponibiliza uma API pública. Esta interface entrega em JSON aquilo que a aplicação mostra a qualquer pessoa: título, preço em euros, estado, localidade com código postal e distância ao ponto de pesquisa. Não é uma integração para vendedores Wallapop PRO gerirem o inventário: é o lado de quem compra, os anúncios públicos.
Endpoints
| endpoint | O que retorna | Obrigatórios |
|---|---|---|
| search | Pesquisa por palavra-chave ou categoria à volta de um ponto (por defeito, Lisboa), com raio, preço, estado, envio, recondicionados e garantia. Cinco ordenações. | todos opcionais |
| cars/search | Carros usados com marca, modelo, ano, quilómetros, motor e potência; filtros de combustível, caixa, carroçaria e particular ou profissional. | todos opcionais |
| listing | O anúncio completo por id, slug ou URL: texto original do vendedor, estado (ativo, reservado, vendido), cada opção de envio com preço e prazo, visualizações e favoritos. | listing_id |
| seller_listings | Perfil do vendedor com a avaliação numa escala de 5 estrelas, vendas e data de registo, e os anúncios que tem ativos, 40 por página. | seller_id |
| categories | A árvore de categorias em português, até quatro níveis, com o id a usar na pesquisa. | todos opcionais |
| suggest | As sugestões que o Wallapop dá enquanto se escreve na caixa de pesquisa. | query |
Cada chamada é cobrada em créditos. Chamadas com erro ou bloqueadas são gratuitas.
Exemplo que funciona
Em Portugal a pesquisa do Wallapop atravessa a fronteira. Com o ponto no Porto e raio de 50 km, os 40 resultados eram todos portugueses (Porto, Braga, Aveiro). Sem raio e por mais recentes, 36 de 40 eram anúncios de Espanha com o título traduzido para português. Defina distance_km ou use country_only=true.
curl -X POST https://api.reefapi.com/wallapop/v1/search \
-H "x-api-key: A_SUA_CHAVE" \
-H "content-type: application/json" \
-d '{"query": "bicicleta", "country": "pt", "latitude": 41.1579, "longitude": -8.6291, "distance_km": 50}'{
"ok": true,
"data": {
"results": [
{
"listing_id": "8j380x04wyz9",
"title": "Bicicleta de Montanha Scott FX 30",
"price": 250,
"currency": "EUR",
"category_path": [{ "name": "Bicicletas" }, { "name": "Bicicletas e triciclos" }, { "name": "MTB" }],
"location": { "city": "Mindelo", "postal_code": "4485-521", "region": "Porto", "country_code": "PT" },
"distance_km": 19.3,
"cross_border": false,
"text_is_translated": false,
"shipping_available": false
},
...
],
"location_country": "PT",
"other_country_count": 0,
"has_more": true
},
"meta": { "record_count": 40, "cache_hit": false, "mode": "live" }
}Fazer scraping do Wallapop: o que os dados escondem
Um scraper do Wallapop até devolve dados; o problema é que nem todos significam o que parecem. Os anúncios pagos (destacados) entram em posições fixas de cada página, um preço de 0 € raramente é uma oferta — costuma ser spam de palavras-chave ou um lote — e uma pesquisa sem sentido pode vir preenchida com anúncios que nada têm a ver com ela.
Aqui cada caso tem tratamento próprio: os destacados ficam de fora por defeito e são contados em sponsored_dropped, o preço zero chega como null com price_is_zero, e as linhas de recurso só aparecem se as pedir com include_fallback_results.
Para uma recolha única, um script feito por si chega e sai mais barato. O custo surge quando a recolha passa a diária e alguém tem de vigiar estas armadilhas todas as semanas.
Limites e observações honestas
- Não é a API oficial do Wallapop e não temos qualquer parceria com o Wallapop.
- A pesquisa é geográfica: sem coordenadas, o ponto por defeito é Lisboa e as distâncias são medidas a partir daí.
- Os anúncios de Espanha que aparecem na pesquisa portuguesa trazem o texto traduzido automaticamente (text_is_translated: true); o listing devolve o texto original do vendedor.
- O total de resultados não é publicado (total_results null); avança-se página a página com next_cursor.
- Nas ordenações por preço, preços fictícios (como 111 111 111 €) podem surgir no topo: o próprio site ordena assim e devolvemo-los tal como estão publicados.
- Sem cache: cada chamada mostra o estado no momento do pedido.