API

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

endpointO que retornaObrigatórios
searchPesquisa 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/searchCarros usados com marca, modelo, ano, quilómetros, motor e potência; filtros de combustível, caixa, carroçaria e particular ou profissional.todos opcionais
listingO 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_listingsPerfil 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
categoriesA árvore de categorias em português, até quatro níveis, com o id a usar na pesquisa.todos opcionais
suggestAs 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.

Requisição
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}'
Resposta (resumida)
{
  "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.