API

API de Vinted: anuncios y precios de vinted.es en JSON

Para leer su catálogo desde código, Vinted no ofrece ninguna API pública. Esta interfaz lee vinted.es como lo vería cualquier visitante sin iniciar sesión y devuelve en JSON título, marca, talla, estado, precio en euros y fotos de cada anuncio. El precio llega por partida doble: el que pone el vendedor y el total que paga el comprador con la tarifa de Protección al comprador ya sumada. Conviene aclararlo para quien vende como Vinted Pro: con esto no se publican artículos ni se tramitan pedidos. Es la vista del comprador, limitada a anuncios y perfiles públicos.

Endpoints

endpointQué devuelveObligatorios
catalog_searchBúsqueda por texto y filtros (categoría, talla, color, marca, rango de precio). Cuatro ordenaciones: más recientes, relevancia y precio en ambos sentidos; hasta 96 anuncios por página. Cada fila trae `price`, `total_item_price` y `service_fee` por separado.todos opcionales
item_detailTodo lo publicado en un anuncio, pedido por id o por URL: descripción, todas las fotos, categoría, color, atributos con su etiqueta en español (Tamaño, Estado, Subido) y si está reservado o se puede comprar al momento.todos opcionales
sellerLo que muestra la página de un vendedor: valoración, número de opiniones positivas, neutras y negativas, artículos a la venta y país (`country_code`).id
seller_itemsEl armario del vendedor: lo que tiene publicado ahora, con fecha de subida, visitas, favoritos y si está reservado o cerrado.id
seller_feedbackLas opiniones que ha recibido un vendedor: texto, puntuación y fecha, página a página.id
categoriesEl árbol de categorías de vinted.es con nombres en español (Mujer › Ropa › Abrigos y cazadoras…) y el id que acepta catalog_search.todos opcionales
sizesLos grupos de tallas con sus ids, tal como los usa el filtro `size_ids` (XS / 34 / 6, 36, 24-36 meses / 92 cm…).todos opcionales
colorsLos colores con id y código hexadecimal, para `color_ids`.todos opcionales
countriesLos países de Vinted con su código ISO y su moneda.todos opcionales

Cada llamada se cobra en créditos. Las llamadas fallidas y bloqueadas son gratuitas.

Ejemplo que funciona

En vinted.es la búsqueda cruza fronteras. De las 20 chaquetas vaqueras más recientes, 10 tenían el título en español; las otras estaban en portugués, italiano, francés o neerlandés. Como todas tienen el precio en euros, la moneda no delata nada: si necesitas solo vendedores de España, el `country_code` está en `seller`, no en la fila de búsqueda. Fíjate también en la diferencia entre `price` y `total_item_price`: en esta muestra la tarifa fue de 1 € sobre 6 € y de 2,20 € sobre 30 €.

Petición
curl -X POST https://api.reefapi.com/vinted/v1/catalog_search \
  -H "x-api-key: TU_CLAVE" \
  -H "content-type: application/json" \
  -d '{"query": "chaqueta vaquera", "tld": "es", "per_page": 20, "order": "newest_first"}'
Respuesta (recortada)
{
  "ok": true,
  "data": {
    "items": [
      ...
      {
        "id": 10524989021,
        "title": "Chaqueta vaquera Pull&Bear talla M",
        "url": "/items/10524989021-chaqueta-vaquera-pullbear-talla-m",
        "price": { "amount": 15.0, "currency": "EUR" },
        "total_item_price": { "amount": 16.45, "currency": "EUR" },
        "service_fee": { "amount": 1.45, "currency": "EUR" },
        "brand": "Pull & Bear",
        "size": "M",
        "condition": "Muy bueno",
        "uploaded_ts": null,
        "promoted": false
      },
      ...
      {
        "id": 10524990535,
        "title": "Blusão de ganga",
        "price": { "amount": 30.0, "currency": "EUR" },
        "total_item_price": { "amount": 32.2, "currency": "EUR" },
        "service_fee": { "amount": 2.2, "currency": "EUR" },
        "brand": "Cheyenne",
        "size": "S",
        "condition": "Muy bueno"
      },
      {
        "id": 10524988247,
        "title": "Giubbino jeans bambina/o",
        "price": { "amount": 6.0, "currency": "EUR" },
        "total_item_price": { "amount": 7.0, "currency": "EUR" },
        "service_fee": { "amount": 1.0, "currency": "EUR" },
        "brand": "United Colors of Benetton",
        "size": "8 años / 128 cm",
        "condition": "Muy bueno"
      },
      ...
    ],
    "pagination": { "current_page": 1, "per_page": 20, "total_entries": 960, "total_pages": 48 },
    "tld": "es"
  },
  "meta": {
    "record_count": 20,
    "cache_hit": false,
    "mode": "live",
    "tld": "es",
    "total_entries": 960,
    "window_cap": 960,
    "warnings": ["source_fields_unavailable: uploaded_ts, seller.login, seller.profile_url, is_visible, stats_visible, view_count, is_reserved, ..."]
  }
}

Hacer scraping de Vinted: tres trampas que no dan error

La página de catálogo de Vinted no entrega un JSON limpio. En octubre de 2026 comprobamos que rellena los campos que no tiene con el texto literal "$undefined": en una página de 96 productos, dos campos venían así en todos ellos. Un scraper que guarda lo que encuentra acaba con esa cadena en la base de datos como si fuera un valor. Aquí ese texto se descarta y el campo llega vacío.

La segunda es la búsqueda que no encuentra nada. Vinted no siempre devuelve una página vacía: una cadena inventada que probamos trajo 96 artículos y un total de 123, porque la web completa la cuadrícula con otros anuncios. Una búsqueda que de verdad no tenía resultados volvió con un total de 0 y sin filas, y eso es una respuesta válida, no una avería. Nuestra primera versión la trataba como error; lo corregimos en octubre de 2026, al ver fallar precisamente una consulta así.

La tercera llegó con un cambio de la web en septiembre de 2026: en la nueva ruta de búsqueda, los filtros enviados con el formato antiguo (`brand_ids[]=`) se ignoraban sin avisar y volvía la lista sin filtrar. Desde fuera parece que todo funciona.

Para un vistazo puntual a los precios de una marca, un script propio cumple. Si guardas datos cada día, lo que te interesa es enterarte el mismo día en que Vinted cambia el formato, no un mes después al revisar unas medias que no cuadran.

Límites y notas honestas

  • Esta API no es de Vinted ni se ofrece en colaboración con Vinted; no hay ningún acuerdo entre ambas partes.
  • Sin `"tld": "es"` la consulta va a vinted.fr, que es el valor por defecto.
  • Varios endpoints auxiliares fallan ahora mismo (medido el 25 de octubre de 2026, dos o tres intentos cada uno): `autocomplete` y `conditions` devuelven UPSTREAM_HTTP, `catalog_filters` NOT_FOUND y `similar` TARGET_BLOCKED. `brand_search` responde, pero ignora el texto: con «pull», «pull & bear» o «nike» devolvió siempre la misma lista de 12 marcas. Por eso no aparecen en la tabla de arriba. Mientras dure, el filtro `brand_ids` solo sirve con esas 12 marcas o con ids que ya tengas: ni la fila de búsqueda ni `item_detail` traen ahora `brand_id`.
  • Por cada combinación de filtros Vinted no da más de 960 resultados (`total_entries` se queda en 960). Para llegar más lejos, acota la búsqueda por categoría, talla o precio.
  • La fila de búsqueda no trae fecha de subida, visitas ni estado de reserva: esos campos llegan en null y se enumeran en `meta.warnings`. `seller_items` sí los trae, pero solo para el armario de un vendedor.
  • En `item_detail` el estado llega en formato schema.org (`UsedCondition`) y `url` en null; la etiqueta en español («Muy bueno») está en `attributes`.
  • El gasto de envío no aparece en ninguna respuesta. `total_item_price` suma la tarifa de Protección al comprador, no el envío.
  • Si la consulta no coincide con nada, Vinted puede rellenar la página con otros anuncios y la API los entrega tal como llegan; conviene comprobar que los títulos tienen algo que ver con lo buscado.
  • No servimos respuestas guardadas de llamadas anteriores: en nuestras pruebas `cache_hit` fue siempre false.