API

API de eBay: anuncios activos de ebay.es, con precio y envío, como JSON

eBay ofrece sus propias APIs, pero están hechas para el que vende: publicar anuncios, llevar el inventario y gestionar pedidos con cuenta y token. Esta cubre el lado del comprador. Trabaja con lo que ebay.es enseña a un visitante anónimo y lo entrega en JSON: título, precio, estado, envío y formato de compra, escritos con las palabras de la web española («Totalmente nuevo», «¡Cómpralo ya!», «o Mejor oferta»). Encaja en el seguimiento de precios de un modelo concreto, en la vigilancia del catálogo de una tienda o en comparar lo que se pide por el mismo artículo en distintos anuncios. No publica, no puja y no compra. Cada llamada necesita `"domain": "es"`, porque el dominio por defecto es el estadounidense.

Endpoints

endpointQué devuelveObligatorios
searchAnuncios activos por palabras clave, hasta 240 por página. Cada fila lleva `item_id`, título, precio en EUR (número y texto original), estado, formato de compra con un código igual en todos los países (`buying_format_code`: `buy_it_now`, `best_offer`, `auction`), el envío tal como lo escribe eBay y, si el artículo está fuera de España, el país en `location`. Filtra por estado, precio mínimo y máximo, envío gratis, devoluciones, subasta o «Cómpralo ya», ubicación y orden.query
item_detailUn anuncio por `item_id` o URL: precio y precio de referencia (`list_price`), las características que rellena el vendedor (Marca, Modelo, EAN, Estado…), la ruta de categorías en español (Deportes › Ciclismo › Bicicletas), imágenes grandes, coste de envío, fecha de cierre y `listing_status`, que distingue un anuncio activo de uno terminado.todos opcionales
items_batchHasta 40 números de artículo en una sola petición, con la misma ficha que `item_detail` para cada uno. Los números que eBay no reconoce se listan en `not_found` en vez de desaparecer.item_ids
seller_itemsTodos los anuncios activos de un vendedor, a partir de su nombre de usuario, con las mismas columnas, filtros y paginación que `search`.seller
seller_profileLa reputación pública de un vendedor: puntuación, votos positivos, neutros y negativos del último mes, de 6 y de 12 meses, y las valoraciones detalladas con los nombres de ebay.es («Descripción precisa», «Gastos de envío razonables», «Rapidez de envío», «Comunicación»).seller
dealsLa página de ofertas del día del dominio elegido: precio, precio anterior (`was_price`) y el distintivo de la oferta. No necesita consulta.todos opcionales

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

Ejemplo que funciona

Esta búsqueda se hizo el 28 de octubre de 2026. De los 10 primeros resultados, 7 eran artículos fuera de España: 6 en Liechtenstein y uno en Suiza, que cobraba 30 € de envío. En la búsqueda, eBay solo escribió el país en los artículos situados en el extranjero, así que los anuncios desde España llegan sin campo `location`. Con `"location": "domestic"` la misma búsqueda devolvió 10 filas sin país, todas en España. Si el objetivo es saber cuánto paga un comprador aquí, hay que sumar el envío y tratar aparte los anuncios de fuera.

Petición
curl -X POST https://api.reefapi.com/ebay/v1/search \
  -H "x-api-key: TU_CLAVE" \
  -H "content-type: application/json" \
  -d '{"query": "bicicleta electrica", "domain": "es", "max_results": 10}'
Respuesta (recortada)
{
  "ok": true,
  "data": {
    "query": "bicicleta electrica",
    "results": [
      {
        "item_id": "178370146261",
        "title": "Bicicleta Eléctrica Chrisson E SARGOS NUEVA",
        "price": { "raw": "550,00 EUR", "value": 550.0, "currency": "EUR" },
        "condition": "Totalmente nuevo",
        "buying_format": "o Mejor oferta",
        "buying_format_code": "best_offer",
        "shipping": "Envío gratis en 3 días",
        "url": "https://www.ebay.es/itm/178370146261",
        "best_offer": true,
        "in_stock": true
      },
      {
        "item_id": "820265054105",
        "title": "Bicicleta eléctrica de doble motor 48V 25Ah 26 pulgadas Offroad ebikes 45 km/h bicicleta eléctrica de montaña",
        "price": { "raw": "1 390,00 EUR", "value": 1390.0, "currency": "EUR" },
        "condition": "Totalmente nuevo",
        "buying_format": "o Mejor oferta",
        "buying_format_code": "best_offer",
        "shipping": "Envío gratis",
        "location": "Liechtenstein",
        ...
      },
      {
        "item_id": "860010958704",
        "title": "Bicicleta urbana - Youin Amsterdam, 250 W, 25 km/h, 45 km, Plegable, Azul/negro",
        "price": { "raw": "499,00 EUR", "value": 499.0, "currency": "EUR" },
        "condition": "Nuevo (de otro tipo)",
        "buying_format": "¡Cómpralo ya!",
        "buying_format_code": "buy_it_now",
        "shipping": "+ 1,99 EUR de envío",
        ...
      },
      {
        "item_id": "820041109514",
        "title": "Bicicleta Eléctrica Off-Road 20\" E-MountainBike HEADEER BK20 E-Bike 750W 48V 20A 80KM",
        "price": { "raw": "779,00 EUR", "value": 779.0, "currency": "EUR" },
        "condition": "Totalmente nuevo",
        "buying_format_code": "best_offer",
        "shipping": "+ 30,00 EUR de envío",
        "location": "Suiza",
        ...
      },
      ...
    ]
  },
  "meta": {
    "record_count": 10,
    "domain": "es",
    "pagination": { "page": 1, "has_more": true },
    "charged_credits": 1,
    "cache_hit": false,
    "mode": "live"
  }
}

Scraper de eBay en Python: lo que cambia de ebay.com a ebay.es

Casi todos los scrapers de eBay que hay en GitHub se escribieron contra ebay.com y reconocen el formato y el origen buscando textos en inglés como «Buy It Now», «bids» o «Located in». En ebay.es esas mismas tarjetas dicen «¡Cómpralo ya!», «o Mejor oferta», «0 pujas» y «desde Reino Unido». Nuestro motor tenía justo ese defecto hasta el 26 de septiembre de 2026: formato de compra y ubicación solo se entendían en inglés, y en los dominios europeos esas columnas salían vacías sin ningún error. Se capturaron en vivo las palabras de cada web y, tras el cambio, 57 tarjetas de ebay.es en la medición llevaban su formato. Para la ubicación se añadió además una regla: lo que va detrás de la preposición debe empezar por mayúscula; si no, un texto de estado puede acabar leído como si fuera un país.

El 10 de octubre de 2026, revisando las llamadas fallidas de un cliente, apareció una consulta copiada de un título con letras Unicode «de adorno» (negrita matemática). eBay busca esos caracteres literalmente, no encuentra nada y aun así entrega una página completa, de 1.936.940 bytes en aquel caso, sin un solo anuncio. Ahora la consulta se normaliza con NFKC antes de salir. NFKD no sirve aquí, porque se llevaría por delante las tildes, y en ebay.es las tildes forman parte de lo que se busca.

El 24 de octubre de 2026 tocó la ficha de los anuncios ya cerrados. eBay sigue mostrando en ellos la última cantidad disponible, así que un script que lea esa línea da por vivo un artículo que terminó hace semanas. `item_detail` toma ahora la marca de estado que eBay guarda en la propia página: `listing_status` vale `ended` y la cantidad pasa a null.

Si ya tienes un scraper escrito para ebay.com, hay una prueba rápida antes de fiarte de él en ebay.es: busca algo que sepas que llega desde fuera, como la bicicleta eléctrica del ejemplo, y mira la columna del país. Si sale vacía también en los anuncios de Liechtenstein y Suiza, tu script sigue buscando «Located in» y en la web española esa frase no aparece.

Límites y notas honestas

  • No es la API oficial de eBay. La mantenemos por nuestra cuenta: eBay no participa en ella y no existe contrato ni asociación con eBay.
  • El dominio por defecto es `com`. Sin `"domain": "es"` los resultados llegan de ebay.com y en dólares.
  • No hay precios de vendidos. eBay solo enseña los anuncios vendidos y finalizados a quien ha iniciado sesión (lo comprobamos el 5 de agosto de 2026), y esta API no utiliza cuentas. Un historial de precios hay que construirlo guardando con fecha las búsquedas propias sobre anuncios activos.
  • `categories` no funciona en ebay.es y por eso no aparece en la tabla. El 28 de octubre de 2026 devolvió PARSE_ERROR dos veces sin filtro y NOT_FOUND con «móviles», «telefon» y «Bicicletas», sin coste. En ebay.com sí responde. El número de categoría que admite `search` se puede sacar de la URL de esa categoría en ebay.es.
  • En la ficha, `brand` y `model` llegaron vacíos en las 6 fichas distintas que comprobamos, también cuando el vendedor había rellenado «Marca» y «Modelo»: esos datos están en `item_specifics`. `condition` viene normalizado en inglés (`New`), mientras que `search` da el texto de ebay.es («Nuevo (de otro tipo)»). `return_policy` fue null en esas 6 fichas.
  • El bloque `seller` de la ficha llega sin reputación (`feedback_pct` y `feedback_count` en null) o directamente null. La reputación se consulta con `seller_profile`.
  • `shipping.country` de la ficha no es el lugar donde está el artículo: salió `DEU` en anuncios que la búsqueda situaba en Liechtenstein, Suiza o Italia, y `USA` en otro situado en Italia. En uno de ellos el coste también difería: 20 € en la ficha frente a «+ 30,00 EUR de envío» en la búsqueda. Para el país, usa `location` de `search`.
  • `deals` muestra los títulos tal como los escribió el vendedor; en nuestra llamada a ebay.es los 5 primeros estaban en inglés o en alemán.
  • En anuncios con variantes (tallas, colores), eBay a veces no imprime en la tarjeta ni el formato ni el envío ni la ubicación, y esas columnas quedan vacías porque la fuente no las da.
  • `items_batch` acepta como máximo 40 números; con 41 responde INVALID_PARAM sin cobrar. Se factura por artículo, 2 créditos cada uno: nuestra petición de 16 artículos costó 32 créditos y tardó 15 segundos.
  • Créditos por llamada: `search` y `deals` 1 (cada llamada es una página, de hasta 240 resultados en `search`), `item_detail` y `seller_items` 2, `seller_profile` 3. Las llamadas que fallan no se cobran.